@pasko70/pibo 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/README.md +106 -254
  2. package/context/codex-base-prompt.md +4 -0
  3. package/context/compute-worker.md +23 -0
  4. package/context/pibo-native-tooling.md +18 -0
  5. package/context/pibo-system-prompt.md +69 -8
  6. package/dist/api/simple-agent-api.js +136 -0
  7. package/dist/app-context.js +4 -0
  8. package/dist/apps/chat/agent-profiles.js +18 -3
  9. package/dist/apps/chat/agent-store.js +113 -16
  10. package/dist/apps/chat/chat-api-routes.js +311 -0
  11. package/dist/apps/chat/chat-capability-routes.js +90 -0
  12. package/dist/apps/chat/chat-files.js +178 -0
  13. package/dist/apps/chat/chat-request-normalizers.js +681 -0
  14. package/dist/apps/chat/chat-settings-routes.js +75 -0
  15. package/dist/apps/chat/chat-trace-helpers.js +94 -0
  16. package/dist/apps/chat/chat-user-skill-routes.js +149 -0
  17. package/dist/apps/chat/cron-api.js +213 -0
  18. package/dist/apps/chat/data/chat-data-mappers.js +74 -0
  19. package/dist/apps/chat/data/event-command-service.js +75 -0
  20. package/dist/apps/chat/data/navigation-query-service.js +11 -0
  21. package/dist/apps/chat/data/project-service.js +844 -0
  22. package/dist/apps/chat/data/read-state-service.js +42 -0
  23. package/dist/apps/chat/data/room-service.js +52 -0
  24. package/dist/apps/chat/data/session-query-service.js +63 -0
  25. package/dist/apps/chat/data/timeline-query-service.js +96 -0
  26. package/dist/apps/chat/event-log.js +1 -307
  27. package/dist/apps/chat/model-catalog.js +7 -2
  28. package/dist/apps/chat/output-compactor.js +126 -0
  29. package/dist/apps/chat/output-event-policy.js +17 -0
  30. package/dist/apps/chat/project-workflow-human-actions.js +347 -0
  31. package/dist/apps/chat/project-workflow-sessions.js +260 -0
  32. package/dist/apps/chat/provider-auth-actions.js +43 -0
  33. package/dist/apps/chat/ralph-api.js +156 -0
  34. package/dist/apps/chat/read-model.js +1 -218
  35. package/dist/apps/chat/rooms.js +1 -321
  36. package/dist/apps/chat/static-assets.js +996 -0
  37. package/dist/apps/chat/stream.js +29 -6
  38. package/dist/apps/chat/trace.js +179 -1003
  39. package/dist/apps/chat/types/event-store.js +1 -0
  40. package/dist/apps/chat/types/read-model.js +1 -0
  41. package/dist/apps/chat/types/rooms.js +36 -0
  42. package/dist/apps/chat/web-app.js +3131 -1959
  43. package/dist/apps/chat/workflow-catalog.js +572 -0
  44. package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
  45. package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
  46. package/dist/apps/chat/workflow-persistence-model.js +140 -0
  47. package/dist/apps/chat/workflow-persistence.js +633 -0
  48. package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
  49. package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
  50. package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
  51. package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
  52. package/dist/apps/chat/workflow-validation-helpers.js +114 -0
  53. package/dist/apps/chat-ui/assets/{dist-CNLWH2qh.js → dist-B4lw9z4F.js} +1 -1
  54. package/dist/apps/chat-ui/assets/{dist-8e4L8ciw.js → dist-BbTaHWON.js} +1 -1
  55. package/dist/apps/chat-ui/assets/{dist-CMZOa5ik.js → dist-BcT_c1EJ.js} +1 -1
  56. package/dist/apps/chat-ui/assets/{dist-DNcnQRPF.js → dist-CGINd7XU.js} +1 -1
  57. package/dist/apps/chat-ui/assets/{dist-CqqUC8Ce.js → dist-CrBzZkUp.js} +1 -1
  58. package/dist/apps/chat-ui/assets/{dist-D2N4-LIc.js → dist-CyyISotB.js} +1 -1
  59. package/dist/apps/chat-ui/assets/{dist-CUqpST5w.js → dist-DFbnFNpX.js} +1 -1
  60. package/dist/apps/chat-ui/assets/{dist-CspjOeBj.js → dist-DGLWQLX8.js} +1 -1
  61. package/dist/apps/chat-ui/assets/{dist-B7bbI3Qz.js → dist-DfcIkFSN.js} +1 -1
  62. package/dist/apps/chat-ui/assets/{dist-v4pjHlB7.js → dist-sKDHTwaT.js} +1 -1
  63. package/dist/apps/chat-ui/assets/{dist-D9L4MSRF.js → dist-y9D6la48.js} +1 -1
  64. package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
  65. package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
  66. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
  67. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
  68. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
  69. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
  70. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
  71. package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
  72. package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
  73. package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
  74. package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
  75. package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
  76. package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
  77. package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
  78. package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
  79. package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
  80. package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
  81. package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
  82. package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
  83. package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
  84. package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
  85. package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
  86. package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
  87. package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
  88. package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
  89. package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
  90. package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
  91. package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
  92. package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
  93. package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
  94. package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
  95. package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
  96. package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
  97. package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
  98. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
  99. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
  100. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
  101. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
  102. package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
  103. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
  104. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
  105. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
  106. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
  107. package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
  108. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
  109. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
  110. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
  111. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
  112. package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
  113. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
  114. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
  115. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
  116. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
  117. package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
  118. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
  119. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
  120. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
  121. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
  122. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
  123. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
  124. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
  125. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
  126. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
  127. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
  128. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
  129. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
  130. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
  131. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
  132. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
  133. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
  134. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
  135. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
  136. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
  137. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
  138. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
  139. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
  140. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
  141. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
  142. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
  143. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
  144. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
  145. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
  146. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
  147. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
  148. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
  149. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
  150. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
  151. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
  152. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
  153. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
  154. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
  155. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
  156. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
  157. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
  158. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
  159. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
  160. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
  161. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
  162. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
  163. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
  164. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
  165. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
  166. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
  167. package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
  168. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
  169. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
  170. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
  171. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
  172. package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
  173. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
  174. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
  175. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
  176. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
  177. package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
  178. package/dist/apps/chat-ui/index.html +8 -3
  179. package/dist/apps/chat-ui/manifest.webmanifest +25 -0
  180. package/dist/apps/chat-ui/sw.js +41 -0
  181. package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
  182. package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
  183. package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
  184. package/dist/apps/cli-ui/InkTerminalView.js +25 -0
  185. package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
  186. package/dist/apps/cli-ui/index.js +8 -0
  187. package/dist/apps/cli-ui/inkColors.js +67 -0
  188. package/dist/apps/cli-ui/inkJson.js +244 -0
  189. package/dist/apps/cli-ui/inkMarkdown.js +122 -0
  190. package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
  191. package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
  192. package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
  193. package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
  194. package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
  195. package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
  196. package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
  197. package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
  198. package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
  199. package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
  200. package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
  201. package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
  202. package/dist/apps/context-files-ui/index.html +2 -2
  203. package/dist/auth/better-auth.js +2 -1
  204. package/dist/auth/login-actions.js +251 -0
  205. package/dist/auth/openai-codex-usage.js +147 -0
  206. package/dist/bin/pibo.js +0 -0
  207. package/dist/bin/rg.js +15 -0
  208. package/dist/cli-session/fakeSessionSource.js +804 -0
  209. package/dist/cli-session/index.js +3 -0
  210. package/dist/cli-session/localSessionSource.js +1144 -0
  211. package/dist/cli-session/sessionSource.js +13 -0
  212. package/dist/cli.js +142 -14
  213. package/dist/compute/cli.js +415 -0
  214. package/dist/compute/docker.js +827 -0
  215. package/dist/compute/resource-health.js +333 -0
  216. package/dist/compute/resource-policy.js +98 -0
  217. package/dist/config/config.js +9 -5
  218. package/dist/core/context-build.js +677 -0
  219. package/dist/core/model-defaults.js +51 -9
  220. package/dist/core/pibo-home.js +8 -0
  221. package/dist/core/profiles.js +48 -0
  222. package/dist/core/provider-telemetry.js +222 -0
  223. package/dist/core/routed-session.js +441 -47
  224. package/dist/core/runtime-telemetry.js +853 -0
  225. package/dist/core/runtime.js +103 -15
  226. package/dist/core/session-errors.js +47 -0
  227. package/dist/core/session-model.js +39 -0
  228. package/dist/core/session-router.js +292 -62
  229. package/dist/core/shared-app.js +17 -0
  230. package/dist/core/skill-expansion.js +43 -0
  231. package/dist/core/system-prompt-template.js +9 -9
  232. package/dist/core/telemetry-staleness.js +128 -0
  233. package/dist/core/test-output-compaction.js +145 -0
  234. package/dist/core/user-settings.js +73 -0
  235. package/dist/cron/channel.js +28 -0
  236. package/dist/cron/cli.js +230 -0
  237. package/dist/cron/plugin.js +11 -0
  238. package/dist/cron/schedule.js +214 -0
  239. package/dist/cron/service.js +177 -0
  240. package/dist/cron/store.js +349 -0
  241. package/dist/cron/types.js +1 -0
  242. package/dist/data/cli.js +184 -0
  243. package/dist/data/event-log.js +106 -0
  244. package/dist/data/final-app-space-cutover-migration.js +728 -0
  245. package/dist/data/ingest-service.js +389 -0
  246. package/dist/data/message-store.js +62 -0
  247. package/dist/data/navigation-store.js +75 -0
  248. package/dist/data/observation-store.js +46 -0
  249. package/dist/data/payload-store.js +144 -0
  250. package/dist/data/pibo-store.js +59 -0
  251. package/dist/data/schema.js +434 -0
  252. package/dist/data/session-store.js +63 -0
  253. package/dist/data/shared-app-migration.js +757 -0
  254. package/dist/data/sqlite-schema.js +12 -0
  255. package/dist/data/telemetry-preview.js +65 -0
  256. package/dist/data/telemetry-queries.js +212 -0
  257. package/dist/data/telemetry-retention.js +50 -0
  258. package/dist/data/telemetry-rows.js +158 -0
  259. package/dist/data/telemetry.js +357 -0
  260. package/dist/debug/delta-compaction.js +99 -0
  261. package/dist/debug/detail-format.js +86 -0
  262. package/dist/debug/events.js +149 -29
  263. package/dist/debug/failures.js +162 -0
  264. package/dist/debug/index.js +655 -30
  265. package/dist/debug/messages.js +185 -0
  266. package/dist/debug/next-commands.js +6 -0
  267. package/dist/debug/payloads.js +123 -0
  268. package/dist/debug/pty.js +924 -0
  269. package/dist/debug/session.js +45 -15
  270. package/dist/debug/sql.js +1 -1
  271. package/dist/debug/stores.js +18 -13
  272. package/dist/debug/summary.js +72 -0
  273. package/dist/debug/telemetry.js +649 -0
  274. package/dist/debug/tools.js +168 -0
  275. package/dist/debug/trace-render-check.js +151 -0
  276. package/dist/debug/trace.js +152 -27
  277. package/dist/debug/web-artifacts.js +63 -0
  278. package/dist/debug/web-options.js +313 -0
  279. package/dist/debug/web-render-analysis.js +310 -0
  280. package/dist/debug/web-snapshot-browser-scripts.js +303 -0
  281. package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
  282. package/dist/debug/web-streaming-browser-library.js +928 -0
  283. package/dist/debug/web-streaming-browser-scripts.js +242 -0
  284. package/dist/debug/web-streaming-provider-telemetry.js +194 -0
  285. package/dist/debug/web-streaming-report.js +493 -0
  286. package/dist/debug/web-streaming-types.js +1 -0
  287. package/dist/debug/web.js +574 -0
  288. package/dist/gateway/backup.js +83 -0
  289. package/dist/gateway/cli.js +511 -0
  290. package/dist/gateway/fallback.js +155 -0
  291. package/dist/gateway/pidfile.js +84 -0
  292. package/dist/gateway/protocol.js +16 -0
  293. package/dist/gateway/server.js +172 -17
  294. package/dist/gateway/tool.js +54 -51
  295. package/dist/gateway/web.js +74 -2
  296. package/dist/index.js +3 -1
  297. package/dist/local/client.js +3 -3
  298. package/dist/local/extension.js +8 -5
  299. package/dist/plugins/builtin.js +251 -49
  300. package/dist/plugins/chat-vscode-web.js +28 -0
  301. package/dist/plugins/codex-compat.js +0 -41
  302. package/dist/plugins/context-files.js +98 -18
  303. package/dist/plugins/dev-auth.js +124 -0
  304. package/dist/plugins/native-tooling.js +15 -0
  305. package/dist/plugins/registry.js +49 -1
  306. package/dist/plugins/web-annotations.js +27 -0
  307. package/dist/providers/minimax.js +70 -0
  308. package/dist/providers/openai-compat.js +48 -0
  309. package/dist/ralph/channel.js +8 -0
  310. package/dist/ralph/cli.js +152 -0
  311. package/dist/ralph/plugin.js +14 -0
  312. package/dist/ralph/service.js +271 -0
  313. package/dist/ralph/stopping.js +151 -0
  314. package/dist/ralph/store.js +450 -0
  315. package/dist/ralph/templates.js +200 -0
  316. package/dist/ralph/types.js +1 -0
  317. package/dist/reliability/store.js +42 -26
  318. package/dist/runs/registry.js +72 -35
  319. package/dist/session-ui/commandCatalog.js +193 -0
  320. package/dist/session-ui/commandResults.js +95 -0
  321. package/dist/session-ui/index.js +7 -0
  322. package/dist/session-ui/ownerViewModel.js +27 -0
  323. package/dist/session-ui/roomSessionViewModel.js +69 -0
  324. package/dist/session-ui/statusViewModel.js +127 -0
  325. package/dist/session-ui/terminalCards.js +210 -0
  326. package/dist/session-ui/terminalRows.js +937 -0
  327. package/dist/session-ui/terminalValue.js +45 -0
  328. package/dist/sessions/pibo-data-store.js +178 -0
  329. package/dist/sessions/sqlite-store.js +78 -12
  330. package/dist/sessions/store.js +11 -4
  331. package/dist/sessions/workflow-session-kind.js +20 -0
  332. package/dist/setup/cli.js +567 -0
  333. package/dist/shared/trace-async-agent-runs.js +127 -0
  334. package/dist/shared/trace-engine.js +96 -0
  335. package/dist/shared/trace-event-projection.js +679 -0
  336. package/dist/shared/trace-live-reducer.js +191 -0
  337. package/dist/shared/trace-nodes.js +76 -0
  338. package/dist/shared/trace-order.js +11 -10
  339. package/dist/shared/trace-patch-nodes.js +83 -0
  340. package/dist/shared/trace-run-notifications.js +69 -0
  341. package/dist/shared/trace-subagent-links.js +46 -0
  342. package/dist/shared/trace-transcript.js +303 -0
  343. package/dist/shared/trace-types.js +1 -0
  344. package/dist/shared-app.js +4 -0
  345. package/dist/signals/aggregate.js +65 -0
  346. package/dist/signals/events.js +1 -0
  347. package/dist/signals/projector.js +158 -0
  348. package/dist/signals/registry.js +513 -0
  349. package/dist/signals/store.js +1 -0
  350. package/dist/signals/types.js +1 -0
  351. package/dist/skills/cli.js +117 -0
  352. package/dist/tools/agent-browser-leases.js +219 -0
  353. package/dist/tools/agent-browser-wrapper.js +99 -0
  354. package/dist/tools/browser-pool.js +623 -0
  355. package/dist/tools/browser-use-cdp.js +56 -4
  356. package/dist/tools/browser-use-leases.js +215 -37
  357. package/dist/tools/browser-use-wrapper.js +508 -65
  358. package/dist/tools/cdp-client.js +189 -0
  359. package/dist/tools/guides.js +203 -4
  360. package/dist/tools/index.js +666 -16
  361. package/dist/tools/npm-runtime.js +136 -0
  362. package/dist/tools/registry.js +107 -8
  363. package/dist/tools/runtime/index.js +3 -0
  364. package/dist/tools/runtime/node-backend.js +225 -0
  365. package/dist/tools/runtime/node-worker-source.js +206 -0
  366. package/dist/tools/runtime/python-backend.js +227 -0
  367. package/dist/tools/runtime/python-worker-source.js +178 -0
  368. package/dist/tools/runtime/registry.js +255 -0
  369. package/dist/tools/runtime/tool.js +168 -0
  370. package/dist/tools/runtime/types.js +1 -0
  371. package/dist/tools/web-search.js +2 -1
  372. package/dist/user-skills/installer.js +39 -36
  373. package/dist/user-skills/store.js +50 -11
  374. package/dist/web/auth.js +5 -1
  375. package/dist/web/channel.js +86 -0
  376. package/dist/web/http.js +79 -14
  377. package/dist/web-annotations/api.js +348 -0
  378. package/dist/web-annotations/attachments.js +201 -0
  379. package/dist/web-annotations/cdp.js +1107 -0
  380. package/dist/web-annotations/index.js +7 -0
  381. package/dist/web-annotations/store.js +407 -0
  382. package/dist/web-annotations/tools.js +350 -0
  383. package/dist/web-annotations/types.js +34 -0
  384. package/dist/web-annotations/validation.js +288 -0
  385. package/docs/README.md +23 -0
  386. package/docs/ops/install-developer-host.md +112 -0
  387. package/docs/ops/install-user-host.md +76 -0
  388. package/docs/ops/upgrade-user-to-developer-host.md +69 -0
  389. package/package.json +24 -10
  390. package/skills/builtin/pi-agent-harness/SKILL.md +24 -24
  391. package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
  392. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
  393. package/skills/builtin/prd/SKILL.md +143 -0
  394. package/skills/builtin/ralph-loop/SKILL.md +359 -0
  395. package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
  396. package/skills/builtin/skill-creator/LICENSE.txt +202 -0
  397. package/skills/builtin/skill-creator/SKILL.md +513 -0
  398. package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
  399. package/skills/builtin/skill-creator/agents/comparator.md +202 -0
  400. package/skills/builtin/skill-creator/agents/grader.md +223 -0
  401. package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
  402. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
  403. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
  404. package/skills/builtin/skill-creator/references/schemas.md +430 -0
  405. package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
  406. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
  407. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
  408. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
  409. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
  410. package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
  411. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
  412. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
  413. package/skills/builtin/skill-creator/scripts/utils.py +47 -0
  414. package/skills/builtin/web-annotations/SKILL.md +93 -0
  415. package/dist/apps/chat-ui/assets/index-D2Qxambd.js +0 -151
  416. package/dist/apps/chat-ui/assets/index-DXx368XK.css +0 -1
  417. package/dist/env.js +0 -32
  418. package/dist/plugins/core-tools.js +0 -94
  419. package/dist/plugins/example.js +0 -67
  420. package/dist/plugins/remote-agent.js +0 -9
  421. package/dist/remote/channel.js +0 -176
  422. package/dist/remote/client.js +0 -92
  423. package/dist/remote/examples/tui-controller.js +0 -263
  424. package/dist/remote/protocol.js +0 -55
  425. package/dist/remote/session-client.js +0 -189
  426. package/dist/sessions/bindings.js +0 -41
@@ -0,0 +1,136 @@
1
+ import { randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { PiboWebHttpError, readJsonBody, responseJson } from "../web/http.js";
3
+ const DEFAULT_SEND_MESSAGE_TIMEOUT_MS = 10 * 60 * 1000;
4
+ function configuredApiKey(options) {
5
+ return options.apiKey ?? process.env.PIBO_SIMPLE_API_KEY;
6
+ }
7
+ function safeEqual(left, right) {
8
+ const leftBuffer = Buffer.from(left);
9
+ const rightBuffer = Buffer.from(right);
10
+ if (leftBuffer.length !== rightBuffer.length)
11
+ return false;
12
+ return timingSafeEqual(leftBuffer, rightBuffer);
13
+ }
14
+ function decodeBasicAuthCredential(value) {
15
+ const match = value.match(/^Basic\s+(.+)$/i);
16
+ if (!match)
17
+ return [];
18
+ try {
19
+ const decoded = Buffer.from(match[1] ?? "", "base64").toString("utf8");
20
+ return decoded.split(":").map((part) => part.trim()).filter(Boolean);
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ function requestApiKeyCandidates(request) {
27
+ const candidates = [];
28
+ const add = (value) => {
29
+ let trimmed = value?.trim();
30
+ if (!trimmed)
31
+ return;
32
+ candidates.push(trimmed);
33
+ while (/^(Bearer|Token)\s+/i.test(trimmed)) {
34
+ trimmed = trimmed.replace(/^(Bearer|Token)\s+/i, "").trim();
35
+ if (trimmed)
36
+ candidates.push(trimmed);
37
+ }
38
+ };
39
+ add(request.headers.get("x-api-key"));
40
+ add(request.headers.get("api-key"));
41
+ const authorization = request.headers.get("authorization")?.trim();
42
+ add(authorization);
43
+ for (const credential of decodeBasicAuthCredential(authorization ?? ""))
44
+ add(credential);
45
+ return candidates;
46
+ }
47
+ function requireApiKey(request, options) {
48
+ const expected = configuredApiKey(options);
49
+ if (!expected)
50
+ throw new PiboWebHttpError("Simple agent API key is not configured", 503);
51
+ const candidates = requestApiKeyCandidates(request);
52
+ if (!candidates.some((candidate) => safeEqual(candidate, expected))) {
53
+ throw new PiboWebHttpError("Invalid API key", 401);
54
+ }
55
+ }
56
+ function requireString(value, name) {
57
+ if (typeof value !== "string" || value.trim().length === 0) {
58
+ throw new PiboWebHttpError(`${name} is required`, 400);
59
+ }
60
+ return value;
61
+ }
62
+ function parseSendMessageBody(body) {
63
+ return {
64
+ sessionId: requireString(body.sessionId, "sessionId"),
65
+ message: requireString(body.message, "message"),
66
+ };
67
+ }
68
+ function awaitAgentMessage(context, input) {
69
+ return new Promise((resolve, reject) => {
70
+ let lastAssistantMessage = "";
71
+ let settled = false;
72
+ let unsubscribe;
73
+ const finish = (callback) => {
74
+ if (settled)
75
+ return;
76
+ settled = true;
77
+ clearTimeout(timeout);
78
+ unsubscribe?.();
79
+ callback();
80
+ };
81
+ const timeout = setTimeout(() => {
82
+ finish(() => reject(new PiboWebHttpError("Timed out waiting for agent response", 504)));
83
+ }, input.timeoutMs);
84
+ unsubscribe = context.subscribe((event) => {
85
+ if (event.piboSessionId !== input.sessionId || !("eventId" in event) || event.eventId !== input.eventId)
86
+ return;
87
+ if (event.type === "assistant_message") {
88
+ lastAssistantMessage = event.text;
89
+ return;
90
+ }
91
+ if (event.type === "session_error") {
92
+ finish(() => reject(new PiboWebHttpError(event.error, 500)));
93
+ return;
94
+ }
95
+ if (event.type === "message_finished") {
96
+ finish(() => resolve({ eventId: input.eventId, sessionId: input.sessionId, message: lastAssistantMessage }));
97
+ }
98
+ });
99
+ });
100
+ }
101
+ async function handleSendMessage(request, context, options) {
102
+ requireApiKey(request, options);
103
+ const input = parseSendMessageBody(await readJsonBody(request));
104
+ if (!context.getSession(input.sessionId)) {
105
+ throw new PiboWebHttpError("Unknown sessionId", 404);
106
+ }
107
+ const eventId = randomUUID();
108
+ const responsePromise = awaitAgentMessage(context, {
109
+ sessionId: input.sessionId,
110
+ eventId,
111
+ timeoutMs: options.timeoutMs ?? DEFAULT_SEND_MESSAGE_TIMEOUT_MS,
112
+ });
113
+ await context.emit({
114
+ type: "message",
115
+ piboSessionId: input.sessionId,
116
+ id: eventId,
117
+ text: input.message,
118
+ source: "service",
119
+ });
120
+ return responseJson(await responsePromise);
121
+ }
122
+ export async function handleSimpleAgentApiRequest(request, context, options = {}) {
123
+ const url = new URL(request.url);
124
+ if (url.pathname === "/api/health") {
125
+ if (request.method !== "GET" && request.method !== "HEAD") {
126
+ return responseJson({ error: "Method not allowed" }, { status: 405, headers: { allow: "GET, HEAD" } });
127
+ }
128
+ return responseJson({ status: "ok" });
129
+ }
130
+ if (url.pathname !== "/api/send-message")
131
+ return undefined;
132
+ if (request.method !== "POST") {
133
+ return responseJson({ error: "Method not allowed" }, { status: 405, headers: { allow: "POST" } });
134
+ }
135
+ return handleSendMessage(request, context, options);
136
+ }
@@ -0,0 +1,4 @@
1
+ export const PIBO_APP_CONTEXT = Object.freeze({
2
+ kind: "app-context",
3
+ id: "app",
4
+ });
@@ -1,5 +1,6 @@
1
1
  import { InitialSessionContextBuilder } from "../../core/profiles.js";
2
- export function createCustomAgentProfileDefinition(agent) {
2
+ export function createCustomAgentProfileDefinition(agent, options = {}) {
3
+ const shouldWarnMissingReferences = options.missingReferenceMode !== "silent";
3
4
  return {
4
5
  name: agent.profileName,
5
6
  aliases: [agent.id, `custom-agent:${agent.id}`],
@@ -16,6 +17,18 @@ export function createCustomAgentProfileDefinition(agent) {
16
17
  builder.withMainModel(agent.mainModel);
17
18
  if (agent.subagentModel)
18
19
  builder.withSubagentModel(agent.subagentModel);
20
+ if (agent.thinkingLevel)
21
+ builder.withThinkingLevel(agent.thinkingLevel);
22
+ if (agent.mainThinkingLevel)
23
+ builder.withMainThinkingLevel(agent.mainThinkingLevel);
24
+ if (agent.subagentThinkingLevel)
25
+ builder.withSubagentThinkingLevel(agent.subagentThinkingLevel);
26
+ if (agent.fast !== undefined)
27
+ builder.withFastMode(agent.fast);
28
+ if (agent.mainFast !== undefined)
29
+ builder.withMainFastMode(agent.mainFast);
30
+ if (agent.subagentFast !== undefined)
31
+ builder.withSubagentFastMode(agent.subagentFast);
19
32
  for (const skillName of agent.skills) {
20
33
  try {
21
34
  builder.addSkill(context.getSkill(skillName));
@@ -23,7 +36,8 @@ export function createCustomAgentProfileDefinition(agent) {
23
36
  catch (error) {
24
37
  if (!isUnknownSkillError(error, skillName))
25
38
  throw error;
26
- console.warn(`Skipping unknown skill "${skillName}" for custom agent "${agent.profileName}"`);
39
+ if (shouldWarnMissingReferences)
40
+ console.warn(`Skipping unknown skill "${skillName}" for custom agent "${agent.profileName}"`);
27
41
  }
28
42
  }
29
43
  for (const contextFileKey of agent.contextFiles) {
@@ -33,7 +47,8 @@ export function createCustomAgentProfileDefinition(agent) {
33
47
  catch (error) {
34
48
  if (!isUnknownContextFileError(error, contextFileKey))
35
49
  throw error;
36
- console.warn(`Skipping unknown context file "${contextFileKey}" for custom agent "${agent.profileName}"`);
50
+ if (shouldWarnMissingReferences)
51
+ console.warn(`Skipping unknown context file "${contextFileKey}" for custom agent "${agent.profileName}"`);
37
52
  }
38
53
  }
39
54
  for (const toolName of agent.nativeTools)
@@ -1,8 +1,10 @@
1
- import { randomUUID } from "node:crypto";
1
+ import { createHash, randomUUID } from "node:crypto";
2
2
  import { mkdirSync } from "node:fs";
3
3
  import { dirname, resolve } from "node:path";
4
+ import { piboHomePath } from "../../core/pibo-home.js";
4
5
  import { DatabaseSync } from "node:sqlite";
5
6
  import { DEFAULT_BUILTIN_TOOL_NAMES } from "../../core/profiles.js";
7
+ import { isPiboThinkingLevel } from "../../core/thinking.js";
6
8
  import { findPiPackage } from "../../pi-packages/store.js";
7
9
  const CUSTOM_AGENT_NAME_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
8
10
  export class CustomAgentStore {
@@ -19,7 +21,6 @@ export class CustomAgentStore {
19
21
  CREATE TABLE IF NOT EXISTS chat_agents (
20
22
  id TEXT PRIMARY KEY,
21
23
  profile_name TEXT NOT NULL UNIQUE,
22
- owner_scope TEXT NOT NULL,
23
24
  display_name TEXT NOT NULL,
24
25
  description TEXT,
25
26
  native_tools_json TEXT NOT NULL,
@@ -30,6 +31,12 @@ export class CustomAgentStore {
30
31
  pi_packages_json TEXT NOT NULL DEFAULT '[]',
31
32
  main_model_json TEXT,
32
33
  subagent_model_json TEXT,
34
+ thinking_level TEXT,
35
+ main_thinking_level TEXT,
36
+ subagent_thinking_level TEXT,
37
+ fast INTEGER,
38
+ main_fast INTEGER,
39
+ subagent_fast INTEGER,
33
40
  builtin_tools TEXT NOT NULL,
34
41
  builtin_tool_names_json TEXT NOT NULL DEFAULT '["read","bash","edit","write"]',
35
42
  auto_context_files INTEGER NOT NULL DEFAULT 1,
@@ -39,23 +46,23 @@ export class CustomAgentStore {
39
46
  archived_at TEXT
40
47
  );
41
48
 
42
- CREATE INDEX IF NOT EXISTS idx_chat_agents_owner
43
- ON chat_agents(owner_scope, updated_at);
44
49
  `);
45
50
  this.migrateArchivedAtColumn();
46
51
  this.migrateAutoContextFilesColumn();
47
52
  this.migrateMcpServersColumn();
48
53
  this.migratePiPackagesColumn();
49
54
  this.migrateModelColumns();
55
+ this.migrateThinkingLevelColumn();
56
+ this.migrateThinkingOptionColumns();
50
57
  this.migrateBuiltinToolNamesColumn();
51
58
  this.migrateLegacyProfileNames();
59
+ this.migrateDuplicateProfileNames();
52
60
  }
53
- list(ownerScope, options = {}) {
61
+ list(options = {}) {
54
62
  this.migrateLegacyProfileNames();
63
+ this.migrateDuplicateProfileNames();
55
64
  const archivedClause = options.includeArchived ? "" : " AND archived_at IS NULL";
56
- const rows = ownerScope
57
- ? this.db.prepare(`SELECT * FROM chat_agents WHERE owner_scope = ?${archivedClause} ORDER BY updated_at DESC`).all(ownerScope)
58
- : this.db.prepare(`SELECT * FROM chat_agents WHERE 1 = 1${archivedClause} ORDER BY updated_at DESC`).all();
65
+ const rows = this.db.prepare(`SELECT * FROM chat_agents WHERE 1 = 1${archivedClause} ORDER BY updated_at DESC`).all();
59
66
  return rows.map(agentFromRow);
60
67
  }
61
68
  get(id) {
@@ -72,7 +79,6 @@ export class CustomAgentStore {
72
79
  const agent = {
73
80
  id,
74
81
  profileName,
75
- ownerScope: input.ownerScope,
76
82
  displayName: input.displayName,
77
83
  description: input.description,
78
84
  nativeTools: [...(input.nativeTools ?? [])],
@@ -83,6 +89,12 @@ export class CustomAgentStore {
83
89
  piPackages: sanitizePiPackages(input.piPackages ?? []),
84
90
  mainModel: sanitizeModelProfile(input.mainModel),
85
91
  subagentModel: sanitizeModelProfile(input.subagentModel),
92
+ thinkingLevel: sanitizeThinkingLevel(input.thinkingLevel),
93
+ mainThinkingLevel: sanitizeThinkingLevel(input.mainThinkingLevel),
94
+ subagentThinkingLevel: sanitizeThinkingLevel(input.subagentThinkingLevel),
95
+ fast: sanitizeBoolean(input.fast),
96
+ mainFast: sanitizeBoolean(input.mainFast),
97
+ subagentFast: sanitizeBoolean(input.subagentFast),
86
98
  builtinTools: input.builtinTools ?? "default",
87
99
  builtinToolNames: sanitizeBuiltinToolNames(input.builtinToolNames),
88
100
  autoContextFiles: input.autoContextFiles ?? true,
@@ -116,6 +128,12 @@ export class CustomAgentStore {
116
128
  piPackages: input.piPackages ? sanitizePiPackages(input.piPackages) : existing.piPackages,
117
129
  mainModel: input.mainModel === undefined ? existing.mainModel : sanitizeModelProfile(input.mainModel),
118
130
  subagentModel: input.subagentModel === undefined ? existing.subagentModel : sanitizeModelProfile(input.subagentModel),
131
+ thinkingLevel: input.thinkingLevel === undefined ? existing.thinkingLevel : sanitizeThinkingLevel(input.thinkingLevel),
132
+ mainThinkingLevel: input.mainThinkingLevel === undefined ? existing.mainThinkingLevel : sanitizeThinkingLevel(input.mainThinkingLevel),
133
+ subagentThinkingLevel: input.subagentThinkingLevel === undefined ? existing.subagentThinkingLevel : sanitizeThinkingLevel(input.subagentThinkingLevel),
134
+ fast: input.fast === undefined ? existing.fast : sanitizeBoolean(input.fast),
135
+ mainFast: input.mainFast === undefined ? existing.mainFast : sanitizeBoolean(input.mainFast),
136
+ subagentFast: input.subagentFast === undefined ? existing.subagentFast : sanitizeBoolean(input.subagentFast),
119
137
  builtinTools: input.builtinTools ?? existing.builtinTools,
120
138
  builtinToolNames: input.builtinToolNames ? sanitizeBuiltinToolNames(input.builtinToolNames) : existing.builtinToolNames,
121
139
  autoContextFiles: input.autoContextFiles ?? existing.autoContextFiles,
@@ -136,6 +154,12 @@ export class CustomAgentStore {
136
154
  pi_packages_json = ?,
137
155
  main_model_json = ?,
138
156
  subagent_model_json = ?,
157
+ thinking_level = ?,
158
+ main_thinking_level = ?,
159
+ subagent_thinking_level = ?,
160
+ fast = ?,
161
+ main_fast = ?,
162
+ subagent_fast = ?,
139
163
  builtin_tools = ?,
140
164
  builtin_tool_names_json = ?,
141
165
  auto_context_files = ?,
@@ -143,7 +167,7 @@ export class CustomAgentStore {
143
167
  updated_at = ?
144
168
  WHERE id = ?
145
169
  `)
146
- .run(updated.profileName, updated.displayName, updated.description ?? null, JSON.stringify(updated.nativeTools), JSON.stringify(updated.skills), JSON.stringify(updated.contextFiles), JSON.stringify(sanitizeSubagents(updated.subagents)), JSON.stringify(updated.mcpServers), JSON.stringify(updated.piPackages), updated.mainModel ? JSON.stringify(updated.mainModel) : null, updated.subagentModel ? JSON.stringify(updated.subagentModel) : null, updated.builtinTools, JSON.stringify(updated.builtinToolNames), updated.autoContextFiles ? 1 : 0, updated.runControl ? 1 : 0, updated.updatedAt, id);
170
+ .run(updated.profileName, updated.displayName, updated.description ?? null, JSON.stringify(updated.nativeTools), JSON.stringify(updated.skills), JSON.stringify(updated.contextFiles), JSON.stringify(sanitizeSubagents(updated.subagents)), JSON.stringify(updated.mcpServers), JSON.stringify(updated.piPackages), updated.mainModel ? JSON.stringify(updated.mainModel) : null, updated.subagentModel ? JSON.stringify(updated.subagentModel) : null, updated.thinkingLevel ?? null, updated.mainThinkingLevel ?? null, updated.subagentThinkingLevel ?? null, serializeBoolean(updated.fast), serializeBoolean(updated.mainFast), serializeBoolean(updated.subagentFast), updated.builtinTools, JSON.stringify(updated.builtinToolNames), updated.autoContextFiles ? 1 : 0, updated.runControl ? 1 : 0, updated.updatedAt, id);
147
171
  return this.get(id);
148
172
  }
149
173
  setArchived(id, archived) {
@@ -170,7 +194,6 @@ export class CustomAgentStore {
170
194
  INSERT INTO chat_agents (
171
195
  id,
172
196
  profile_name,
173
- owner_scope,
174
197
  display_name,
175
198
  description,
176
199
  native_tools_json,
@@ -181,6 +204,12 @@ export class CustomAgentStore {
181
204
  pi_packages_json,
182
205
  main_model_json,
183
206
  subagent_model_json,
207
+ thinking_level,
208
+ main_thinking_level,
209
+ subagent_thinking_level,
210
+ fast,
211
+ main_fast,
212
+ subagent_fast,
184
213
  builtin_tools,
185
214
  builtin_tool_names_json,
186
215
  auto_context_files,
@@ -188,9 +217,9 @@ export class CustomAgentStore {
188
217
  created_at,
189
218
  updated_at,
190
219
  archived_at
191
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
220
+ ) VALUES (${Array.from({ length: 25 }, () => "?").join(", ")})
192
221
  `)
193
- .run(agent.id, agent.profileName, agent.ownerScope, agent.displayName, agent.description ?? null, JSON.stringify(agent.nativeTools), JSON.stringify(agent.skills), JSON.stringify(agent.contextFiles), JSON.stringify(sanitizeSubagents(agent.subagents)), JSON.stringify(agent.mcpServers), JSON.stringify(agent.piPackages), agent.mainModel ? JSON.stringify(agent.mainModel) : null, agent.subagentModel ? JSON.stringify(agent.subagentModel) : null, agent.builtinTools, JSON.stringify(agent.builtinToolNames), agent.autoContextFiles ? 1 : 0, agent.runControl ? 1 : 0, agent.createdAt, agent.updatedAt, agent.archivedAt ?? null);
222
+ .run(agent.id, agent.profileName, agent.displayName, agent.description ?? null, JSON.stringify(agent.nativeTools), JSON.stringify(agent.skills), JSON.stringify(agent.contextFiles), JSON.stringify(sanitizeSubagents(agent.subagents)), JSON.stringify(agent.mcpServers), JSON.stringify(agent.piPackages), agent.mainModel ? JSON.stringify(agent.mainModel) : null, agent.subagentModel ? JSON.stringify(agent.subagentModel) : null, agent.thinkingLevel ?? null, agent.mainThinkingLevel ?? null, agent.subagentThinkingLevel ?? null, serializeBoolean(agent.fast), serializeBoolean(agent.mainFast), serializeBoolean(agent.subagentFast), agent.builtinTools, JSON.stringify(agent.builtinToolNames), agent.autoContextFiles ? 1 : 0, agent.runControl ? 1 : 0, agent.createdAt, agent.updatedAt, agent.archivedAt ?? null);
194
223
  }
195
224
  requireProfileNameAvailable(profileName, currentId) {
196
225
  const row = this.db.prepare("SELECT id FROM chat_agents WHERE profile_name = ?").get(profileName);
@@ -211,6 +240,24 @@ export class CustomAgentStore {
211
240
  .run(nextName, nextName, row.id);
212
241
  }
213
242
  }
243
+ migrateDuplicateProfileNames() {
244
+ const rows = this.db.prepare("SELECT id, profile_name, display_name, created_at, updated_at FROM chat_agents ORDER BY profile_name ASC, updated_at DESC, created_at DESC, id DESC").all();
245
+ const used = new Set();
246
+ for (const row of rows) {
247
+ if (!used.has(row.profile_name)) {
248
+ used.add(row.profile_name);
249
+ continue;
250
+ }
251
+ const nextName = uniqueAgentName(legacyAgentNameCandidate(row.profile_name, row.id), used);
252
+ used.add(nextName);
253
+ this.db
254
+ .prepare("UPDATE chat_agents SET profile_name = ?, display_name = ? WHERE id = ?")
255
+ .run(nextName, nextName, row.id);
256
+ }
257
+ }
258
+ tableColumns() {
259
+ return new Set(this.db.prepare("PRAGMA table_info(chat_agents)").all().map((column) => column.name));
260
+ }
214
261
  migrateArchivedAtColumn() {
215
262
  const columns = new Set(this.db.prepare("PRAGMA table_info(chat_agents)").all().map((column) => column.name));
216
263
  if (!columns.has("archived_at")) {
@@ -244,6 +291,30 @@ export class CustomAgentStore {
244
291
  this.db.prepare("ALTER TABLE chat_agents ADD COLUMN subagent_model_json TEXT").run();
245
292
  }
246
293
  }
294
+ migrateThinkingLevelColumn() {
295
+ const columns = new Set(this.db.prepare("PRAGMA table_info(chat_agents)").all().map((column) => column.name));
296
+ if (!columns.has("thinking_level")) {
297
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN thinking_level TEXT").run();
298
+ }
299
+ }
300
+ migrateThinkingOptionColumns() {
301
+ const columns = new Set(this.db.prepare("PRAGMA table_info(chat_agents)").all().map((column) => column.name));
302
+ if (!columns.has("main_thinking_level")) {
303
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN main_thinking_level TEXT").run();
304
+ }
305
+ if (!columns.has("subagent_thinking_level")) {
306
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN subagent_thinking_level TEXT").run();
307
+ }
308
+ if (!columns.has("fast")) {
309
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN fast INTEGER").run();
310
+ }
311
+ if (!columns.has("main_fast")) {
312
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN main_fast INTEGER").run();
313
+ }
314
+ if (!columns.has("subagent_fast")) {
315
+ this.db.prepare("ALTER TABLE chat_agents ADD COLUMN subagent_fast INTEGER").run();
316
+ }
317
+ }
247
318
  migrateBuiltinToolNamesColumn() {
248
319
  const columns = new Set(this.db.prepare("PRAGMA table_info(chat_agents)").all().map((column) => column.name));
249
320
  if (!columns.has("builtin_tool_names_json")) {
@@ -251,14 +322,13 @@ export class CustomAgentStore {
251
322
  }
252
323
  }
253
324
  }
254
- export function createDefaultCustomAgentStore(cwd = process.cwd()) {
255
- return new CustomAgentStore(resolve(cwd, ".pibo/chat-agents.sqlite"));
325
+ export function createDefaultCustomAgentStore(_cwd) {
326
+ return new CustomAgentStore(piboHomePath("chat-agents.sqlite"));
256
327
  }
257
328
  function agentFromRow(row) {
258
329
  return {
259
330
  id: row.id,
260
331
  profileName: row.profile_name,
261
- ownerScope: row.owner_scope,
262
332
  displayName: row.display_name,
263
333
  description: row.description ?? undefined,
264
334
  nativeTools: parseStringArray(row.native_tools_json),
@@ -269,6 +339,12 @@ function agentFromRow(row) {
269
339
  piPackages: parseStringArray(row.pi_packages_json),
270
340
  mainModel: parseModelProfile(row.main_model_json),
271
341
  subagentModel: parseModelProfile(row.subagent_model_json),
342
+ thinkingLevel: sanitizeThinkingLevel(row.thinking_level),
343
+ mainThinkingLevel: sanitizeThinkingLevel(row.main_thinking_level),
344
+ subagentThinkingLevel: sanitizeThinkingLevel(row.subagent_thinking_level),
345
+ fast: parseBoolean(row.fast),
346
+ mainFast: parseBoolean(row.main_fast),
347
+ subagentFast: parseBoolean(row.subagent_fast),
272
348
  builtinTools: row.builtin_tools,
273
349
  builtinToolNames: sanitizeBuiltinToolNames(parseStringArray(row.builtin_tool_names_json)),
274
350
  autoContextFiles: row.auto_context_files !== 0,
@@ -298,6 +374,22 @@ function sanitizePiPackages(value) {
298
374
  }
299
375
  return packages;
300
376
  }
377
+ function sanitizeThinkingLevel(value) {
378
+ return typeof value === "string" && isPiboThinkingLevel(value) ? value : undefined;
379
+ }
380
+ function sanitizeBoolean(value) {
381
+ return typeof value === "boolean" ? value : undefined;
382
+ }
383
+ function serializeBoolean(value) {
384
+ if (value === undefined)
385
+ return null;
386
+ return value ? 1 : 0;
387
+ }
388
+ function parseBoolean(value) {
389
+ if (value === null)
390
+ return undefined;
391
+ return value === 1;
392
+ }
301
393
  function sanitizeBuiltinToolNames(value) {
302
394
  const selected = new Set(uniqueStrings(value ?? DEFAULT_BUILTIN_TOOL_NAMES));
303
395
  return DEFAULT_BUILTIN_TOOL_NAMES.filter((name) => selected.has(name));
@@ -368,6 +460,11 @@ function agentNameCandidate(displayName, id) {
368
460
  return candidate;
369
461
  return `agent-${id.replace(/^agent_/, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "")}`;
370
462
  }
463
+ function legacyAgentNameCandidate(profileName, id) {
464
+ const baseName = agentNameCandidate(profileName, id);
465
+ const hash = createHash("sha256").update(id).digest("hex").slice(0, 8);
466
+ return `${baseName}-legacy-${hash}`;
467
+ }
371
468
  function uniqueAgentName(baseName, used) {
372
469
  let name = baseName;
373
470
  let suffix = 2;