@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
@@ -0,0 +1,311 @@
1
+ import { PiboWebHttpError } from "../../web/http.js";
2
+ export const CHAT_WEB_API_PREFIX = "/api/chat";
3
+ export function roomResourcePath(pathname) {
4
+ const prefix = `${CHAT_WEB_API_PREFIX}/rooms/`;
5
+ if (!pathname.startsWith(prefix))
6
+ return undefined;
7
+ const parts = pathname
8
+ .slice(prefix.length)
9
+ .split("/")
10
+ .filter((part) => part.length > 0);
11
+ if (parts.length < 1 || parts.length > 2)
12
+ return undefined;
13
+ try {
14
+ const roomId = decodeURIComponent(parts[0]);
15
+ const child = parts[1] ? decodeURIComponent(parts[1]) : undefined;
16
+ if (child && child !== "events" && child !== "messages" && child !== "read")
17
+ return undefined;
18
+ return { roomId, child };
19
+ }
20
+ catch {
21
+ throw new PiboWebHttpError("Invalid room id", 400);
22
+ }
23
+ }
24
+ export function agentResourceId(pathname) {
25
+ const prefix = `${CHAT_WEB_API_PREFIX}/agents/`;
26
+ if (!pathname.startsWith(prefix))
27
+ return undefined;
28
+ const encodedId = pathname.slice(prefix.length);
29
+ if (!encodedId || encodedId.includes("/"))
30
+ return undefined;
31
+ try {
32
+ return decodeURIComponent(encodedId);
33
+ }
34
+ catch {
35
+ throw new PiboWebHttpError("Invalid agent id", 400);
36
+ }
37
+ }
38
+ export function workflowPickerKind(pathname) {
39
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/pickers/`;
40
+ if (!pathname.startsWith(prefix))
41
+ return undefined;
42
+ const encodedKind = pathname.slice(prefix.length);
43
+ if (!encodedKind || encodedKind.includes("/"))
44
+ return undefined;
45
+ try {
46
+ return decodeURIComponent(encodedKind);
47
+ }
48
+ catch {
49
+ throw new PiboWebHttpError("Invalid workflow picker kind", 400);
50
+ }
51
+ }
52
+ export function workflowPromptAssetResourceId(pathname) {
53
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/prompt-assets/`;
54
+ if (!pathname.startsWith(prefix))
55
+ return undefined;
56
+ const encodedId = pathname.slice(prefix.length);
57
+ if (!encodedId || encodedId.includes("/"))
58
+ return undefined;
59
+ try {
60
+ return decodeURIComponent(encodedId);
61
+ }
62
+ catch {
63
+ throw new PiboWebHttpError("Invalid workflow prompt asset id", 400);
64
+ }
65
+ }
66
+ export function workflowDraftResourceId(pathname) {
67
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/drafts/`;
68
+ if (!pathname.startsWith(prefix))
69
+ return undefined;
70
+ const encodedId = pathname.slice(prefix.length);
71
+ if (!encodedId || encodedId.includes("/"))
72
+ return undefined;
73
+ try {
74
+ return decodeURIComponent(encodedId);
75
+ }
76
+ catch {
77
+ throw new PiboWebHttpError("Invalid workflow draft id", 400);
78
+ }
79
+ }
80
+ export function workflowDraftActionResource(pathname) {
81
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/drafts/`;
82
+ if (!pathname.startsWith(prefix))
83
+ return undefined;
84
+ const parts = pathname.slice(prefix.length).split("/");
85
+ if (parts.length !== 2 || !parts[0] || !parts[1])
86
+ return undefined;
87
+ try {
88
+ const action = decodeURIComponent(parts[1]);
89
+ if (action !== "validate" && action !== "publish")
90
+ return undefined;
91
+ return { draftId: decodeURIComponent(parts[0]), action };
92
+ }
93
+ catch {
94
+ throw new PiboWebHttpError("Invalid workflow draft action", 400);
95
+ }
96
+ }
97
+ export function workflowDuplicateResourceId(pathname) {
98
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/`;
99
+ const suffix = "/duplicate";
100
+ if (!pathname.startsWith(prefix) || !pathname.endsWith(suffix))
101
+ return undefined;
102
+ const encodedId = pathname.slice(prefix.length, -suffix.length);
103
+ if (!encodedId || encodedId.includes("/"))
104
+ return undefined;
105
+ try {
106
+ return decodeURIComponent(encodedId);
107
+ }
108
+ catch {
109
+ throw new PiboWebHttpError("Invalid workflow id", 400);
110
+ }
111
+ }
112
+ export function workflowNextDraftResourceId(pathname) {
113
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/`;
114
+ const suffix = "/drafts";
115
+ if (!pathname.startsWith(prefix) || !pathname.endsWith(suffix))
116
+ return undefined;
117
+ const encodedId = pathname.slice(prefix.length, -suffix.length);
118
+ if (!encodedId || encodedId.includes("/"))
119
+ return undefined;
120
+ try {
121
+ return decodeURIComponent(encodedId);
122
+ }
123
+ catch {
124
+ throw new PiboWebHttpError("Invalid workflow id", 400);
125
+ }
126
+ }
127
+ export function workflowArchiveResourceId(pathname) {
128
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/`;
129
+ const suffix = "/archive";
130
+ if (!pathname.startsWith(prefix) || !pathname.endsWith(suffix))
131
+ return undefined;
132
+ const encodedId = pathname.slice(prefix.length, -suffix.length);
133
+ if (!encodedId || encodedId.includes("/"))
134
+ return undefined;
135
+ try {
136
+ return decodeURIComponent(encodedId);
137
+ }
138
+ catch {
139
+ throw new PiboWebHttpError("Invalid workflow id", 400);
140
+ }
141
+ }
142
+ export function workflowVersionResource(pathname) {
143
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/`;
144
+ if (!pathname.startsWith(prefix))
145
+ return undefined;
146
+ const parts = pathname.slice(prefix.length).split("/");
147
+ if (parts.length !== 2 && parts.length !== 3)
148
+ return undefined;
149
+ if (!parts[0] || parts[1] !== "versions" || (parts.length === 3 && !parts[2]))
150
+ return undefined;
151
+ try {
152
+ return {
153
+ workflowId: decodeURIComponent(parts[0]),
154
+ ...(parts[2] ? { version: decodeURIComponent(parts[2]) } : {}),
155
+ };
156
+ }
157
+ catch {
158
+ throw new PiboWebHttpError("Invalid workflow version route", 400);
159
+ }
160
+ }
161
+ export function workflowCatalogResourceId(pathname) {
162
+ const prefix = `${CHAT_WEB_API_PREFIX}/workflows/`;
163
+ if (!pathname.startsWith(prefix))
164
+ return undefined;
165
+ const encodedId = pathname.slice(prefix.length);
166
+ if (!encodedId || encodedId.includes("/"))
167
+ return undefined;
168
+ try {
169
+ const workflowId = decodeURIComponent(encodedId);
170
+ if (workflowId === "drafts" || workflowId === "pickers" || workflowId === "lifecycle-events")
171
+ return undefined;
172
+ return workflowId;
173
+ }
174
+ catch {
175
+ throw new PiboWebHttpError("Invalid workflow id", 400);
176
+ }
177
+ }
178
+ export function piPackageResourceId(pathname) {
179
+ const prefix = `${CHAT_WEB_API_PREFIX}/pi-packages/`;
180
+ if (!pathname.startsWith(prefix))
181
+ return undefined;
182
+ const encodedId = pathname.slice(prefix.length);
183
+ if (!encodedId || encodedId.includes("/"))
184
+ return undefined;
185
+ try {
186
+ return decodeURIComponent(encodedId);
187
+ }
188
+ catch {
189
+ throw new PiboWebHttpError("Invalid Pi package id", 400);
190
+ }
191
+ }
192
+ export function mcpServerResourceName(pathname) {
193
+ const prefix = `${CHAT_WEB_API_PREFIX}/mcp-servers/`;
194
+ const suffix = "/description";
195
+ if (!pathname.startsWith(prefix) || !pathname.endsWith(suffix))
196
+ return undefined;
197
+ const encodedName = pathname.slice(prefix.length, -suffix.length);
198
+ if (!encodedName || encodedName.includes("/"))
199
+ return undefined;
200
+ try {
201
+ return decodeURIComponent(encodedName);
202
+ }
203
+ catch {
204
+ throw new PiboWebHttpError("Invalid MCP server name", 400);
205
+ }
206
+ }
207
+ export function userSkillResourceId(pathname) {
208
+ const prefix = `${CHAT_WEB_API_PREFIX}/user-skills/`;
209
+ if (!pathname.startsWith(prefix))
210
+ return undefined;
211
+ const encodedId = pathname.slice(prefix.length);
212
+ if (!encodedId || encodedId.includes("/"))
213
+ return undefined;
214
+ try {
215
+ return decodeURIComponent(encodedId);
216
+ }
217
+ catch {
218
+ throw new PiboWebHttpError("Invalid user skill id", 400);
219
+ }
220
+ }
221
+ export function projectResourcePath(pathname) {
222
+ const prefix = `${CHAT_WEB_API_PREFIX}/projects/`;
223
+ if (!pathname.startsWith(prefix))
224
+ return undefined;
225
+ const parts = pathname.slice(prefix.length).split("/").filter(Boolean).map((part) => decodeURIComponent(part));
226
+ if (!parts[0])
227
+ return undefined;
228
+ return { projectId: parts[0], ...(parts[1] ? { child: parts[1] } : {}) };
229
+ }
230
+ export function projectWorkflowSessionStartResource(pathname) {
231
+ const prefix = `${CHAT_WEB_API_PREFIX}/projects/`;
232
+ if (!pathname.startsWith(prefix))
233
+ return undefined;
234
+ const parts = pathname.slice(prefix.length).split("/");
235
+ if (parts.length !== 4 || !parts[0] || parts[1] !== "workflow-sessions" || !parts[2] || parts[3] !== "start")
236
+ return undefined;
237
+ try {
238
+ return { projectId: decodeURIComponent(parts[0]), piboSessionId: decodeURIComponent(parts[2]) };
239
+ }
240
+ catch {
241
+ throw new PiboWebHttpError("Invalid Project workflow session start path", 400);
242
+ }
243
+ }
244
+ export function projectWorkflowHumanActionsResource(pathname) {
245
+ const prefix = `${CHAT_WEB_API_PREFIX}/projects/`;
246
+ if (!pathname.startsWith(prefix))
247
+ return undefined;
248
+ const parts = pathname.slice(prefix.length).split("/");
249
+ if (parts.length !== 4 || !parts[0] || parts[1] !== "workflow-sessions" || !parts[2] || parts[3] !== "human-actions")
250
+ return undefined;
251
+ try {
252
+ return { projectId: decodeURIComponent(parts[0]), piboSessionId: decodeURIComponent(parts[2]) };
253
+ }
254
+ catch {
255
+ throw new PiboWebHttpError("Invalid Project workflow human-action path", 400);
256
+ }
257
+ }
258
+ export function projectSessionResourceId(pathname) {
259
+ const prefix = `${CHAT_WEB_API_PREFIX}/project-sessions/`;
260
+ if (!pathname.startsWith(prefix))
261
+ return undefined;
262
+ const encodedId = pathname.slice(prefix.length);
263
+ if (!encodedId || encodedId.includes("/"))
264
+ return undefined;
265
+ return decodeURIComponent(encodedId);
266
+ }
267
+ export function sessionResourceId(pathname) {
268
+ const prefix = `${CHAT_WEB_API_PREFIX}/sessions/`;
269
+ if (!pathname.startsWith(prefix))
270
+ return undefined;
271
+ const encodedId = pathname.slice(prefix.length);
272
+ if (!encodedId || encodedId.includes("/"))
273
+ return undefined;
274
+ try {
275
+ return decodeURIComponent(encodedId);
276
+ }
277
+ catch {
278
+ throw new PiboWebHttpError("Invalid session id", 400);
279
+ }
280
+ }
281
+ export function sessionActionResource(pathname) {
282
+ const prefix = `${CHAT_WEB_API_PREFIX}/sessions/`;
283
+ if (!pathname.startsWith(prefix))
284
+ return undefined;
285
+ const parts = pathname.slice(prefix.length).split("/");
286
+ if (parts.length !== 2 || !parts[0])
287
+ return undefined;
288
+ const action = parts[1];
289
+ if (action !== "read" && action !== "kill" && action !== "kill-all")
290
+ return undefined;
291
+ try {
292
+ return { piboSessionId: decodeURIComponent(parts[0]), action };
293
+ }
294
+ catch {
295
+ throw new PiboWebHttpError("Invalid session id", 400);
296
+ }
297
+ }
298
+ export function signalResource(pathname) {
299
+ const prefix = `${CHAT_WEB_API_PREFIX}/signals/`;
300
+ if (!pathname.startsWith(prefix))
301
+ return undefined;
302
+ const [kind, encodedId, extra] = pathname.slice(prefix.length).split("/");
303
+ if (extra || (kind !== "session" && kind !== "tree") || !encodedId)
304
+ return undefined;
305
+ try {
306
+ return { kind, piboSessionId: decodeURIComponent(encodedId) };
307
+ }
308
+ catch {
309
+ throw new PiboWebHttpError("Invalid session id", 400);
310
+ }
311
+ }
@@ -0,0 +1,90 @@
1
+ import { setMcpServerDescription } from "../../mcp/agent-context.js";
2
+ import { inspectPiPackageSource } from "../../pi-packages/metadata.js";
3
+ import { findPiPackage, listPiPackages, removePiPackage, setPiPackageEnabled, upsertPiPackage } from "../../pi-packages/store.js";
4
+ import { PiboWebHttpError, readJsonBody, responseJson } from "../../web/http.js";
5
+ import { CHAT_WEB_API_PREFIX, mcpServerResourceName, piPackageResourceId } from "./chat-api-routes.js";
6
+ import { normalizeMcpServerDescriptionBody, normalizePiPackageWebSource, } from "./chat-request-normalizers.js";
7
+ export function chatCapabilityRoute(pathname, method) {
8
+ if (pathname === `${CHAT_WEB_API_PREFIX}/pi-packages` && method === "GET")
9
+ return { kind: "pi-packages-list" };
10
+ if (pathname === `${CHAT_WEB_API_PREFIX}/pi-packages` && method === "POST")
11
+ return { kind: "pi-packages-create" };
12
+ const packageId = piPackageResourceId(pathname);
13
+ if (packageId && method === "GET")
14
+ return { kind: "pi-package-read", packageId };
15
+ if (packageId && method === "PATCH")
16
+ return { kind: "pi-package-update", packageId };
17
+ if (packageId && method === "DELETE")
18
+ return { kind: "pi-package-delete", packageId };
19
+ const serverName = mcpServerResourceName(pathname);
20
+ if (serverName && method === "PATCH")
21
+ return { kind: "mcp-server-description-update", serverName };
22
+ return undefined;
23
+ }
24
+ export function chatCapabilityRouteRequiresSameOrigin(route) {
25
+ return route.kind !== "pi-packages-list" && route.kind !== "pi-package-read";
26
+ }
27
+ export async function handleChatCapabilityRoute(options) {
28
+ const { route, request, cwd, invalidateBootstrapCatalogCache, agentsSelectingPiPackage } = options;
29
+ switch (route.kind) {
30
+ case "pi-packages-list":
31
+ return responseJson({ packages: listPiPackages() });
32
+ case "pi-packages-create": {
33
+ const body = await readJsonBody(request);
34
+ const source = normalizePiPackageWebSource(body.source);
35
+ const pkg = upsertPiPackage(await inspectPiPackageSource(source, cwd), cwd);
36
+ invalidateBootstrapCatalogCache();
37
+ return responseJson({ package: pkg }, { status: 201 });
38
+ }
39
+ case "pi-package-read": {
40
+ const pkg = findPiPackage(route.packageId);
41
+ if (!pkg)
42
+ throw new PiboWebHttpError("Pi package is not registered", 404);
43
+ return responseJson({ package: pkg });
44
+ }
45
+ case "pi-package-update": {
46
+ const existing = findPiPackage(route.packageId);
47
+ if (!existing)
48
+ throw new PiboWebHttpError("Pi package is not registered", 404);
49
+ const body = await readJsonBody(request);
50
+ let pkg = existing;
51
+ let changed = false;
52
+ if (body.source !== undefined) {
53
+ const source = normalizePiPackageWebSource(body.source);
54
+ pkg = upsertPiPackage(await inspectPiPackageSource(source, cwd), cwd);
55
+ changed = true;
56
+ }
57
+ if (body.enabled !== undefined) {
58
+ if (typeof body.enabled !== "boolean")
59
+ throw new PiboWebHttpError("enabled must be a boolean", 400);
60
+ const updated = setPiPackageEnabled(pkg.id, body.enabled);
61
+ if (!updated)
62
+ throw new PiboWebHttpError("Pi package is not registered", 404);
63
+ pkg = updated;
64
+ changed = true;
65
+ }
66
+ if (!changed)
67
+ throw new PiboWebHttpError("No Pi package update fields provided", 400);
68
+ invalidateBootstrapCatalogCache();
69
+ return responseJson({ package: pkg });
70
+ }
71
+ case "pi-package-delete": {
72
+ const existing = findPiPackage(route.packageId);
73
+ if (!existing)
74
+ throw new PiboWebHttpError("Pi package is not registered", 404);
75
+ const affectedAgents = agentsSelectingPiPackage(route.packageId);
76
+ if (affectedAgents.length > 0) {
77
+ throw new PiboWebHttpError(`Pi package is selected by custom agents: ${affectedAgents.map((agent) => agent.profileName).join(", ")}`, 409);
78
+ }
79
+ const removed = removePiPackage(route.packageId);
80
+ invalidateBootstrapCatalogCache();
81
+ return responseJson({ removedPackage: removed });
82
+ }
83
+ case "mcp-server-description-update": {
84
+ const body = await readJsonBody(request);
85
+ const server = await setMcpServerDescription(route.serverName, normalizeMcpServerDescriptionBody(body.description));
86
+ invalidateBootstrapCatalogCache();
87
+ return responseJson({ server });
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,178 @@
1
+ import { createReadStream, existsSync, mkdirSync, statSync, writeFileSync } from "node:fs";
2
+ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
3
+ import os from "node:os";
4
+ import { Readable } from "node:stream";
5
+ import { PiboWebHttpError } from "../../web/http.js";
6
+ export const CHAT_UPLOAD_DIR = resolve(os.homedir(), ".pibo", "uploads");
7
+ const CHAT_FILE_ATTACHMENT_LIMIT = 10;
8
+ export function prepareChatFileAttachments(input) {
9
+ const paths = normalizeChatFileAttachmentPaths(input.attachmentPaths);
10
+ if (!paths.length)
11
+ return { paths: [], attachments: [], modelContext: "", messageText: input.messageText };
12
+ const attachments = paths.map(chatFileAttachmentForPath);
13
+ const modelContext = renderAttachedChatFiles(attachments);
14
+ return {
15
+ paths,
16
+ attachments,
17
+ modelContext,
18
+ messageText: modelContext ? `${input.messageText.trimEnd()}\n\n${modelContext}` : input.messageText,
19
+ };
20
+ }
21
+ export async function saveUploadedChatFiles(request) {
22
+ const form = await request.formData();
23
+ const files = [];
24
+ for (const value of form.getAll("files")) {
25
+ if (isUploadedChatFile(value))
26
+ files.push(value);
27
+ }
28
+ if (!files.length)
29
+ throw new PiboWebHttpError("No files were uploaded", 400);
30
+ mkdirSync(CHAT_UPLOAD_DIR, { recursive: true });
31
+ const saved = [];
32
+ for (const file of files) {
33
+ const name = sanitizeUploadFilename(file.name);
34
+ const bytes = Buffer.from(await file.arrayBuffer());
35
+ const targetPath = writeUploadedChatFile(name, bytes);
36
+ saved.push({ name, path: targetPath, bytes: bytes.byteLength });
37
+ }
38
+ return { uploadDir: CHAT_UPLOAD_DIR, files: saved };
39
+ }
40
+ export function resolveDownloadPath(path, basePath) {
41
+ return isAbsolute(path) ? resolve(path) : resolve(basePath, path);
42
+ }
43
+ export function responseChatFileDownload(absolutePath) {
44
+ let stats;
45
+ try {
46
+ stats = statSync(absolutePath);
47
+ }
48
+ catch {
49
+ throw new PiboWebHttpError("File not found: " + absolutePath, 404);
50
+ }
51
+ if (!stats.isFile())
52
+ throw new PiboWebHttpError("Path is not a file: " + absolutePath, 400);
53
+ return new Response(Readable.toWeb(createReadStream(absolutePath)), {
54
+ headers: {
55
+ "content-type": contentTypeForDownload(absolutePath),
56
+ "content-length": String(stats.size),
57
+ "content-disposition": "attachment; filename*=UTF-8''" + encodeURIComponent(basename(absolutePath)),
58
+ "cache-control": "no-store",
59
+ },
60
+ });
61
+ }
62
+ function normalizeChatFileAttachmentPaths(value) {
63
+ if (value === undefined || value === null)
64
+ return [];
65
+ if (!Array.isArray(value))
66
+ throw new PiboWebHttpError("fileAttachmentPaths must be an array", 400);
67
+ if (value.length > CHAT_FILE_ATTACHMENT_LIMIT)
68
+ throw new PiboWebHttpError(`At most ${CHAT_FILE_ATTACHMENT_LIMIT} uploaded files can be attached`, 400);
69
+ const paths = [];
70
+ const seen = new Set();
71
+ for (const item of value) {
72
+ if (typeof item !== "string")
73
+ throw new PiboWebHttpError("fileAttachmentPaths entries must be strings", 400);
74
+ const absolutePath = resolve(item.trim());
75
+ if (!item.trim())
76
+ throw new PiboWebHttpError("fileAttachmentPaths entries must be non-empty strings", 400);
77
+ if (absolutePath.length > 4096)
78
+ throw new PiboWebHttpError("uploaded file path is too long", 400);
79
+ if (!isPathInsideUploadDir(absolutePath))
80
+ throw new PiboWebHttpError("Attached uploads must be under ~/.pibo/uploads", 400);
81
+ if (!seen.has(absolutePath)) {
82
+ seen.add(absolutePath);
83
+ paths.push(absolutePath);
84
+ }
85
+ }
86
+ return paths;
87
+ }
88
+ function chatFileAttachmentForPath(path) {
89
+ if (!existsSync(path))
90
+ throw new PiboWebHttpError(`Uploaded file was not found: ${path}`, 404);
91
+ const stats = statSync(path);
92
+ if (!stats.isFile())
93
+ throw new PiboWebHttpError(`Uploaded attachment is not a file: ${path}`, 400);
94
+ return { name: basename(path), path, bytes: stats.size };
95
+ }
96
+ function isPathInsideUploadDir(path) {
97
+ const uploadRelative = relative(CHAT_UPLOAD_DIR, path);
98
+ return uploadRelative !== "" && !uploadRelative.startsWith("..") && !isAbsolute(uploadRelative);
99
+ }
100
+ function renderAttachedChatFiles(attachments) {
101
+ const bounded = attachments.slice(0, CHAT_FILE_ATTACHMENT_LIMIT);
102
+ if (!bounded.length)
103
+ return "";
104
+ const lines = ["<attached-uploaded-files>"];
105
+ bounded.forEach((attachment, index) => {
106
+ lines.push(`${index + 1}. ${escapeChatFileBlockValue(attachment.name)}`);
107
+ lines.push(`path: ${escapeChatFileBlockValue(attachment.path)}`);
108
+ lines.push(`bytes: ${attachment.bytes}`);
109
+ });
110
+ lines.push("</attached-uploaded-files>");
111
+ return lines.join("\n");
112
+ }
113
+ function escapeChatFileBlockValue(value) {
114
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
115
+ }
116
+ function isUploadedChatFile(value) {
117
+ return typeof value === "object"
118
+ && value !== null
119
+ && typeof value.name === "string"
120
+ && typeof value.size === "number"
121
+ && typeof value.arrayBuffer === "function";
122
+ }
123
+ function sanitizeUploadFilename(name) {
124
+ const cleaned = basename(name).replace(/[\u0000-\u001f\u007f]/g, "").trim();
125
+ const safe = cleaned.replace(/[\\/]/g, "_");
126
+ if (safe && !/^\.+$/.test(safe))
127
+ return safe;
128
+ return `upload-${Date.now()}`;
129
+ }
130
+ function writeUploadedChatFile(filename, bytes) {
131
+ for (let index = 0; index < 10_000; index += 1) {
132
+ const targetPath = uploadPathForIndex(filename, index);
133
+ try {
134
+ writeFileSync(targetPath, bytes, { flag: "wx" });
135
+ return targetPath;
136
+ }
137
+ catch (error) {
138
+ if (isNodeError(error) && error.code === "EEXIST")
139
+ continue;
140
+ throw error;
141
+ }
142
+ }
143
+ throw new PiboWebHttpError("Could not allocate upload filename", 500);
144
+ }
145
+ function uploadPathForIndex(filename, index) {
146
+ if (index === 0)
147
+ return resolve(CHAT_UPLOAD_DIR, filename);
148
+ const extension = extname(filename);
149
+ const stem = filename.slice(0, filename.length - extension.length) || "upload";
150
+ return resolve(CHAT_UPLOAD_DIR, `${stem}-${index}${extension}`);
151
+ }
152
+ function isNodeError(error) {
153
+ return typeof error === "object" && error !== null && "code" in error;
154
+ }
155
+ function contentTypeForDownload(path) {
156
+ switch (extname(path).toLowerCase()) {
157
+ case ".html":
158
+ case ".htm":
159
+ return "text/html; charset=utf-8";
160
+ case ".json":
161
+ return "application/json; charset=utf-8";
162
+ case ".md":
163
+ case ".txt":
164
+ case ".log":
165
+ return "text/plain; charset=utf-8";
166
+ case ".pdf":
167
+ return "application/pdf";
168
+ case ".png":
169
+ return "image/png";
170
+ case ".jpg":
171
+ case ".jpeg":
172
+ return "image/jpeg";
173
+ case ".webp":
174
+ return "image/webp";
175
+ default:
176
+ return "application/octet-stream";
177
+ }
178
+ }