@polderlabs/bizar-omp 0.6.2 → 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 (371) hide show
  1. package/README.md +54 -0
  2. package/dist/cli/agents.d.ts +1 -0
  3. package/dist/cli/agents.d.ts.map +1 -1
  4. package/dist/cli/agents.js +11 -0
  5. package/dist/cli/agents.js.map +1 -1
  6. package/dist/cli/omb-commands.d.ts +30 -0
  7. package/dist/cli/omb-commands.d.ts.map +1 -0
  8. package/dist/cli/omb-commands.js +109 -0
  9. package/dist/cli/omb-commands.js.map +1 -0
  10. package/dist/cli/omb-daemon.d.ts +1 -0
  11. package/dist/cli/omb-daemon.d.ts.map +1 -1
  12. package/dist/cli/omb-daemon.js +15 -1
  13. package/dist/cli/omb-daemon.js.map +1 -1
  14. package/dist/cli/omb-dashboard.d.ts +1 -1
  15. package/dist/cli/omb-dashboard.d.ts.map +1 -1
  16. package/dist/cli/omb-dashboard.js +2 -1
  17. package/dist/cli/omb-dashboard.js.map +1 -1
  18. package/dist/cli/omb-runtime.d.ts +42 -0
  19. package/dist/cli/omb-runtime.d.ts.map +1 -0
  20. package/dist/cli/omb-runtime.js +507 -0
  21. package/dist/cli/omb-runtime.js.map +1 -0
  22. package/dist/cli/omb-tray.d.ts +3 -0
  23. package/dist/cli/omb-tray.d.ts.map +1 -0
  24. package/dist/cli/omb-tray.js +44 -0
  25. package/dist/cli/omb-tray.js.map +1 -0
  26. package/dist/cli/omb.js +8 -33
  27. package/dist/cli/omb.js.map +1 -1
  28. package/dist/omp/daemon.d.ts +1 -0
  29. package/dist/omp/daemon.d.ts.map +1 -1
  30. package/dist/omp/daemon.js +1 -1
  31. package/dist/omp/daemon.js.map +1 -1
  32. package/dist/omp/omb-sessions.d.ts +24 -0
  33. package/dist/omp/omb-sessions.d.ts.map +1 -1
  34. package/dist/omp/omb-sessions.js +30 -12
  35. package/dist/omp/omb-sessions.js.map +1 -1
  36. package/dist/omp/tmux.d.ts +18 -0
  37. package/dist/omp/tmux.d.ts.map +1 -1
  38. package/dist/omp/tmux.js +131 -4
  39. package/dist/omp/tmux.js.map +1 -1
  40. package/dist/omp/tray.d.ts +2 -0
  41. package/dist/omp/tray.d.ts.map +1 -1
  42. package/dist/omp/tray.js +30 -4
  43. package/dist/omp/tray.js.map +1 -1
  44. package/dist/src/cli/agents-ink.d.ts +25 -0
  45. package/dist/src/cli/agents-ink.js +517 -0
  46. package/dist/src/cli/agents-ink.js.map +1 -0
  47. package/dist/src/cli/agents.d.ts +14 -0
  48. package/dist/src/cli/agents.js +197 -0
  49. package/dist/src/cli/agents.js.map +1 -0
  50. package/dist/src/cli/directory-selector.d.ts +60 -0
  51. package/dist/src/cli/directory-selector.js +208 -0
  52. package/dist/src/cli/directory-selector.js.map +1 -0
  53. package/dist/src/cli/doctor.d.ts +41 -0
  54. package/dist/src/cli/doctor.js +31 -0
  55. package/dist/src/cli/doctor.js.map +1 -0
  56. package/dist/src/cli/install.d.ts +129 -0
  57. package/dist/src/cli/install.js +164 -0
  58. package/dist/src/cli/install.js.map +1 -0
  59. package/dist/src/cli/main.d.ts +2 -0
  60. package/dist/src/cli/main.js +117 -0
  61. package/dist/src/cli/main.js.map +1 -0
  62. package/dist/src/cli/migrate.d.ts +18 -0
  63. package/dist/src/cli/migrate.js +14 -0
  64. package/dist/src/cli/migrate.js.map +1 -0
  65. package/dist/src/cli/omb-commands.d.ts +29 -0
  66. package/dist/src/cli/omb-commands.js +107 -0
  67. package/dist/src/cli/omb-commands.js.map +1 -0
  68. package/dist/src/cli/omb-daemon.d.ts +2 -0
  69. package/dist/src/cli/omb-daemon.js +135 -0
  70. package/dist/src/cli/omb-daemon.js.map +1 -0
  71. package/dist/src/cli/omb-dashboard.d.ts +12 -0
  72. package/dist/src/cli/omb-dashboard.js +113 -0
  73. package/dist/src/cli/omb-dashboard.js.map +1 -0
  74. package/dist/src/cli/omb-invocation.d.ts +8 -0
  75. package/dist/src/cli/omb-invocation.js +41 -0
  76. package/dist/src/cli/omb-invocation.js.map +1 -0
  77. package/dist/src/cli/omb-runtime.d.ts +41 -0
  78. package/dist/src/cli/omb-runtime.js +371 -0
  79. package/dist/src/cli/omb-runtime.js.map +1 -0
  80. package/dist/src/cli/omb-tray.d.ts +2 -0
  81. package/dist/src/cli/omb-tray.js +38 -0
  82. package/dist/src/cli/omb-tray.js.map +1 -0
  83. package/dist/src/cli/omb.d.ts +2 -0
  84. package/dist/src/cli/omb.js +31 -0
  85. package/dist/src/cli/omb.js.map +1 -0
  86. package/dist/src/cli/omp-theme.d.ts +17 -0
  87. package/dist/src/cli/omp-theme.js +22 -0
  88. package/dist/src/cli/omp-theme.js.map +1 -0
  89. package/dist/src/cli/process.d.ts +6 -0
  90. package/dist/src/cli/process.js +54 -0
  91. package/dist/src/cli/process.js.map +1 -0
  92. package/dist/src/cli/run.d.ts +2 -0
  93. package/dist/src/cli/run.js +5 -0
  94. package/dist/src/cli/run.js.map +1 -0
  95. package/dist/src/cli/setup-ui.d.ts +37 -0
  96. package/dist/src/cli/setup-ui.js +90 -0
  97. package/dist/src/cli/setup-ui.js.map +1 -0
  98. package/dist/src/core/acceptance.d.ts +32 -0
  99. package/dist/src/core/acceptance.js +87 -0
  100. package/dist/src/core/acceptance.js.map +1 -0
  101. package/dist/src/core/errors.d.ts +20 -0
  102. package/dist/src/core/errors.js +30 -0
  103. package/dist/src/core/errors.js.map +1 -0
  104. package/dist/src/core/evidence.d.ts +10 -0
  105. package/dist/src/core/evidence.js +35 -0
  106. package/dist/src/core/evidence.js.map +1 -0
  107. package/dist/src/core/policies.d.ts +10 -0
  108. package/dist/src/core/policies.js +60 -0
  109. package/dist/src/core/policies.js.map +1 -0
  110. package/dist/src/core/recovery.d.ts +6 -0
  111. package/dist/src/core/recovery.js +56 -0
  112. package/dist/src/core/recovery.js.map +1 -0
  113. package/dist/src/core/transitions.d.ts +13 -0
  114. package/dist/src/core/transitions.js +59 -0
  115. package/dist/src/core/transitions.js.map +1 -0
  116. package/dist/src/core/types.d.ts +256 -0
  117. package/dist/src/core/types.js +2 -0
  118. package/dist/src/core/types.js.map +1 -0
  119. package/dist/src/extension.d.ts +60 -0
  120. package/dist/src/extension.js +538 -0
  121. package/dist/src/extension.js.map +1 -0
  122. package/dist/src/index.d.ts +29 -0
  123. package/dist/src/index.js +30 -0
  124. package/dist/src/index.js.map +1 -0
  125. package/dist/src/omp/autonomous-settings.d.ts +14 -0
  126. package/dist/src/omp/autonomous-settings.js +65 -0
  127. package/dist/src/omp/autonomous-settings.js.map +1 -0
  128. package/dist/src/omp/capabilities.d.ts +23 -0
  129. package/dist/src/omp/capabilities.js +6 -0
  130. package/dist/src/omp/capabilities.js.map +1 -0
  131. package/dist/src/omp/compatibility.d.ts +30 -0
  132. package/dist/src/omp/compatibility.js +34 -0
  133. package/dist/src/omp/compatibility.js.map +1 -0
  134. package/dist/src/omp/completion.d.ts +7 -0
  135. package/dist/src/omp/completion.js +10 -0
  136. package/dist/src/omp/completion.js.map +1 -0
  137. package/dist/src/omp/config.d.ts +10 -0
  138. package/dist/src/omp/config.js +14 -0
  139. package/dist/src/omp/config.js.map +1 -0
  140. package/dist/src/omp/context.d.ts +15 -0
  141. package/dist/src/omp/context.js +3 -0
  142. package/dist/src/omp/context.js.map +1 -0
  143. package/dist/src/omp/daemon-service.d.ts +25 -0
  144. package/dist/src/omp/daemon-service.js +483 -0
  145. package/dist/src/omp/daemon-service.js.map +1 -0
  146. package/dist/src/omp/daemon.d.ts +48 -0
  147. package/dist/src/omp/daemon.js +194 -0
  148. package/dist/src/omp/daemon.js.map +1 -0
  149. package/dist/src/omp/dashboard-html.d.ts +3 -0
  150. package/dist/src/omp/dashboard-html.js +419 -0
  151. package/dist/src/omp/dashboard-html.js.map +1 -0
  152. package/dist/src/omp/dispatch-admission.d.ts +2 -0
  153. package/dist/src/omp/dispatch-admission.js +12 -0
  154. package/dist/src/omp/dispatch-admission.js.map +1 -0
  155. package/dist/src/omp/integration-recovery.d.ts +10 -0
  156. package/dist/src/omp/integration-recovery.js +18 -0
  157. package/dist/src/omp/integration-recovery.js.map +1 -0
  158. package/dist/src/omp/isolation-policy.d.ts +14 -0
  159. package/dist/src/omp/isolation-policy.js +9 -0
  160. package/dist/src/omp/isolation-policy.js.map +1 -0
  161. package/dist/src/omp/lifecycle.d.ts +14 -0
  162. package/dist/src/omp/lifecycle.js +14 -0
  163. package/dist/src/omp/lifecycle.js.map +1 -0
  164. package/dist/src/omp/memory.d.ts +16 -0
  165. package/dist/src/omp/memory.js +4 -0
  166. package/dist/src/omp/memory.js.map +1 -0
  167. package/dist/src/omp/model-role-assignment.d.ts +296 -0
  168. package/dist/src/omp/model-role-assignment.js +559 -0
  169. package/dist/src/omp/model-role-assignment.js.map +1 -0
  170. package/dist/src/omp/model-roles.d.ts +19 -0
  171. package/dist/src/omp/model-roles.js +6 -0
  172. package/dist/src/omp/model-roles.js.map +1 -0
  173. package/dist/src/omp/omb-sessions.d.ts +122 -0
  174. package/dist/src/omp/omb-sessions.js +512 -0
  175. package/dist/src/omp/omb-sessions.js.map +1 -0
  176. package/dist/src/omp/omb-settings.d.ts +35 -0
  177. package/dist/src/omp/omb-settings.js +104 -0
  178. package/dist/src/omp/omb-settings.js.map +1 -0
  179. package/dist/src/omp/result-reconciliation.d.ts +2 -0
  180. package/dist/src/omp/result-reconciliation.js +9 -0
  181. package/dist/src/omp/result-reconciliation.js.map +1 -0
  182. package/dist/src/omp/rpc.d.ts +67 -0
  183. package/dist/src/omp/rpc.js +4 -0
  184. package/dist/src/omp/rpc.js.map +1 -0
  185. package/dist/src/omp/run-log.d.ts +25 -0
  186. package/dist/src/omp/run-log.js +24 -0
  187. package/dist/src/omp/run-log.js.map +1 -0
  188. package/dist/src/omp/session-activity.d.ts +70 -0
  189. package/dist/src/omp/session-activity.js +361 -0
  190. package/dist/src/omp/session-activity.js.map +1 -0
  191. package/dist/src/omp/session-controls.d.ts +17 -0
  192. package/dist/src/omp/session-controls.js +14 -0
  193. package/dist/src/omp/session-controls.js.map +1 -0
  194. package/dist/src/omp/tmux.d.ts +89 -0
  195. package/dist/src/omp/tmux.js +445 -0
  196. package/dist/src/omp/tmux.js.map +1 -0
  197. package/dist/src/omp/tray-icons.d.ts +5 -0
  198. package/dist/src/omp/tray-icons.js +78 -0
  199. package/dist/src/omp/tray-icons.js.map +1 -0
  200. package/dist/src/omp/tray.d.ts +23 -0
  201. package/dist/src/omp/tray.js +167 -0
  202. package/dist/src/omp/tray.js.map +1 -0
  203. package/dist/src/services/budget.d.ts +19 -0
  204. package/dist/src/services/budget.js +10 -0
  205. package/dist/src/services/budget.js.map +1 -0
  206. package/dist/src/services/candidate-local.d.ts +13 -0
  207. package/dist/src/services/candidate-local.js +15 -0
  208. package/dist/src/services/candidate-local.js.map +1 -0
  209. package/dist/src/services/candidates.d.ts +20 -0
  210. package/dist/src/services/candidates.js +100 -0
  211. package/dist/src/services/candidates.js.map +1 -0
  212. package/dist/src/services/evidence-bundle.d.ts +17 -0
  213. package/dist/src/services/evidence-bundle.js +21 -0
  214. package/dist/src/services/evidence-bundle.js.map +1 -0
  215. package/dist/src/services/inspector.d.ts +11 -0
  216. package/dist/src/services/inspector.js +6 -0
  217. package/dist/src/services/inspector.js.map +1 -0
  218. package/dist/src/services/lessons.d.ts +13 -0
  219. package/dist/src/services/lessons.js +11 -0
  220. package/dist/src/services/lessons.js.map +1 -0
  221. package/dist/src/services/projection.d.ts +21 -0
  222. package/dist/src/services/projection.js +10 -0
  223. package/dist/src/services/projection.js.map +1 -0
  224. package/dist/src/services/readiness.d.ts +4 -0
  225. package/dist/src/services/readiness.js +35 -0
  226. package/dist/src/services/readiness.js.map +1 -0
  227. package/dist/src/services/recipes.d.ts +15 -0
  228. package/dist/src/services/recipes.js +42 -0
  229. package/dist/src/services/recipes.js.map +1 -0
  230. package/dist/src/services/recovery.d.ts +19 -0
  231. package/dist/src/services/recovery.js +9 -0
  232. package/dist/src/services/recovery.js.map +1 -0
  233. package/dist/src/services/review.d.ts +15 -0
  234. package/dist/src/services/review.js +9 -0
  235. package/dist/src/services/review.js.map +1 -0
  236. package/dist/src/storage/journal-recovery.d.ts +10 -0
  237. package/dist/src/storage/journal-recovery.js +33 -0
  238. package/dist/src/storage/journal-recovery.js.map +1 -0
  239. package/dist/src/storage/journal.d.ts +12 -0
  240. package/dist/src/storage/journal.js +82 -0
  241. package/dist/src/storage/journal.js.map +1 -0
  242. package/dist/src/storage/migrations.d.ts +22 -0
  243. package/dist/src/storage/migrations.js +107 -0
  244. package/dist/src/storage/migrations.js.map +1 -0
  245. package/dist/src/storage/repository-identity.d.ts +11 -0
  246. package/dist/src/storage/repository-identity.js +67 -0
  247. package/dist/src/storage/repository-identity.js.map +1 -0
  248. package/dist/src/storage/resources.d.ts +66 -0
  249. package/dist/src/storage/resources.js +148 -0
  250. package/dist/src/storage/resources.js.map +1 -0
  251. package/dist/src/tools/evidence.d.ts +8 -0
  252. package/dist/src/tools/evidence.js +9 -0
  253. package/dist/src/tools/evidence.js.map +1 -0
  254. package/dist/src/tools/integrate.d.ts +13 -0
  255. package/dist/src/tools/integrate.js +90 -0
  256. package/dist/src/tools/integrate.js.map +1 -0
  257. package/dist/src/tools/result.d.ts +9 -0
  258. package/dist/src/tools/result.js +2 -0
  259. package/dist/src/tools/result.js.map +1 -0
  260. package/dist/src/tools/verify.d.ts +13 -0
  261. package/dist/src/tools/verify.js +61 -0
  262. package/dist/src/tools/verify.js.map +1 -0
  263. package/dist/src/tools/workflow.d.ts +8 -0
  264. package/dist/src/tools/workflow.js +65 -0
  265. package/dist/src/tools/workflow.js.map +1 -0
  266. package/dist/src/workflows/direct.d.ts +9 -0
  267. package/dist/src/workflows/direct.js +2 -0
  268. package/dist/src/workflows/direct.js.map +1 -0
  269. package/dist/src/workflows/implement.d.ts +2 -0
  270. package/dist/src/workflows/implement.js +4 -0
  271. package/dist/src/workflows/implement.js.map +1 -0
  272. package/dist/src/workflows/plan.d.ts +17 -0
  273. package/dist/src/workflows/plan.js +6 -0
  274. package/dist/src/workflows/plan.js.map +1 -0
  275. package/dist/src/workflows/research.d.ts +15 -0
  276. package/dist/src/workflows/research.js +2 -0
  277. package/dist/src/workflows/research.js.map +1 -0
  278. package/dist/src/workflows/review.d.ts +15 -0
  279. package/dist/src/workflows/review.js +2 -0
  280. package/dist/src/workflows/review.js.map +1 -0
  281. package/dist/src/workflows/verify.d.ts +9 -0
  282. package/dist/src/workflows/verify.js +2 -0
  283. package/dist/src/workflows/verify.js.map +1 -0
  284. package/dist/tests/acceptance.test.d.ts +1 -0
  285. package/dist/tests/acceptance.test.js +27 -0
  286. package/dist/tests/acceptance.test.js.map +1 -0
  287. package/dist/tests/agents.test.d.ts +1 -0
  288. package/dist/tests/agents.test.js +369 -0
  289. package/dist/tests/agents.test.js.map +1 -0
  290. package/dist/tests/candidates.test.d.ts +1 -0
  291. package/dist/tests/candidates.test.js +60 -0
  292. package/dist/tests/candidates.test.js.map +1 -0
  293. package/dist/tests/core.test.d.ts +1 -0
  294. package/dist/tests/core.test.js +39 -0
  295. package/dist/tests/core.test.js.map +1 -0
  296. package/dist/tests/daemon.test.d.ts +1 -0
  297. package/dist/tests/daemon.test.js +157 -0
  298. package/dist/tests/daemon.test.js.map +1 -0
  299. package/dist/tests/dashboard.test.d.ts +1 -0
  300. package/dist/tests/dashboard.test.js +414 -0
  301. package/dist/tests/dashboard.test.js.map +1 -0
  302. package/dist/tests/directory-selector.test.d.ts +1 -0
  303. package/dist/tests/directory-selector.test.js +93 -0
  304. package/dist/tests/directory-selector.test.js.map +1 -0
  305. package/dist/tests/doctor.test.d.ts +1 -0
  306. package/dist/tests/doctor.test.js +32 -0
  307. package/dist/tests/doctor.test.js.map +1 -0
  308. package/dist/tests/install.test.d.ts +1 -0
  309. package/dist/tests/install.test.js +101 -0
  310. package/dist/tests/install.test.js.map +1 -0
  311. package/dist/tests/integration.test.d.ts +1 -0
  312. package/dist/tests/integration.test.js +49 -0
  313. package/dist/tests/integration.test.js.map +1 -0
  314. package/dist/tests/journal.test.d.ts +1 -0
  315. package/dist/tests/journal.test.js +50 -0
  316. package/dist/tests/journal.test.js.map +1 -0
  317. package/dist/tests/model-role-assignment.test.d.ts +1 -0
  318. package/dist/tests/model-role-assignment.test.js +294 -0
  319. package/dist/tests/model-role-assignment.test.js.map +1 -0
  320. package/dist/tests/omb-runtime.test.d.ts +1 -0
  321. package/dist/tests/omb-runtime.test.js +554 -0
  322. package/dist/tests/omb-runtime.test.js.map +1 -0
  323. package/dist/tests/omb-session-actions.test.d.ts +1 -0
  324. package/dist/tests/omb-session-actions.test.js +191 -0
  325. package/dist/tests/omb-session-actions.test.js.map +1 -0
  326. package/dist/tests/omb-settings.test.d.ts +1 -0
  327. package/dist/tests/omb-settings.test.js +82 -0
  328. package/dist/tests/omb-settings.test.js.map +1 -0
  329. package/dist/tests/omp-contract.test.d.ts +1 -0
  330. package/dist/tests/omp-contract.test.js +362 -0
  331. package/dist/tests/omp-contract.test.js.map +1 -0
  332. package/dist/tests/process.test.d.ts +1 -0
  333. package/dist/tests/process.test.js +12 -0
  334. package/dist/tests/process.test.js.map +1 -0
  335. package/dist/tests/psmux-windows.test.d.ts +1 -0
  336. package/dist/tests/psmux-windows.test.js +105 -0
  337. package/dist/tests/psmux-windows.test.js.map +1 -0
  338. package/dist/tests/recovery.test.d.ts +1 -0
  339. package/dist/tests/recovery.test.js +9 -0
  340. package/dist/tests/recovery.test.js.map +1 -0
  341. package/dist/tests/resources.test.d.ts +1 -0
  342. package/dist/tests/resources.test.js +55 -0
  343. package/dist/tests/resources.test.js.map +1 -0
  344. package/dist/tests/session-activity.test.d.ts +1 -0
  345. package/dist/tests/session-activity.test.js +159 -0
  346. package/dist/tests/session-activity.test.js.map +1 -0
  347. package/dist/tests/setup-ui.test.d.ts +1 -0
  348. package/dist/tests/setup-ui.test.js +37 -0
  349. package/dist/tests/setup-ui.test.js.map +1 -0
  350. package/dist/tests/storage-integrity.test.d.ts +1 -0
  351. package/dist/tests/storage-integrity.test.js +88 -0
  352. package/dist/tests/storage-integrity.test.js.map +1 -0
  353. package/dist/tests/tmux.test.d.ts +1 -0
  354. package/dist/tests/tmux.test.js +239 -0
  355. package/dist/tests/tmux.test.js.map +1 -0
  356. package/dist/tests/tray.test.d.ts +1 -0
  357. package/dist/tests/tray.test.js +37 -0
  358. package/dist/tests/tray.test.js.map +1 -0
  359. package/dist/tests/verification.test.d.ts +1 -0
  360. package/dist/tests/verification.test.js +61 -0
  361. package/dist/tests/verification.test.js.map +1 -0
  362. package/dist/tests/workflow-features.test.d.ts +1 -0
  363. package/dist/tests/workflow-features.test.js +82 -0
  364. package/dist/tests/workflow-features.test.js.map +1 -0
  365. package/dist/tests/workflow-safety.test.d.ts +1 -0
  366. package/dist/tests/workflow-safety.test.js +57 -0
  367. package/dist/tests/workflow-safety.test.js.map +1 -0
  368. package/docs/compatibility/baseline.json +1 -1
  369. package/docs/releases/0.6.2.md +2 -2
  370. package/docs/releases/0.6.3.md +27 -0
  371. package/package.json +1 -1
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { basename, resolve } from "node:path";
4
+ import { stdin as input, stdout as output } from "node:process";
5
+ import { attachOmbSession, deleteOmbSession, forgetOmbSession, launchOmb, ombSessionName, renameOmbSession, setOmbSessionMouse, } from "../omp/tmux.js";
6
+ import { loadOmbSettings, saveOmbSettings } from "../omp/omb-settings.js";
7
+ import { listOmbSessions, ombSessionDisplayName } from "../omp/omb-sessions.js";
8
+ import { activitySummary, compactAge } from "../omp/session-activity.js";
9
+ import { runInkAgentsHub } from "./agents-ink.js";
10
+ import { generatedSessionId } from "./omb-invocation.js";
11
+ import { startTray, stopTray } from "../omp/tray.js";
12
+ export const AGENTS_USAGE = `omb agents [--new]
13
+
14
+ Keyboard-first session hub across every project: attach, start, rename, and
15
+ stop Bizar-owned sessions, and edit settings (tray, stopped-session rows).
16
+ "omb hub" is an alias.
17
+
18
+ --new open the new-session picker immediately`;
19
+ const RESET = "\u001b[0m";
20
+ const DIM = "\u001b[2m";
21
+ const BOLD = "\u001b[1m";
22
+ const REVERSE = "\u001b[7m";
23
+ function sessionAge(session) {
24
+ if (session.activity)
25
+ return compactAge(session.activity.ageSeconds);
26
+ const timestamp = session.lastAttachedAt ?? session.createdAt;
27
+ if (!timestamp)
28
+ return "age ?";
29
+ const seconds = Math.max(0, Math.floor(Date.now() / 1000) - timestamp);
30
+ if (seconds < 60)
31
+ return "now";
32
+ if (seconds < 3600)
33
+ return `${Math.floor(seconds / 60)}m`;
34
+ if (seconds < 86400)
35
+ return `${Math.floor(seconds / 3600)}h`;
36
+ return `${Math.floor(seconds / 86400)}d`;
37
+ }
38
+ function truncate(value, width) {
39
+ if (value.length <= width)
40
+ return value;
41
+ if (width <= 1)
42
+ return value.slice(0, width);
43
+ return `${value.slice(0, width - 1)}…`;
44
+ }
45
+ function sessionSummary(session, currentCwd, terminalWidth) {
46
+ const project = truncate(ombSessionDisplayName(session), 24).padEnd(24);
47
+ const status = session.state.padEnd(12);
48
+ const activityWidth = Math.max(18, Math.min(40, terminalWidth - 24 - 14 - 10));
49
+ const activity = truncate(activitySummary(session.activity), activityWidth).padEnd(activityWidth);
50
+ const locationWidth = Math.max(16, Math.min(40, terminalWidth - 24 - 14 - activityWidth - 10));
51
+ const location = session.cwd === currentCwd ? "current project" : session.cwd;
52
+ return `${project} ${status} ${activity} ${truncate(location, locationWidth).padEnd(locationWidth)} ${sessionAge(session)}`;
53
+ }
54
+ const HUB_STATES = ["working", "waiting", "connected", "disconnected", "stopped"];
55
+ function counts(sessions) {
56
+ const totals = HUB_STATES.map(state => `${sessions.filter(session => session.state === state).length} ${state}`);
57
+ return `${sessions.length} session${sessions.length === 1 ? "" : "s"} · ${totals.join(" · ")}`;
58
+ }
59
+ function sectionName(state) {
60
+ return `${state.charAt(0).toUpperCase()}${state.slice(1)}`;
61
+ }
62
+ export function renderAgentsHub(sessions, selected, options = {}) {
63
+ const currentCwd = options.currentCwd || process.cwd();
64
+ const terminalWidth = Math.max(60, output.columns || 90);
65
+ const maxVisible = Math.max(4, options.maxVisible ?? Math.max(4, (output.rows || 24) - 10));
66
+ const start = Math.max(0, Math.min(Math.max(0, sessions.length - maxVisible), selected - Math.floor(maxVisible / 2)));
67
+ const visible = sessions.slice(start, start + maxVisible);
68
+ const lines = [
69
+ `${BOLD}Bizar Agents${RESET}`,
70
+ counts(sessions),
71
+ `${DIM}${truncate(currentCwd, terminalWidth - 2)}${RESET}`,
72
+ "",
73
+ `${DIM}Enter attach n new e rename d delete s settings r refresh ? help q quit${RESET}`,
74
+ "",
75
+ ];
76
+ if (sessions.length === 0) {
77
+ lines.push("No Bizar sessions are running.", "", "Press n to dispatch a new session.");
78
+ }
79
+ else {
80
+ let previousState;
81
+ for (const [offset, session] of visible.entries()) {
82
+ const index = start + offset;
83
+ if (session.state !== previousState) {
84
+ lines.push(`${BOLD}${sectionName(session.state)}${RESET}`);
85
+ previousState = session.state;
86
+ }
87
+ const row = `${index === selected ? ">" : " "} ${sessionSummary(session, currentCwd, terminalWidth)}`;
88
+ lines.push(index === selected ? `${REVERSE}${row}${RESET}` : row);
89
+ }
90
+ if (start > 0 || start + visible.length < sessions.length) {
91
+ lines.push(`${DIM}Showing ${start + 1}-${start + visible.length} of ${sessions.length}. Use Up/Down to scroll.${RESET}`);
92
+ }
93
+ }
94
+ if (options.notice)
95
+ lines.push("", `${options.notice}`);
96
+ lines.push("", `${DIM}Bizar owns only sessions with the bizar- prefix; unrelated tmux sessions are untouched.${RESET}`);
97
+ return `${lines.join("\n")}\n`;
98
+ }
99
+ function boxed(title, body, width = 58) {
100
+ const inner = width - 2;
101
+ const top = `┌${"─".repeat(inner)}┐`;
102
+ const bottom = `└${"─".repeat(inner)}┘`;
103
+ const rows = [`│ ${BOLD}${title}${RESET}${" ".repeat(Math.max(0, inner - title.length - 1))}│`];
104
+ const ansi = /\u001b\[[0-9;]*m/g;
105
+ for (const line of body) {
106
+ const visible = line.replace(ansi, "");
107
+ const clipped = truncate(visible, inner - 1);
108
+ const content = visible.length > inner - 1 ? clipped : line;
109
+ rows.push(`│ ${content}${" ".repeat(Math.max(0, inner - 1 - clipped.length))}│`);
110
+ }
111
+ return [top, ...rows, bottom].join("\n");
112
+ }
113
+ export function renderSettingsOverlay(settings, selected) {
114
+ const options = [
115
+ ["Project directory root", settings.projectsFolder || "not set"],
116
+ ["Attach plain omb to latest live session", settings.autoAttachLatest],
117
+ ["Enable mouse scrolling in OMB sessions", settings.mouseScrolling],
118
+ ["Show stopped sessions in this view", settings.showStoppedSessions],
119
+ ["Enable system tray icon", settings.trayEnabled],
120
+ ];
121
+ const body = options.map(([label, value], index) => {
122
+ const display = typeof value === "boolean" ? `[${value ? "on " : "off"}]` : value;
123
+ const row = `${index === selected ? ">" : " "} ${display} ${label}`;
124
+ return index === selected ? `${REVERSE}${row}${RESET}` : row;
125
+ });
126
+ body.push("", `${DIM}Up/Down select Space/Enter edit s save Esc cancel${RESET}`);
127
+ return boxed("OMB Settings", body);
128
+ }
129
+ async function dispatchSession(currentCwd, projectCwd, task, requestedId, env) {
130
+ const resolvedCwd = resolve(projectCwd || currentCwd);
131
+ if (!existsSync(resolvedCwd) || !statSync(resolvedCwd).isDirectory()) {
132
+ output.write(`omb agents: not a directory: ${resolvedCwd}\n`);
133
+ return;
134
+ }
135
+ await launchOmb(resolvedCwd, task ? [task] : [], env, requestedId || generatedSessionId(task || basename(resolvedCwd)));
136
+ }
137
+ async function renameSession(session, requestedId, env) {
138
+ const nextId = requestedId.trim() || session.id;
139
+ const projectCwd = session.cwd === "?" ? process.cwd() : session.cwd;
140
+ const nextName = ombSessionName(projectCwd, nextId);
141
+ if (nextName === session.name)
142
+ return "Session name unchanged.";
143
+ const code = await renameOmbSession(session.name, nextName, projectCwd, env);
144
+ return code === 0 ? `Renamed session to ${nextId}.` : "Could not rename that session.";
145
+ }
146
+ async function applySavedSettings(previous, next, sessions, cwd, env) {
147
+ saveOmbSettings({ ...next, projectsFolder: next.projectsFolder.trim() }, env);
148
+ if (previous.mouseScrolling !== next.mouseScrolling) {
149
+ await Promise.all(sessions.map(session => setOmbSessionMouse(session.name, next.mouseScrolling, cwd, env)));
150
+ }
151
+ if (previous.trayEnabled !== next.trayEnabled) {
152
+ if (next.trayEnabled)
153
+ await startTray(env);
154
+ else
155
+ await stopTray(env);
156
+ }
157
+ }
158
+ /** Run the keyboard-first cross-project session manager. */
159
+ export async function runAgentsHub(cwd = process.cwd(), _args = [], env = process.env) {
160
+ if (_args.includes("--help") || _args.includes("-h")) {
161
+ output.write(`${AGENTS_USAGE}\n`);
162
+ return 0;
163
+ }
164
+ if (!input.isTTY || !output.isTTY) {
165
+ output.write("omb agents requires an interactive terminal.\n");
166
+ return 1;
167
+ }
168
+ let settings = loadOmbSettings(env);
169
+ let preferredSessionName;
170
+ while (true) {
171
+ const allSessions = await listOmbSessions(cwd, env, { includeStopped: settings.showStoppedSessions });
172
+ const sessions = settings.showStoppedSessions ? allSessions : allSessions.filter(session => session.state !== "stopped");
173
+ const action = await runInkAgentsHub(cwd, env, sessions, settings, preferredSessionName, _args.includes("--new"));
174
+ preferredSessionName = undefined;
175
+ if (action.type === "quit")
176
+ return 0;
177
+ if (action.type === "settings") {
178
+ await applySavedSettings(settings, action.settings, allSessions, cwd, env);
179
+ settings = action.settings;
180
+ continue;
181
+ }
182
+ if (action.type === "attach")
183
+ await attachOmbSession(action.session.name, action.session.cwd === "?" ? cwd : action.session.cwd, env);
184
+ else if (action.type === "new")
185
+ await dispatchSession(cwd, action.projectCwd, action.task, action.sessionId, env);
186
+ else if (action.type === "rename")
187
+ await renameSession(action.session, action.nextId, env);
188
+ else if (action.type === "delete") {
189
+ preferredSessionName = action.nextSessionName;
190
+ if (action.session.hosted === false)
191
+ forgetOmbSession(action.session.name, env);
192
+ else
193
+ await deleteOmbSession(action.session.name, cwd, env);
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/cli/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export type DirectoryOptionKind = "current" | "parent" | "directory" | "recent" | "path" | "projects-root" | "project";
2
+ export interface DirectoryOption {
3
+ path: string;
4
+ label: string;
5
+ kind: DirectoryOptionKind;
6
+ detail?: string;
7
+ }
8
+ /** Score a fuzzy subsequence match. Higher scores are better; no match is undefined. */
9
+ export declare function fuzzyScore(query: string, candidate: string): number | undefined;
10
+ /** Filter and rank options without touching the filesystem. */
11
+ export declare function filterDirectoryOptions(options: DirectoryOption[], query: string): DirectoryOption[];
12
+ export declare function expandDirectoryPath(value: string, base?: string): string;
13
+ /** Recursively discover directories under one configured project root. */
14
+ export declare function scanDirectoryTree(root: string): Promise<string[]>;
15
+ /** Offer filesystem-backed path completions for the Settings project-root field. */
16
+ export declare function readDirectoryCompletions(input: string, base?: string): Promise<DirectoryOption[]>;
17
+ /**
18
+ * Build the directory candidates shown by the in-hub session selector.
19
+ * The list is intentionally shallow and fast. Recent session projects make
20
+ * cross-project switching quick, while the current directory remains a
21
+ * normal browser with parent and child navigation. An optional projects
22
+ * folder adds a full recursive project index without scanning home.
23
+ */
24
+ export declare function readDirectoryOptions(currentPath: string, recentPaths?: string[], query?: string, projectsFolder?: string): Promise<DirectoryOption[]>;
25
+ export type DirectoryKeyAction = {
26
+ kind: "cursor-up";
27
+ } | {
28
+ kind: "cursor-down";
29
+ } | {
30
+ kind: "select";
31
+ } | {
32
+ kind: "open";
33
+ } | {
34
+ kind: "parent";
35
+ } | {
36
+ kind: "backspace";
37
+ } | {
38
+ kind: "clear";
39
+ } | {
40
+ kind: "type";
41
+ input: string;
42
+ } | {
43
+ kind: "ignore";
44
+ };
45
+ /**
46
+ * Decide how a keypress acts in the directory picker's filter mode.
47
+ * Letters are never navigation: printable input always types into the query,
48
+ * so paths containing l/j/k/h (e.g. "labs") stay filterable. Arrows, Enter,
49
+ * Backspace/Ctrl-H, and Ctrl-U carry all navigation and editing.
50
+ */
51
+ export declare function directoryKeyAction(input: string, key: {
52
+ upArrow?: boolean;
53
+ downArrow?: boolean;
54
+ return?: boolean;
55
+ rightArrow?: boolean;
56
+ leftArrow?: boolean;
57
+ backspace?: boolean;
58
+ ctrl?: boolean;
59
+ meta?: boolean;
60
+ }): DirectoryKeyAction;
@@ -0,0 +1,208 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { basename, dirname, isAbsolute, relative, resolve } from "node:path";
3
+ import { homedir } from "node:os";
4
+ /** Score a fuzzy subsequence match. Higher scores are better; no match is undefined. */
5
+ export function fuzzyScore(query, candidate) {
6
+ const needle = query.trim().toLocaleLowerCase();
7
+ const haystack = candidate.toLocaleLowerCase();
8
+ if (!needle)
9
+ return 0;
10
+ if (haystack === needle)
11
+ return 10_000;
12
+ const exactAt = haystack.indexOf(needle);
13
+ if (exactAt >= 0)
14
+ return 8_000 - exactAt * 4 + Math.max(0, 200 - haystack.length);
15
+ let cursor = 0;
16
+ let previous = -2;
17
+ let score = 0;
18
+ for (const character of needle) {
19
+ const found = haystack.indexOf(character, cursor);
20
+ if (found < 0)
21
+ return undefined;
22
+ const boundary = found === 0 || "/\\_- .".includes(haystack[found - 1] ?? "");
23
+ score += boundary ? 35 : 12;
24
+ if (found === previous + 1)
25
+ score += 18;
26
+ score -= found;
27
+ previous = found;
28
+ cursor = found + 1;
29
+ }
30
+ return score;
31
+ }
32
+ function kindRank(kind) {
33
+ if (kind === "current")
34
+ return 0;
35
+ if (kind === "projects-root")
36
+ return 1;
37
+ if (kind === "recent")
38
+ return 2;
39
+ if (kind === "parent")
40
+ return 3;
41
+ if (kind === "project")
42
+ return 4;
43
+ return 5;
44
+ }
45
+ /** Filter and rank options without touching the filesystem. */
46
+ export function filterDirectoryOptions(options, query) {
47
+ return options
48
+ .map(option => ({ option, score: fuzzyScore(query, `${option.label} ${option.path} ${option.detail ?? ""}`) }))
49
+ .filter((entry) => entry.score !== undefined)
50
+ .sort((a, b) => b.score - a.score || kindRank(a.option.kind) - kindRank(b.option.kind) || a.option.path.localeCompare(b.option.path))
51
+ .map(entry => entry.option);
52
+ }
53
+ const IGNORED_DIRECTORY_NAMES = new Set([".git", "node_modules", ".cache", ".turbo", ".next", ".venv", "venv"]);
54
+ export function expandDirectoryPath(value, base = process.cwd()) {
55
+ const expanded = value === "~" ? homedir() : value.startsWith("~/") ? resolve(homedir(), value.slice(2)) : value;
56
+ return resolve(isAbsolute(expanded) ? expanded : base, isAbsolute(expanded) ? "." : expanded);
57
+ }
58
+ async function directoryExists(path) {
59
+ try {
60
+ return (await stat(path)).isDirectory();
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ function usableDirectory(name, includeHidden = false) {
67
+ return !IGNORED_DIRECTORY_NAMES.has(name) && (includeHidden || !name.startsWith("."));
68
+ }
69
+ /** Recursively discover directories under one configured project root. */
70
+ export async function scanDirectoryTree(root) {
71
+ const directories = [];
72
+ const visit = async (directory) => {
73
+ let entries;
74
+ try {
75
+ entries = await readdir(directory, { withFileTypes: true });
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
81
+ if (!entry.isDirectory() || !usableDirectory(entry.name))
82
+ continue;
83
+ const path = resolve(directory, entry.name);
84
+ directories.push(path);
85
+ await visit(path);
86
+ }
87
+ };
88
+ await visit(resolve(root));
89
+ return directories;
90
+ }
91
+ /** Offer filesystem-backed path completions for the Settings project-root field. */
92
+ export async function readDirectoryCompletions(input, base = process.cwd()) {
93
+ const raw = input.trim();
94
+ const expanded = expandDirectoryPath(raw || ".", base);
95
+ const trailingSlash = /[\\/]$/.test(raw);
96
+ const directory = raw === "" || trailingSlash ? expanded : dirname(expanded);
97
+ const query = raw === "" || trailingSlash ? "" : basename(expanded);
98
+ let entries;
99
+ try {
100
+ entries = await readdir(directory, { withFileTypes: true });
101
+ }
102
+ catch {
103
+ return [];
104
+ }
105
+ const options = entries
106
+ .filter(entry => entry.isDirectory() && usableDirectory(entry.name, query.startsWith(".")))
107
+ .map(entry => {
108
+ const path = resolve(directory, entry.name);
109
+ return { path, label: entry.name, kind: "path", detail: path };
110
+ });
111
+ return filterDirectoryOptions(options, query);
112
+ }
113
+ /**
114
+ * Build the directory candidates shown by the in-hub session selector.
115
+ * The list is intentionally shallow and fast. Recent session projects make
116
+ * cross-project switching quick, while the current directory remains a
117
+ * normal browser with parent and child navigation. An optional projects
118
+ * folder adds a full recursive project index without scanning home.
119
+ */
120
+ export async function readDirectoryOptions(currentPath, recentPaths = [], query = "", projectsFolder = "") {
121
+ const directory = expandDirectoryPath(currentPath);
122
+ const options = [
123
+ { path: directory, label: "Use this directory", kind: "current", detail: directory },
124
+ ];
125
+ const parent = dirname(directory);
126
+ if (parent !== directory)
127
+ options.push({ path: parent, label: ".. Parent directory", kind: "parent", detail: parent });
128
+ const seen = new Set(options.map(option => option.path));
129
+ const configuredProjectsFolder = projectsFolder.trim() ? expandDirectoryPath(projectsFolder.trim()) : undefined;
130
+ if (configuredProjectsFolder && await directoryExists(configuredProjectsFolder)) {
131
+ if (!seen.has(configuredProjectsFolder)) {
132
+ options.push({ path: configuredProjectsFolder, label: "Projects folder", kind: "projects-root", detail: configuredProjectsFolder });
133
+ seen.add(configuredProjectsFolder);
134
+ }
135
+ try {
136
+ const projectDirectories = await scanDirectoryTree(configuredProjectsFolder);
137
+ for (const path of projectDirectories) {
138
+ if (seen.has(path))
139
+ continue;
140
+ // Selector labels are UI strings shown across platforms; always use
141
+ // forward slashes so a Windows path reads "alpha/packages/core".
142
+ options.push({ path, label: relative(configuredProjectsFolder, path).replaceAll("\\", "/"), kind: "project", detail: path });
143
+ seen.add(path);
144
+ }
145
+ }
146
+ catch {
147
+ // The root remains selectable even when its children cannot be read.
148
+ }
149
+ }
150
+ for (const recent of recentPaths.map(path => resolve(path)).filter(path => path !== directory && !seen.has(path))) {
151
+ if (await directoryExists(recent)) {
152
+ options.push({ path: recent, label: basename(recent) || recent, kind: "recent", detail: recent });
153
+ seen.add(recent);
154
+ }
155
+ }
156
+ try {
157
+ const entries = await readdir(directory, { withFileTypes: true });
158
+ for (const entry of entries) {
159
+ if (!entry.isDirectory() || !usableDirectory(entry.name, query.trim().startsWith(".")))
160
+ continue;
161
+ if (entry.name.startsWith(".") && !query.trim().startsWith("."))
162
+ continue;
163
+ const path = resolve(directory, entry.name);
164
+ if (seen.has(path))
165
+ continue;
166
+ options.push({ path, label: entry.name, kind: "directory", detail: path });
167
+ seen.add(path);
168
+ }
169
+ }
170
+ catch {
171
+ // The selector still offers the current path, parent, and recent paths
172
+ // when a directory becomes unreadable between refreshes.
173
+ }
174
+ const direct = query.trim();
175
+ if (direct.includes("/") || direct.startsWith("~")) {
176
+ const candidate = expandDirectoryPath(direct, directory);
177
+ if (!seen.has(candidate) && await directoryExists(candidate)) {
178
+ options.unshift({ path: candidate, label: `Use ${basename(candidate) || candidate}`, kind: "path", detail: candidate });
179
+ }
180
+ }
181
+ return options;
182
+ }
183
+ /**
184
+ * Decide how a keypress acts in the directory picker's filter mode.
185
+ * Letters are never navigation: printable input always types into the query,
186
+ * so paths containing l/j/k/h (e.g. "labs") stay filterable. Arrows, Enter,
187
+ * Backspace/Ctrl-H, and Ctrl-U carry all navigation and editing.
188
+ */
189
+ export function directoryKeyAction(input, key) {
190
+ if (key.upArrow)
191
+ return { kind: "cursor-up" };
192
+ if (key.downArrow)
193
+ return { kind: "cursor-down" };
194
+ if (key.return)
195
+ return { kind: "select" };
196
+ if (key.rightArrow)
197
+ return { kind: "open" };
198
+ if (key.leftArrow)
199
+ return { kind: "parent" };
200
+ if (key.backspace || (key.ctrl && input === "h"))
201
+ return { kind: "backspace" };
202
+ if (key.ctrl && input === "u")
203
+ return { kind: "clear" };
204
+ if (input && !key.ctrl && !key.meta && input >= " ")
205
+ return { kind: "type", input };
206
+ return { kind: "ignore" };
207
+ }
208
+ //# sourceMappingURL=directory-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-selector.js","sourceRoot":"","sources":["../../../src/cli/directory-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare function doctor(cwd?: string): {
2
+ ok: boolean;
3
+ repository: import("../storage/repository-identity.js").RepositoryIdentity;
4
+ state: {
5
+ valid: boolean;
6
+ lines: number;
7
+ invalidLines: number;
8
+ };
9
+ omp: {
10
+ readonly version: "18.2.6";
11
+ readonly commit: "78b753124d11f8dd3ae73e2524125890ff7c977e";
12
+ };
13
+ bun: string;
14
+ multiplexer: {
15
+ bin: string;
16
+ available: boolean;
17
+ version?: string;
18
+ };
19
+ compatibility: {
20
+ supportedBaseline: {
21
+ readonly version: "18.2.6";
22
+ readonly commit: "78b753124d11f8dd3ae73e2524125890ff7c977e";
23
+ };
24
+ bun: string;
25
+ probe: import("../omp/compatibility.js").RuntimeProbe;
26
+ qualified: boolean;
27
+ limitation: string;
28
+ };
29
+ note: string;
30
+ error?: undefined;
31
+ } | {
32
+ repository?: undefined;
33
+ state?: undefined;
34
+ omp?: undefined;
35
+ bun?: undefined;
36
+ multiplexer?: undefined;
37
+ compatibility?: undefined;
38
+ note?: undefined;
39
+ ok: boolean;
40
+ error: string;
41
+ };
@@ -0,0 +1,31 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { repositoryIdentity } from "../storage/repository-identity.js";
3
+ import { compatibilityReport, SUPPORTED_OMP, SUPPORTED_BUN } from "../omp/compatibility.js";
4
+ import { inspectState } from "../storage/migrations.js";
5
+ import { statePath } from "../storage/repository-identity.js";
6
+ import { resolveMultiplexerBin } from "../omp/omb-sessions.js";
7
+ /**
8
+ * Probe the resolved multiplexer cheaply: `-V` exits 0 on tmux and psmux
9
+ * alike and never touches session state. ENOENT means no multiplexer is
10
+ * installed, which is a warning, not a failure — omb falls back to a
11
+ * direct OMP spawn.
12
+ */
13
+ function multiplexerReport(env = process.env) {
14
+ const bin = resolveMultiplexerBin(env);
15
+ const probe = spawnSync(bin, ["-V"], { encoding: "utf8", timeout: 5000, stdio: ["ignore", "pipe", "ignore"] });
16
+ if (probe.error || probe.status !== 0)
17
+ return { bin, available: false };
18
+ return { bin, available: true, version: (probe.stdout ?? "").trim() || undefined };
19
+ }
20
+ export function doctor(cwd = process.cwd()) {
21
+ try {
22
+ const identity = repositoryIdentity(cwd);
23
+ const state = inspectState(statePath(identity));
24
+ const multiplexer = multiplexerReport();
25
+ return { ok: state.valid, repository: identity, state, omp: SUPPORTED_OMP, bun: SUPPORTED_BUN, multiplexer, compatibility: compatibilityReport({ extensionFactoryLoaded: false, registrationOnly: true }), note: "CLI doctor cannot prove a live OMP host binding; run the extension contract test under omp." };
26
+ }
27
+ catch (error) {
28
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
29
+ }
30
+ }
31
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IAC7D,MAAM,GAAG,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/G,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACxC,IAAI,CAAC;QAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,CAAC,EAAE,sBAAsB,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,6FAA6F,EAAE,CAAC;IAAC,CAAC;IAC7b,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAAC,CAAC;AACxG,CAAC"}