@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,130 @@
1
+ export function validateWorkflowRegisteredRefParamsLike(value, paramsSchema, diagnostics, target) {
2
+ if (value === undefined)
3
+ return;
4
+ const code = target.kind === "guard" ? "WorkflowGraphError.invalidGuardParams" : "WorkflowGraphError.invalidAdapterParams";
5
+ if (!paramsSchema) {
6
+ diagnostics.push({
7
+ code: target.kind === "guard" ? "WorkflowGraphError.unexpectedGuardParams" : "WorkflowGraphError.unexpectedAdapterParams",
8
+ message: `${target.diagnosticLabel} declares params, but registry ref '${target.registryRef}' does not expose a paramsSchema.`,
9
+ severity: "error",
10
+ path: target.path,
11
+ nodeId: target.nodeId,
12
+ edgeId: target.edgeId,
13
+ registryRef: target.registryRef,
14
+ hint: "Remove params or select a registered ref whose picker metadata includes paramsSchema.",
15
+ });
16
+ return;
17
+ }
18
+ if (!isJsonObject(value)) {
19
+ diagnostics.push({
20
+ code,
21
+ message: `${target.diagnosticLabel} params for '${target.registryRef}' must be a JSON object matching the registry paramsSchema.`,
22
+ severity: "error",
23
+ path: target.path,
24
+ nodeId: target.nodeId,
25
+ edgeId: target.edgeId,
26
+ registryRef: target.registryRef,
27
+ hint: "Edit params as JSON object data only; inline handlers or arbitrary code are not allowed.",
28
+ });
29
+ return;
30
+ }
31
+ validateWorkflowParamsValueAgainstSchema(value, paramsSchema, target.path, diagnostics, target, code);
32
+ }
33
+ function validateWorkflowParamsValueAgainstSchema(value, schema, path, diagnostics, target, code) {
34
+ const typeNames = readParamsSchemaTypes(schema.type);
35
+ if (typeNames.length && !typeNames.some((typeName) => workflowParamValueMatchesType(value, typeName))) {
36
+ diagnostics.push({
37
+ code,
38
+ message: `${target.diagnosticLabel} params for '${target.registryRef}' do not match the registry paramsSchema type at '${path}'.`,
39
+ severity: "error",
40
+ path,
41
+ nodeId: target.nodeId,
42
+ edgeId: target.edgeId,
43
+ registryRef: target.registryRef,
44
+ hint: "Use the selected ref's paramsSchema from the picker when editing params.",
45
+ });
46
+ return;
47
+ }
48
+ if (isJsonObject(value)) {
49
+ const required = Array.isArray(schema.required) ? schema.required.filter((entry) => typeof entry === "string") : [];
50
+ for (const requiredKey of required) {
51
+ if (Object.hasOwn(value, requiredKey))
52
+ continue;
53
+ diagnostics.push({
54
+ code,
55
+ message: `${target.diagnosticLabel} params for '${target.registryRef}' are missing required registry paramsSchema field '${requiredKey}'.`,
56
+ severity: "error",
57
+ path: workflowParamsChildPath(path, requiredKey),
58
+ nodeId: target.nodeId,
59
+ edgeId: target.edgeId,
60
+ registryRef: target.registryRef,
61
+ hint: "Add the required params field or remove the params block.",
62
+ });
63
+ }
64
+ const properties = isJsonObject(schema.properties) ? schema.properties : {};
65
+ for (const [key, propertyValue] of Object.entries(value)) {
66
+ const propertySchema = properties[key];
67
+ if (isJsonObject(propertySchema)) {
68
+ validateWorkflowParamsValueAgainstSchema(propertyValue, propertySchema, workflowParamsChildPath(path, key), diagnostics, target, code);
69
+ }
70
+ else if (schema.additionalProperties === false) {
71
+ diagnostics.push({
72
+ code,
73
+ message: `${target.diagnosticLabel} params for '${target.registryRef}' include field '${key}', which is not allowed by the registry paramsSchema.`,
74
+ severity: "error",
75
+ path: workflowParamsChildPath(path, key),
76
+ nodeId: target.nodeId,
77
+ edgeId: target.edgeId,
78
+ registryRef: target.registryRef,
79
+ hint: "Remove fields not declared by the selected ref's paramsSchema.",
80
+ });
81
+ }
82
+ }
83
+ }
84
+ if (Array.isArray(value) && isJsonObject(schema.items)) {
85
+ value.forEach((item, index) => validateWorkflowParamsValueAgainstSchema(item, schema.items, `${path}.${index}`, diagnostics, target, code));
86
+ }
87
+ }
88
+ function readParamsSchemaTypes(value) {
89
+ if (typeof value === "string")
90
+ return [value];
91
+ if (Array.isArray(value))
92
+ return value.filter((entry) => typeof entry === "string");
93
+ return [];
94
+ }
95
+ function workflowParamValueMatchesType(value, typeName) {
96
+ if (typeName === "string")
97
+ return typeof value === "string";
98
+ if (typeName === "number")
99
+ return typeof value === "number";
100
+ if (typeName === "integer")
101
+ return typeof value === "number" && Number.isInteger(value);
102
+ if (typeName === "boolean")
103
+ return typeof value === "boolean";
104
+ if (typeName === "object")
105
+ return isJsonObject(value);
106
+ if (typeName === "array")
107
+ return Array.isArray(value);
108
+ if (typeName === "null")
109
+ return value === null;
110
+ return true;
111
+ }
112
+ function workflowParamsChildPath(path, key) {
113
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? `${path}.${key}` : `${path}[${JSON.stringify(key)}]`;
114
+ }
115
+ function isJsonValue(value) {
116
+ if (value === null
117
+ || typeof value === "string"
118
+ || typeof value === "boolean"
119
+ || (typeof value === "number" && Number.isFinite(value))) {
120
+ return true;
121
+ }
122
+ if (Array.isArray(value))
123
+ return value.every(isJsonValue);
124
+ if (value && typeof value === "object")
125
+ return Object.values(value).every(isJsonValue);
126
+ return false;
127
+ }
128
+ function isJsonObject(value) {
129
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value) && isJsonValue(value);
130
+ }
@@ -0,0 +1,179 @@
1
+ import { hashPromptAssetMarkdown, workflowPromptAssetDocumentFromRecords, } from "./workflow-persistence.js";
2
+ export const WORKFLOW_ADAPTER_REF_OPTIONS = [
3
+ {
4
+ id: "fixture.adapters.textToTopic",
5
+ displayName: "Text to topic",
6
+ description: "Registered deterministic adapter from the workflow fixtures registry.",
7
+ paramsSchema: null,
8
+ },
9
+ {
10
+ id: "fixture.adapters.draftToSummary",
11
+ displayName: "Draft to summary",
12
+ description: "Registered deterministic adapter from the workflow fixtures registry.",
13
+ paramsSchema: {
14
+ type: "object",
15
+ properties: {
16
+ format: { type: "string", description: "Presentation format for the summarized payload." },
17
+ },
18
+ required: ["format"],
19
+ additionalProperties: false,
20
+ },
21
+ },
22
+ ];
23
+ export const WORKFLOW_GUARD_REF_OPTIONS = [
24
+ {
25
+ id: "fixture.guards.approved",
26
+ displayName: "Approved",
27
+ description: "Registered guard from the workflow fixtures registry.",
28
+ paramsSchema: {
29
+ type: "object",
30
+ properties: {
31
+ expected: { type: "boolean", description: "Expected approval flag for this guarded route." },
32
+ },
33
+ required: ["expected"],
34
+ additionalProperties: false,
35
+ },
36
+ },
37
+ {
38
+ id: "fixture.guards.needsRevision",
39
+ displayName: "Needs revision",
40
+ description: "Registered guard from the workflow fixtures registry.",
41
+ paramsSchema: null,
42
+ },
43
+ ];
44
+ export const WORKFLOW_PROMPT_ASSET_REF_OPTIONS = [
45
+ {
46
+ id: "fixture.promptBuilders.draftPrompt",
47
+ displayName: "Draft prompt builder",
48
+ description: "Registered prompt asset/prompt-builder ref from the workflow fixtures registry.",
49
+ paramsSchema: null,
50
+ kind: "code",
51
+ },
52
+ ];
53
+ export const WORKFLOW_HUMAN_ACTION_REF_OPTIONS = [
54
+ {
55
+ id: "fixture.humanActions.approve",
56
+ kind: "approve",
57
+ displayName: "Approve",
58
+ description: "Registered human action for approving a pending workflow wait token.",
59
+ paramsSchema: null,
60
+ },
61
+ {
62
+ id: "fixture.humanActions.reject",
63
+ kind: "reject",
64
+ displayName: "Reject",
65
+ description: "Registered human action for rejecting a pending workflow wait token.",
66
+ paramsSchema: null,
67
+ },
68
+ {
69
+ id: "fixture.humanActions.resume",
70
+ kind: "resume",
71
+ displayName: "Resume",
72
+ description: "Registered human action for resuming a pending workflow wait token with a payload.",
73
+ paramsSchema: null,
74
+ },
75
+ {
76
+ id: "fixture.humanActions.cancel",
77
+ kind: "cancel",
78
+ displayName: "Cancel",
79
+ description: "Registered human action for cancelling a pending workflow wait token.",
80
+ paramsSchema: null,
81
+ },
82
+ ];
83
+ const WORKFLOW_STATIC_PROMPT_ASSET_MARKDOWN = {
84
+ "fixture.promptBuilders.draftPrompt": "Draft a concise response from the workflow input.\n\n{{input}}",
85
+ };
86
+ export function buildWorkflowRegisteredRefPicker(kind, optionsInput, selectedRefId) {
87
+ const options = [...optionsInput]
88
+ .sort((left, right) => left.displayName.localeCompare(right.displayName) || left.id.localeCompare(right.id));
89
+ const normalizedSelection = selectedRefId?.trim() || undefined;
90
+ const activeSelection = normalizedSelection && options.some((option) => option.id === normalizedSelection)
91
+ ? normalizedSelection
92
+ : undefined;
93
+ const diagnostics = [];
94
+ if (normalizedSelection && !activeSelection) {
95
+ diagnostics.push(workflowRegisteredRefPickerDiagnostic(kind, normalizedSelection));
96
+ }
97
+ return {
98
+ kind,
99
+ options,
100
+ ...(activeSelection ? { selectedRefId: activeSelection } : {}),
101
+ diagnostics,
102
+ };
103
+ }
104
+ export function buildWorkflowPromptAssetPicker(state, webSession, selectedRefId) {
105
+ const uiOptions = state.workflowPromptAssetStore.listAssets().map((asset) => ({
106
+ id: asset.assetId,
107
+ displayName: asset.displayName,
108
+ ...(asset.description ? { description: asset.description } : {}),
109
+ paramsSchema: null,
110
+ kind: "ui",
111
+ }));
112
+ return buildWorkflowRegisteredRefPicker("prompt-assets", [...WORKFLOW_PROMPT_ASSET_REF_OPTIONS, ...uiOptions], selectedRefId);
113
+ }
114
+ export function getWorkflowPromptAssetDocument(state, webSession, assetId) {
115
+ const staticOption = WORKFLOW_PROMPT_ASSET_REF_OPTIONS.find((option) => option.id === assetId);
116
+ if (staticOption) {
117
+ const markdown = WORKFLOW_STATIC_PROMPT_ASSET_MARKDOWN[assetId] ?? "";
118
+ const now = "code";
119
+ return {
120
+ id: staticOption.id,
121
+ displayName: staticOption.displayName,
122
+ ...(staticOption.description ? { description: staticOption.description } : {}),
123
+ source: "code",
124
+ readOnly: true,
125
+ revisionId: `code:${staticOption.id}:1`,
126
+ contentHash: hashPromptAssetMarkdown(markdown),
127
+ markdown,
128
+ createdAt: now,
129
+ updatedAt: now,
130
+ };
131
+ }
132
+ const asset = state.workflowPromptAssetStore.getAsset(assetId);
133
+ const revision = asset ? state.workflowPromptAssetStore.getActiveRevision(assetId) : undefined;
134
+ return asset && revision ? workflowPromptAssetDocumentFromRecords(asset, revision) : undefined;
135
+ }
136
+ export function isWorkflowPromptAssetRegistered(state, webSession, assetId) {
137
+ return WORKFLOW_PROMPT_ASSET_REF_OPTIONS.some((option) => option.id === assetId)
138
+ || Boolean(state.workflowPromptAssetStore.getAsset(assetId));
139
+ }
140
+ function workflowRegisteredRefPickerDiagnostic(kind, registryRef) {
141
+ if (kind === "guards") {
142
+ return {
143
+ code: "WorkflowGraphError.unknownGuardRef",
144
+ message: `Workflow edge references guard '${registryRef}', but it is not registered in the Workflow Registry.`,
145
+ severity: "error",
146
+ path: "$.edges.edge.guard.handler",
147
+ registryRef,
148
+ hint: "Select a registered guard ref before publishing or running this workflow.",
149
+ };
150
+ }
151
+ if (kind === "adapters") {
152
+ return {
153
+ code: "WorkflowGraphError.unknownAdapterRef",
154
+ message: `Workflow edge references adapter '${registryRef}', but it is not registered in the Workflow Registry.`,
155
+ severity: "error",
156
+ path: "$.edges.edge.adapter.transform.id",
157
+ registryRef,
158
+ hint: "Select a registered adapter ref before publishing or running this workflow.",
159
+ };
160
+ }
161
+ if (kind === "human-actions") {
162
+ return {
163
+ code: "WorkflowGraphError.unknownHumanActionRef",
164
+ message: `Human node references human action '${registryRef}', but it is not registered in the Workflow Registry.`,
165
+ severity: "error",
166
+ path: "$.nodes.human.actions.0.id",
167
+ registryRef,
168
+ hint: "Select a registered human action before publishing or running this workflow.",
169
+ };
170
+ }
171
+ return {
172
+ code: "WorkflowGraphError.unknownPromptBuilderRef",
173
+ message: `Agent node references prompt asset '${registryRef}', but it is not registered in the Workflow Registry.`,
174
+ severity: "error",
175
+ path: "$.nodes.agent.promptBuilder.id",
176
+ registryRef,
177
+ hint: "Select a registered prompt asset ref before publishing or running this workflow.",
178
+ };
179
+ }
@@ -0,0 +1,210 @@
1
+ import { validateWorkflowRegisteredRefParamsLike } from "./workflow-registered-ref-params.js";
2
+ import { WORKFLOW_ADAPTER_REF_OPTIONS, WORKFLOW_GUARD_REF_OPTIONS, WORKFLOW_HUMAN_ACTION_REF_OPTIONS, isWorkflowPromptAssetRegistered, } from "./workflow-registered-ref-pickers.js";
3
+ export function validateWorkflowPromptAssetRefLike(nodeId, value, input, diagnostics) {
4
+ const path = `$.nodes.${nodeId}.promptBuilder`;
5
+ const ref = readPromptAssetRef(value);
6
+ if (!ref.id) {
7
+ diagnostics.push({
8
+ code: "WorkflowGraphError.invalidPromptBuilderRef",
9
+ message: `Agent node '${nodeId}' must use a registered prompt asset ref when promptBuilder is declared.`,
10
+ severity: "error",
11
+ path,
12
+ nodeId,
13
+ hint: "Select a registered prompt asset/prompt-builder ref; V2 does not expose inline TypeScript prompt builders.",
14
+ });
15
+ return;
16
+ }
17
+ if (!ref.valid) {
18
+ diagnostics.push({
19
+ code: "WorkflowGraphError.invalidPromptBuilderRef",
20
+ message: `Agent node '${nodeId}' prompt asset ref '${ref.id}' must use a registered TypeScript promptBuilder shape.`,
21
+ severity: "error",
22
+ path,
23
+ nodeId,
24
+ registryRef: ref.id,
25
+ hint: "Use { kind: 'promptBuilder', language: 'typescript', id: '<registered id>' } or a registered prompt asset id string.",
26
+ });
27
+ return;
28
+ }
29
+ if (!isWorkflowPromptAssetRegistered(input.state, input.webSession, ref.id)) {
30
+ diagnostics.push({
31
+ code: "WorkflowGraphError.unknownPromptBuilderRef",
32
+ message: `Agent node '${nodeId}' references prompt asset '${ref.id}', but it is not registered in the Workflow Registry.`,
33
+ severity: "error",
34
+ path: isJsonObject(value) ? `${path}.id` : path,
35
+ nodeId,
36
+ registryRef: ref.id,
37
+ hint: "Select a registered prompt asset ref before publishing or running this workflow.",
38
+ });
39
+ }
40
+ }
41
+ function readPromptAssetRef(value) {
42
+ if (typeof value === "string")
43
+ return { id: value.trim() || undefined, valid: Boolean(value.trim()) };
44
+ if (!isJsonObject(value))
45
+ return { valid: false };
46
+ const id = typeof value.id === "string" ? value.id.trim() : undefined;
47
+ return {
48
+ id,
49
+ valid: value.kind === "promptBuilder" && value.language === "typescript" && Boolean(id),
50
+ };
51
+ }
52
+ export function validateRegisteredAdapterRefLike(value, diagnostics, target) {
53
+ const ref = readRegisteredAdapterRef(value);
54
+ if (!ref.id) {
55
+ diagnostics.push({
56
+ code: "WorkflowGraphError.unknownAdapterRef",
57
+ message: `${target.diagnosticLabel} must select a registered adapter ref.`,
58
+ severity: "error",
59
+ path: `${target.path}.id`,
60
+ nodeId: target.nodeId,
61
+ edgeId: target.edgeId,
62
+ hint: "Adapter refs must be selected from the registered adapter picker; the UI cannot create inline adapter code.",
63
+ });
64
+ return;
65
+ }
66
+ if (!ref.valid) {
67
+ diagnostics.push({
68
+ code: "WorkflowGraphError.invalidAdapterRef",
69
+ message: `${target.diagnosticLabel} must use a registered TypeScript adapter ref shape.`,
70
+ severity: "error",
71
+ path: target.path,
72
+ nodeId: target.nodeId,
73
+ edgeId: target.edgeId,
74
+ registryRef: ref.id,
75
+ hint: "Persist adapter refs as { kind: 'adapter', language: 'typescript', id: '<registered id>' } instead of inline or raw handlers.",
76
+ });
77
+ return;
78
+ }
79
+ const registered = WORKFLOW_ADAPTER_REF_OPTIONS.find((option) => option.id === ref.id);
80
+ if (!registered) {
81
+ diagnostics.push({
82
+ code: "WorkflowGraphError.unknownAdapterRef",
83
+ message: `${target.diagnosticLabel} references adapter '${ref.id}', but it is not registered in the Workflow Registry.`,
84
+ severity: "error",
85
+ path: `${target.path}.id`,
86
+ nodeId: target.nodeId,
87
+ edgeId: target.edgeId,
88
+ registryRef: ref.id,
89
+ hint: "Select a registered adapter ref before publishing or running this workflow.",
90
+ });
91
+ return;
92
+ }
93
+ validateWorkflowRegisteredRefParamsLike(ref.params, registered.paramsSchema, diagnostics, {
94
+ kind: "adapter",
95
+ path: `${target.path}.params`,
96
+ diagnosticLabel: target.diagnosticLabel,
97
+ registryRef: ref.id,
98
+ nodeId: target.nodeId,
99
+ edgeId: target.edgeId,
100
+ });
101
+ }
102
+ function readRegisteredAdapterRef(value) {
103
+ if (!isJsonObject(value))
104
+ return { valid: false };
105
+ const id = typeof value.id === "string" ? value.id.trim() : undefined;
106
+ return {
107
+ id,
108
+ valid: value.kind === "adapter" && value.language === "typescript" && Boolean(id),
109
+ ...(value.params !== undefined ? { params: value.params } : {}),
110
+ };
111
+ }
112
+ export function validateWorkflowGuardRefLike(edgeId, value, diagnostics) {
113
+ const path = `$.edges.${edgeId}.guard.handler`;
114
+ if (!isJsonObject(value) || typeof value.handler !== "string" || !value.handler.trim()) {
115
+ diagnostics.push({
116
+ code: "WorkflowGraphError.invalidGuardRef",
117
+ message: `Workflow edge '${edgeId}' must use a registered guard handler ref.`,
118
+ severity: "error",
119
+ path,
120
+ edgeId,
121
+ hint: "Select a registered guard ref; V2 does not expose inline guard code.",
122
+ });
123
+ return;
124
+ }
125
+ const guardId = value.handler.trim();
126
+ if (value.priority !== undefined && (typeof value.priority !== "number" || !Number.isInteger(value.priority) || value.priority < 0)) {
127
+ diagnostics.push({
128
+ code: "WorkflowGraphError.invalidGuardPriority",
129
+ message: `Workflow edge '${edgeId}' guard priority must be a non-negative integer when declared.`,
130
+ severity: "error",
131
+ path: `$.edges.${edgeId}.guard.priority`,
132
+ edgeId,
133
+ });
134
+ }
135
+ const registered = WORKFLOW_GUARD_REF_OPTIONS.find((option) => option.id === guardId);
136
+ if (!registered) {
137
+ diagnostics.push({
138
+ code: "WorkflowGraphError.unknownGuardRef",
139
+ message: `Workflow edge '${edgeId}' references guard '${guardId}', but it is not registered in the Workflow Registry.`,
140
+ severity: "error",
141
+ path,
142
+ edgeId,
143
+ registryRef: guardId,
144
+ hint: "Select a registered guard ref before publishing or running this workflow.",
145
+ });
146
+ return;
147
+ }
148
+ validateWorkflowRegisteredRefParamsLike(value.params, registered.paramsSchema, diagnostics, {
149
+ kind: "guard",
150
+ path: `$.edges.${edgeId}.guard.params`,
151
+ diagnosticLabel: `Workflow edge '${edgeId}' guard`,
152
+ registryRef: guardId,
153
+ edgeId,
154
+ });
155
+ }
156
+ export function validateWorkflowHumanActionRefsLike(nodeId, value, diagnostics) {
157
+ if (!Array.isArray(value)) {
158
+ diagnostics.push({
159
+ code: "WorkflowGraphError.invalidHumanActionRef",
160
+ message: `Human node '${nodeId}' actions must be an array of registered human action refs.`,
161
+ severity: "error",
162
+ path: `$.nodes.${nodeId}.actions`,
163
+ nodeId,
164
+ hint: "Select registered human actions such as approve/reject/resume/cancel; V2 does not create arbitrary action handlers.",
165
+ });
166
+ return;
167
+ }
168
+ value.forEach((action, index) => {
169
+ const path = `$.nodes.${nodeId}.actions.${index}`;
170
+ if (!isJsonObject(action) || typeof action.id !== "string" || !action.id.trim()) {
171
+ diagnostics.push({
172
+ code: "WorkflowGraphError.invalidHumanActionRef",
173
+ message: `Human node '${nodeId}' declares an invalid human action ref at index ${index}.`,
174
+ severity: "error",
175
+ path,
176
+ nodeId,
177
+ hint: "Human action refs must contain a non-empty registered action id.",
178
+ });
179
+ return;
180
+ }
181
+ const actionId = action.id.trim();
182
+ const registered = WORKFLOW_HUMAN_ACTION_REF_OPTIONS.find((option) => option.id === actionId);
183
+ if (!registered) {
184
+ diagnostics.push({
185
+ code: "WorkflowGraphError.unknownHumanActionRef",
186
+ message: `Human node '${nodeId}' references human action '${actionId}', but it is not registered in the Workflow Registry.`,
187
+ severity: "error",
188
+ path: `${path}.id`,
189
+ nodeId,
190
+ registryRef: actionId,
191
+ hint: "Select a registered human action before publishing or running this workflow.",
192
+ });
193
+ return;
194
+ }
195
+ if (action.kind !== undefined && action.kind !== registered.kind) {
196
+ diagnostics.push({
197
+ code: "WorkflowGraphError.humanActionKindMismatch",
198
+ message: `Human node '${nodeId}' action '${actionId}' declares kind '${action.kind}', but the registry defines kind '${registered.kind}'.`,
199
+ severity: "error",
200
+ path: `${path}.kind`,
201
+ nodeId,
202
+ registryRef: actionId,
203
+ hint: "Keep human action refs aligned with their registered action definitions.",
204
+ });
205
+ }
206
+ });
207
+ }
208
+ function isJsonObject(value) {
209
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
210
+ }
@@ -0,0 +1,93 @@
1
+ const INLINE_EXECUTABLE_FIELD_NAMES = new Set([
2
+ "code",
3
+ "script",
4
+ "command",
5
+ "eval",
6
+ "javascript",
7
+ "shell",
8
+ "typescript",
9
+ "inlinecode",
10
+ "inlinehandler",
11
+ "inlinetypescript",
12
+ "inlinejavascript",
13
+ "inlineshell",
14
+ "handlersource",
15
+ "sourcecode",
16
+ ]);
17
+ const HIDDEN_LLM_COERCION_FIELD_NAMES = new Set([
18
+ "llmcoercion",
19
+ "coercewithllm",
20
+ "hiddenllmcoercion",
21
+ "autocoerce",
22
+ "llmadapter",
23
+ ]);
24
+ const RAW_XSTATE_FIELD_NAMES = new Set([
25
+ "xstate",
26
+ "xstatemachine",
27
+ "xstatesource",
28
+ "xstatejson",
29
+ ]);
30
+ export function validateWorkflowDefinitionSecurityBoundary(definition, diagnostics) {
31
+ validateNoInlineExecutableCode(definition, "$", diagnostics, {});
32
+ validateNoHiddenLlmCoercion(definition, "$", diagnostics, {});
33
+ for (const key of Object.keys(definition)) {
34
+ if (!RAW_XSTATE_FIELD_NAMES.has(normalizeWorkflowSecurityFieldName(key)))
35
+ continue;
36
+ diagnostics.push({
37
+ code: "WorkflowSecurityError.rawXStateAuthoring",
38
+ message: `Workflow definition declares raw XState field '${key}', which is projection-only and not editable in Workflow UI Authoring V2.`,
39
+ severity: "error",
40
+ path: `$.${key}`,
41
+ hint: "Edit and publish Pibo Workflow IR only; XState is generated as a visualization/projection from workflow run records.",
42
+ });
43
+ }
44
+ }
45
+ export function validateNoInlineExecutableCode(value, path, diagnostics, target) {
46
+ for (const key of Object.keys(value)) {
47
+ if (!INLINE_EXECUTABLE_FIELD_NAMES.has(normalizeWorkflowSecurityFieldName(key)))
48
+ continue;
49
+ diagnostics.push({
50
+ code: "WorkflowSecurityError.inlineExecutableCode",
51
+ message: `${workflowDiagnosticTargetLabel(target)} declares inline executable field '${key}', which is not allowed in Workflow UI Authoring V2.`,
52
+ severity: "error",
53
+ path: `${path}.${key}`,
54
+ ...target,
55
+ hint: "Use registered handler, adapter, guard, prompt asset, or human action refs selected from V2 pickers instead of inline JavaScript, TypeScript, shell, eval, or arbitrary executable code.",
56
+ });
57
+ }
58
+ }
59
+ export function validateNoHiddenLlmCoercion(value, path, diagnostics, target) {
60
+ for (const key of Object.keys(value)) {
61
+ if (!HIDDEN_LLM_COERCION_FIELD_NAMES.has(normalizeWorkflowSecurityFieldName(key)))
62
+ continue;
63
+ diagnostics.push({
64
+ code: "WorkflowSecurityError.hiddenLlmCoercion",
65
+ message: `${workflowDiagnosticTargetLabel(target)} declares hidden LLM coercion field '${key}', which is not allowed in Workflow UI Authoring V2.`,
66
+ severity: "error",
67
+ path: `${path}.${key}`,
68
+ ...target,
69
+ hint: "Use a visible registered adapter node or edge adapter when schemas are incompatible.",
70
+ });
71
+ }
72
+ const kind = typeof value.kind === "string" ? normalizeWorkflowSecurityFieldName(value.kind) : "";
73
+ if (kind === "llm" || kind === "llmadapter" || kind === "llmcoercion") {
74
+ diagnostics.push({
75
+ code: "WorkflowSecurityError.hiddenLlmCoercion",
76
+ message: `${workflowDiagnosticTargetLabel(target)} uses LLM coercion kind '${value.kind}', which is not allowed in Workflow UI Authoring V2.`,
77
+ severity: "error",
78
+ path: `${path}.kind`,
79
+ ...target,
80
+ hint: "Use deterministic registered adapters instead of hidden LLM coercion.",
81
+ });
82
+ }
83
+ }
84
+ function workflowDiagnosticTargetLabel(target) {
85
+ if (target.nodeId)
86
+ return `Workflow node '${target.nodeId}'`;
87
+ if (target.edgeId)
88
+ return `Workflow edge '${target.edgeId}'`;
89
+ return "Workflow definition";
90
+ }
91
+ function normalizeWorkflowSecurityFieldName(value) {
92
+ return value.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
93
+ }