failproofai 1.0.12-beta.2 → 1.0.13-beta.1

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 (374) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +13 -13
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  6. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js +2 -1
  8. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  13. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js +4 -3
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
  22. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  23. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  24. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/api/audit/invite/route.js +6 -5
  26. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/audit/run/route.js +27 -26
  28. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/audit/status/route.js +4 -3
  30. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -5
  32. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +6 -5
  34. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/auth/logout/route.js +6 -5
  36. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/auth/status/route.js +6 -5
  38. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +4 -3
  40. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
  42. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  43. package/.next/standalone/.next/server/app/audit/page.js +7 -6
  44. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/index.html +1 -1
  47. package/.next/standalone/.next/server/app/index.rsc +3 -3
  48. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  49. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  50. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  51. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  52. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  53. package/.next/standalone/.next/server/app/page.js +6 -5
  54. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  57. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  58. package/.next/standalone/.next/server/app/policies/page.js +5 -4
  59. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  62. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  63. package/.next/standalone/.next/server/app/project/[name]/page.js +21 -20
  64. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  67. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  68. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  69. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +10 -9
  70. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  73. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  74. package/.next/standalone/.next/server/app/projects/page.js +7 -6
  75. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +2 -2
  78. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  79. package/.next/standalone/.next/server/app/settings/page.js +6 -5
  80. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/chunks/{[externals]__0vt9i6fqinjne._.js → [externals]__1h83uo-b1b6-2._.js} +1 -1
  83. package/.next/standalone/.next/server/chunks/[externals]__214wn4wh2x79y._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/{[externals]__1rlxpymm37wel._.js → [root-of-the-server]__031qp1lkow_kc._.js} +2 -2
  85. package/.next/standalone/.next/server/chunks/[root-of-the-server]__038kwryp970nh._.js +3 -0
  86. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_hsnj_a2mvl_._.js → [root-of-the-server]__03s1za0hn71yp._.js} +2 -2
  87. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wg9dk8x8bnau._.js → [root-of-the-server]__07a0sa6fuw5_b._.js} +2 -2
  88. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08atcie7jzswm._.js +3 -0
  89. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08dchfudh2_4f._.js +1 -1
  90. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0car70pylmvor._.js +3 -0
  91. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0spt0kv8azrpl._.js +1 -1
  92. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__12kq3x-h7t7i1._.js → [root-of-the-server]__0yvyp5b7jmlc4._.js} +2 -2
  93. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__02vous7mpi2xm._.js → [root-of-the-server]__145vo_drnuvas._.js} +2 -2
  94. package/.next/standalone/.next/server/chunks/{[externals]__0h0p9dmv_e7r7._.js → [root-of-the-server]__1a2d0ewycsp6k._.js} +2 -2
  95. package/.next/standalone/.next/server/chunks/{[externals]__1_407huhlmj1m._.js → [root-of-the-server]__1am_1tz0o0aqz._.js} +2 -2
  96. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__03i5o4a840guz._.js → [root-of-the-server]__1gxfzuvpyw30j._.js} +1 -1
  97. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1j6kfp0vzu5rw._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1l0ayum_hqqsw._.js +3 -0
  99. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1lh8c0mmhdrbj._.js +3 -0
  100. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1o9rznwc0w7og._.js +3 -0
  101. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0f_4g-vazrvxv._.js → [root-of-the-server]__1o_622x0fglpr._.js} +1 -1
  102. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1oclamblhzhrf._.js +68 -0
  103. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1v1-l-83czzsr._.js +63 -0
  104. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1a5zkndjwlc13._.js → [root-of-the-server]__1wwi53kkqhnfi._.js} +1 -1
  105. package/.next/standalone/.next/server/chunks/{_1y590mjzpkbos._.js → _02sa8fcu9_9xo._.js} +2 -2
  106. package/.next/standalone/.next/server/chunks/_0tovk6q0miud6._.js +1 -1
  107. package/.next/standalone/.next/server/chunks/_0trp3ycqv17cl._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/_1-2owkp-1_987._.js +1 -1
  109. package/.next/standalone/.next/server/chunks/_13ltj8a9z92o8._.js +1 -1
  110. package/.next/standalone/.next/server/chunks/_15k37au70vjvg._.js +1 -1
  111. package/.next/standalone/.next/server/chunks/_18rfu4__wjhwb._.js +1 -1
  112. package/.next/standalone/.next/server/chunks/_1ek68lnh2daur._.js +2 -2
  113. package/.next/standalone/.next/server/chunks/_1fz8m31sndkcu._.js +1 -1
  114. package/.next/standalone/.next/server/chunks/_1ogwigfb0163w._.js +1 -1
  115. package/.next/standalone/.next/server/chunks/_1vslkoe35wok6._.js +1 -1
  116. package/.next/standalone/.next/server/chunks/node_modules_@opentelemetry_api_build_esm_index_0oo58a7rymoxh.js +3 -0
  117. package/.next/standalone/.next/server/chunks/node_modules_@opentelemetry_api_build_esm_index_1jp9ij0_ddtgk.js +3 -0
  118. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oigsgz07._.js +2 -2
  119. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p77cu37y._.js +2 -2
  120. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4vkpxxu7._.js +1 -1
  121. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ffu2-38y03ic._.js → [root-of-the-server]__021vebe-4il8s._.js} +1 -1
  122. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__075uro8t92s0_._.js +14 -0
  123. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08ch3staq3ejw._.js +1 -1
  124. package/.next/standalone/.next/server/chunks/ssr/{[externals]__12qr51qgrrt6o._.js → [root-of-the-server]__097i34ct1o88x._.js} +2 -2
  125. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0alpzjn3450sr._.js +3 -0
  126. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0aup10z2o8zc1._.js +3 -0
  127. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bigvy9xmv2ka._.js +1 -1
  128. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bioghlkjf7s7._.js +3 -0
  129. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__01j58mdcdw0vn._.js → [root-of-the-server]__0ed1zh4scn7-k._.js} +1 -1
  130. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0naevg4bcoh54._.js → [root-of-the-server]__0evgy902m9h5e._.js} +2 -2
  131. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h86bl2qf0k_o._.js +1 -1
  132. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00l2u6j86cb8y._.js → [root-of-the-server]__0mhtkwwx1pxcq._.js} +2 -2
  133. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0nhm28v58ty9z._.js +3 -0
  134. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pia5h3p8re4c._.js +1 -1
  135. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vse4qi496ol-._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__17r4zrwanhp6r._.js → [root-of-the-server]__0yb3u36xjy3b9._.js} +1 -1
  137. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0g8b0kyorya-t._.js → [root-of-the-server]__0ywj2u6ovfm_5._.js} +1 -1
  138. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-ey9fgesfbc0._.js +1 -1
  139. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zn1d4blhd3bu._.js → [root-of-the-server]__10v5cyxvj64j4._.js} +1 -1
  140. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__15usvs-ms-0hf._.js +1 -1
  141. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16gb3_92zvk5x._.js +1 -1
  142. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__190xwrr5zrfi3._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1avi2kypusyb_._.js +1 -1
  144. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1vx7o8ukefudh._.js → [root-of-the-server]__1guwlpkyurdn9._.js} +1 -1
  145. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1k96jctukf65_._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1r7drlqli-ado._.js +1 -1
  147. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1sj-wn2jp6va5._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vofkb2oq7p7e._.js +1 -1
  149. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1s2-ck3k3rsoo._.js → [root-of-the-server]__20dt376-socef._.js} +1 -1
  150. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1lnfv02ucky7m._.js → [root-of-the-server]__2158020r_amn9._.js} +1 -1
  151. package/.next/standalone/.next/server/chunks/ssr/{_1fw0_nzkae5ao._.js → _0bc4f4quq6w47._.js} +2 -2
  152. package/.next/standalone/.next/server/chunks/ssr/_0bseae9u7g98r._.js +1 -1
  153. package/.next/standalone/.next/server/chunks/ssr/_0eoura3_9gjb-._.js +1 -1
  154. package/.next/standalone/.next/server/chunks/ssr/_0mouhaflye1ro._.js +1 -1
  155. package/.next/standalone/.next/server/chunks/ssr/_0ouu886szh6yj._.js +1 -1
  156. package/.next/standalone/.next/server/chunks/ssr/_0pedwblqdoh58._.js +1 -1
  157. package/.next/standalone/.next/server/chunks/ssr/_1_ozgifqv1ssi._.js +1 -1
  158. package/.next/standalone/.next/server/chunks/ssr/_1djqs9i27e4kg._.js +1 -1
  159. package/.next/standalone/.next/server/chunks/ssr/_20hn4gn87nsjc._.js +1 -1
  160. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo5_vm5f.js +2 -2
  161. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9snixb5fd-._.js +1 -1
  162. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47q0xq5w._.js +1 -1
  163. package/.next/standalone/.next/server/chunks/ssr/app_components_project-list_tsx_1ke6anr0vt64h._.js +1 -1
  164. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x33jqb6._.js +1 -1
  165. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpcz0uxur._.js +1 -1
  166. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h47jmhhd._.js +1 -1
  167. package/.next/standalone/.next/server/chunks/ssr/{node_modules_09s4n108bqreq._.js → node_modules_0ptcnmeaxvd_a._.js} +22 -2
  168. package/.next/standalone/.next/server/chunks/ssr/node_modules_@opentelemetry_api_build_esm_index_0ntwr8lzj6p2i.js +3 -0
  169. package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_1fv03uigni8s5.js → node_modules_html-to-image_es_index_1jwgv0pf-gy96.js} +1 -1
  170. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0bz67659f5z-3._.js +32 -0
  171. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js +3 -3
  172. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0ocrceo0c9psx._.js +32 -0
  173. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1alv566ojmz5j._.js +32 -0
  174. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1khq67j4vo9y4._.js +3 -0
  175. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_0ftnv26hg1lry._.js +3 -0
  176. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0dagmbznysrc2._.js +1 -1
  177. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuznb72p7z._.js +2 -2
  178. package/.next/standalone/.next/server/chunks/ssr/package_json_[json]_cjs_013tntikdft59._.js +1 -1
  179. package/.next/standalone/.next/server/middleware-build-manifest.js +13 -13
  180. package/.next/standalone/.next/server/middleware.js +2 -2
  181. package/.next/standalone/.next/server/pages/404.html +1 -1
  182. package/.next/standalone/.next/server/pages/500.html +1 -1
  183. package/.next/standalone/.next/server/preview-props.json +3 -3
  184. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/server-reference-manifest.json +23 -23
  186. package/.next/standalone/.next/static/chunks/0cbom4-ijx_a_.js +1 -0
  187. package/.next/standalone/.next/static/chunks/0u5weo5jdn2s8.js +1 -0
  188. package/.next/standalone/.next/static/chunks/{1c_jf6g5wnslk.js → 18-icoqze51kl.js} +1 -1
  189. package/.next/standalone/.next/static/chunks/2d-u90dt4-8rd.js +6 -0
  190. package/.next/standalone/.next/static/chunks/2n-bzb7pxe7hu.js +1 -0
  191. package/.next/standalone/.next/static/chunks/{2o6d37j425uci.js → 2zc7lg-jq353g.js} +1 -1
  192. package/.next/standalone/.next/static/chunks/{0tbm3vjm62h-2.js → 33djjf12bhcsv.js} +1 -1
  193. package/.next/standalone/.next/static/chunks/{42xptz88mtq3x.js → 38u_i3j5funpi.js} +1 -1
  194. package/.next/standalone/.next/static/chunks/{20py8k1gd_i1m.js → 3symuj7t4js-c.js} +1 -1
  195. package/.next/standalone/.next/static/chunks/{0ay__-d2h1xb5.js → 3vzut6zpdrvtx.js} +1 -1
  196. package/.next/standalone/.next/static/chunks/{063al_q720fkj.js → 3xgxl1s_in776.js} +2 -2
  197. package/.next/standalone/SECURITY.md +20 -4
  198. package/.next/standalone/fp-cloud-cli/CHANGELOG.md +34 -1
  199. package/.next/standalone/fp-cloud-cli/README.md +120 -0
  200. package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -1
  201. package/.next/standalone/fp-cloud-cli/fp_cli/app.py +15 -1
  202. package/.next/standalone/fp-cloud-cli/fp_cli/client.py +198 -7
  203. package/.next/standalone/fp-cloud-cli/fp_cli/cloud_output.py +523 -0
  204. package/.next/standalone/fp-cloud-cli/fp_cli/commands/_cloud.py +45 -0
  205. package/.next/standalone/fp-cloud-cli/fp_cli/commands/_write.py +3 -1
  206. package/.next/standalone/fp-cloud-cli/fp_cli/commands/account_cmds.py +171 -0
  207. package/.next/standalone/fp-cloud-cli/fp_cli/commands/agent_cmds.py +80 -7
  208. package/.next/standalone/fp-cloud-cli/fp_cli/commands/alerts_cmds.py +23 -0
  209. package/.next/standalone/fp-cloud-cli/fp_cli/commands/audits_cmds.py +2 -0
  210. package/.next/standalone/fp-cloud-cli/fp_cli/commands/contracts_cmds.py +67 -0
  211. package/.next/standalone/fp-cloud-cli/fp_cli/commands/dashboards_cmds.py +159 -0
  212. package/.next/standalone/fp-cloud-cli/fp_cli/commands/evaluators_cmds.py +380 -0
  213. package/.next/standalone/fp-cloud-cli/fp_cli/commands/events_cmds.py +14 -1
  214. package/.next/standalone/fp-cloud-cli/fp_cli/commands/incidents_cmds.py +82 -6
  215. package/.next/standalone/fp-cloud-cli/fp_cli/commands/list_cmds.py +4 -1
  216. package/.next/standalone/fp-cloud-cli/fp_cli/commands/orgs_cmds.py +17 -0
  217. package/.next/standalone/fp-cloud-cli/fp_cli/commands/policies_cmds.py +143 -1
  218. package/.next/standalone/fp-cloud-cli/fp_cli/commands/queries_cmds.py +70 -0
  219. package/.next/standalone/fp-cloud-cli/fp_cli/commands/sentiment_cmds.py +49 -0
  220. package/.next/standalone/fp-cloud-cli/fp_cli/commands/sessions_cmds.py +95 -1
  221. package/.next/standalone/fp-cloud-cli/fp_cli/commands/settings_cmds.py +2 -0
  222. package/.next/standalone/fp-cloud-cli/fp_cli/commands/usage_cmds.py +21 -1
  223. package/.next/standalone/fp-cloud-cli/fp_cli/commands/users_cmds.py +14 -0
  224. package/.next/standalone/fp-cloud-cli/fp_cli/errors.py +3 -0
  225. package/.next/standalone/fp-cloud-cli/fp_cli/evaluator_spec.py +266 -0
  226. package/.next/standalone/fp-cloud-cli/fp_cli/output.py +187 -81
  227. package/.next/standalone/fp-cloud-cli/fp_cli/theme.py +21 -24
  228. package/.next/standalone/fp-cloud-cli/skill/SKILL.md +124 -23
  229. package/.next/standalone/fp-cloud-cli/skill/agents/openai.yaml +2 -1
  230. package/.next/standalone/fp-cloud-cli/skill/references/commands.md +168 -16
  231. package/.next/standalone/fp-cloud-cli/tests/fake_cloud_smoke.py +312 -0
  232. package/.next/standalone/fp-cloud-cli/tests/test_cloud_account.py +125 -0
  233. package/.next/standalone/fp-cloud-cli/tests/test_cloud_agent.py +253 -0
  234. package/.next/standalone/fp-cloud-cli/tests/test_cloud_human_views.py +287 -0
  235. package/.next/standalone/fp-cloud-cli/tests/test_cloud_observability.py +116 -0
  236. package/.next/standalone/fp-cloud-cli/tests/test_cloud_transport.py +141 -0
  237. package/.next/standalone/fp-cloud-cli/tests/test_commands.py +3 -3
  238. package/.next/standalone/fp-cloud-cli/tests/test_dashboards_agent.py +3 -3
  239. package/.next/standalone/fp-cloud-cli/tests/test_evaluator_authoring.py +449 -0
  240. package/.next/standalone/fp-cloud-cli/tests/test_facets.py +1 -1
  241. package/.next/standalone/fp-cloud-cli/tests/test_help_table_coverage.py +15 -0
  242. package/.next/standalone/fp-cloud-cli/tests/test_operator.py +1 -1
  243. package/.next/standalone/fp-cloud-cli/tests/test_orgs.py +1 -1
  244. package/.next/standalone/fp-cloud-cli/tests/test_output.py +37 -37
  245. package/.next/standalone/fp-cloud-cli/tests/test_round4_behaviour.py +144 -0
  246. package/.next/standalone/fp-cloud-cli/tests/test_screen_language.py +80 -0
  247. package/.next/standalone/fp-cloud-cli/tests/test_session_reevaluate.py +33 -0
  248. package/.next/standalone/fp-cloud-cli/tests/test_staging_parity.py +198 -0
  249. package/.next/standalone/fp-cloud-cli/tests/test_whoami.py +1 -1
  250. package/.next/standalone/fp-cloud-cli/uv.lock +4 -4
  251. package/.next/standalone/hermes-plugin/plugin.yaml +1 -1
  252. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  253. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  254. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +24 -24
  255. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +26 -26
  256. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +3 -3
  257. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +13 -13
  258. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  259. package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +41 -40
  260. package/.next/standalone/node_modules/next/dist/server/app-render/async-local-storage.js +1 -1
  261. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering-validation.js +814 -0
  262. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +1 -799
  263. package/.next/standalone/node_modules/next/dist/server/base-server.js +39 -5
  264. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  265. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  266. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  267. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  268. package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +4 -43
  269. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch-symbol.js +13 -0
  270. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +3 -7
  271. package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +3 -3
  272. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +77 -12
  273. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  274. package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +12 -0
  275. package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +30 -14
  276. package/.next/standalone/node_modules/next/dist/server/next-server.js +10 -11
  277. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +29 -23
  278. package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +85 -8
  279. package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
  280. package/.next/standalone/node_modules/next/dist/server/web/adapter.js +124 -65
  281. package/.next/standalone/node_modules/next/dist/server/web/forward-trace-context.js +102 -0
  282. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  283. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  284. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  285. package/.next/standalone/node_modules/next/package.json +10 -10
  286. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  287. package/.next/standalone/node_modules/react/package.json +1 -1
  288. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  289. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  290. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +31 -27
  291. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +33 -27
  292. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +38 -30
  293. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  294. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  295. package/.next/standalone/package.json +10 -10
  296. package/.next/standalone/sdk/python/CHANGELOG.md +8 -4
  297. package/.next/standalone/sdk/python/failproofai_sdk/evaluator/source.py +2 -2
  298. package/.next/standalone/sdk/python/pyproject.toml +2 -7
  299. package/.next/standalone/sdk/python/skill/references/frameworks.md +0 -15
  300. package/.next/standalone/sdk/python/tests/test_docs.py +1 -4
  301. package/.next/standalone/sdk/python/tests/test_evaluator_source.py +1 -1
  302. package/.next/standalone/sdk/python/tests/test_packaging.py +4 -7
  303. package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +2 -13
  304. package/.next/standalone/sdk/python/uv.lock +43 -905
  305. package/.next/standalone/sdk/typescript/CHANGELOG.md +52 -0
  306. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +7 -7
  307. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +2 -2
  308. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +7 -7
  309. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +1 -1
  310. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +7 -7
  311. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +1 -1
  312. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +4 -4
  313. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +1 -1
  314. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -4
  315. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +1 -1
  316. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +3 -3
  317. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +3 -0
  318. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +4 -4
  319. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +1 -1
  320. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +25 -25
  321. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +1 -1
  322. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +34 -22
  323. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +3 -2
  324. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +10 -10
  325. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +1 -1
  326. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +1 -1
  327. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +7 -7
  328. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +1 -1
  329. package/.next/standalone/server.js +1 -1
  330. package/README.md +0 -6
  331. package/dist/cli.mjs +87 -38
  332. package/dist/worker.mjs +73 -28
  333. package/hermes-plugin/plugin.yaml +1 -1
  334. package/openclaw-plugin/daemon-client.js +254 -0
  335. package/openclaw-plugin/hooks.js +187 -0
  336. package/openclaw-plugin/index.js +17 -211
  337. package/package.json +10 -10
  338. package/scripts/sync-agent-cli-harnesses-prompt.md +26 -31
  339. package/src/hooks/agent-skill.ts +3 -0
  340. package/src/hooks/enforcement-capability.ts +1 -1
  341. package/src/hooks/fp-home.ts +1 -1
  342. package/src/hooks/handler.ts +22 -3
  343. package/src/hooks/integrations.ts +5 -2
  344. package/src/hooks/semantic/intent.ts +127 -24
  345. package/src/hooks/semantic/jev-review.ts +21 -2
  346. package/.next/standalone/.codex/hooks.json +0 -76
  347. package/.next/standalone/.cursor/hooks.json +0 -47
  348. package/.next/standalone/.factory/hooks.json +0 -112
  349. package/.next/standalone/.next/server/chunks/[externals]__1x24dzcbbq6-g._.js +0 -3
  350. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__a_je8fsn65._.js +0 -3
  351. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l-oi4gdtmlo5._.js +0 -3
  352. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9ufnv5hi2hq._.js +0 -327
  353. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1aaw59g-5uty7._.js +0 -322
  354. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hqpg6vgmfexv._.js +0 -3
  355. package/.next/standalone/.next/server/chunks/ssr/[externals]__0ilfh9mfnzsth._.js +0 -3
  356. package/.next/standalone/.next/server/chunks/ssr/[externals]__0ohnuzsaozaca._.js +0 -3
  357. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pwj2h2efe5f-._.js +0 -14
  358. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0zuikgt2xho-v._.js +0 -271
  359. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_158jo-9mwvgad._.js +0 -291
  360. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_19r82zsxo2jj1._.js +0 -291
  361. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1dupwucoqt5qm._.js +0 -3
  362. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_03w27x2kh17_8._.js +0 -23
  363. package/.next/standalone/.next/static/chunks/1my3-5p47t7r-.js +0 -1
  364. package/.next/standalone/.next/static/chunks/21hckpmsc4g70.js +0 -6
  365. package/.next/standalone/.next/static/chunks/2hmex93ppj1ke.js +0 -1
  366. package/.next/standalone/.next/static/chunks/40oworn_-x12p.js +0 -1
  367. package/.next/standalone/.opencode/opencode.json +0 -4
  368. package/.next/standalone/.opencode/plugins/failproofai.mjs +0 -210
  369. package/.next/standalone/.pi/settings.json +0 -5
  370. package/.next/standalone/node_modules/react/cjs/react.development.js +0 -1330
  371. package/scripts/dev-hook.mjs +0 -333
  372. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → 1n2dyfTQb0MDajeqlipJy}/_buildManifest.js +0 -0
  373. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → 1n2dyfTQb0MDajeqlipJy}/_clientMiddlewareManifest.js +0 -0
  374. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → 1n2dyfTQb0MDajeqlipJy}/_ssgManifest.js +0 -0
@@ -4,230 +4,36 @@
4
4
  * Loaded in-process by the gateway (registered via `plugins.load.paths` +
5
5
  * `plugins.entries.failproofai` in ~/.openclaw/openclaw.json). It subscribes to
6
6
  * OpenClaw's typed PLUGIN hooks — the only surface that can block; OpenClaw's
7
- * file-based "internal hooks" are observation-only — and forwards each to the
8
- * failproofai binary as `failproofai --hook <event> --cli openclaw`. failproofai
9
- * prints a flat `{permission, reason}` verdict on stdout; this shim maps it to
10
- * each hook's native return shape. On before_tool_call, an `instruct` verdict
11
- * uses a one-shot blockReason as OpenClaw's model-visible instruction channel;
12
- * retries from the same session/policy are allowed for a short window.
7
+ * file-based "internal hooks" are observation-only — and asks failproofaid for
8
+ * each verdict over its Unix socket (daemon-client.js), the way the Hermes
9
+ * plugin does. The daemon answers with the flat `{permission, reason}` verdict
10
+ * `failproofai --hook <event> --cli openclaw` prints; hooks.js maps it to each
11
+ * hook's native return shape. On before_tool_call, an `instruct` verdict uses a
12
+ * one-shot blockReason as OpenClaw's model-visible instruction channel; retries
13
+ * from the same session/policy are allowed for a short window.
13
14
  *
14
15
  * Marker comment for failproofai's installer detection (do not remove):
15
16
  * __failproofai_hook__: true
16
17
  *
17
- * Design notes (verified live against openclaw v2026.7.1):
18
- * • ASYNC spawn, never spawnSync — the gateway is a long-running multi-channel
19
- * process; a synchronous spawn on every hook would stall every channel.
20
- * 30s guard timer; fail-open on any error (never block on infra failure).
21
- * • Raw forwarding — we send the raw tool name / params and a Claude-shaped
22
- * stdin (params→tool_input, toolName→tool_name, transcriptPath→
23
- * transcript_path, stopHookActive→stop_hook_active, sessionKey→session_id).
24
- * The binary canonicalizes via OPENCLAW_* maps (single source of truth); the
25
- * shim ships NO inline maps (unlike the OpenCode/Pi shims).
18
+ * Design notes:
19
+ * • No process per hook, and no path outside this directory. OpenClaw ≥
20
+ * 2026.9.6 imports plugins from a copy under ~/.openclaw/tmp/plugin-captures,
21
+ * so a CLI located relative to this file is not there; the shim that spawned
22
+ * one allowed every call once that started. Every module here imports only
23
+ * node built-ins and its siblings.
24
+ * • Non-blocking — the gateway is a long-running multi-channel process, so all
25
+ * I/O is async; a synchronous call on every hook would stall every channel.
26
26
  * • No top-level `await` — OpenClaw's plugin loader rejects it; all async work
27
27
  * happens inside register()'s handlers.
28
- *
29
- * Binary resolution mirrors pi-extension/index.ts: prefer the bundled
30
- * dist/cli.mjs (node-compatible), fall back to bin/failproofai.mjs with bun for
31
- * dev; honor FAILPROOFAI_BINARY_OVERRIDE. Paths resolve relative to this file
32
- * via import.meta.url (the gateway spawns plugins with an undefined cwd).
33
28
  */
34
29
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
35
- import { spawn } from "node:child_process";
36
- import { existsSync } from "node:fs";
37
- import { resolve, dirname } from "node:path";
38
- import { fileURLToPath } from "node:url";
39
- import { createInstructRetryGate, mapBeforeToolVerdict } from "./instruct-retry-gate.js";
40
- import { createWorkspaceContext } from "./workspace-context.js";
41
-
42
- const HERE = dirname(fileURLToPath(import.meta.url));
43
- const DIST_BIN = resolve(HERE, "..", "dist", "cli.mjs");
44
- const SRC_BIN = resolve(HERE, "..", "bin", "failproofai.mjs");
45
- const instructRetryGate = createInstructRetryGate();
46
- const workspaceContext = createWorkspaceContext();
47
-
48
- function resolveSpawn() {
49
- if (process.env.FAILPROOFAI_BINARY_OVERRIDE) {
50
- return { cmd: "node", args: [process.env.FAILPROOFAI_BINARY_OVERRIDE] };
51
- }
52
- if (existsSync(DIST_BIN)) {
53
- return { cmd: "node", args: [DIST_BIN] };
54
- }
55
- return { cmd: "bun", args: [SRC_BIN] };
56
- }
57
-
58
- function debug(msg) {
59
- if (process.env.FAILPROOFAI_OPENCLAW_DEBUG === "1") {
60
- process.stderr.write(`[failproofai-openclaw-shim] ${msg}\n`);
61
- }
62
- }
63
-
64
- /**
65
- * Spawn `failproofai --hook <rawEvent> --cli openclaw`, write the JSON payload
66
- * to stdin, and resolve the parsed flat `{permission, reason}` verdict. Async +
67
- * fail-open: any spawn/parse error or timeout resolves to `{permission:"allow"}`
68
- * so a failproofai fault never blocks the gateway.
69
- */
70
- function callPolicy(rawEvent, payload) {
71
- return new Promise((done) => {
72
- const { cmd, args } = resolveSpawn();
73
- let child;
74
- try {
75
- child = spawn(cmd, [...args, "--hook", rawEvent, "--cli", "openclaw"], {
76
- stdio: ["pipe", "pipe", "pipe"],
77
- });
78
- } catch (err) {
79
- debug(`spawn threw: ${err && err.message ? err.message : String(err)}`);
80
- done({ permission: "allow" });
81
- return;
82
- }
83
- let out = "";
84
- let settled = false;
85
- const finish = (verdict) => {
86
- if (settled) return;
87
- settled = true;
88
- clearTimeout(timer);
89
- done(verdict);
90
- };
91
- const timer = setTimeout(() => {
92
- debug(`timeout on ${rawEvent}; killing child`);
93
- try { child.kill(); } catch { /* ignore */ }
94
- finish({ permission: "allow" });
95
- }, 30_000);
96
- child.stdout.on("data", (d) => { out += d; });
97
- child.on("error", (err) => {
98
- debug(`child error: ${err && err.message ? err.message : String(err)}`);
99
- finish({ permission: "allow" });
100
- });
101
- child.on("close", () => {
102
- const stdout = out.trim();
103
- if (!stdout) { finish({ permission: "allow" }); return; }
104
- try {
105
- finish(JSON.parse(stdout));
106
- } catch (err) {
107
- debug(`parse error: ${err && err.message ? err.message : String(err)}`);
108
- finish({ permission: "allow" });
109
- }
110
- });
111
- try {
112
- child.stdin.end(JSON.stringify(payload));
113
- } catch (err) {
114
- debug(`stdin write failed: ${err && err.message ? err.message : String(err)}`);
115
- finish({ permission: "allow" });
116
- }
117
- });
118
- }
119
-
120
- /** Claude-shaped stdin base. Extra keys are ignored by the binary's payload
121
- * parser; they're forwarded for future use / activity attribution. */
122
- function baseMeta(payload, ctx, config) {
123
- const p = payload || {};
124
- const c = ctx || {};
125
- return {
126
- session_id: c.sessionId ?? p.sessionId ?? c.sessionKey ?? p.sessionKey,
127
- cwd: workspaceContext.resolveWorkspace(p, c, config) ?? process.cwd(),
128
- transcript_path: p.transcriptPath,
129
- stop_hook_active: p.stopHookActive === true,
130
- openclaw: {
131
- agentId: c.agentId,
132
- sessionKey: c.sessionKey ?? p.sessionKey,
133
- runId: c.runId ?? p.runId,
134
- provider: p.provider,
135
- model: p.model,
136
- },
137
- };
138
- }
30
+ import { registerFailproofaiHooks } from "./hooks.js";
139
31
 
140
32
  export default definePluginEntry({
141
33
  id: "failproofai",
142
34
  name: "failproofai",
143
35
  description: "Real-time policy enforcement for OpenClaw by failproofai",
144
36
  register(api) {
145
- // before_tool_call → PreToolUse. Deny always blocks. Instruct blocks the
146
- // first matching attempt only, using blockReason to give the model the
147
- // instruction, then permits retries from that session/policy for 5 minutes.
148
- api.on(
149
- "before_tool_call",
150
- async (payload, ctx) => {
151
- const p = payload || {};
152
- const verdict = await callPolicy("before_tool_call", {
153
- ...baseMeta(payload, ctx, api.config),
154
- tool_name: p.toolName,
155
- tool_input: p.params,
156
- hook_event_name: "before_tool_call",
157
- });
158
- return mapBeforeToolVerdict(verdict, payload, ctx, instructRetryGate);
159
- },
160
- { priority: 100, timeoutMs: 60_000 },
161
- );
162
-
163
- // before_agent_run → UserPromptSubmit. Deny: return {outcome:"block", reason}.
164
- api.on(
165
- "before_agent_run",
166
- async (payload, ctx) => {
167
- const p = payload || {};
168
- workspaceContext.remember(payload, ctx);
169
- const verdict = await callPolicy("before_agent_run", {
170
- ...baseMeta(payload, ctx, api.config),
171
- prompt: p.prompt,
172
- hook_event_name: "before_agent_run",
173
- });
174
- if (verdict.permission === "deny") {
175
- return { outcome: "block", reason: verdict.reason || "Blocked by failproofai" };
176
- }
177
- return undefined;
178
- },
179
- { priority: 100, timeoutMs: 60_000 },
180
- );
181
-
182
- // before_agent_finalize → Stop. The real turn-end gate: a deny becomes a
183
- // revise so the agent runs another pass. The evaluator supplies the
184
- // MANDATORY ACTION wording; the payload's stop_hook_active guards the
185
- // require-*-before-stop builtins against infinite loops.
186
- api.on(
187
- "before_agent_finalize",
188
- async (payload, ctx) => {
189
- const verdict = await callPolicy("before_agent_finalize", {
190
- ...baseMeta(payload, ctx, api.config),
191
- hook_event_name: "before_agent_finalize",
192
- });
193
- if (verdict.permission === "deny") {
194
- return { action: "revise", reason: verdict.reason || "Action required by failproofai" };
195
- }
196
- return undefined;
197
- },
198
- { priority: 100, timeoutMs: 60_000 },
199
- );
200
-
201
- // Observation hooks — await so activity ordering is stable, ignore verdict.
202
- // after_tool_call → PostToolUse; session_start/end → SessionStart/End;
203
- // subagent_ended → SubagentStop (obs only); before_compaction → PreCompact.
204
- for (const ev of [
205
- "after_tool_call",
206
- "session_start",
207
- "session_end",
208
- "subagent_ended",
209
- "before_compaction",
210
- ]) {
211
- api.on(
212
- ev,
213
- async (payload, ctx) => {
214
- const p = payload || {};
215
- await callPolicy(ev, {
216
- ...baseMeta(payload, ctx, api.config),
217
- tool_name: p.toolName,
218
- tool_input: p.params,
219
- tool_response: p.result,
220
- reason: p.reason,
221
- hook_event_name: ev,
222
- });
223
- if (ev === "session_end") {
224
- instructRetryGate.clear(payload, ctx);
225
- workspaceContext.clear(payload, ctx);
226
- }
227
- return undefined;
228
- },
229
- { priority: 100, timeoutMs: 60_000 },
230
- );
231
- }
37
+ registerFailproofaiHooks(api);
232
38
  },
233
39
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "failproofai",
3
- "version": "1.0.12-beta.2",
3
+ "version": "1.0.13-beta.1",
4
4
  "description": "Observability and enforcement for AI agent harnesses. 40 built-in policies hooked into 12 of them — Claude Code, Codex, Cursor, Hermes, OpenClaw and more — blocking the tool call before it runs. Local dashboard included, no account needed.",
5
5
  "bin": {
6
6
  "failproofai": "./dist/cli.mjs",
@@ -81,7 +81,7 @@
81
81
  "access": "public"
82
82
  },
83
83
  "devDependencies": {
84
- "@anthropic-ai/sdk": "^0.135.0",
84
+ "@anthropic-ai/sdk": "^1.3.0",
85
85
  "@mdx-js/mdx": "^3.1.1",
86
86
  "@tailwindcss/postcss": "^4.3.1",
87
87
  "@tanstack/react-virtual": "^3.14.10",
@@ -126,15 +126,15 @@
126
126
  "browserslist": "4.28.8"
127
127
  },
128
128
  "optionalDependencies": {
129
- "@failproofai/failproofaid-linux-x64": "1.0.12-beta.2",
130
- "@failproofai/failproofaid-linux-arm64": "1.0.12-beta.2",
131
- "@failproofai/failproofaid-darwin-x64": "1.0.12-beta.2",
132
- "@failproofai/failproofaid-darwin-arm64": "1.0.12-beta.2"
129
+ "@failproofai/failproofaid-linux-x64": "1.0.13-beta.1",
130
+ "@failproofai/failproofaid-linux-arm64": "1.0.13-beta.1",
131
+ "@failproofai/failproofaid-darwin-x64": "1.0.13-beta.1",
132
+ "@failproofai/failproofaid-darwin-arm64": "1.0.13-beta.1"
133
133
  },
134
134
  "failproofaidBinaries": {
135
- "linux-x64": "4c09117fdb80d87792d1d2b77d9359cdbd0c522b5a6222ab7b927659130ddf54",
136
- "linux-arm64": "dd390d76561267fc519ceb96fb90be340044e2f564bef36a44e284f227d93f29",
137
- "darwin-x64": "62381f7ffe21d02289c36c4b205166b2867dbde986444d1ea185241b94fd04ef",
138
- "darwin-arm64": "9ad798817d3048a5126e80dc71883538d37c1b6b6443e9c19389dc2583c8f675"
135
+ "linux-x64": "d257e616d9f5a7ab76ceabbc7ac918e29555034458468697929fb6d109e35f3f",
136
+ "linux-arm64": "583d8e0c5cdae34bb0b2083fd1c8448d06a927ad4ca9ee6978127b54eecb27a0",
137
+ "darwin-x64": "68943a0b03c021f693f3c5f57acfc66d096bfd8bc7be57abff9ef826508de11a",
138
+ "darwin-arm64": "49fa29ad396b85dccac135cf44ceaeb83efd3934471d86160f75b081fae04eae"
139
139
  }
140
140
  }
@@ -13,11 +13,11 @@ pull request with the fix — or, if a sync PR is already open, comment on it in
13
13
  finish the work.
14
14
  - The entrypoint has **already cut a fresh branch** named `auto/sync-cli-harnesses-<UTC>`.
15
15
  Do all your work here; do **not** switch branches or work on `main`.
16
- - failproofai's own Stop hooks are active in this checkout. If you make commits, you
17
- will not be allowed to stop until you have **committed**, **pushed**, and **opened a
18
- PR** for them. If you make **no** commits (nothing to sync, or you only commented on
19
- an already-open sync PR), a clean working tree stops fine — so on those paths, do
20
- **not** edit any files.
16
+ - **You publish your own work.** If you edit files, you must **commit**, **push**, and
17
+ **open a PR** for them (Phase 3) before you stop — no hook does it for you, and the
18
+ entrypoint fails the run if you leave uncommitted changes. If you make **no**
19
+ commits (nothing to sync, or you only commented on an already-open sync PR), do
20
+ **not** edit any files, so the working tree stays clean.
21
21
  - Use ultracode / multi-agent orchestration: in Phase 1, fan out **one subagent per
22
22
  CLI** so the seven harnesses are checked in parallel.
23
23
 
@@ -48,23 +48,17 @@ For each verified CLI, compare the upstream docs to this repo across three scope
48
48
  `src/hooks/integrations.ts` (matcher-wrapper vs flat-array vs packages-array vs
49
49
  plugin registration; field names like `command` vs `bash`/`powershell`;
50
50
  `timeout` vs `timeoutSec` and its **unit** seconds-vs-ms; presence of `version`
51
- / `$schema` / `matcher`; the settings-file path) **and** the committed dogfood
52
- fixture on disk. The canonical worked example is git history / PR #482, which
53
- dropped an invalid top-level `version` field and fixed a `60000`ms→`60`s timeout
54
- unit in `.codex/hooks.json` by editing the writer, the fixture, and the tests
55
- together.
51
+ / `$schema` / `matcher`; the settings-file path). The canonical worked example is
52
+ git history / PR #482, which dropped an invalid top-level `version` field and
53
+ fixed a `60000`ms→`60`s timeout unit in the `.codex/hooks.json` writer by editing
54
+ the writer and the tests together.
56
55
 
57
56
  ## Reading rules
58
57
 
59
- - This run relaxed two policies (`require-ci-green-before-stop`,
60
- `block-read-outside-cwd`) so you can read and edit the settings fixtures. Even so,
61
- when you only need to **inspect** a committed fixture, prefer
62
- `git show HEAD:<path>` (e.g. `git show HEAD:.codex/hooks.json`) — it is never
63
- blocked and is the reliable way to read `.claude/settings.json`, `.codex/hooks.json`,
64
- `.cursor/hooks.json`, `.github/hooks/failproofai.json`,
65
- `.pi/settings.json`, and `.opencode/*`.
66
- - Do **NOT** run `failproofai policies --install` (or any `failproofai` subcommand)
67
- to regenerate a fixture — it is blocked. Edit fixtures by hand.
58
+ - Do **NOT** run `failproofai policies --install` (or any `failproofai` subcommand):
59
+ it would write hook configs into this clone, and those must never land in the PR.
60
+ The settings-file shape lives in the writer in `src/hooks/integrations.ts` and its
61
+ tests — read and edit those.
68
62
 
69
63
  ## Phase 1 — Fan out one subagent per CLI
70
64
 
@@ -80,7 +74,7 @@ Spawn one subagent per CLI (seven, in parallel). Each subagent, for its CLI:
80
74
  2. Compare against this repo: the CLI's `*HOOK_EVENT_TYPES` array + paired
81
75
  `*EVENT_MAP` (scope 1); its `*_TOOL_MAP` / `*_TOOL_INPUT_MAP` and its branch in
82
76
  `src/hooks/policy-evaluator.ts` (scope 2); its literals in
83
- `src/hooks/integrations.ts` + its dogfood fixture read via `git show` (scope 3).
77
+ `src/hooks/integrations.ts` (scope 3).
84
78
  3. Return a structured report: `{ cli, status: up-to-date | drift | unverified,
85
79
  scope1: {added, removed}, scope2: {...}, scope3: {...}, sources: [...] }`.
86
80
 
@@ -102,7 +96,7 @@ surface is documented in the package source, not a clean enumeration).
102
96
 
103
97
  Merge the subagent reports into one list of detected drift. Then, **before you edit a
104
98
  single file**, decide which path you are on — editing first would leave uncommitted
105
- changes that block a clean stop on the comment / no-op paths below.
99
+ changes behind on the comment / no-op paths below, which fails the run.
106
100
 
107
101
  1. **No drift in any verified CLI** → do nothing: make no edits, open no PR, post no
108
102
  comment. Stop. (`unverified` alone is not drift — the docs may just be unreachable
@@ -124,7 +118,7 @@ changes that block a clean stop on the comment / no-op paths below.
124
118
  > (hook-sync bot — please fold these into this PR rather than opening a second sync PR.)
125
119
 
126
120
  Never push commits to another PR's branch; only comment, and leave the working
127
- tree clean so this run stops cleanly.
121
+ tree clean.
128
122
 
129
123
  - **If no open sync PR exists → go to Phase 3** to apply the fixes and open one.
130
124
 
@@ -155,7 +149,7 @@ requires.
155
149
  an invalid field to remove, a wrong timeout unit, or a renamed tool id (the PR
156
150
  #482 class). When you do, move the whole quartet together, exactly like #482:
157
151
  the writer in `src/hooks/integrations.ts` (+ a shared helper if it dedupes
158
- logic), the committed dogfood fixture, the unit test in
152
+ logic), the unit test in
159
153
  `__tests__/hooks/integrations.test.ts`, and the e2e test in
160
154
  `__tests__/e2e/hooks/<cli>-integration.e2e.test.ts` — plus a `types.ts` comment
161
155
  if it documents the old shape.
@@ -176,11 +170,14 @@ version's section. There is no `## Unreleased` section. Use the `### Features` (
176
170
  ### Commit, push, open the PR
177
171
  1. Stage only the files you intentionally edited (never `git add -A`):
178
172
  `src/hooks/types.ts`, `src/hooks/integrations.ts`, `src/hooks/policy-evaluator.ts`,
179
- the touched `__tests__/...` files, the touched dogfood fixtures, and
180
- `CHANGELOG.md` — whichever actually changed.
173
+ the touched `__tests__/...` files, and `CHANGELOG.md` — whichever actually
174
+ changed.
181
175
  2. Commit (e.g. `feat: sync agent CLI harnesses with upstream docs`), then
182
176
  `git push -u origin "$(git branch --show-current)"`.
183
177
  3. `gh pr create --base main --title "[auto] sync agent CLI harnesses with upstream docs" --body "<body>"`.
178
+ 4. Confirm before you stop: `git status --porcelain` is empty, the branch is pushed,
179
+ and `gh pr list --head "$(git branch --show-current)"` shows the PR. If any of
180
+ these fails, fix it — nothing else will.
184
181
 
185
182
  The PR **body** must contain, in order:
186
183
 
@@ -205,12 +202,10 @@ The PR **body** must contain, in order:
205
202
  - **Only edit** these paths, and only where drift requires it: `src/hooks/types.ts`,
206
203
  `src/hooks/integrations.ts`, `src/hooks/policy-evaluator.ts`,
207
204
  `__tests__/hooks/manager.test.ts`, `__tests__/hooks/integrations.test.ts`,
208
- `__tests__/e2e/hooks/<cli>-integration.e2e.test.ts`, the seven dogfood fixtures
209
- (`.claude/settings.json`, `.codex/hooks.json`, `.cursor/hooks.json`,
210
- `.github/hooks/failproofai.json`, `.opencode/opencode.json`,
211
- `.opencode/plugins/failproofai.mjs`, `.pi/settings.json`),
212
- and `CHANGELOG.md`.
213
- - Do **NOT** edit `.failproofai/policies-config.json` (the entrypoint manages it),
205
+ `__tests__/e2e/hooks/<cli>-integration.e2e.test.ts`, and `CHANGELOG.md`.
206
+ - Do **NOT** create hook configs in this clone (`.claude/settings.json`,
207
+ `.codex/hooks.json`, `.cursor/hooks.json`, `.github/hooks/`, `.opencode/`,
208
+ `.pi/settings.json`, `.failproofai/`), and do **NOT** edit
214
209
  `src/hooks/handler.ts`, `src/hooks/manager.ts`, or any other source file.
215
210
  - Do **NOT** add entries to any `*EVENT_MAP`, `*_TOOL_MAP`, or `*_TOOL_INPUT_MAP`
216
211
  for newly-added items. Removing a key when its array entry is removed IS allowed
@@ -65,6 +65,9 @@ For focused work, read the matching skill too. Each has the same layout, with it
65
65
  - FailproofAI Cloud and the \`fp\` CLI: ${SKILLS_RAW}/fp-cloud-cli/SKILL.md
66
66
  - Adding the SDK to an agent, or running an evaluator: ${SKILLS_RAW}/failproofai-sdk/SKILL.md
67
67
  - Planning evaluations: ${SKILLS_RAW}/failproofai-eval-brainstorm/SKILL.md
68
+ - Writing an evaluation: ${SKILLS_RAW}/failproofai-eval-author/SKILL.md
69
+ - Writing an alert: ${SKILLS_RAW}/failproofai-alert-author/SKILL.md
70
+ - Writing an audit: ${SKILLS_RAW}/failproofai-audit-author/SKILL.md
68
71
  `;
69
72
 
70
73
  /** An agent's own override for where it keeps its files, else the default. */
@@ -182,7 +182,7 @@ export const ENFORCEMENT_CAPABILITY: Record<
182
182
 
183
183
  // ── openclaw ──────────────────────────────────────────────────────────────
184
184
  // openclaw/openclaw @f8ed8ecf (v2026.7.2) + our own shipped shim
185
- // openclaw-plugin/index.js, which returns undefined for 5 of the 8 hooks.
185
+ // openclaw-plugin/hooks.js, which returns undefined for 5 of the 8 hooks.
186
186
  openclaw: {
187
187
  PreToolUse: "block", // before_tool_call -> shim returns {block:true, blockReason}
188
188
  UserPromptSubmit: "block", // before_agent_run -> shim returns {outcome:"block", reason}
@@ -410,7 +410,7 @@ export const collectorHealthFile = (home?: string) => resolve(stateDir(home), "c
410
410
  /** Per-session enforcement pauses, keyed by a hash of the session id. */
411
411
  export const sessionPauseDir = () => resolve(stateDir(), "sessions");
412
412
  /**
413
- * The semantic (Jev) evaluator's local state: `sessions/<id>.json` holds the
413
+ * The semantic (Jev) evaluator's local state: `sessions/<profile>/<id>.json` holds the
414
414
  * human prompts recorded at `UserPromptSubmit`, and `verdicts.jsonl` one row
415
415
  * per semantic evaluation. Written only when a Jev config (BYOK) is present.
416
416
  */
@@ -505,6 +505,8 @@ async function startTwoTier(
505
505
  permissionMode: session.permissionMode,
506
506
  sessionId: session.sessionId,
507
507
  cli,
508
+ // The profile the intent store is read under: the one capture used.
509
+ agent,
508
510
  ...(loaded.cloud ? { cloud: loaded.cloud } : {}),
509
511
  // Cloud's checks are still asked; the installed packs' are not.
510
512
  ...(activePause ? { localPaused: true } : {}),
@@ -571,6 +573,15 @@ function jevTelemetry(activity: JevActivityFields | undefined): Record<string, u
571
573
  * marks that tell a human's prompt from a subagent's or an extension's are
572
574
  * elsewhere in it. `prompt` is §7's original field, still read by the
573
575
  * contract stub; T4's implementation reads `payload` and ignores it.
576
+ *
577
+ * The prompt is stored under the agent profile (`agent`, the runtime identity
578
+ * Cloud's targeting matches on) and read back by `startTwoTier` under the same
579
+ * one, so a prompt typed into one profile is never another's stated intent.
580
+ * Under a Cloud mode, a profile the deployment assigns no Cloud Jev check to,
581
+ * with no installed pack's check to review it either, has nothing that will
582
+ * ever read the prompt (`startTwoTier` returns before Jev for it), so nothing
583
+ * is kept: FailproofAI does not hold prompt text from a profile the
584
+ * deployment did not target.
574
585
  */
575
586
  async function captureJevIntent(
576
587
  canonicalEventType: string,
@@ -579,13 +590,20 @@ async function captureJevIntent(
579
590
  session: SessionMetadata,
580
591
  cli: IntegrationType,
581
592
  opts: EvaluateHookEventOptions | undefined,
593
+ agent: AgentIdentity | null,
582
594
  ): Promise<void> {
583
595
  if (canonicalEventType !== "UserPromptSubmit" || jevForcedOff(opts)) return;
584
596
  try {
585
597
  // Same gate as `startTwoTier`: a Cloud mode that asks needs what the human
586
598
  // typed whatever the installed packs declare.
587
- if (!cloudJevAsks(readCloudJevMode()) && !jevChecksInstalled()) return;
588
- if (!(await readJevConfig())) return;
599
+ const cloudAsks = cloudJevAsks(readCloudJevMode());
600
+ if (!cloudAsks && !jevChecksInstalled()) return;
601
+ // ...but not for a profile no Cloud Jev check targets and no installed
602
+ // pack's check reviews: `startTwoTier`'s own skip, without the pause
603
+ // (a pause can end while the session goes on). An older deployment with
604
+ // no assignment list (`null`) captures as before.
605
+ if (cloudAsks && cloudJevAssignmentsFor(agent)?.length === 0 && !packJevChecksInstalled()) return;
606
+ if (!(await readJevConfig(agent))) return;
589
607
  if (decision === "deny") {
590
608
  const { ENFORCEMENT_CAPABILITY } = await import("./enforcement-capability");
591
609
  if (ENFORCEMENT_CAPABILITY[cli]?.UserPromptSubmit === "block") return;
@@ -599,6 +617,7 @@ async function captureJevIntent(
599
617
  cli,
600
618
  payload: parsed,
601
619
  prompt: parsed.prompt,
620
+ profile: { cli, agent },
602
621
  };
603
622
  captureIntent(event);
604
623
  } catch (err) {
@@ -1180,7 +1199,7 @@ export async function evaluateHookEvent(
1180
1199
  const durationMs = Math.round(performance.now() - startTime);
1181
1200
  hookLogInfo(`result=${result.decision} policy=${result.policyName ?? "none"} duration=${durationMs}ms`);
1182
1201
 
1183
- await captureJevIntent(canonicalEventType, result.decision, parsed, session, cli, opts);
1202
+ await captureJevIntent(canonicalEventType, result.decision, parsed, session, cli, opts, runtimeAgent);
1184
1203
 
1185
1204
  // Which policies actually ran for this event, regardless of how they
1186
1205
  // decided. `result.policyName` names only the decider — null on a plain
@@ -2277,8 +2277,10 @@ export function unhookedHermesProfiles(): string[] {
2277
2277
  // OpenClaw is a self-hosted assistant gateway. Enforcement is via its in-process
2278
2278
  // PLUGIN hooks (file-based "internal hooks" are observation-only), so failproofai
2279
2279
  // ships a static plugin package (`openclaw-plugin/`, like Pi's pi-extension) that
2280
- // async-spawns the binary and maps verdicts back. Install registers the plugin in
2281
- // every profile's `openclaw.json` (JSON):
2280
+ // asks failproofaid for each verdict over its Unix socket — like the Hermes plugin,
2281
+ // and so likewise daemon-only — and maps verdicts back. It cannot spawn the CLI:
2282
+ // OpenClaw ≥ 2026.9.6 loads plugins from a copy that holds only the plugin dir.
2283
+ // Install registers the plugin in every profile's `openclaw.json` (JSON):
2282
2284
  // • plugins.load.paths[] → the shipped openclaw-plugin dir (absolute path)
2283
2285
  // • plugins.entries.failproofai = { enabled: true, hooks: { allowConversationAccess: true } }
2284
2286
  // (allowConversationAccess is required for the raw-conversation hooks
@@ -2318,6 +2320,7 @@ function isFailproofaiOpenClawPath(p: unknown): boolean {
2318
2320
  export const openclaw: Integration = {
2319
2321
  id: "openclaw",
2320
2322
  displayName: "OpenClaw",
2323
+ requiresHealthyDaemon: true,
2321
2324
  scopes: OPENCLAW_HOOK_SCOPES,
2322
2325
  eventTypes: OPENCLAW_HOOK_EVENT_TYPES,
2323
2326