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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +13 -13
- package/.next/standalone/.next/prerender-manifest.json +4 -4
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +2 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +4 -3
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/audit/invite/route.js +6 -5
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +27 -26
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js +4 -3
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -5
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +6 -5
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +6 -5
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +6 -5
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +4 -3
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +7 -6
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +6 -5
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js +5 -4
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +21 -20
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +10 -9
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +7 -6
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/settings/page.js +6 -5
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0vt9i6fqinjne._.js → [externals]__1h83uo-b1b6-2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[externals]__214wn4wh2x79y._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__1rlxpymm37wel._.js → [root-of-the-server]__031qp1lkow_kc._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__038kwryp970nh._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_hsnj_a2mvl_._.js → [root-of-the-server]__03s1za0hn71yp._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wg9dk8x8bnau._.js → [root-of-the-server]__07a0sa6fuw5_b._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08atcie7jzswm._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08dchfudh2_4f._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0car70pylmvor._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0spt0kv8azrpl._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__12kq3x-h7t7i1._.js → [root-of-the-server]__0yvyp5b7jmlc4._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__02vous7mpi2xm._.js → [root-of-the-server]__145vo_drnuvas._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[externals]__0h0p9dmv_e7r7._.js → [root-of-the-server]__1a2d0ewycsp6k._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[externals]__1_407huhlmj1m._.js → [root-of-the-server]__1am_1tz0o0aqz._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__03i5o4a840guz._.js → [root-of-the-server]__1gxfzuvpyw30j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1j6kfp0vzu5rw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1l0ayum_hqqsw._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1lh8c0mmhdrbj._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1o9rznwc0w7og._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0f_4g-vazrvxv._.js → [root-of-the-server]__1o_622x0fglpr._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1oclamblhzhrf._.js +68 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1v1-l-83czzsr._.js +63 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1a5zkndjwlc13._.js → [root-of-the-server]__1wwi53kkqhnfi._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_1y590mjzpkbos._.js → _02sa8fcu9_9xo._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_0tovk6q0miud6._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3ycqv17cl._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1-2owkp-1_987._.js +1 -1
- package/.next/standalone/.next/server/chunks/_13ltj8a9z92o8._.js +1 -1
- package/.next/standalone/.next/server/chunks/_15k37au70vjvg._.js +1 -1
- package/.next/standalone/.next/server/chunks/_18rfu4__wjhwb._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1ek68lnh2daur._.js +2 -2
- package/.next/standalone/.next/server/chunks/_1fz8m31sndkcu._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1ogwigfb0163w._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1vslkoe35wok6._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_@opentelemetry_api_build_esm_index_0oo58a7rymoxh.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_@opentelemetry_api_build_esm_index_1jp9ij0_ddtgk.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oigsgz07._.js +2 -2
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p77cu37y._.js +2 -2
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4vkpxxu7._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ffu2-38y03ic._.js → [root-of-the-server]__021vebe-4il8s._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__075uro8t92s0_._.js +14 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08ch3staq3ejw._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[externals]__12qr51qgrrt6o._.js → [root-of-the-server]__097i34ct1o88x._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0alpzjn3450sr._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0aup10z2o8zc1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bigvy9xmv2ka._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bioghlkjf7s7._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__01j58mdcdw0vn._.js → [root-of-the-server]__0ed1zh4scn7-k._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0naevg4bcoh54._.js → [root-of-the-server]__0evgy902m9h5e._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h86bl2qf0k_o._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__167mipqmjprq5._.js → [root-of-the-server]__0mhtkwwx1pxcq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0nhm28v58ty9z._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pia5h3p8re4c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vse4qi496ol-._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__17r4zrwanhp6r._.js → [root-of-the-server]__0yb3u36xjy3b9._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0g8b0kyorya-t._.js → [root-of-the-server]__0ywj2u6ovfm_5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-ey9fgesfbc0._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zn1d4blhd3bu._.js → [root-of-the-server]__10v5cyxvj64j4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__15usvs-ms-0hf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16gb3_92zvk5x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__190xwrr5zrfi3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1avi2kypusyb_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1vx7o8ukefudh._.js → [root-of-the-server]__1guwlpkyurdn9._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1k96jctukf65_._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1r7drlqli-ado._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1sj-wn2jp6va5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vofkb2oq7p7e._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1s2-ck3k3rsoo._.js → [root-of-the-server]__20dt376-socef._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1lnfv02ucky7m._.js → [root-of-the-server]__2158020r_amn9._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1d98fyfrcaqhy._.js → _0bc4f4quq6w47._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0eoura3_9gjb-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0ouu886szh6yj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0pedwblqdoh58._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1_ozgifqv1ssi._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1djqs9i27e4kg._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo5_vm5f.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9snixb5fd-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47q0xq5w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x33jqb6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpcz0uxur._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h47jmhhd._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_09s4n108bqreq._.js → node_modules_0ptcnmeaxvd_a._.js} +22 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@opentelemetry_api_build_esm_index_0ntwr8lzj6p2i.js +3 -0
- 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
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0bz67659f5z-3._.js +32 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0ocrceo0c9psx._.js +32 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1alv566ojmz5j._.js +32 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1khq67j4vo9y4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_0ftnv26hg1lry._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0dagmbznysrc2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuznb72p7z._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/package_json_[json]_cjs_013tntikdft59._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +13 -13
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/preview-props.json +3 -3
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +23 -23
- package/.next/standalone/.next/static/chunks/0cbom4-ijx_a_.js +1 -0
- package/.next/standalone/.next/static/chunks/0u5weo5jdn2s8.js +1 -0
- package/.next/standalone/.next/static/chunks/{0el9n3h9_zp5m.js → 18-icoqze51kl.js} +1 -1
- package/.next/standalone/.next/static/chunks/2d-u90dt4-8rd.js +6 -0
- package/.next/standalone/.next/static/chunks/2n-bzb7pxe7hu.js +1 -0
- package/.next/standalone/.next/static/chunks/{0umzct31duk5g.js → 2zc7lg-jq353g.js} +1 -1
- package/.next/standalone/.next/static/chunks/{27cavoc8paelg.js → 33djjf12bhcsv.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0wobqgosirs8p.js → 38u_i3j5funpi.js} +1 -1
- package/.next/standalone/.next/static/chunks/3symuj7t4js-c.js +1 -0
- package/.next/standalone/.next/static/chunks/{1kduj74-715jh.js → 3vzut6zpdrvtx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{063al_q720fkj.js → 3xgxl1s_in776.js} +2 -2
- package/.next/standalone/SECURITY.md +20 -4
- package/.next/standalone/fp-cloud-cli/CHANGELOG.md +15 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -1
- package/.next/standalone/fp-cloud-cli/uv.lock +4 -4
- package/.next/standalone/hermes-plugin/plugin.yaml +1 -1
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +24 -24
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +26 -26
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +3 -3
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +41 -40
- package/.next/standalone/node_modules/next/dist/server/app-render/async-local-storage.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering-validation.js +814 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/dynamic-rendering.js +1 -799
- package/.next/standalone/node_modules/next/dist/server/base-server.js +39 -5
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/dedupe-fetch.js +4 -43
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch-symbol.js +13 -0
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +3 -7
- package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js +77 -12
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/trace/constants.js +12 -0
- package/.next/standalone/node_modules/next/dist/server/lib/trace/tracer.js +30 -14
- package/.next/standalone/node_modules/next/dist/server/next-server.js +10 -11
- package/.next/standalone/node_modules/next/dist/server/route-modules/pages/pages-handler.js +29 -23
- package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +85 -8
- package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/web/adapter.js +124 -65
- package/.next/standalone/node_modules/next/dist/server/web/forward-trace-context.js +102 -0
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +10 -10
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +31 -27
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +33 -27
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +38 -30
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +2 -2
- package/.next/standalone/package.json +10 -10
- package/.next/standalone/sdk/python/CHANGELOG.md +8 -4
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/source.py +2 -2
- package/.next/standalone/sdk/python/pyproject.toml +2 -7
- package/.next/standalone/sdk/python/skill/references/frameworks.md +0 -15
- package/.next/standalone/sdk/python/tests/test_docs.py +1 -4
- package/.next/standalone/sdk/python/tests/test_evaluator_source.py +1 -1
- package/.next/standalone/sdk/python/tests/test_packaging.py +4 -7
- package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +2 -13
- package/.next/standalone/sdk/python/uv.lock +43 -905
- package/.next/standalone/sdk/typescript/CHANGELOG.md +52 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +176 -68
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +2 -2
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +3 -3
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +115 -98
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +3 -3
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -4
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +171 -149
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +5 -2
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +27 -15
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +2 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +1 -1
- package/.next/standalone/server.js +1 -1
- package/README.md +0 -6
- package/dist/cli.mjs +12 -11
- package/dist/worker.mjs +1 -1
- package/hermes-plugin/plugin.yaml +1 -1
- package/openclaw-plugin/daemon-client.js +254 -0
- package/openclaw-plugin/hooks.js +187 -0
- package/openclaw-plugin/index.js +17 -211
- package/package.json +10 -10
- package/scripts/sync-agent-cli-harnesses-prompt.md +26 -31
- package/src/hooks/enforcement-capability.ts +1 -1
- package/src/hooks/integrations.ts +5 -2
- package/.next/standalone/.codex/hooks.json +0 -76
- package/.next/standalone/.cursor/hooks.json +0 -47
- package/.next/standalone/.factory/hooks.json +0 -112
- package/.next/standalone/.next/server/chunks/[externals]__1x24dzcbbq6-g._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__a_je8fsn65._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l-oi4gdtmlo5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9ufnv5hi2hq._.js +0 -327
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1aaw59g-5uty7._.js +0 -322
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hqpg6vgmfexv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[externals]__0ilfh9mfnzsth._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[externals]__0ohnuzsaozaca._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pwj2h2efe5f-._.js +0 -14
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0zuikgt2xho-v._.js +0 -271
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_158jo-9mwvgad._.js +0 -291
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_19r82zsxo2jj1._.js +0 -291
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1dupwucoqt5qm._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_shared_lib_03w27x2kh17_8._.js +0 -23
- package/.next/standalone/.next/static/chunks/0k7g_8x3o6gd-.js +0 -1
- package/.next/standalone/.next/static/chunks/12rug3jilwqzs.js +0 -1
- package/.next/standalone/.next/static/chunks/2701amhrbsbot.js +0 -1
- package/.next/standalone/.next/static/chunks/2ve23a7keupjw.js +0 -1
- package/.next/standalone/.next/static/chunks/3bv6xaoitjpnh.js +0 -6
- package/.next/standalone/.opencode/opencode.json +0 -4
- package/.next/standalone/.opencode/plugins/failproofai.mjs +0 -210
- package/.next/standalone/.pi/settings.json +0 -5
- package/.next/standalone/node_modules/react/cjs/react.development.js +0 -1330
- package/scripts/dev-hook.mjs +0 -333
- /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 1n2dyfTQb0MDajeqlipJy}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 1n2dyfTQb0MDajeqlipJy}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{D7LY1YSrw96ZxKSpxxrFw → 1n2dyfTQb0MDajeqlipJy}/_ssgManifest.js +0 -0
package/openclaw-plugin/index.js
CHANGED
|
@@ -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
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
|
18
|
-
* •
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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 {
|
|
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
|
-
|
|
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.
|
|
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": "^
|
|
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.
|
|
130
|
-
"@failproofai/failproofaid-linux-arm64": "1.0.
|
|
131
|
-
"@failproofai/failproofaid-darwin-x64": "1.0.
|
|
132
|
-
"@failproofai/failproofaid-darwin-arm64": "1.0.
|
|
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": "
|
|
136
|
-
"linux-arm64": "
|
|
137
|
-
"darwin-x64": "
|
|
138
|
-
"darwin-arm64": "
|
|
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
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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`
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
180
|
-
|
|
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`,
|
|
209
|
-
|
|
210
|
-
`.
|
|
211
|
-
`.
|
|
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/
|
|
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
|
-
//
|
|
2281
|
-
//
|
|
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
|
-
}
|