@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
@@ -1,218 +1 @@
1
- import { randomUUID } from "node:crypto";
2
- import { mkdirSync } from "node:fs";
3
- import { dirname, resolve } from "node:path";
4
- import { DatabaseSync } from "node:sqlite";
5
- export class ChatWebReadModel {
6
- db;
7
- constructor(path) {
8
- const resolvedPath = path === ":memory:" ? path : resolve(path);
9
- if (resolvedPath !== ":memory:") {
10
- mkdirSync(dirname(resolvedPath), { recursive: true });
11
- }
12
- this.db = new DatabaseSync(resolvedPath);
13
- this.db.exec("PRAGMA busy_timeout = 5000");
14
- if (resolvedPath !== ":memory:")
15
- this.db.exec("PRAGMA journal_mode = WAL");
16
- this.dropLegacySchema();
17
- this.db.exec(`
18
- CREATE TABLE IF NOT EXISTS web_chat_sessions (
19
- pibo_session_id TEXT PRIMARY KEY,
20
- pi_session_id TEXT NOT NULL,
21
- parent_id TEXT,
22
- profile TEXT NOT NULL,
23
- channel TEXT NOT NULL,
24
- kind TEXT NOT NULL,
25
- created_at TEXT NOT NULL,
26
- updated_at TEXT NOT NULL,
27
- last_activity_at TEXT,
28
- status TEXT NOT NULL DEFAULT 'idle'
29
- );
30
-
31
- CREATE TABLE IF NOT EXISTS web_chat_events (
32
- id TEXT PRIMARY KEY,
33
- pibo_session_id TEXT NOT NULL,
34
- event_sequence INTEGER,
35
- event_id TEXT,
36
- type TEXT NOT NULL,
37
- created_at TEXT NOT NULL,
38
- payload_json TEXT NOT NULL
39
- );
40
- `);
41
- this.migrateEventSequence();
42
- this.db.exec(`
43
-
44
- CREATE INDEX IF NOT EXISTS idx_web_chat_events_session_created
45
- ON web_chat_events(pibo_session_id, created_at, id);
46
- CREATE INDEX IF NOT EXISTS idx_web_chat_events_session_sequence
47
- ON web_chat_events(pibo_session_id, event_sequence, id);
48
- CREATE INDEX IF NOT EXISTS idx_web_chat_events_event_id
49
- ON web_chat_events(event_id);
50
- CREATE INDEX IF NOT EXISTS idx_web_chat_sessions_parent
51
- ON web_chat_sessions(parent_id);
52
- `);
53
- this.resetInterruptedSessions();
54
- }
55
- upsertSession(session, status = "idle") {
56
- this.db
57
- .prepare(`
58
- INSERT INTO web_chat_sessions (
59
- pibo_session_id,
60
- pi_session_id,
61
- parent_id,
62
- profile,
63
- channel,
64
- kind,
65
- created_at,
66
- updated_at,
67
- last_activity_at,
68
- status
69
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, ?)
70
- ON CONFLICT(pibo_session_id) DO UPDATE SET
71
- pi_session_id = excluded.pi_session_id,
72
- parent_id = excluded.parent_id,
73
- profile = excluded.profile,
74
- channel = excluded.channel,
75
- kind = excluded.kind,
76
- updated_at = excluded.updated_at,
77
- status = CASE
78
- WHEN web_chat_sessions.status = 'running' AND excluded.status = 'idle' THEN web_chat_sessions.status
79
- ELSE excluded.status
80
- END
81
- `)
82
- .run(session.id, session.piSessionId, session.parentId ?? null, session.profile, session.channel, session.kind, session.createdAt, session.updatedAt, status);
83
- }
84
- recordEvent(event, session) {
85
- if (session)
86
- this.upsertSession(session, statusFromEvent(event));
87
- const id = randomUUID();
88
- const createdAt = new Date().toISOString();
89
- const eventSequence = this.nextEventSequence(event.piboSessionId);
90
- const eventId = "eventId" in event && typeof event.eventId === "string" ? event.eventId : undefined;
91
- this.db
92
- .prepare("INSERT INTO web_chat_events (id, pibo_session_id, event_sequence, event_id, type, created_at, payload_json) VALUES (?, ?, ?, ?, ?, ?, ?)")
93
- .run(id, event.piboSessionId, eventSequence, eventId ?? null, event.type, createdAt, JSON.stringify(event));
94
- this.db
95
- .prepare("UPDATE web_chat_sessions SET last_activity_at = ?, status = ?, updated_at = ? WHERE pibo_session_id = ?")
96
- .run(createdAt, statusFromEvent(event), createdAt, event.piboSessionId);
97
- return { id, piboSessionId: event.piboSessionId, eventSequence, eventId, type: event.type, createdAt, payload: event };
98
- }
99
- listSessions() {
100
- return this.db.prepare("SELECT * FROM web_chat_sessions ORDER BY updated_at DESC").all().map(sessionFromRow);
101
- }
102
- listEvents(piboSessionId, limit = 1000) {
103
- const rows = this.db
104
- .prepare(`
105
- SELECT * FROM (
106
- SELECT rowid AS _rowid, * FROM web_chat_events
107
- WHERE pibo_session_id = ?
108
- ORDER BY event_sequence DESC, rowid DESC
109
- LIMIT ?
110
- )
111
- ORDER BY event_sequence ASC, _rowid ASC
112
- `)
113
- .all(piboSessionId, limit);
114
- return rows.map(eventFromRow);
115
- }
116
- listAllEvents(piboSessionId) {
117
- const rows = this.db
118
- .prepare(`
119
- SELECT rowid AS _rowid, * FROM web_chat_events
120
- WHERE pibo_session_id = ?
121
- ORDER BY event_sequence ASC, _rowid ASC
122
- `)
123
- .all(piboSessionId);
124
- return rows.map(eventFromRow);
125
- }
126
- getLatestEventSequence(piboSessionId) {
127
- const row = this.db
128
- .prepare("SELECT COALESCE(MAX(event_sequence), 0) AS latest_sequence FROM web_chat_events WHERE pibo_session_id = ?")
129
- .get(piboSessionId);
130
- return row.latest_sequence;
131
- }
132
- deleteSessions(piboSessionIds) {
133
- if (!piboSessionIds.length)
134
- return 0;
135
- const placeholders = piboSessionIds.map(() => "?").join(", ");
136
- this.db.prepare(`DELETE FROM web_chat_events WHERE pibo_session_id IN (${placeholders})`).run(...piboSessionIds);
137
- const result = this.db
138
- .prepare(`DELETE FROM web_chat_sessions WHERE pibo_session_id IN (${placeholders})`)
139
- .run(...piboSessionIds);
140
- return Number(result.changes ?? 0);
141
- }
142
- close() {
143
- this.db.close();
144
- }
145
- dropLegacySchema() {
146
- const sessionColumns = tableColumns(this.db, "web_chat_sessions");
147
- const eventColumns = tableColumns(this.db, "web_chat_events");
148
- if ((sessionColumns.size > 0 && !sessionColumns.has("pibo_session_id")) ||
149
- (eventColumns.size > 0 && !eventColumns.has("pibo_session_id"))) {
150
- this.db.exec(`
151
- DROP TABLE IF EXISTS web_chat_events;
152
- DROP TABLE IF EXISTS web_chat_sessions;
153
- `);
154
- }
155
- }
156
- migrateEventSequence() {
157
- const eventColumns = tableColumns(this.db, "web_chat_events");
158
- if (!eventColumns.has("event_sequence")) {
159
- this.db.exec("ALTER TABLE web_chat_events ADD COLUMN event_sequence INTEGER");
160
- }
161
- this.db.exec("UPDATE web_chat_events SET event_sequence = rowid WHERE event_sequence IS NULL");
162
- }
163
- nextEventSequence(piboSessionId) {
164
- const row = this.db
165
- .prepare("SELECT COALESCE(MAX(event_sequence), 0) + 1 AS next_sequence FROM web_chat_events WHERE pibo_session_id = ?")
166
- .get(piboSessionId);
167
- return row.next_sequence;
168
- }
169
- resetInterruptedSessions() {
170
- this.db.prepare("UPDATE web_chat_sessions SET status = 'idle' WHERE status = 'running'").run();
171
- }
172
- }
173
- export function createDefaultChatWebReadModel(cwd = process.cwd()) {
174
- return new ChatWebReadModel(resolve(cwd, ".pibo/web-chat.sqlite"));
175
- }
176
- function statusFromEvent(event) {
177
- if (event.type === "session_error")
178
- return "error";
179
- if (event.type === "message_started" ||
180
- event.type === "assistant_delta" ||
181
- event.type === "thinking_started" ||
182
- event.type === "thinking_delta" ||
183
- event.type === "thinking_finished" ||
184
- event.type === "subagent_session" ||
185
- event.type === "tool_execution_started" ||
186
- event.type === "tool_execution_updated") {
187
- return "running";
188
- }
189
- return "idle";
190
- }
191
- function sessionFromRow(row) {
192
- return {
193
- piboSessionId: row.pibo_session_id,
194
- piSessionId: row.pi_session_id,
195
- parentId: row.parent_id ?? undefined,
196
- profile: row.profile,
197
- channel: row.channel,
198
- kind: row.kind,
199
- createdAt: row.created_at,
200
- updatedAt: row.updated_at,
201
- lastActivityAt: row.last_activity_at ?? undefined,
202
- status: row.status === "running" || row.status === "error" ? row.status : "idle",
203
- };
204
- }
205
- function eventFromRow(row) {
206
- return {
207
- id: row.id,
208
- piboSessionId: row.pibo_session_id,
209
- eventSequence: row.event_sequence ?? undefined,
210
- eventId: row.event_id ?? undefined,
211
- type: row.type,
212
- createdAt: row.created_at,
213
- payload: JSON.parse(row.payload_json),
214
- };
215
- }
216
- function tableColumns(db, tableName) {
217
- return new Set(db.prepare(`PRAGMA table_info(${tableName})`).all().map((column) => column.name));
218
- }
1
+ export {};
@@ -1,321 +1 @@
1
- import { randomUUID } from "node:crypto";
2
- import { mkdirSync } from "node:fs";
3
- import { dirname, resolve } from "node:path";
4
- import { DatabaseSync } from "node:sqlite";
5
- export const CHAT_ROOM_ID_METADATA_KEY = "chatRoomId";
6
- const CHAT_ROOM_ARCHIVED_AT_METADATA_KEY = "chatRoomArchivedAt";
7
- const CHAT_ROOM_WORKSPACE_METADATA_KEY = "workspace";
8
- export class PiboRoomStore {
9
- db;
10
- constructor(path) {
11
- const resolvedPath = path === ":memory:" ? path : resolve(path);
12
- if (resolvedPath !== ":memory:") {
13
- mkdirSync(dirname(resolvedPath), { recursive: true });
14
- }
15
- this.db = new DatabaseSync(resolvedPath);
16
- this.db.exec("PRAGMA busy_timeout = 5000");
17
- if (resolvedPath !== ":memory:")
18
- this.db.exec("PRAGMA journal_mode = WAL");
19
- this.db.exec(`
20
- CREATE TABLE IF NOT EXISTS pibo_rooms (
21
- id TEXT PRIMARY KEY,
22
- owner_scope TEXT NOT NULL,
23
- name TEXT NOT NULL,
24
- topic TEXT,
25
- type TEXT NOT NULL,
26
- parent_room_id TEXT,
27
- created_at TEXT NOT NULL,
28
- updated_at TEXT NOT NULL,
29
- retention_policy_id TEXT,
30
- metadata_json TEXT,
31
- FOREIGN KEY(parent_room_id) REFERENCES pibo_rooms(id)
32
- );
33
-
34
- CREATE TABLE IF NOT EXISTS pibo_room_members (
35
- room_id TEXT NOT NULL,
36
- principal_id TEXT NOT NULL,
37
- role TEXT NOT NULL,
38
- joined_at TEXT NOT NULL,
39
- last_read_stream_id INTEGER,
40
- PRIMARY KEY(room_id, principal_id),
41
- FOREIGN KEY(room_id) REFERENCES pibo_rooms(id)
42
- );
43
-
44
- CREATE INDEX IF NOT EXISTS idx_pibo_rooms_owner
45
- ON pibo_rooms(owner_scope, updated_at);
46
- CREATE INDEX IF NOT EXISTS idx_pibo_rooms_parent
47
- ON pibo_rooms(parent_room_id, updated_at);
48
- CREATE INDEX IF NOT EXISTS idx_pibo_room_members_principal
49
- ON pibo_room_members(principal_id, room_id);
50
- `);
51
- }
52
- createRoom(input) {
53
- const now = new Date().toISOString();
54
- const room = {
55
- id: input.id ?? `room_${randomUUID()}`,
56
- ownerScope: input.ownerScope,
57
- name: input.name,
58
- topic: input.topic,
59
- workspace: roomWorkspaceFromMetadata(input.metadata),
60
- type: input.type ?? "chat",
61
- parentRoomId: input.parentRoomId,
62
- createdAt: now,
63
- updatedAt: now,
64
- retentionPolicyId: input.retentionPolicyId,
65
- metadata: input.metadata ?? {},
66
- };
67
- this.db
68
- .prepare(`
69
- INSERT INTO pibo_rooms (
70
- id,
71
- owner_scope,
72
- name,
73
- topic,
74
- type,
75
- parent_room_id,
76
- created_at,
77
- updated_at,
78
- retention_policy_id,
79
- metadata_json
80
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
81
- `)
82
- .run(room.id, room.ownerScope, room.name, room.topic ?? null, room.type, room.parentRoomId ?? null, room.createdAt, room.updatedAt, room.retentionPolicyId ?? null, JSON.stringify(room.metadata));
83
- return room;
84
- }
85
- updateRoom(id, input) {
86
- const existing = this.getRoom(id);
87
- if (!existing)
88
- return undefined;
89
- const updated = {
90
- ...existing,
91
- name: input.name ?? existing.name,
92
- topic: input.topic === null ? undefined : input.topic ?? existing.topic,
93
- workspace: roomWorkspaceFromMetadata(input.metadata ?? existing.metadata),
94
- parentRoomId: input.parentRoomId === null ? undefined : input.parentRoomId ?? existing.parentRoomId,
95
- retentionPolicyId: input.retentionPolicyId === null ? undefined : input.retentionPolicyId ?? existing.retentionPolicyId,
96
- metadata: input.metadata ?? existing.metadata,
97
- updatedAt: new Date().toISOString(),
98
- };
99
- this.db
100
- .prepare(`
101
- UPDATE pibo_rooms SET
102
- name = ?,
103
- topic = ?,
104
- parent_room_id = ?,
105
- updated_at = ?,
106
- retention_policy_id = ?,
107
- metadata_json = ?
108
- WHERE id = ?
109
- `)
110
- .run(updated.name, updated.topic ?? null, updated.parentRoomId ?? null, updated.updatedAt, updated.retentionPolicyId ?? null, JSON.stringify(updated.metadata), id);
111
- return this.getRoom(id);
112
- }
113
- deleteRooms(ids) {
114
- if (!ids.length)
115
- return 0;
116
- const placeholders = ids.map(() => "?").join(", ");
117
- this.db.prepare(`DELETE FROM pibo_room_members WHERE room_id IN (${placeholders})`).run(...ids);
118
- const result = this.db.prepare(`DELETE FROM pibo_rooms WHERE id IN (${placeholders})`).run(...ids);
119
- return Number(result.changes ?? 0);
120
- }
121
- getRoom(id) {
122
- const row = this.db.prepare("SELECT * FROM pibo_rooms WHERE id = ?").get(id);
123
- return row ? roomFromRow(row) : undefined;
124
- }
125
- listRooms(ownerScope) {
126
- return this.db
127
- .prepare("SELECT * FROM pibo_rooms WHERE owner_scope = ? ORDER BY updated_at DESC, id ASC")
128
- .all(ownerScope).map(roomFromRow);
129
- }
130
- listRoomTree(ownerScope) {
131
- const rooms = this.listRooms(ownerScope);
132
- const byId = new Map();
133
- for (const room of rooms)
134
- byId.set(room.id, { ...room, children: [] });
135
- const roots = [];
136
- for (const node of byId.values()) {
137
- const parent = node.parentRoomId ? byId.get(node.parentRoomId) : undefined;
138
- if (parent) {
139
- parent.children.push(node);
140
- }
141
- else {
142
- roots.push(node);
143
- }
144
- }
145
- sortRoomNodes(roots);
146
- return roots;
147
- }
148
- listRoomSubtree(roomId) {
149
- const root = this.getRoom(roomId);
150
- if (!root)
151
- return [];
152
- const rooms = this.listRooms(root.ownerScope);
153
- const byParent = new Map();
154
- for (const room of rooms) {
155
- if (!room.parentRoomId)
156
- continue;
157
- const children = byParent.get(room.parentRoomId) ?? [];
158
- children.push(room);
159
- byParent.set(room.parentRoomId, children);
160
- }
161
- const result = [];
162
- const visit = (room) => {
163
- result.push(room);
164
- for (const child of byParent.get(room.id) ?? [])
165
- visit(child);
166
- };
167
- visit(root);
168
- return result;
169
- }
170
- ensureDefaultRoom(input) {
171
- const existing = this.listRooms(input.ownerScope).find((room) => room.metadata.default === true);
172
- if (existing) {
173
- this.ensureMember({
174
- roomId: existing.id,
175
- principalId: input.principalId,
176
- role: "owner",
177
- });
178
- return existing;
179
- }
180
- const room = this.createRoom({
181
- ownerScope: input.ownerScope,
182
- name: input.name ?? "Personal Chat",
183
- type: "chat",
184
- metadata: { default: true },
185
- });
186
- this.ensureMember({ roomId: room.id, principalId: input.principalId, role: "owner" });
187
- return room;
188
- }
189
- ensureMember(input) {
190
- const now = new Date().toISOString();
191
- this.db
192
- .prepare(`
193
- INSERT INTO pibo_room_members (room_id, principal_id, role, joined_at, last_read_stream_id)
194
- VALUES (?, ?, ?, ?, NULL)
195
- ON CONFLICT(room_id, principal_id) DO UPDATE SET
196
- role = CASE
197
- WHEN pibo_room_members.role = 'owner' THEN pibo_room_members.role
198
- ELSE excluded.role
199
- END
200
- `)
201
- .run(input.roomId, input.principalId, input.role, now);
202
- const member = this.getMember(input.roomId, input.principalId);
203
- if (!member)
204
- throw new Error(`Failed to create room member for "${input.roomId}"`);
205
- return member;
206
- }
207
- getMember(roomId, principalId) {
208
- const row = this.db
209
- .prepare("SELECT * FROM pibo_room_members WHERE room_id = ? AND principal_id = ?")
210
- .get(roomId, principalId);
211
- return row ? memberFromRow(row) : undefined;
212
- }
213
- updateReadCursor(roomId, principalId, lastReadStreamId) {
214
- this.db
215
- .prepare(`
216
- UPDATE pibo_room_members
217
- SET last_read_stream_id = MAX(COALESCE(last_read_stream_id, 0), ?)
218
- WHERE room_id = ? AND principal_id = ?
219
- `)
220
- .run(lastReadStreamId, roomId, principalId);
221
- return this.getMember(roomId, principalId);
222
- }
223
- requireRoomAccess(roomId, principalId, action = "read") {
224
- const room = this.getRoom(roomId);
225
- const member = room ? this.getMember(roomId, principalId) : undefined;
226
- if (!room || !member)
227
- throw new Error("Room is not available for this user");
228
- if (action === "write" && member.role === "viewer")
229
- throw new Error("Room write access is required");
230
- if (action === "admin" && member.role !== "owner" && member.role !== "admin") {
231
- throw new Error("Room admin access is required");
232
- }
233
- return room;
234
- }
235
- close() {
236
- this.db.close();
237
- }
238
- }
239
- export function createDefaultPiboRoomStore(cwd = process.cwd()) {
240
- return new PiboRoomStore(resolve(cwd, ".pibo/web-chat.sqlite"));
241
- }
242
- export function chatRoomIdFromMetadata(metadata) {
243
- const value = metadata?.[CHAT_ROOM_ID_METADATA_KEY];
244
- return typeof value === "string" && value.length > 0 ? value : undefined;
245
- }
246
- export function withChatRoomId(metadata, roomId) {
247
- return { ...(metadata ?? {}), [CHAT_ROOM_ID_METADATA_KEY]: roomId };
248
- }
249
- export function isDefaultPiboRoom(room) {
250
- return room.metadata.default === true;
251
- }
252
- export function isPiboRoomArchived(room) {
253
- return typeof room.metadata[CHAT_ROOM_ARCHIVED_AT_METADATA_KEY] === "string";
254
- }
255
- export function roomWorkspaceFromMetadata(metadata) {
256
- const value = metadata?.[CHAT_ROOM_WORKSPACE_METADATA_KEY];
257
- return typeof value === "string" && value.length > 0 ? value : undefined;
258
- }
259
- export function withPiboRoomArchived(metadata, archived) {
260
- const next = { ...(metadata ?? {}) };
261
- if (archived) {
262
- next[CHAT_ROOM_ARCHIVED_AT_METADATA_KEY] = new Date().toISOString();
263
- }
264
- else {
265
- delete next[CHAT_ROOM_ARCHIVED_AT_METADATA_KEY];
266
- }
267
- return next;
268
- }
269
- export function withPiboRoomWorkspace(metadata, workspace) {
270
- const next = { ...(metadata ?? {}) };
271
- if (workspace) {
272
- next[CHAT_ROOM_WORKSPACE_METADATA_KEY] = workspace;
273
- }
274
- else {
275
- delete next[CHAT_ROOM_WORKSPACE_METADATA_KEY];
276
- }
277
- return next;
278
- }
279
- function roomFromRow(row) {
280
- const metadata = parseMetadata(row.metadata_json);
281
- return {
282
- id: row.id,
283
- ownerScope: row.owner_scope,
284
- name: row.name,
285
- topic: row.topic ?? undefined,
286
- workspace: roomWorkspaceFromMetadata(metadata),
287
- type: row.type,
288
- parentRoomId: row.parent_room_id ?? undefined,
289
- createdAt: row.created_at,
290
- updatedAt: row.updated_at,
291
- retentionPolicyId: row.retention_policy_id ?? undefined,
292
- metadata,
293
- };
294
- }
295
- function memberFromRow(row) {
296
- return {
297
- roomId: row.room_id,
298
- principalId: row.principal_id,
299
- role: row.role,
300
- joinedAt: row.joined_at,
301
- lastReadStreamId: row.last_read_stream_id ?? undefined,
302
- };
303
- }
304
- function parseMetadata(value) {
305
- if (!value)
306
- return {};
307
- try {
308
- const parsed = JSON.parse(value);
309
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
310
- return {};
311
- return parsed;
312
- }
313
- catch {
314
- return {};
315
- }
316
- }
317
- function sortRoomNodes(nodes) {
318
- nodes.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt) || left.name.localeCompare(right.name));
319
- for (const node of nodes)
320
- sortRoomNodes(node.children);
321
- }
1
+ export { CHAT_ROOM_ID_METADATA_KEY, chatRoomIdFromMetadata, isDefaultPiboRoom, isPiboRoomArchived, roomWorkspaceFromMetadata, withChatRoomId, withPiboRoomArchived, withPiboRoomWorkspace, } from "./types/rooms.js";