@pasko70/pibo 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +106 -254
  2. package/context/codex-base-prompt.md +4 -0
  3. package/context/compute-worker.md +23 -0
  4. package/context/pibo-native-tooling.md +18 -0
  5. package/context/pibo-system-prompt.md +69 -8
  6. package/dist/api/simple-agent-api.js +136 -0
  7. package/dist/app-context.js +4 -0
  8. package/dist/apps/chat/agent-profiles.js +18 -3
  9. package/dist/apps/chat/agent-store.js +113 -16
  10. package/dist/apps/chat/chat-api-routes.js +311 -0
  11. package/dist/apps/chat/chat-capability-routes.js +90 -0
  12. package/dist/apps/chat/chat-files.js +178 -0
  13. package/dist/apps/chat/chat-request-normalizers.js +681 -0
  14. package/dist/apps/chat/chat-settings-routes.js +75 -0
  15. package/dist/apps/chat/chat-trace-helpers.js +94 -0
  16. package/dist/apps/chat/chat-user-skill-routes.js +149 -0
  17. package/dist/apps/chat/cron-api.js +213 -0
  18. package/dist/apps/chat/data/chat-data-mappers.js +74 -0
  19. package/dist/apps/chat/data/event-command-service.js +75 -0
  20. package/dist/apps/chat/data/navigation-query-service.js +11 -0
  21. package/dist/apps/chat/data/project-service.js +844 -0
  22. package/dist/apps/chat/data/read-state-service.js +42 -0
  23. package/dist/apps/chat/data/room-service.js +52 -0
  24. package/dist/apps/chat/data/session-query-service.js +63 -0
  25. package/dist/apps/chat/data/timeline-query-service.js +96 -0
  26. package/dist/apps/chat/event-log.js +1 -307
  27. package/dist/apps/chat/model-catalog.js +7 -2
  28. package/dist/apps/chat/output-compactor.js +126 -0
  29. package/dist/apps/chat/output-event-policy.js +17 -0
  30. package/dist/apps/chat/project-workflow-human-actions.js +347 -0
  31. package/dist/apps/chat/project-workflow-sessions.js +260 -0
  32. package/dist/apps/chat/provider-auth-actions.js +43 -0
  33. package/dist/apps/chat/ralph-api.js +156 -0
  34. package/dist/apps/chat/read-model.js +1 -218
  35. package/dist/apps/chat/rooms.js +1 -321
  36. package/dist/apps/chat/static-assets.js +996 -0
  37. package/dist/apps/chat/stream.js +29 -6
  38. package/dist/apps/chat/trace.js +179 -1003
  39. package/dist/apps/chat/types/event-store.js +1 -0
  40. package/dist/apps/chat/types/read-model.js +1 -0
  41. package/dist/apps/chat/types/rooms.js +36 -0
  42. package/dist/apps/chat/web-app.js +3131 -1959
  43. package/dist/apps/chat/workflow-catalog.js +572 -0
  44. package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
  45. package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
  46. package/dist/apps/chat/workflow-persistence-model.js +140 -0
  47. package/dist/apps/chat/workflow-persistence.js +633 -0
  48. package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
  49. package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
  50. package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
  51. package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
  52. package/dist/apps/chat/workflow-validation-helpers.js +114 -0
  53. package/dist/apps/chat-ui/assets/{dist-CNLWH2qh.js → dist-B4lw9z4F.js} +1 -1
  54. package/dist/apps/chat-ui/assets/{dist-8e4L8ciw.js → dist-BbTaHWON.js} +1 -1
  55. package/dist/apps/chat-ui/assets/{dist-CMZOa5ik.js → dist-BcT_c1EJ.js} +1 -1
  56. package/dist/apps/chat-ui/assets/{dist-DNcnQRPF.js → dist-CGINd7XU.js} +1 -1
  57. package/dist/apps/chat-ui/assets/{dist-CqqUC8Ce.js → dist-CrBzZkUp.js} +1 -1
  58. package/dist/apps/chat-ui/assets/{dist-D2N4-LIc.js → dist-CyyISotB.js} +1 -1
  59. package/dist/apps/chat-ui/assets/{dist-CUqpST5w.js → dist-DFbnFNpX.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dist-CspjOeBj.js → dist-DGLWQLX8.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dist-B7bbI3Qz.js → dist-DfcIkFSN.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dist-v4pjHlB7.js → dist-sKDHTwaT.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{dist-D9L4MSRF.js → dist-y9D6la48.js} +1 -1
  64. package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
  65. package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
  66. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
  67. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
  68. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
  69. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
  70. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
  71. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
  72. package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
  73. package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
  74. package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
  75. package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
  76. package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
  77. package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
  78. package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
  79. package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
  80. package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
  81. package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
  82. package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
  83. package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
  84. package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
  85. package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
  86. package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
  87. package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
  88. package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
  89. package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
  90. package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
  91. package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
  92. package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
  93. package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
  94. package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
  95. package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
  96. package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
  97. package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
  98. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
  99. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
  100. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
  101. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
  102. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
  103. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
  104. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
  105. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
  106. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
  107. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
  108. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
  109. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
  110. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
  111. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
  112. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
  113. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
  114. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
  115. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
  116. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
  117. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
  118. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
  119. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
  120. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
  121. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
  122. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
  123. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
  124. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
  125. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
  126. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
  127. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
  128. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
  129. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
  130. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
  131. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
  132. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
  133. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
  134. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
  135. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
  136. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
  137. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
  138. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
  139. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
  140. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
  141. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
  142. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
  143. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
  144. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
  145. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
  146. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
  147. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
  148. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
  149. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
  150. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
  151. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
  152. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
  153. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
  154. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
  155. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
  156. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
  157. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
  158. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
  159. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
  160. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
  161. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
  162. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
  163. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
  164. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
  165. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
  166. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
  167. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
  168. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
  169. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
  170. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
  171. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
  172. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
  173. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
  174. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
  175. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
  176. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
  177. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
  178. package/dist/apps/chat-ui/index.html +8 -3
  179. package/dist/apps/chat-ui/manifest.webmanifest +25 -0
  180. package/dist/apps/chat-ui/sw.js +41 -0
  181. package/dist/apps/chat-vscode-web/assets/index-B5QK07zO.css +2 -0
  182. package/dist/apps/chat-vscode-web/assets/index-C3GTPyDo.js +41 -0
  183. package/dist/apps/chat-vscode-web/index.html +14 -0
  184. package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
  185. package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
  186. package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
  187. package/dist/apps/cli-ui/InkTerminalView.js +25 -0
  188. package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
  189. package/dist/apps/cli-ui/index.js +8 -0
  190. package/dist/apps/cli-ui/inkColors.js +67 -0
  191. package/dist/apps/cli-ui/inkJson.js +244 -0
  192. package/dist/apps/cli-ui/inkMarkdown.js +122 -0
  193. package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
  194. package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
  195. package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
  196. package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
  197. package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
  198. package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
  199. package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
  200. package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
  201. package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
  202. package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
  203. package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
  204. package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
  205. package/dist/apps/context-files-ui/index.html +2 -2
  206. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  207. package/dist/apps/vscode-artifacts/pibo-vscode-1.3.0.vsix +0 -0
  208. package/dist/auth/better-auth.js +2 -1
  209. package/dist/auth/login-actions.js +251 -0
  210. package/dist/auth/openai-codex-usage.js +147 -0
  211. package/dist/bin/pibo.js +0 -0
  212. package/dist/bin/rg.js +15 -0
  213. package/dist/cli-session/fakeSessionSource.js +804 -0
  214. package/dist/cli-session/index.js +3 -0
  215. package/dist/cli-session/localSessionSource.js +1144 -0
  216. package/dist/cli-session/sessionSource.js +13 -0
  217. package/dist/cli.js +159 -14
  218. package/dist/compute/cli.js +415 -0
  219. package/dist/compute/docker.js +827 -0
  220. package/dist/compute/resource-health.js +333 -0
  221. package/dist/compute/resource-policy.js +98 -0
  222. package/dist/config/config.js +9 -5
  223. package/dist/core/context-build.js +677 -0
  224. package/dist/core/model-defaults.js +51 -9
  225. package/dist/core/pibo-home.js +8 -0
  226. package/dist/core/profiles.js +48 -0
  227. package/dist/core/provider-telemetry.js +222 -0
  228. package/dist/core/routed-session.js +441 -47
  229. package/dist/core/runtime-telemetry.js +853 -0
  230. package/dist/core/runtime.js +103 -15
  231. package/dist/core/session-errors.js +47 -0
  232. package/dist/core/session-model.js +39 -0
  233. package/dist/core/session-router.js +292 -62
  234. package/dist/core/shared-app.js +17 -0
  235. package/dist/core/skill-expansion.js +43 -0
  236. package/dist/core/system-prompt-template.js +9 -9
  237. package/dist/core/telemetry-staleness.js +128 -0
  238. package/dist/core/test-output-compaction.js +145 -0
  239. package/dist/core/user-settings.js +73 -0
  240. package/dist/cron/channel.js +28 -0
  241. package/dist/cron/cli.js +230 -0
  242. package/dist/cron/plugin.js +11 -0
  243. package/dist/cron/schedule.js +214 -0
  244. package/dist/cron/service.js +177 -0
  245. package/dist/cron/store.js +349 -0
  246. package/dist/cron/types.js +1 -0
  247. package/dist/data/cli.js +184 -0
  248. package/dist/data/event-log.js +106 -0
  249. package/dist/data/final-app-space-cutover-migration.js +728 -0
  250. package/dist/data/ingest-service.js +389 -0
  251. package/dist/data/message-store.js +62 -0
  252. package/dist/data/navigation-store.js +75 -0
  253. package/dist/data/observation-store.js +46 -0
  254. package/dist/data/payload-store.js +144 -0
  255. package/dist/data/pibo-store.js +59 -0
  256. package/dist/data/schema.js +434 -0
  257. package/dist/data/session-store.js +63 -0
  258. package/dist/data/shared-app-migration.js +757 -0
  259. package/dist/data/sqlite-schema.js +12 -0
  260. package/dist/data/telemetry-preview.js +65 -0
  261. package/dist/data/telemetry-queries.js +212 -0
  262. package/dist/data/telemetry-retention.js +50 -0
  263. package/dist/data/telemetry-rows.js +158 -0
  264. package/dist/data/telemetry.js +357 -0
  265. package/dist/debug/delta-compaction.js +99 -0
  266. package/dist/debug/detail-format.js +86 -0
  267. package/dist/debug/events.js +149 -29
  268. package/dist/debug/failures.js +162 -0
  269. package/dist/debug/index.js +655 -30
  270. package/dist/debug/messages.js +185 -0
  271. package/dist/debug/next-commands.js +6 -0
  272. package/dist/debug/payloads.js +123 -0
  273. package/dist/debug/pty.js +924 -0
  274. package/dist/debug/session.js +45 -15
  275. package/dist/debug/sql.js +1 -1
  276. package/dist/debug/stores.js +18 -13
  277. package/dist/debug/summary.js +72 -0
  278. package/dist/debug/telemetry.js +649 -0
  279. package/dist/debug/tools.js +168 -0
  280. package/dist/debug/trace-render-check.js +151 -0
  281. package/dist/debug/trace.js +152 -27
  282. package/dist/debug/web-artifacts.js +63 -0
  283. package/dist/debug/web-options.js +313 -0
  284. package/dist/debug/web-render-analysis.js +310 -0
  285. package/dist/debug/web-snapshot-browser-scripts.js +303 -0
  286. package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
  287. package/dist/debug/web-streaming-browser-library.js +928 -0
  288. package/dist/debug/web-streaming-browser-scripts.js +242 -0
  289. package/dist/debug/web-streaming-provider-telemetry.js +194 -0
  290. package/dist/debug/web-streaming-report.js +493 -0
  291. package/dist/debug/web-streaming-types.js +1 -0
  292. package/dist/debug/web.js +574 -0
  293. package/dist/gateway/backup.js +83 -0
  294. package/dist/gateway/cli.js +511 -0
  295. package/dist/gateway/fallback.js +155 -0
  296. package/dist/gateway/pidfile.js +84 -0
  297. package/dist/gateway/protocol.js +16 -0
  298. package/dist/gateway/server.js +172 -17
  299. package/dist/gateway/tool.js +54 -51
  300. package/dist/gateway/web.js +74 -2
  301. package/dist/index.js +3 -1
  302. package/dist/local/client.js +3 -3
  303. package/dist/local/extension.js +8 -5
  304. package/dist/plugins/builtin.js +251 -49
  305. package/dist/plugins/chat-vscode-web.js +28 -0
  306. package/dist/plugins/codex-compat.js +0 -41
  307. package/dist/plugins/context-files.js +98 -18
  308. package/dist/plugins/dev-auth.js +124 -0
  309. package/dist/plugins/native-tooling.js +15 -0
  310. package/dist/plugins/registry.js +49 -1
  311. package/dist/plugins/web-annotations.js +27 -0
  312. package/dist/providers/minimax.js +70 -0
  313. package/dist/providers/openai-compat.js +48 -0
  314. package/dist/ralph/channel.js +8 -0
  315. package/dist/ralph/cli.js +152 -0
  316. package/dist/ralph/plugin.js +14 -0
  317. package/dist/ralph/service.js +271 -0
  318. package/dist/ralph/stopping.js +151 -0
  319. package/dist/ralph/store.js +450 -0
  320. package/dist/ralph/templates.js +200 -0
  321. package/dist/ralph/types.js +1 -0
  322. package/dist/reliability/store.js +42 -26
  323. package/dist/runs/registry.js +72 -35
  324. package/dist/session-ui/commandCatalog.js +193 -0
  325. package/dist/session-ui/commandResults.js +95 -0
  326. package/dist/session-ui/index.js +7 -0
  327. package/dist/session-ui/ownerViewModel.js +27 -0
  328. package/dist/session-ui/roomSessionViewModel.js +69 -0
  329. package/dist/session-ui/statusViewModel.js +127 -0
  330. package/dist/session-ui/terminalCards.js +210 -0
  331. package/dist/session-ui/terminalRows.js +937 -0
  332. package/dist/session-ui/terminalValue.js +45 -0
  333. package/dist/sessions/pibo-data-store.js +178 -0
  334. package/dist/sessions/sqlite-store.js +78 -12
  335. package/dist/sessions/store.js +11 -4
  336. package/dist/sessions/workflow-session-kind.js +20 -0
  337. package/dist/setup/cli.js +567 -0
  338. package/dist/shared/trace-async-agent-runs.js +127 -0
  339. package/dist/shared/trace-engine.js +96 -0
  340. package/dist/shared/trace-event-projection.js +679 -0
  341. package/dist/shared/trace-live-reducer.js +191 -0
  342. package/dist/shared/trace-nodes.js +76 -0
  343. package/dist/shared/trace-order.js +11 -10
  344. package/dist/shared/trace-patch-nodes.js +83 -0
  345. package/dist/shared/trace-run-notifications.js +69 -0
  346. package/dist/shared/trace-subagent-links.js +46 -0
  347. package/dist/shared/trace-transcript.js +303 -0
  348. package/dist/shared/trace-types.js +1 -0
  349. package/dist/shared-app.js +4 -0
  350. package/dist/signals/aggregate.js +65 -0
  351. package/dist/signals/events.js +1 -0
  352. package/dist/signals/projector.js +158 -0
  353. package/dist/signals/registry.js +513 -0
  354. package/dist/signals/store.js +1 -0
  355. package/dist/signals/types.js +1 -0
  356. package/dist/skills/cli.js +117 -0
  357. package/dist/tools/agent-browser-leases.js +219 -0
  358. package/dist/tools/agent-browser-wrapper.js +99 -0
  359. package/dist/tools/browser-pool.js +623 -0
  360. package/dist/tools/browser-use-cdp.js +56 -4
  361. package/dist/tools/browser-use-leases.js +215 -37
  362. package/dist/tools/browser-use-wrapper.js +508 -65
  363. package/dist/tools/cdp-client.js +189 -0
  364. package/dist/tools/guides.js +203 -4
  365. package/dist/tools/index.js +666 -16
  366. package/dist/tools/npm-runtime.js +136 -0
  367. package/dist/tools/registry.js +107 -8
  368. package/dist/tools/runtime/index.js +3 -0
  369. package/dist/tools/runtime/node-backend.js +225 -0
  370. package/dist/tools/runtime/node-worker-source.js +206 -0
  371. package/dist/tools/runtime/python-backend.js +227 -0
  372. package/dist/tools/runtime/python-worker-source.js +178 -0
  373. package/dist/tools/runtime/registry.js +255 -0
  374. package/dist/tools/runtime/tool.js +168 -0
  375. package/dist/tools/runtime/types.js +1 -0
  376. package/dist/tools/web-search.js +2 -1
  377. package/dist/user-skills/installer.js +39 -36
  378. package/dist/user-skills/store.js +50 -11
  379. package/dist/vscode/cli.js +90 -0
  380. package/dist/vscode/code-cli.js +119 -0
  381. package/dist/vscode/install.js +177 -0
  382. package/dist/vscode/status.js +80 -0
  383. package/dist/vscode/types.js +14 -0
  384. package/dist/vscode/uninstall.js +49 -0
  385. package/dist/vscode/vsix-fetcher.js +131 -0
  386. package/dist/web/auth.js +5 -1
  387. package/dist/web/channel.js +86 -0
  388. package/dist/web/http.js +79 -14
  389. package/dist/web-annotations/api.js +348 -0
  390. package/dist/web-annotations/attachments.js +201 -0
  391. package/dist/web-annotations/cdp.js +1107 -0
  392. package/dist/web-annotations/index.js +7 -0
  393. package/dist/web-annotations/store.js +407 -0
  394. package/dist/web-annotations/tools.js +350 -0
  395. package/dist/web-annotations/types.js +34 -0
  396. package/dist/web-annotations/validation.js +288 -0
  397. package/docs/README.md +23 -0
  398. package/docs/ops/install-developer-host.md +112 -0
  399. package/docs/ops/install-user-host.md +76 -0
  400. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  401. package/docs/ops/vscode-extension-release.md +138 -0
  402. package/package.json +24 -9
  403. package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
  404. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  405. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  406. package/skills/builtin/prd/SKILL.md +143 -0
  407. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  408. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  409. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  410. package/skills/builtin/skill-creator/SKILL.md +513 -0
  411. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  412. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  413. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  414. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  415. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  416. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  417. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  418. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  419. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  420. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  421. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  422. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  423. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  424. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  425. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  426. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  427. package/skills/builtin/web-annotations/SKILL.md +93 -0
  428. package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
  429. package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
  430. package/dist/env.js +0 -32
  431. package/dist/plugins/core-tools.js +0 -94
  432. package/dist/plugins/example.js +0 -67
  433. package/dist/plugins/remote-agent.js +0 -9
  434. package/dist/remote/channel.js +0 -176
  435. package/dist/remote/client.js +0 -92
  436. package/dist/remote/examples/tui-controller.js +0 -263
  437. package/dist/remote/protocol.js +0 -55
  438. package/dist/remote/session-client.js +0 -189
  439. package/dist/sessions/bindings.js +0 -41
@@ -5,6 +5,7 @@ import { betterAuth } from "better-auth";
5
5
  import { getMigrations } from "better-auth/db/migration";
6
6
  import { bearer } from "better-auth/plugins";
7
7
  import { loadPiboConfig } from "../config/config.js";
8
+ import { piboHomePath } from "../core/pibo-home.js";
8
9
  import { createForbiddenAuthError, createUnauthenticatedError } from "./types.js";
9
10
  const SESSION_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 90;
10
11
  const SESSION_UPDATE_AGE_SECONDS = 60 * 60;
@@ -63,7 +64,7 @@ export function createBetterAuthService(options = {}) {
63
64
  const googleClientSecret = requiredOption(options.googleClientSecret ?? authConfig?.googleClientSecret, "auth.googleClientSecret");
64
65
  const secret = requiredSecret(options.secret ?? authConfig?.secret);
65
66
  const allowedEmails = requiredAllowedEmails(options, authConfig?.allowedEmails);
66
- const database = createDatabase(options.databasePath ?? authConfig?.databasePath ?? ".pibo/auth.sqlite");
67
+ const database = createDatabase(options.databasePath ?? authConfig?.databasePath ?? piboHomePath("auth.sqlite"));
67
68
  const trustedOrigins = options.trustedOrigins ?? authConfig?.trustedOrigins;
68
69
  const authOptions = {
69
70
  appName: "Pibo",
@@ -0,0 +1,251 @@
1
+ import { AuthStorage } from "@mariozechner/pi-coding-agent";
2
+ import { randomBytes } from "node:crypto";
3
+ const OPENAI_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
4
+ const OPENAI_AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
5
+ const OPENAI_ISSUER_URL = "https://auth.openai.com";
6
+ const OPENAI_DEVICE_USER_CODE_URL = `${OPENAI_ISSUER_URL}/api/accounts/deviceauth/usercode`;
7
+ const OPENAI_DEVICE_TOKEN_URL = `${OPENAI_ISSUER_URL}/api/accounts/deviceauth/token`;
8
+ const OPENAI_DEVICE_VERIFICATION_URL = `${OPENAI_ISSUER_URL}/codex/device`;
9
+ const OPENAI_TOKEN_URL = "https://auth.openai.com/oauth/token";
10
+ const OPENAI_REDIRECT_URI = "http://localhost:1455/auth/callback";
11
+ const OPENAI_DEVICE_REDIRECT_URI = `${OPENAI_ISSUER_URL}/deviceauth/callback`;
12
+ const OPENAI_SCOPE = "openid profile email offline_access";
13
+ const OPENAI_JWT_CLAIM_PATH = "https://api.openai.com/auth";
14
+ const OPENAI_DEVICE_LOGIN_TIMEOUT_MS = 15 * 60 * 1000;
15
+ function base64urlEncode(bytes) {
16
+ let binary = "";
17
+ for (const byte of bytes) {
18
+ binary += String.fromCharCode(byte);
19
+ }
20
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
21
+ }
22
+ async function generatePKCE() {
23
+ const verifierBytes = new Uint8Array(32);
24
+ crypto.getRandomValues(verifierBytes);
25
+ const verifier = base64urlEncode(verifierBytes);
26
+ const encoder = new TextEncoder();
27
+ const data = encoder.encode(verifier);
28
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
29
+ const challenge = base64urlEncode(new Uint8Array(hashBuffer));
30
+ return { verifier, challenge };
31
+ }
32
+ const pendingLogins = new Map();
33
+ function createAuthStorage() {
34
+ return AuthStorage.create();
35
+ }
36
+ function decodeJwt(token) {
37
+ try {
38
+ const parts = token.split(".");
39
+ if (parts.length !== 3)
40
+ return null;
41
+ const payload = parts[1] ?? "";
42
+ const decoded = atob(payload);
43
+ return JSON.parse(decoded);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ function getOpenAiAccountId(accessToken) {
50
+ const payload = decodeJwt(accessToken);
51
+ const auth = payload?.[OPENAI_JWT_CLAIM_PATH];
52
+ const accountId = auth?.chatgpt_account_id;
53
+ return typeof accountId === "string" && accountId.length > 0 ? accountId : null;
54
+ }
55
+ function requirePendingLogin(state, provider) {
56
+ const pending = pendingLogins.get(state);
57
+ if (!pending) {
58
+ throw new Error("Invalid or expired login state. Start a new login flow with /login-start.");
59
+ }
60
+ if (pending.provider !== provider) {
61
+ throw new Error(`Login state mismatch: expected provider "${pending.provider}", got "${provider}".`);
62
+ }
63
+ // Expire after 10 minutes
64
+ if (Date.now() - pending.createdAt > 10 * 60 * 1000) {
65
+ pendingLogins.delete(state);
66
+ throw new Error("Login state expired. Start a new login flow with /login-start.");
67
+ }
68
+ return pending;
69
+ }
70
+ async function readResponseText(response) {
71
+ return await response.text().catch(() => "");
72
+ }
73
+ function parseDeviceIntervalMs(value) {
74
+ const parsed = typeof value === "number" ? value : Number.parseInt(value ?? "", 10);
75
+ return Number.isFinite(parsed) && parsed > 0 ? parsed * 1000 : 5000;
76
+ }
77
+ async function startOpenAiDeviceLogin(provider) {
78
+ const response = await fetch(OPENAI_DEVICE_USER_CODE_URL, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify({ client_id: OPENAI_CLIENT_ID }),
82
+ });
83
+ if (!response.ok) {
84
+ const text = await readResponseText(response);
85
+ const suffix = text ? ` ${text}` : "";
86
+ if (response.status === 404) {
87
+ throw new Error(`OpenAI device code login is not enabled for this account or Codex server.${suffix}`);
88
+ }
89
+ throw new Error(`OpenAI device code request failed: ${response.status}${suffix}`);
90
+ }
91
+ const json = (await response.json());
92
+ const deviceAuthId = json.device_auth_id;
93
+ const userCode = json.user_code ?? json.usercode;
94
+ if (!deviceAuthId || !userCode) {
95
+ throw new Error("Invalid device code response from OpenAI");
96
+ }
97
+ const state = randomBytes(16).toString("hex");
98
+ pendingLogins.set(state, {
99
+ type: "device",
100
+ deviceAuthId,
101
+ userCode,
102
+ intervalMs: parseDeviceIntervalMs(json.interval),
103
+ state,
104
+ provider,
105
+ createdAt: Date.now(),
106
+ });
107
+ return {
108
+ type: "device_code",
109
+ url: OPENAI_DEVICE_VERIFICATION_URL,
110
+ verificationUrl: OPENAI_DEVICE_VERIFICATION_URL,
111
+ userCode,
112
+ state,
113
+ provider,
114
+ instructions: "Open the URL in any browser, enter the one-time code, finish sign-in, then return here and complete login.",
115
+ };
116
+ }
117
+ async function pollOpenAiDeviceAuthorization(pending) {
118
+ const startedAt = Date.now();
119
+ while (Date.now() - startedAt < OPENAI_DEVICE_LOGIN_TIMEOUT_MS) {
120
+ const response = await fetch(OPENAI_DEVICE_TOKEN_URL, {
121
+ method: "POST",
122
+ headers: { "Content-Type": "application/json" },
123
+ body: JSON.stringify({
124
+ device_auth_id: pending.deviceAuthId,
125
+ user_code: pending.userCode,
126
+ }),
127
+ });
128
+ if (response.ok) {
129
+ const json = (await response.json());
130
+ if (!json.authorization_code || !json.code_verifier) {
131
+ throw new Error("Invalid device authorization response from OpenAI");
132
+ }
133
+ return json;
134
+ }
135
+ if (response.status !== 403 && response.status !== 404) {
136
+ const text = await readResponseText(response);
137
+ throw new Error(`OpenAI device authorization failed: ${response.status}${text ? ` ${text}` : ""}`);
138
+ }
139
+ await new Promise((resolve) => setTimeout(resolve, pending.intervalMs));
140
+ }
141
+ throw new Error("OpenAI device authorization timed out after 15 minutes.");
142
+ }
143
+ async function exchangeOpenAiAuthorizationCode(code, verifier, redirectUri) {
144
+ const response = await fetch(OPENAI_TOKEN_URL, {
145
+ method: "POST",
146
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
147
+ body: new URLSearchParams({
148
+ grant_type: "authorization_code",
149
+ client_id: OPENAI_CLIENT_ID,
150
+ code,
151
+ code_verifier: verifier,
152
+ redirect_uri: redirectUri,
153
+ }),
154
+ });
155
+ if (!response.ok) {
156
+ const text = await readResponseText(response);
157
+ throw new Error(`Token exchange failed: ${response.status} ${text}`);
158
+ }
159
+ const json = (await response.json());
160
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
161
+ throw new Error("Invalid token response from OpenAI");
162
+ }
163
+ return { accessToken: json.access_token, refreshToken: json.refresh_token, expiresIn: json.expires_in };
164
+ }
165
+ export async function startLogin(provider) {
166
+ if (provider === "openai-codex") {
167
+ return await startOpenAiDeviceLogin(provider);
168
+ }
169
+ if (provider === "openai-codex-browser") {
170
+ const { verifier, challenge } = await generatePKCE();
171
+ const state = randomBytes(16).toString("hex");
172
+ const url = new URL(OPENAI_AUTHORIZE_URL);
173
+ url.searchParams.set("response_type", "code");
174
+ url.searchParams.set("client_id", OPENAI_CLIENT_ID);
175
+ url.searchParams.set("redirect_uri", OPENAI_REDIRECT_URI);
176
+ url.searchParams.set("scope", OPENAI_SCOPE);
177
+ url.searchParams.set("code_challenge", challenge);
178
+ url.searchParams.set("code_challenge_method", "S256");
179
+ url.searchParams.set("state", state);
180
+ url.searchParams.set("id_token_add_organizations", "true");
181
+ url.searchParams.set("codex_cli_simplified_flow", "true");
182
+ url.searchParams.set("originator", "pibo");
183
+ pendingLogins.set(state, { type: "browser", verifier, state, provider, createdAt: Date.now() });
184
+ return {
185
+ url: url.toString(),
186
+ state,
187
+ provider,
188
+ instructions: "Open the URL in your browser, complete login, then paste the authorization code (or full redirect URL) via /login-complete.",
189
+ };
190
+ }
191
+ throw new Error(`OAuth login start not supported for provider "${provider}". Supported: openai-codex.`);
192
+ }
193
+ export async function completeLogin(provider, code, state) {
194
+ if (provider === "openai-codex") {
195
+ const pending = requirePendingLogin(state, provider);
196
+ if (pending.type !== "device") {
197
+ throw new Error("Login flow mismatch. Start a new OpenAI device login.");
198
+ }
199
+ const deviceResult = await pollOpenAiDeviceAuthorization(pending);
200
+ const tokenResult = await exchangeOpenAiAuthorizationCode(deviceResult.authorization_code, deviceResult.code_verifier, OPENAI_DEVICE_REDIRECT_URI);
201
+ const accountId = getOpenAiAccountId(tokenResult.accessToken);
202
+ const authStorage = createAuthStorage();
203
+ authStorage.set(provider, {
204
+ type: "oauth",
205
+ access: tokenResult.accessToken,
206
+ refresh: tokenResult.refreshToken,
207
+ expires: Date.now() + tokenResult.expiresIn * 1000,
208
+ accountId: accountId ?? undefined,
209
+ });
210
+ pendingLogins.delete(state);
211
+ return { success: true, provider, accountId };
212
+ }
213
+ if (provider === "openai-codex-browser") {
214
+ if (!code)
215
+ throw new Error("login.complete requires params.code");
216
+ const pending = requirePendingLogin(state, provider);
217
+ pendingLogins.delete(state);
218
+ if (pending.type !== "browser") {
219
+ throw new Error("Login flow mismatch. Start a new OpenAI browser login.");
220
+ }
221
+ const tokenResult = await exchangeOpenAiAuthorizationCode(code, pending.verifier, OPENAI_REDIRECT_URI);
222
+ const accountId = getOpenAiAccountId(tokenResult.accessToken);
223
+ const authStorage = createAuthStorage();
224
+ authStorage.set("openai-codex", {
225
+ type: "oauth",
226
+ access: tokenResult.accessToken,
227
+ refresh: tokenResult.refreshToken,
228
+ expires: Date.now() + tokenResult.expiresIn * 1000,
229
+ accountId: accountId ?? undefined,
230
+ });
231
+ return { success: true, provider: "openai-codex", accountId };
232
+ }
233
+ throw new Error(`OAuth login complete not supported for provider "${provider}". Supported: openai-codex.`);
234
+ }
235
+ export function setApiKey(provider, apiKey) {
236
+ const authStorage = createAuthStorage();
237
+ authStorage.set(provider, { type: "api_key", key: apiKey });
238
+ return { success: true, provider };
239
+ }
240
+ export function getLoginStatus(provider) {
241
+ const authStorage = createAuthStorage();
242
+ if (provider) {
243
+ return [{ id: provider, provider, ...authStorage.getAuthStatus(provider) }];
244
+ }
245
+ return authStorage.list().map((p) => ({ id: p, provider: p, ...authStorage.getAuthStatus(p) }));
246
+ }
247
+ export function removeLogin(provider) {
248
+ const authStorage = createAuthStorage();
249
+ authStorage.logout(provider);
250
+ return { success: true, provider };
251
+ }
@@ -0,0 +1,147 @@
1
+ import { AuthStorage } from "@mariozechner/pi-coding-agent";
2
+ const OPENAI_CODEX_PROVIDER = "openai-codex";
3
+ const OPENAI_CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
4
+ const OPENAI_JWT_CLAIM_PATH = "https://api.openai.com/auth";
5
+ function isRecord(value) {
6
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
7
+ }
8
+ function stringValue(value) {
9
+ return typeof value === "string" && value.length > 0 ? value : undefined;
10
+ }
11
+ function numberValue(value) {
12
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
13
+ }
14
+ function objectValue(value) {
15
+ return isRecord(value) ? value : undefined;
16
+ }
17
+ function optionalBoxedObject(value) {
18
+ if (isRecord(value))
19
+ return value;
20
+ return undefined;
21
+ }
22
+ function getField(obj, snake, camel) {
23
+ return obj[snake] ?? obj[camel];
24
+ }
25
+ function decodeJwt(token) {
26
+ try {
27
+ const payload = token.split(".")[1];
28
+ if (!payload)
29
+ return undefined;
30
+ const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
31
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
32
+ const decoded = Buffer.from(padded, "base64").toString("utf8");
33
+ const parsed = JSON.parse(decoded);
34
+ return isRecord(parsed) ? parsed : undefined;
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ function getOpenAiAccountId(accessToken, storedAccountId) {
41
+ const stored = stringValue(storedAccountId);
42
+ if (stored)
43
+ return stored;
44
+ const payload = decodeJwt(accessToken);
45
+ const auth = payload ? objectValue(payload[OPENAI_JWT_CLAIM_PATH]) : undefined;
46
+ return auth ? stringValue(auth.chatgpt_account_id) : undefined;
47
+ }
48
+ function formatLimitLabel(window, fallback) {
49
+ const seconds = numberValue(getField(window, "limit_window_seconds", "limitWindowSeconds"));
50
+ if (!seconds || seconds <= 0)
51
+ return fallback;
52
+ const minutes = Math.round(seconds / 60);
53
+ if (minutes % (7 * 24 * 60) === 0)
54
+ return `${minutes / (7 * 24 * 60)}w`;
55
+ if (minutes % (24 * 60) === 0)
56
+ return `${minutes / (24 * 60)}d`;
57
+ if (minutes % 60 === 0)
58
+ return `${minutes / 60}h`;
59
+ return `${minutes}m`;
60
+ }
61
+ function normalizeWindow(value, fallbackLabel) {
62
+ const window = optionalBoxedObject(value);
63
+ if (!window)
64
+ return undefined;
65
+ const usedPercent = numberValue(getField(window, "used_percent", "usedPercent"));
66
+ if (usedPercent === undefined)
67
+ return undefined;
68
+ const seconds = numberValue(getField(window, "limit_window_seconds", "limitWindowSeconds"));
69
+ const resetAt = numberValue(getField(window, "reset_at", "resetAt"));
70
+ return {
71
+ label: `${formatLimitLabel(window, fallbackLabel)} limit`,
72
+ usedPercent,
73
+ remainingPercent: Math.max(0, Math.min(100, 100 - usedPercent)),
74
+ windowMinutes: seconds && seconds > 0 ? Math.round(seconds / 60) : undefined,
75
+ resetsAt: resetAt ? new Date(resetAt * 1000).toISOString() : undefined,
76
+ };
77
+ }
78
+ function normalizeRateLimit(rateLimit) {
79
+ if (!rateLimit)
80
+ return [];
81
+ return [
82
+ normalizeWindow(getField(rateLimit, "primary_window", "primaryWindow"), "5h"),
83
+ normalizeWindow(getField(rateLimit, "secondary_window", "secondaryWindow"), "weekly"),
84
+ ].filter((entry) => Boolean(entry));
85
+ }
86
+ function normalizeCredits(value) {
87
+ const credits = objectValue(value);
88
+ if (!credits)
89
+ return undefined;
90
+ if (credits.has_credits !== true && credits.hasCredits !== true)
91
+ return undefined;
92
+ return {
93
+ unlimited: credits.unlimited === true,
94
+ balance: stringValue(credits.balance),
95
+ };
96
+ }
97
+ function normalizeUsagePayload(payload) {
98
+ if (!isRecord(payload))
99
+ return undefined;
100
+ const planType = stringValue(getField(payload, "plan_type", "planType"));
101
+ const limits = normalizeRateLimit(objectValue(getField(payload, "rate_limit", "rateLimit")));
102
+ const additional = getField(payload, "additional_rate_limits", "additionalRateLimits");
103
+ if (Array.isArray(additional)) {
104
+ for (const item of additional) {
105
+ const detail = objectValue(item);
106
+ const rateLimit = detail ? objectValue(getField(detail, "rate_limit", "rateLimit")) : undefined;
107
+ const limitName = detail ? stringValue(getField(detail, "limit_name", "limitName")) : undefined;
108
+ for (const window of normalizeRateLimit(rateLimit)) {
109
+ limits.push(limitName ? { ...window, label: `${limitName} ${window.label}` } : window);
110
+ }
111
+ }
112
+ }
113
+ const credits = normalizeCredits(getField(payload, "credits", "credits"));
114
+ if (limits.length === 0 && !credits)
115
+ return undefined;
116
+ return {
117
+ provider: OPENAI_CODEX_PROVIDER,
118
+ planType,
119
+ limits,
120
+ credits,
121
+ fetchedAt: new Date().toISOString(),
122
+ };
123
+ }
124
+ export async function getOpenAiCodexProviderUsageForActiveModel(activeModel) {
125
+ if (activeModel?.provider !== OPENAI_CODEX_PROVIDER)
126
+ return undefined;
127
+ const authStorage = AuthStorage.create();
128
+ const credential = authStorage.get(OPENAI_CODEX_PROVIDER);
129
+ if (credential?.type !== "oauth")
130
+ return undefined;
131
+ const accessToken = await authStorage.getApiKey(OPENAI_CODEX_PROVIDER, { includeFallback: false });
132
+ if (!accessToken)
133
+ return undefined;
134
+ const headers = {
135
+ Authorization: `Bearer ${accessToken}`,
136
+ "User-Agent": "codex-cli",
137
+ };
138
+ const accountId = getOpenAiAccountId(accessToken, credential.accountId);
139
+ if (accountId)
140
+ headers["ChatGPT-Account-Id"] = accountId;
141
+ const response = await fetch(OPENAI_CODEX_USAGE_URL, { headers });
142
+ if (!response.ok) {
143
+ const text = await response.text().catch(() => "");
144
+ throw new Error(`OpenAI Codex usage request failed: ${response.status}${text ? ` ${text}` : ""}`);
145
+ }
146
+ return normalizeUsagePayload(await response.json());
147
+ }
package/dist/bin/pibo.js CHANGED
File without changes
package/dist/bin/rg.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { rgPath } from "@vscode/ripgrep";
4
+ const child = spawn(rgPath, process.argv.slice(2), { stdio: "inherit" });
5
+ child.on("error", (error) => {
6
+ console.error(`rg: ${error.message}`);
7
+ process.exit(1);
8
+ });
9
+ child.on("exit", (code, signal) => {
10
+ if (signal) {
11
+ process.kill(process.pid, signal);
12
+ return;
13
+ }
14
+ process.exit(code ?? 1);
15
+ });