@pasko70/pibo 1.1.0 → 1.3.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 (439) 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/chat-vscode-web/assets/index-B5QK07zO.css +2 -0
  182. package/dist/apps/chat-vscode-web/assets/index-C3GTPyDo.js +41 -0
  183. package/dist/apps/chat-vscode-web/index.html +14 -0
  184. package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
  185. package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
  186. package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
  187. package/dist/apps/cli-ui/InkTerminalView.js +25 -0
  188. package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
  189. package/dist/apps/cli-ui/index.js +8 -0
  190. package/dist/apps/cli-ui/inkColors.js +67 -0
  191. package/dist/apps/cli-ui/inkJson.js +244 -0
  192. package/dist/apps/cli-ui/inkMarkdown.js +122 -0
  193. package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
  194. package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
  195. package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
  196. package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
  197. package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
  198. package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
  199. package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
  200. package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
  201. package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
  202. package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
  203. package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
  204. package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
  205. package/dist/apps/context-files-ui/index.html +2 -2
  206. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  207. package/dist/apps/vscode-artifacts/pibo-vscode-1.3.0.vsix +0 -0
  208. package/dist/auth/better-auth.js +2 -1
  209. package/dist/auth/login-actions.js +251 -0
  210. package/dist/auth/openai-codex-usage.js +147 -0
  211. package/dist/bin/pibo.js +0 -0
  212. package/dist/bin/rg.js +15 -0
  213. package/dist/cli-session/fakeSessionSource.js +804 -0
  214. package/dist/cli-session/index.js +3 -0
  215. package/dist/cli-session/localSessionSource.js +1144 -0
  216. package/dist/cli-session/sessionSource.js +13 -0
  217. package/dist/cli.js +159 -14
  218. package/dist/compute/cli.js +415 -0
  219. package/dist/compute/docker.js +827 -0
  220. package/dist/compute/resource-health.js +333 -0
  221. package/dist/compute/resource-policy.js +98 -0
  222. package/dist/config/config.js +9 -5
  223. package/dist/core/context-build.js +677 -0
  224. package/dist/core/model-defaults.js +51 -9
  225. package/dist/core/pibo-home.js +8 -0
  226. package/dist/core/profiles.js +48 -0
  227. package/dist/core/provider-telemetry.js +222 -0
  228. package/dist/core/routed-session.js +441 -47
  229. package/dist/core/runtime-telemetry.js +853 -0
  230. package/dist/core/runtime.js +103 -15
  231. package/dist/core/session-errors.js +47 -0
  232. package/dist/core/session-model.js +39 -0
  233. package/dist/core/session-router.js +292 -62
  234. package/dist/core/shared-app.js +17 -0
  235. package/dist/core/skill-expansion.js +43 -0
  236. package/dist/core/system-prompt-template.js +9 -9
  237. package/dist/core/telemetry-staleness.js +128 -0
  238. package/dist/core/test-output-compaction.js +145 -0
  239. package/dist/core/user-settings.js +73 -0
  240. package/dist/cron/channel.js +28 -0
  241. package/dist/cron/cli.js +230 -0
  242. package/dist/cron/plugin.js +11 -0
  243. package/dist/cron/schedule.js +214 -0
  244. package/dist/cron/service.js +177 -0
  245. package/dist/cron/store.js +349 -0
  246. package/dist/cron/types.js +1 -0
  247. package/dist/data/cli.js +184 -0
  248. package/dist/data/event-log.js +106 -0
  249. package/dist/data/final-app-space-cutover-migration.js +728 -0
  250. package/dist/data/ingest-service.js +389 -0
  251. package/dist/data/message-store.js +62 -0
  252. package/dist/data/navigation-store.js +75 -0
  253. package/dist/data/observation-store.js +46 -0
  254. package/dist/data/payload-store.js +144 -0
  255. package/dist/data/pibo-store.js +59 -0
  256. package/dist/data/schema.js +434 -0
  257. package/dist/data/session-store.js +63 -0
  258. package/dist/data/shared-app-migration.js +757 -0
  259. package/dist/data/sqlite-schema.js +12 -0
  260. package/dist/data/telemetry-preview.js +65 -0
  261. package/dist/data/telemetry-queries.js +212 -0
  262. package/dist/data/telemetry-retention.js +50 -0
  263. package/dist/data/telemetry-rows.js +158 -0
  264. package/dist/data/telemetry.js +357 -0
  265. package/dist/debug/delta-compaction.js +99 -0
  266. package/dist/debug/detail-format.js +86 -0
  267. package/dist/debug/events.js +149 -29
  268. package/dist/debug/failures.js +162 -0
  269. package/dist/debug/index.js +655 -30
  270. package/dist/debug/messages.js +185 -0
  271. package/dist/debug/next-commands.js +6 -0
  272. package/dist/debug/payloads.js +123 -0
  273. package/dist/debug/pty.js +924 -0
  274. package/dist/debug/session.js +45 -15
  275. package/dist/debug/sql.js +1 -1
  276. package/dist/debug/stores.js +18 -13
  277. package/dist/debug/summary.js +72 -0
  278. package/dist/debug/telemetry.js +649 -0
  279. package/dist/debug/tools.js +168 -0
  280. package/dist/debug/trace-render-check.js +151 -0
  281. package/dist/debug/trace.js +152 -27
  282. package/dist/debug/web-artifacts.js +63 -0
  283. package/dist/debug/web-options.js +313 -0
  284. package/dist/debug/web-render-analysis.js +310 -0
  285. package/dist/debug/web-snapshot-browser-scripts.js +303 -0
  286. package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
  287. package/dist/debug/web-streaming-browser-library.js +928 -0
  288. package/dist/debug/web-streaming-browser-scripts.js +242 -0
  289. package/dist/debug/web-streaming-provider-telemetry.js +194 -0
  290. package/dist/debug/web-streaming-report.js +493 -0
  291. package/dist/debug/web-streaming-types.js +1 -0
  292. package/dist/debug/web.js +574 -0
  293. package/dist/gateway/backup.js +83 -0
  294. package/dist/gateway/cli.js +511 -0
  295. package/dist/gateway/fallback.js +155 -0
  296. package/dist/gateway/pidfile.js +84 -0
  297. package/dist/gateway/protocol.js +16 -0
  298. package/dist/gateway/server.js +172 -17
  299. package/dist/gateway/tool.js +54 -51
  300. package/dist/gateway/web.js +74 -2
  301. package/dist/index.js +3 -1
  302. package/dist/local/client.js +3 -3
  303. package/dist/local/extension.js +8 -5
  304. package/dist/plugins/builtin.js +251 -49
  305. package/dist/plugins/chat-vscode-web.js +28 -0
  306. package/dist/plugins/codex-compat.js +0 -41
  307. package/dist/plugins/context-files.js +98 -18
  308. package/dist/plugins/dev-auth.js +124 -0
  309. package/dist/plugins/native-tooling.js +15 -0
  310. package/dist/plugins/registry.js +49 -1
  311. package/dist/plugins/web-annotations.js +27 -0
  312. package/dist/providers/minimax.js +70 -0
  313. package/dist/providers/openai-compat.js +48 -0
  314. package/dist/ralph/channel.js +8 -0
  315. package/dist/ralph/cli.js +152 -0
  316. package/dist/ralph/plugin.js +14 -0
  317. package/dist/ralph/service.js +271 -0
  318. package/dist/ralph/stopping.js +151 -0
  319. package/dist/ralph/store.js +450 -0
  320. package/dist/ralph/templates.js +200 -0
  321. package/dist/ralph/types.js +1 -0
  322. package/dist/reliability/store.js +42 -26
  323. package/dist/runs/registry.js +72 -35
  324. package/dist/session-ui/commandCatalog.js +193 -0
  325. package/dist/session-ui/commandResults.js +95 -0
  326. package/dist/session-ui/index.js +7 -0
  327. package/dist/session-ui/ownerViewModel.js +27 -0
  328. package/dist/session-ui/roomSessionViewModel.js +69 -0
  329. package/dist/session-ui/statusViewModel.js +127 -0
  330. package/dist/session-ui/terminalCards.js +210 -0
  331. package/dist/session-ui/terminalRows.js +937 -0
  332. package/dist/session-ui/terminalValue.js +45 -0
  333. package/dist/sessions/pibo-data-store.js +178 -0
  334. package/dist/sessions/sqlite-store.js +78 -12
  335. package/dist/sessions/store.js +11 -4
  336. package/dist/sessions/workflow-session-kind.js +20 -0
  337. package/dist/setup/cli.js +567 -0
  338. package/dist/shared/trace-async-agent-runs.js +127 -0
  339. package/dist/shared/trace-engine.js +96 -0
  340. package/dist/shared/trace-event-projection.js +679 -0
  341. package/dist/shared/trace-live-reducer.js +191 -0
  342. package/dist/shared/trace-nodes.js +76 -0
  343. package/dist/shared/trace-order.js +11 -10
  344. package/dist/shared/trace-patch-nodes.js +83 -0
  345. package/dist/shared/trace-run-notifications.js +69 -0
  346. package/dist/shared/trace-subagent-links.js +46 -0
  347. package/dist/shared/trace-transcript.js +303 -0
  348. package/dist/shared/trace-types.js +1 -0
  349. package/dist/shared-app.js +4 -0
  350. package/dist/signals/aggregate.js +65 -0
  351. package/dist/signals/events.js +1 -0
  352. package/dist/signals/projector.js +158 -0
  353. package/dist/signals/registry.js +513 -0
  354. package/dist/signals/store.js +1 -0
  355. package/dist/signals/types.js +1 -0
  356. package/dist/skills/cli.js +117 -0
  357. package/dist/tools/agent-browser-leases.js +219 -0
  358. package/dist/tools/agent-browser-wrapper.js +99 -0
  359. package/dist/tools/browser-pool.js +623 -0
  360. package/dist/tools/browser-use-cdp.js +56 -4
  361. package/dist/tools/browser-use-leases.js +215 -37
  362. package/dist/tools/browser-use-wrapper.js +508 -65
  363. package/dist/tools/cdp-client.js +189 -0
  364. package/dist/tools/guides.js +203 -4
  365. package/dist/tools/index.js +666 -16
  366. package/dist/tools/npm-runtime.js +136 -0
  367. package/dist/tools/registry.js +107 -8
  368. package/dist/tools/runtime/index.js +3 -0
  369. package/dist/tools/runtime/node-backend.js +225 -0
  370. package/dist/tools/runtime/node-worker-source.js +206 -0
  371. package/dist/tools/runtime/python-backend.js +227 -0
  372. package/dist/tools/runtime/python-worker-source.js +178 -0
  373. package/dist/tools/runtime/registry.js +255 -0
  374. package/dist/tools/runtime/tool.js +168 -0
  375. package/dist/tools/runtime/types.js +1 -0
  376. package/dist/tools/web-search.js +2 -1
  377. package/dist/user-skills/installer.js +39 -36
  378. package/dist/user-skills/store.js +50 -11
  379. package/dist/vscode/cli.js +90 -0
  380. package/dist/vscode/code-cli.js +119 -0
  381. package/dist/vscode/install.js +177 -0
  382. package/dist/vscode/status.js +80 -0
  383. package/dist/vscode/types.js +14 -0
  384. package/dist/vscode/uninstall.js +49 -0
  385. package/dist/vscode/vsix-fetcher.js +131 -0
  386. package/dist/web/auth.js +5 -1
  387. package/dist/web/channel.js +86 -0
  388. package/dist/web/http.js +79 -14
  389. package/dist/web-annotations/api.js +348 -0
  390. package/dist/web-annotations/attachments.js +201 -0
  391. package/dist/web-annotations/cdp.js +1107 -0
  392. package/dist/web-annotations/index.js +7 -0
  393. package/dist/web-annotations/store.js +407 -0
  394. package/dist/web-annotations/tools.js +350 -0
  395. package/dist/web-annotations/types.js +34 -0
  396. package/dist/web-annotations/validation.js +288 -0
  397. package/docs/README.md +23 -0
  398. package/docs/ops/install-developer-host.md +112 -0
  399. package/docs/ops/install-user-host.md +76 -0
  400. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  401. package/docs/ops/vscode-extension-release.md +138 -0
  402. package/package.json +24 -9
  403. package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
  404. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  405. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  406. package/skills/builtin/prd/SKILL.md +143 -0
  407. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  408. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  409. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  410. package/skills/builtin/skill-creator/SKILL.md +513 -0
  411. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  412. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  413. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  414. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  415. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  416. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  417. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  418. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  419. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  420. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  421. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  422. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  423. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  424. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  425. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  426. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  427. package/skills/builtin/web-annotations/SKILL.md +93 -0
  428. package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
  429. package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
  430. package/dist/env.js +0 -32
  431. package/dist/plugins/core-tools.js +0 -94
  432. package/dist/plugins/example.js +0 -67
  433. package/dist/plugins/remote-agent.js +0 -9
  434. package/dist/remote/channel.js +0 -176
  435. package/dist/remote/client.js +0 -92
  436. package/dist/remote/examples/tui-controller.js +0 -263
  437. package/dist/remote/protocol.js +0 -55
  438. package/dist/remote/session-client.js +0 -189
  439. package/dist/sessions/bindings.js +0 -41
@@ -0,0 +1,136 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { ErrorCode, formatCliError } from '../cli-errors.js';
7
+ import { detectDesktopEnv, getDesktopProcessEnv, hasDesktopDisplay, printDesktopEnvStatus, printLinuxVirtualDisplayHint, } from './desktop-env.js';
8
+ function getPiboHome() {
9
+ return process.env.PIBO_HOME || join(homedir(), '.pibo');
10
+ }
11
+ export function getToolNpmRuntimePaths(name, spec) {
12
+ const rootDir = join(getPiboHome(), 'tools', name);
13
+ const homeDir = join(rootDir, 'home');
14
+ const nodeDir = join(rootDir, 'node');
15
+ const binDir = join(nodeDir, 'node_modules', '.bin');
16
+ const executable = process.platform === 'win32' ? `${spec.executableName}.cmd` : spec.executableName;
17
+ return {
18
+ rootDir,
19
+ homeDir,
20
+ nodeDir,
21
+ binDir,
22
+ executablePath: join(binDir, executable),
23
+ };
24
+ }
25
+ export function getToolNpmRuntimeEnv(paths, spec) {
26
+ const env = { ...process.env, ...getDesktopProcessEnv() };
27
+ env.PATH = `${join(paths.homeDir, 'bin')}:${paths.binDir}:${env.PATH ?? ''}`;
28
+ if (spec.homeEnvVar)
29
+ env[spec.homeEnvVar] = paths.homeDir;
30
+ return env;
31
+ }
32
+ function runBuffered(command, args, env = process.env) {
33
+ return new Promise((resolve) => {
34
+ const child = spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'], env });
35
+ const chunks = [];
36
+ child.stdout.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
37
+ child.stderr.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
38
+ child.on('error', (error) => resolve({ ok: false, output: error.message }));
39
+ child.on('close', (code) => {
40
+ resolve({ ok: code === 0, output: Buffer.concat(chunks).toString('utf-8').trim() });
41
+ });
42
+ });
43
+ }
44
+ function runInheritedNpmCommand(command, args, env = process.env) {
45
+ return new Promise((resolve, reject) => {
46
+ console.log(`Running: ${command} ${args.join(' ')}`);
47
+ const child = spawn(command, args, { stdio: 'inherit', env });
48
+ child.on('error', (error) => {
49
+ reject(new Error(formatCliError({
50
+ code: ErrorCode.CLIENT_ERROR,
51
+ type: 'CLI_TOOL_COMMAND_FAILED',
52
+ message: `Failed to run command: ${command}`,
53
+ details: error.message,
54
+ suggestion: 'Install Node.js and npm first, then rerun the command.',
55
+ })));
56
+ });
57
+ child.on('close', (code) => {
58
+ if (code === 0) {
59
+ resolve();
60
+ return;
61
+ }
62
+ reject(new Error(formatCliError({
63
+ code: ErrorCode.CLIENT_ERROR,
64
+ type: 'CLI_TOOL_COMMAND_FAILED',
65
+ message: `Command failed with exit code ${code ?? 'unknown'}`,
66
+ details: `${command} ${args.join(' ')}`,
67
+ suggestion: 'Fix the npm setup error above, then rerun the install command.',
68
+ })));
69
+ });
70
+ });
71
+ }
72
+ async function ensureNodeAndNpm() {
73
+ const node = await runBuffered('node', ['--version']);
74
+ const npm = await runBuffered('npm', ['--version']);
75
+ if (!node.ok || !npm.ok) {
76
+ throw new Error(formatCliError({
77
+ code: ErrorCode.CLIENT_ERROR,
78
+ type: 'CLI_TOOL_NPM_MISSING',
79
+ message: 'node or npm was not found on PATH',
80
+ details: `node: ${node.output || 'missing'}; npm: ${npm.output || 'missing'}`,
81
+ suggestion: 'Install Node.js and npm, then rerun the install command.',
82
+ }));
83
+ }
84
+ }
85
+ export async function installToolNpmRuntime(name, spec) {
86
+ await ensureNodeAndNpm();
87
+ const paths = getToolNpmRuntimePaths(name, spec);
88
+ await mkdir(paths.rootDir, { recursive: true });
89
+ await mkdir(paths.homeDir, { recursive: true });
90
+ await mkdir(paths.nodeDir, { recursive: true });
91
+ const packageJsonPath = join(paths.nodeDir, 'package.json');
92
+ if (!existsSync(packageJsonPath)) {
93
+ await writeFile(packageJsonPath, `${JSON.stringify({ private: true, name: `pibo-tool-${name}` }, null, 2)}\n`);
94
+ }
95
+ await runInheritedNpmCommand('npm', ['install', '--prefix', paths.nodeDir, spec.packageName]);
96
+ if (spec.postInstallArgs?.length) {
97
+ await runInheritedNpmCommand(paths.executablePath, spec.postInstallArgs, getToolNpmRuntimeEnv(paths, spec));
98
+ }
99
+ return paths;
100
+ }
101
+ export async function removeToolNpmRuntime(name, spec) {
102
+ const paths = getToolNpmRuntimePaths(name, spec);
103
+ await rm(paths.rootDir, { recursive: true, force: true });
104
+ console.log(`Removed runtime: ${paths.rootDir}`);
105
+ }
106
+ export async function printToolNpmRuntimeDoctor(name, spec) {
107
+ const paths = getToolNpmRuntimePaths(name, spec);
108
+ const node = await runBuffered('node', ['--version']);
109
+ const npm = await runBuffered('npm', ['--version']);
110
+ console.log(`${name}`);
111
+ console.log(` node: ${node.ok ? node.output || 'ok' : `missing (${node.output})`}`);
112
+ console.log(` npm: ${npm.ok ? npm.output || 'ok' : `missing (${npm.output})`}`);
113
+ console.log(` package: ${spec.packageName}`);
114
+ console.log(` runtime: ${paths.rootDir}`);
115
+ console.log(` home: ${paths.homeDir}`);
116
+ console.log(` node modules: ${existsSync(join(paths.nodeDir, 'node_modules')) ? 'present' : 'missing'}`);
117
+ console.log(` executable: ${existsSync(paths.executablePath) ? paths.executablePath : 'missing'}`);
118
+ printDesktopEnvStatus(' ');
119
+ if (name === 'agent-browser' && process.platform === 'linux' && !hasDesktopDisplay(detectDesktopEnv())) {
120
+ printLinuxVirtualDisplayHint(' ');
121
+ }
122
+ if (existsSync(paths.executablePath)) {
123
+ const doctorExecutablePath = name === 'agent-browser' && existsSync(join(paths.homeDir, 'bin', 'agent-browser'))
124
+ ? join(paths.homeDir, 'bin', 'agent-browser')
125
+ : paths.executablePath;
126
+ const doctor = await runBuffered(doctorExecutablePath, ['doctor', '--offline', '--quick'], getToolNpmRuntimeEnv(paths, spec));
127
+ console.log(` tool doctor: ${doctor.ok ? 'ok' : 'failed'}`);
128
+ if (doctor.output)
129
+ console.log(doctor.output.split('\n').map((line) => ` ${line}`).join('\n'));
130
+ }
131
+ if (!node.ok || !npm.ok) {
132
+ console.log('');
133
+ console.log('Install Node.js and npm first, then rerun:');
134
+ console.log(` pibo tools doctor ${name}`);
135
+ }
136
+ }
@@ -1,7 +1,9 @@
1
1
  import { existsSync } from 'node:fs';
2
+ import { ensureAgentBrowserWrapper } from './agent-browser-wrapper.js';
2
3
  import { detectDesktopEnv, hasDesktopDisplay, printDesktopEnvStatus, printLinuxVirtualDisplayHint } from './desktop-env.js';
3
- import { BROWSER_USE_GUIDE, REMOTE_BROWSER_GUIDE } from './guides.js';
4
+ import { AGENT_BROWSER_GUIDE, BROWSER_USE_GUIDE, RALPH_GUIDE, REMOTE_BROWSER_GUIDE } from './guides.js';
4
5
  import { ensureLinuxVirtualDisplay } from './linux-virtual-display.js';
6
+ import { getToolNpmRuntimePaths, installToolNpmRuntime, printToolNpmRuntimeDoctor, removeToolNpmRuntime, } from './npm-runtime.js';
5
7
  import { getToolPythonRuntimePaths, installToolPythonRuntime, runInheritedCommand, printToolPythonRuntimeDoctor, removeToolPythonRuntime, } from './python-runtime.js';
6
8
  const MAX_AGENT_CONTEXT_SNIPPET_LENGTH = 480;
7
9
  const INSTALLED_TOOLS_CONTEXT_PATH = '.pibo/context/installed-pibo-tools.md';
@@ -27,10 +29,53 @@ const REGISTRY = [
27
29
  agentContextSnippet: [
28
30
  'Browser automation CLI for frontend development and web testing.',
29
31
  'Start in one persistent shell with `eval "$(npm run --silent dev -- tools env browser-use)"`.',
30
- 'For authenticated Pibo Chat Web App testing, prefer `eval "$(npm run --silent dev -- tools browser-use lease acquire --app pibo-chat --owner "$USER")"`.',
32
+ 'For authenticated Pibo Chat Web App testing, prefer `eval "$(npm run --silent dev -- tools browser-use lease acquire --app pibo-chat --holder "$USER")"`.',
31
33
  'Discover details with `npm run dev -- tools show browser-use` and `npm run dev -- tools guide browser-use browser-use`.',
32
34
  ].join('\n'),
33
35
  },
36
+ {
37
+ name: 'agent-browser',
38
+ description: 'Fast native browser automation CLI for AI agents.',
39
+ kind: 'npm',
40
+ runtime: {
41
+ type: 'npm',
42
+ packageName: 'agent-browser@0.27.0',
43
+ executableName: 'agent-browser',
44
+ homeEnvVar: 'AGENT_BROWSER_HOME',
45
+ },
46
+ guides: [AGENT_BROWSER_GUIDE],
47
+ notes: [
48
+ 'Installed on demand into an isolated npm runtime.',
49
+ 'Pinned to agent-browser 0.27.0 so the CLI surface matches the bundled guide.',
50
+ 'The Pibo wrapper redirects HOME to AGENT_BROWSER_HOME by default so Agent Browser state stays in the tool home.',
51
+ 'The wrapper uses home/profiles/PIBo as the default browser profile for launch commands; pass --fresh-profile or explicit upstream flags to opt out.',
52
+ 'Use pibo tools agent-browser lease acquire for isolated authenticated browser slots when multiple agents need Chat Web App access.',
53
+ 'Guides are available through pibo tools guide and are not loaded into pibo profiles automatically.',
54
+ ],
55
+ agentContextSnippet: [
56
+ 'Browser automation CLI for frontend development and web testing.',
57
+ 'Start in one persistent shell with `eval "$(npm run --silent dev -- tools env agent-browser)"`.',
58
+ 'For authenticated Pibo Chat Web App testing, prefer `eval "$(npm run --silent dev -- tools agent-browser lease acquire --app pibo-chat --holder "$USER")"`.',
59
+ 'Discover details with `npm run dev -- tools show agent-browser` and `npm run dev -- tools guide agent-browser agent-browser`.',
60
+ ].join('\n'),
61
+ },
62
+ {
63
+ name: 'ralph',
64
+ description: 'Pibo-native continuous agent job runner for implementation and debugging loops.',
65
+ kind: 'internal',
66
+ guides: [RALPH_GUIDE],
67
+ notes: [
68
+ 'Ralph is built into the pibo CLI; no external runtime installation is required.',
69
+ 'Ralph jobs are app-global; use room targets or the shared default target when creating jobs.',
70
+ 'Prefer templates for repeatable jobs, and use --json for automation-safe inspection.',
71
+ ],
72
+ agentContextSnippet: [
73
+ 'Continuous Pibo agent job runner for implementation/debug loops.',
74
+ 'Use `pibo ralph templates`, then create with `pibo ralph add --template <id> --room <room-id> --start`.',
75
+ 'Inspect/control with `pibo ralph list --json`, `runs --job <id> --json`, `stop <id>`, `cancel <id>`.',
76
+ 'Guide: `pibo tools guide ralph ralph`.',
77
+ ].join('\n'),
78
+ },
34
79
  ];
35
80
  for (const entry of REGISTRY) {
36
81
  const snippet = entry.agentContextSnippet.trim();
@@ -48,7 +93,20 @@ export function findCliToolEntry(name) {
48
93
  return REGISTRY.find((entry) => entry.name === name);
49
94
  }
50
95
  export function getCliToolStatus(entry) {
51
- const paths = getToolPythonRuntimePaths(entry.name, entry.runtime);
96
+ if (entry.kind === 'internal') {
97
+ return {
98
+ entry,
99
+ installed: true,
100
+ executablePath: `pibo ${entry.name}`,
101
+ rootDir: '',
102
+ homeDir: '',
103
+ };
104
+ }
105
+ if (!entry.runtime)
106
+ throw new Error(`CLI tool "${entry.name}" is missing runtime`);
107
+ const paths = entry.runtime.type === 'npm'
108
+ ? getToolNpmRuntimePaths(entry.name, entry.runtime)
109
+ : getToolPythonRuntimePaths(entry.name, entry.runtime);
52
110
  return {
53
111
  entry,
54
112
  installed: existsSync(paths.executablePath),
@@ -90,25 +148,66 @@ export function getInstalledCliToolContextFile() {
90
148
  };
91
149
  }
92
150
  export async function installCliTool(entry, runSetup) {
151
+ if (entry.kind === 'internal') {
152
+ const status = getCliToolStatus(entry);
153
+ console.log(`Built-in ${entry.name}`);
154
+ console.log(` executable: ${status.executablePath}`);
155
+ console.log(` env: no extra environment required`);
156
+ return;
157
+ }
158
+ if (!entry.runtime)
159
+ throw new Error(`CLI tool "${entry.name}" is missing runtime`);
93
160
  if (runSetup) {
94
- if (entry.name === 'browser-use') {
161
+ if (entry.name === 'browser-use' || entry.name === 'agent-browser') {
95
162
  await ensureLinuxVirtualDisplay({ runInherited: runInheritedCommand });
96
163
  }
97
- await installToolPythonRuntime(entry.name, entry.runtime);
164
+ if (entry.runtime.type === 'npm') {
165
+ await installToolNpmRuntime(entry.name, entry.runtime);
166
+ }
167
+ else {
168
+ await installToolPythonRuntime(entry.name, entry.runtime);
169
+ }
98
170
  }
99
171
  const status = getCliToolStatus(entry);
172
+ if (entry.name === 'agent-browser')
173
+ ensureAgentBrowserWrapper(status);
100
174
  console.log(`${runSetup ? 'Installed' : 'Install target'} ${entry.name}`);
101
175
  console.log(` executable: ${status.executablePath}`);
102
176
  console.log(` home: ${status.homeDir}`);
103
177
  printDesktopEnvStatus(' ');
104
- if (entry.name === 'browser-use' && process.platform === 'linux' && !hasDesktopDisplay(detectDesktopEnv())) {
178
+ if ((entry.name === 'browser-use' || entry.name === 'agent-browser') && process.platform === 'linux' && !hasDesktopDisplay(detectDesktopEnv())) {
105
179
  printLinuxVirtualDisplayHint(' ');
106
180
  }
107
181
  console.log(` env: pibo tools env ${entry.name}`);
108
182
  }
109
183
  export async function removeCliTool(entry) {
110
- await removeToolPythonRuntime(entry.name, entry.runtime);
184
+ if (entry.kind === 'internal') {
185
+ console.log(`${entry.name} is built into pibo and cannot be removed separately.`);
186
+ return;
187
+ }
188
+ if (!entry.runtime)
189
+ throw new Error(`CLI tool "${entry.name}" is missing runtime`);
190
+ if (entry.runtime.type === 'npm') {
191
+ await removeToolNpmRuntime(entry.name, entry.runtime);
192
+ }
193
+ else {
194
+ await removeToolPythonRuntime(entry.name, entry.runtime);
195
+ }
111
196
  }
112
197
  export async function doctorCliTool(entry) {
113
- await printToolPythonRuntimeDoctor(entry.name, entry.runtime);
198
+ if (entry.kind === 'internal') {
199
+ console.log(`${entry.name}: ok`);
200
+ console.log(` executable: pibo ${entry.name}`);
201
+ return;
202
+ }
203
+ if (!entry.runtime)
204
+ throw new Error(`CLI tool "${entry.name}" is missing runtime`);
205
+ if (entry.name === 'agent-browser')
206
+ ensureAgentBrowserWrapper(getCliToolStatus(entry));
207
+ if (entry.runtime.type === 'npm') {
208
+ await printToolNpmRuntimeDoctor(entry.name, entry.runtime);
209
+ }
210
+ else {
211
+ await printToolPythonRuntimeDoctor(entry.name, entry.runtime);
212
+ }
114
213
  }
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./tool.js";
3
+ export * from "./registry.js";
@@ -0,0 +1,225 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import { isAbsolute, resolve } from "node:path";
4
+ import { NODE_RUNTIME_WORKER_SOURCE } from "./node-worker-source.js";
5
+ function resolveCwd(baseCwd, cwd) {
6
+ if (!cwd || cwd.trim().length === 0)
7
+ return baseCwd;
8
+ return isAbsolute(cwd) ? cwd : resolve(baseCwd, cwd);
9
+ }
10
+ function errorSummary(error, name = "RuntimeWorkerError") {
11
+ return error instanceof Error
12
+ ? { name: error.name || name, message: error.message, stack: error.stack }
13
+ : { name, message: String(error) };
14
+ }
15
+ function asErrorSummary(value) {
16
+ if (!value || typeof value !== "object")
17
+ return undefined;
18
+ const error = value;
19
+ return {
20
+ name: typeof error.name === "string" ? error.name : "RuntimeError",
21
+ message: typeof error.message === "string" ? error.message : "Runtime error",
22
+ line: typeof error.line === "number" ? error.line : undefined,
23
+ column: typeof error.column === "number" ? error.column : undefined,
24
+ traceback: typeof error.traceback === "string" ? error.traceback : undefined,
25
+ stack: typeof error.stack === "string" ? error.stack : undefined,
26
+ };
27
+ }
28
+ export class NodeRuntimeBackend {
29
+ cwd;
30
+ executable;
31
+ child;
32
+ pending = new Map();
33
+ requestCounter = 0;
34
+ alive = true;
35
+ diagnostics = "";
36
+ readyPromise;
37
+ readyResolve;
38
+ readyReject;
39
+ constructor(cwd, executable, args, env) {
40
+ this.cwd = cwd;
41
+ this.executable = executable;
42
+ this.readyPromise = new Promise((resolveReady, rejectReady) => {
43
+ this.readyResolve = resolveReady;
44
+ this.readyReject = rejectReady;
45
+ });
46
+ this.child = spawn(executable, [...args, "-e", NODE_RUNTIME_WORKER_SOURCE], {
47
+ cwd,
48
+ env: { ...process.env, ...(env ?? {}) },
49
+ stdio: "pipe",
50
+ });
51
+ const stdout = createInterface({ input: this.child.stdout });
52
+ stdout.on("line", (line) => this.handleLine(line));
53
+ this.child.stderr.on("data", (chunk) => {
54
+ this.diagnostics += String(chunk);
55
+ });
56
+ this.child.once("error", (error) => {
57
+ this.alive = false;
58
+ this.readyReject(error);
59
+ this.rejectAll(error);
60
+ });
61
+ this.child.once("close", (code, signal) => {
62
+ this.alive = false;
63
+ const error = new Error(`Node runtime worker exited with code ${code ?? "null"}${signal ? ` signal ${signal}` : ""}`);
64
+ this.readyReject(error);
65
+ this.rejectAll(error);
66
+ });
67
+ }
68
+ static async start(baseCwd, input) {
69
+ const target = input.target ?? {};
70
+ const backend = new NodeRuntimeBackend(resolveCwd(baseCwd, target.cwd), target.executable ?? "node", target.args ?? [], target.env);
71
+ await backend.waitReady(input.timeoutMs ?? 10000);
72
+ return backend;
73
+ }
74
+ isAlive() {
75
+ return this.alive && !this.child.killed;
76
+ }
77
+ getRecord() {
78
+ return { pid: this.child.pid, cwd: this.cwd, executable: this.executable };
79
+ }
80
+ async exec(input) {
81
+ const started = Date.now();
82
+ try {
83
+ const response = await this.request("exec", {
84
+ code: input.code,
85
+ mode: input.mode ?? "exec",
86
+ timeoutMs: input.timeoutMs ?? 30000,
87
+ }, input.timeoutMs ?? 30000);
88
+ return {
89
+ status: normalizeExecStatus(response),
90
+ sessionId: "",
91
+ stdout: response.stdout ?? "",
92
+ stderr: response.stderr ?? "",
93
+ result: response.result,
94
+ error: asErrorSummary(response.error),
95
+ durationMs: Date.now() - started,
96
+ };
97
+ }
98
+ catch (error) {
99
+ return {
100
+ status: error instanceof TimeoutError ? "timeout" : "failed",
101
+ sessionId: "",
102
+ durationMs: Date.now() - started,
103
+ error: errorSummary(error),
104
+ };
105
+ }
106
+ }
107
+ async inspect(input) {
108
+ try {
109
+ const response = await this.request("inspect", input, 15000);
110
+ return {
111
+ status: response.status === "ok" ? "ok" : "error",
112
+ sessionId: "",
113
+ summary: response.summary,
114
+ signature: response.signature,
115
+ members: response.members,
116
+ source: response.source,
117
+ doc: response.doc,
118
+ error: asErrorSummary(response.error),
119
+ };
120
+ }
121
+ catch (error) {
122
+ return { status: "failed", sessionId: "", error: errorSummary(error) };
123
+ }
124
+ }
125
+ async vars(input) {
126
+ try {
127
+ const response = await this.request("vars", input, 15000);
128
+ return {
129
+ status: response.status === "ok" ? "ok" : "failed",
130
+ sessionId: "",
131
+ variables: Array.isArray(response.variables) ? response.variables : [],
132
+ truncated: response.truncated,
133
+ error: asErrorSummary(response.error),
134
+ };
135
+ }
136
+ catch (error) {
137
+ return { status: "failed", sessionId: "", variables: [], error: errorSummary(error) };
138
+ }
139
+ }
140
+ async interrupt() {
141
+ if (!this.isAlive())
142
+ return { status: "failed", sessionId: "", message: "Runtime worker is not alive" };
143
+ this.child.kill("SIGINT");
144
+ return { status: "ok", sessionId: "", message: "Sent SIGINT to runtime worker" };
145
+ }
146
+ async close(force = false) {
147
+ if (!this.isAlive())
148
+ return;
149
+ if (force) {
150
+ this.child.kill("SIGKILL");
151
+ return;
152
+ }
153
+ try {
154
+ await this.request("shutdown", {}, 1000);
155
+ }
156
+ catch {
157
+ this.child.kill("SIGTERM");
158
+ }
159
+ }
160
+ waitReady(timeoutMs) {
161
+ return new Promise((resolveWait, rejectWait) => {
162
+ const timer = setTimeout(() => rejectWait(new Error(`Timed out waiting for Node runtime worker. ${this.diagnostics}`)), timeoutMs);
163
+ this.readyPromise.then(() => {
164
+ clearTimeout(timer);
165
+ resolveWait();
166
+ }, (error) => {
167
+ clearTimeout(timer);
168
+ rejectWait(error);
169
+ });
170
+ });
171
+ }
172
+ request(type, payload, timeoutMs) {
173
+ if (!this.isAlive())
174
+ return Promise.reject(new Error("Runtime worker is not alive"));
175
+ const id = `req_${++this.requestCounter}`;
176
+ return new Promise((resolveRequest, rejectRequest) => {
177
+ const timer = setTimeout(() => {
178
+ this.pending.delete(id);
179
+ rejectRequest(new TimeoutError(`Runtime request ${type} timed out after ${timeoutMs}ms`));
180
+ }, timeoutMs);
181
+ this.pending.set(id, { resolve: resolveRequest, reject: rejectRequest, timer });
182
+ this.child.stdin.write(`${JSON.stringify({ id, type, ...payload })}\n`);
183
+ });
184
+ }
185
+ handleLine(line) {
186
+ let response;
187
+ try {
188
+ response = JSON.parse(line);
189
+ }
190
+ catch {
191
+ this.alive = false;
192
+ this.rejectAll(new Error(`Invalid runtime worker protocol line: ${line}`));
193
+ this.child.kill("SIGTERM");
194
+ return;
195
+ }
196
+ if (response.id === "ready" && response.status === "ready") {
197
+ this.readyResolve();
198
+ return;
199
+ }
200
+ const id = typeof response.id === "string" ? response.id : undefined;
201
+ if (!id)
202
+ return;
203
+ const pending = this.pending.get(id);
204
+ if (!pending)
205
+ return;
206
+ this.pending.delete(id);
207
+ clearTimeout(pending.timer);
208
+ pending.resolve(response);
209
+ }
210
+ rejectAll(error) {
211
+ for (const [id, pending] of this.pending.entries()) {
212
+ this.pending.delete(id);
213
+ clearTimeout(pending.timer);
214
+ pending.reject(error);
215
+ }
216
+ }
217
+ }
218
+ function normalizeExecStatus(response) {
219
+ if (response.status === "ok")
220
+ return "ok";
221
+ const message = response.error?.message ?? "";
222
+ return message.includes("Script execution timed out") ? "timeout" : "error";
223
+ }
224
+ class TimeoutError extends Error {
225
+ }