@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,633 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { PiboWebHttpError } from "../../web/http.js";
3
+ import { allocateWorkflowPublishedVersion, canonicalWorkflowDefinitionJson, hashPromptAssetMarkdown, hashWorkflowDefinitionJson, normalizeWorkflowPromptAssetLabel, sanitizeWorkflowDiagnostics, workflowDraftDefinitionForPublishedVersion, } from "./workflow-persistence-model.js";
4
+ export { canonicalWorkflowDefinitionJson, compareWorkflowSemver, hashPromptAssetMarkdown, hashWorkflowDefinitionJson, normalizeForCanonicalJson, normalizeWorkflowPromptAssetLabel, parseWorkflowSemver, sanitizeWorkflowDiagnostics, } from "./workflow-persistence-model.js";
5
+ export class ChatWorkflowDraftStore {
6
+ dataStore;
7
+ constructor(dataStore) {
8
+ this.dataStore = dataStore;
9
+ this.dataStore.db.exec(`
10
+ CREATE TABLE IF NOT EXISTS workflow_ui_drafts (
11
+ draft_id TEXT PRIMARY KEY,
12
+ workflow_id TEXT NOT NULL,
13
+ source TEXT NOT NULL,
14
+ status TEXT NOT NULL,
15
+ base_workflow_id TEXT,
16
+ base_workflow_version TEXT,
17
+ base_definition_hash TEXT,
18
+ target_workflow_version TEXT,
19
+ version_intent TEXT NOT NULL,
20
+ definition_json TEXT NOT NULL,
21
+ diagnostics_json TEXT NOT NULL,
22
+ validation_json TEXT,
23
+ validation_state TEXT NOT NULL,
24
+ revision INTEGER NOT NULL,
25
+ created_at TEXT NOT NULL,
26
+ updated_at TEXT NOT NULL
27
+ );
28
+
29
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_ui_drafts_one_active
30
+ ON workflow_ui_drafts(workflow_id)
31
+ WHERE status = 'draft';
32
+ CREATE INDEX IF NOT EXISTS idx_workflow_ui_drafts_updated
33
+ ON workflow_ui_drafts(updated_at, draft_id);
34
+ `);
35
+ }
36
+ getDraft(draftId) {
37
+ const row = this.dataStore.db.prepare("SELECT * FROM workflow_ui_drafts WHERE draft_id = ?").get(draftId);
38
+ return row ? workflowDraftFromStoreRow(row) : undefined;
39
+ }
40
+ findActiveDraftByWorkflowId(workflowId) {
41
+ const row = this.dataStore.db
42
+ .prepare("SELECT * FROM workflow_ui_drafts WHERE workflow_id = ? AND status = 'draft' ORDER BY updated_at DESC, draft_id ASC LIMIT 1")
43
+ .get(workflowId);
44
+ return row ? workflowDraftFromStoreRow(row) : undefined;
45
+ }
46
+ listDrafts(filter = {}) {
47
+ const rows = filter.workflowId
48
+ ? this.dataStore.db
49
+ .prepare("SELECT * FROM workflow_ui_drafts WHERE workflow_id = ? ORDER BY updated_at DESC, draft_id ASC")
50
+ .all(filter.workflowId)
51
+ : this.dataStore.db
52
+ .prepare("SELECT * FROM workflow_ui_drafts ORDER BY workflow_id ASC, updated_at DESC, draft_id ASC")
53
+ .all();
54
+ return rows.map(workflowDraftFromStoreRow);
55
+ }
56
+ saveDraft(record) {
57
+ this.dataStore.transaction(() => {
58
+ const conflict = this.dataStore.db
59
+ .prepare("SELECT draft_id FROM workflow_ui_drafts WHERE workflow_id = ? AND status = 'draft' AND draft_id <> ? LIMIT 1")
60
+ .get(record.workflowId, record.draftId);
61
+ if (conflict) {
62
+ throw new PiboWebHttpError(`Workflow '${record.workflowId}' already has an active draft '${conflict.draft_id}'`, 409);
63
+ }
64
+ this.dataStore.db.prepare(`
65
+ INSERT INTO workflow_ui_drafts (
66
+ draft_id,
67
+ workflow_id,
68
+ source,
69
+ status,
70
+ base_workflow_id,
71
+ base_workflow_version,
72
+ base_definition_hash,
73
+ target_workflow_version,
74
+ version_intent,
75
+ definition_json,
76
+ diagnostics_json,
77
+ validation_json,
78
+ validation_state,
79
+ revision,
80
+ created_at,
81
+ updated_at
82
+ ) VALUES (${Array.from({ length: 16 }, () => "?").join(", ")})
83
+ ON CONFLICT(draft_id) DO UPDATE SET
84
+ workflow_id = excluded.workflow_id,
85
+ source = excluded.source,
86
+ status = excluded.status,
87
+ base_workflow_id = excluded.base_workflow_id,
88
+ base_workflow_version = excluded.base_workflow_version,
89
+ base_definition_hash = excluded.base_definition_hash,
90
+ target_workflow_version = excluded.target_workflow_version,
91
+ version_intent = excluded.version_intent,
92
+ definition_json = excluded.definition_json,
93
+ diagnostics_json = excluded.diagnostics_json,
94
+ validation_json = excluded.validation_json,
95
+ validation_state = excluded.validation_state,
96
+ revision = excluded.revision,
97
+ created_at = excluded.created_at,
98
+ updated_at = excluded.updated_at
99
+ `).run(record.draftId, record.workflowId, record.source, record.status, record.baseWorkflowId ?? null, record.baseWorkflowVersion ?? null, record.baseDefinitionHash ?? null, record.targetWorkflowVersion ?? null, record.versionIntent, JSON.stringify(record.definition), JSON.stringify(sanitizeWorkflowDiagnostics(record.diagnostics)), record.validation ? JSON.stringify(record.validation) : null, record.validationState, record.revision, record.createdAt, record.updatedAt);
100
+ });
101
+ }
102
+ }
103
+ function workflowDraftFromStoreRow(row) {
104
+ return {
105
+ draftId: row.draft_id,
106
+ workflowId: row.workflow_id,
107
+ source: row.source,
108
+ status: row.status,
109
+ ...(row.base_workflow_id ? { baseWorkflowId: row.base_workflow_id } : {}),
110
+ ...(row.base_workflow_version ? { baseWorkflowVersion: row.base_workflow_version } : {}),
111
+ ...(row.base_definition_hash ? { baseDefinitionHash: row.base_definition_hash } : {}),
112
+ ...(row.target_workflow_version ? { targetWorkflowVersion: row.target_workflow_version } : {}),
113
+ versionIntent: row.version_intent,
114
+ definition: JSON.parse(row.definition_json),
115
+ diagnostics: sanitizeWorkflowDiagnostics(JSON.parse(row.diagnostics_json)),
116
+ ...(row.validation_json ? { validation: JSON.parse(row.validation_json) } : {}),
117
+ validationState: row.validation_state,
118
+ revision: row.revision,
119
+ createdAt: row.created_at,
120
+ updatedAt: row.updated_at,
121
+ };
122
+ }
123
+ export class ChatWorkflowPublishedVersionStore {
124
+ dataStore;
125
+ constructor(dataStore) {
126
+ this.dataStore = dataStore;
127
+ this.dataStore.db.exec(`
128
+ CREATE TABLE IF NOT EXISTS workflow_published_versions (
129
+ workflow_id TEXT NOT NULL,
130
+ version TEXT NOT NULL,
131
+ source TEXT NOT NULL,
132
+ status TEXT NOT NULL,
133
+ definition_hash TEXT NOT NULL,
134
+ definition_json TEXT NOT NULL,
135
+ published_from_draft_id TEXT,
136
+ published_by TEXT,
137
+ published_at TEXT NOT NULL,
138
+ created_at TEXT NOT NULL,
139
+ PRIMARY KEY (workflow_id, version)
140
+ );
141
+
142
+ CREATE INDEX IF NOT EXISTS idx_workflow_published_versions_workflow
143
+ ON workflow_published_versions(workflow_id, version);
144
+ CREATE INDEX IF NOT EXISTS idx_workflow_published_versions_published_at
145
+ ON workflow_published_versions(published_at);
146
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_published_versions_draft
147
+ ON workflow_published_versions(published_from_draft_id)
148
+ WHERE published_from_draft_id IS NOT NULL;
149
+ `);
150
+ }
151
+ getPublishedVersionByDraftId(draftId) {
152
+ const row = this.dataStore.db
153
+ .prepare("SELECT * FROM workflow_published_versions WHERE published_from_draft_id = ? ORDER BY published_at ASC LIMIT 1")
154
+ .get(draftId);
155
+ return row ? workflowPublishedVersionFromStoreRow(row) : undefined;
156
+ }
157
+ listPublishedVersions(filter = {}) {
158
+ const rows = filter.workflowId
159
+ ? this.dataStore.db
160
+ .prepare("SELECT * FROM workflow_published_versions WHERE workflow_id = ? ORDER BY workflow_id ASC, version ASC")
161
+ .all(filter.workflowId)
162
+ : this.dataStore.db
163
+ .prepare("SELECT * FROM workflow_published_versions ORDER BY workflow_id ASC, version ASC")
164
+ .all();
165
+ return rows.map(workflowPublishedVersionFromStoreRow);
166
+ }
167
+ publishDraft(input) {
168
+ return this.dataStore.transaction(() => {
169
+ const alreadyPublished = this.getPublishedVersionByDraftId(input.draft.draftId);
170
+ if (alreadyPublished)
171
+ return { record: alreadyPublished, alreadyPublished: true };
172
+ const existingVersions = [
173
+ ...input.reservedVersions,
174
+ ...this.listPublishedVersions({ workflowId: input.draft.workflowId }).map((record) => record.version),
175
+ ];
176
+ const version = allocateWorkflowPublishedVersion({
177
+ draft: input.draft,
178
+ versionIntent: input.versionIntent,
179
+ existingVersions,
180
+ });
181
+ const definition = workflowDraftDefinitionForPublishedVersion(input.draft.definition, input.draft.workflowId, version);
182
+ const now = new Date().toISOString();
183
+ const record = {
184
+ workflowId: input.draft.workflowId,
185
+ version,
186
+ source: "ui",
187
+ status: "published",
188
+ definition,
189
+ definitionHash: hashWorkflowDefinitionJson(definition),
190
+ publishedFromDraftId: input.draft.draftId,
191
+ publishedBy: input.publishedBy,
192
+ publishedAt: now,
193
+ createdAt: now,
194
+ };
195
+ this.insertPublishedVersion(record);
196
+ return { record, alreadyPublished: false };
197
+ });
198
+ }
199
+ insertPublishedVersion(record) {
200
+ this.dataStore.db.prepare(`
201
+ INSERT INTO workflow_published_versions (
202
+ workflow_id,
203
+ version,
204
+ source,
205
+ status,
206
+ definition_hash,
207
+ definition_json,
208
+ published_from_draft_id,
209
+ published_by,
210
+ published_at,
211
+ created_at
212
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
213
+ `).run(record.workflowId, record.version, record.source, record.status, record.definitionHash, canonicalWorkflowDefinitionJson(record.definition), record.publishedFromDraftId ?? null, record.publishedBy ?? null, record.publishedAt, record.createdAt);
214
+ }
215
+ }
216
+ function workflowPublishedVersionFromStoreRow(row) {
217
+ return {
218
+ workflowId: row.workflow_id,
219
+ version: row.version,
220
+ source: row.source,
221
+ status: row.status,
222
+ definitionHash: row.definition_hash,
223
+ definition: JSON.parse(row.definition_json),
224
+ ...(row.published_from_draft_id ? { publishedFromDraftId: row.published_from_draft_id } : {}),
225
+ ...(row.published_by ? { publishedBy: row.published_by } : {}),
226
+ publishedAt: row.published_at,
227
+ createdAt: row.created_at,
228
+ };
229
+ }
230
+ export class ChatWorkflowPromptAssetStore {
231
+ dataStore;
232
+ constructor(dataStore) {
233
+ this.dataStore = dataStore;
234
+ this.dataStore.db.exec(`
235
+ CREATE TABLE IF NOT EXISTS workflow_prompt_assets (
236
+ asset_id TEXT PRIMARY KEY,
237
+ source TEXT NOT NULL,
238
+ display_name TEXT NOT NULL,
239
+ description TEXT,
240
+ active_revision_id TEXT,
241
+ created_at TEXT NOT NULL,
242
+ updated_at TEXT NOT NULL
243
+ );
244
+
245
+ CREATE TABLE IF NOT EXISTS workflow_prompt_asset_revisions (
246
+ revision_id TEXT PRIMARY KEY,
247
+ asset_id TEXT NOT NULL,
248
+ content_hash TEXT NOT NULL,
249
+ markdown TEXT NOT NULL,
250
+ created_at TEXT NOT NULL,
251
+ created_by TEXT,
252
+ based_on_revision_id TEXT
253
+ );
254
+
255
+ CREATE INDEX IF NOT EXISTS idx_workflow_prompt_asset_revisions_asset
256
+ ON workflow_prompt_asset_revisions(asset_id, created_at DESC);
257
+ `);
258
+ }
259
+ listAssets() {
260
+ const rows = this.dataStore.db
261
+ .prepare("SELECT * FROM workflow_prompt_assets ORDER BY display_name ASC, asset_id ASC")
262
+ .all();
263
+ return rows.map(workflowPromptAssetFromStoreRow);
264
+ }
265
+ getAsset(assetId) {
266
+ const row = this.dataStore.db
267
+ .prepare("SELECT * FROM workflow_prompt_assets WHERE asset_id = ?")
268
+ .get(assetId);
269
+ return row ? workflowPromptAssetFromStoreRow(row) : undefined;
270
+ }
271
+ getActiveRevision(assetId) {
272
+ const asset = this.getAsset(assetId);
273
+ if (!asset?.activeRevisionId)
274
+ return undefined;
275
+ const row = this.dataStore.db
276
+ .prepare("SELECT * FROM workflow_prompt_asset_revisions WHERE asset_id = ? AND revision_id = ?")
277
+ .get(assetId, asset.activeRevisionId);
278
+ return row ? workflowPromptAssetRevisionFromStoreRow(row) : undefined;
279
+ }
280
+ saveRevision(input) {
281
+ return this.dataStore.transaction(() => {
282
+ const now = new Date().toISOString();
283
+ const assetId = input.assetId?.trim() || `ui.promptAssets.${randomUUID()}`;
284
+ const existing = this.getAsset(assetId);
285
+ const revisionId = `wpar_${randomUUID()}`;
286
+ const contentHash = hashPromptAssetMarkdown(input.markdown);
287
+ this.dataStore.db.prepare(`
288
+ INSERT INTO workflow_prompt_assets (
289
+ asset_id,
290
+ source,
291
+ display_name,
292
+ description,
293
+ active_revision_id,
294
+ created_at,
295
+ updated_at
296
+ ) VALUES (${Array.from({ length: 7 }, () => "?").join(", ")})
297
+ ON CONFLICT(asset_id) DO UPDATE SET
298
+ display_name = excluded.display_name,
299
+ description = excluded.description,
300
+ active_revision_id = excluded.active_revision_id,
301
+ updated_at = excluded.updated_at
302
+ `).run(assetId, "ui", normalizeWorkflowPromptAssetLabel(input.displayName), input.description?.trim() || null, revisionId, existing?.createdAt ?? now, now);
303
+ this.dataStore.db.prepare(`
304
+ INSERT INTO workflow_prompt_asset_revisions (
305
+ revision_id,
306
+ asset_id,
307
+ content_hash,
308
+ markdown,
309
+ created_at,
310
+ created_by,
311
+ based_on_revision_id
312
+ ) VALUES (${Array.from({ length: 7 }, () => "?").join(", ")})
313
+ `).run(revisionId, assetId, contentHash, input.markdown, now, input.actorId ?? null, existing?.activeRevisionId ?? null);
314
+ const asset = this.getAsset(assetId);
315
+ const revision = this.getActiveRevision(assetId);
316
+ if (!asset || !revision)
317
+ throw new Error(`Failed to save workflow prompt asset '${assetId}'`);
318
+ return workflowPromptAssetDocumentFromRecords(asset, revision);
319
+ });
320
+ }
321
+ }
322
+ function workflowPromptAssetFromStoreRow(row) {
323
+ return {
324
+ assetId: row.asset_id,
325
+ source: row.source,
326
+ displayName: row.display_name,
327
+ ...(row.description ? { description: row.description } : {}),
328
+ ...(row.active_revision_id ? { activeRevisionId: row.active_revision_id } : {}),
329
+ createdAt: row.created_at,
330
+ updatedAt: row.updated_at,
331
+ };
332
+ }
333
+ function workflowPromptAssetRevisionFromStoreRow(row) {
334
+ return {
335
+ revisionId: row.revision_id,
336
+ assetId: row.asset_id,
337
+ contentHash: row.content_hash,
338
+ markdown: row.markdown,
339
+ createdAt: row.created_at,
340
+ ...(row.created_by ? { createdBy: row.created_by } : {}),
341
+ ...(row.based_on_revision_id ? { basedOnRevisionId: row.based_on_revision_id } : {}),
342
+ };
343
+ }
344
+ export function workflowPromptAssetDocumentFromRecords(asset, revision) {
345
+ return {
346
+ id: asset.assetId,
347
+ displayName: asset.displayName,
348
+ ...(asset.description ? { description: asset.description } : {}),
349
+ source: asset.source,
350
+ readOnly: false,
351
+ revisionId: revision.revisionId,
352
+ contentHash: revision.contentHash,
353
+ markdown: revision.markdown,
354
+ createdAt: asset.createdAt,
355
+ updatedAt: asset.updatedAt,
356
+ };
357
+ }
358
+ export class ChatWorkflowArchiveStore {
359
+ dataStore;
360
+ constructor(dataStore) {
361
+ this.dataStore = dataStore;
362
+ this.dataStore.db.exec(`
363
+ CREATE TABLE IF NOT EXISTS workflow_archive_states (
364
+ workflow_id TEXT PRIMARY KEY,
365
+ source TEXT NOT NULL,
366
+ archived INTEGER NOT NULL,
367
+ archived_at TEXT,
368
+ archived_by TEXT,
369
+ archive_reason TEXT,
370
+ updated_at TEXT NOT NULL
371
+ );
372
+
373
+ CREATE INDEX IF NOT EXISTS idx_workflow_archive_states_archived
374
+ ON workflow_archive_states(archived, updated_at);
375
+ `);
376
+ }
377
+ setWorkflowArchived(input) {
378
+ const existing = this.getWorkflowArchiveState(input.workflowId);
379
+ const now = new Date().toISOString();
380
+ const archiveReason = input.archiveReason ?? existing?.archiveReason;
381
+ const record = {
382
+ workflowId: input.workflowId,
383
+ source: "ui",
384
+ archived: true,
385
+ archivedAt: existing?.archivedAt ?? now,
386
+ archivedBy: input.archivedBy,
387
+ ...(archiveReason ? { archiveReason } : {}),
388
+ updatedAt: now,
389
+ };
390
+ this.saveWorkflowArchiveState(record);
391
+ return record;
392
+ }
393
+ saveWorkflowArchiveState(record) {
394
+ this.dataStore.db.prepare(`
395
+ INSERT INTO workflow_archive_states (
396
+ workflow_id,
397
+ source,
398
+ archived,
399
+ archived_at,
400
+ archived_by,
401
+ archive_reason,
402
+ updated_at
403
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
404
+ ON CONFLICT(workflow_id) DO UPDATE SET
405
+ source = excluded.source,
406
+ archived = excluded.archived,
407
+ archived_at = excluded.archived_at,
408
+ archived_by = excluded.archived_by,
409
+ archive_reason = excluded.archive_reason,
410
+ updated_at = excluded.updated_at
411
+ `).run(record.workflowId, record.source, record.archived ? 1 : 0, record.archivedAt ?? null, record.archivedBy ?? null, record.archiveReason ?? null, record.updatedAt);
412
+ }
413
+ getWorkflowArchiveState(workflowId) {
414
+ const row = this.dataStore.db.prepare("SELECT * FROM workflow_archive_states WHERE workflow_id = ?").get(workflowId);
415
+ return row ? workflowArchiveStateFromStoreRow(row) : undefined;
416
+ }
417
+ }
418
+ function workflowArchiveStateFromStoreRow(row) {
419
+ return {
420
+ workflowId: row.workflow_id,
421
+ source: row.source,
422
+ archived: row.archived === 1,
423
+ ...(row.archived_at ? { archivedAt: row.archived_at } : {}),
424
+ ...(row.archived_by ? { archivedBy: row.archived_by } : {}),
425
+ ...(row.archive_reason ? { archiveReason: row.archive_reason } : {}),
426
+ updatedAt: row.updated_at,
427
+ };
428
+ }
429
+ export class ChatWorkflowTombstoneStore {
430
+ dataStore;
431
+ constructor(dataStore) {
432
+ this.dataStore = dataStore;
433
+ this.dataStore.db.exec(`
434
+ CREATE TABLE IF NOT EXISTS workflow_delete_tombstones (
435
+ workflow_id TEXT PRIMARY KEY,
436
+ source TEXT NOT NULL,
437
+ deleted INTEGER NOT NULL,
438
+ deleted_at TEXT NOT NULL,
439
+ deleted_by TEXT NOT NULL,
440
+ last_known_title TEXT NOT NULL,
441
+ last_known_version TEXT,
442
+ last_definition_hash TEXT,
443
+ updated_at TEXT NOT NULL
444
+ );
445
+
446
+ CREATE INDEX IF NOT EXISTS idx_workflow_delete_tombstones_deleted
447
+ ON workflow_delete_tombstones(deleted, updated_at);
448
+ `);
449
+ }
450
+ setWorkflowDeleted(input) {
451
+ const existing = this.getWorkflowTombstone(input.workflowId);
452
+ const now = new Date().toISOString();
453
+ const record = {
454
+ workflowId: input.workflowId,
455
+ source: "ui",
456
+ deleted: true,
457
+ deletedAt: existing?.deletedAt ?? now,
458
+ deletedBy: input.deletedBy,
459
+ lastKnownTitle: input.lastKnownTitle,
460
+ ...(input.lastKnownVersion ? { lastKnownVersion: input.lastKnownVersion } : {}),
461
+ ...(input.lastDefinitionHash ? { lastDefinitionHash: input.lastDefinitionHash } : {}),
462
+ updatedAt: now,
463
+ };
464
+ this.saveWorkflowTombstone(record);
465
+ return record;
466
+ }
467
+ getWorkflowTombstone(workflowId) {
468
+ const row = this.dataStore.db.prepare("SELECT * FROM workflow_delete_tombstones WHERE workflow_id = ? AND deleted = 1").get(workflowId);
469
+ return row ? workflowTombstoneFromStoreRow(row) : undefined;
470
+ }
471
+ saveWorkflowTombstone(record) {
472
+ this.dataStore.db.prepare(`
473
+ INSERT INTO workflow_delete_tombstones (
474
+ workflow_id,
475
+ source,
476
+ deleted,
477
+ deleted_at,
478
+ deleted_by,
479
+ last_known_title,
480
+ last_known_version,
481
+ last_definition_hash,
482
+ updated_at
483
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
484
+ ON CONFLICT(workflow_id) DO UPDATE SET
485
+ source = excluded.source,
486
+ deleted = excluded.deleted,
487
+ deleted_at = excluded.deleted_at,
488
+ deleted_by = excluded.deleted_by,
489
+ last_known_title = excluded.last_known_title,
490
+ last_known_version = excluded.last_known_version,
491
+ last_definition_hash = excluded.last_definition_hash,
492
+ updated_at = excluded.updated_at
493
+ `).run(record.workflowId, record.source, record.deleted ? 1 : 0, record.deletedAt, record.deletedBy, record.lastKnownTitle, record.lastKnownVersion ?? null, record.lastDefinitionHash ?? null, record.updatedAt);
494
+ }
495
+ }
496
+ function workflowTombstoneFromStoreRow(row) {
497
+ return {
498
+ workflowId: row.workflow_id,
499
+ source: row.source,
500
+ deleted: row.deleted === 1,
501
+ deletedAt: row.deleted_at,
502
+ deletedBy: row.deleted_by,
503
+ lastKnownTitle: row.last_known_title,
504
+ ...(row.last_known_version ? { lastKnownVersion: row.last_known_version } : {}),
505
+ ...(row.last_definition_hash ? { lastDefinitionHash: row.last_definition_hash } : {}),
506
+ updatedAt: row.updated_at,
507
+ };
508
+ }
509
+ export class ChatWorkflowLifecycleEventStore {
510
+ dataStore;
511
+ constructor(dataStore) {
512
+ this.dataStore = dataStore;
513
+ this.dataStore.db.exec(`
514
+ CREATE TABLE IF NOT EXISTS workflow_lifecycle_events (
515
+ id TEXT PRIMARY KEY,
516
+ type TEXT NOT NULL,
517
+ actor_id TEXT,
518
+ workflow_id TEXT,
519
+ workflow_version TEXT,
520
+ draft_id TEXT,
521
+ project_id TEXT,
522
+ pibo_session_id TEXT,
523
+ workflow_run_id TEXT,
524
+ status TEXT,
525
+ validation_json TEXT,
526
+ diagnostics_json TEXT NOT NULL,
527
+ payload_json TEXT,
528
+ created_at TEXT NOT NULL
529
+ );
530
+
531
+ CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_type
532
+ ON workflow_lifecycle_events(type, created_at);
533
+ CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_workflow
534
+ ON workflow_lifecycle_events(workflow_id, workflow_version, created_at);
535
+ CREATE INDEX IF NOT EXISTS idx_workflow_lifecycle_events_project_session
536
+ ON workflow_lifecycle_events(project_id, pibo_session_id, created_at);
537
+ `);
538
+ }
539
+ record(input) {
540
+ const event = {
541
+ id: input.id ?? `wfle_${randomUUID()}`,
542
+ type: input.type,
543
+ ...(input.actorId ? { actorId: input.actorId } : {}),
544
+ ...(input.workflowId ? { workflowId: input.workflowId } : {}),
545
+ ...(input.workflowVersion ? { workflowVersion: input.workflowVersion } : {}),
546
+ ...(input.draftId ? { draftId: input.draftId } : {}),
547
+ ...(input.projectId ? { projectId: input.projectId } : {}),
548
+ ...(input.piboSessionId ? { piboSessionId: input.piboSessionId } : {}),
549
+ ...(input.workflowRunId ? { workflowRunId: input.workflowRunId } : {}),
550
+ ...(input.status ? { status: input.status } : {}),
551
+ ...(input.validation ? { validation: input.validation } : {}),
552
+ diagnostics: sanitizeWorkflowDiagnostics(input.diagnostics ?? []),
553
+ ...(input.payload ? { payload: input.payload } : {}),
554
+ createdAt: input.createdAt ?? new Date().toISOString(),
555
+ };
556
+ this.dataStore.db.prepare(`
557
+ INSERT INTO workflow_lifecycle_events (
558
+ id,
559
+ type,
560
+ actor_id,
561
+ workflow_id,
562
+ workflow_version,
563
+ draft_id,
564
+ project_id,
565
+ pibo_session_id,
566
+ workflow_run_id,
567
+ status,
568
+ validation_json,
569
+ diagnostics_json,
570
+ payload_json,
571
+ created_at
572
+ ) VALUES (${Array.from({ length: 14 }, () => "?").join(", ")})
573
+ `).run(event.id, event.type, event.actorId ?? null, event.workflowId ?? null, event.workflowVersion ?? null, event.draftId ?? null, event.projectId ?? null, event.piboSessionId ?? null, event.workflowRunId ?? null, event.status ?? null, event.validation ? JSON.stringify(event.validation) : null, JSON.stringify(event.diagnostics), event.payload ? JSON.stringify(event.payload) : null, event.createdAt);
574
+ return event;
575
+ }
576
+ listEvents(filter) {
577
+ const clauses = [];
578
+ const values = [];
579
+ if (filter.type) {
580
+ clauses.push("type = ?");
581
+ values.push(filter.type);
582
+ }
583
+ if (filter.workflowId) {
584
+ clauses.push("workflow_id = ?");
585
+ values.push(filter.workflowId);
586
+ }
587
+ if (filter.draftId) {
588
+ clauses.push("draft_id = ?");
589
+ values.push(filter.draftId);
590
+ }
591
+ if (filter.projectId) {
592
+ clauses.push("project_id = ?");
593
+ values.push(filter.projectId);
594
+ }
595
+ if (filter.piboSessionId) {
596
+ clauses.push("pibo_session_id = ?");
597
+ values.push(filter.piboSessionId);
598
+ }
599
+ if (filter.workflowRunId) {
600
+ clauses.push("workflow_run_id = ?");
601
+ values.push(filter.workflowRunId);
602
+ }
603
+ const where = clauses.length ? `WHERE ${clauses.join(" AND ")}` : "";
604
+ const rows = this.dataStore.db.prepare(`
605
+ SELECT * FROM workflow_lifecycle_events
606
+ ${where}
607
+ ORDER BY created_at DESC, id DESC
608
+ LIMIT ?
609
+ `).all(...values, filter.limit ?? 100);
610
+ return rows.map(workflowLifecycleEventFromStoreRow);
611
+ }
612
+ }
613
+ function workflowLifecycleEventFromStoreRow(row) {
614
+ return {
615
+ id: row.id,
616
+ type: row.type,
617
+ ...(row.actor_id ? { actorId: row.actor_id } : {}),
618
+ ...(row.workflow_id ? { workflowId: row.workflow_id } : {}),
619
+ ...(row.workflow_version ? { workflowVersion: row.workflow_version } : {}),
620
+ ...(row.draft_id ? { draftId: row.draft_id } : {}),
621
+ ...(row.project_id ? { projectId: row.project_id } : {}),
622
+ ...(row.pibo_session_id ? { piboSessionId: row.pibo_session_id } : {}),
623
+ ...(row.workflow_run_id ? { workflowRunId: row.workflow_run_id } : {}),
624
+ ...(row.status ? { status: row.status } : {}),
625
+ ...(row.validation_json ? { validation: JSON.parse(row.validation_json) } : {}),
626
+ diagnostics: sanitizeWorkflowDiagnostics(JSON.parse(row.diagnostics_json)),
627
+ ...(row.payload_json ? { payload: JSON.parse(row.payload_json) } : {}),
628
+ createdAt: row.created_at,
629
+ };
630
+ }
631
+ function quoteIdentifier(value) {
632
+ return `"${value.replaceAll('"', '""')}"`;
633
+ }