failproofai 1.0.12-beta.2 → 1.0.13-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +13 -13
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- 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]__00l2u6j86cb8y._.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/{_1fw0_nzkae5ao._.js → _0bc4f4quq6w47._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0bseae9u7g98r._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0eoura3_9gjb-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0mouhaflye1ro._.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/_20hn4gn87nsjc._.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_components_project-list_tsx_1ke6anr0vt64h._.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_1fv03uigni8s5.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/{1c_jf6g5wnslk.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/{2o6d37j425uci.js → 2zc7lg-jq353g.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0tbm3vjm62h-2.js → 33djjf12bhcsv.js} +1 -1
- package/.next/standalone/.next/static/chunks/{42xptz88mtq3x.js → 38u_i3j5funpi.js} +1 -1
- package/.next/standalone/.next/static/chunks/{20py8k1gd_i1m.js → 3symuj7t4js-c.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ay__-d2h1xb5.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 +34 -1
- package/.next/standalone/fp-cloud-cli/README.md +120 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/app.py +15 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/client.py +198 -7
- package/.next/standalone/fp-cloud-cli/fp_cli/cloud_output.py +523 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/_cloud.py +45 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/_write.py +3 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/account_cmds.py +171 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/agent_cmds.py +80 -7
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/alerts_cmds.py +23 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/audits_cmds.py +2 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/contracts_cmds.py +67 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/dashboards_cmds.py +159 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/evaluators_cmds.py +380 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/events_cmds.py +14 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/incidents_cmds.py +82 -6
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/list_cmds.py +4 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/orgs_cmds.py +17 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/policies_cmds.py +143 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/queries_cmds.py +70 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/sentiment_cmds.py +49 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/sessions_cmds.py +95 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/settings_cmds.py +2 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/usage_cmds.py +21 -1
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/users_cmds.py +14 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/errors.py +3 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/evaluator_spec.py +266 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/output.py +187 -81
- package/.next/standalone/fp-cloud-cli/fp_cli/theme.py +21 -24
- package/.next/standalone/fp-cloud-cli/skill/SKILL.md +124 -23
- package/.next/standalone/fp-cloud-cli/skill/agents/openai.yaml +2 -1
- package/.next/standalone/fp-cloud-cli/skill/references/commands.md +168 -16
- package/.next/standalone/fp-cloud-cli/tests/fake_cloud_smoke.py +312 -0
- package/.next/standalone/fp-cloud-cli/tests/test_cloud_account.py +125 -0
- package/.next/standalone/fp-cloud-cli/tests/test_cloud_agent.py +253 -0
- package/.next/standalone/fp-cloud-cli/tests/test_cloud_human_views.py +287 -0
- package/.next/standalone/fp-cloud-cli/tests/test_cloud_observability.py +116 -0
- package/.next/standalone/fp-cloud-cli/tests/test_cloud_transport.py +141 -0
- package/.next/standalone/fp-cloud-cli/tests/test_commands.py +3 -3
- package/.next/standalone/fp-cloud-cli/tests/test_dashboards_agent.py +3 -3
- package/.next/standalone/fp-cloud-cli/tests/test_evaluator_authoring.py +449 -0
- package/.next/standalone/fp-cloud-cli/tests/test_facets.py +1 -1
- package/.next/standalone/fp-cloud-cli/tests/test_help_table_coverage.py +15 -0
- package/.next/standalone/fp-cloud-cli/tests/test_operator.py +1 -1
- package/.next/standalone/fp-cloud-cli/tests/test_orgs.py +1 -1
- package/.next/standalone/fp-cloud-cli/tests/test_output.py +37 -37
- package/.next/standalone/fp-cloud-cli/tests/test_round4_behaviour.py +144 -0
- package/.next/standalone/fp-cloud-cli/tests/test_screen_language.py +80 -0
- package/.next/standalone/fp-cloud-cli/tests/test_session_reevaluate.py +33 -0
- package/.next/standalone/fp-cloud-cli/tests/test_staging_parity.py +198 -0
- package/.next/standalone/fp-cloud-cli/tests/test_whoami.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-5/package-lock.json +7 -7
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +2 -2
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +7 -7
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +7 -7
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +4 -4
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +1 -1
- 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 +3 -3
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +3 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +4 -4
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +25 -25
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +34 -22
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +3 -2
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +10 -10
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +1 -1
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +7 -7
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/README.md +0 -6
- package/dist/cli.mjs +87 -38
- package/dist/worker.mjs +73 -28
- 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/agent-skill.ts +3 -0
- package/src/hooks/enforcement-capability.ts +1 -1
- package/src/hooks/fp-home.ts +1 -1
- package/src/hooks/handler.ts +22 -3
- package/src/hooks/integrations.ts +5 -2
- package/src/hooks/semantic/intent.ts +127 -24
- package/src/hooks/semantic/jev-review.ts +21 -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/1my3-5p47t7r-.js +0 -1
- package/.next/standalone/.next/static/chunks/21hckpmsc4g70.js +0 -6
- package/.next/standalone/.next/static/chunks/2hmex93ppj1ke.js +0 -1
- package/.next/standalone/.next/static/chunks/40oworn_-x12p.js +0 -1
- 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/{LHCtFxVG0mdvd4lsXAOFC → 1n2dyfTQb0MDajeqlipJy}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → 1n2dyfTQb0MDajeqlipJy}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → 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
|
package/src/hooks/agent-skill.ts
CHANGED
|
@@ -65,6 +65,9 @@ For focused work, read the matching skill too. Each has the same layout, with it
|
|
|
65
65
|
- FailproofAI Cloud and the \`fp\` CLI: ${SKILLS_RAW}/fp-cloud-cli/SKILL.md
|
|
66
66
|
- Adding the SDK to an agent, or running an evaluator: ${SKILLS_RAW}/failproofai-sdk/SKILL.md
|
|
67
67
|
- Planning evaluations: ${SKILLS_RAW}/failproofai-eval-brainstorm/SKILL.md
|
|
68
|
+
- Writing an evaluation: ${SKILLS_RAW}/failproofai-eval-author/SKILL.md
|
|
69
|
+
- Writing an alert: ${SKILLS_RAW}/failproofai-alert-author/SKILL.md
|
|
70
|
+
- Writing an audit: ${SKILLS_RAW}/failproofai-audit-author/SKILL.md
|
|
68
71
|
`;
|
|
69
72
|
|
|
70
73
|
/** An agent's own override for where it keeps its files, else the default. */
|
|
@@ -182,7 +182,7 @@ export const ENFORCEMENT_CAPABILITY: Record<
|
|
|
182
182
|
|
|
183
183
|
// ── openclaw ──────────────────────────────────────────────────────────────
|
|
184
184
|
// openclaw/openclaw @f8ed8ecf (v2026.7.2) + our own shipped shim
|
|
185
|
-
// openclaw-plugin/
|
|
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}
|
package/src/hooks/fp-home.ts
CHANGED
|
@@ -410,7 +410,7 @@ export const collectorHealthFile = (home?: string) => resolve(stateDir(home), "c
|
|
|
410
410
|
/** Per-session enforcement pauses, keyed by a hash of the session id. */
|
|
411
411
|
export const sessionPauseDir = () => resolve(stateDir(), "sessions");
|
|
412
412
|
/**
|
|
413
|
-
* The semantic (Jev) evaluator's local state: `sessions/<id>.json` holds the
|
|
413
|
+
* The semantic (Jev) evaluator's local state: `sessions/<profile>/<id>.json` holds the
|
|
414
414
|
* human prompts recorded at `UserPromptSubmit`, and `verdicts.jsonl` one row
|
|
415
415
|
* per semantic evaluation. Written only when a Jev config (BYOK) is present.
|
|
416
416
|
*/
|
package/src/hooks/handler.ts
CHANGED
|
@@ -505,6 +505,8 @@ async function startTwoTier(
|
|
|
505
505
|
permissionMode: session.permissionMode,
|
|
506
506
|
sessionId: session.sessionId,
|
|
507
507
|
cli,
|
|
508
|
+
// The profile the intent store is read under: the one capture used.
|
|
509
|
+
agent,
|
|
508
510
|
...(loaded.cloud ? { cloud: loaded.cloud } : {}),
|
|
509
511
|
// Cloud's checks are still asked; the installed packs' are not.
|
|
510
512
|
...(activePause ? { localPaused: true } : {}),
|
|
@@ -571,6 +573,15 @@ function jevTelemetry(activity: JevActivityFields | undefined): Record<string, u
|
|
|
571
573
|
* marks that tell a human's prompt from a subagent's or an extension's are
|
|
572
574
|
* elsewhere in it. `prompt` is §7's original field, still read by the
|
|
573
575
|
* contract stub; T4's implementation reads `payload` and ignores it.
|
|
576
|
+
*
|
|
577
|
+
* The prompt is stored under the agent profile (`agent`, the runtime identity
|
|
578
|
+
* Cloud's targeting matches on) and read back by `startTwoTier` under the same
|
|
579
|
+
* one, so a prompt typed into one profile is never another's stated intent.
|
|
580
|
+
* Under a Cloud mode, a profile the deployment assigns no Cloud Jev check to,
|
|
581
|
+
* with no installed pack's check to review it either, has nothing that will
|
|
582
|
+
* ever read the prompt (`startTwoTier` returns before Jev for it), so nothing
|
|
583
|
+
* is kept: FailproofAI does not hold prompt text from a profile the
|
|
584
|
+
* deployment did not target.
|
|
574
585
|
*/
|
|
575
586
|
async function captureJevIntent(
|
|
576
587
|
canonicalEventType: string,
|
|
@@ -579,13 +590,20 @@ async function captureJevIntent(
|
|
|
579
590
|
session: SessionMetadata,
|
|
580
591
|
cli: IntegrationType,
|
|
581
592
|
opts: EvaluateHookEventOptions | undefined,
|
|
593
|
+
agent: AgentIdentity | null,
|
|
582
594
|
): Promise<void> {
|
|
583
595
|
if (canonicalEventType !== "UserPromptSubmit" || jevForcedOff(opts)) return;
|
|
584
596
|
try {
|
|
585
597
|
// Same gate as `startTwoTier`: a Cloud mode that asks needs what the human
|
|
586
598
|
// typed whatever the installed packs declare.
|
|
587
|
-
|
|
588
|
-
if (!
|
|
599
|
+
const cloudAsks = cloudJevAsks(readCloudJevMode());
|
|
600
|
+
if (!cloudAsks && !jevChecksInstalled()) return;
|
|
601
|
+
// ...but not for a profile no Cloud Jev check targets and no installed
|
|
602
|
+
// pack's check reviews: `startTwoTier`'s own skip, without the pause
|
|
603
|
+
// (a pause can end while the session goes on). An older deployment with
|
|
604
|
+
// no assignment list (`null`) captures as before.
|
|
605
|
+
if (cloudAsks && cloudJevAssignmentsFor(agent)?.length === 0 && !packJevChecksInstalled()) return;
|
|
606
|
+
if (!(await readJevConfig(agent))) return;
|
|
589
607
|
if (decision === "deny") {
|
|
590
608
|
const { ENFORCEMENT_CAPABILITY } = await import("./enforcement-capability");
|
|
591
609
|
if (ENFORCEMENT_CAPABILITY[cli]?.UserPromptSubmit === "block") return;
|
|
@@ -599,6 +617,7 @@ async function captureJevIntent(
|
|
|
599
617
|
cli,
|
|
600
618
|
payload: parsed,
|
|
601
619
|
prompt: parsed.prompt,
|
|
620
|
+
profile: { cli, agent },
|
|
602
621
|
};
|
|
603
622
|
captureIntent(event);
|
|
604
623
|
} catch (err) {
|
|
@@ -1180,7 +1199,7 @@ export async function evaluateHookEvent(
|
|
|
1180
1199
|
const durationMs = Math.round(performance.now() - startTime);
|
|
1181
1200
|
hookLogInfo(`result=${result.decision} policy=${result.policyName ?? "none"} duration=${durationMs}ms`);
|
|
1182
1201
|
|
|
1183
|
-
await captureJevIntent(canonicalEventType, result.decision, parsed, session, cli, opts);
|
|
1202
|
+
await captureJevIntent(canonicalEventType, result.decision, parsed, session, cli, opts, runtimeAgent);
|
|
1184
1203
|
|
|
1185
1204
|
// Which policies actually ran for this event, regardless of how they
|
|
1186
1205
|
// decided. `result.policyName` names only the decider — null on a plain
|
|
@@ -2277,8 +2277,10 @@ export function unhookedHermesProfiles(): string[] {
|
|
|
2277
2277
|
// OpenClaw is a self-hosted assistant gateway. Enforcement is via its in-process
|
|
2278
2278
|
// PLUGIN hooks (file-based "internal hooks" are observation-only), so failproofai
|
|
2279
2279
|
// ships a static plugin package (`openclaw-plugin/`, like Pi's pi-extension) that
|
|
2280
|
-
//
|
|
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
|
|