@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
@@ -0,0 +1,239 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { chmodSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { launchOmb, ombSessionName, shouldLaunchOmbInTmux } from "../src/omp/tmux.js";
6
+ const isWindows = process.platform === "win32";
7
+ /**
8
+ * Bizar hosts run the inner OMP inside the multiplexer boundary
9
+ * (`TMUX`/`TMUX_PANE`) with `BIZAR_OMP_NO_TMUX=1`, so an inherited
10
+ * `process.env` silently disables the boundary these tests exercise and the
11
+ * launcher spawns a real interactive OMP instead. Build the launch
12
+ * environment explicitly rather than inheriting host state.
13
+ */
14
+ function hermeticEnv(overrides = {}) {
15
+ const env = { ...process.env, ...overrides };
16
+ delete env.TMUX;
17
+ delete env.TMUX_PANE;
18
+ delete env.BIZAR_OMP_NO_TMUX;
19
+ return env;
20
+ }
21
+ /** Force interactive-host detection without depending on the runner's stdio. */
22
+ function stubInteractiveTty() {
23
+ const previousIn = Object.getOwnPropertyDescriptor(process.stdin, "isTTY");
24
+ const previousOut = Object.getOwnPropertyDescriptor(process.stdout, "isTTY");
25
+ Object.defineProperty(process.stdin, "isTTY", { configurable: true, value: true });
26
+ Object.defineProperty(process.stdout, "isTTY", { configurable: true, value: true });
27
+ return () => {
28
+ if (previousIn)
29
+ Object.defineProperty(process.stdin, "isTTY", previousIn);
30
+ else
31
+ Reflect.deleteProperty(process.stdin, "isTTY");
32
+ if (previousOut)
33
+ Object.defineProperty(process.stdout, "isTTY", previousOut);
34
+ else
35
+ Reflect.deleteProperty(process.stdout, "isTTY");
36
+ };
37
+ }
38
+ describe("omb launcher", () => {
39
+ const tty = { stdinIsTTY: true, stdoutIsTTY: true, args: [] };
40
+ it("uses the multiplexer only for interactive hosts outside tmux", () => {
41
+ // The psmux integration enables the boundary on every platform; Windows
42
+ // resolves to psmux (asserted live in psmux-windows.test.ts).
43
+ expect(shouldLaunchOmbInTmux({ ...tty, env: {} })).toBe(true);
44
+ expect(shouldLaunchOmbInTmux({ ...tty, env: { TMUX: "/tmp/tmux" } })).toBe(false);
45
+ expect(shouldLaunchOmbInTmux({ ...tty, env: { BIZAR_OMP_NO_TMUX: "1" } })).toBe(false);
46
+ expect(shouldLaunchOmbInTmux({ ...tty, args: ["--print"] })).toBe(false);
47
+ expect(shouldLaunchOmbInTmux({ ...tty, args: ["--mode", "rpc"] })).toBe(false);
48
+ expect(shouldLaunchOmbInTmux({ ...tty, stdinIsTTY: false })).toBe(false);
49
+ });
50
+ it("creates stable, safe per-project session names", () => {
51
+ const first = ombSessionName("/work/my project");
52
+ expect(first).toBe(ombSessionName("/work/my project"));
53
+ expect(first).toMatch(/^bizar-my-project-[a-f0-9]{10}$/);
54
+ expect(first.length).toBeLessThanOrEqual(63);
55
+ expect(ombSessionName("/work/my project", "review"))
56
+ .toMatch(/^bizar-my-project-[a-f0-9]{10}-review$/);
57
+ expect(ombSessionName("/work/my project", "review"))
58
+ .not.toBe(first);
59
+ expect(ombSessionName("/work/my project", "!!!")).toBe(first);
60
+ });
61
+ it("launches through the foreground tmux boundary without a detached handoff", async () => {
62
+ if (isWindows)
63
+ return; // `/usr/bin/true` stand-in does not exist on Windows.
64
+ const restoreTty = stubInteractiveTty();
65
+ try {
66
+ await expect(launchOmb("/tmp", [], hermeticEnv({ BIZAR_TMUX_BIN: "true" }))).resolves.toBe(0);
67
+ }
68
+ finally {
69
+ restoreTty();
70
+ }
71
+ });
72
+ it("gives each Bizar host an isolated native OMP session directory", async () => {
73
+ if (isWindows)
74
+ return; // /bin/sh fake multiplexer cannot run on Windows.
75
+ const root = mkdtempSync(join(tmpdir(), "bizar-native-session-test-"));
76
+ const fakeTmux = join(root, "tmux");
77
+ const log = join(root, "calls");
78
+ writeFileSync(fakeTmux, "#!/bin/sh\nprintf '%s\\n' \"$*\" >> \"$BIZAR_TEST_TMUX_LOG\"\ncase \"$1\" in has-session) exit 1;; list-panes) printf '0\\n';; esac\n");
79
+ chmodSync(fakeTmux, 0o755);
80
+ const restoreTty = stubInteractiveTty();
81
+ const env = hermeticEnv({ BIZAR_TMUX_BIN: fakeTmux, BIZAR_TEST_TMUX_LOG: log, XDG_STATE_HOME: root });
82
+ try {
83
+ await expect(launchOmb("/tmp", ["Investigate the API"], env, "review")).resolves.toBe(0);
84
+ expect(readFileSync(log, "utf8")).toContain("new-session -d -s bizar-tmp-");
85
+ expect(readFileSync(log, "utf8")).toContain("--session-dir");
86
+ expect(readFileSync(log, "utf8")).toContain("/bizar-omp/native-sessions/");
87
+ }
88
+ finally {
89
+ restoreTty();
90
+ rmSync(root, { recursive: true, force: true });
91
+ }
92
+ });
93
+ it("keeps direct noninteractive invocation out of tmux", async () => {
94
+ if (isWindows)
95
+ return; // `/usr/bin/true` stand-in does not exist on Windows.
96
+ await expect(launchOmb("/tmp", ["--print"], hermeticEnv({ BIZAR_OMP_BIN: "true" }))).resolves.toBe(0);
97
+ });
98
+ it("falls back to a direct OMP spawn when no multiplexer binary exists", async () => {
99
+ const restoreTty = stubInteractiveTty();
100
+ // `/usr/bin/true` accepts any args and exits 0 on POSIX; cmd's no-op
101
+ // variant serves the same purpose on Windows.
102
+ const env = hermeticEnv({
103
+ BIZAR_TMUX_BIN: "definitely-not-a-multiplexer-xyz",
104
+ BIZAR_OMP_BIN: isWindows ? "cmd.exe" : "true",
105
+ });
106
+ try {
107
+ await expect(launchOmb("/tmp", isWindows ? ["/c", "exit"] : [], env)).resolves.toBe(0);
108
+ }
109
+ finally {
110
+ restoreTty();
111
+ }
112
+ });
113
+ it("respawns a dead host pane before reconnecting and preserves mouse scrolling", async () => {
114
+ if (isWindows)
115
+ return; // /bin/sh fake multiplexer cannot run on Windows.
116
+ const root = mkdtempSync(join(tmpdir(), "bizar-tmux-test-"));
117
+ const fakeTmux = join(root, "tmux");
118
+ const log = join(root, "calls");
119
+ writeFileSync(fakeTmux, "#!/bin/sh\nprintf '%s\\n' \"$*\" >> \"$BIZAR_TEST_TMUX_LOG\"\ncase \"$1\" in list-panes) printf '1\\n';; esac\n");
120
+ chmodSync(fakeTmux, 0o755);
121
+ const restoreTty = stubInteractiveTty();
122
+ const env = hermeticEnv({ BIZAR_TMUX_BIN: fakeTmux, BIZAR_TEST_TMUX_LOG: log });
123
+ try {
124
+ await expect(launchOmb("/tmp", [], env)).resolves.toBe(0);
125
+ expect(readFileSync(log, "utf8").trim().split("\n")).toEqual([
126
+ expect.stringContaining("list-sessions -F "),
127
+ expect.stringContaining("has-session -t "),
128
+ expect.stringContaining("list-panes -t "),
129
+ expect.stringContaining("respawn-pane -k -t "),
130
+ expect.stringContaining("remain-on-exit off"),
131
+ expect.stringContaining("history-limit 100000"),
132
+ expect.stringContaining("set-option -t "),
133
+ expect.stringContaining("bind-key -T "),
134
+ expect.stringContaining("bind-key -T "),
135
+ expect.stringContaining("bind-key -T "),
136
+ expect.stringContaining("bind-key -T "),
137
+ expect.stringContaining("bind-key -T "),
138
+ expect.stringContaining("bind-key -T "),
139
+ expect.stringContaining("bind-key -T "),
140
+ expect.stringContaining("bind-key -T "),
141
+ expect.stringContaining("set-option -t "),
142
+ expect.stringContaining("attach-session -t "),
143
+ ]);
144
+ expect(readFileSync(log, "utf8")).toContain("remain-on-exit off");
145
+ expect(readFileSync(log, "utf8")).not.toContain("remain-on-exit on");
146
+ expect(readFileSync(log, "utf8")).toContain("mouse on");
147
+ expect(readFileSync(log, "utf8")).toContain("C-d detach-client");
148
+ expect(readFileSync(log, "utf8")).toContain("C-c detach-client");
149
+ expect(readFileSync(log, "utf8")).toContain("C-b switch-client -T prefix");
150
+ expect(readFileSync(log, "utf8")).toContain("key-table bizar-");
151
+ expect(readFileSync(log, "utf8")).toContain("WheelUpPane if-shell -F #{alternate_on} send-keys -M copy-mode -e; send-keys -M");
152
+ expect(readFileSync(log, "utf8")).toContain("WheelDownPane if-shell -F #{alternate_on} send-keys -M send-keys -M");
153
+ expect(readFileSync(log, "utf8")).toContain("MouseDown1Pane if-shell -F #{alternate_on} send-keys -M select-pane");
154
+ }
155
+ finally {
156
+ restoreTty();
157
+ rmSync(root, { recursive: true, force: true });
158
+ }
159
+ });
160
+ it("skips tmux key-table binds under psmux on Windows but keeps them on POSIX", async () => {
161
+ const root = mkdtempSync(join(tmpdir(), "bizar-fake-mux-"));
162
+ const log = join(root, "calls");
163
+ const fake = (body) => `require("fs").appendFileSync(process.env.BIZAR_TEST_TMUX_LOG, process.argv.slice(1).join(" ") + "\\n");\n${body}\n`;
164
+ for (const [name, body] of [
165
+ ["list-sessions", "process.exit(1);"],
166
+ ["has-session", "process.exit(1);"],
167
+ ["new-session", ""],
168
+ ["list-panes", 'process.stdout.write("0\\n");'],
169
+ ["set-option", ""],
170
+ ["bind-key", ""],
171
+ ["respawn-pane", ""],
172
+ ["attach-session", "process.exit(0);"],
173
+ ]) {
174
+ writeFileSync(join(root, name), fake(body));
175
+ }
176
+ // Launch through an explicit environment: an inherited `process.env` from a
177
+ // Bizar host carries `BIZAR_OMP_NO_TMUX=1`, which disables the multiplexer
178
+ // boundary this test exercises and hands the terminal to a real OMP.
179
+ const env = hermeticEnv({ BIZAR_TMUX_BIN: process.execPath, BIZAR_TEST_TMUX_LOG: log, XDG_STATE_HOME: root });
180
+ const restoreTty = stubInteractiveTty();
181
+ try {
182
+ await expect(launchOmb(root, [], env)).resolves.toBe(0);
183
+ const lines = readFileSync(log, "utf8").trim().split("\n");
184
+ const has = (needle) => lines.some((line) => line.includes(needle));
185
+ expect(has("attach-session -t ")).toBe(true);
186
+ if (isWindows) {
187
+ expect(has("bind-key")).toBe(false);
188
+ expect(has("-bizar-root")).toBe(false);
189
+ expect(has("key-table")).toBe(false);
190
+ }
191
+ else {
192
+ expect(has("bind-key -T ")).toBe(true);
193
+ expect(has("-bizar-root")).toBe(true);
194
+ expect(has("key-table ")).toBe(true);
195
+ }
196
+ }
197
+ finally {
198
+ restoreTty();
199
+ rmSync(root, { recursive: true, force: true });
200
+ }
201
+ });
202
+ it("pauses stdin before handing a TTY off to the direct fallback child", async () => {
203
+ process.stdin.resume();
204
+ const previousBin = process.env.BIZAR_TMUX_BIN;
205
+ const previousOmp = process.env.BIZAR_OMP_BIN;
206
+ const previousIn = Object.getOwnPropertyDescriptor(process.stdin, "isTTY");
207
+ const previousOut = Object.getOwnPropertyDescriptor(process.stdout, "isTTY");
208
+ process.env.BIZAR_TMUX_BIN = "definitely-not-a-multiplexer-xyz";
209
+ process.env.BIZAR_OMP_BIN = isWindows ? "cmd.exe" : "true";
210
+ Object.defineProperty(process.stdin, "isTTY", { configurable: true, value: true });
211
+ Object.defineProperty(process.stdout, "isTTY", { configurable: true, value: true });
212
+ const pauseSpy = vi.spyOn(process.stdin, "pause");
213
+ try {
214
+ await expect(launchOmb(isWindows ? process.cwd() : "/tmp", isWindows ? ["/c", "exit"] : [], process.env)).resolves.toBe(0);
215
+ expect(pauseSpy).toHaveBeenCalledTimes(1);
216
+ }
217
+ finally {
218
+ pauseSpy.mockRestore();
219
+ if (previousIn)
220
+ Object.defineProperty(process.stdin, "isTTY", previousIn);
221
+ else
222
+ delete process.stdin.isTTY;
223
+ if (previousOut)
224
+ Object.defineProperty(process.stdout, "isTTY", previousOut);
225
+ else
226
+ delete process.stdout.isTTY;
227
+ if (previousBin === undefined)
228
+ delete process.env.BIZAR_TMUX_BIN;
229
+ else
230
+ process.env.BIZAR_TMUX_BIN = previousBin;
231
+ if (previousOmp === undefined)
232
+ delete process.env.BIZAR_OMP_BIN;
233
+ else
234
+ process.env.BIZAR_OMP_BIN = previousOmp;
235
+ process.stdin.pause();
236
+ }
237
+ });
238
+ });
239
+ //# sourceMappingURL=tmux.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.test.js","sourceRoot":"","sources":["../../tests/tmux.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { existsSync, readFileSync, rmSync } from "node:fs";
3
+ import { mkdtempSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { DEFAULT_OMB_SETTINGS } from "../src/omp/omb-settings.js";
7
+ import { trayIconPaths } from "../src/omp/tray-icons.js";
8
+ import { trayLockPath, readTrayStatus } from "../src/omp/tray.js";
9
+ describe("omb tray", () => {
10
+ it("keeps the tray opt-in by default", () => {
11
+ expect(DEFAULT_OMB_SETTINGS.trayEnabled).toBe(false);
12
+ });
13
+ it("creates native PNG and ICO icon paths in private state", () => {
14
+ const root = mkdtempSync(join(tmpdir(), "bizar-tray-icons-"));
15
+ try {
16
+ const paths = trayIconPaths({ XDG_STATE_HOME: root, HOME: root });
17
+ expect(existsSync(paths.png)).toBe(true);
18
+ expect(existsSync(paths.ico)).toBe(true);
19
+ expect(readFileSync(paths.png).subarray(0, 8)).toEqual(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]));
20
+ expect(readFileSync(paths.ico).readUInt16LE(2)).toBe(1);
21
+ }
22
+ finally {
23
+ rmSync(root, { recursive: true, force: true });
24
+ }
25
+ });
26
+ it("reports a missing tray lock as stopped", () => {
27
+ const root = mkdtempSync(join(tmpdir(), "bizar-tray-status-"));
28
+ try {
29
+ expect(readTrayStatus({ XDG_STATE_HOME: root, HOME: root }).state).toMatch(/stopped|unsupported/);
30
+ expect(trayLockPath({ XDG_STATE_HOME: root, HOME: root })).toContain("tray.json");
31
+ }
32
+ finally {
33
+ rmSync(root, { recursive: true, force: true });
34
+ }
35
+ });
36
+ });
37
+ //# sourceMappingURL=tray.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray.test.js","sourceRoot":"","sources":["../../tests/tray.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAElE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACvG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAClG,MAAM,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpF,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { execFileSync } from "node:child_process";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { Journal } from "../src/storage/journal.js";
7
+ import { bindSession, startObjective } from "../src/omp/lifecycle.js";
8
+ import { runVerification } from "../src/tools/verify.js";
9
+ describe("host-observed verification", () => {
10
+ it("redacts credential-shaped output and records a passing target-bound receipt", async () => {
11
+ const root = mkdtempSync(join(tmpdir(), "bizar-verify-"));
12
+ const state = mkdtempSync(join(tmpdir(), "bizar-verify-state-"));
13
+ try {
14
+ execFileSync("git", ["init", "-q", root]);
15
+ execFileSync("git", ["-C", root, "config", "user.email", "test@example.invalid"]);
16
+ execFileSync("git", ["-C", root, "config", "user.name", "Test"]);
17
+ execFileSync("git", ["-C", root, "commit", "--allow-empty", "-qm", "init"]);
18
+ const journal = new Journal(join(state, "state.jsonl"));
19
+ const binding = bindSession(journal, { cwd: root });
20
+ startObjective(binding, { objective: "verify", nonGoals: [], constraints: [], acceptanceCriteria: ["check"], verificationPlan: ["secret-check"], stopConditions: [], userRestrictions: [] });
21
+ const receipt = await runVerification(binding, "secret-check", [process.execPath, "-e", "console.log('token=secret-value')"], root);
22
+ expect(receipt.stdout).not.toContain("secret-value");
23
+ expect(receipt.result).toBe("passed");
24
+ expect(journal.snapshot().evidence[0].stdout).toContain("[REDACTED]");
25
+ expect(journal.snapshot().evidence[0].stdout).not.toContain("secret-value");
26
+ }
27
+ finally {
28
+ rmSync(root, { recursive: true, force: true });
29
+ rmSync(state, { recursive: true, force: true });
30
+ }
31
+ });
32
+ it("persists a redacted argv and runs with an environment allowlist", async () => {
33
+ const root = mkdtempSync(join(tmpdir(), "bizar-verify-"));
34
+ const state = mkdtempSync(join(tmpdir(), "bizar-verify-state-"));
35
+ const previous = process.env.BIZAR_VERIFY_SECRET;
36
+ process.env.BIZAR_VERIFY_SECRET = "must-not-cross-boundary";
37
+ try {
38
+ execFileSync("git", ["init", "-q", root]);
39
+ execFileSync("git", ["-C", root, "config", "user.email", "test@example.invalid"]);
40
+ execFileSync("git", ["-C", root, "config", "user.name", "Test"]);
41
+ execFileSync("git", ["-C", root, "commit", "--allow-empty", "-qm", "init"]);
42
+ const journal = new Journal(join(state, "state.jsonl"));
43
+ const binding = bindSession(journal, { cwd: root });
44
+ startObjective(binding, { objective: "verify", nonGoals: [], constraints: [], acceptanceCriteria: ["check"], verificationPlan: ["argv-check"], stopConditions: [], userRestrictions: [] });
45
+ const receipt = await runVerification(binding, "argv-check", [process.execPath, "-e", "console.log(process.env.BIZAR_VERIFY_SECRET ?? 'unset')", "--", "--token=secret-value"], root);
46
+ expect(receipt.stdout).toContain("unset");
47
+ expect(receipt.command).toContain("[REDACTED]");
48
+ expect(journal.snapshot().evidence[0].command).toContain("[REDACTED]");
49
+ expect(JSON.stringify(journal.snapshot().evidence[0])).not.toContain("secret-value");
50
+ }
51
+ finally {
52
+ if (previous === undefined)
53
+ delete process.env.BIZAR_VERIFY_SECRET;
54
+ else
55
+ process.env.BIZAR_VERIFY_SECRET = previous;
56
+ rmSync(root, { recursive: true, force: true });
57
+ rmSync(state, { recursive: true, force: true });
58
+ }
59
+ });
60
+ });
61
+ //# sourceMappingURL=verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.test.js","sourceRoot":"","sources":["../../tests/verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { analyzeRecipe, admitRecipe } from "../src/services/recipes.js";
6
+ import { readyWorkItems, validateDependencies } from "../src/services/readiness.js";
7
+ import { reserveBudget, settleBudget } from "../src/services/budget.js";
8
+ import { capabilityReport } from "../src/omp/capabilities.js";
9
+ import { createEvidenceBundle, writeEvidenceBundle } from "../src/services/evidence-bundle.js";
10
+ import { projectWorkflow } from "../src/services/projection.js";
11
+ import { createRun, addWorkItem } from "../src/core/transitions.js";
12
+ import { createEvidence } from "../src/core/evidence.js";
13
+ import { assertCandidateEndpoint, createCandidateAppLease, releaseCandidateAppLease } from "../src/services/candidate-local.js";
14
+ import { approveLesson, lessonHash } from "../src/services/lessons.js";
15
+ import { applySessionControl } from "../src/omp/session-controls.js";
16
+ describe("inspectable workflow features", () => {
17
+ it("previews conventional checks without executing repository scripts", () => {
18
+ const root = mkdtempSync(join(tmpdir(), "bizar-recipe-"));
19
+ try {
20
+ writeFileSync(join(root, "package.json"), JSON.stringify({ scripts: { test: "echo test", build: "echo build" } }));
21
+ const preview = analyzeRecipe(root, { objective: "fix", nonGoals: [], constraints: [], acceptanceCriteria: ["tests pass"], verificationPlan: [], stopConditions: [], userRestrictions: [] });
22
+ expect(preview.trusted).toBe(false);
23
+ expect(preview.checks.map(check => check.id)).toEqual(["recipe:test", "recipe:build"]);
24
+ expect(admitRecipe(preview, true).checkSpecs).toHaveLength(2);
25
+ expect(() => admitRecipe({ ...preview, recipeHash: "changed" }, true)).toThrow(/changed since preview/);
26
+ }
27
+ finally {
28
+ rmSync(root, { recursive: true, force: true });
29
+ }
30
+ });
31
+ it("rejects dependency cycles and only returns ready non-overlapping work", () => {
32
+ const item = (id, dependencies, scope) => ({ id, revision: 0, role: "worker", title: id, scope, dependencies, acceptanceCriteria: [], verificationPlan: [], lifecycle: "pending", attempt: 0 });
33
+ expect(() => validateDependencies([item("a", ["b"], ["a"]), item("b", ["a"], ["b"])])).toThrow(/cycle/);
34
+ const items = [item("a", [], ["src/a"]), item("b", [], ["src/b"]), item("c", ["a"], ["src/c"])];
35
+ expect(readyWorkItems(items, 2).map(item => item.id)).toEqual(["a", "b"]);
36
+ });
37
+ it("keeps unknown usage explicit and exposes unqualified native paths", () => {
38
+ const reserved = reserveBudget({ reservedRequests: 0, settledRequests: 0, reservedDurationMs: 0, observedDurationMs: 0, unknownUsage: false }, { maxRequests: 1 });
39
+ const settled = settleBudget(reserved, { durationMs: 50 });
40
+ expect(settled.unknownUsage).toBe(true);
41
+ expect(settled.observedTokens).toBeUndefined();
42
+ const capabilities = capabilityReport({ version: "18.2.6", extensionLoaded: true });
43
+ expect(capabilities.managedAvailable).toBe(false);
44
+ expect(capabilities.capabilities.every(capability => capability.level === "advisory")).toBe(true);
45
+ });
46
+ it("projects blockers and writes an offline evidence bundle", () => {
47
+ const root = mkdtempSync(join(tmpdir(), "bizar-bundle-"));
48
+ try {
49
+ let run = createRun("p", { objective: "x", nonGoals: [], constraints: [], acceptanceCriteria: ["done"], verificationPlan: [], stopConditions: [], userRestrictions: [] });
50
+ run = addWorkItem(run, { title: "change", role: "worker", scope: ["src"], dependencies: [], acceptanceCriteria: ["done"], verificationPlan: ["unit"] });
51
+ const evidence = createEvidence({ id: "ev", runId: run.runId, type: "test", checkId: "unit", result: "passed", targetDigest: "tree", inputDigests: {}, artifactHashes: [], provenance: { producer: "test", observedAt: "now" } });
52
+ const state = { revision: 1, run, dispatches: [], observations: [], evidence: [evidence], integrations: [], decisions: [], lastSequence: 1 };
53
+ const projection = projectWorkflow(state, { requiredChecks: ["unit"], targetDigest: "tree", ownedWork: [] });
54
+ expect(projection.acceptance.eligible).toBe(true);
55
+ const output = writeEvidenceBundle(join(root, "bundle"), createEvidenceBundle(state, projection.acceptance));
56
+ expect(readFileSync(output, "utf8")).toContain("schemaVersion");
57
+ expect(readFileSync(join(root, "bundle", "state.json"), "utf8")).toContain("ev");
58
+ }
59
+ finally {
60
+ rmSync(root, { recursive: true, force: true });
61
+ }
62
+ });
63
+ it("binds application assertions to a leased candidate endpoint", () => {
64
+ const lease = createCandidateAppLease({ leaseId: "lease", candidateId: "candidate", workspaceId: "workspace", host: "127.0.0.1", port: 43123, owner: "owner", expiresAt: Date.now() + 10_000 });
65
+ expect(() => assertCandidateEndpoint(lease, "http://127.0.0.1:43123/health")).not.toThrow();
66
+ expect(() => assertCandidateEndpoint(lease, "http://127.0.0.1:43124/health")).toThrow(/different endpoint/);
67
+ expect(releaseCandidateAppLease(lease).state).toBe("released");
68
+ });
69
+ it("requires independent approval before promoting a failure lesson", () => {
70
+ const lesson = { id: "lesson", observedFailure: "broken interaction", requirement: "scroll works", candidateId: "candidate", environment: "fixture", proposedFixture: "scroll-and-assert", sourceEvidenceIds: ["ev"], status: "proposed", revision: 1 };
71
+ expect(approveLesson(lesson, true, lessonHash(lesson)).status).toBe("approved");
72
+ expect(() => approveLesson(lesson, false, lessonHash(lesson))).toThrow(/independent review/);
73
+ });
74
+ it("keeps session controls owner- and revision-bound and idempotent", () => {
75
+ const initial = { sessionId: "s", owner: "owner", revision: 1, actionKeys: [], admission: "open" };
76
+ const request = { owner: "owner", sessionId: "s", expectedRevision: 1, idempotencyKey: "cancel-1" };
77
+ const first = applySessionControl(initial, "cancel-workflow", request);
78
+ expect(first.state.admission).toBe("cancelled");
79
+ expect(applySessionControl(first.state, "cancel-workflow", { ...request, expectedRevision: first.state.revision }).repeated).toBe(true);
80
+ });
81
+ });
82
+ //# sourceMappingURL=workflow-features.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-features.test.js","sourceRoot":"","sources":["../../tests/workflow-features.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,57 @@
1
+ import { afterEach, expect, it } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { execFileSync } from "node:child_process";
6
+ import { Journal } from "../src/storage/journal.js";
7
+ import { repositoryIdentity, statePath } from "../src/storage/repository-identity.js";
8
+ import { bindSession } from "../src/omp/lifecycle.js";
9
+ import { runWorkflow } from "../src/tools/workflow.js";
10
+ import { runVerification } from "../src/tools/verify.js";
11
+ const roots = [];
12
+ afterEach(() => { for (const root of roots.splice(0))
13
+ rmSync(root, { recursive: true, force: true }); });
14
+ function setup() {
15
+ const root = mkdtempSync(join(tmpdir(), "bizar-workflow-test-"));
16
+ roots.push(root);
17
+ execFileSync("git", ["init", "-q", root]);
18
+ const binding = bindSession(new Journal(statePath(repositoryIdentity(root))), { cwd: root, sessionManager: { getSessionFile: () => "owner" } });
19
+ const objective = { objective: "Implement", acceptanceCriteria: ["checks pass"], verificationPlan: ["unit"], nonGoals: [], constraints: [], stopConditions: [], userRestrictions: [] };
20
+ runWorkflow(binding, "start", { objective });
21
+ runWorkflow(binding, "transition", { to: "executing" });
22
+ return { root, binding, objective };
23
+ }
24
+ it("requires nonempty fresh checks and accepted work before completing", async () => {
25
+ const { root, binding } = setup();
26
+ expect(() => runWorkflow(binding, "transition", { to: "complete" })).toThrow();
27
+ expect(() => runWorkflow(binding, "complete", { requiredChecks: [] })).toThrow();
28
+ const item = runWorkflow(binding, "add-work", { item: { title: "change", role: "bizar-implementer", scope: ["src"], dependencies: [], acceptanceCriteria: ["works"], verificationPlan: ["unit"] } });
29
+ const receipt = await runVerification(binding, "unit", [process.execPath, "-e", "process.exit(0)"]);
30
+ expect(() => runWorkflow(binding, "complete", { requiredChecks: ["unit"] })).toThrow();
31
+ runWorkflow(binding, "accept-work", { workItemId: item.id, evidenceIds: [receipt.evidenceId] });
32
+ writeFileSync(join(root, "new.txt"), "changed");
33
+ expect(() => runWorkflow(binding, "complete", { requiredChecks: ["unit"] })).toThrow();
34
+ await runVerification(binding, "unit", [process.execPath, "-e", "process.exit(0)"]);
35
+ expect(runWorkflow(binding, "complete", { requiredChecks: ["unit"] })).toMatchObject({ phase: "complete" });
36
+ });
37
+ it("rejects other session mutations and resets evidence for the next run", async () => {
38
+ const { binding, objective } = setup();
39
+ expect(() => runWorkflow({ ...binding, owner: "other" }, "cancel", {})).toThrow(/owner/);
40
+ await runVerification(binding, "unit", [process.execPath, "-e", "process.exit(0)"]);
41
+ expect(() => runWorkflow(binding, "start", { objective })).toThrow(/non-terminal/);
42
+ runWorkflow(binding, "cancel", {});
43
+ runWorkflow(binding, "start", { objective });
44
+ expect(binding.journal.snapshot().evidence).toEqual([]);
45
+ });
46
+ it("does not let an older passing check conceal a later failure", async () => {
47
+ const { binding } = setup();
48
+ await runVerification(binding, "unit", [process.execPath, "-e", "process.exit(0)"]);
49
+ await runVerification(binding, "unit", [process.execPath, "-e", "process.exit(1)"]);
50
+ expect(() => runWorkflow(binding, "complete", { requiredChecks: ["unit"] })).toThrow(/fresh checks/);
51
+ });
52
+ it("enforces the cancellation fence at verification admission", async () => {
53
+ const { binding } = setup();
54
+ runWorkflow(binding, "cancel", { reason: "operator stop" });
55
+ await expect(runVerification(binding, "unit", [process.execPath, "-e", "process.exit(0)"])).rejects.toThrow(/cancellation fence/);
56
+ });
57
+ //# sourceMappingURL=workflow-safety.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-safety.test.js","sourceRoot":"","sources":["../../tests/workflow-safety.test.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "package": {
27
27
  "name": "@polderlabs/bizar-omp",
28
- "version": "0.6.1",
28
+ "version": "0.6.3",
29
29
  "integrity": "computed by npm pack in CI",
30
30
  "extensionEntry": "dist/extension.js"
31
31
  }
@@ -0,0 +1,5 @@
1
+ # Console handoff
2
+
3
+ Every TTY handoff to an inherit child — psmux/tmux attach, `switch-client`, and the direct `omp` fallback — first pauses `process.stdin`. An ink unmount can leave stdin flowing with no data listener; on Windows that read loop consumes console input records, so the attach child sharing the console never sees keystrokes (a new `omb agents` session appeared frozen). Pausing only stops this process from reading; the child keeps full console access, piped hosts are untouched (`isTTY === true` guard), and the attached client restores terminal state itself on real tmux.
4
+
5
+ Bizar's per-session root key-table binds (`C-d`/`C-c` detach, `C-b` prefix, and the wheel/click bindings that forward pointer events to the OMP pane) are skipped under psmux on Windows: psmux ignores persistent key-table assignment and its `set-option` quirk eats dash-leading values, so the binds cannot take effect there. Real tmux keeps them.
@@ -0,0 +1,32 @@
1
+ # 0.6.2
2
+
3
+ ## Highlights
4
+
5
+ - `/bizar-models` re-evaluates the whole Bizar role distribution with a bounded background agent instead of applying a locally scored mapping: the command reads the live OMP catalog, compares it with the current role mapping and the last observed catalog, and the agent persists its decision through the native `bizar_apply_model_roles` tool. A host without agent messaging still applies the deterministic baseline itself.
6
+ - Roles that already hold a value are re-evaluated on every run, so a changed catalog can produce a new distribution instead of the command reporting that nothing needs to happen.
7
+ - Session rows carry a display name — the native OMP title, then the first prompt, then a generated label — so the dashboard, the `omb agents` hub, and the tray stop showing bare session ids.
8
+ - OMB sessions keep 100,000 lines of tmux window history (the tmux default is 2,000), raised when the session window is created and again on attach, so a long OMP chat stays reviewable (#55).
9
+ - The dashboard visual system is its own surface rather than a TUI copy: one monospace stack, magenta accent with blue links, a near-black canvas lit by a dual radial glow, border-first panels, uppercase micro-labels, and a warm-paper light theme.
10
+ - Long command reports are appended verbatim to `.bizar-omp/run.log` in the project they ran in, while the status line keeps a fitted summary, so `/bizar-models` and `/bizar-dashboard` output is never silently clipped.
11
+
12
+ ## Model-role evaluation
13
+
14
+ - The agent receives only the sanitized live catalog, the current mapping, role purposes and requirements, and the deterministic baseline, and is instructed never to infer capability, cost, or locality from a model name.
15
+ - Every selector is validated against the live catalog and the OMP resolver before anything is written: the whole mapping is refused when any selector is unresolvable, and a selector that differs only in casing is stored under the catalog's spelling with the repair reported back.
16
+ - Unrelated roles, provider credentials, and user policy settings are preserved. The catalog observation is persisted only after a successful apply, and a bookkeeping failure is reported as a note rather than hiding the applied mapping.
17
+ - When the host cannot message an agent, `/bizar-models` applies the deterministic baseline and states that no agent took part.
18
+
19
+ ## Sessions, hub, and dashboard
20
+
21
+ - Renaming or recreating a session clears its deletion tombstone, so an intentionally removed session can be created and opened again; only Bizar-owned session names are ever tombstoned.
22
+ - The daemon snapshot carries display names, an explicit unknown state instead of a sentinel cwd, and last activity to the dashboard session list and conversation header.
23
+ - The mobile dashboard switches between sessions, chat, and details views with the same content as the desktop three-pane layout, and session search and filters stay available at that width.
24
+
25
+ ## Validation
26
+
27
+ - 171 Vitest tests across 27 files, TypeScript typecheck, build, package verification, generated-doc check, and secret scan.
28
+ - Three live OMP sessions in separate projects: `/bizar-models` dispatched an agent turn, the agent called the native `bizar_apply_model_roles` tool, and 13/13 roles were persisted from the 40-model live catalog with canonical selector casing. A second run reported `Catalog: 0 added, 0 removed, 0 changed, 40 unchanged (40 available)` and re-evaluated all 13 roles.
29
+ - Live tmux check on the raised history limit: an OMB-named session's window option reads `history-limit 100000` after the attach path runs, and a name Bizar does not own is refused.
30
+ - Live run log: the exported `/bizar-models` report is present in the project's `.bizar-omp/run.log` as a single JSON entry with the `bizar-models` event.
31
+
32
+ The native loader gate ran against OMP 18.2.6 with a resolvable package root: `verify:omp` reports `{"ok":true,"tools":8,"agents":8,"skills":8}` and passes packed install, repeat install, native discovery, profile isolation, and uninstall, and `verify:omp:registry` passes registry install, native discovery, and doctor against the published `@polderlabs/bizar-omp@0.6.2`.