failproofai 1.0.12 → 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 (306) 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 +4 -4
  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]__167mipqmjprq5._.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/{_1d98fyfrcaqhy._.js → _0bc4f4quq6w47._.js} +2 -2
  152. package/.next/standalone/.next/server/chunks/ssr/_0eoura3_9gjb-._.js +1 -1
  153. package/.next/standalone/.next/server/chunks/ssr/_0ouu886szh6yj._.js +1 -1
  154. package/.next/standalone/.next/server/chunks/ssr/_0pedwblqdoh58._.js +1 -1
  155. package/.next/standalone/.next/server/chunks/ssr/_1_ozgifqv1ssi._.js +1 -1
  156. package/.next/standalone/.next/server/chunks/ssr/_1djqs9i27e4kg._.js +1 -1
  157. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo5_vm5f.js +2 -2
  158. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9snixb5fd-._.js +1 -1
  159. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47q0xq5w._.js +1 -1
  160. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x33jqb6._.js +1 -1
  161. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpcz0uxur._.js +1 -1
  162. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h47jmhhd._.js +1 -1
  163. package/.next/standalone/.next/server/chunks/ssr/{node_modules_09s4n108bqreq._.js → node_modules_0ptcnmeaxvd_a._.js} +22 -2
  164. package/.next/standalone/.next/server/chunks/ssr/node_modules_@opentelemetry_api_build_esm_index_0ntwr8lzj6p2i.js +3 -0
  165. package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_0tqc05n832v7a.js → node_modules_html-to-image_es_index_1jwgv0pf-gy96.js} +1 -1
  166. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0bz67659f5z-3._.js +32 -0
  167. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js +3 -3
  168. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0ocrceo0c9psx._.js +32 -0
  169. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1alv566ojmz5j._.js +32 -0
  170. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1khq67j4vo9y4._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_0ftnv26hg1lry._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0dagmbznysrc2._.js +1 -1
  173. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuznb72p7z._.js +2 -2
  174. package/.next/standalone/.next/server/chunks/ssr/package_json_[json]_cjs_013tntikdft59._.js +1 -1
  175. package/.next/standalone/.next/server/middleware-build-manifest.js +13 -13
  176. package/.next/standalone/.next/server/middleware.js +2 -2
  177. package/.next/standalone/.next/server/pages/404.html +1 -1
  178. package/.next/standalone/.next/server/pages/500.html +1 -1
  179. package/.next/standalone/.next/server/preview-props.json +3 -3
  180. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/server-reference-manifest.json +23 -23
  182. package/.next/standalone/.next/static/chunks/0cbom4-ijx_a_.js +1 -0
  183. package/.next/standalone/.next/static/chunks/0u5weo5jdn2s8.js +1 -0
  184. package/.next/standalone/.next/static/chunks/{0el9n3h9_zp5m.js → 18-icoqze51kl.js} +1 -1
  185. package/.next/standalone/.next/static/chunks/2d-u90dt4-8rd.js +6 -0
  186. package/.next/standalone/.next/static/chunks/2n-bzb7pxe7hu.js +1 -0
  187. package/.next/standalone/.next/static/chunks/{0umzct31duk5g.js → 2zc7lg-jq353g.js} +1 -1
  188. package/.next/standalone/.next/static/chunks/{27cavoc8paelg.js → 33djjf12bhcsv.js} +1 -1
  189. package/.next/standalone/.next/static/chunks/{0wobqgosirs8p.js → 38u_i3j5funpi.js} +1 -1
  190. package/.next/standalone/.next/static/chunks/3symuj7t4js-c.js +1 -0
  191. package/.next/standalone/.next/static/chunks/{1kduj74-715jh.js → 3vzut6zpdrvtx.js} +1 -1
  192. package/.next/standalone/.next/static/chunks/{063al_q720fkj.js → 3xgxl1s_in776.js} +2 -2
  193. package/.next/standalone/SECURITY.md +20 -4
  194. package/.next/standalone/fp-cloud-cli/CHANGELOG.md +15 -1
  195. package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -1
  196. package/.next/standalone/fp-cloud-cli/uv.lock +4 -4
  197. package/.next/standalone/hermes-plugin/plugin.yaml +1 -1
  198. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  199. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  200. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +24 -24
  201. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +26 -26
  202. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +3 -3
  203. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +13 -13
  204. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  205. package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +41 -40
  206. package/.next/standalone/node_modules/next/dist/server/app-render/async-local-storage.js +1 -1
  207. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering-validation.js +814 -0
  208. package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +1 -799
  209. package/.next/standalone/node_modules/next/dist/server/base-server.js +39 -5
  210. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  211. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  212. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  213. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  214. package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +4 -43
  215. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch-symbol.js +13 -0
  216. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +3 -7
  217. package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +3 -3
  218. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +77 -12
  219. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  220. package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +12 -0
  221. package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +30 -14
  222. package/.next/standalone/node_modules/next/dist/server/next-server.js +10 -11
  223. package/.next/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +29 -23
  224. package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +85 -8
  225. package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
  226. package/.next/standalone/node_modules/next/dist/server/web/adapter.js +124 -65
  227. package/.next/standalone/node_modules/next/dist/server/web/forward-trace-context.js +102 -0
  228. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  229. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  230. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  231. package/.next/standalone/node_modules/next/package.json +10 -10
  232. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  233. package/.next/standalone/node_modules/react/package.json +1 -1
  234. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  235. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  236. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +31 -27
  237. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +33 -27
  238. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +38 -30
  239. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  240. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  241. package/.next/standalone/package.json +10 -10
  242. package/.next/standalone/sdk/python/CHANGELOG.md +8 -4
  243. package/.next/standalone/sdk/python/failproofai_sdk/evaluator/source.py +2 -2
  244. package/.next/standalone/sdk/python/pyproject.toml +2 -7
  245. package/.next/standalone/sdk/python/skill/references/frameworks.md +0 -15
  246. package/.next/standalone/sdk/python/tests/test_docs.py +1 -4
  247. package/.next/standalone/sdk/python/tests/test_evaluator_source.py +1 -1
  248. package/.next/standalone/sdk/python/tests/test_packaging.py +4 -7
  249. package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +2 -13
  250. package/.next/standalone/sdk/python/uv.lock +43 -905
  251. package/.next/standalone/sdk/typescript/CHANGELOG.md +52 -0
  252. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +176 -68
  253. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +2 -2
  254. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +3 -3
  255. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +1 -1
  256. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +115 -98
  257. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +3 -3
  258. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -4
  259. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +1 -1
  260. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +171 -149
  261. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +5 -2
  262. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +27 -15
  263. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +2 -1
  264. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +1 -1
  265. package/.next/standalone/server.js +1 -1
  266. package/README.md +0 -6
  267. package/dist/cli.mjs +12 -11
  268. package/dist/worker.mjs +1 -1
  269. package/hermes-plugin/plugin.yaml +1 -1
  270. package/openclaw-plugin/daemon-client.js +254 -0
  271. package/openclaw-plugin/hooks.js +187 -0
  272. package/openclaw-plugin/index.js +17 -211
  273. package/package.json +10 -10
  274. package/scripts/sync-agent-cli-harnesses-prompt.md +26 -31
  275. package/src/hooks/enforcement-capability.ts +1 -1
  276. package/src/hooks/integrations.ts +5 -2
  277. package/.next/standalone/.codex/hooks.json +0 -76
  278. package/.next/standalone/.cursor/hooks.json +0 -47
  279. package/.next/standalone/.factory/hooks.json +0 -112
  280. package/.next/standalone/.next/server/chunks/[externals]__1x24dzcbbq6-g._.js +0 -3
  281. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__a_je8fsn65._.js +0 -3
  282. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l-oi4gdtmlo5._.js +0 -3
  283. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9ufnv5hi2hq._.js +0 -327
  284. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1aaw59g-5uty7._.js +0 -322
  285. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hqpg6vgmfexv._.js +0 -3
  286. package/.next/standalone/.next/server/chunks/ssr/[externals]__0ilfh9mfnzsth._.js +0 -3
  287. package/.next/standalone/.next/server/chunks/ssr/[externals]__0ohnuzsaozaca._.js +0 -3
  288. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pwj2h2efe5f-._.js +0 -14
  289. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0zuikgt2xho-v._.js +0 -271
  290. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_158jo-9mwvgad._.js +0 -291
  291. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_19r82zsxo2jj1._.js +0 -291
  292. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1dupwucoqt5qm._.js +0 -3
  293. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_03w27x2kh17_8._.js +0 -23
  294. package/.next/standalone/.next/static/chunks/0k7g_8x3o6gd-.js +0 -1
  295. package/.next/standalone/.next/static/chunks/12rug3jilwqzs.js +0 -1
  296. package/.next/standalone/.next/static/chunks/2701amhrbsbot.js +0 -1
  297. package/.next/standalone/.next/static/chunks/2ve23a7keupjw.js +0 -1
  298. package/.next/standalone/.next/static/chunks/3bv6xaoitjpnh.js +0 -6
  299. package/.next/standalone/.opencode/opencode.json +0 -4
  300. package/.next/standalone/.opencode/plugins/failproofai.mjs +0 -210
  301. package/.next/standalone/.pi/settings.json +0 -5
  302. package/.next/standalone/node_modules/react/cjs/react.development.js +0 -1330
  303. package/scripts/dev-hook.mjs +0 -333
  304. /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 1n2dyfTQb0MDajeqlipJy}/_buildManifest.js +0 -0
  305. /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 1n2dyfTQb0MDajeqlipJy}/_clientMiddlewareManifest.js +0 -0
  306. /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 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",
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",
130
- "@failproofai/failproofaid-linux-arm64": "1.0.12",
131
- "@failproofai/failproofaid-darwin-x64": "1.0.12",
132
- "@failproofai/failproofaid-darwin-arm64": "1.0.12"
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": "3b379ce2b03dd8a74393daed2c3120309f591fe6433e0c939d70c7b20da55be7",
136
- "linux-arm64": "bd77d7fee68dc2723fb57cc9c7fcf957b7e939c797e61b099c412263880aa16e",
137
- "darwin-x64": "fce3faab9406b1c2267955f0e07d04ef7a2b7a0b007e12ecd144fcfef563ebc8",
138
- "darwin-arm64": "765732f8f64aa3d3dbd98e93b1aba71fc02956f65baeb73b08447b37fac3a17b"
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
@@ -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}
@@ -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
 
@@ -1,76 +0,0 @@
1
- {
2
- "hooks": {
3
- "SessionStart": [
4
- {
5
- "hooks": [
6
- {
7
- "type": "command",
8
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook SessionStart --cli codex",
9
- "timeout": 60,
10
- "__failproofai_hook__": true
11
- }
12
- ]
13
- }
14
- ],
15
- "PreToolUse": [
16
- {
17
- "hooks": [
18
- {
19
- "type": "command",
20
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook PreToolUse --cli codex",
21
- "timeout": 60,
22
- "__failproofai_hook__": true
23
- }
24
- ]
25
- }
26
- ],
27
- "PermissionRequest": [
28
- {
29
- "hooks": [
30
- {
31
- "type": "command",
32
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook PermissionRequest --cli codex",
33
- "timeout": 60,
34
- "__failproofai_hook__": true
35
- }
36
- ]
37
- }
38
- ],
39
- "PostToolUse": [
40
- {
41
- "hooks": [
42
- {
43
- "type": "command",
44
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook PostToolUse --cli codex",
45
- "timeout": 60,
46
- "__failproofai_hook__": true
47
- }
48
- ]
49
- }
50
- ],
51
- "UserPromptSubmit": [
52
- {
53
- "hooks": [
54
- {
55
- "type": "command",
56
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook UserPromptSubmit --cli codex",
57
- "timeout": 60,
58
- "__failproofai_hook__": true
59
- }
60
- ]
61
- }
62
- ],
63
- "Stop": [
64
- {
65
- "hooks": [
66
- {
67
- "type": "command",
68
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 1; }; node scripts/dev-hook.mjs --hook Stop --cli codex",
69
- "timeout": 60,
70
- "__failproofai_hook__": true
71
- }
72
- ]
73
- }
74
- ]
75
- }
76
- }
@@ -1,47 +0,0 @@
1
- {
2
- "version": 1,
3
- "hooks": {
4
- "sessionStart": [
5
- {
6
- "type": "command",
7
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook sessionStart --cli cursor",
8
- "timeout": 60
9
- }
10
- ],
11
- "sessionEnd": [
12
- {
13
- "type": "command",
14
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook sessionEnd --cli cursor",
15
- "timeout": 60
16
- }
17
- ],
18
- "beforeSubmitPrompt": [
19
- {
20
- "type": "command",
21
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook beforeSubmitPrompt --cli cursor",
22
- "timeout": 60
23
- }
24
- ],
25
- "preToolUse": [
26
- {
27
- "type": "command",
28
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook preToolUse --cli cursor",
29
- "timeout": 60
30
- }
31
- ],
32
- "postToolUse": [
33
- {
34
- "type": "command",
35
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 2; }; node scripts/dev-hook.mjs --hook postToolUse --cli cursor",
36
- "timeout": 60
37
- }
38
- ],
39
- "stop": [
40
- {
41
- "type": "command",
42
- "command": "command -v node >/dev/null 2>&1 || { echo '[failproofai] node not found; install Node >=20.9' >&2; exit 1; }; node scripts/dev-hook.mjs --hook stop --cli cursor",
43
- "timeout": 60
44
- }
45
- ]
46
- }
47
- }