@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,4 +1,4 @@
1
- import { existsSync, readFileSync, statSync } from "node:fs";
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import { dirname, extname, isAbsolute, join, resolve } from "node:path";
@@ -132,6 +132,18 @@ function uniquePath(dir, filename, currentPath) {
132
132
  function managedFileName(label) {
133
133
  return `${slugSegment(label)}.md`;
134
134
  }
135
+ function labelFromManagedPath(path) {
136
+ const filename = path.split(/[\\/]/).pop() ?? path;
137
+ const extension = extname(filename);
138
+ const stem = extension ? filename.slice(0, -extension.length) : filename;
139
+ const words = stem
140
+ .replace(/[_-]+/g, " ")
141
+ .replace(/\s+/g, " ")
142
+ .trim();
143
+ if (!words)
144
+ return "Context File";
145
+ return words.replace(/\b\w/g, (letter) => letter.toUpperCase());
146
+ }
135
147
  function profileForManaged(file) {
136
148
  return {
137
149
  key: file.key,
@@ -313,10 +325,12 @@ class ContextFileService {
313
325
  }
314
326
  }
315
327
  list(context) {
328
+ this.discoverGlobalManagedFiles(context, false);
316
329
  const catalog = context.channelContext.getCapabilityCatalog?.().contextFiles ?? [];
317
330
  return catalog.map((file) => this.resolveCatalogInfo(context, file));
318
331
  }
319
332
  async read(context, key) {
333
+ this.discoverGlobalManagedFiles(context, false);
320
334
  const managed = this.managed.get(key);
321
335
  if (managed) {
322
336
  const file = this.resolveManagedInfo(context, managed);
@@ -364,7 +378,7 @@ class ContextFileService {
364
378
  kind: "working",
365
379
  contentHash: hashContextFileContent(markdown),
366
380
  content: markdown,
367
- actorId: webSession.ownerScope,
381
+ actorId: webSession.authSession.identity.userId,
368
382
  note: "Managed context file created",
369
383
  });
370
384
  const updated = this.store.updateFile({
@@ -375,7 +389,7 @@ class ContextFileService {
375
389
  this.upsertManaged(updated);
376
390
  const document = await this.read(context, updated.key);
377
391
  this.snapshots.set(updated.key, this.snapshotFromInfo(document));
378
- this.emitChanged(context, "context-file.created", "web", webSession.ownerScope, document);
392
+ this.emitChanged(context, "context-file.created", "web", webSession.authSession.identity.userId, document);
379
393
  return document;
380
394
  }
381
395
  async createLinkedCopy(context, sourceKey, body, webSession) {
@@ -402,7 +416,7 @@ class ContextFileService {
402
416
  kind: "source-snapshot",
403
417
  contentHash: sourceDescriptor.contentHash,
404
418
  content: sourceDescriptor.content ?? "",
405
- actorId: webSession.ownerScope,
419
+ actorId: webSession.authSession.identity.userId,
406
420
  sourceHashAtCreation: sourceDescriptor.contentHash,
407
421
  note: "Plugin source linked",
408
422
  });
@@ -411,7 +425,7 @@ class ContextFileService {
411
425
  kind: "working",
412
426
  contentHash: sourceDescriptor.contentHash,
413
427
  content: sourceDescriptor.content ?? "",
414
- actorId: webSession.ownerScope,
428
+ actorId: webSession.authSession.identity.userId,
415
429
  basedOnRevisionId: sourceRevision.id,
416
430
  sourceHashAtCreation: sourceDescriptor.contentHash,
417
431
  note: "Managed working copy created from plugin source",
@@ -425,7 +439,7 @@ class ContextFileService {
425
439
  this.upsertManaged(updated);
426
440
  const document = await this.read(context, updated.key);
427
441
  this.snapshots.set(updated.key, this.snapshotFromInfo(document));
428
- this.emitChanged(context, "context-file.linked_from_plugin", "web", webSession.ownerScope, document);
442
+ this.emitChanged(context, "context-file.linked_from_plugin", "web", webSession.authSession.identity.userId, document);
429
443
  return document;
430
444
  }
431
445
  async update(context, key, body, webSession) {
@@ -439,12 +453,12 @@ class ContextFileService {
439
453
  if (current.markdown === markdown)
440
454
  return current;
441
455
  const updatedRecord = await this.writeWorkingContent(record, markdown, {
442
- actorId: webSession.ownerScope,
456
+ actorId: webSession.authSession.identity.userId,
443
457
  note: "Managed context file updated",
444
458
  });
445
459
  const updated = await this.read(context, updatedRecord.key);
446
460
  this.snapshots.set(updated.key, this.snapshotFromInfo(updated));
447
- this.emitChanged(context, "context-file.updated", "web", webSession.ownerScope, updated);
461
+ this.emitChanged(context, "context-file.updated", "web", webSession.authSession.identity.userId, updated);
448
462
  return updated;
449
463
  }
450
464
  async updateMetadata(context, key, body, webSession) {
@@ -473,7 +487,7 @@ class ContextFileService {
473
487
  this.upsertManaged(updated);
474
488
  const document = await this.read(context, key);
475
489
  this.snapshots.set(key, this.snapshotFromInfo(document));
476
- this.emitChanged(context, "context-file.metadata_updated", "web", webSession.ownerScope, document);
490
+ this.emitChanged(context, "context-file.metadata_updated", "web", webSession.authSession.identity.userId, document);
477
491
  return document;
478
492
  }
479
493
  async resetToSource(context, key, webSession) {
@@ -481,15 +495,15 @@ class ContextFileService {
481
495
  if (!record.sourceRef)
482
496
  throw new PiboWebHttpError("Only linked managed files can be reset to source", 400);
483
497
  const liveSource = this.requireLiveSourceForRecord(context, record);
484
- this.ensureSourceSnapshot(record, liveSource, webSession.ownerScope, "Source snapshot refreshed during reset");
498
+ this.ensureSourceSnapshot(record, liveSource, webSession.authSession.identity.userId, "Source snapshot refreshed during reset");
485
499
  const updatedRecord = await this.writeWorkingContent(record, liveSource.content ?? "", {
486
- actorId: webSession.ownerScope,
500
+ actorId: webSession.authSession.identity.userId,
487
501
  sourceHash: liveSource.contentHash,
488
502
  note: "Working copy reset to source",
489
503
  });
490
504
  const document = await this.read(context, updatedRecord.key);
491
505
  this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
492
- this.emitChanged(context, "context-file.reset_to_source", "web", webSession.ownerScope, document);
506
+ this.emitChanged(context, "context-file.reset_to_source", "web", webSession.authSession.identity.userId, document);
493
507
  return document;
494
508
  }
495
509
  async adoptSource(context, key, webSession) {
@@ -497,15 +511,15 @@ class ContextFileService {
497
511
  if (!record.sourceRef)
498
512
  throw new PiboWebHttpError("Only linked managed files can adopt a source", 400);
499
513
  const liveSource = this.requireLiveSourceForRecord(context, record);
500
- this.ensureSourceSnapshot(record, liveSource, webSession.ownerScope, "Source snapshot adopted");
514
+ this.ensureSourceSnapshot(record, liveSource, webSession.authSession.identity.userId, "Source snapshot adopted");
501
515
  const updatedRecord = await this.writeWorkingContent(record, liveSource.content ?? "", {
502
- actorId: webSession.ownerScope,
516
+ actorId: webSession.authSession.identity.userId,
503
517
  sourceHash: liveSource.contentHash,
504
518
  note: "Plugin source adopted",
505
519
  });
506
520
  const document = await this.read(context, updatedRecord.key);
507
521
  this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
508
- this.emitChanged(context, "context-file.source_adopted", "web", webSession.ownerScope, document);
522
+ this.emitChanged(context, "context-file.source_adopted", "web", webSession.authSession.identity.userId, document);
509
523
  return document;
510
524
  }
511
525
  async restoreRevision(context, key, body, webSession) {
@@ -515,13 +529,13 @@ class ContextFileService {
515
529
  if (!revision || revision.contextFileKey !== key)
516
530
  throw new PiboWebHttpError(`Unknown revision "${revisionId}"`, 404);
517
531
  const updatedRecord = await this.writeWorkingContent(record, revision.content, {
518
- actorId: webSession.ownerScope,
532
+ actorId: webSession.authSession.identity.userId,
519
533
  basedOnRevisionId: revision.id,
520
534
  note: `Revision restored from ${revision.id}`,
521
535
  });
522
536
  const document = await this.read(context, updatedRecord.key);
523
537
  this.snapshots.set(updatedRecord.key, this.snapshotFromInfo(document));
524
- this.emitChanged(context, "context-file.revision_restored", "web", webSession.ownerScope, document);
538
+ this.emitChanged(context, "context-file.revision_restored", "web", webSession.authSession.identity.userId, document);
525
539
  return document;
526
540
  }
527
541
  listRevisions(context, key) {
@@ -558,12 +572,13 @@ class ContextFileService {
558
572
  this.store.deleteFile(key);
559
573
  this.api.removeContextFile(key);
560
574
  this.snapshots.delete(key);
561
- this.emitChanged(context, "context-file.removed", "web", webSession.ownerScope, file);
575
+ this.emitChanged(context, "context-file.removed", "web", webSession.authSession.identity.userId, file);
562
576
  return { removed: key };
563
577
  }
564
578
  startWatcher(context) {
565
579
  if (this.pollTimer)
566
580
  return;
581
+ this.discoverGlobalManagedFiles(context, false);
567
582
  for (const file of this.list(context))
568
583
  this.snapshots.set(file.key, this.snapshotFromInfo(file));
569
584
  this.pollTimer = setInterval(() => {
@@ -578,6 +593,7 @@ class ContextFileService {
578
593
  this.pollTimer = undefined;
579
594
  }
580
595
  async poll(context) {
596
+ this.discoverGlobalManagedFiles(context, true);
581
597
  for (const file of this.list(context)) {
582
598
  const nextSnapshot = this.snapshotFromInfo(file);
583
599
  const previous = this.snapshots.get(file.key);
@@ -590,6 +606,70 @@ class ContextFileService {
590
606
  emitContextFileEvent(context, eventType, "filesystem", undefined, contextFilePayload(file));
591
607
  }
592
608
  }
609
+ discoverGlobalManagedFiles(context, emitEvents) {
610
+ let entries;
611
+ try {
612
+ entries = readdirSync(this.paths.globalDir, { withFileTypes: true });
613
+ }
614
+ catch (error) {
615
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
616
+ if (code === "ENOENT")
617
+ return [];
618
+ throw error;
619
+ }
620
+ const knownPaths = new Set([...this.managed.values()].map((file) => resolve(file.managedPath)));
621
+ const usedKeys = new Set([
622
+ ...this.managed.keys(),
623
+ ...(context.channelContext.getCapabilityCatalog?.().contextFiles ?? []).map((file) => file.key),
624
+ ]);
625
+ const discovered = [];
626
+ for (const entry of entries) {
627
+ if (!entry.isFile())
628
+ continue;
629
+ const extension = extname(entry.name).toLowerCase();
630
+ if (extension !== ".md" && extension !== ".markdown")
631
+ continue;
632
+ const absolutePath = resolve(this.paths.globalDir, entry.name);
633
+ if (knownPaths.has(absolutePath))
634
+ continue;
635
+ const snapshot = snapshotFromSync(absolutePath);
636
+ if (!snapshot.exists || !snapshot.version)
637
+ continue;
638
+ const label = labelFromManagedPath(entry.name);
639
+ const record = this.store.createFile({
640
+ key: uniqueKey(`ctx:${slugSegment(entry.name.slice(0, -extension.length) || entry.name)}`, usedKeys),
641
+ label,
642
+ managedPath: absolutePath,
643
+ scope: "global",
644
+ createdAt: snapshot.updatedAt,
645
+ updatedAt: snapshot.updatedAt,
646
+ });
647
+ const revision = this.store.appendRevision({
648
+ contextFileKey: record.key,
649
+ kind: "working",
650
+ contentHash: snapshot.version,
651
+ content: snapshot.content ?? "",
652
+ createdAt: snapshot.updatedAt,
653
+ note: "Global context file discovered on disk",
654
+ });
655
+ const updated = this.store.updateFile({
656
+ ...record,
657
+ activeRevisionId: revision.id,
658
+ updatedAt: snapshot.updatedAt ?? new Date().toISOString(),
659
+ });
660
+ this.upsertManaged(updated);
661
+ this.managed.set(updated.key, updated);
662
+ knownPaths.add(absolutePath);
663
+ usedKeys.add(updated.key);
664
+ const info = this.resolveManagedInfo(context, updated);
665
+ discovered.push(updated);
666
+ if (emitEvents) {
667
+ this.snapshots.set(updated.key, this.snapshotFromInfo(info));
668
+ this.emitChanged(context, "context-file.created", "filesystem", undefined, info);
669
+ }
670
+ }
671
+ return discovered;
672
+ }
593
673
  resolveCatalogInfo(context, file) {
594
674
  const managed = this.managed.get(file.key);
595
675
  if (managed)
@@ -0,0 +1,124 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { definePiboPlugin } from "./registry.js";
3
+ const COOKIE_NAME = "pibo_dev_session";
4
+ const COOKIE_MAX_AGE = 60 * 60 * 24 * 7; // 7 days
5
+ const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1", "[::1]"]);
6
+ function generateToken() {
7
+ return randomBytes(32).toString("hex");
8
+ }
9
+ function setCookie(value, maxAge = COOKIE_MAX_AGE) {
10
+ return `${COOKIE_NAME}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}`;
11
+ }
12
+ function clearCookie() {
13
+ return `${COOKIE_NAME}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`;
14
+ }
15
+ function getCookieValue(headers) {
16
+ const cookie = headers.get("cookie");
17
+ if (!cookie)
18
+ return undefined;
19
+ const match = cookie.match(new RegExp(`${COOKIE_NAME}=([^;]+)`));
20
+ return match?.[1];
21
+ }
22
+ function firstHeaderValue(value) {
23
+ return value?.split(",")[0]?.trim() || undefined;
24
+ }
25
+ function isLoopbackHost(value) {
26
+ if (!value)
27
+ return false;
28
+ try {
29
+ const hostname = new URL(`http://${value}`).hostname;
30
+ return LOOPBACK_HOSTS.has(hostname);
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export function isLoopbackDevAuthRequest(request) {
37
+ const host = firstHeaderValue(request.headers.get("host"));
38
+ const forwardedHost = firstHeaderValue(request.headers.get("x-forwarded-host"));
39
+ return isLoopbackHost(host) && (!forwardedHost || isLoopbackHost(forwardedHost));
40
+ }
41
+ function createDevAuthService() {
42
+ const containerToken = generateToken();
43
+ const debugSession = {
44
+ identity: {
45
+ userId: "dev-user-001",
46
+ email: "dev@pibo.local",
47
+ name: "Dev User",
48
+ image: undefined,
49
+ provider: "dev",
50
+ },
51
+ sessionId: "dev-session-001",
52
+ expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000),
53
+ };
54
+ return {
55
+ name: "dev-auth",
56
+ async start() {
57
+ console.error("[dev-auth] Debug auth service started");
58
+ },
59
+ stop() { },
60
+ async getSession(headers) {
61
+ const token = getCookieValue(headers);
62
+ if (token === containerToken)
63
+ return debugSession;
64
+ return undefined;
65
+ },
66
+ async requireSession(headers) {
67
+ const session = await this.getSession(headers);
68
+ if (!session) {
69
+ const err = new Error("Unauthenticated");
70
+ err.statusCode = 401;
71
+ throw err;
72
+ }
73
+ return session;
74
+ },
75
+ async handleRequest(request) {
76
+ if (!isLoopbackDevAuthRequest(request)) {
77
+ return Response.json({ error: "Dev auth only accepts loopback requests" }, { status: 403 });
78
+ }
79
+ const url = new URL(request.url);
80
+ if (url.pathname === "/api/auth/sign-in/social") {
81
+ // Simulate the Google OAuth redirect — go straight to callback
82
+ return new Response(null, {
83
+ status: 302,
84
+ headers: {
85
+ location: "/api/auth/callback/google?code=dev",
86
+ },
87
+ });
88
+ }
89
+ if (url.pathname === "/api/auth/callback/google") {
90
+ // Set session cookie and redirect to app
91
+ return new Response(null, {
92
+ status: 302,
93
+ headers: {
94
+ "Set-Cookie": setCookie(containerToken),
95
+ location: "/apps/chat",
96
+ },
97
+ });
98
+ }
99
+ if (url.pathname === "/api/auth/sign-out") {
100
+ return new Response(null, {
101
+ status: 302,
102
+ headers: {
103
+ "Set-Cookie": clearCookie(),
104
+ location: "/apps/chat",
105
+ },
106
+ });
107
+ }
108
+ if (url.pathname === "/api/auth/session") {
109
+ const session = await this.getSession(request.headers);
110
+ return Response.json(session ?? null);
111
+ }
112
+ return new Response("Not found", { status: 404 });
113
+ },
114
+ };
115
+ }
116
+ export function createPiboDevAuthPlugin() {
117
+ return definePiboPlugin({
118
+ id: "pibo.dev-auth",
119
+ name: "Dev Auth",
120
+ register(api) {
121
+ api.registerAuthService(createDevAuthService());
122
+ },
123
+ });
124
+ }
@@ -0,0 +1,15 @@
1
+ import { dirname, resolve } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ export const PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY = "Pibo Native Tooling";
4
+ const PROJECT_ROOT = dirname(dirname(dirname(fileURLToPath(import.meta.url))));
5
+ export const PIBO_NATIVE_TOOLING_CONTEXT_FILE_PATH = resolve(PROJECT_ROOT, "context/pibo-native-tooling.md");
6
+ export function registerPiboNativeTooling(api) {
7
+ api.registerContextFile({
8
+ key: PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY,
9
+ label: "Pibo Native Tooling",
10
+ path: PIBO_NATIVE_TOOLING_CONTEXT_FILE_PATH,
11
+ });
12
+ }
13
+ export function addPiboNativeToolingContext(builder, context) {
14
+ return builder.addContextFile(context.getContextFile(PIBO_NATIVE_TOOLING_CONTEXT_FILE_KEY));
15
+ }
@@ -30,8 +30,10 @@ export class PiboPluginRegistry {
30
30
  channels = new Map();
31
31
  authService;
32
32
  webApps = new Map();
33
+ capabilityPackages = new Map();
33
34
  eventListeners = new Set();
34
35
  productEventListeners = new Set();
36
+ ralphStopConditions = new Map();
35
37
  pluginIds = new Set();
36
38
  pluginNames = new Map();
37
39
  eventErrors = [];
@@ -69,6 +71,12 @@ export class PiboPluginRegistry {
69
71
  registerSkill(skill) {
70
72
  this.addUnique(this.skills, skill.name, skill, "skill");
71
73
  }
74
+ unregisterSkill(name) {
75
+ return this.skills.delete(name);
76
+ }
77
+ getRegisteredSkillNames() {
78
+ return [...this.skills.keys()];
79
+ }
72
80
  registerContextFile(contextFile) {
73
81
  this.addUnique(this.contextFiles, contextFileKey(contextFile), contextFile, "context file");
74
82
  }
@@ -122,6 +130,33 @@ export class PiboPluginRegistry {
122
130
  this.validateWebAppRoutes(app);
123
131
  this.webApps.set(app.name, app);
124
132
  }
133
+ registerCapabilityPackage(pkg) {
134
+ this.addUnique(this.capabilityPackages, pkg.name, { ...pkg, toolNames: [...pkg.toolNames] }, "capability package");
135
+ }
136
+ registerRalphStopCondition(condition, pluginId) {
137
+ if (!condition.type.trim())
138
+ throw new Error('Ralph stop condition type is required');
139
+ if (!condition.name.trim())
140
+ throw new Error(`Ralph stop condition "${condition.type}" name is required`);
141
+ if (condition.phases.length === 0)
142
+ throw new Error(`Ralph stop condition "${condition.type}" must support at least one phase`);
143
+ this.addUnique(this.ralphStopConditions, condition.type, { definition: { ...condition, phases: [...condition.phases] }, pluginId }, 'Ralph stop condition');
144
+ }
145
+ getRalphStopConditionDefinitions() {
146
+ return [...this.ralphStopConditions.values()].map((entry) => entry.definition);
147
+ }
148
+ getRalphStopConditionInfos() {
149
+ return [...this.ralphStopConditions.values()].map((entry) => ({
150
+ type: entry.definition.type,
151
+ name: entry.definition.name,
152
+ description: entry.definition.description,
153
+ phases: [...entry.definition.phases],
154
+ optionsSchema: entry.definition.optionsSchema,
155
+ defaultOptions: entry.definition.defaultOptions,
156
+ pluginId: entry.pluginId,
157
+ pluginName: entry.pluginId ? this.pluginNames.get(entry.pluginId) : undefined,
158
+ }));
159
+ }
125
160
  onEvent(listener) {
126
161
  this.eventListeners.add(listener);
127
162
  }
@@ -158,6 +193,12 @@ export class PiboPluginRegistry {
158
193
  model: sessionContext.model ? { ...sessionContext.model } : undefined,
159
194
  mainModel: sessionContext.mainModel ? { ...sessionContext.mainModel } : undefined,
160
195
  subagentModel: sessionContext.subagentModel ? { ...sessionContext.subagentModel } : undefined,
196
+ thinkingLevel: sessionContext.thinkingLevel,
197
+ mainThinkingLevel: sessionContext.mainThinkingLevel,
198
+ subagentThinkingLevel: sessionContext.subagentThinkingLevel,
199
+ fast: sessionContext.fast,
200
+ mainFast: sessionContext.mainFast,
201
+ subagentFast: sessionContext.subagentFast,
161
202
  builtinTools: sessionContext.builtinTools,
162
203
  builtinToolNames: [...sessionContext.builtinToolNames],
163
204
  autoContextFiles: sessionContext.autoContextFiles,
@@ -171,7 +212,7 @@ export class PiboPluginRegistry {
171
212
  name: tool.name,
172
213
  description: tool.description,
173
214
  yieldable: tool.yieldable !== false,
174
- hasDefinition: tool.definition !== undefined,
215
+ hasDefinition: tool.definition !== undefined || tool.createDefinition !== undefined,
175
216
  pluginId: tool.pluginId,
176
217
  pluginName: tool.pluginId ? this.pluginNames.get(tool.pluginId) : undefined,
177
218
  ...(tool.providerTool ? { providerTool: tool.providerTool } : {}),
@@ -179,6 +220,9 @@ export class PiboPluginRegistry {
179
220
  skills: [...this.skills.values()].map((skill) => ({
180
221
  name: skill.name,
181
222
  path: skill.path,
223
+ kind: skill.kind ?? "plugin",
224
+ pluginId: skill.pluginId,
225
+ pluginName: skill.pluginId ? this.pluginNames.get(skill.pluginId) : undefined,
182
226
  })),
183
227
  subagents: [...this.subagents.values()].map((subagent) => ({
184
228
  name: subagent.name,
@@ -211,10 +255,16 @@ export class PiboPluginRegistry {
211
255
  "pibo_run_ack",
212
256
  ],
213
257
  },
258
+ ...[...this.capabilityPackages.values()].map((pkg) => ({
259
+ ...pkg,
260
+ toolNames: [...pkg.toolNames],
261
+ pluginName: pkg.pluginId ? this.pluginNames.get(pkg.pluginId) : pkg.pluginName,
262
+ })),
214
263
  ],
215
264
  piboTools: listInstalledCliToolAgentContexts(),
216
265
  mcpServers: [],
217
266
  piPackages: listPiPackages(),
267
+ ralphStopConditions: this.getRalphStopConditionInfos(),
218
268
  };
219
269
  }
220
270
  resolveProfileName(name) {
@@ -276,13 +326,25 @@ export class PiboPluginRegistry {
276
326
  }
277
327
  createApi(pluginId) {
278
328
  const withPluginToolContext = (tool) => ({ ...tool, pluginId: tool.pluginId ?? pluginId });
329
+ const withPluginSkillContext = (skill) => (skill.kind === "user"
330
+ ? skill
331
+ : {
332
+ ...skill,
333
+ kind: skill.kind ?? "plugin",
334
+ pluginId: skill.pluginId ?? pluginId,
335
+ });
279
336
  const withPluginContext = (contextFile) => (contextFile.source === "managed" ? contextFile : { ...contextFile, pluginId: contextFile.pluginId ?? pluginId });
337
+ const withPluginPackageContext = (pkg) => ({
338
+ ...pkg,
339
+ toolNames: [...pkg.toolNames],
340
+ pluginId: pkg.pluginId ?? pluginId,
341
+ });
280
342
  return {
281
343
  registerTool: (tool) => this.registerTool(withPluginToolContext(tool)),
282
344
  registerTools: (tools) => this.registerTools(tools.map(withPluginToolContext)),
283
345
  registerSubagent: (subagent) => this.registerSubagent(subagent),
284
346
  registerSubagents: (subagents) => this.registerSubagents(subagents),
285
- registerSkill: (skill) => this.registerSkill(skill),
347
+ registerSkill: (skill) => this.registerSkill(withPluginSkillContext(skill)),
286
348
  registerContextFile: (contextFile) => this.registerContextFile(withPluginContext(contextFile)),
287
349
  upsertContextFile: (contextFile) => this.upsertContextFile(withPluginContext(contextFile)),
288
350
  removeContextFile: (key) => this.removeContextFile(key),
@@ -291,6 +353,8 @@ export class PiboPluginRegistry {
291
353
  registerChannel: (channel) => this.registerChannel(channel),
292
354
  registerAuthService: (service) => this.registerAuthService(service),
293
355
  registerWebApp: (app) => this.registerWebApp(app),
356
+ registerCapabilityPackage: (pkg) => this.registerCapabilityPackage(withPluginPackageContext(pkg)),
357
+ registerRalphStopCondition: (condition) => this.registerRalphStopCondition(condition, pluginId),
294
358
  onEvent: (listener) => this.onEvent(listener),
295
359
  emitProductEvent: (event) => this.emitProductEvent(event),
296
360
  onProductEvent: (listener) => this.onProductEvent(listener),
@@ -0,0 +1,27 @@
1
+ import { dirname, resolve } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { createWebAnnotationsWebApp } from "../web-annotations/api.js";
4
+ import { WEB_ANNOTATION_TOOL_NAMES, createWebAnnotationToolProfiles } from "../web-annotations/tools.js";
5
+ import { definePiboPlugin } from "./registry.js";
6
+ const PIBO_PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
7
+ function webAnnotationsSkillPath() {
8
+ return resolve(PIBO_PACKAGE_ROOT, "skills", "builtin", "web-annotations", "SKILL.md");
9
+ }
10
+ export const piboWebAnnotationsPlugin = definePiboPlugin({
11
+ id: "pibo.web-annotations",
12
+ name: "Pibo Web Annotations",
13
+ register(api) {
14
+ api.registerTools(createWebAnnotationToolProfiles());
15
+ api.registerWebApp(createWebAnnotationsWebApp());
16
+ api.registerCapabilityPackage({
17
+ name: "web-annotation-agent-tools",
18
+ description: "Expose session-scoped Web Annotation tools for listing, reading, watching, and lifecycle updates.",
19
+ toolNames: [...WEB_ANNOTATION_TOOL_NAMES],
20
+ });
21
+ api.registerSkill({
22
+ name: "web-annotations",
23
+ path: webAnnotationsSkillPath(),
24
+ kind: "builtin",
25
+ });
26
+ },
27
+ });
@@ -0,0 +1,70 @@
1
+ import { getModels } from "@mariozechner/pi-ai";
2
+ import { OPENAI_COMPLETIONS_API, registerOpenAiCompatProvider, resetOpenAiCompatProviderRegistration, unregisterOpenAiCompatProvider, } from "./openai-compat.js";
3
+ export const MINIMAX_PROVIDER_ID = "minimax";
4
+ export const MINIMAX_CN_PROVIDER_ID = "minimax-cn";
5
+ export const MINIMAX_DEFAULT_BASE_URL = "https://api.minimax.io/v1";
6
+ export const MINIMAX_CN_DEFAULT_BASE_URL = "https://api.minimax.cn/v1";
7
+ export const MINIMAX_API_KEY_ENV = "MINIMAX_API_KEY";
8
+ export const MINIMAX_CN_API_KEY_ENV = "MINIMAX_API_KEY";
9
+ export const MINIMAX_M3_MODEL = {
10
+ id: "MiniMax-M3",
11
+ name: "MiniMax-M3",
12
+ reasoning: true,
13
+ contextWindow: 1000000,
14
+ maxTokens: 131072,
15
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
16
+ input: ["text", "image"],
17
+ };
18
+ function resolveBaseUrl(providerId, defaultBaseUrl) {
19
+ const envKey = `PIBO_${providerId.toUpperCase().replace(/-/g, "_")}_BASE_URL`;
20
+ const envOverride = process.env[envKey];
21
+ return envOverride && envOverride.length > 0 ? envOverride : defaultBaseUrl;
22
+ }
23
+ function buildMiniMaxSpec(providerId = MINIMAX_PROVIDER_ID, customModels = [MINIMAX_M3_MODEL]) {
24
+ const defaultBaseUrl = providerId === MINIMAX_CN_PROVIDER_ID
25
+ ? MINIMAX_CN_DEFAULT_BASE_URL
26
+ : MINIMAX_DEFAULT_BASE_URL;
27
+ return {
28
+ id: providerId,
29
+ baseUrl: resolveBaseUrl(providerId, defaultBaseUrl),
30
+ apiKeyEnv: providerId === MINIMAX_CN_PROVIDER_ID
31
+ ? MINIMAX_CN_API_KEY_ENV
32
+ : MINIMAX_API_KEY_ENV,
33
+ models: customModels,
34
+ };
35
+ }
36
+ export function isMiniMaxProvider(provider) {
37
+ return provider === MINIMAX_PROVIDER_ID || provider === MINIMAX_CN_PROVIDER_ID;
38
+ }
39
+ export function findMiniMaxModel(modelRegistry, model) {
40
+ if (!model?.provider || !model.id)
41
+ return undefined;
42
+ if (!isMiniMaxProvider(model.provider))
43
+ return undefined;
44
+ return modelRegistry.find(model.provider, model.id);
45
+ }
46
+ export function getBuiltInMiniMaxModels(providerId = MINIMAX_PROVIDER_ID) {
47
+ try {
48
+ return getModels(providerId);
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ export function registerMiniMaxProvider(modelRegistry, options = {}) {
55
+ const providerId = options.providerId ?? MINIMAX_PROVIDER_ID;
56
+ const spec = buildMiniMaxSpec(providerId, options.customModels ?? [MINIMAX_M3_MODEL]);
57
+ const baseModels = options.baseModels ?? getBuiltInMiniMaxModels(providerId);
58
+ return registerOpenAiCompatProvider(modelRegistry, spec, { baseModels });
59
+ }
60
+ export function unregisterMiniMaxProvider(modelRegistry, options = {}) {
61
+ const providerId = options.providerId ?? MINIMAX_PROVIDER_ID;
62
+ unregisterOpenAiCompatProvider(modelRegistry, providerId);
63
+ }
64
+ export function resetMiniMaxProviderRegistration() {
65
+ resetOpenAiCompatProviderRegistration();
66
+ }
67
+ export function getDefaultMiniMaxModels() {
68
+ return [MINIMAX_M3_MODEL];
69
+ }
70
+ export { OPENAI_COMPLETIONS_API };
@@ -0,0 +1,48 @@
1
+ export const OPENAI_COMPLETIONS_API = "openai-completions";
2
+ export function buildOpenAiCompatConfig(spec, baseModels = []) {
3
+ const baseEntries = baseModels
4
+ .filter((model) => model.provider === spec.id)
5
+ .map((model) => ({
6
+ id: model.id,
7
+ name: model.name,
8
+ api: OPENAI_COMPLETIONS_API,
9
+ baseUrl: spec.baseUrl,
10
+ reasoning: Boolean(model.reasoning),
11
+ input: [...model.input],
12
+ cost: { ...model.cost },
13
+ contextWindow: model.contextWindow,
14
+ maxTokens: model.maxTokens,
15
+ }));
16
+ const customEntries = spec.models.map((model) => ({
17
+ id: model.id,
18
+ name: model.name,
19
+ api: OPENAI_COMPLETIONS_API,
20
+ baseUrl: spec.baseUrl,
21
+ reasoning: model.reasoning ?? false,
22
+ input: [...model.input],
23
+ cost: { ...model.cost },
24
+ contextWindow: model.contextWindow,
25
+ maxTokens: model.maxTokens,
26
+ }));
27
+ const byId = new Map();
28
+ for (const entry of baseEntries)
29
+ byId.set(entry.id, entry);
30
+ for (const entry of customEntries)
31
+ byId.set(entry.id, entry);
32
+ return {
33
+ baseUrl: spec.baseUrl,
34
+ api: OPENAI_COMPLETIONS_API,
35
+ apiKey: spec.apiKeyEnv,
36
+ models: [...byId.values()],
37
+ };
38
+ }
39
+ export function registerOpenAiCompatProvider(modelRegistry, spec, options = {}) {
40
+ const config = buildOpenAiCompatConfig(spec, options.baseModels);
41
+ modelRegistry.registerProvider(spec.id, config);
42
+ return { registered: true, models: config.models.length };
43
+ }
44
+ export function unregisterOpenAiCompatProvider(modelRegistry, providerId) {
45
+ modelRegistry.unregisterProvider(providerId);
46
+ }
47
+ export function resetOpenAiCompatProviderRegistration() {
48
+ }