@pasko70/pibo 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/README.md +106 -254
  2. package/context/codex-base-prompt.md +4 -0
  3. package/context/compute-worker.md +23 -0
  4. package/context/pibo-native-tooling.md +18 -0
  5. package/context/pibo-system-prompt.md +69 -8
  6. package/dist/api/simple-agent-api.js +136 -0
  7. package/dist/app-context.js +4 -0
  8. package/dist/apps/chat/agent-profiles.js +18 -3
  9. package/dist/apps/chat/agent-store.js +113 -16
  10. package/dist/apps/chat/chat-api-routes.js +311 -0
  11. package/dist/apps/chat/chat-capability-routes.js +90 -0
  12. package/dist/apps/chat/chat-files.js +178 -0
  13. package/dist/apps/chat/chat-request-normalizers.js +681 -0
  14. package/dist/apps/chat/chat-settings-routes.js +75 -0
  15. package/dist/apps/chat/chat-trace-helpers.js +94 -0
  16. package/dist/apps/chat/chat-user-skill-routes.js +149 -0
  17. package/dist/apps/chat/cron-api.js +213 -0
  18. package/dist/apps/chat/data/chat-data-mappers.js +74 -0
  19. package/dist/apps/chat/data/event-command-service.js +75 -0
  20. package/dist/apps/chat/data/navigation-query-service.js +11 -0
  21. package/dist/apps/chat/data/project-service.js +844 -0
  22. package/dist/apps/chat/data/read-state-service.js +42 -0
  23. package/dist/apps/chat/data/room-service.js +52 -0
  24. package/dist/apps/chat/data/session-query-service.js +63 -0
  25. package/dist/apps/chat/data/timeline-query-service.js +96 -0
  26. package/dist/apps/chat/event-log.js +1 -307
  27. package/dist/apps/chat/model-catalog.js +7 -2
  28. package/dist/apps/chat/output-compactor.js +126 -0
  29. package/dist/apps/chat/output-event-policy.js +17 -0
  30. package/dist/apps/chat/project-workflow-human-actions.js +347 -0
  31. package/dist/apps/chat/project-workflow-sessions.js +260 -0
  32. package/dist/apps/chat/provider-auth-actions.js +43 -0
  33. package/dist/apps/chat/ralph-api.js +156 -0
  34. package/dist/apps/chat/read-model.js +1 -218
  35. package/dist/apps/chat/rooms.js +1 -321
  36. package/dist/apps/chat/static-assets.js +996 -0
  37. package/dist/apps/chat/stream.js +29 -6
  38. package/dist/apps/chat/trace.js +179 -1003
  39. package/dist/apps/chat/types/event-store.js +1 -0
  40. package/dist/apps/chat/types/read-model.js +1 -0
  41. package/dist/apps/chat/types/rooms.js +36 -0
  42. package/dist/apps/chat/web-app.js +3131 -1959
  43. package/dist/apps/chat/workflow-catalog.js +572 -0
  44. package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
  45. package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
  46. package/dist/apps/chat/workflow-persistence-model.js +140 -0
  47. package/dist/apps/chat/workflow-persistence.js +633 -0
  48. package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
  49. package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
  50. package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
  51. package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
  52. package/dist/apps/chat/workflow-validation-helpers.js +114 -0
  53. package/dist/apps/chat-ui/assets/{dist-CNLWH2qh.js → dist-B4lw9z4F.js} +1 -1
  54. package/dist/apps/chat-ui/assets/{dist-8e4L8ciw.js → dist-BbTaHWON.js} +1 -1
  55. package/dist/apps/chat-ui/assets/{dist-CMZOa5ik.js → dist-BcT_c1EJ.js} +1 -1
  56. package/dist/apps/chat-ui/assets/{dist-DNcnQRPF.js → dist-CGINd7XU.js} +1 -1
  57. package/dist/apps/chat-ui/assets/{dist-CqqUC8Ce.js → dist-CrBzZkUp.js} +1 -1
  58. package/dist/apps/chat-ui/assets/{dist-D2N4-LIc.js → dist-CyyISotB.js} +1 -1
  59. package/dist/apps/chat-ui/assets/{dist-CUqpST5w.js → dist-DFbnFNpX.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dist-CspjOeBj.js → dist-DGLWQLX8.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dist-B7bbI3Qz.js → dist-DfcIkFSN.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dist-v4pjHlB7.js → dist-sKDHTwaT.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{dist-D9L4MSRF.js → dist-y9D6la48.js} +1 -1
  64. package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
  65. package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
  66. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
  67. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
  68. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
  69. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
  70. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
  71. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
  72. package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
  73. package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
  74. package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
  75. package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
  76. package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
  77. package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
  78. package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
  79. package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
  80. package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
  81. package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
  82. package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
  83. package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
  84. package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
  85. package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
  86. package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
  87. package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
  88. package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
  89. package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
  90. package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
  91. package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
  92. package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
  93. package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
  94. package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
  95. package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
  96. package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
  97. package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
  98. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
  99. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
  100. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
  101. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
  102. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
  103. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
  104. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
  105. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
  106. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
  107. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
  108. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
  109. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
  110. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
  111. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
  112. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
  113. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
  114. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
  115. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
  116. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
  117. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
  118. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
  119. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
  120. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
  121. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
  122. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
  123. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
  124. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
  125. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
  126. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
  127. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
  128. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
  129. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
  130. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
  131. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
  132. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
  133. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
  134. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
  135. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
  136. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
  137. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
  138. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
  139. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
  140. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
  141. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
  142. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
  143. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
  144. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
  145. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
  146. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
  147. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
  148. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
  149. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
  150. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
  151. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
  152. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
  153. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
  154. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
  155. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
  156. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
  157. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
  158. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
  159. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
  160. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
  161. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
  162. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
  163. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
  164. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
  165. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
  166. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
  167. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
  168. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
  169. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
  170. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
  171. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
  172. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
  173. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
  174. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
  175. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
  176. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
  177. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
  178. package/dist/apps/chat-ui/index.html +8 -3
  179. package/dist/apps/chat-ui/manifest.webmanifest +25 -0
  180. package/dist/apps/chat-ui/sw.js +41 -0
  181. package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
  182. package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
  183. package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
  184. package/dist/apps/cli-ui/InkTerminalView.js +25 -0
  185. package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
  186. package/dist/apps/cli-ui/index.js +8 -0
  187. package/dist/apps/cli-ui/inkColors.js +67 -0
  188. package/dist/apps/cli-ui/inkJson.js +244 -0
  189. package/dist/apps/cli-ui/inkMarkdown.js +122 -0
  190. package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
  191. package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
  192. package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
  193. package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
  194. package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
  195. package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
  196. package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
  197. package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
  198. package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
  199. package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
  200. package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
  201. package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
  202. package/dist/apps/context-files-ui/index.html +2 -2
  203. package/dist/auth/better-auth.js +2 -1
  204. package/dist/auth/login-actions.js +251 -0
  205. package/dist/auth/openai-codex-usage.js +147 -0
  206. package/dist/bin/pibo.js +0 -0
  207. package/dist/bin/rg.js +15 -0
  208. package/dist/cli-session/fakeSessionSource.js +804 -0
  209. package/dist/cli-session/index.js +3 -0
  210. package/dist/cli-session/localSessionSource.js +1144 -0
  211. package/dist/cli-session/sessionSource.js +13 -0
  212. package/dist/cli.js +142 -14
  213. package/dist/compute/cli.js +415 -0
  214. package/dist/compute/docker.js +827 -0
  215. package/dist/compute/resource-health.js +333 -0
  216. package/dist/compute/resource-policy.js +98 -0
  217. package/dist/config/config.js +9 -5
  218. package/dist/core/context-build.js +677 -0
  219. package/dist/core/model-defaults.js +51 -9
  220. package/dist/core/pibo-home.js +8 -0
  221. package/dist/core/profiles.js +48 -0
  222. package/dist/core/provider-telemetry.js +222 -0
  223. package/dist/core/routed-session.js +441 -47
  224. package/dist/core/runtime-telemetry.js +853 -0
  225. package/dist/core/runtime.js +103 -15
  226. package/dist/core/session-errors.js +47 -0
  227. package/dist/core/session-model.js +39 -0
  228. package/dist/core/session-router.js +292 -62
  229. package/dist/core/shared-app.js +17 -0
  230. package/dist/core/skill-expansion.js +43 -0
  231. package/dist/core/system-prompt-template.js +9 -9
  232. package/dist/core/telemetry-staleness.js +128 -0
  233. package/dist/core/test-output-compaction.js +145 -0
  234. package/dist/core/user-settings.js +73 -0
  235. package/dist/cron/channel.js +28 -0
  236. package/dist/cron/cli.js +230 -0
  237. package/dist/cron/plugin.js +11 -0
  238. package/dist/cron/schedule.js +214 -0
  239. package/dist/cron/service.js +177 -0
  240. package/dist/cron/store.js +349 -0
  241. package/dist/cron/types.js +1 -0
  242. package/dist/data/cli.js +184 -0
  243. package/dist/data/event-log.js +106 -0
  244. package/dist/data/final-app-space-cutover-migration.js +728 -0
  245. package/dist/data/ingest-service.js +389 -0
  246. package/dist/data/message-store.js +62 -0
  247. package/dist/data/navigation-store.js +75 -0
  248. package/dist/data/observation-store.js +46 -0
  249. package/dist/data/payload-store.js +144 -0
  250. package/dist/data/pibo-store.js +59 -0
  251. package/dist/data/schema.js +434 -0
  252. package/dist/data/session-store.js +63 -0
  253. package/dist/data/shared-app-migration.js +757 -0
  254. package/dist/data/sqlite-schema.js +12 -0
  255. package/dist/data/telemetry-preview.js +65 -0
  256. package/dist/data/telemetry-queries.js +212 -0
  257. package/dist/data/telemetry-retention.js +50 -0
  258. package/dist/data/telemetry-rows.js +158 -0
  259. package/dist/data/telemetry.js +357 -0
  260. package/dist/debug/delta-compaction.js +99 -0
  261. package/dist/debug/detail-format.js +86 -0
  262. package/dist/debug/events.js +149 -29
  263. package/dist/debug/failures.js +162 -0
  264. package/dist/debug/index.js +655 -30
  265. package/dist/debug/messages.js +185 -0
  266. package/dist/debug/next-commands.js +6 -0
  267. package/dist/debug/payloads.js +123 -0
  268. package/dist/debug/pty.js +924 -0
  269. package/dist/debug/session.js +45 -15
  270. package/dist/debug/sql.js +1 -1
  271. package/dist/debug/stores.js +18 -13
  272. package/dist/debug/summary.js +72 -0
  273. package/dist/debug/telemetry.js +649 -0
  274. package/dist/debug/tools.js +168 -0
  275. package/dist/debug/trace-render-check.js +151 -0
  276. package/dist/debug/trace.js +152 -27
  277. package/dist/debug/web-artifacts.js +63 -0
  278. package/dist/debug/web-options.js +313 -0
  279. package/dist/debug/web-render-analysis.js +310 -0
  280. package/dist/debug/web-snapshot-browser-scripts.js +303 -0
  281. package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
  282. package/dist/debug/web-streaming-browser-library.js +928 -0
  283. package/dist/debug/web-streaming-browser-scripts.js +242 -0
  284. package/dist/debug/web-streaming-provider-telemetry.js +194 -0
  285. package/dist/debug/web-streaming-report.js +493 -0
  286. package/dist/debug/web-streaming-types.js +1 -0
  287. package/dist/debug/web.js +574 -0
  288. package/dist/gateway/backup.js +83 -0
  289. package/dist/gateway/cli.js +511 -0
  290. package/dist/gateway/fallback.js +155 -0
  291. package/dist/gateway/pidfile.js +84 -0
  292. package/dist/gateway/protocol.js +16 -0
  293. package/dist/gateway/server.js +172 -17
  294. package/dist/gateway/tool.js +54 -51
  295. package/dist/gateway/web.js +74 -2
  296. package/dist/index.js +3 -1
  297. package/dist/local/client.js +3 -3
  298. package/dist/local/extension.js +8 -5
  299. package/dist/plugins/builtin.js +251 -49
  300. package/dist/plugins/chat-vscode-web.js +28 -0
  301. package/dist/plugins/codex-compat.js +0 -41
  302. package/dist/plugins/context-files.js +98 -18
  303. package/dist/plugins/dev-auth.js +124 -0
  304. package/dist/plugins/native-tooling.js +15 -0
  305. package/dist/plugins/registry.js +49 -1
  306. package/dist/plugins/web-annotations.js +27 -0
  307. package/dist/providers/minimax.js +70 -0
  308. package/dist/providers/openai-compat.js +48 -0
  309. package/dist/ralph/channel.js +8 -0
  310. package/dist/ralph/cli.js +152 -0
  311. package/dist/ralph/plugin.js +14 -0
  312. package/dist/ralph/service.js +271 -0
  313. package/dist/ralph/stopping.js +151 -0
  314. package/dist/ralph/store.js +450 -0
  315. package/dist/ralph/templates.js +200 -0
  316. package/dist/ralph/types.js +1 -0
  317. package/dist/reliability/store.js +42 -26
  318. package/dist/runs/registry.js +72 -35
  319. package/dist/session-ui/commandCatalog.js +193 -0
  320. package/dist/session-ui/commandResults.js +95 -0
  321. package/dist/session-ui/index.js +7 -0
  322. package/dist/session-ui/ownerViewModel.js +27 -0
  323. package/dist/session-ui/roomSessionViewModel.js +69 -0
  324. package/dist/session-ui/statusViewModel.js +127 -0
  325. package/dist/session-ui/terminalCards.js +210 -0
  326. package/dist/session-ui/terminalRows.js +937 -0
  327. package/dist/session-ui/terminalValue.js +45 -0
  328. package/dist/sessions/pibo-data-store.js +178 -0
  329. package/dist/sessions/sqlite-store.js +78 -12
  330. package/dist/sessions/store.js +11 -4
  331. package/dist/sessions/workflow-session-kind.js +20 -0
  332. package/dist/setup/cli.js +567 -0
  333. package/dist/shared/trace-async-agent-runs.js +127 -0
  334. package/dist/shared/trace-engine.js +96 -0
  335. package/dist/shared/trace-event-projection.js +679 -0
  336. package/dist/shared/trace-live-reducer.js +191 -0
  337. package/dist/shared/trace-nodes.js +76 -0
  338. package/dist/shared/trace-order.js +11 -10
  339. package/dist/shared/trace-patch-nodes.js +83 -0
  340. package/dist/shared/trace-run-notifications.js +69 -0
  341. package/dist/shared/trace-subagent-links.js +46 -0
  342. package/dist/shared/trace-transcript.js +303 -0
  343. package/dist/shared/trace-types.js +1 -0
  344. package/dist/shared-app.js +4 -0
  345. package/dist/signals/aggregate.js +65 -0
  346. package/dist/signals/events.js +1 -0
  347. package/dist/signals/projector.js +158 -0
  348. package/dist/signals/registry.js +513 -0
  349. package/dist/signals/store.js +1 -0
  350. package/dist/signals/types.js +1 -0
  351. package/dist/skills/cli.js +117 -0
  352. package/dist/tools/agent-browser-leases.js +219 -0
  353. package/dist/tools/agent-browser-wrapper.js +99 -0
  354. package/dist/tools/browser-pool.js +623 -0
  355. package/dist/tools/browser-use-cdp.js +56 -4
  356. package/dist/tools/browser-use-leases.js +215 -37
  357. package/dist/tools/browser-use-wrapper.js +508 -65
  358. package/dist/tools/cdp-client.js +189 -0
  359. package/dist/tools/guides.js +203 -4
  360. package/dist/tools/index.js +666 -16
  361. package/dist/tools/npm-runtime.js +136 -0
  362. package/dist/tools/registry.js +107 -8
  363. package/dist/tools/runtime/index.js +3 -0
  364. package/dist/tools/runtime/node-backend.js +225 -0
  365. package/dist/tools/runtime/node-worker-source.js +206 -0
  366. package/dist/tools/runtime/python-backend.js +227 -0
  367. package/dist/tools/runtime/python-worker-source.js +178 -0
  368. package/dist/tools/runtime/registry.js +255 -0
  369. package/dist/tools/runtime/tool.js +168 -0
  370. package/dist/tools/runtime/types.js +1 -0
  371. package/dist/tools/web-search.js +2 -1
  372. package/dist/user-skills/installer.js +39 -36
  373. package/dist/user-skills/store.js +50 -11
  374. package/dist/web/auth.js +5 -1
  375. package/dist/web/channel.js +86 -0
  376. package/dist/web/http.js +79 -14
  377. package/dist/web-annotations/api.js +348 -0
  378. package/dist/web-annotations/attachments.js +201 -0
  379. package/dist/web-annotations/cdp.js +1107 -0
  380. package/dist/web-annotations/index.js +7 -0
  381. package/dist/web-annotations/store.js +407 -0
  382. package/dist/web-annotations/tools.js +350 -0
  383. package/dist/web-annotations/types.js +34 -0
  384. package/dist/web-annotations/validation.js +288 -0
  385. package/docs/README.md +23 -0
  386. package/docs/ops/install-developer-host.md +112 -0
  387. package/docs/ops/install-user-host.md +76 -0
  388. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  389. package/package.json +24 -10
  390. package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
  391. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  392. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  393. package/skills/builtin/prd/SKILL.md +143 -0
  394. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  395. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  396. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  397. package/skills/builtin/skill-creator/SKILL.md +513 -0
  398. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  399. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  400. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  401. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  402. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  403. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  404. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  405. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  406. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  407. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  408. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  409. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  410. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  411. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  412. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  413. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  414. package/skills/builtin/web-annotations/SKILL.md +93 -0
  415. package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
  416. package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
  417. package/dist/env.js +0 -32
  418. package/dist/plugins/core-tools.js +0 -94
  419. package/dist/plugins/example.js +0 -67
  420. package/dist/plugins/remote-agent.js +0 -9
  421. package/dist/remote/channel.js +0 -176
  422. package/dist/remote/client.js +0 -92
  423. package/dist/remote/examples/tui-controller.js +0 -263
  424. package/dist/remote/protocol.js +0 -55
  425. package/dist/remote/session-client.js +0 -189
  426. package/dist/sessions/bindings.js +0 -41
@@ -0,0 +1,42 @@
1
+ export class ChatReadStateService {
2
+ store;
3
+ constructor(store) {
4
+ this.store = store;
5
+ }
6
+ markSessionRead(piboSessionId, lastReadStreamId) {
7
+ const now = new Date().toISOString();
8
+ this.store.db.prepare(`
9
+ INSERT INTO app_session_read_state (session_id, last_read_stream_id, last_read_at, updated_at)
10
+ VALUES (?, ?, ?, ?)
11
+ ON CONFLICT(session_id) DO UPDATE SET
12
+ last_read_stream_id = MAX(app_session_read_state.last_read_stream_id, excluded.last_read_stream_id),
13
+ last_read_at = excluded.last_read_at,
14
+ updated_at = excluded.updated_at
15
+ `).run(piboSessionId, lastReadStreamId, now, now);
16
+ }
17
+ countUnreadMessagesBySession(input) {
18
+ const counts = new Map();
19
+ if (!input.piboSessionIds.length)
20
+ return counts;
21
+ for (let offset = 0; offset < input.piboSessionIds.length; offset += 400) {
22
+ const ids = [...new Set(input.piboSessionIds)].slice(offset, offset + 400);
23
+ const placeholders = ids.map(() => "?").join(", ");
24
+ const rows = this.store.db.prepare(`
25
+ SELECT e.session_id, COUNT(*) AS count
26
+ FROM event_log e
27
+ LEFT JOIN app_session_read_state reads ON reads.session_id = e.session_id
28
+ WHERE e.session_id IN (${placeholders})
29
+ AND e.stream_id > COALESCE(reads.last_read_stream_id, 0)
30
+ AND (
31
+ (e.retention_class = 'chat_message' AND e.type IN ('user.message.accepted', 'assistant_message'))
32
+ OR e.type = 'session_error'
33
+ )
34
+ GROUP BY e.session_id
35
+ `).all(...ids);
36
+ for (const row of rows)
37
+ if (Number(row.count) > 0)
38
+ counts.set(row.session_id, Number(row.count));
39
+ }
40
+ return counts;
41
+ }
42
+ }
@@ -0,0 +1,52 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { roomWorkspaceFromMetadata } from "../types/rooms.js";
3
+ import { roomFromRow } from "./chat-data-mappers.js";
4
+ export class ChatRoomService {
5
+ store;
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+ createRoom(input) {
10
+ const now = new Date().toISOString();
11
+ const room = { id: input.id ?? `room_${randomUUID()}`, name: input.name, topic: input.topic, workspace: roomWorkspaceFromMetadata(input.metadata), type: input.type ?? "chat", parentRoomId: input.parentRoomId, createdAt: now, updatedAt: now, retentionPolicyId: input.retentionPolicyId, metadata: input.metadata ?? {} };
12
+ const columns = ["id", "name", "topic", "type", "parent_room_id", "workspace", "retention_policy_id", "metadata_json", "created_at", "updated_at"];
13
+ this.store.db.prepare(`INSERT INTO rooms (${columns.join(", ")}) VALUES (${columns.map(() => "?").join(", ")})`).run(room.id, room.name, room.topic ?? null, room.type, room.parentRoomId ?? null, room.workspace ?? null, room.retentionPolicyId ?? null, JSON.stringify(room.metadata), room.createdAt, room.updatedAt);
14
+ return room;
15
+ }
16
+ updateRoom(id, input) {
17
+ const existing = this.getRoom(id);
18
+ if (!existing)
19
+ return undefined;
20
+ const metadata = input.metadata ?? existing.metadata;
21
+ const updated = { ...existing, name: input.name ?? existing.name, topic: input.topic === null ? undefined : input.topic ?? existing.topic, parentRoomId: input.parentRoomId === null ? undefined : input.parentRoomId ?? existing.parentRoomId, retentionPolicyId: input.retentionPolicyId === null ? undefined : input.retentionPolicyId ?? existing.retentionPolicyId, metadata, workspace: roomWorkspaceFromMetadata(metadata), updatedAt: new Date().toISOString() };
22
+ this.store.db.prepare("UPDATE rooms SET name = ?, topic = ?, parent_room_id = ?, workspace = ?, retention_policy_id = ?, metadata_json = ?, updated_at = ? WHERE id = ?").run(updated.name, updated.topic ?? null, updated.parentRoomId ?? null, updated.workspace ?? null, updated.retentionPolicyId ?? null, JSON.stringify(updated.metadata), updated.updatedAt, id);
23
+ return this.getRoom(id);
24
+ }
25
+ deleteRooms(ids) {
26
+ if (!ids.length)
27
+ return 0;
28
+ const placeholders = ids.map(() => "?").join(", ");
29
+ const result = this.store.db.prepare(`DELETE FROM rooms WHERE id IN (${placeholders})`).run(...ids);
30
+ return Number(result.changes ?? 0);
31
+ }
32
+ getRoom(id) { const row = this.store.db.prepare("SELECT * FROM rooms WHERE id = ?").get(id); return row ? roomFromRow(row) : undefined; }
33
+ listRooms() { return this.store.db.prepare("SELECT * FROM rooms ORDER BY updated_at DESC, id ASC").all().map(roomFromRow); }
34
+ listRoomTree() { const byId = new Map(this.listRooms().map((room) => [room.id, { ...room, children: [] }])); const roots = []; for (const node of byId.values()) {
35
+ const parent = node.parentRoomId ? byId.get(node.parentRoomId) : undefined;
36
+ if (parent)
37
+ parent.children.push(node);
38
+ else
39
+ roots.push(node);
40
+ } return roots; }
41
+ listRoomSubtree(roomId) { const root = this.getRoom(roomId); if (!root)
42
+ return []; const rooms = this.listRooms(); const byParent = new Map(); for (const room of rooms)
43
+ if (room.parentRoomId)
44
+ byParent.set(room.parentRoomId, [...(byParent.get(room.parentRoomId) ?? []), room]); const result = []; const visit = (room) => { result.push(room); for (const child of byParent.get(room.id) ?? [])
45
+ visit(child); }; visit(root); return result; }
46
+ ensureDefaultRoom(input = {}) { const existing = this.store.db.prepare("SELECT * FROM rooms WHERE json_extract(metadata_json, '$.default') IS 1 ORDER BY updated_at DESC, id ASC LIMIT 1").get(); if (existing)
47
+ return roomFromRow(existing); return this.createRoom({ name: input.name ?? "Shared Chat", type: "chat", metadata: { default: true } }); }
48
+ updateReadCursor(roomId, lastReadStreamId) { const now = new Date().toISOString(); this.store.db.prepare("INSERT INTO app_room_read_state (room_id, last_read_stream_id, last_read_at, updated_at) VALUES (?, ?, ?, ?) ON CONFLICT(room_id) DO UPDATE SET last_read_stream_id = MAX(app_room_read_state.last_read_stream_id, excluded.last_read_stream_id), last_read_at = excluded.last_read_at, updated_at = excluded.updated_at").run(roomId, lastReadStreamId, now, now); }
49
+ requireRoom(roomId) { const room = this.getRoom(roomId); if (!room)
50
+ throw new Error("Room not found"); return room; }
51
+ close() { }
52
+ }
@@ -0,0 +1,63 @@
1
+ import { chatRoomIdFromMetadata } from "../types/rooms.js";
2
+ import { sessionFromRow, statusFromOutputEvent } from "./chat-data-mappers.js";
3
+ export class ChatSessionQueryService {
4
+ store;
5
+ constructor(store) {
6
+ this.store = store;
7
+ }
8
+ upsertSession(session, status = "idle") {
9
+ const roomId = chatRoomIdFromMetadata(session.metadata) ?? "room_default";
10
+ this.store.sessions.upsertSession({ session, roomId, status, lastActivityAt: session.updatedAt });
11
+ this.upsertNavigation(session, roomId, status, session.updatedAt);
12
+ }
13
+ upsertSessionsIfChanged(sessions) {
14
+ for (const session of sessions)
15
+ this.upsertSession(session);
16
+ return { checked: sessions.length, written: sessions.length, skipped: 0 };
17
+ }
18
+ recordEvent(event, session) {
19
+ if (session)
20
+ this.upsertSession(session, statusFromOutputEvent(event));
21
+ return undefined;
22
+ }
23
+ listSessions() {
24
+ const rows = this.store.db.prepare("SELECT * FROM sessions WHERE deleted_at IS NULL ORDER BY last_activity_at DESC, created_at DESC").all();
25
+ return rows.map(sessionFromRow);
26
+ }
27
+ getSession(piboSessionId) {
28
+ const row = this.store.db.prepare("SELECT * FROM sessions WHERE id = ? AND deleted_at IS NULL").get(piboSessionId);
29
+ return row ? sessionFromRow(row) : undefined;
30
+ }
31
+ hasSessionActivity(piboSessionId) {
32
+ const row = this.store.db.prepare("SELECT 1 AS found FROM event_log WHERE session_id = ? AND type NOT IN ('assistant_delta', 'thinking_delta', 'tool_execution_updated') LIMIT 1").get(piboSessionId);
33
+ return Boolean(row) || this.getSession(piboSessionId)?.status === "running";
34
+ }
35
+ deleteSessions(piboSessionIds) {
36
+ if (!piboSessionIds.length)
37
+ return 0;
38
+ const placeholders = piboSessionIds.map(() => "?").join(", ");
39
+ this.store.db.prepare(`DELETE FROM observations WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
40
+ this.store.db.prepare(`DELETE FROM chat_messages WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
41
+ this.store.db.prepare(`DELETE FROM event_log WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
42
+ this.store.db.prepare(`DELETE FROM session_navigation WHERE session_id IN (${placeholders})`).run(...piboSessionIds);
43
+ const result = this.store.db.prepare(`UPDATE sessions SET deleted_at = COALESCE(deleted_at, ?) WHERE id IN (${placeholders})`).run(new Date().toISOString(), ...piboSessionIds);
44
+ return Number(result.changes ?? 0);
45
+ }
46
+ close() { }
47
+ upsertNavigation(session, roomId, status, now) {
48
+ this.store.navigation.upsertSession({
49
+ roomId,
50
+ sessionId: session.id,
51
+ rootSessionId: session.parentId ? (typeof session.metadata?.rootSessionId === "string" ? session.metadata.rootSessionId : session.parentId) : session.id,
52
+ parentId: session.parentId,
53
+ originId: session.originId,
54
+ title: session.title || "Untitled Session",
55
+ profile: session.profile,
56
+ status,
57
+ archivedAt: typeof session.metadata?.archivedAt === "string" ? session.metadata.archivedAt : undefined,
58
+ lastActivityAt: now,
59
+ sortKey: now,
60
+ updatedAt: now,
61
+ });
62
+ }
63
+ }
@@ -0,0 +1,96 @@
1
+ import { storedChatEventFromV2Row, storedPiboEventFromV2Row } from "./chat-data-mappers.js";
2
+ export class ChatTimelineQueryService {
3
+ store;
4
+ constructor(store) {
5
+ this.store = store;
6
+ }
7
+ listEvents(input = {}) {
8
+ const clauses = [];
9
+ const values = [];
10
+ if (input.roomId) {
11
+ clauses.push("room_id = ?");
12
+ values.push(input.roomId);
13
+ }
14
+ if (input.piboSessionId) {
15
+ clauses.push("session_id = ?");
16
+ values.push(input.piboSessionId);
17
+ }
18
+ if (input.afterStreamId !== undefined) {
19
+ clauses.push("stream_id > ?");
20
+ values.push(input.afterStreamId);
21
+ }
22
+ const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
23
+ const limit = Math.max(1, Math.min(input.limit ?? 1000, 5000));
24
+ const rows = this.store.db.prepare(`SELECT * FROM event_log ${where} ORDER BY stream_id ASC LIMIT ?`).all(...values, limit);
25
+ return rows.map(storedChatEventFromV2Row);
26
+ }
27
+ listSessionEvents(piboSessionId, limit = 1000) {
28
+ return this.listTraceEvents({ piboSessionId, limit, includeLive: true });
29
+ }
30
+ listAllSessionEvents(piboSessionId) {
31
+ return this.listTraceEvents({ piboSessionId, limit: 10000, includeLive: true });
32
+ }
33
+ listTraceEvents(input) {
34
+ const piboSessionId = typeof input === "string" ? input : input.piboSessionId;
35
+ const limit = Math.max(1, Math.min((typeof input === "string" ? undefined : input.limit) ?? 2000, 10000));
36
+ const beforeOrAtSequence = typeof input === "string" ? undefined : input.beforeOrAtSequence;
37
+ const beforeSequence = typeof input === "string" ? undefined : input.beforeSequence;
38
+ const includeLive = typeof input === "string" ? false : input.includeLive === true;
39
+ const clauses = ["session_id = ?"];
40
+ const values = [piboSessionId];
41
+ if (!includeLive)
42
+ clauses.push("type NOT IN ('assistant_delta', 'thinking_delta', 'tool_execution_updated')");
43
+ if (beforeSequence !== undefined) {
44
+ clauses.push("session_sequence < ?");
45
+ values.push(beforeSequence);
46
+ }
47
+ else if (beforeOrAtSequence !== undefined) {
48
+ clauses.push("session_sequence <= ?");
49
+ values.push(beforeOrAtSequence);
50
+ }
51
+ const rows = this.store.db.prepare(`
52
+ SELECT * FROM (
53
+ SELECT * FROM event_log
54
+ WHERE ${clauses.join(" AND ")}
55
+ ORDER BY session_sequence DESC, stream_id DESC
56
+ LIMIT ?
57
+ )
58
+ ORDER BY session_sequence ASC, stream_id ASC
59
+ `).all(...values, limit);
60
+ return rows.map(storedPiboEventFromV2Row).filter((event) => event !== undefined);
61
+ }
62
+ countEventsByType(input = {}) {
63
+ const clauses = [];
64
+ const values = [];
65
+ if (input.piboSessionId) {
66
+ clauses.push("session_id = ?");
67
+ values.push(input.piboSessionId);
68
+ }
69
+ if (input.eventTypes?.length) {
70
+ clauses.push(`type IN (${input.eventTypes.map(() => "?").join(", ")})`);
71
+ values.push(...input.eventTypes);
72
+ }
73
+ const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
74
+ const rows = this.store.db.prepare(`SELECT type, COUNT(*) AS count FROM event_log ${where} GROUP BY type ORDER BY type`).all(...values);
75
+ return rows.map((row) => ({ eventType: row.type, count: Number(row.count) }));
76
+ }
77
+ getLatestEventSequence(piboSessionId) {
78
+ const row = this.store.db.prepare("SELECT COALESCE(MAX(session_sequence), 0) AS latest_sequence FROM event_log WHERE session_id = ?").get(piboSessionId);
79
+ return row.latest_sequence;
80
+ }
81
+ getLatestStreamId(input = {}) {
82
+ const clauses = [];
83
+ const values = [];
84
+ if (input.roomId) {
85
+ clauses.push("room_id = ?");
86
+ values.push(input.roomId);
87
+ }
88
+ if (input.piboSessionId) {
89
+ clauses.push("session_id = ?");
90
+ values.push(input.piboSessionId);
91
+ }
92
+ const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
93
+ const row = this.store.db.prepare(`SELECT MAX(stream_id) AS stream_id FROM event_log ${where}`).get(...values);
94
+ return row?.stream_id ?? undefined;
95
+ }
96
+ }
@@ -1,307 +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 ChatEventLog {
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.db.exec(`
17
- CREATE TABLE IF NOT EXISTS chat_events (
18
- stream_id INTEGER PRIMARY KEY,
19
- room_id TEXT,
20
- pibo_session_id TEXT,
21
- event_id TEXT NOT NULL,
22
- event_type TEXT NOT NULL,
23
- actor_type TEXT,
24
- actor_id TEXT,
25
- client_txn_id TEXT,
26
- created_at TEXT NOT NULL,
27
- retention_class TEXT NOT NULL,
28
- payload_json TEXT NOT NULL
29
- );
30
-
31
- CREATE INDEX IF NOT EXISTS idx_chat_events_room_stream
32
- ON chat_events(room_id, stream_id);
33
- CREATE INDEX IF NOT EXISTS idx_chat_events_session_stream
34
- ON chat_events(pibo_session_id, stream_id);
35
- CREATE INDEX IF NOT EXISTS idx_chat_events_event_id
36
- ON chat_events(event_id);
37
- CREATE UNIQUE INDEX IF NOT EXISTS idx_chat_events_client_txn
38
- ON chat_events(room_id, actor_id, client_txn_id)
39
- WHERE client_txn_id IS NOT NULL;
40
-
41
- CREATE TABLE IF NOT EXISTS chat_retention_policies (
42
- id TEXT PRIMARY KEY,
43
- delete_live_deltas_after_ms INTEGER,
44
- delete_trace_events_after_ms INTEGER,
45
- delete_chat_messages_after_ms INTEGER
46
- );
47
-
48
- CREATE TABLE IF NOT EXISTS chat_session_reads (
49
- pibo_session_id TEXT NOT NULL,
50
- principal_id TEXT NOT NULL,
51
- last_read_stream_id INTEGER NOT NULL,
52
- updated_at TEXT NOT NULL,
53
- PRIMARY KEY(pibo_session_id, principal_id)
54
- );
55
- `);
56
- }
57
- appendEvent(input) {
58
- const eventId = input.eventId ?? `ce_${randomUUID()}`;
59
- const createdAt = input.createdAt ?? new Date().toISOString();
60
- const payloadJson = JSON.stringify(input.payload);
61
- const result = this.db
62
- .prepare(`
63
- INSERT OR IGNORE INTO chat_events (
64
- room_id,
65
- pibo_session_id,
66
- event_id,
67
- event_type,
68
- actor_type,
69
- actor_id,
70
- client_txn_id,
71
- created_at,
72
- retention_class,
73
- payload_json
74
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
75
- `)
76
- .run(input.roomId ?? null, input.piboSessionId ?? null, eventId, input.eventType, input.actorType ?? null, input.actorId ?? null, input.clientTxnId ?? null, createdAt, input.retentionClass, payloadJson);
77
- if (input.clientTxnId) {
78
- const existing = this.findByClientTxn(input.roomId, input.actorId, input.clientTxnId);
79
- if (existing)
80
- return existing;
81
- }
82
- const streamId = Number(result.lastInsertRowid);
83
- const stored = this.db.prepare("SELECT * FROM chat_events WHERE stream_id = ?").get(streamId);
84
- if (!stored)
85
- throw new Error(`Failed to append chat event "${eventId}"`);
86
- return eventFromRow(stored);
87
- }
88
- appendOutputEvent(event, input = {}) {
89
- return this.appendEvent({
90
- roomId: input.roomId,
91
- piboSessionId: event.piboSessionId,
92
- eventId: "eventId" in event && event.eventId ? `pibo:${event.piboSessionId}:${event.eventId}:${event.type}` : undefined,
93
- eventType: event.type,
94
- actorType: actorTypeForOutputEvent(event),
95
- actorId: input.actorId,
96
- retentionClass: retentionClassForOutputEvent(event),
97
- payload: event,
98
- });
99
- }
100
- listEvents(input = {}) {
101
- const clauses = [];
102
- const values = [];
103
- if (input.roomId) {
104
- clauses.push("room_id = ?");
105
- values.push(input.roomId);
106
- }
107
- if (input.piboSessionId) {
108
- clauses.push("pibo_session_id = ?");
109
- values.push(input.piboSessionId);
110
- }
111
- if (input.afterStreamId !== undefined) {
112
- clauses.push("stream_id > ?");
113
- values.push(input.afterStreamId);
114
- }
115
- const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
116
- const limit = Math.max(1, Math.min(input.limit ?? 1000, 5000));
117
- const rows = this.db
118
- .prepare(`SELECT * FROM chat_events ${where} ORDER BY stream_id ASC LIMIT ?`)
119
- .all(...values, limit);
120
- return rows.map(eventFromRow);
121
- }
122
- getEvent(streamId) {
123
- const row = this.db.prepare("SELECT * FROM chat_events WHERE stream_id = ?").get(streamId);
124
- return row ? eventFromRow(row) : undefined;
125
- }
126
- findByClientTxn(roomId, actorId, clientTxnId) {
127
- if (!roomId || !actorId)
128
- return undefined;
129
- const row = this.db
130
- .prepare(`
131
- SELECT * FROM chat_events
132
- WHERE room_id = ? AND actor_id = ? AND client_txn_id = ?
133
- ORDER BY stream_id ASC
134
- LIMIT 1
135
- `)
136
- .get(roomId, actorId, clientTxnId);
137
- return row ? eventFromRow(row) : undefined;
138
- }
139
- getLatestStreamId(input = {}) {
140
- const clauses = [];
141
- const values = [];
142
- if (input.roomId) {
143
- clauses.push("room_id = ?");
144
- values.push(input.roomId);
145
- }
146
- if (input.piboSessionId) {
147
- clauses.push("pibo_session_id = ?");
148
- values.push(input.piboSessionId);
149
- }
150
- const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
151
- const row = this.db.prepare(`SELECT MAX(stream_id) AS stream_id FROM chat_events ${where}`).get(...values);
152
- return row?.stream_id ?? undefined;
153
- }
154
- getSessionReadCursor(piboSessionId, principalId) {
155
- const row = this.db
156
- .prepare("SELECT * FROM chat_session_reads WHERE pibo_session_id = ? AND principal_id = ?")
157
- .get(piboSessionId, principalId);
158
- return row?.last_read_stream_id;
159
- }
160
- markSessionRead(piboSessionId, principalId, lastReadStreamId) {
161
- this.db
162
- .prepare(`
163
- INSERT INTO chat_session_reads (pibo_session_id, principal_id, last_read_stream_id, updated_at)
164
- VALUES (?, ?, ?, ?)
165
- ON CONFLICT(pibo_session_id, principal_id) DO UPDATE SET
166
- last_read_stream_id = MAX(chat_session_reads.last_read_stream_id, excluded.last_read_stream_id),
167
- updated_at = excluded.updated_at
168
- `)
169
- .run(piboSessionId, principalId, lastReadStreamId, new Date().toISOString());
170
- }
171
- countUnreadMessages(input) {
172
- const clauses = [
173
- "retention_class = 'chat_message'",
174
- "event_type IN ('user.message.accepted', 'assistant_message')",
175
- "(actor_type IS NULL OR actor_type != 'user' OR actor_id IS NULL OR actor_id != ?)",
176
- ];
177
- const values = [input.principalId];
178
- if (input.roomId) {
179
- clauses.push("room_id = ?");
180
- values.push(input.roomId);
181
- }
182
- if (input.piboSessionId) {
183
- clauses.push("pibo_session_id = ?");
184
- values.push(input.piboSessionId);
185
- }
186
- if (input.afterStreamId !== undefined) {
187
- clauses.push("stream_id > ?");
188
- values.push(input.afterStreamId);
189
- }
190
- const row = this.db
191
- .prepare(`SELECT COUNT(*) AS count FROM chat_events WHERE ${clauses.join(" AND ")}`)
192
- .get(...values);
193
- return Number(row?.count ?? 0);
194
- }
195
- deleteSessions(piboSessionIds) {
196
- if (!piboSessionIds.length)
197
- return 0;
198
- const placeholders = piboSessionIds.map(() => "?").join(", ");
199
- this.db.prepare(`DELETE FROM chat_session_reads WHERE pibo_session_id IN (${placeholders})`).run(...piboSessionIds);
200
- const result = this.db.prepare(`DELETE FROM chat_events WHERE pibo_session_id IN (${placeholders})`).run(...piboSessionIds);
201
- return Number(result.changes ?? 0);
202
- }
203
- deleteRooms(roomIds) {
204
- if (!roomIds.length)
205
- return 0;
206
- const placeholders = roomIds.map(() => "?").join(", ");
207
- const result = this.db.prepare(`DELETE FROM chat_events WHERE room_id IN (${placeholders})`).run(...roomIds);
208
- return Number(result.changes ?? 0);
209
- }
210
- upsertRetentionPolicy(policy) {
211
- this.db
212
- .prepare(`
213
- INSERT INTO chat_retention_policies (
214
- id,
215
- delete_live_deltas_after_ms,
216
- delete_trace_events_after_ms,
217
- delete_chat_messages_after_ms
218
- ) VALUES (?, ?, ?, ?)
219
- ON CONFLICT(id) DO UPDATE SET
220
- delete_live_deltas_after_ms = excluded.delete_live_deltas_after_ms,
221
- delete_trace_events_after_ms = excluded.delete_trace_events_after_ms,
222
- delete_chat_messages_after_ms = excluded.delete_chat_messages_after_ms
223
- `)
224
- .run(policy.id, policy.deleteLiveDeltasAfterMs ?? null, policy.deleteTraceEventsAfterMs ?? null, policy.deleteChatMessagesAfterMs ?? null);
225
- return this.getRetentionPolicy(policy.id) ?? policy;
226
- }
227
- getRetentionPolicy(id) {
228
- const row = this.db.prepare("SELECT * FROM chat_retention_policies WHERE id = ?").get(id);
229
- return row ? policyFromRow(row) : undefined;
230
- }
231
- purgeExpired(input = {}) {
232
- const now = input.now ?? new Date();
233
- const policy = input.policy ?? this.getRetentionPolicy("default") ?? { id: "default" };
234
- const batchSize = Math.max(1, Math.min(input.batchSize ?? 500, 5000));
235
- const clauses = [];
236
- const values = [];
237
- addRetentionClause(clauses, values, "live_delta", policy.deleteLiveDeltasAfterMs, now);
238
- addRetentionClause(clauses, values, "trace_event", policy.deleteTraceEventsAfterMs, now);
239
- addRetentionClause(clauses, values, "chat_message", policy.deleteChatMessagesAfterMs, now);
240
- if (!clauses.length)
241
- return 0;
242
- const result = this.db
243
- .prepare(`
244
- DELETE FROM chat_events
245
- WHERE stream_id IN (
246
- SELECT stream_id FROM chat_events
247
- WHERE ${clauses.join(" OR ")}
248
- ORDER BY stream_id ASC
249
- LIMIT ${batchSize}
250
- )
251
- `)
252
- .run(...values);
253
- return Number(result.changes ?? 0);
254
- }
255
- close() {
256
- this.db.close();
257
- }
258
- }
259
- export function createDefaultChatEventLog(cwd = process.cwd()) {
260
- return new ChatEventLog(resolve(cwd, ".pibo/web-chat.sqlite"));
261
- }
262
- function eventFromRow(row) {
263
- return {
264
- streamId: row.stream_id,
265
- roomId: row.room_id ?? undefined,
266
- piboSessionId: row.pibo_session_id ?? undefined,
267
- eventId: row.event_id,
268
- eventType: row.event_type,
269
- actorType: row.actor_type,
270
- actorId: row.actor_id ?? undefined,
271
- clientTxnId: row.client_txn_id ?? undefined,
272
- createdAt: row.created_at,
273
- retentionClass: row.retention_class,
274
- payload: JSON.parse(row.payload_json),
275
- };
276
- }
277
- function policyFromRow(row) {
278
- return {
279
- id: row.id,
280
- deleteLiveDeltasAfterMs: row.delete_live_deltas_after_ms ?? undefined,
281
- deleteTraceEventsAfterMs: row.delete_trace_events_after_ms ?? undefined,
282
- deleteChatMessagesAfterMs: row.delete_chat_messages_after_ms ?? undefined,
283
- };
284
- }
285
- function retentionClassForOutputEvent(event) {
286
- if (event.type === "assistant_delta" || event.type === "thinking_delta")
287
- return "live_delta";
288
- if (event.type === "assistant_message" || event.type === "message_started" || event.type === "message_finished") {
289
- return "chat_message";
290
- }
291
- return "trace_event";
292
- }
293
- function actorTypeForOutputEvent(event) {
294
- if (event.type === "assistant_delta" || event.type === "assistant_message" || event.type.startsWith("thinking_")) {
295
- return "assistant";
296
- }
297
- if (event.type === "message_queued" || event.type === "message_started" || event.type === "message_finished") {
298
- return "user";
299
- }
300
- return "agent";
301
- }
302
- function addRetentionClause(clauses, values, retentionClass, ageMs, now) {
303
- if (!ageMs || ageMs <= 0)
304
- return;
305
- clauses.push("(retention_class = ? AND created_at < ?)");
306
- values.push(retentionClass, new Date(now.getTime() - ageMs).toISOString());
307
- }
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { createAgentSessionServices } from "@mariozechner/pi-coding-agent";
2
+ import { registerMiniMaxProvider } from "../../providers/minimax.js";
2
3
  export function buildModelCatalogFromRegistry(registry) {
3
4
  const providers = new Map();
4
5
  for (const model of registry.getAll()) {
@@ -31,12 +32,16 @@ export function buildModelCatalogFromRegistry(registry) {
31
32
  })),
32
33
  };
33
34
  }
34
- export async function loadModelCatalog(cwd = process.cwd()) {
35
+ export async function loadModelCatalogWithServices(createServices, cwd = process.cwd(), extensionHook) {
35
36
  try {
36
- const services = await createAgentSessionServices({ cwd });
37
+ const services = await createServices({ cwd });
38
+ extensionHook?.(services.modelRegistry);
37
39
  return buildModelCatalogFromRegistry(services.modelRegistry);
38
40
  }
39
41
  catch {
40
42
  return { providers: [] };
41
43
  }
42
44
  }
45
+ export async function loadModelCatalog(cwd = process.cwd()) {
46
+ return loadModelCatalogWithServices(createAgentSessionServices, cwd, registerMiniMaxProvider);
47
+ }