@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,511 @@
1
+ import { spawn, execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { createConnection } from "node:net";
4
+ import { DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT } from "./protocol.js";
5
+ import { clearPidFile, readFallbackPidFile, readPidFile } from "./pidfile.js";
6
+ const execFileAsync = promisify(execFile);
7
+ export const RESTART_CONFIRMATION_TOKEN = "restart-active-agents";
8
+ function isPortReachable(host, port, timeout = 2000) {
9
+ return new Promise((resolve) => {
10
+ const socket = createConnection(port, host);
11
+ const onError = () => { socket.destroy(); resolve(false); };
12
+ socket.setTimeout(timeout);
13
+ socket.once("connect", () => { socket.destroy(); resolve(true); });
14
+ socket.once("error", onError);
15
+ socket.once("timeout", onError);
16
+ });
17
+ }
18
+ async function waitForGatewayUp(maxRetries = 30, intervalMs = 1000) {
19
+ for (let i = 0; i < maxRetries; i++) {
20
+ if (await isPortReachable(DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT, 2000))
21
+ return true;
22
+ await new Promise((r) => setTimeout(r, intervalMs));
23
+ }
24
+ return false;
25
+ }
26
+ async function waitForGatewayDown(maxRetries = 20, intervalMs = 500) {
27
+ for (let i = 0; i < maxRetries; i++) {
28
+ if (!(await isPortReachable(DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT, 1000)))
29
+ return true;
30
+ await new Promise((r) => setTimeout(r, intervalMs));
31
+ }
32
+ return false;
33
+ }
34
+ function resolveGatewayCommand(argv) {
35
+ if (argv[1] && (argv[1].endsWith(".js") || argv[1].endsWith(".ts") || argv[1].endsWith(".mjs"))) {
36
+ return { command: argv[0] ?? process.execPath, args: [argv[1], "gateway"] };
37
+ }
38
+ return { command: process.execPath, args: [argv[1] ?? "", "gateway"] };
39
+ }
40
+ function targetPort(target) {
41
+ const fromEnv = target === "web" ? process.env.PIBO_GATEWAY_WEB_PORT : process.env.PIBO_GATEWAY_DEV_PORT;
42
+ const parsed = fromEnv ? Number(fromEnv) : NaN;
43
+ if (Number.isInteger(parsed) && parsed > 0 && parsed <= 65535)
44
+ return parsed;
45
+ return target === "web" ? 4788 : 4808;
46
+ }
47
+ function expectedMode(target) {
48
+ return target === "web" ? "prod" : "dev";
49
+ }
50
+ function gatewayServiceName(target) {
51
+ const fromEnv = target === "web" ? process.env.PIBO_GATEWAY_WEB_SERVICE : process.env.PIBO_GATEWAY_DEV_SERVICE;
52
+ return fromEnv || (target === "web" ? "pibo-web" : "pibo-web-dev");
53
+ }
54
+ function gatewayManagerCommand() {
55
+ return process.env.PIBO_GATEWAY_MANAGER_COMMAND || "systemctl";
56
+ }
57
+ async function fetchJson(url) {
58
+ const response = await fetch(url, { signal: AbortSignal.timeout(3000) });
59
+ if (!response.ok)
60
+ throw new Error(`HTTP ${response.status}`);
61
+ return response.json();
62
+ }
63
+ function stringValue(value) { return typeof value === "string" ? value : undefined; }
64
+ function numberValue(value) { return typeof value === "number" && Number.isFinite(value) ? value : undefined; }
65
+ function booleanValue(value) { return typeof value === "boolean" ? value : undefined; }
66
+ function objectValue(value) {
67
+ return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
68
+ }
69
+ function runtimeTelemetryHint(value) {
70
+ const obj = objectValue(value);
71
+ if (!obj)
72
+ return undefined;
73
+ return {
74
+ source: stringValue(obj.source),
75
+ activeTurnId: stringValue(obj.activeTurnId),
76
+ activePhase: stringValue(obj.activePhase),
77
+ lastProgressAt: stringValue(obj.lastProgressAt),
78
+ staleForMs: numberValue(obj.staleForMs),
79
+ isStale: booleanValue(obj.isStale),
80
+ queueDepth: numberValue(obj.queueDepth),
81
+ thresholdMs: numberValue(obj.thresholdMs),
82
+ };
83
+ }
84
+ function runtimeStatus(value) {
85
+ const obj = objectValue(value);
86
+ if (!obj)
87
+ return undefined;
88
+ return {
89
+ piboSessionId: stringValue(obj.piboSessionId),
90
+ queuedMessages: numberValue(obj.queuedMessages),
91
+ processing: booleanValue(obj.processing),
92
+ streaming: booleanValue(obj.streaming),
93
+ activeTelemetry: runtimeTelemetryHint(obj.activeTelemetry),
94
+ };
95
+ }
96
+ function activeRun(value) {
97
+ const obj = objectValue(value);
98
+ if (!obj)
99
+ return undefined;
100
+ return {
101
+ runId: stringValue(obj.runId),
102
+ status: stringValue(obj.status),
103
+ toolName: stringValue(obj.toolName),
104
+ piboSessionId: stringValue(obj.piboSessionId),
105
+ };
106
+ }
107
+ function parseGatewaySafetyPayload(payload, reachable) {
108
+ const obj = objectValue(payload);
109
+ const mode = obj && (obj.mode === "dev" || obj.mode === "prod" || obj.mode === "fallback") ? obj.mode : "unknown";
110
+ const runtimeStatuses = Array.isArray(obj?.runtimeStatuses) ? obj.runtimeStatuses.map(runtimeStatus).filter((item) => Boolean(item)) : [];
111
+ const activeRuns = Array.isArray(obj?.activeRuns) ? obj.activeRuns.map(activeRun).filter((item) => Boolean(item)) : [];
112
+ return { reachable, mode, health: obj?.health, runtimeStatuses, activeRuns, ambiguous: booleanValue(obj?.ambiguous) };
113
+ }
114
+ export function checkActiveWork(status, target = "web") {
115
+ const reasons = [];
116
+ if (!status.reachable)
117
+ reasons.push("gateway is not reachable");
118
+ if (status.error)
119
+ reasons.push(`status unavailable: ${status.error}`);
120
+ if (status.mode !== expectedMode(target))
121
+ reasons.push(`gateway mode is ${status.mode}`);
122
+ if (status.ambiguous)
123
+ reasons.push("gateway state is ambiguous");
124
+ for (const session of status.runtimeStatuses) {
125
+ const id = session.piboSessionId ?? "unknown session";
126
+ if (session.processing === true)
127
+ reasons.push(`${id} is processing`);
128
+ if (session.streaming === true)
129
+ reasons.push(`${id} is streaming`);
130
+ if ((session.queuedMessages ?? 0) > 0)
131
+ reasons.push(`${id} has queued messages`);
132
+ if (session.activeTelemetry?.isStale === true) {
133
+ const phase = session.activeTelemetry.activePhase ? ` in ${session.activeTelemetry.activePhase}` : "";
134
+ reasons.push(`${id} has stale telemetry${phase}`);
135
+ }
136
+ }
137
+ for (const run of status.activeRuns)
138
+ reasons.push(`${run.runId ?? "yielded run"} is ${run.status ?? "active"}`);
139
+ return { unsafe: reasons.length > 0, reasons };
140
+ }
141
+ async function readGatewaySafetyStatus(target) {
142
+ const port = targetPort(target);
143
+ const reachable = await isPortReachable("127.0.0.1", port, 1500);
144
+ if (!reachable)
145
+ return { reachable: false, mode: "unknown", runtimeStatuses: [], activeRuns: [] };
146
+ try {
147
+ return parseGatewaySafetyPayload(await fetchJson(`http://127.0.0.1:${port}/gateway/status`), true);
148
+ }
149
+ catch (error) {
150
+ return { reachable: true, mode: "unknown", runtimeStatuses: [], activeRuns: [], error: error instanceof Error ? error.message : String(error) };
151
+ }
152
+ }
153
+ function printSafetyStatus(target, status) {
154
+ console.log(`${target === "web" ? "Production" : "Dev"} gateway status`);
155
+ console.log(` reachable: ${status.reachable ? "yes" : "no"}`);
156
+ console.log(` mode: ${status.mode}`);
157
+ if (status.error)
158
+ console.log(` status error: ${status.error}`);
159
+ console.log(` runtime sessions: ${status.runtimeStatuses.length}`);
160
+ for (const session of status.runtimeStatuses) {
161
+ console.log(` ${session.piboSessionId ?? "unknown"}: processing=${session.processing === true} streaming=${session.streaming === true} queued=${session.queuedMessages ?? 0}`);
162
+ if (session.activeTelemetry) {
163
+ const parts = [
164
+ session.activeTelemetry.activePhase ? `phase=${session.activeTelemetry.activePhase}` : undefined,
165
+ session.activeTelemetry.activeTurnId ? `turn=${session.activeTelemetry.activeTurnId}` : undefined,
166
+ typeof session.activeTelemetry.staleForMs === "number" ? `staleForMs=${session.activeTelemetry.staleForMs}` : undefined,
167
+ session.activeTelemetry.lastProgressAt ? `lastProgress=${session.activeTelemetry.lastProgressAt}` : undefined,
168
+ typeof session.activeTelemetry.thresholdMs === "number" ? `thresholdMs=${session.activeTelemetry.thresholdMs}` : undefined,
169
+ session.activeTelemetry.source ? `source=${session.activeTelemetry.source}` : undefined,
170
+ ].filter(Boolean).join(" ");
171
+ console.log(` telemetry: stale=${session.activeTelemetry.isStale === true}${parts ? ` ${parts}` : ""}`);
172
+ }
173
+ }
174
+ console.log(` active yielded runs: ${status.activeRuns.length}`);
175
+ for (const run of status.activeRuns)
176
+ console.log(` ${run.runId ?? "unknown"}: ${run.status ?? "active"}${run.toolName ? ` (${run.toolName})` : ""}`);
177
+ }
178
+ async function runGatewayManager(action, target) {
179
+ await execFileAsync(gatewayManagerCommand(), [action, gatewayServiceName(target)], { timeout: 60000 });
180
+ }
181
+ async function waitForManagedGatewayHealth(target) {
182
+ const retries = Number(process.env.PIBO_GATEWAY_HEALTH_RETRIES ?? 30);
183
+ const intervalMs = Number(process.env.PIBO_GATEWAY_HEALTH_INTERVAL_MS ?? 1000);
184
+ for (let i = 0; i < retries; i++) {
185
+ const status = await readGatewaySafetyStatus(target);
186
+ if (status.reachable && status.mode === expectedMode(target) && !status.error)
187
+ return status;
188
+ await new Promise((r) => setTimeout(r, intervalMs));
189
+ }
190
+ return undefined;
191
+ }
192
+ async function runManagedGatewayCommand(target, command, args) {
193
+ if (command === "status" || command === "doctor") {
194
+ const status = await readGatewaySafetyStatus(target);
195
+ printSafetyStatus(target, status);
196
+ if (target === "web") {
197
+ const active = checkActiveWork(status, target);
198
+ if (active.unsafe) {
199
+ console.log(" restart safety: blocked");
200
+ for (const reason of active.reasons)
201
+ console.log(` - ${reason}`);
202
+ }
203
+ else
204
+ console.log(" restart safety: idle");
205
+ }
206
+ if (command === "doctor")
207
+ process.exitCode = status.reachable && !status.error && status.mode === expectedMode(target) ? 0 : 1;
208
+ return true;
209
+ }
210
+ if (command === "start") {
211
+ const current = await readGatewaySafetyStatus(target);
212
+ if (current.reachable && current.mode === expectedMode(target) && !current.error) {
213
+ printSafetyStatus(target, current);
214
+ console.log("Gateway is already running.");
215
+ return true;
216
+ }
217
+ if (current.reachable) {
218
+ console.error("Start blocked: gateway state is ambiguous.");
219
+ printSafetyStatus(target, current);
220
+ process.exitCode = 1;
221
+ return true;
222
+ }
223
+ console.error(`Starting ${target === "web" ? "production" : "dev"} gateway...`);
224
+ try {
225
+ await runGatewayManager("start", target);
226
+ }
227
+ catch (error) {
228
+ console.error(error instanceof Error ? error.message : String(error));
229
+ process.exitCode = 1;
230
+ return true;
231
+ }
232
+ const status = await waitForManagedGatewayHealth(target);
233
+ if (!status) {
234
+ console.error("Gateway did not become healthy in time.");
235
+ process.exitCode = 1;
236
+ return true;
237
+ }
238
+ printSafetyStatus(target, status);
239
+ console.log("Gateway started successfully.");
240
+ return true;
241
+ }
242
+ if (command === "restart") {
243
+ const force = args.includes("--force");
244
+ const confirmIndex = args.indexOf("--confirm");
245
+ const confirmation = confirmIndex >= 0 ? args[confirmIndex + 1] : undefined;
246
+ if (force && confirmation !== RESTART_CONFIRMATION_TOKEN) {
247
+ console.error(`Force restart requires: --confirm ${RESTART_CONFIRMATION_TOKEN}`);
248
+ process.exitCode = 1;
249
+ return true;
250
+ }
251
+ if (target === "web" && !force) {
252
+ const active = checkActiveWork(await readGatewaySafetyStatus(target), target);
253
+ if (active.unsafe) {
254
+ console.error("Restart blocked: active agent work is running.");
255
+ console.error("Do not restart the gateway now.");
256
+ console.error("Ask the user before interrupting active sessions.");
257
+ for (const reason of active.reasons)
258
+ console.error(`- ${reason}`);
259
+ process.exitCode = 1;
260
+ return true;
261
+ }
262
+ }
263
+ console.error(`Restarting ${target === "web" ? "production" : "dev"} gateway...`);
264
+ try {
265
+ await runGatewayManager("restart", target);
266
+ }
267
+ catch (error) {
268
+ console.error(error instanceof Error ? error.message : String(error));
269
+ process.exitCode = 1;
270
+ return true;
271
+ }
272
+ const status = await waitForManagedGatewayHealth(target);
273
+ if (!status) {
274
+ console.error("Gateway did not become healthy in time.");
275
+ process.exitCode = 1;
276
+ return true;
277
+ }
278
+ printSafetyStatus(target, status);
279
+ console.log("Gateway restarted successfully.");
280
+ return true;
281
+ }
282
+ return false;
283
+ }
284
+ export async function runGatewayCli(argv = process.argv) {
285
+ const args = argv.slice(2);
286
+ const subcommand = args[1];
287
+ const hasForceFlag = args.includes("--force");
288
+ if (subcommand === "web" || subcommand === "dev") {
289
+ const handled = await runManagedGatewayCommand(subcommand, args[2], args.slice(3));
290
+ if (!handled) {
291
+ console.error(`Unknown gateway ${subcommand} subcommand: ${args[2] ?? ""}`);
292
+ printGatewayHelp();
293
+ process.exitCode = 1;
294
+ }
295
+ return;
296
+ }
297
+ if (subcommand === "status") {
298
+ const reachable = await isPortReachable(DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT);
299
+ const pid = readPidFile();
300
+ if (reachable)
301
+ console.log(`Gateway is running${pid ? ` (PID ${pid})` : ""} on ${DEFAULT_GATEWAY_HOST}:${DEFAULT_GATEWAY_PORT}`);
302
+ else {
303
+ console.log(`Gateway is not running on ${DEFAULT_GATEWAY_HOST}:${DEFAULT_GATEWAY_PORT}`);
304
+ process.exitCode = 1;
305
+ }
306
+ return;
307
+ }
308
+ if (subcommand === "stop") {
309
+ const pid = readPidFile();
310
+ const reachable = await isPortReachable(DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT);
311
+ if (!reachable && !pid) {
312
+ console.log("Gateway is not running.");
313
+ return;
314
+ }
315
+ if (pid) {
316
+ console.error(`Stopping gateway (PID ${pid})...`);
317
+ try {
318
+ process.kill(pid, "SIGTERM");
319
+ }
320
+ catch (err) {
321
+ console.error(`Warning: failed to kill PID ${pid}: ${err instanceof Error ? err.message : String(err)}`);
322
+ }
323
+ }
324
+ console.error("Waiting for gateway to shut down...");
325
+ const down = await waitForGatewayDown(20, 500);
326
+ if (!down && hasForceFlag && pid) {
327
+ console.error("Force-killing gateway...");
328
+ try {
329
+ process.kill(pid, "SIGKILL");
330
+ }
331
+ catch { }
332
+ const killed = await waitForGatewayDown(10, 500);
333
+ if (!killed) {
334
+ console.error("Gateway did not shut down even with SIGKILL.");
335
+ process.exitCode = 1;
336
+ return;
337
+ }
338
+ }
339
+ else if (!down) {
340
+ console.error("Gateway did not shut down gracefully. Use --force to kill.");
341
+ process.exitCode = 1;
342
+ return;
343
+ }
344
+ clearPidFile();
345
+ console.log("Gateway stopped.");
346
+ return;
347
+ }
348
+ if (subcommand === "restart") {
349
+ console.error("Checking gateway status...");
350
+ const wasRunning = await isPortReachable(DEFAULT_GATEWAY_HOST, DEFAULT_GATEWAY_PORT);
351
+ const pid = readPidFile();
352
+ if (wasRunning) {
353
+ if (pid) {
354
+ console.error(`Stopping gateway (PID ${pid})...`);
355
+ try {
356
+ process.kill(pid, "SIGTERM");
357
+ }
358
+ catch (err) {
359
+ console.error(`Warning: failed to kill PID ${pid}: ${err instanceof Error ? err.message : String(err)}`);
360
+ }
361
+ }
362
+ else
363
+ console.error("Gateway is running but PID file not found. Waiting for port to become free...");
364
+ console.error("Waiting for gateway to shut down...");
365
+ const down = await waitForGatewayDown(20, 500);
366
+ if (!down && hasForceFlag && pid) {
367
+ console.error("Force-killing gateway...");
368
+ try {
369
+ process.kill(pid, "SIGKILL");
370
+ }
371
+ catch { }
372
+ const killed = await waitForGatewayDown(10, 500);
373
+ if (!killed) {
374
+ console.error("Gateway did not shut down even with SIGKILL. Aborting restart.");
375
+ process.exitCode = 1;
376
+ return;
377
+ }
378
+ }
379
+ else if (!down) {
380
+ console.error("Gateway did not shut down gracefully. Use --force to kill. Aborting restart.");
381
+ process.exitCode = 1;
382
+ return;
383
+ }
384
+ }
385
+ else
386
+ console.error("Gateway was not running.");
387
+ clearPidFile();
388
+ console.error("Starting gateway...");
389
+ const { command, args: spawnArgs } = resolveGatewayCommand(argv);
390
+ const child = spawn(command, spawnArgs, { detached: true, stdio: "ignore" });
391
+ child.unref();
392
+ console.error("Waiting for gateway to come back online...");
393
+ const backOnline = await waitForGatewayUp(30, 1000);
394
+ if (backOnline) {
395
+ const newPid = readPidFile();
396
+ console.log(`Gateway restarted successfully${newPid ? ` (PID ${newPid})` : ""}`);
397
+ }
398
+ else {
399
+ console.error("Gateway did not come back online in time");
400
+ process.exitCode = 1;
401
+ }
402
+ return;
403
+ }
404
+ if (subcommand === "backup") {
405
+ const backupCommand = args[2];
406
+ const { installBackup, updateBackup, getBackupStatus, removeBackup } = await import("./backup.js");
407
+ if (backupCommand === "install") {
408
+ installBackup(args[3]);
409
+ return;
410
+ }
411
+ if (backupCommand === "update") {
412
+ updateBackup();
413
+ return;
414
+ }
415
+ if (backupCommand === "status") {
416
+ const status = getBackupStatus();
417
+ if (status) {
418
+ console.log("Backup installed at ~/.pibo/stable");
419
+ console.log(` Source: ${status.sourcePath}`);
420
+ console.log(` Commit: ${status.commit ?? "unknown"}`);
421
+ console.log(` Installed: ${status.installedAt}`);
422
+ }
423
+ else {
424
+ console.log("No backup installed.");
425
+ process.exitCode = 1;
426
+ }
427
+ return;
428
+ }
429
+ if (backupCommand === "remove") {
430
+ removeBackup();
431
+ return;
432
+ }
433
+ console.error(`Unknown backup subcommand: ${backupCommand}`);
434
+ printGatewayHelp();
435
+ process.exitCode = 1;
436
+ return;
437
+ }
438
+ if (subcommand === "fallback") {
439
+ const fallbackCommand = args[2];
440
+ const { FALLBACK_GATEWAY_PORT, FALLBACK_WEB_PORT } = await import("./fallback.js");
441
+ if (fallbackCommand === "start" || !fallbackCommand) {
442
+ const { startFallback } = await import("./fallback.js");
443
+ await startFallback();
444
+ return;
445
+ }
446
+ if (fallbackCommand === "stop") {
447
+ const { stopFallback } = await import("./fallback.js");
448
+ await stopFallback(hasForceFlag);
449
+ return;
450
+ }
451
+ if (fallbackCommand === "status") {
452
+ const pid = readFallbackPidFile();
453
+ if (pid)
454
+ console.log(`Fallback is running (PID ${pid}) on 127.0.0.1:${FALLBACK_GATEWAY_PORT} / http://127.0.0.1:${FALLBACK_WEB_PORT}`);
455
+ else {
456
+ console.log("Fallback is not running.");
457
+ process.exitCode = 1;
458
+ }
459
+ return;
460
+ }
461
+ if (fallbackCommand === "restart") {
462
+ const { stopFallback, startFallback } = await import("./fallback.js");
463
+ await stopFallback(hasForceFlag);
464
+ await startFallback();
465
+ return;
466
+ }
467
+ if (fallbackCommand === "run") {
468
+ const { runFallbackGatewayServer } = await import("./fallback.js");
469
+ await runFallbackGatewayServer();
470
+ return;
471
+ }
472
+ console.error(`Unknown fallback subcommand: ${fallbackCommand}`);
473
+ printGatewayHelp();
474
+ process.exitCode = 1;
475
+ return;
476
+ }
477
+ if (subcommand === "--help" || subcommand === "-h") {
478
+ printGatewayHelp();
479
+ return;
480
+ }
481
+ if (subcommand === "start" || !subcommand || subcommand.startsWith("-")) {
482
+ const { runGatewayServer } = await import("./server.js");
483
+ await runGatewayServer();
484
+ return;
485
+ }
486
+ console.error(`Unknown gateway subcommand: ${subcommand}`);
487
+ printGatewayHelp();
488
+ process.exitCode = 1;
489
+ }
490
+ function printGatewayHelp() {
491
+ console.log(`pibo gateway - Gateway management
492
+
493
+ Commands:
494
+ web status Inspect the production gateway
495
+ web start Start the production gateway
496
+ web restart Safely restart the production gateway
497
+ web doctor Check production gateway health
498
+ dev status Inspect the dev gateway
499
+ dev start Start the dev gateway
500
+ dev restart Restart the dev gateway
501
+ dev doctor Check dev gateway health
502
+
503
+ Options:
504
+ --force --confirm ${RESTART_CONFIRMATION_TOKEN}
505
+ Force a production restart after explicit confirmation
506
+
507
+ Next:
508
+ pibo gateway web status
509
+ pibo gateway dev status
510
+ `);
511
+ }
@@ -0,0 +1,155 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createConnection } from "node:net";
3
+ import { existsSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { clearFallbackPidFile, readFallbackPidFile, } from "./pidfile.js";
7
+ export const FALLBACK_GATEWAY_PORT = 4790;
8
+ export const FALLBACK_WEB_PORT = 4791;
9
+ export const FALLBACK_HOST = "0.0.0.0";
10
+ const BACKUP_DIR = join(homedir(), ".pibo", "stable");
11
+ const FALLBACK_BIN_PATH = join(BACKUP_DIR, "dist", "bin", "pibo.js");
12
+ function isPortReachable(host, port, timeout = 2000) {
13
+ return new Promise((resolve) => {
14
+ const socket = createConnection(port, host);
15
+ const onError = () => {
16
+ socket.destroy();
17
+ resolve(false);
18
+ };
19
+ socket.setTimeout(timeout);
20
+ socket.once("connect", () => {
21
+ socket.destroy();
22
+ resolve(true);
23
+ });
24
+ socket.once("error", onError);
25
+ socket.once("timeout", onError);
26
+ });
27
+ }
28
+ function waitForFallbackUp(maxRetries = 30, intervalMs = 1000) {
29
+ return new Promise((resolve) => {
30
+ const check = async () => {
31
+ for (let i = 0; i < maxRetries; i++) {
32
+ if (await isPortReachable("127.0.0.1", FALLBACK_GATEWAY_PORT, 2000)) {
33
+ try {
34
+ const res = await fetch(`http://127.0.0.1:${FALLBACK_WEB_PORT}/health`, {
35
+ signal: AbortSignal.timeout(2000),
36
+ });
37
+ if (res.ok) {
38
+ resolve(true);
39
+ return;
40
+ }
41
+ }
42
+ catch { }
43
+ }
44
+ await new Promise((r) => setTimeout(r, intervalMs));
45
+ }
46
+ resolve(false);
47
+ };
48
+ void check();
49
+ });
50
+ }
51
+ function waitForFallbackDown(maxRetries = 20, intervalMs = 500) {
52
+ return new Promise((resolve) => {
53
+ const check = async () => {
54
+ for (let i = 0; i < maxRetries; i++) {
55
+ if (!(await isPortReachable("127.0.0.1", FALLBACK_GATEWAY_PORT, 1000))) {
56
+ resolve(true);
57
+ return;
58
+ }
59
+ await new Promise((r) => setTimeout(r, intervalMs));
60
+ }
61
+ resolve(false);
62
+ };
63
+ void check();
64
+ });
65
+ }
66
+ export function getFallbackStatus() {
67
+ const pid = readFallbackPidFile();
68
+ return { running: pid !== undefined, pid: pid ?? undefined };
69
+ }
70
+ export function resolveFallbackWebGatewayServerOptions() {
71
+ return {
72
+ host: FALLBACK_HOST,
73
+ port: FALLBACK_GATEWAY_PORT,
74
+ web: { host: FALLBACK_HOST, port: FALLBACK_WEB_PORT },
75
+ };
76
+ }
77
+ export async function startFallback() {
78
+ if (!existsSync(BACKUP_DIR)) {
79
+ throw new Error(`No backup found at ${BACKUP_DIR}. Run "pibo gateway backup install" first.`);
80
+ }
81
+ if (!existsSync(FALLBACK_BIN_PATH)) {
82
+ throw new Error(`Fallback build not found at ${FALLBACK_BIN_PATH}. Run "pibo gateway backup update" first.`);
83
+ }
84
+ const status = getFallbackStatus();
85
+ if (status.running) {
86
+ console.log(`Fallback is already running (PID ${status.pid})`);
87
+ return;
88
+ }
89
+ if (await isPortReachable("127.0.0.1", FALLBACK_GATEWAY_PORT, 1000)) {
90
+ throw new Error(`Port ${FALLBACK_GATEWAY_PORT} is already in use`);
91
+ }
92
+ if (await isPortReachable("127.0.0.1", FALLBACK_WEB_PORT, 1000)) {
93
+ throw new Error(`Port ${FALLBACK_WEB_PORT} is already in use`);
94
+ }
95
+ const child = spawn(process.execPath, [FALLBACK_BIN_PATH, "gateway", "fallback", "run"], {
96
+ detached: true,
97
+ stdio: "ignore",
98
+ cwd: BACKUP_DIR,
99
+ env: { ...process.env, PIBO_FALLBACK_MODE: "1" },
100
+ });
101
+ child.unref();
102
+ console.error("Waiting for fallback gateway to come online...");
103
+ const up = await waitForFallbackUp(30, 1000);
104
+ if (!up) {
105
+ throw new Error("Fallback gateway did not come online in time");
106
+ }
107
+ console.log("Fallback gateway started");
108
+ console.log(` Gateway: 0.0.0.0:${FALLBACK_GATEWAY_PORT}`);
109
+ console.log(` Web App: http://0.0.0.0:${FALLBACK_WEB_PORT}/apps/chat`);
110
+ }
111
+ export async function runFallbackGatewayServer() {
112
+ if (process.env.PIBO_FALLBACK_MODE !== "1") {
113
+ throw new Error("gateway fallback run requires PIBO_FALLBACK_MODE=1");
114
+ }
115
+ const { runWebGatewayServer } = await import("./web.js");
116
+ await runWebGatewayServer(resolveFallbackWebGatewayServerOptions());
117
+ }
118
+ export async function stopFallback(force = false) {
119
+ const pid = readFallbackPidFile();
120
+ const reachable = await isPortReachable("127.0.0.1", FALLBACK_GATEWAY_PORT);
121
+ if (!reachable && !pid) {
122
+ console.log("Fallback is not running.");
123
+ clearFallbackPidFile();
124
+ return;
125
+ }
126
+ if (pid) {
127
+ console.error(`Stopping fallback (PID ${pid})...`);
128
+ try {
129
+ process.kill(pid, "SIGTERM");
130
+ }
131
+ catch { }
132
+ }
133
+ console.error("Waiting for fallback to shut down...");
134
+ const down = await waitForFallbackDown(20, 500);
135
+ if (!down && force && pid) {
136
+ console.error("Force-killing fallback...");
137
+ try {
138
+ process.kill(pid, "SIGKILL");
139
+ }
140
+ catch { }
141
+ const killed = await waitForFallbackDown(10, 500);
142
+ if (!killed) {
143
+ console.error("Fallback did not shut down even with SIGKILL.");
144
+ process.exitCode = 1;
145
+ return;
146
+ }
147
+ }
148
+ else if (!down) {
149
+ console.error("Fallback did not shut down gracefully. Use --force to kill.");
150
+ process.exitCode = 1;
151
+ return;
152
+ }
153
+ clearFallbackPidFile();
154
+ console.log("Fallback stopped.");
155
+ }