@pasko70/pibo 1.0.5 → 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 (429) hide show
  1. package/README.md +106 -250
  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 +42 -5
  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 +47 -0
  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 +3168 -1811
  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-CI0Xj2Cp.js → dist-B4lw9z4F.js} +1 -1
  54. package/dist/apps/chat-ui/assets/{dist-aMr2VYOu.js → dist-BbTaHWON.js} +1 -1
  55. package/dist/apps/chat-ui/assets/{dist-u2OzzOTm.js → dist-BcT_c1EJ.js} +1 -1
  56. package/dist/apps/chat-ui/assets/{dist-Di1ScJ22.js → dist-CGINd7XU.js} +1 -1
  57. package/dist/apps/chat-ui/assets/{dist-wiRpAHIv.js → dist-CrBzZkUp.js} +1 -1
  58. package/dist/apps/chat-ui/assets/{dist-CaNOvqMY.js → dist-CyyISotB.js} +1 -1
  59. package/dist/apps/chat-ui/assets/{dist-zgYUl2B-.js → dist-DFbnFNpX.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dist-CNlhGq5i.js → dist-DGLWQLX8.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dist-BGxHKHPX.js → dist-DfcIkFSN.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dist-DrM-H3e1.js → dist-sKDHTwaT.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{dist-DpmEro5R.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 +174 -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 +252 -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 +66 -2
  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 +214 -0
  373. package/dist/user-skills/manager.js +35 -0
  374. package/dist/user-skills/store.js +267 -0
  375. package/dist/user-skills/types.js +1 -0
  376. package/dist/web/auth.js +5 -1
  377. package/dist/web/channel.js +86 -0
  378. package/dist/web/http.js +79 -14
  379. package/dist/web-annotations/api.js +348 -0
  380. package/dist/web-annotations/attachments.js +201 -0
  381. package/dist/web-annotations/cdp.js +1107 -0
  382. package/dist/web-annotations/index.js +7 -0
  383. package/dist/web-annotations/store.js +407 -0
  384. package/dist/web-annotations/tools.js +350 -0
  385. package/dist/web-annotations/types.js +34 -0
  386. package/dist/web-annotations/validation.js +288 -0
  387. package/docs/README.md +23 -0
  388. package/docs/ops/install-developer-host.md +112 -0
  389. package/docs/ops/install-user-host.md +76 -0
  390. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  391. package/package.json +24 -10
  392. package/{.codex/skills → skills/builtin}/pi-agent-harness/SKILL.md +24 -24
  393. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  394. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  395. package/skills/builtin/prd/SKILL.md +143 -0
  396. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  397. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  398. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  399. package/skills/builtin/skill-creator/SKILL.md +513 -0
  400. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  401. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  402. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  403. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  404. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  405. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  406. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  407. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  408. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  409. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  410. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  411. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  412. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  413. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  414. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  415. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  416. package/skills/builtin/web-annotations/SKILL.md +93 -0
  417. package/dist/apps/chat-ui/assets/index-B_E935fP.js +0 -151
  418. package/dist/apps/chat-ui/assets/index-Dk-opWl3.css +0 -1
  419. package/dist/env.js +0 -32
  420. package/dist/plugins/core-tools.js +0 -94
  421. package/dist/plugins/example.js +0 -67
  422. package/dist/plugins/remote-agent.js +0 -9
  423. package/dist/remote/channel.js +0 -176
  424. package/dist/remote/client.js +0 -92
  425. package/dist/remote/examples/tui-controller.js +0 -263
  426. package/dist/remote/protocol.js +0 -55
  427. package/dist/remote/session-client.js +0 -189
  428. package/dist/sessions/bindings.js +0 -41
  429. /package/{.codex/skills → skills/builtin}/pi-agent-harness/agents/openai.yaml +0 -0
@@ -0,0 +1,333 @@
1
+ import { execFile } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { readdir, readFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { basename, join } from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { createEmptyBrowserPoolState, normalizeBrowserPoolState } from "../tools/browser-pool.js";
8
+ import { getComputeDiskDiagnostics, listWorkers } from "./docker.js";
9
+ const execFileAsync = promisify(execFile);
10
+ const DOCKER_DISK_PRESSURE_BYTES = 5_000_000_000;
11
+ export function parseProcessList(output) {
12
+ const processes = [];
13
+ for (const line of output.split("\n")) {
14
+ if (!line.trim())
15
+ continue;
16
+ const match = line.match(/^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s*(.*)$/);
17
+ if (!match)
18
+ continue;
19
+ const pid = Number(match[1]);
20
+ const ppid = Number(match[2]);
21
+ const pgid = Number(match[3]);
22
+ if (!Number.isInteger(pid) || !Number.isInteger(ppid) || !Number.isInteger(pgid))
23
+ continue;
24
+ const commandName = match[4] ?? "";
25
+ const args = match[5] ?? "";
26
+ const isChromium = isChromiumCommand(commandName, args);
27
+ processes.push({ pid, ppid, pgid, commandName, args, isChromium, isMainProcess: isChromium && !/\s--type=/.test(` ${args}`) });
28
+ }
29
+ return processes;
30
+ }
31
+ export function buildComputeResourceHealth(options = {}) {
32
+ const now = options.now ?? new Date();
33
+ const workers = options.workers ?? [];
34
+ const processes = options.processes ?? [];
35
+ const processListAvailable = !options.processListError;
36
+ const browserPools = options.browserPools ?? [];
37
+ const staleCdpFiles = options.staleCdpFiles ?? { pidFiles: 0, portFiles: 0, details: [] };
38
+ const reaperTimers = options.reaperTimers ?? { status: "missing", details: "No automatic resource reaper timer status was found.", nextCommands: ["pibo compute health --json", "pibo tools browser-use pool reap --json", "pibo compute reap --dry-run --json"] };
39
+ const disk = options.disk;
40
+ const checks = [];
41
+ const mainProcesses = processes.filter((process) => process.isChromium && process.isMainProcess);
42
+ const perWorker = browserPools.map(({ state, statePath }) => {
43
+ const activeLeaseCount = state.activeLeaseId ? Math.max(1, state.activeLeaseCount ?? 1) : state.activeLeaseCount ?? 0;
44
+ const matched = mainProcesses.filter((process) => browserProcessMatchesPool(process, state));
45
+ const recordedPidAlive = state.pid ? processes.some((process) => process.pid === state.pid) : false;
46
+ const leaked = matched.length > state.maxBrowserProcesses;
47
+ const severity = state.state === "dirty" || leaked ? "warning" : "ok";
48
+ return {
49
+ workerId: state.workerId,
50
+ poolId: state.poolId,
51
+ state: state.state,
52
+ pid: state.pid,
53
+ processGroupId: state.processGroupId,
54
+ cdpUrl: state.cdpUrl,
55
+ userDataDir: state.userDataDir,
56
+ activeLeaseId: state.activeLeaseId,
57
+ activeLeaseCount,
58
+ maxBrowserProcesses: state.maxBrowserProcesses,
59
+ recordedPidAlive,
60
+ browserMainProcessCount: matched.length,
61
+ severity,
62
+ statePath,
63
+ lastError: state.lastError,
64
+ };
65
+ });
66
+ const assignedMainPids = new Set();
67
+ for (const pool of browserPools) {
68
+ for (const process of mainProcesses)
69
+ if (browserProcessMatchesPool(process, pool.state))
70
+ assignedMainPids.add(process.pid);
71
+ }
72
+ const unassignedMainProcessDetails = mainProcesses
73
+ .filter((process) => !assignedMainPids.has(process.pid))
74
+ .map((process) => describeUnassignedBrowserProcess(process, workers));
75
+ const unassignedChromiumMainProcesses = unassignedMainProcessDetails.length;
76
+ const activePoolIds = perWorker.filter((pool) => pool.activeLeaseCount > 0).map((pool) => `${pool.workerId}/${pool.poolId}`);
77
+ const dirtyWorkers = workers.filter((worker) => worker.cleanupState === "dirty" || Boolean(worker.dirtyReason)).map((worker) => worker.name);
78
+ const oomKilledWorkers = workers.filter((worker) => worker.oomKilled === true).map((worker) => worker.name);
79
+ const cleanupEligible = workers.filter((worker) => worker.cleanupEligibility.eligible).length;
80
+ const diskPressure = Boolean(disk?.dockerAvailable && ((disk.totals.reclaimableBytes ?? 0) >= DOCKER_DISK_PRESSURE_BYTES || (disk.usage.buildCache?.sizeBytes ?? 0) >= DOCKER_DISK_PRESSURE_BYTES));
81
+ if (!processListAvailable)
82
+ checks.push({ id: "process-list", severity: "warning", message: `Process list unavailable: ${options.processListError}`, nextCommands: ["ps -eo pid,ppid,pgid,comm,args"] });
83
+ if (perWorker.some((pool) => pool.browserMainProcessCount > pool.maxBrowserProcesses) || unassignedChromiumMainProcesses > 0)
84
+ checks.push({ id: "browser-leak", severity: "warning", message: browserLeakMessage(unassignedChromiumMainProcesses), nextCommands: ["pibo compute health --json", "pibo tools browser-use pool status --json", "pibo tools browser-use pool reap --json", "pibo compute reap --dry-run --include-dev"] });
85
+ else
86
+ checks.push({ id: "browser-processes", severity: "ok", message: "Browser process counts are within managed pool expectations.", nextCommands: ["pibo tools browser-use pool status --json"] });
87
+ if (activePoolIds.length > 0)
88
+ checks.push({ id: "browser-leases", severity: "warning", message: `${activePoolIds.length} active browser pool lease(s) found.`, nextCommands: ["pibo ralph runs --json", "pibo tools browser-use pool status --json"] });
89
+ if (staleCdpFiles.pidFiles > 0 || staleCdpFiles.portFiles > 0)
90
+ checks.push({ id: "stale-cdp-files", severity: "warning", message: `${staleCdpFiles.pidFiles} stale pid file(s), ${staleCdpFiles.portFiles} orphan port file(s).`, nextCommands: ["pibo tools browser-use lease reap-stale", "pibo tools browser-use pool reap --json"] });
91
+ if (dirtyWorkers.length > 0)
92
+ checks.push({ id: "dirty-workers", severity: "warning", message: `${dirtyWorkers.length} dirty compute worker(s): ${dirtyWorkers.join(", ")}`, nextCommands: ["pibo compute list --all --json", "pibo compute reap --dry-run --include-dev"] });
93
+ if (oomKilledWorkers.length > 0)
94
+ checks.push({ id: "oom-containers", severity: "critical", message: `${oomKilledWorkers.length} OOM-killed compute container(s): ${oomKilledWorkers.join(", ")}`, nextCommands: ["pibo compute list --all --json", "pibo compute reap --dry-run --include-dev"] });
95
+ if (options.workerListError)
96
+ checks.push({ id: "compute-list", severity: "warning", message: `Docker worker list unavailable: ${options.workerListError}`, nextCommands: ["pibo compute list --all --json"] });
97
+ if (diskPressure)
98
+ checks.push({ id: "docker-disk-pressure", severity: "warning", message: "Docker reclaimable or BuildKit cache bytes exceed the resource-health warning threshold.", nextCommands: ["pibo compute diagnostics --json", "docker builder du", "docker builder prune"] });
99
+ if (disk && !disk.dockerAvailable)
100
+ checks.push({ id: "docker-disk", severity: "warning", message: `Docker disk diagnostics unavailable: ${disk.dockerError ?? "unknown error"}`, nextCommands: ["pibo compute diagnostics --json"] });
101
+ if (reaperTimers.status !== "configured")
102
+ checks.push({ id: "reaper-timer", severity: "warning", message: reaperTimers.details ?? "Automatic reaper timer status is not configured.", nextCommands: reaperTimers.nextCommands });
103
+ const severity = maxSeverity(checks.map((check) => check.severity));
104
+ const nextCommands = uniqueStrings(checks.flatMap((check) => check.nextCommands).concat(["pibo compute health --json", "pibo compute reap --dry-run --json", "pibo compute diagnostics --json"]));
105
+ return {
106
+ generatedAt: now.toISOString(),
107
+ readOnly: true,
108
+ severity,
109
+ checks,
110
+ browserProcesses: {
111
+ processListAvailable,
112
+ processListError: options.processListError,
113
+ totalChromiumProcesses: processes.filter((process) => process.isChromium).length,
114
+ totalChromiumMainProcesses: mainProcesses.length,
115
+ unassignedChromiumMainProcesses,
116
+ unassignedMainProcessDetails,
117
+ perWorker,
118
+ },
119
+ browserLeases: { active: activePoolIds.length, activePoolIds, staleCdpFiles },
120
+ computeWorkers: {
121
+ dockerAvailable: !options.workerListError,
122
+ dockerError: options.workerListError,
123
+ total: workers.length,
124
+ dirty: dirtyWorkers.length,
125
+ oomKilled: oomKilledWorkers.length,
126
+ cleanupEligible,
127
+ dirtyWorkers,
128
+ oomKilledWorkers,
129
+ },
130
+ dockerDisk: {
131
+ dockerAvailable: disk?.dockerAvailable ?? false,
132
+ dockerError: disk?.dockerError,
133
+ sizeBytes: disk?.totals.sizeBytes,
134
+ reclaimableBytes: disk?.totals.reclaimableBytes,
135
+ buildCacheBytes: disk?.usage.buildCache?.sizeBytes,
136
+ pressure: diskPressure,
137
+ },
138
+ reaperTimers,
139
+ nextCommands,
140
+ };
141
+ }
142
+ function browserLeakMessage(unassignedCount) {
143
+ if (unassignedCount > 0)
144
+ return `${unassignedCount} unmanaged Chromium main process(es) are not associated with a managed browser pool.`;
145
+ return "Chromium main-process count exceeds managed pool expectations.";
146
+ }
147
+ function describeUnassignedBrowserProcess(process, workers) {
148
+ const worker = workers.find((candidate) => candidate.hostPid !== undefined && candidate.hostPid > 0 && candidate.hostPid === process.ppid);
149
+ const userDataDir = readChromeArg(process.args, "user-data-dir");
150
+ const cdpPortValue = readChromeArg(process.args, "remote-debugging-port");
151
+ const cdpPort = cdpPortValue && /^\d+$/.test(cdpPortValue) ? Number(cdpPortValue) : undefined;
152
+ const nextCommands = worker
153
+ ? [`docker top ${worker.name} -eo pid,ppid,pgid,comm,args`, `pibo compute list --all --json`]
154
+ : ["ps -eo pid,ppid,pgid,comm,args | grep -Ei 'chrome|chromium'", "pibo compute list --all --json"];
155
+ return {
156
+ pid: process.pid,
157
+ ppid: process.ppid,
158
+ pgid: process.pgid,
159
+ commandName: process.commandName,
160
+ workerName: worker?.name,
161
+ userDataDir,
162
+ cdpPort,
163
+ argsPreview: sanitizeArgsPreview(process.args),
164
+ nextCommands,
165
+ };
166
+ }
167
+ function readChromeArg(args, name) {
168
+ const pattern = new RegExp(`(?:^|\\s)--${name}=([^\\s]+)`);
169
+ return args.match(pattern)?.[1];
170
+ }
171
+ function sanitizeArgsPreview(args) {
172
+ const redacted = args
173
+ .replace(/(token|access_token|refresh_token|password|passwd|cookie|secret)=([^\s]+)/gi, "$1=<redacted>")
174
+ .replace(/(--(?:token|password|cookie|secret))\s+([^\s]+)/gi, "$1 <redacted>");
175
+ return redacted.length > 220 ? `${redacted.slice(0, 217)}...` : redacted;
176
+ }
177
+ export async function getComputeResourceHealth(options = {}) {
178
+ const browserPoolRoot = options.browserPoolRoot ?? defaultBrowserPoolRoot();
179
+ const browserUseHome = options.browserUseHome ?? defaultBrowserUseHome();
180
+ const [workerResult, disk, processResult, browserPools, staleCdpFiles] = await Promise.all([
181
+ collectWorkers(),
182
+ getComputeDiskDiagnostics({ now: options.now }),
183
+ collectProcesses(),
184
+ collectBrowserPoolStates(browserPoolRoot),
185
+ collectStaleCdpFiles(browserUseHome),
186
+ ]);
187
+ return buildComputeResourceHealth({
188
+ now: options.now,
189
+ workers: workerResult.workers,
190
+ workerListError: workerResult.error,
191
+ disk,
192
+ processes: processResult.processes,
193
+ processListError: processResult.error,
194
+ browserPools,
195
+ staleCdpFiles,
196
+ reaperTimers: detectReaperTimerStatus(),
197
+ });
198
+ }
199
+ export function defaultBrowserUseHome() {
200
+ return process.env.BROWSER_USE_HOME || join(homedir(), ".pibo", "tools", "browser-use", "home");
201
+ }
202
+ export function defaultBrowserPoolRoot() {
203
+ return process.env.PIBO_BROWSER_POOL_ROOT || join(defaultBrowserUseHome(), "pibo-browser-pool");
204
+ }
205
+ export async function collectStaleCdpFiles(browserUseHome) {
206
+ const stateDir = join(browserUseHome, "pibo-cdp");
207
+ const result = { pidFiles: 0, portFiles: 0, details: [] };
208
+ let files;
209
+ try {
210
+ files = await readdir(stateDir);
211
+ }
212
+ catch {
213
+ return result;
214
+ }
215
+ for (const file of files) {
216
+ if (file.endsWith(".pid")) {
217
+ const pidPath = join(stateDir, file);
218
+ const text = await readFile(pidPath, "utf8").catch(() => "");
219
+ const pid = Number.parseInt(text.trim(), 10);
220
+ if (!Number.isFinite(pid) || pid <= 0 || !isPidAlive(pid)) {
221
+ result.pidFiles += 1;
222
+ result.details.push(`stale pid file: ${file}`);
223
+ }
224
+ }
225
+ else if (file.endsWith(".port")) {
226
+ const pidPath = join(stateDir, `${file.slice(0, -5)}.pid`);
227
+ if (!existsSync(pidPath)) {
228
+ result.portFiles += 1;
229
+ result.details.push(`orphan port file: ${file}`);
230
+ }
231
+ }
232
+ }
233
+ return result;
234
+ }
235
+ async function collectWorkers() {
236
+ try {
237
+ return { workers: await listWorkers({ all: true }) };
238
+ }
239
+ catch (error) {
240
+ return { workers: [], error: error instanceof Error ? error.message : String(error) };
241
+ }
242
+ }
243
+ async function collectProcesses() {
244
+ try {
245
+ const { stdout } = await execFileAsync("ps", ["-eo", "pid=,ppid=,pgid=,comm=,args="], { maxBuffer: 10 * 1024 * 1024 });
246
+ return { processes: parseProcessList(stdout) };
247
+ }
248
+ catch (error) {
249
+ return { processes: [], error: error instanceof Error ? error.message : String(error) };
250
+ }
251
+ }
252
+ async function collectBrowserPoolStates(rootDir) {
253
+ const statePaths = await findStateJsonFiles(rootDir);
254
+ const states = [];
255
+ for (const statePath of statePaths) {
256
+ try {
257
+ const raw = await readFile(statePath, "utf8");
258
+ const parsed = JSON.parse(raw);
259
+ const identity = parsed && typeof parsed === "object" && !Array.isArray(parsed)
260
+ ? { workerId: String(parsed.workerId ?? "unknown"), poolId: String(parsed.poolId ?? "default"), maxBrowserProcesses: 1 }
261
+ : { workerId: "unknown", poolId: "default", maxBrowserProcesses: 1 };
262
+ states.push({ state: normalizeBrowserPoolState(parsed, identity), statePath });
263
+ }
264
+ catch {
265
+ states.push({ state: { ...createEmptyBrowserPoolState({ workerId: "unknown", poolId: "default" }), state: "dirty", lastError: `Could not read browser pool state ${statePath}` }, statePath });
266
+ }
267
+ }
268
+ return states;
269
+ }
270
+ async function findStateJsonFiles(rootDir) {
271
+ const found = [];
272
+ async function walk(dir) {
273
+ let entries;
274
+ try {
275
+ entries = await readdir(dir, { withFileTypes: true });
276
+ }
277
+ catch {
278
+ return;
279
+ }
280
+ for (const entry of entries) {
281
+ const fullPath = join(dir, entry.name);
282
+ if (entry.isDirectory())
283
+ await walk(fullPath);
284
+ else if (entry.isFile() && entry.name === "state.json")
285
+ found.push(fullPath);
286
+ }
287
+ }
288
+ await walk(rootDir);
289
+ return found;
290
+ }
291
+ function detectReaperTimerStatus() {
292
+ if (process.env.PIBO_RESOURCE_REAPER_TIMER_STATUS === "configured") {
293
+ return { status: "configured", details: "Resource reaper timer is marked configured by PIBO_RESOURCE_REAPER_TIMER_STATUS.", nextCommands: ["pibo compute health --json"] };
294
+ }
295
+ return {
296
+ status: "missing",
297
+ details: "No automatic resource reaper timer status was found; keep using read-only diagnostics and dry-run cleanup until timers are explicitly enabled.",
298
+ nextCommands: ["pibo compute health --json", "pibo tools browser-use pool reap --json", "pibo compute reap --dry-run --json"],
299
+ };
300
+ }
301
+ function browserProcessMatchesPool(process, state) {
302
+ if (state.pid && process.pid === state.pid)
303
+ return true;
304
+ if (state.processGroupId && process.pgid === state.processGroupId)
305
+ return true;
306
+ if (state.userDataDir && process.args.includes(`--user-data-dir=${state.userDataDir}`))
307
+ return true;
308
+ return false;
309
+ }
310
+ function isChromiumCommand(commandName, args) {
311
+ const commandBase = basename(commandName).toLowerCase();
312
+ const firstArg = basename(args.trim().split(/\s+/, 1)[0] ?? "").toLowerCase();
313
+ return [commandBase, firstArg].some((value) => value === "chrome" || value === "google-chrome" || value === "chromium" || value === "chromium-browser");
314
+ }
315
+ function isPidAlive(pid) {
316
+ try {
317
+ process.kill(pid, 0);
318
+ return true;
319
+ }
320
+ catch (error) {
321
+ return error instanceof Error && "code" in error && error.code === "EPERM";
322
+ }
323
+ }
324
+ function maxSeverity(values) {
325
+ if (values.includes("critical"))
326
+ return "critical";
327
+ if (values.includes("warning"))
328
+ return "warning";
329
+ return "ok";
330
+ }
331
+ function uniqueStrings(values) {
332
+ return [...new Set(values)];
333
+ }
@@ -0,0 +1,98 @@
1
+ export const DEFAULT_COMPUTE_RESOURCE_POLICY = Object.freeze({
2
+ memory: "2g",
3
+ memorySwap: "2g",
4
+ pidsLimit: 512,
5
+ shmSize: "512m",
6
+ init: true,
7
+ restart: "no",
8
+ logDriver: "json-file",
9
+ logMaxSize: "10m",
10
+ logMaxFile: 3,
11
+ });
12
+ export const COMPUTE_RESOURCE_POLICY_ENV = Object.freeze({
13
+ memory: "PIBO_COMPUTE_MEMORY",
14
+ memorySwap: "PIBO_COMPUTE_MEMORY_SWAP",
15
+ pidsLimit: "PIBO_COMPUTE_PIDS_LIMIT",
16
+ shmSize: "PIBO_COMPUTE_SHM_SIZE",
17
+ init: "PIBO_COMPUTE_INIT",
18
+ logMaxSize: "PIBO_COMPUTE_LOG_MAX_SIZE",
19
+ logMaxFile: "PIBO_COMPUTE_LOG_MAX_FILE",
20
+ });
21
+ export const COMPUTE_RESOURCE_POLICY_LABELS = Object.freeze({
22
+ memory: "pibo.compute.resource.memory",
23
+ memorySwap: "pibo.compute.resource.memorySwap",
24
+ pidsLimit: "pibo.compute.resource.pidsLimit",
25
+ shmSize: "pibo.compute.resource.shmSize",
26
+ init: "pibo.compute.resource.init",
27
+ restart: "pibo.compute.resource.restart",
28
+ logDriver: "pibo.compute.resource.logDriver",
29
+ logMaxSize: "pibo.compute.resource.logMaxSize",
30
+ logMaxFile: "pibo.compute.resource.logMaxFile",
31
+ });
32
+ export function resolveComputeResourcePolicy(env = process.env) {
33
+ return {
34
+ memory: nonEmpty(env[COMPUTE_RESOURCE_POLICY_ENV.memory], DEFAULT_COMPUTE_RESOURCE_POLICY.memory),
35
+ memorySwap: nonEmpty(env[COMPUTE_RESOURCE_POLICY_ENV.memorySwap], DEFAULT_COMPUTE_RESOURCE_POLICY.memorySwap),
36
+ pidsLimit: positiveInteger(env[COMPUTE_RESOURCE_POLICY_ENV.pidsLimit], DEFAULT_COMPUTE_RESOURCE_POLICY.pidsLimit),
37
+ shmSize: nonEmpty(env[COMPUTE_RESOURCE_POLICY_ENV.shmSize], DEFAULT_COMPUTE_RESOURCE_POLICY.shmSize),
38
+ init: booleanValue(env[COMPUTE_RESOURCE_POLICY_ENV.init], DEFAULT_COMPUTE_RESOURCE_POLICY.init),
39
+ restart: DEFAULT_COMPUTE_RESOURCE_POLICY.restart,
40
+ logDriver: DEFAULT_COMPUTE_RESOURCE_POLICY.logDriver,
41
+ logMaxSize: nonEmpty(env[COMPUTE_RESOURCE_POLICY_ENV.logMaxSize], DEFAULT_COMPUTE_RESOURCE_POLICY.logMaxSize),
42
+ logMaxFile: positiveInteger(env[COMPUTE_RESOURCE_POLICY_ENV.logMaxFile], DEFAULT_COMPUTE_RESOURCE_POLICY.logMaxFile),
43
+ };
44
+ }
45
+ export function buildDockerResourcePolicyArgs(policy = resolveComputeResourcePolicy()) {
46
+ return [
47
+ "--memory",
48
+ policy.memory,
49
+ "--memory-swap",
50
+ policy.memorySwap,
51
+ "--pids-limit",
52
+ String(policy.pidsLimit),
53
+ "--shm-size",
54
+ policy.shmSize,
55
+ ...(policy.init ? ["--init"] : []),
56
+ "--restart",
57
+ policy.restart,
58
+ "--log-driver",
59
+ policy.logDriver,
60
+ "--log-opt",
61
+ `max-size=${policy.logMaxSize}`,
62
+ "--log-opt",
63
+ `max-file=${policy.logMaxFile}`,
64
+ ];
65
+ }
66
+ export function buildComputeResourcePolicyLabels(policy = resolveComputeResourcePolicy()) {
67
+ return [
68
+ `${COMPUTE_RESOURCE_POLICY_LABELS.memory}=${policy.memory}`,
69
+ `${COMPUTE_RESOURCE_POLICY_LABELS.memorySwap}=${policy.memorySwap}`,
70
+ `${COMPUTE_RESOURCE_POLICY_LABELS.pidsLimit}=${policy.pidsLimit}`,
71
+ `${COMPUTE_RESOURCE_POLICY_LABELS.shmSize}=${policy.shmSize}`,
72
+ `${COMPUTE_RESOURCE_POLICY_LABELS.init}=${policy.init}`,
73
+ `${COMPUTE_RESOURCE_POLICY_LABELS.restart}=${policy.restart}`,
74
+ `${COMPUTE_RESOURCE_POLICY_LABELS.logDriver}=${policy.logDriver}`,
75
+ `${COMPUTE_RESOURCE_POLICY_LABELS.logMaxSize}=${policy.logMaxSize}`,
76
+ `${COMPUTE_RESOURCE_POLICY_LABELS.logMaxFile}=${policy.logMaxFile}`,
77
+ ];
78
+ }
79
+ function nonEmpty(value, fallback) {
80
+ const trimmed = value?.trim();
81
+ return trimmed ? trimmed : fallback;
82
+ }
83
+ function positiveInteger(value, fallback) {
84
+ if (value === undefined || value.trim() === "")
85
+ return fallback;
86
+ const parsed = Number(value);
87
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
88
+ }
89
+ function booleanValue(value, fallback) {
90
+ if (value === undefined || value.trim() === "")
91
+ return fallback;
92
+ const normalized = value.trim().toLowerCase();
93
+ if (["1", "true", "yes", "on"].includes(normalized))
94
+ return true;
95
+ if (["0", "false", "no", "off"].includes(normalized))
96
+ return false;
97
+ return fallback;
98
+ }
@@ -1,6 +1,10 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
- export const DEFAULT_PIBO_CONFIG_PATH = ".pibo/config.json";
3
+ import { piboHomePath } from "../core/pibo-home.js";
4
+ export const DEFAULT_PIBO_CONFIG_PATH = "config.json";
5
+ export function getDefaultPiboConfigPath() {
6
+ return piboHomePath(DEFAULT_PIBO_CONFIG_PATH);
7
+ }
4
8
  export const PIBO_CONFIG_KEYS = [
5
9
  {
6
10
  key: "auth.baseURL",
@@ -82,15 +86,15 @@ function assertObject(value) {
82
86
  }
83
87
  return value;
84
88
  }
85
- export function loadPiboConfig(path = DEFAULT_PIBO_CONFIG_PATH) {
86
- const resolvedPath = resolve(path);
89
+ export function loadPiboConfig(path) {
90
+ const resolvedPath = resolve(path ?? getDefaultPiboConfigPath());
87
91
  if (!existsSync(resolvedPath))
88
92
  return {};
89
93
  const parsed = JSON.parse(readFileSync(resolvedPath, "utf-8"));
90
94
  return assertObject(parsed);
91
95
  }
92
- export function savePiboConfig(config, path = DEFAULT_PIBO_CONFIG_PATH) {
93
- const resolvedPath = resolve(path);
96
+ export function savePiboConfig(config, path) {
97
+ const resolvedPath = resolve(path ?? getDefaultPiboConfigPath());
94
98
  mkdirSync(dirname(resolvedPath), { recursive: true });
95
99
  writeFileSync(resolvedPath, `${JSON.stringify(config, null, 2)}\n`);
96
100
  }