@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,572 @@
1
+ import { PiboWebHttpError } from "../../web/http.js";
2
+ import { compareWorkflowSemver, hashWorkflowDefinitionJson, parseWorkflowSemver, sanitizeWorkflowDiagnostics, } from "./workflow-persistence.js";
3
+ export const STATIC_WORKFLOW_VERSION_CATALOG = [
4
+ {
5
+ id: "standard-project",
6
+ version: "1.0.0",
7
+ title: "Standard Project",
8
+ description: "Configured workflow-backed Project session for feature, bugfix, and review work. Creation saves the configuration without starting a run.",
9
+ source: "code",
10
+ status: "published",
11
+ tags: ["project", "workflow"],
12
+ },
13
+ {
14
+ id: "simple-chat",
15
+ version: "1.0.0",
16
+ title: "Simple Chat",
17
+ description: "Baseline Project chat workflow that preserves the existing one-session chat behavior.",
18
+ source: "code",
19
+ status: "published",
20
+ tags: ["project", "chat"],
21
+ },
22
+ {
23
+ id: "ui-review-workflow",
24
+ version: "2.0.0",
25
+ title: "UI Review Workflow",
26
+ description: "UI-authored published workflow fixture for next-version draft editing.",
27
+ source: "ui",
28
+ status: "published",
29
+ tags: ["workflow-ui", "review"],
30
+ },
31
+ {
32
+ id: "ui-draft-workflow",
33
+ version: "0.1.0-draft",
34
+ title: "UI Draft Workflow",
35
+ description: "Unpublished fixture used to enforce Project session creation boundaries.",
36
+ source: "ui",
37
+ status: "draft",
38
+ tags: ["workflow-ui", "draft"],
39
+ },
40
+ {
41
+ id: "archived-review-workflow",
42
+ version: "1.0.0",
43
+ title: "Archived Review Workflow",
44
+ description: "Archived fixture omitted from default Project session creation choices.",
45
+ source: "ui",
46
+ status: "archived",
47
+ tags: ["workflow-ui", "archived"],
48
+ },
49
+ ];
50
+ export function buildWorkflowVersionPicker(state, selectedWorkflowId, selectedWorkflowVersion) {
51
+ const options = buildProjectWorkflowVersionOptions(state);
52
+ const normalizedWorkflowId = selectedWorkflowId?.trim() || undefined;
53
+ const normalizedWorkflowVersion = selectedWorkflowVersion?.trim() || undefined;
54
+ const selected = normalizedWorkflowId
55
+ ? options.find((option) => option.id === normalizedWorkflowId && (!normalizedWorkflowVersion || option.version === normalizedWorkflowVersion))
56
+ : options[0];
57
+ const diagnostics = [];
58
+ if (normalizedWorkflowId && !selected) {
59
+ diagnostics.push({
60
+ code: "WorkflowCatalogError.unknownWorkflowVersion",
61
+ message: `Workflow version '${normalizedWorkflowId}${normalizedWorkflowVersion ? `@${normalizedWorkflowVersion}` : ""}' is not available for Project session creation.`,
62
+ severity: "error",
63
+ path: "$.workflow",
64
+ registryRef: normalizedWorkflowVersion ? `${normalizedWorkflowId}@${normalizedWorkflowVersion}` : normalizedWorkflowId,
65
+ hint: "Select a published workflow version from the global workflow catalog.",
66
+ });
67
+ }
68
+ return {
69
+ kind: "workflow-versions",
70
+ options,
71
+ ...(selected ? { selectedWorkflowId: selected.id, selectedWorkflowVersion: selected.version } : {}),
72
+ diagnostics,
73
+ };
74
+ }
75
+ export function buildWorkflowVersionHistory(state, selectedWorkflowId, selectedWorkflowVersion) {
76
+ const options = [...buildProjectWorkflowVersionCatalog(state)]
77
+ .filter((option) => option.status !== "deleted")
78
+ .sort(compareWorkflowCatalogVersionRecords)
79
+ .map(workflowVersionHistoryOptionFromCatalogRecord);
80
+ const normalizedWorkflowId = selectedWorkflowId?.trim() || undefined;
81
+ const normalizedWorkflowVersion = selectedWorkflowVersion?.trim() || undefined;
82
+ const selected = normalizedWorkflowId
83
+ ? options.find((option) => option.id === normalizedWorkflowId && (!normalizedWorkflowVersion || option.version === normalizedWorkflowVersion))
84
+ : undefined;
85
+ const diagnostics = [];
86
+ if (normalizedWorkflowId && !selected) {
87
+ diagnostics.push({
88
+ code: "WorkflowCatalogError.unknownWorkflowVersion",
89
+ message: `Workflow version '${normalizedWorkflowId}${normalizedWorkflowVersion ? `@${normalizedWorkflowVersion}` : ""}' is not present in workflow version history.`,
90
+ severity: "error",
91
+ path: "$.workflow",
92
+ registryRef: normalizedWorkflowVersion ? `${normalizedWorkflowId}@${normalizedWorkflowVersion}` : normalizedWorkflowId,
93
+ hint: "Open a live, archived, or snapshot-backed workflow version record from the catalog history.",
94
+ });
95
+ }
96
+ return {
97
+ kind: "version-history",
98
+ options,
99
+ ...(selected ? { selectedWorkflowId: selected.id, selectedWorkflowVersion: selected.version } : {}),
100
+ diagnostics,
101
+ };
102
+ }
103
+ export function buildProjectWorkflowVersionOptions(state) {
104
+ return buildProjectWorkflowVersionCatalog(state)
105
+ .filter((option) => option.status === "published")
106
+ .map(workflowVersionPickerOptionFromCatalogRecord);
107
+ }
108
+ export function workflowVersionPickerOptionFromCatalogRecord(record) {
109
+ return {
110
+ ...record,
111
+ displayName: record.title,
112
+ paramsSchema: null,
113
+ };
114
+ }
115
+ function workflowVersionHistoryOptionFromCatalogRecord(record) {
116
+ const actions = workflowCatalogActionsFor(record);
117
+ return {
118
+ ...record,
119
+ actions,
120
+ editability: workflowCatalogEditability(actions),
121
+ };
122
+ }
123
+ export function buildProjectWorkflowVersionCatalog(state) {
124
+ const recordsByKey = new Map();
125
+ for (const record of STATIC_WORKFLOW_VERSION_CATALOG) {
126
+ const projected = workflowCatalogRecordWithArchiveState(record, state);
127
+ recordsByKey.set(workflowCatalogVersionKey(projected.id, projected.version), projected);
128
+ }
129
+ if (state) {
130
+ for (const record of state.workflowPublishedVersionStore.listPublishedVersions()) {
131
+ const projected = workflowCatalogRecordWithArchiveState(workflowCatalogRecordFromPublishedVersion(record), state);
132
+ recordsByKey.set(workflowCatalogVersionKey(projected.id, projected.version), projected);
133
+ }
134
+ }
135
+ return [...recordsByKey.values()];
136
+ }
137
+ function workflowCatalogRecordWithArchiveState(record, state) {
138
+ if (record.source === "ui" && state?.workflowTombstoneStore.getWorkflowTombstone(record.id))
139
+ return { ...record, status: "deleted" };
140
+ const archiveState = state?.workflowArchiveStore.getWorkflowArchiveState(record.id);
141
+ if (record.source === "ui" && archiveState?.archived)
142
+ return { ...record, status: "archived" };
143
+ return record;
144
+ }
145
+ function workflowCatalogVersionKey(workflowId, version) {
146
+ return `${workflowId}@${version}`;
147
+ }
148
+ function workflowCatalogRecordFromPublishedVersion(record) {
149
+ return {
150
+ id: record.workflowId,
151
+ version: record.version,
152
+ title: typeof record.definition.title === "string" ? record.definition.title : record.workflowId,
153
+ ...(typeof record.definition.description === "string" ? { description: record.definition.description } : {}),
154
+ source: "ui",
155
+ status: "published",
156
+ tags: workflowDefinitionTags(record.definition),
157
+ };
158
+ }
159
+ const WORKFLOW_CATALOG_STATUS_SORT_ORDER = {
160
+ published: 0,
161
+ draft: 1,
162
+ archived: 2,
163
+ deleted: 3,
164
+ };
165
+ export function compareWorkflowCatalogVersionRecords(left, right) {
166
+ return left.id.localeCompare(right.id)
167
+ || compareWorkflowCatalogVersionStrings(left.version, right.version)
168
+ || WORKFLOW_CATALOG_STATUS_SORT_ORDER[left.status] - WORKFLOW_CATALOG_STATUS_SORT_ORDER[right.status]
169
+ || left.title.localeCompare(right.title);
170
+ }
171
+ function compareWorkflowCatalogVersionStrings(left, right) {
172
+ const leftSemver = parseWorkflowSemver(left);
173
+ const rightSemver = parseWorkflowSemver(right);
174
+ if (leftSemver && rightSemver)
175
+ return compareWorkflowSemver(leftSemver, rightSemver);
176
+ if (leftSemver)
177
+ return -1;
178
+ if (rightSemver)
179
+ return 1;
180
+ return left.localeCompare(right, undefined, { numeric: true, sensitivity: "base" });
181
+ }
182
+ export function workflowDefinitionTags(definition) {
183
+ const metadata = isJsonObject(definition.metadata) ? definition.metadata : undefined;
184
+ const tags = metadata && Array.isArray(metadata.tags) ? metadata.tags : [];
185
+ return tags.filter((tag) => typeof tag === "string");
186
+ }
187
+ export function buildWorkflowCatalogList(state, context, webSession, services, options = {}) {
188
+ const includeArchived = options.includeArchived === true;
189
+ const workflows = new Map();
190
+ const buildContext = { state, context, webSession, includeArchived, services };
191
+ for (const record of STATIC_WORKFLOW_VERSION_CATALOG) {
192
+ if (record.status === "draft")
193
+ continue;
194
+ const summary = workflowCatalogVersionSummaryFromCatalogRecord(record, buildContext);
195
+ if (!isWorkflowCatalogSummaryVisible(summary, includeArchived))
196
+ continue;
197
+ addWorkflowCatalogVersion(workflows, summary);
198
+ }
199
+ for (const record of state.workflowPublishedVersionStore.listPublishedVersions()) {
200
+ const summary = workflowCatalogVersionSummaryFromPublishedVersion(record, buildContext);
201
+ if (!isWorkflowCatalogSummaryVisible(summary, includeArchived))
202
+ continue;
203
+ addWorkflowCatalogVersion(workflows, summary);
204
+ }
205
+ for (const draft of state.workflowDraftStore.listDrafts()) {
206
+ const summary = workflowCatalogVersionSummaryFromDraft(draft, state);
207
+ if (!isWorkflowCatalogSummaryVisible(summary, includeArchived))
208
+ continue;
209
+ addWorkflowCatalogVersion(workflows, summary);
210
+ const accumulator = workflows.get(draft.workflowId);
211
+ if (accumulator)
212
+ accumulator.activeDraftId = draft.draftId;
213
+ }
214
+ return {
215
+ kind: "workflow-catalog",
216
+ includeArchived,
217
+ workflows: [...workflows.values()]
218
+ .map(workflowCatalogRecordFromAccumulator)
219
+ .sort(compareWorkflowCatalogRecords),
220
+ };
221
+ }
222
+ function isWorkflowCatalogSummaryVisible(summary, includeArchived) {
223
+ if (summary.status === "deleted")
224
+ return false;
225
+ if (summary.status === "archived" && !includeArchived)
226
+ return false;
227
+ return true;
228
+ }
229
+ function addWorkflowCatalogVersion(workflows, summary) {
230
+ const existing = workflows.get(summary.id);
231
+ const accumulator = existing ?? {
232
+ id: summary.id,
233
+ title: summary.title,
234
+ ...(summary.description ? { description: summary.description } : {}),
235
+ source: summary.source,
236
+ tags: new Set(),
237
+ versions: [],
238
+ };
239
+ if (!existing)
240
+ workflows.set(summary.id, accumulator);
241
+ if (summary.source === "ui")
242
+ accumulator.source = "ui";
243
+ if (summary.status === "draft") {
244
+ accumulator.title = summary.title;
245
+ if (summary.description)
246
+ accumulator.description = summary.description;
247
+ }
248
+ for (const tag of summary.tags)
249
+ accumulator.tags.add(tag);
250
+ accumulator.versions.push(summary);
251
+ }
252
+ function workflowCatalogRecordFromAccumulator(accumulator) {
253
+ const versions = [...accumulator.versions].sort(compareWorkflowCatalogVersionRecords);
254
+ const diagnostics = uniqueWorkflowDiagnostics(versions.flatMap((version) => version.diagnostics));
255
+ const actions = uniqueWorkflowCatalogActions(versions.flatMap((version) => version.actions));
256
+ const latest = selectWorkflowCatalogDisplayVersion(versions);
257
+ return {
258
+ id: accumulator.id,
259
+ title: latest?.title ?? accumulator.title,
260
+ ...(latest?.description ?? accumulator.description ? { description: latest?.description ?? accumulator.description } : {}),
261
+ tags: [...new Set([...accumulator.tags, ...(latest?.tags ?? [])])].sort(),
262
+ source: accumulator.source,
263
+ status: deriveWorkflowCatalogStatus(versions),
264
+ versions,
265
+ ...(accumulator.activeDraftId ? { activeDraftId: accumulator.activeDraftId } : {}),
266
+ editability: workflowCatalogEditability(actions),
267
+ validationState: workflowCatalogValidationStateFromVersions(versions),
268
+ diagnostics,
269
+ missingRefs: workflowMissingRefDiagnostics(diagnostics),
270
+ actions,
271
+ };
272
+ }
273
+ export function selectWorkflowCatalogDisplayVersion(versions) {
274
+ const sorted = [...versions].sort(compareWorkflowCatalogVersionRecords);
275
+ return [...sorted].reverse().find((version) => version.status === "draft")
276
+ ?? [...sorted].reverse().find((version) => version.status === "published")
277
+ ?? sorted[0];
278
+ }
279
+ function deriveWorkflowCatalogStatus(versions) {
280
+ if (versions.some((version) => version.status === "draft"))
281
+ return "draft";
282
+ if (versions.some((version) => version.status === "published"))
283
+ return "published";
284
+ if (versions.some((version) => version.status === "archived"))
285
+ return "archived";
286
+ return versions[0]?.status ?? "deleted";
287
+ }
288
+ function workflowCatalogVersionSummaryFromCatalogRecord(record, context) {
289
+ const catalogRecord = workflowCatalogRecordWithArchiveState(record, context.state);
290
+ const definition = catalogRecord.status === "published" || catalogRecord.status === "archived"
291
+ ? createPublishedWorkflowDefinition(catalogRecord, "base")
292
+ : undefined;
293
+ const diagnostics = definition ? context.services.validateDefinition(definition, context) : [];
294
+ return {
295
+ ...catalogRecord,
296
+ ...(definition ? { definitionHash: hashWorkflowDefinitionJson(definition) } : {}),
297
+ validationState: workflowCatalogValidationStateFromDiagnostics(diagnostics, definition ? "valid" : "unknown"),
298
+ diagnostics,
299
+ missingRefs: workflowMissingRefDiagnostics(diagnostics),
300
+ actions: workflowCatalogActionsFor(catalogRecord),
301
+ };
302
+ }
303
+ function workflowCatalogVersionSummaryFromPublishedVersion(record, context) {
304
+ const catalogRecord = workflowCatalogRecordWithArchiveState(workflowCatalogRecordFromPublishedVersion(record), context.state);
305
+ const diagnostics = context.services.validateDefinition(record.definition, context);
306
+ return {
307
+ ...catalogRecord,
308
+ definitionHash: record.definitionHash,
309
+ validationState: workflowCatalogValidationStateFromDiagnostics(diagnostics, "valid"),
310
+ diagnostics,
311
+ missingRefs: workflowMissingRefDiagnostics(diagnostics),
312
+ actions: workflowCatalogActionsFor(catalogRecord),
313
+ };
314
+ }
315
+ function workflowCatalogVersionSummaryFromDraft(draft, state) {
316
+ const record = workflowCatalogRecordWithArchiveState(workflowCatalogRecordFromDraft(draft), state);
317
+ const diagnostics = sanitizeWorkflowDiagnostics(draft.diagnostics);
318
+ return {
319
+ ...record,
320
+ validationState: draft.validationState,
321
+ diagnostics,
322
+ missingRefs: workflowMissingRefDiagnostics(diagnostics),
323
+ actions: workflowCatalogActionsFor(record),
324
+ };
325
+ }
326
+ function workflowCatalogRecordFromDraft(draft) {
327
+ return {
328
+ id: draft.workflowId,
329
+ version: workflowDraftVersionLabel(draft),
330
+ title: typeof draft.definition.title === "string" ? draft.definition.title : draft.workflowId,
331
+ ...(typeof draft.definition.description === "string" ? { description: draft.definition.description } : {}),
332
+ source: "ui",
333
+ status: "draft",
334
+ tags: workflowDefinitionTags(draft.definition),
335
+ };
336
+ }
337
+ function workflowDraftVersionLabel(draft) {
338
+ if (typeof draft.definition.version === "string" && draft.definition.version.trim())
339
+ return draft.definition.version.trim();
340
+ return draft.targetWorkflowVersion ?? "draft";
341
+ }
342
+ export function workflowCatalogActionsFor(record) {
343
+ if (record.status === "draft")
344
+ return ["view", "edit_draft", "validate", "publish", "archive", "delete"];
345
+ if (record.status === "archived")
346
+ return ["view", "version_history"];
347
+ if (record.status === "deleted")
348
+ return ["view"];
349
+ const actions = ["view", "duplicate", "create_project_session", "version_history"];
350
+ if (record.source === "ui")
351
+ actions.push("create_next_draft", "archive", "delete");
352
+ return actions;
353
+ }
354
+ export function workflowCatalogEditability(actions) {
355
+ return {
356
+ canView: actions.includes("view"),
357
+ canDuplicate: actions.includes("duplicate"),
358
+ canEditDraft: actions.includes("edit_draft"),
359
+ canCreateDraft: actions.includes("create_next_draft"),
360
+ canValidate: actions.includes("validate"),
361
+ canPublish: actions.includes("publish"),
362
+ canArchive: actions.includes("archive"),
363
+ canDelete: actions.includes("delete"),
364
+ canCreateProjectSession: actions.includes("create_project_session"),
365
+ };
366
+ }
367
+ function workflowCatalogValidationStateFromDiagnostics(diagnostics, fallback = "unknown") {
368
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "error"))
369
+ return "error";
370
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "warning"))
371
+ return "warning";
372
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "info"))
373
+ return fallback === "unknown" ? "warning" : fallback;
374
+ return fallback;
375
+ }
376
+ function workflowCatalogValidationStateFromVersions(versions) {
377
+ const states = versions.map((version) => version.validationState);
378
+ if (states.includes("error"))
379
+ return "error";
380
+ if (states.includes("warning"))
381
+ return "warning";
382
+ if (states.includes("valid"))
383
+ return "valid";
384
+ return "unknown";
385
+ }
386
+ const WORKFLOW_MISSING_REF_DIAGNOSTIC_CODES = new Set([
387
+ "WorkflowGraphError.unknownAgentProfileRef",
388
+ "WorkflowGraphError.archivedAgentProfileRef",
389
+ "WorkflowGraphError.unknownHandlerRef",
390
+ "WorkflowGraphError.unknownAdapterRef",
391
+ "WorkflowGraphError.unknownGuardRef",
392
+ "WorkflowGraphError.unknownPromptBuilderRef",
393
+ "WorkflowGraphError.unknownHumanActionRef",
394
+ "WorkflowCatalogError.unknownWorkflowVersion",
395
+ ]);
396
+ export function workflowMissingRefDiagnostics(diagnostics) {
397
+ return uniqueWorkflowDiagnostics(sanitizeWorkflowDiagnostics(diagnostics).filter(isWorkflowMissingRefDiagnostic));
398
+ }
399
+ function isWorkflowMissingRefDiagnostic(diagnostic) {
400
+ return Boolean(diagnostic.registryRef && WORKFLOW_MISSING_REF_DIAGNOSTIC_CODES.has(diagnostic.code));
401
+ }
402
+ function uniqueWorkflowDiagnostics(diagnostics) {
403
+ const seen = new Set();
404
+ return diagnostics.filter((diagnostic) => {
405
+ const key = [diagnostic.code, diagnostic.path ?? "", diagnostic.nodeId ?? "", diagnostic.edgeId ?? "", diagnostic.registryRef ?? "", diagnostic.message].join("\u0000");
406
+ if (seen.has(key))
407
+ return false;
408
+ seen.add(key);
409
+ return true;
410
+ });
411
+ }
412
+ function uniqueWorkflowCatalogActions(actions) {
413
+ return [...new Set(actions)].sort();
414
+ }
415
+ function compareWorkflowCatalogRecords(left, right) {
416
+ return left.id.localeCompare(right.id);
417
+ }
418
+ export function buildWorkflowCatalogInspect(state, context, webSession, services, workflowId, options = {}) {
419
+ let selectedDraft;
420
+ if (options.draftId) {
421
+ selectedDraft = state.workflowDraftStore.getDraft(options.draftId);
422
+ if (!selectedDraft || selectedDraft.workflowId !== workflowId)
423
+ throw new PiboWebHttpError("Workflow draft not found", 404);
424
+ }
425
+ else if (!options.version) {
426
+ selectedDraft = state.workflowDraftStore.findActiveDraftByWorkflowId(workflowId);
427
+ }
428
+ if (selectedDraft)
429
+ services.runDraftValidation(state, context, webSession, selectedDraft, "draft_load");
430
+ const catalog = buildWorkflowCatalogList(state, context, webSession, services, { includeArchived: options.includeArchived });
431
+ const workflow = catalog.workflows.find((record) => record.id === workflowId);
432
+ if (!workflow)
433
+ throw new PiboWebHttpError("Workflow not found", 404);
434
+ if (selectedDraft) {
435
+ return {
436
+ kind: "workflow-inspect",
437
+ workflow,
438
+ selected: { kind: "draft", draft: services.serializeDraft(selectedDraft) },
439
+ diagnostics: sanitizeWorkflowDiagnostics(selectedDraft.diagnostics),
440
+ };
441
+ }
442
+ const version = options.version ?? selectWorkflowCatalogDisplayVersion(workflow.versions)?.version;
443
+ const published = version ? workflowPublishedVersionInspection(state, context, webSession, services, workflowId, version, options.includeArchived === true) : undefined;
444
+ if (published) {
445
+ return {
446
+ kind: "workflow-inspect",
447
+ workflow,
448
+ selected: {
449
+ kind: "publishedVersion",
450
+ version: published.version,
451
+ definition: published.definition,
452
+ validation: published.validation,
453
+ },
454
+ diagnostics: published.diagnostics,
455
+ };
456
+ }
457
+ throw new PiboWebHttpError("Workflow version not found", 404);
458
+ }
459
+ function workflowPublishedVersionInspection(state, context, webSession, services, workflowId, version, includeArchived) {
460
+ const persisted = state.workflowPublishedVersionStore.listPublishedVersions({ workflowId }).find((record) => record.version === version);
461
+ if (persisted) {
462
+ const catalogRecord = workflowCatalogRecordWithArchiveState(workflowCatalogRecordFromPublishedVersion(persisted), state);
463
+ if (catalogRecord.status === "deleted" || (catalogRecord.status === "archived" && !includeArchived))
464
+ return undefined;
465
+ const diagnostics = services.validateDefinition(persisted.definition, { state, context, webSession });
466
+ return {
467
+ version: { ...catalogRecord, definitionHash: persisted.definitionHash },
468
+ definition: persisted.definition,
469
+ validation: services.summarizeDiagnostics(diagnostics, "draft_load"),
470
+ diagnostics,
471
+ };
472
+ }
473
+ const staticRecord = STATIC_WORKFLOW_VERSION_CATALOG.find((record) => record.id === workflowId && record.version === version);
474
+ const catalogRecord = staticRecord ? workflowCatalogRecordWithArchiveState(staticRecord, state) : undefined;
475
+ if (!catalogRecord || catalogRecord.status === "draft" || catalogRecord.status === "deleted" || (catalogRecord.status === "archived" && !includeArchived))
476
+ return undefined;
477
+ const definition = createPublishedWorkflowDefinition(catalogRecord, "base");
478
+ const diagnostics = services.validateDefinition(definition, { state, context, webSession });
479
+ return {
480
+ version: { ...catalogRecord, definitionHash: hashWorkflowDefinitionJson(definition) },
481
+ definition,
482
+ validation: services.summarizeDiagnostics(diagnostics, "draft_load"),
483
+ diagnostics,
484
+ };
485
+ }
486
+ export function buildWorkflowVersionList(state, context, webSession, services, workflowId, options = {}) {
487
+ const includeArchived = options.includeArchived === true;
488
+ const catalog = buildWorkflowCatalogList(state, context, webSession, services, { includeArchived });
489
+ const workflow = catalog.workflows.find((record) => record.id === workflowId);
490
+ if (!workflow)
491
+ throw new PiboWebHttpError("Workflow not found", 404);
492
+ return {
493
+ kind: "workflow-version-list",
494
+ workflowId,
495
+ includeArchived,
496
+ workflow,
497
+ versions: workflow.versions
498
+ .filter((version) => version.status === "published" || version.status === "archived")
499
+ .sort(compareWorkflowCatalogVersionRecords),
500
+ };
501
+ }
502
+ export function buildWorkflowVersionInspect(state, context, webSession, services, workflowId, version, options = {}) {
503
+ const includeArchived = options.includeArchived === true;
504
+ const catalog = buildWorkflowCatalogList(state, context, webSession, services, { includeArchived });
505
+ const workflow = catalog.workflows.find((record) => record.id === workflowId);
506
+ if (!workflow)
507
+ throw new PiboWebHttpError("Workflow not found", 404);
508
+ const published = workflowPublishedVersionInspection(state, context, webSession, services, workflowId, version, includeArchived);
509
+ if (!published)
510
+ throw new PiboWebHttpError("Workflow version not found", 404);
511
+ const diagnostics = sanitizeWorkflowDiagnostics(published.diagnostics);
512
+ return {
513
+ kind: "workflow-version-inspect",
514
+ workflow,
515
+ version: published.version,
516
+ definition: published.definition,
517
+ validation: published.validation,
518
+ diagnostics,
519
+ missingRefs: workflowMissingRefDiagnostics(diagnostics),
520
+ };
521
+ }
522
+ export function createPublishedWorkflowDefinition(workflow, profileId) {
523
+ return createRunnableWorkflowDefinition({
524
+ workflowId: workflow.id,
525
+ version: workflow.version,
526
+ title: workflow.title,
527
+ description: workflow.description ?? `${workflow.title} workflow.`,
528
+ tags: workflow.tags,
529
+ profileId,
530
+ });
531
+ }
532
+ function createRunnableWorkflowDefinition(input) {
533
+ return {
534
+ id: input.workflowId,
535
+ version: input.version,
536
+ title: input.title,
537
+ description: input.description,
538
+ input: {
539
+ kind: "text",
540
+ description: "Workflow input provided when a Project session starts.",
541
+ },
542
+ output: {
543
+ kind: "text",
544
+ description: "Workflow output returned to the Project session.",
545
+ },
546
+ initial: "agent",
547
+ nodes: {
548
+ agent: {
549
+ kind: "agent",
550
+ runtime: "pibo",
551
+ profile: { kind: "fixed", id: input.profileId },
552
+ promptTemplate: "Use the workflow input to produce a concise answer.\n\n{{input}}",
553
+ metadata: { sessionOverrides: { prompt: true } },
554
+ ui: { position: { x: 80, y: 80 } },
555
+ },
556
+ },
557
+ edges: {},
558
+ metadata: {
559
+ tags: input.tags,
560
+ ...(input.metadata ?? {}),
561
+ },
562
+ ui: {
563
+ layout: "auto",
564
+ positions: {
565
+ agent: { x: 80, y: 80 },
566
+ },
567
+ },
568
+ };
569
+ }
570
+ function isJsonObject(value) {
571
+ return typeof value === "object" && value !== null && !Array.isArray(value);
572
+ }
@@ -0,0 +1,51 @@
1
+ import { normalizeForCanonicalJson } from "./workflow-persistence.js";
2
+ export function validateWorkflowEdgeAdapterOutputCompatibilityLike(edgeId, adapterOutput, edge, nodes, diagnostics) {
3
+ const targetPort = readEdgeTargetInputPort(edge, nodes);
4
+ if (targetPort && isJsonObject(adapterOutput) && !areWorkflowPortsDirectlyCompatible(adapterOutput, targetPort)) {
5
+ diagnostics.push({
6
+ code: "WorkflowGraphError.incompatibleEdgeAdapterOutput",
7
+ message: `Workflow edge '${edgeId}' adapter output is incompatible with the target input port.`,
8
+ severity: "error",
9
+ path: `$.edges.${edgeId}.adapter.output`,
10
+ edgeId,
11
+ hint: "Set the registered adapter output port to the target input contract; do not use hidden LLM coercion.",
12
+ });
13
+ }
14
+ }
15
+ export function validateWorkflowEdgeDirectCompatibilityLike(edgeId, edge, nodes, diagnostics) {
16
+ const sourcePort = readEdgeSourceOutputPort(edge, nodes);
17
+ const targetPort = readEdgeTargetInputPort(edge, nodes);
18
+ if (!sourcePort || !targetPort || areWorkflowPortsDirectlyCompatible(sourcePort, targetPort))
19
+ return;
20
+ diagnostics.push({
21
+ code: "WorkflowGraphError.incompatibleEdgePorts",
22
+ message: `Workflow edge '${edgeId}' connects incompatible source output and target input ports without a registered adapter.`,
23
+ severity: "error",
24
+ path: `$.edges.${edgeId}`,
25
+ edgeId,
26
+ hint: "Add a visible registered edge adapter or adapter node. Hidden LLM coercion is not allowed in V2.",
27
+ });
28
+ }
29
+ function readEdgeSourceOutputPort(edge, nodes) {
30
+ const node = readWorkflowEdgeNode(edge.from, nodes);
31
+ return node && isJsonObject(node.output) ? node.output : undefined;
32
+ }
33
+ function readEdgeTargetInputPort(edge, nodes) {
34
+ const node = readWorkflowEdgeNode(edge.to, nodes);
35
+ return node && isJsonObject(node.input) ? node.input : undefined;
36
+ }
37
+ function readWorkflowEdgeNode(endpoint, nodes) {
38
+ const nodeId = isJsonObject(endpoint) && typeof endpoint.nodeId === "string" ? endpoint.nodeId.trim() : undefined;
39
+ const node = nodeId ? nodes[nodeId] : undefined;
40
+ return isJsonObject(node) ? node : undefined;
41
+ }
42
+ function areWorkflowPortsDirectlyCompatible(left, right) {
43
+ if (left.kind === "text" && right.kind === "text")
44
+ return true;
45
+ if (left.kind !== "json" || right.kind !== "json")
46
+ return false;
47
+ return JSON.stringify(normalizeForCanonicalJson(left.schema)) === JSON.stringify(normalizeForCanonicalJson(right.schema));
48
+ }
49
+ function isJsonObject(value) {
50
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
51
+ }