@pasko70/pibo 1.1.0 → 1.2.0

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 (426) hide show
  1. package/README.md +106 -254
  2. package/context/codex-base-prompt.md +4 -0
  3. package/context/compute-worker.md +23 -0
  4. package/context/pibo-native-tooling.md +18 -0
  5. package/context/pibo-system-prompt.md +69 -8
  6. package/dist/api/simple-agent-api.js +136 -0
  7. package/dist/app-context.js +4 -0
  8. package/dist/apps/chat/agent-profiles.js +18 -3
  9. package/dist/apps/chat/agent-store.js +113 -16
  10. package/dist/apps/chat/chat-api-routes.js +311 -0
  11. package/dist/apps/chat/chat-capability-routes.js +90 -0
  12. package/dist/apps/chat/chat-files.js +178 -0
  13. package/dist/apps/chat/chat-request-normalizers.js +681 -0
  14. package/dist/apps/chat/chat-settings-routes.js +75 -0
  15. package/dist/apps/chat/chat-trace-helpers.js +94 -0
  16. package/dist/apps/chat/chat-user-skill-routes.js +149 -0
  17. package/dist/apps/chat/cron-api.js +213 -0
  18. package/dist/apps/chat/data/chat-data-mappers.js +74 -0
  19. package/dist/apps/chat/data/event-command-service.js +75 -0
  20. package/dist/apps/chat/data/navigation-query-service.js +11 -0
  21. package/dist/apps/chat/data/project-service.js +844 -0
  22. package/dist/apps/chat/data/read-state-service.js +42 -0
  23. package/dist/apps/chat/data/room-service.js +52 -0
  24. package/dist/apps/chat/data/session-query-service.js +63 -0
  25. package/dist/apps/chat/data/timeline-query-service.js +96 -0
  26. package/dist/apps/chat/event-log.js +1 -307
  27. package/dist/apps/chat/model-catalog.js +7 -2
  28. package/dist/apps/chat/output-compactor.js +126 -0
  29. package/dist/apps/chat/output-event-policy.js +17 -0
  30. package/dist/apps/chat/project-workflow-human-actions.js +347 -0
  31. package/dist/apps/chat/project-workflow-sessions.js +260 -0
  32. package/dist/apps/chat/provider-auth-actions.js +43 -0
  33. package/dist/apps/chat/ralph-api.js +156 -0
  34. package/dist/apps/chat/read-model.js +1 -218
  35. package/dist/apps/chat/rooms.js +1 -321
  36. package/dist/apps/chat/static-assets.js +996 -0
  37. package/dist/apps/chat/stream.js +29 -6
  38. package/dist/apps/chat/trace.js +179 -1003
  39. package/dist/apps/chat/types/event-store.js +1 -0
  40. package/dist/apps/chat/types/read-model.js +1 -0
  41. package/dist/apps/chat/types/rooms.js +36 -0
  42. package/dist/apps/chat/web-app.js +3131 -1959
  43. package/dist/apps/chat/workflow-catalog.js +572 -0
  44. package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
  45. package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
  46. package/dist/apps/chat/workflow-persistence-model.js +140 -0
  47. package/dist/apps/chat/workflow-persistence.js +633 -0
  48. package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
  49. package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
  50. package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
  51. package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
  52. package/dist/apps/chat/workflow-validation-helpers.js +114 -0
  53. package/dist/apps/chat-ui/assets/{dist-CNLWH2qh.js → dist-B4lw9z4F.js} +1 -1
  54. package/dist/apps/chat-ui/assets/{dist-8e4L8ciw.js → dist-BbTaHWON.js} +1 -1
  55. package/dist/apps/chat-ui/assets/{dist-CMZOa5ik.js → dist-BcT_c1EJ.js} +1 -1
  56. package/dist/apps/chat-ui/assets/{dist-DNcnQRPF.js → dist-CGINd7XU.js} +1 -1
  57. package/dist/apps/chat-ui/assets/{dist-CqqUC8Ce.js → dist-CrBzZkUp.js} +1 -1
  58. package/dist/apps/chat-ui/assets/{dist-D2N4-LIc.js → dist-CyyISotB.js} +1 -1
  59. package/dist/apps/chat-ui/assets/{dist-CUqpST5w.js → dist-DFbnFNpX.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dist-CspjOeBj.js → dist-DGLWQLX8.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dist-B7bbI3Qz.js → dist-DfcIkFSN.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dist-v4pjHlB7.js → dist-sKDHTwaT.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{dist-D9L4MSRF.js → dist-y9D6la48.js} +1 -1
  64. package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
  65. package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
  66. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
  67. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
  68. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
  69. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
  70. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
  71. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
  72. package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
  73. package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
  74. package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
  75. package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
  76. package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
  77. package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
  78. package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
  79. package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
  80. package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
  81. package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
  82. package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
  83. package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
  84. package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
  85. package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
  86. package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
  87. package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
  88. package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
  89. package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
  90. package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
  91. package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
  92. package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
  93. package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
  94. package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
  95. package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
  96. package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
  97. package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
  98. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
  99. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
  100. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
  101. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
  102. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
  103. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
  104. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
  105. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
  106. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
  107. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
  108. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
  109. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
  110. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
  111. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
  112. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
  113. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
  114. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
  115. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
  116. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
  117. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
  118. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
  119. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
  120. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
  121. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
  122. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
  123. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
  124. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
  125. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
  126. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
  127. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
  128. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
  129. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
  130. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
  131. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
  132. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
  133. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
  134. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
  135. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
  136. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
  137. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
  138. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
  139. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
  140. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
  141. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
  142. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
  143. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
  144. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
  145. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
  146. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
  147. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
  148. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
  149. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
  150. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
  151. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
  152. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
  153. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
  154. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
  155. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
  156. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
  157. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
  158. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
  159. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
  160. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
  161. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
  162. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
  163. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
  164. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
  165. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
  166. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
  167. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
  168. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
  169. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
  170. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
  171. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
  172. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
  173. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
  174. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
  175. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
  176. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
  177. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
  178. package/dist/apps/chat-ui/index.html +8 -3
  179. package/dist/apps/chat-ui/manifest.webmanifest +25 -0
  180. package/dist/apps/chat-ui/sw.js +41 -0
  181. package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
  182. package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
  183. package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
  184. package/dist/apps/cli-ui/InkTerminalView.js +25 -0
  185. package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
  186. package/dist/apps/cli-ui/index.js +8 -0
  187. package/dist/apps/cli-ui/inkColors.js +67 -0
  188. package/dist/apps/cli-ui/inkJson.js +244 -0
  189. package/dist/apps/cli-ui/inkMarkdown.js +122 -0
  190. package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
  191. package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
  192. package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
  193. package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
  194. package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
  195. package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
  196. package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
  197. package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
  198. package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
  199. package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
  200. package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
  201. package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
  202. package/dist/apps/context-files-ui/index.html +2 -2
  203. package/dist/auth/better-auth.js +2 -1
  204. package/dist/auth/login-actions.js +251 -0
  205. package/dist/auth/openai-codex-usage.js +147 -0
  206. package/dist/bin/pibo.js +0 -0
  207. package/dist/bin/rg.js +15 -0
  208. package/dist/cli-session/fakeSessionSource.js +804 -0
  209. package/dist/cli-session/index.js +3 -0
  210. package/dist/cli-session/localSessionSource.js +1144 -0
  211. package/dist/cli-session/sessionSource.js +13 -0
  212. package/dist/cli.js +142 -14
  213. package/dist/compute/cli.js +415 -0
  214. package/dist/compute/docker.js +827 -0
  215. package/dist/compute/resource-health.js +333 -0
  216. package/dist/compute/resource-policy.js +98 -0
  217. package/dist/config/config.js +9 -5
  218. package/dist/core/context-build.js +677 -0
  219. package/dist/core/model-defaults.js +51 -9
  220. package/dist/core/pibo-home.js +8 -0
  221. package/dist/core/profiles.js +48 -0
  222. package/dist/core/provider-telemetry.js +222 -0
  223. package/dist/core/routed-session.js +441 -47
  224. package/dist/core/runtime-telemetry.js +853 -0
  225. package/dist/core/runtime.js +103 -15
  226. package/dist/core/session-errors.js +47 -0
  227. package/dist/core/session-model.js +39 -0
  228. package/dist/core/session-router.js +292 -62
  229. package/dist/core/shared-app.js +17 -0
  230. package/dist/core/skill-expansion.js +43 -0
  231. package/dist/core/system-prompt-template.js +9 -9
  232. package/dist/core/telemetry-staleness.js +128 -0
  233. package/dist/core/test-output-compaction.js +145 -0
  234. package/dist/core/user-settings.js +73 -0
  235. package/dist/cron/channel.js +28 -0
  236. package/dist/cron/cli.js +230 -0
  237. package/dist/cron/plugin.js +11 -0
  238. package/dist/cron/schedule.js +214 -0
  239. package/dist/cron/service.js +177 -0
  240. package/dist/cron/store.js +349 -0
  241. package/dist/cron/types.js +1 -0
  242. package/dist/data/cli.js +184 -0
  243. package/dist/data/event-log.js +106 -0
  244. package/dist/data/final-app-space-cutover-migration.js +728 -0
  245. package/dist/data/ingest-service.js +389 -0
  246. package/dist/data/message-store.js +62 -0
  247. package/dist/data/navigation-store.js +75 -0
  248. package/dist/data/observation-store.js +46 -0
  249. package/dist/data/payload-store.js +144 -0
  250. package/dist/data/pibo-store.js +59 -0
  251. package/dist/data/schema.js +434 -0
  252. package/dist/data/session-store.js +63 -0
  253. package/dist/data/shared-app-migration.js +757 -0
  254. package/dist/data/sqlite-schema.js +12 -0
  255. package/dist/data/telemetry-preview.js +65 -0
  256. package/dist/data/telemetry-queries.js +212 -0
  257. package/dist/data/telemetry-retention.js +50 -0
  258. package/dist/data/telemetry-rows.js +158 -0
  259. package/dist/data/telemetry.js +357 -0
  260. package/dist/debug/delta-compaction.js +99 -0
  261. package/dist/debug/detail-format.js +86 -0
  262. package/dist/debug/events.js +149 -29
  263. package/dist/debug/failures.js +162 -0
  264. package/dist/debug/index.js +655 -30
  265. package/dist/debug/messages.js +185 -0
  266. package/dist/debug/next-commands.js +6 -0
  267. package/dist/debug/payloads.js +123 -0
  268. package/dist/debug/pty.js +924 -0
  269. package/dist/debug/session.js +45 -15
  270. package/dist/debug/sql.js +1 -1
  271. package/dist/debug/stores.js +18 -13
  272. package/dist/debug/summary.js +72 -0
  273. package/dist/debug/telemetry.js +649 -0
  274. package/dist/debug/tools.js +168 -0
  275. package/dist/debug/trace-render-check.js +151 -0
  276. package/dist/debug/trace.js +152 -27
  277. package/dist/debug/web-artifacts.js +63 -0
  278. package/dist/debug/web-options.js +313 -0
  279. package/dist/debug/web-render-analysis.js +310 -0
  280. package/dist/debug/web-snapshot-browser-scripts.js +303 -0
  281. package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
  282. package/dist/debug/web-streaming-browser-library.js +928 -0
  283. package/dist/debug/web-streaming-browser-scripts.js +242 -0
  284. package/dist/debug/web-streaming-provider-telemetry.js +194 -0
  285. package/dist/debug/web-streaming-report.js +493 -0
  286. package/dist/debug/web-streaming-types.js +1 -0
  287. package/dist/debug/web.js +574 -0
  288. package/dist/gateway/backup.js +83 -0
  289. package/dist/gateway/cli.js +511 -0
  290. package/dist/gateway/fallback.js +155 -0
  291. package/dist/gateway/pidfile.js +84 -0
  292. package/dist/gateway/protocol.js +16 -0
  293. package/dist/gateway/server.js +172 -17
  294. package/dist/gateway/tool.js +54 -51
  295. package/dist/gateway/web.js +74 -2
  296. package/dist/index.js +3 -1
  297. package/dist/local/client.js +3 -3
  298. package/dist/local/extension.js +8 -5
  299. package/dist/plugins/builtin.js +251 -49
  300. package/dist/plugins/chat-vscode-web.js +28 -0
  301. package/dist/plugins/codex-compat.js +0 -41
  302. package/dist/plugins/context-files.js +98 -18
  303. package/dist/plugins/dev-auth.js +124 -0
  304. package/dist/plugins/native-tooling.js +15 -0
  305. package/dist/plugins/registry.js +49 -1
  306. package/dist/plugins/web-annotations.js +27 -0
  307. package/dist/providers/minimax.js +70 -0
  308. package/dist/providers/openai-compat.js +48 -0
  309. package/dist/ralph/channel.js +8 -0
  310. package/dist/ralph/cli.js +152 -0
  311. package/dist/ralph/plugin.js +14 -0
  312. package/dist/ralph/service.js +271 -0
  313. package/dist/ralph/stopping.js +151 -0
  314. package/dist/ralph/store.js +450 -0
  315. package/dist/ralph/templates.js +200 -0
  316. package/dist/ralph/types.js +1 -0
  317. package/dist/reliability/store.js +42 -26
  318. package/dist/runs/registry.js +72 -35
  319. package/dist/session-ui/commandCatalog.js +193 -0
  320. package/dist/session-ui/commandResults.js +95 -0
  321. package/dist/session-ui/index.js +7 -0
  322. package/dist/session-ui/ownerViewModel.js +27 -0
  323. package/dist/session-ui/roomSessionViewModel.js +69 -0
  324. package/dist/session-ui/statusViewModel.js +127 -0
  325. package/dist/session-ui/terminalCards.js +210 -0
  326. package/dist/session-ui/terminalRows.js +937 -0
  327. package/dist/session-ui/terminalValue.js +45 -0
  328. package/dist/sessions/pibo-data-store.js +178 -0
  329. package/dist/sessions/sqlite-store.js +78 -12
  330. package/dist/sessions/store.js +11 -4
  331. package/dist/sessions/workflow-session-kind.js +20 -0
  332. package/dist/setup/cli.js +567 -0
  333. package/dist/shared/trace-async-agent-runs.js +127 -0
  334. package/dist/shared/trace-engine.js +96 -0
  335. package/dist/shared/trace-event-projection.js +679 -0
  336. package/dist/shared/trace-live-reducer.js +191 -0
  337. package/dist/shared/trace-nodes.js +76 -0
  338. package/dist/shared/trace-order.js +11 -10
  339. package/dist/shared/trace-patch-nodes.js +83 -0
  340. package/dist/shared/trace-run-notifications.js +69 -0
  341. package/dist/shared/trace-subagent-links.js +46 -0
  342. package/dist/shared/trace-transcript.js +303 -0
  343. package/dist/shared/trace-types.js +1 -0
  344. package/dist/shared-app.js +4 -0
  345. package/dist/signals/aggregate.js +65 -0
  346. package/dist/signals/events.js +1 -0
  347. package/dist/signals/projector.js +158 -0
  348. package/dist/signals/registry.js +513 -0
  349. package/dist/signals/store.js +1 -0
  350. package/dist/signals/types.js +1 -0
  351. package/dist/skills/cli.js +117 -0
  352. package/dist/tools/agent-browser-leases.js +219 -0
  353. package/dist/tools/agent-browser-wrapper.js +99 -0
  354. package/dist/tools/browser-pool.js +623 -0
  355. package/dist/tools/browser-use-cdp.js +56 -4
  356. package/dist/tools/browser-use-leases.js +215 -37
  357. package/dist/tools/browser-use-wrapper.js +508 -65
  358. package/dist/tools/cdp-client.js +189 -0
  359. package/dist/tools/guides.js +203 -4
  360. package/dist/tools/index.js +666 -16
  361. package/dist/tools/npm-runtime.js +136 -0
  362. package/dist/tools/registry.js +107 -8
  363. package/dist/tools/runtime/index.js +3 -0
  364. package/dist/tools/runtime/node-backend.js +225 -0
  365. package/dist/tools/runtime/node-worker-source.js +206 -0
  366. package/dist/tools/runtime/python-backend.js +227 -0
  367. package/dist/tools/runtime/python-worker-source.js +178 -0
  368. package/dist/tools/runtime/registry.js +255 -0
  369. package/dist/tools/runtime/tool.js +168 -0
  370. package/dist/tools/runtime/types.js +1 -0
  371. package/dist/tools/web-search.js +2 -1
  372. package/dist/user-skills/installer.js +39 -36
  373. package/dist/user-skills/store.js +50 -11
  374. package/dist/web/auth.js +5 -1
  375. package/dist/web/channel.js +86 -0
  376. package/dist/web/http.js +79 -14
  377. package/dist/web-annotations/api.js +348 -0
  378. package/dist/web-annotations/attachments.js +201 -0
  379. package/dist/web-annotations/cdp.js +1107 -0
  380. package/dist/web-annotations/index.js +7 -0
  381. package/dist/web-annotations/store.js +407 -0
  382. package/dist/web-annotations/tools.js +350 -0
  383. package/dist/web-annotations/types.js +34 -0
  384. package/dist/web-annotations/validation.js +288 -0
  385. package/docs/README.md +23 -0
  386. package/docs/ops/install-developer-host.md +112 -0
  387. package/docs/ops/install-user-host.md +76 -0
  388. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  389. package/package.json +24 -10
  390. package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
  391. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  392. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  393. package/skills/builtin/prd/SKILL.md +143 -0
  394. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  395. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  396. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  397. package/skills/builtin/skill-creator/SKILL.md +513 -0
  398. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  399. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  400. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  401. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  402. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  403. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  404. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  405. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  406. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  407. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  408. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  409. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  410. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  411. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  412. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  413. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  414. package/skills/builtin/web-annotations/SKILL.md +93 -0
  415. package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
  416. package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
  417. package/dist/env.js +0 -32
  418. package/dist/plugins/core-tools.js +0 -94
  419. package/dist/plugins/example.js +0 -67
  420. package/dist/plugins/remote-agent.js +0 -9
  421. package/dist/remote/channel.js +0 -176
  422. package/dist/remote/client.js +0 -92
  423. package/dist/remote/examples/tui-controller.js +0 -263
  424. package/dist/remote/protocol.js +0 -55
  425. package/dist/remote/session-client.js +0 -189
  426. package/dist/sessions/bindings.js +0 -41
@@ -1,9 +1,15 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
1
4
  import { Command } from 'commander';
2
5
  import { ErrorCode, formatCliError } from '../cli-errors.js';
3
- import { acquireBrowserUseLease, listBrowserUseLeases, printBrowserUseAuthTemplateEnv, printBrowserUseAuthTemplatePath, reapStaleBrowserUseLeases, releaseBrowserUseLease, } from './browser-use-leases.js';
4
- import { formatBrowserUseTargets, listBrowserUseCdpTargets, printAttachChatExports, selectBestChatTarget, } from './browser-use-cdp.js';
6
+ import { acquireAgentBrowserLease, listAgentBrowserLeases, printAgentBrowserAuthTemplateEnv, printAgentBrowserAuthTemplatePath, reapStaleAgentBrowserLeases, releaseAgentBrowserLease, } from './agent-browser-leases.js';
7
+ import { ensureAgentBrowserWrapper } from './agent-browser-wrapper.js';
8
+ import { acquireBrowserUseLease, isExpired, listBrowserUseLeases, printBrowserUseAuthTemplateEnv, printBrowserUseAuthTemplatePath, readRegistry, reapStaleBrowserUseLeases, releaseBrowserUseLease, } from './browser-use-leases.js';
9
+ import { formatBrowserUseTargets, listBrowserUseCdpTargets, normalizeCdpUrlSync, printAttachChatExports, selectBestChatTarget, } from './browser-use-cdp.js';
5
10
  import { ensureBrowserUseWrapper } from './browser-use-wrapper.js';
6
- import { detectDesktopEnv } from './desktop-env.js';
11
+ import { browserPoolPaths, createEmptyBrowserPoolState, loadBrowserPoolState, reapIdleBrowserPool, } from './browser-pool.js';
12
+ import { detectDesktopEnv, hasDesktopDisplay } from './desktop-env.js';
7
13
  import { doctorCliTool, findCliToolEntry, findToolGuide, getCliToolStatus, installCliTool, listCliToolEntries, removeCliTool, } from './registry.js';
8
14
  function requireEntry(name) {
9
15
  const entry = findCliToolEntry(name);
@@ -42,11 +48,33 @@ function printShow(name) {
42
48
  const status = getCliToolStatus(entry);
43
49
  console.log(`${entry.name}`);
44
50
  console.log(` ${entry.description}`);
45
- console.log(` package: ${entry.runtime.packageName}`);
51
+ console.log(` kind: ${entry.kind === 'internal' ? 'built-in' : 'external'}`);
52
+ if (entry.runtime)
53
+ console.log(` package: ${entry.runtime.packageName}`);
46
54
  console.log(` status: ${status.installed ? 'installed' : 'available'}`);
47
- console.log(` runtime: ${status.rootDir}`);
48
- console.log(` home: ${status.homeDir}`);
49
- console.log(` executable: ${status.executablePath}`);
55
+ if (status.rootDir)
56
+ console.log(` runtime: ${status.rootDir}`);
57
+ if (status.homeDir)
58
+ console.log(` home: ${status.homeDir}`);
59
+ if (entry.name === 'browser-use') {
60
+ const wrapperPath = ensureBrowserUseWrapper(status);
61
+ console.log(` wrapper: ${wrapperPath ?? 'not generated'}`);
62
+ console.log(` executable: ${status.executablePath}`);
63
+ console.log('');
64
+ console.log(' IMPORTANT: Always use the wrapper path above, not the raw executable.');
65
+ console.log(' The wrapper manages persistent Chrome profiles and CDP automatically.');
66
+ }
67
+ else if (entry.name === 'agent-browser') {
68
+ const wrapperPath = ensureAgentBrowserWrapper(status);
69
+ console.log(` wrapper: ${wrapperPath ?? 'not generated'}`);
70
+ console.log(` executable: ${status.executablePath}`);
71
+ console.log('');
72
+ console.log(' IMPORTANT: Always use the wrapper path above, not the raw executable.');
73
+ console.log(' The wrapper keeps Agent Browser state under the Pibo tool home.');
74
+ }
75
+ else {
76
+ console.log(` executable: ${status.executablePath}`);
77
+ }
50
78
  console.log('');
51
79
  console.log('Guides:');
52
80
  for (const guide of entry.guides) {
@@ -60,11 +88,19 @@ function printShow(name) {
60
88
  }
61
89
  console.log('');
62
90
  console.log('Next:');
63
- console.log(` pibo tools env ${entry.name}`);
91
+ if (entry.kind !== 'internal')
92
+ console.log(` pibo tools env ${entry.name}`);
64
93
  console.log(` pibo tools guide ${entry.name} ${entry.guides[0]?.name ?? ''}`.trimEnd());
65
94
  if (entry.name === 'browser-use') {
66
95
  console.log(' pibo tools browser-use');
67
96
  }
97
+ if (entry.name === 'agent-browser') {
98
+ console.log(' pibo tools agent-browser');
99
+ }
100
+ if (entry.name === 'ralph') {
101
+ console.log(' pibo tools ralph');
102
+ console.log(' pibo ralph templates');
103
+ }
68
104
  }
69
105
  function printGuides(name) {
70
106
  const entry = requireEntry(name);
@@ -95,12 +131,34 @@ function printGuide(name, guideName) {
95
131
  }
96
132
  function printPath(name) {
97
133
  const entry = requireEntry(name);
98
- console.log(getCliToolStatus(entry).executablePath);
134
+ const status = getCliToolStatus(entry);
135
+ if (entry.name === 'browser-use') {
136
+ const wrapperPath = ensureBrowserUseWrapper(status);
137
+ if (wrapperPath) {
138
+ console.log(wrapperPath);
139
+ return;
140
+ }
141
+ }
142
+ if (entry.name === 'agent-browser') {
143
+ const wrapperPath = ensureAgentBrowserWrapper(status);
144
+ if (wrapperPath) {
145
+ console.log(wrapperPath);
146
+ return;
147
+ }
148
+ }
149
+ console.log(status.executablePath);
99
150
  }
100
151
  function printEnv(name) {
101
152
  const entry = requireEntry(name);
102
153
  const status = getCliToolStatus(entry);
103
154
  const desktop = detectDesktopEnv();
155
+ if (entry.kind === 'internal') {
156
+ console.log(`# ${entry.name} is built into pibo; no extra environment is required.`);
157
+ console.log(`# Run: pibo ${entry.name} --help`);
158
+ return;
159
+ }
160
+ if (!entry.runtime)
161
+ throw new Error(`CLI tool "${entry.name}" is missing runtime`);
104
162
  if (process.platform === 'win32') {
105
163
  console.log(`$env:PATH = "${status.executablePath.replace(/\\[^\\]+$/, '')};$env:PATH"`);
106
164
  if (entry.runtime.homeEnvVar)
@@ -108,7 +166,7 @@ function printEnv(name) {
108
166
  return;
109
167
  }
110
168
  const binDir = status.executablePath.replace(/\/[^/]+$/, '');
111
- const wrapperPath = ensureBrowserUseWrapper(status);
169
+ const wrapperPath = entry.name === 'agent-browser' ? ensureAgentBrowserWrapper(status) : ensureBrowserUseWrapper(status);
112
170
  const wrapperBinDir = wrapperPath ? wrapperPath.replace(/\/[^/]+$/, '') : `${status.homeDir}/bin`;
113
171
  console.log(`export PATH="${wrapperBinDir}:${binDir}:$PATH"`);
114
172
  if (entry.runtime.homeEnvVar)
@@ -132,6 +190,13 @@ function parsePositiveInteger(value) {
132
190
  }
133
191
  return parsed;
134
192
  }
193
+ function parseNonNegativeInteger(value) {
194
+ const parsed = Number.parseInt(value, 10);
195
+ if (!Number.isFinite(parsed) || parsed < 0) {
196
+ throw new Error(`Expected a non-negative integer, got "${value}"`);
197
+ }
198
+ return parsed;
199
+ }
135
200
  function printBrowserUseDiscovery() {
136
201
  console.log(`pibo tools browser-use - browser-use helpers
137
202
 
@@ -147,16 +212,407 @@ Commands:
147
212
  lease list List authenticated browser slots
148
213
  lease release <id> Release one browser slot
149
214
  lease reap-stale Release expired or dead browser slots
215
+ pool status Show read-only managed browser-pool status
216
+ pool reap Reap an idle managed browser pool
217
+ health Check browser-use health and report issues
150
218
 
151
219
  Next:
152
220
  pibo tools show browser-use
153
221
  pibo tools guide browser-use browser-use
154
222
  pibo tools browser-use targets
155
223
  pibo tools browser-use auth-template env
156
- pibo tools browser-use lease acquire`);
224
+ pibo tools browser-use lease acquire
225
+ pibo tools browser-use pool status
226
+ pibo tools browser-use pool reap --json`);
227
+ }
228
+ function getBrowserPoolStatusIdentity(options) {
229
+ return {
230
+ workerId: options.workerId || process.env.PIBO_BROWSER_POOL_WORKER_ID || process.env.PIBO_COMPUTE_WORKER_ID || process.env.HOSTNAME || 'local',
231
+ poolId: options.poolId || process.env.PIBO_BROWSER_POOL_ID || 'default',
232
+ maxBrowserProcesses: parsePositiveInteger(process.env.PIBO_BROWSER_POOL_MAX_PROCESSES || '1'),
233
+ };
234
+ }
235
+ function getBrowserPoolRoot(status, options) {
236
+ return options.root || process.env.PIBO_BROWSER_POOL_ROOT || join(process.env.BROWSER_USE_HOME || status.homeDir, 'pibo-browser-pool');
237
+ }
238
+ function browserPoolStatusNextCommands(state) {
239
+ if (state.state === 'stale' || state.state === 'dirty') {
240
+ return [
241
+ 'pibo tools browser-use pool status --json',
242
+ 'pibo tools browser-use pool reap --json',
243
+ 'pibo tools browser-use health',
244
+ 'eval "$(pibo tools env browser-use)" && browser-use --pibo-ensure-chrome',
245
+ ];
246
+ }
247
+ if (state.state === 'empty') {
248
+ return ['eval "$(pibo tools env browser-use)" && browser-use --pibo-ensure-chrome'];
249
+ }
250
+ return ['pibo tools browser-use pool status --json'];
251
+ }
252
+ async function getBrowserPoolStatus(status, options) {
253
+ const identity = getBrowserPoolStatusIdentity(options);
254
+ const rootDir = getBrowserPoolRoot(status, options);
255
+ const paths = browserPoolPaths(rootDir, identity);
256
+ const stateFileExists = existsSync(paths.statePath);
257
+ let state = await loadBrowserPoolState(paths.statePath, { ...identity, onMissing: 'empty', onMalformed: 'empty' });
258
+ if (!stateFileExists && state.state === 'empty')
259
+ state = createEmptyBrowserPoolState(identity);
260
+ const staleReason = state.state === 'stale' ? state.lastError || 'Recorded browser is stale' : undefined;
261
+ const dirtyReason = state.state === 'dirty' ? state.lastError || 'Browser pool state is dirty' : undefined;
262
+ return {
263
+ ...state,
264
+ rootDir,
265
+ statePath: paths.statePath,
266
+ lockPath: paths.lockPath,
267
+ stateFileExists,
268
+ readOnly: true,
269
+ staleReason,
270
+ dirtyReason,
271
+ nextCommands: browserPoolStatusNextCommands(state),
272
+ };
273
+ }
274
+ function printBrowserPoolStatusText(result) {
275
+ const stateLabel = result.state === 'ready' ? 'ready (idle)' : result.state;
276
+ console.log(`browser pool status: ${stateLabel}`);
277
+ console.log(` worker id: ${result.workerId}`);
278
+ console.log(` pool id: ${result.poolId}`);
279
+ console.log(` max browser processes: ${result.maxBrowserProcesses}`);
280
+ console.log(` pid: ${result.pid ?? '-'}`);
281
+ console.log(` process group id: ${result.processGroupId ?? '-'}`);
282
+ console.log(` CDP URL: ${result.cdpUrl ?? '-'}`);
283
+ console.log(` CDP port: ${result.cdpPort ?? '-'}`);
284
+ console.log(` user-data dir: ${result.userDataDir ?? '-'}`);
285
+ console.log(` active lease id: ${result.activeLeaseId ?? '-'}`);
286
+ console.log(` holder: ${result.holder ?? '-'}`);
287
+ console.log(` last used at: ${result.lastUsedAt ?? '-'}`);
288
+ console.log(` idle expiry: ${result.idleExpiresAt ?? '-'}`);
289
+ console.log(` root: ${result.rootDir}`);
290
+ console.log(` state file: ${result.stateFileExists ? result.statePath : `${result.statePath} (missing)`}`);
291
+ if (result.staleReason || result.dirtyReason || result.lastError) {
292
+ console.log(` stale/dirty reason: ${result.staleReason || result.dirtyReason || result.lastError}`);
293
+ }
294
+ if (result.state === 'stale' || result.state === 'dirty') {
295
+ console.log('');
296
+ console.log('Next:');
297
+ for (const command of result.nextCommands)
298
+ console.log(` ${command}`);
299
+ }
300
+ }
301
+ async function printBrowserPoolStatus(status, options) {
302
+ const result = await getBrowserPoolStatus(status, options);
303
+ if (options.json) {
304
+ console.log(JSON.stringify(result, null, 2));
305
+ return;
306
+ }
307
+ printBrowserPoolStatusText(result);
308
+ }
309
+ function browserPoolReapNextCommands(result) {
310
+ if (result.cleanupStatus === 'failed' || result.state.state === 'dirty') {
311
+ return [
312
+ 'pibo tools browser-use pool status --json',
313
+ 'pibo tools browser-use health',
314
+ 'pibo tools browser-use pool reap --json',
315
+ ];
316
+ }
317
+ return ['pibo tools browser-use pool status --json'];
318
+ }
319
+ async function getBrowserPoolReap(status, options) {
320
+ const identity = getBrowserPoolStatusIdentity(options);
321
+ const rootDir = getBrowserPoolRoot(status, options);
322
+ const paths = browserPoolPaths(rootDir, identity);
323
+ const missingState = !existsSync(paths.statePath);
324
+ const result = missingState
325
+ ? {
326
+ reaped: false,
327
+ eligible: false,
328
+ reason: 'Browser pool has no recorded browser to reap',
329
+ affectedLeases: 0,
330
+ affectedBrowserPools: 0,
331
+ terminatedProcessTrees: 0,
332
+ staleStateFiles: 0,
333
+ cleanupStatus: 'skipped',
334
+ lastError: 'Browser pool has no recorded browser to reap',
335
+ state: createEmptyBrowserPoolState(identity),
336
+ }
337
+ : await reapIdleBrowserPool(paths, identity, { idleTimeoutMs: options.idleTimeoutMs });
338
+ return {
339
+ rootDir,
340
+ statePath: paths.statePath,
341
+ lockPath: paths.lockPath,
342
+ counts: {
343
+ affectedLeases: result.affectedLeases,
344
+ affectedBrowserPools: result.affectedBrowserPools,
345
+ terminatedProcessTrees: result.terminatedProcessTrees,
346
+ staleStateFiles: result.staleStateFiles,
347
+ },
348
+ pools: [{
349
+ workerId: result.state.workerId,
350
+ poolId: result.state.poolId,
351
+ reaped: result.reaped,
352
+ eligible: result.eligible,
353
+ reason: result.reason,
354
+ cleanupStatus: result.cleanupStatus,
355
+ lastError: result.lastError,
356
+ state: result.state,
357
+ terminatedProcessTrees: result.terminatedProcessTrees,
358
+ staleStateFiles: result.staleStateFiles,
359
+ affectedLeases: result.affectedLeases,
360
+ }],
361
+ nextCommands: browserPoolReapNextCommands(result),
362
+ };
363
+ }
364
+ function printBrowserPoolReapText(result) {
365
+ const pool = result.pools[0];
366
+ const label = pool.cleanupStatus === 'failed' ? 'failed' : pool.reaped ? 'success' : 'no-op';
367
+ console.log(`browser pool reap: ${label}`);
368
+ console.log(` worker id: ${pool.workerId}`);
369
+ console.log(` pool id: ${pool.poolId}`);
370
+ console.log(` reason: ${pool.reason ?? '-'}`);
371
+ console.log(` cleanup status: ${pool.cleanupStatus}`);
372
+ console.log(` affected leases: ${result.counts.affectedLeases}`);
373
+ console.log(` affected browser pools: ${result.counts.affectedBrowserPools}`);
374
+ console.log(` terminated process trees: ${result.counts.terminatedProcessTrees}`);
375
+ console.log(` stale state files: ${result.counts.staleStateFiles}`);
376
+ console.log(` state file: ${result.statePath}`);
377
+ if (pool.lastError)
378
+ console.log(` error: ${pool.lastError}`);
379
+ if (pool.cleanupStatus === 'failed' || pool.state.state === 'dirty') {
380
+ console.log('');
381
+ console.log('Next:');
382
+ for (const command of result.nextCommands)
383
+ console.log(` ${command}`);
384
+ }
385
+ }
386
+ async function printBrowserPoolReap(status, options) {
387
+ const result = await getBrowserPoolReap(status, options);
388
+ if (options.json) {
389
+ console.log(JSON.stringify(result, null, 2));
390
+ return;
391
+ }
392
+ printBrowserPoolReapText(result);
393
+ }
394
+ function findChromeBinary() {
395
+ if (process.env.AGENT_BROWSER_EXECUTABLE_PATH && existsSync(process.env.AGENT_BROWSER_EXECUTABLE_PATH)) {
396
+ return process.env.AGENT_BROWSER_EXECUTABLE_PATH;
397
+ }
398
+ if (process.env.PIBO_BROWSER_USE_CHROME && existsSync(process.env.PIBO_BROWSER_USE_CHROME)) {
399
+ return process.env.PIBO_BROWSER_USE_CHROME;
400
+ }
401
+ const candidates = ['google-chrome', 'chromium', 'chromium-browser', 'chrome'];
402
+ for (const name of candidates) {
403
+ const result = spawnSync('command', ['-v', name], { shell: true, encoding: 'utf-8' });
404
+ if (result.status === 0 && result.stdout.trim()) {
405
+ return result.stdout.trim();
406
+ }
407
+ }
408
+ return undefined;
409
+ }
410
+ function checkStaleCdpState(homeDir) {
411
+ const stateDir = join(homeDir, 'pibo-cdp');
412
+ if (!existsSync(stateDir))
413
+ return { stalePids: 0, stalePorts: 0, details: [] };
414
+ let stalePids = 0;
415
+ let stalePorts = 0;
416
+ const details = [];
417
+ for (const file of readdirSync(stateDir)) {
418
+ if (file.endsWith('.pid')) {
419
+ const pidPath = join(stateDir, file);
420
+ const text = readFileSync(pidPath, 'utf-8').trim();
421
+ const pid = Number.parseInt(text, 10);
422
+ let isDead = false;
423
+ if (!Number.isFinite(pid) || pid <= 0) {
424
+ isDead = true;
425
+ }
426
+ else {
427
+ try {
428
+ process.kill(pid, 0);
429
+ }
430
+ catch {
431
+ isDead = true;
432
+ }
433
+ }
434
+ if (isDead) {
435
+ stalePids += 1;
436
+ details.push(`stale pid file: ${file}`);
437
+ }
438
+ }
439
+ else if (file.endsWith('.port')) {
440
+ const base = file.slice(0, -5);
441
+ const pidPath = join(stateDir, `${base}.pid`);
442
+ if (!existsSync(pidPath)) {
443
+ stalePorts += 1;
444
+ details.push(`orphan port file: ${file}`);
445
+ }
446
+ }
447
+ }
448
+ return { stalePids, stalePorts, details };
449
+ }
450
+ async function printAgentBrowserHealth(status, json = false) {
451
+ const wrapperPath = join(status.homeDir, 'bin', 'agent-browser');
452
+ const wrapperExists = existsSync(wrapperPath);
453
+ const npmExecutableExists = existsSync(status.executablePath);
454
+ const chromePath = findChromeBinary();
455
+ const desktop = detectDesktopEnv();
456
+ const hasDisplay = hasDesktopDisplay(desktop);
457
+ const nodeVersion = spawnSync('node', ['--version'], { encoding: 'utf-8' });
458
+ const npmVersion = spawnSync('npm', ['--version'], { encoding: 'utf-8' });
459
+ const packageJsonPath = join(status.rootDir, 'node', 'node_modules', 'agent-browser', 'package.json');
460
+ let packageVersion;
461
+ try {
462
+ packageVersion = JSON.parse(readFileSync(packageJsonPath, 'utf-8')).version;
463
+ }
464
+ catch {
465
+ packageVersion = undefined;
466
+ }
467
+ const staleState = checkStaleCdpState(status.homeDir);
468
+ const overall = !wrapperExists || !npmExecutableExists ? 'critical' : staleState.stalePids > 0 || staleState.stalePorts > 0 ? 'degraded' : 'ok';
469
+ const result = {
470
+ overall,
471
+ wrapper: { exists: wrapperExists, path: wrapperPath },
472
+ npmRuntime: { executable: npmExecutableExists, path: status.executablePath, packageVersion },
473
+ node: { ok: nodeVersion.status === 0, version: nodeVersion.stdout.trim() },
474
+ npm: { ok: npmVersion.status === 0, version: npmVersion.stdout.trim() },
475
+ chrome: { found: Boolean(chromePath), path: chromePath },
476
+ display: { available: hasDisplay, display: desktop.display, waylandDisplay: desktop.waylandDisplay },
477
+ staleState: { pidFiles: staleState.stalePids, portFiles: staleState.stalePorts, details: staleState.details },
478
+ nextCommands: ['pibo tools install agent-browser', 'eval "$(pibo tools env agent-browser)"', 'agent-browser doctor --offline --quick'],
479
+ };
480
+ if (json) {
481
+ console.log(JSON.stringify(result, null, 2));
482
+ return;
483
+ }
484
+ console.log(`agent-browser health: ${overall}`);
485
+ console.log(` wrapper: ${wrapperExists ? 'ok' : 'MISSING'} (${wrapperPath})`);
486
+ console.log(` executable: ${npmExecutableExists ? 'ok' : 'MISSING'} (${status.executablePath})`);
487
+ console.log(` package version: ${packageVersion ?? 'unknown'}`);
488
+ console.log(` node: ${nodeVersion.status === 0 ? nodeVersion.stdout.trim() : 'missing'}`);
489
+ console.log(` npm: ${npmVersion.status === 0 ? npmVersion.stdout.trim() : 'missing'}`);
490
+ console.log(` chrome: ${chromePath ? `ok (${chromePath})` : 'not found; upstream install may be needed'}`);
491
+ console.log(` display: ${hasDisplay ? 'available' : 'none'} (${desktop.display || 'no DISPLAY'})`);
492
+ console.log(` stale state: ${staleState.stalePids} stale pid files, ${staleState.stalePorts} orphan port files`);
493
+ if (overall !== 'ok') {
494
+ console.log('');
495
+ console.log('Suggestions:');
496
+ if (!wrapperExists || !npmExecutableExists)
497
+ console.log(' Run: pibo tools install agent-browser');
498
+ if (!chromePath)
499
+ console.log(' Install Chrome/Chromium or run: agent-browser install');
500
+ if (staleState.stalePids > 0 || staleState.stalePorts > 0)
501
+ console.log(' Inspect and release stale sessions before deleting state.');
502
+ }
503
+ }
504
+ async function printAgentBrowserSessions(status, json = false) {
505
+ const wrapperPath = ensureAgentBrowserWrapper(status) || status.executablePath;
506
+ if (!existsSync(status.executablePath)) {
507
+ const result = { sessions: [], installed: false, nextCommands: ['pibo tools install agent-browser'] };
508
+ console.log(json ? JSON.stringify(result, null, 2) : 'agent-browser is not installed. Run: pibo tools install agent-browser');
509
+ return;
510
+ }
511
+ const result = spawnSync(wrapperPath, ['session', 'list'], {
512
+ encoding: 'utf-8',
513
+ env: { ...process.env, AGENT_BROWSER_HOME: status.homeDir },
514
+ });
515
+ if (json) {
516
+ console.log(JSON.stringify({ installed: true, ok: result.status === 0, stdout: result.stdout, stderr: result.stderr }, null, 2));
517
+ return;
518
+ }
519
+ if (result.stdout.trim())
520
+ console.log(result.stdout.trimEnd());
521
+ if (result.status !== 0 && result.stderr.trim())
522
+ console.error(result.stderr.trimEnd());
523
+ }
524
+ async function printBrowserUseHealth(status, json = false) {
525
+ const wrapperPath = join(status.homeDir, 'bin', 'browser-use');
526
+ const wrapperExists = existsSync(wrapperPath);
527
+ const chromePath = findChromeBinary();
528
+ const desktop = detectDesktopEnv();
529
+ const hasDisplay = hasDesktopDisplay(desktop);
530
+ const staleState = checkStaleCdpState(status.homeDir);
531
+ let expiredLeases = 0;
532
+ try {
533
+ const registry = readRegistry(status);
534
+ for (const lease of registry.leases) {
535
+ if (lease.status === 'active' && isExpired(lease))
536
+ expiredLeases++;
537
+ }
538
+ }
539
+ catch {
540
+ // ignore registry read errors
541
+ }
542
+ const overall = !wrapperExists || !chromePath ? 'critical' : staleState.stalePids > 0 || staleState.stalePorts > 0 || expiredLeases > 0 ? 'degraded' : 'ok';
543
+ const result = {
544
+ overall,
545
+ wrapper: { exists: wrapperExists, path: wrapperPath },
546
+ chrome: { found: Boolean(chromePath), path: chromePath },
547
+ display: { available: hasDisplay, display: desktop.display, waylandDisplay: desktop.waylandDisplay },
548
+ staleState: { pidFiles: staleState.stalePids, portFiles: staleState.stalePorts, details: staleState.details },
549
+ leases: { expired: expiredLeases },
550
+ };
551
+ if (json) {
552
+ console.log(JSON.stringify(result, null, 2));
553
+ return;
554
+ }
555
+ console.log(`browser-use health: ${overall}`);
556
+ console.log(` wrapper: ${wrapperExists ? 'ok' : 'MISSING'} (${wrapperPath})`);
557
+ console.log(` chrome: ${chromePath ? `ok (${chromePath})` : 'NOT FOUND'}`);
558
+ console.log(` display: ${hasDisplay ? 'available' : 'none'} (${desktop.display || 'no DISPLAY'})`);
559
+ console.log(` stale state: ${staleState.stalePids} stale pid files, ${staleState.stalePorts} orphan port files`);
560
+ console.log(` leases: ${expiredLeases} expired`);
561
+ if (overall !== 'ok') {
562
+ console.log('');
563
+ console.log('Suggestions:');
564
+ if (!wrapperExists)
565
+ console.log(' Run: pibo tools install browser-use');
566
+ if (!chromePath)
567
+ console.log(' Install Chrome/Chromium (e.g. apt install chromium)');
568
+ if (staleState.stalePids > 0 || staleState.stalePorts > 0) {
569
+ console.log(' Clean stale state: pibo tools browser-use lease reap-stale');
570
+ }
571
+ if (expiredLeases > 0)
572
+ console.log(' Reap expired leases: pibo tools browser-use lease reap-stale');
573
+ }
574
+ }
575
+ function printAgentBrowserDiscovery() {
576
+ console.log(`pibo tools agent-browser - Agent Browser helpers
577
+
578
+ Start:
579
+ eval "$(pibo tools env agent-browser)"
580
+
581
+ Commands:
582
+ health Check Agent Browser health and report issues
583
+ sessions List upstream Agent Browser sessions
584
+ targets List Chrome CDP targets with Chat auth hints
585
+ attach-chat Export the best existing authenticated Chat target
586
+ auth-template path Print the default authenticated template profile path
587
+ auth-template env Print shell exports for preparing the auth template profile
588
+ lease acquire Acquire an isolated authenticated browser slot
589
+ lease list List authenticated browser slots
590
+ lease release <id> Release one browser slot
591
+ lease reap-stale Release expired browser slots
592
+
593
+ Next:
594
+ pibo tools show agent-browser
595
+ pibo tools guide agent-browser agent-browser
596
+ pibo tools agent-browser health
597
+ pibo tools agent-browser lease acquire`);
598
+ }
599
+ function printRalphDiscovery() {
600
+ console.log(`pibo tools ralph - Ralph job helpers
601
+
602
+ Commands:
603
+ pibo ralph templates --json
604
+ pibo ralph add --template <id> --room <room-id> --start --json
605
+ pibo ralph list --all --json
606
+ pibo ralph runs --job <job-id> --json
607
+ pibo ralph stop <job-id>
608
+ pibo ralph cancel <job-id>
609
+
610
+ Next:
611
+ pibo tools guide ralph ralph
612
+ pibo ralph templates`);
157
613
  }
158
614
  function printToolsDiscovery() {
159
- console.log(`pibo tools - curated external CLI tools
615
+ console.log(`pibo tools - curated CLI tools
160
616
 
161
617
  Commands:
162
618
  list List curated tools
@@ -169,6 +625,8 @@ Commands:
169
625
  path <name> Print executable path
170
626
  env <name> Print shell exports
171
627
  browser-use Browser-use auth slots and helper commands
628
+ agent-browser Agent Browser sessions, targets, and auth slots
629
+ ralph Ralph job helper commands
172
630
 
173
631
  Next:
174
632
  pibo tools list`);
@@ -240,6 +698,159 @@ export async function runToolsCli(argv = process.argv) {
240
698
  .argument('<name>')
241
699
  .description('Print shell exports for using the tool directly')
242
700
  .action(printEnv);
701
+ program
702
+ .command('ralph')
703
+ .description('Ralph job helper commands')
704
+ .action(printRalphDiscovery);
705
+ const agentBrowser = program
706
+ .command('agent-browser')
707
+ .description('Agent Browser sessions, targets, and auth slots')
708
+ .action(printAgentBrowserDiscovery);
709
+ agentBrowser
710
+ .command('health')
711
+ .description('Check Agent Browser health and report issues')
712
+ .option('--json', 'Print machine-readable health data')
713
+ .action(async (options) => {
714
+ await printAgentBrowserHealth(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
715
+ });
716
+ agentBrowser
717
+ .command('sessions')
718
+ .description('List upstream Agent Browser sessions')
719
+ .option('--json', 'Print machine-readable session output')
720
+ .action(async (options) => {
721
+ await printAgentBrowserSessions(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
722
+ });
723
+ agentBrowser
724
+ .command('targets')
725
+ .description('List Chrome CDP targets with Chat auth hints')
726
+ .option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
727
+ .option('--no-probe', 'Only read /json/list without page DOM probes')
728
+ .option('--json', 'Print machine-readable target data')
729
+ .action(async (options) => {
730
+ const status = getCliToolStatus(requireEntry('agent-browser'));
731
+ const previousHome = process.env.BROWSER_USE_HOME;
732
+ process.env.BROWSER_USE_HOME = status.homeDir;
733
+ try {
734
+ const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl, probe: options.probe });
735
+ if (options.json) {
736
+ console.log(JSON.stringify({ targets }, null, 2));
737
+ return;
738
+ }
739
+ console.log(formatBrowserUseTargets(targets));
740
+ if (targets.length === 0)
741
+ console.log('\nNext: eval "$(pibo tools env agent-browser)"');
742
+ }
743
+ finally {
744
+ if (previousHome === undefined)
745
+ delete process.env.BROWSER_USE_HOME;
746
+ else
747
+ process.env.BROWSER_USE_HOME = previousHome;
748
+ }
749
+ });
750
+ agentBrowser
751
+ .command('attach-chat')
752
+ .description('Export the best existing authenticated Chat target')
753
+ .option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
754
+ .option('--json', 'Print machine-readable target data')
755
+ .action(async (options) => {
756
+ const status = getCliToolStatus(requireEntry('agent-browser'));
757
+ const previousHome = process.env.BROWSER_USE_HOME;
758
+ process.env.BROWSER_USE_HOME = status.homeDir;
759
+ try {
760
+ const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl });
761
+ const target = selectBestChatTarget(targets);
762
+ if (!target) {
763
+ throw new Error(formatCliError({
764
+ code: ErrorCode.CLIENT_ERROR,
765
+ type: 'AGENT_BROWSER_CHAT_TARGET_NOT_FOUND',
766
+ message: 'No authenticated Chat Web target with a composer textarea was found',
767
+ suggestion: 'Run `pibo tools agent-browser targets`, reuse an authenticated tab, or acquire a slot with `pibo tools agent-browser lease acquire`.',
768
+ }));
769
+ }
770
+ if (options.json) {
771
+ console.log(JSON.stringify({ target }, null, 2));
772
+ return;
773
+ }
774
+ const cdpUrl = options.cdpUrl ? normalizeCdpUrlSync(options.cdpUrl) : 'http://127.0.0.1:56663';
775
+ console.log(`export PIBO_AGENT_BROWSER_CDP_URL='${cdpUrl.replaceAll("'", "'\\''")}'`);
776
+ printAttachChatExports(target, cdpUrl);
777
+ }
778
+ finally {
779
+ if (previousHome === undefined)
780
+ delete process.env.BROWSER_USE_HOME;
781
+ else
782
+ process.env.BROWSER_USE_HOME = previousHome;
783
+ }
784
+ });
785
+ const agentAuthTemplate = agentBrowser
786
+ .command('auth-template')
787
+ .description('Manage the Agent Browser authenticated template profile')
788
+ .action(() => {
789
+ console.log(`pibo tools agent-browser auth-template
790
+
791
+ Commands:
792
+ path Print the default authenticated template profile path
793
+ env Print shell exports for preparing the auth template profile`);
794
+ });
795
+ agentAuthTemplate
796
+ .command('path')
797
+ .option('--app <name>', 'Auth pool app name', 'pibo-chat')
798
+ .description('Print the default authenticated template profile path')
799
+ .action((options) => {
800
+ printAgentBrowserAuthTemplatePath(getCliToolStatus(requireEntry('agent-browser')), options.app);
801
+ });
802
+ agentAuthTemplate
803
+ .command('env')
804
+ .option('--app <name>', 'Auth pool app name', 'pibo-chat')
805
+ .description('Print shell exports for preparing the auth template profile')
806
+ .action(async (options) => {
807
+ await printAgentBrowserAuthTemplateEnv(getCliToolStatus(requireEntry('agent-browser')), options.app);
808
+ });
809
+ const agentLease = agentBrowser
810
+ .command('lease')
811
+ .description('Acquire and manage isolated Agent Browser slots')
812
+ .action(() => {
813
+ console.log(`pibo tools agent-browser lease
814
+
815
+ Commands:
816
+ acquire Acquire an isolated authenticated browser slot
817
+ list List authenticated browser slots
818
+ release <id> Release one browser slot
819
+ reap-stale Release expired browser slots`);
820
+ });
821
+ agentLease
822
+ .command('acquire')
823
+ .description('Acquire an isolated authenticated browser slot')
824
+ .option('--app <name>', 'Auth pool app name', 'pibo-chat')
825
+ .option('--holder <holder>', 'Lease holder label')
826
+ .option('--ttl-ms <ms>', 'Lease time-to-live in milliseconds', parsePositiveInteger)
827
+ .option('--max-slots <count>', 'Maximum active slots for the app', parsePositiveInteger)
828
+ .option('--json', 'Print machine-readable lease data')
829
+ .action(async (options) => {
830
+ await acquireAgentBrowserLease(getCliToolStatus(requireEntry('agent-browser')), options);
831
+ });
832
+ agentLease
833
+ .command('list')
834
+ .description('List authenticated browser slots')
835
+ .option('--json', 'Print machine-readable lease data')
836
+ .action(async (options) => {
837
+ await listAgentBrowserLeases(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
838
+ });
839
+ agentLease
840
+ .command('release')
841
+ .argument('<id>')
842
+ .option('--delete-profile', 'Delete the slot browser profile')
843
+ .description('Release one browser slot')
844
+ .action(async (id, options) => {
845
+ await releaseAgentBrowserLease(getCliToolStatus(requireEntry('agent-browser')), id, options);
846
+ });
847
+ agentLease
848
+ .command('reap-stale')
849
+ .description('Release expired browser slots')
850
+ .option('--json', 'Print machine-readable reap result')
851
+ .action(async (options) => {
852
+ await reapStaleAgentBrowserLeases(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
853
+ });
243
854
  const browserUse = program
244
855
  .command('browser-use')
245
856
  .description('Browser-use auth slots and helper commands')
@@ -247,7 +858,7 @@ export async function runToolsCli(argv = process.argv) {
247
858
  browserUse
248
859
  .command('targets')
249
860
  .description('List Chrome CDP targets with Chat auth hints')
250
- .option('--cdp-url <url>', 'Chrome DevTools HTTP URL', 'http://127.0.0.1:56663')
861
+ .option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
251
862
  .option('--no-probe', 'Only read /json/list without page DOM probes')
252
863
  .option('--json', 'Print machine-readable target data')
253
864
  .action(async (options) => {
@@ -265,7 +876,7 @@ export async function runToolsCli(argv = process.argv) {
265
876
  browserUse
266
877
  .command('attach-chat')
267
878
  .description('Export the best existing authenticated Chat target')
268
- .option('--cdp-url <url>', 'Chrome DevTools HTTP URL', 'http://127.0.0.1:56663')
879
+ .option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
269
880
  .option('--json', 'Print machine-readable target data')
270
881
  .action(async (options) => {
271
882
  const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl });
@@ -282,7 +893,46 @@ export async function runToolsCli(argv = process.argv) {
282
893
  console.log(JSON.stringify({ target }, null, 2));
283
894
  return;
284
895
  }
285
- printAttachChatExports(target, options.cdpUrl);
896
+ const cdpUrl = options.cdpUrl ? normalizeCdpUrlSync(options.cdpUrl) : undefined;
897
+ printAttachChatExports(target, cdpUrl);
898
+ });
899
+ browserUse
900
+ .command('health')
901
+ .description('Check browser-use health and report issues')
902
+ .option('--json', 'Print machine-readable health data')
903
+ .action(async (options) => {
904
+ await printBrowserUseHealth(getCliToolStatus(requireEntry('browser-use')), Boolean(options.json));
905
+ });
906
+ const pool = browserUse
907
+ .command('pool')
908
+ .description('Inspect and reap the managed browser pool')
909
+ .action(() => {
910
+ console.log(`pibo tools browser-use pool
911
+
912
+ Commands:
913
+ status Show read-only managed browser-pool status
914
+ reap Reap an idle managed browser pool`);
915
+ });
916
+ pool
917
+ .command('status')
918
+ .description('Show read-only managed browser-pool status')
919
+ .option('--worker-id <id>', 'Worker id to inspect')
920
+ .option('--pool-id <id>', 'Browser pool id to inspect')
921
+ .option('--root <path>', 'Browser pool root directory')
922
+ .option('--json', 'Print machine-readable pool status')
923
+ .action(async (options) => {
924
+ await printBrowserPoolStatus(getCliToolStatus(requireEntry('browser-use')), options);
925
+ });
926
+ pool
927
+ .command('reap')
928
+ .description('Reap an idle managed browser pool')
929
+ .option('--worker-id <id>', 'Worker id to inspect')
930
+ .option('--pool-id <id>', 'Browser pool id to inspect')
931
+ .option('--root <path>', 'Browser pool root directory')
932
+ .option('--idle-timeout-ms <ms>', 'Idle timeout in milliseconds (0 means immediately eligible)', parseNonNegativeInteger)
933
+ .option('--json', 'Print machine-readable reap result')
934
+ .action(async (options) => {
935
+ await printBrowserPoolReap(getCliToolStatus(requireEntry('browser-use')), options);
286
936
  });
287
937
  const authTemplate = browserUse
288
938
  .command('auth-template')
@@ -322,7 +972,7 @@ Commands:
322
972
  .command('acquire')
323
973
  .description('Acquire an isolated authenticated browser slot')
324
974
  .option('--app <name>', 'Auth pool app name', 'pibo-chat')
325
- .option('--owner <owner>', 'Lease owner label')
975
+ .option('--holder <holder>', 'Lease holder label')
326
976
  .option('--ttl-minutes <minutes>', 'Lease time-to-live in minutes', parsePositiveInteger)
327
977
  .option('--max-slots <count>', 'Maximum active slots for the app', parsePositiveInteger)
328
978
  .option('--template-dir <path>', 'Authenticated Chrome user-data-dir template to clone')