failproofai 1.0.1 → 1.0.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +6 -6
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  20. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/api/audit/invite/route.js +3 -2
  24. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/audit/run/route.js +5 -4
  26. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +2 -2
  29. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +4 -3
  31. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/auth/logout/route.js +4 -4
  33. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/auth/status/route.js +4 -4
  35. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  38. package/.next/standalone/.next/server/app/audit/page.js +2 -2
  39. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/index.html +1 -1
  42. package/.next/standalone/.next/server/app/index.rsc +15 -15
  43. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  44. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  45. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  46. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  47. package/.next/standalone/.next/server/app/page.js +2 -2
  48. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +66 -22
  51. package/.next/standalone/.next/server/app/policies/page.js +5 -4
  52. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  55. package/.next/standalone/.next/server/app/project/[name]/page.js +2 -2
  56. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  59. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  60. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +2 -2
  61. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  64. package/.next/standalone/.next/server/app/projects/page.js +2 -2
  65. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
  68. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  69. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/chunks/{[externals]__1qzqcio._.js → [externals]__0e32-7c._.js} +1 -1
  72. package/.next/standalone/.next/server/chunks/[externals]__1s462yl._.js +3 -0
  73. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01eqny5._.js +3 -0
  74. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1p8poxd._.js → [root-of-the-server]__0igxt32._.js} +2 -2
  76. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0neqlu-._.js +3 -0
  77. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9oqnn._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/_0bs-v8p._.js +3 -0
  80. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/_185gyk9._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +5 -6
  84. package/.next/standalone/.next/server/chunks/lib_telemetry-id_ts_1k8gj9o._.js +3 -0
  85. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_09d5c79._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_04op_ou._.js} +1 -1
  86. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_1d2g73o._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_0dr20uz._.js} +1 -1
  87. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/src_hooks_0xbw3bu._.js +12 -0
  89. package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
  90. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +4 -0
  91. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +4 -0
  92. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +4 -0
  93. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0spkm68._.js → [root-of-the-server]__07gm3zl._.js} +21 -20
  94. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +4 -0
  95. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +4 -0
  96. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l4748x._.js +3 -0
  97. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
  99. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +6 -0
  100. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__192nhvh._.js +5 -0
  101. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +4 -0
  102. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  103. package/.next/standalone/.next/server/chunks/ssr/_0bwu160._.js +23 -0
  104. package/.next/standalone/.next/server/chunks/ssr/{_0u5zauv._.js → _0ns6k3a._.js} +1 -1
  105. package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  107. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +13 -13
  108. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  109. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
  111. package/.next/standalone/.next/server/chunks/ssr/src_hooks_08o7bqo._.js +10 -0
  112. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  113. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
  114. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  115. package/.next/standalone/.next/server/middleware.js +1 -1
  116. package/.next/standalone/.next/server/pages/404.html +1 -1
  117. package/.next/standalone/.next/server/pages/500.html +1 -1
  118. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/server-reference-manifest.json +71 -27
  120. package/.next/standalone/.next/static/chunks/{3c808qrfcq0im.js → 01u1cf8js2yd6.js} +1 -1
  121. package/.next/standalone/.next/static/chunks/{0k5050ezjvv49.js → 0izgu7nqh2zp-.js} +1 -1
  122. package/.next/standalone/.next/static/chunks/0u4-org_e7zde.js +1 -0
  123. package/.next/standalone/.next/static/chunks/1mfzsja6ftim5.css +2 -0
  124. package/.next/standalone/.next/static/chunks/{2zpp1we2jv6tb.js → 1tynnrrh711lr.js} +1 -1
  125. package/.next/standalone/.next/static/chunks/{1ide1wl2f7zi1.js → 22rqvlr7p_1mv.js} +13 -13
  126. package/.next/standalone/.next/static/chunks/{31s1smp-g7gks.js → 2whxqyskpirbk.js} +1 -1
  127. package/.next/standalone/.next/static/chunks/31mwk8k0q3_3g.js +6 -0
  128. package/.next/standalone/.next/static/chunks/3ms6gxfm82t6s.js +1 -0
  129. package/.next/standalone/.next/static/chunks/{37fcpc36x9gpe.js → 3tbbs_d8xrvyp.js} +1 -1
  130. package/.next/standalone/.next/static/chunks/43nlc236oo898.js +1 -0
  131. package/.next/standalone/SECURITY.md +5 -4
  132. package/.next/standalone/app/actions/get-hooks-config.ts +108 -17
  133. package/.next/standalone/app/actions/pack-actions.ts +163 -0
  134. package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
  135. package/.next/standalone/app/audit/_components/share-templates.ts +13 -13
  136. package/.next/standalone/app/policies/hooks-client.tsx +320 -15
  137. package/.next/standalone/components/navbar.tsx +2 -28
  138. package/.next/standalone/components/reach-developers.tsx +8 -1
  139. package/.next/standalone/docs-old/agenteye/python-sdk-skill.mdx +1 -1
  140. package/.next/standalone/docs-old/agenteye/python-sdk.mdx +59 -35
  141. package/.next/standalone/docs-old/i18n/README.ar.md +1 -0
  142. package/.next/standalone/docs-old/i18n/README.de.md +1 -0
  143. package/.next/standalone/docs-old/i18n/README.es.md +1 -0
  144. package/.next/standalone/docs-old/i18n/README.fr.md +1 -0
  145. package/.next/standalone/docs-old/i18n/README.he.md +1 -0
  146. package/.next/standalone/docs-old/i18n/README.hi.md +1 -0
  147. package/.next/standalone/docs-old/i18n/README.it.md +1 -0
  148. package/.next/standalone/docs-old/i18n/README.ja.md +1 -0
  149. package/.next/standalone/docs-old/i18n/README.ko.md +1 -0
  150. package/.next/standalone/docs-old/i18n/README.pt-br.md +1 -0
  151. package/.next/standalone/docs-old/i18n/README.ru.md +1 -0
  152. package/.next/standalone/docs-old/i18n/README.tr.md +1 -0
  153. package/.next/standalone/docs-old/i18n/README.vi.md +1 -0
  154. package/.next/standalone/docs-old/i18n/README.zh.md +1 -0
  155. package/.next/standalone/fp-cloud-cli/CHANGELOG.md +431 -0
  156. package/.next/standalone/fp-cloud-cli/LICENSE +42 -0
  157. package/.next/standalone/fp-cloud-cli/MANIFEST.in +10 -0
  158. package/.next/standalone/fp-cloud-cli/README.md +259 -0
  159. package/.next/standalone/fp-cloud-cli/fp_cli/__init__.py +10 -0
  160. package/.next/standalone/fp-cloud-cli/fp_cli/__main__.py +4 -0
  161. package/.next/standalone/fp-cloud-cli/fp_cli/_click_compat.py +64 -0
  162. package/.next/standalone/fp-cloud-cli/fp_cli/_context.py +332 -0
  163. package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -0
  164. package/.next/standalone/fp-cloud-cli/fp_cli/analytics.py +432 -0
  165. package/.next/standalone/fp-cloud-cli/fp_cli/analytics_config.py +77 -0
  166. package/.next/standalone/fp-cloud-cli/fp_cli/analytics_registry.py +83 -0
  167. package/.next/standalone/fp-cloud-cli/fp_cli/app.py +492 -0
  168. package/.next/standalone/fp-cloud-cli/fp_cli/auth.py +160 -0
  169. package/.next/standalone/fp-cloud-cli/fp_cli/client.py +1694 -0
  170. package/.next/standalone/fp-cloud-cli/fp_cli/commands/__init__.py +0 -0
  171. package/.next/standalone/fp-cloud-cli/fp_cli/commands/_write.py +214 -0
  172. package/.next/standalone/fp-cloud-cli/fp_cli/commands/agent_cmds.py +407 -0
  173. package/.next/standalone/fp-cloud-cli/fp_cli/commands/alerts_cmds.py +445 -0
  174. package/.next/standalone/fp-cloud-cli/fp_cli/commands/audits_cmds.py +1054 -0
  175. package/.next/standalone/fp-cloud-cli/fp_cli/commands/auth_cmds.py +512 -0
  176. package/.next/standalone/fp-cloud-cli/fp_cli/commands/errors_cmds.py +190 -0
  177. package/.next/standalone/fp-cloud-cli/fp_cli/commands/evals_cmds.py +161 -0
  178. package/.next/standalone/fp-cloud-cli/fp_cli/commands/events_cmds.py +159 -0
  179. package/.next/standalone/fp-cloud-cli/fp_cli/commands/fleet_cmds.py +416 -0
  180. package/.next/standalone/fp-cloud-cli/fp_cli/commands/guardrails_cmds.py +148 -0
  181. package/.next/standalone/fp-cloud-cli/fp_cli/commands/incidents_cmds.py +472 -0
  182. package/.next/standalone/fp-cloud-cli/fp_cli/commands/keys_cmds.py +407 -0
  183. package/.next/standalone/fp-cloud-cli/fp_cli/commands/list_cmds.py +63 -0
  184. package/.next/standalone/fp-cloud-cli/fp_cli/commands/orgs_cmds.py +319 -0
  185. package/.next/standalone/fp-cloud-cli/fp_cli/commands/policies_cmds.py +499 -0
  186. package/.next/standalone/fp-cloud-cli/fp_cli/commands/queries_cmds.py +378 -0
  187. package/.next/standalone/fp-cloud-cli/fp_cli/commands/sessions_cmds.py +151 -0
  188. package/.next/standalone/fp-cloud-cli/fp_cli/commands/settings_cmds.py +150 -0
  189. package/.next/standalone/fp-cloud-cli/fp_cli/commands/usage_cmds.py +35 -0
  190. package/.next/standalone/fp-cloud-cli/fp_cli/commands/users_cmds.py +404 -0
  191. package/.next/standalone/fp-cloud-cli/fp_cli/config.py +330 -0
  192. package/.next/standalone/fp-cloud-cli/fp_cli/dates.py +78 -0
  193. package/.next/standalone/fp-cloud-cli/fp_cli/enforcement.py +345 -0
  194. package/.next/standalone/fp-cloud-cli/fp_cli/errors.py +98 -0
  195. package/.next/standalone/fp-cloud-cli/fp_cli/models.py +891 -0
  196. package/.next/standalone/fp-cloud-cli/fp_cli/orgs.py +30 -0
  197. package/.next/standalone/fp-cloud-cli/fp_cli/output.py +6593 -0
  198. package/.next/standalone/fp-cloud-cli/fp_cli/permissions.py +208 -0
  199. package/.next/standalone/fp-cloud-cli/fp_cli/policy_check.py +290 -0
  200. package/.next/standalone/fp-cloud-cli/fp_cli/py.typed +0 -0
  201. package/.next/standalone/fp-cloud-cli/fp_cli/select.py +322 -0
  202. package/.next/standalone/fp-cloud-cli/fp_cli/theme.py +53 -0
  203. package/.next/standalone/fp-cloud-cli/pyproject.toml +106 -0
  204. package/.next/standalone/fp-cloud-cli/skill/SKILL.md +302 -0
  205. package/.next/standalone/fp-cloud-cli/skill/agents/openai.yaml +8 -0
  206. package/.next/standalone/fp-cloud-cli/skill/references/commands.md +254 -0
  207. package/.next/standalone/fp-cloud-cli/tests/__init__.py +0 -0
  208. package/.next/standalone/fp-cloud-cli/tests/conftest.py +92 -0
  209. package/.next/standalone/fp-cloud-cli/tests/test_alerting.py +644 -0
  210. package/.next/standalone/fp-cloud-cli/tests/test_analytics.py +385 -0
  211. package/.next/standalone/fp-cloud-cli/tests/test_audits.py +950 -0
  212. package/.next/standalone/fp-cloud-cli/tests/test_auth.py +98 -0
  213. package/.next/standalone/fp-cloud-cli/tests/test_auth_mode.py +272 -0
  214. package/.next/standalone/fp-cloud-cli/tests/test_click_compat.py +118 -0
  215. package/.next/standalone/fp-cloud-cli/tests/test_client.py +299 -0
  216. package/.next/standalone/fp-cloud-cli/tests/test_commands.py +814 -0
  217. package/.next/standalone/fp-cloud-cli/tests/test_config.py +99 -0
  218. package/.next/standalone/fp-cloud-cli/tests/test_dashboards_agent.py +340 -0
  219. package/.next/standalone/fp-cloud-cli/tests/test_dates.py +76 -0
  220. package/.next/standalone/fp-cloud-cli/tests/test_enforcement_logic.py +481 -0
  221. package/.next/standalone/fp-cloud-cli/tests/test_facets.py +170 -0
  222. package/.next/standalone/fp-cloud-cli/tests/test_failproofai_home.py +722 -0
  223. package/.next/standalone/fp-cloud-cli/tests/test_fp_home_contract.py +198 -0
  224. package/.next/standalone/fp-cloud-cli/tests/test_hardening.py +186 -0
  225. package/.next/standalone/fp-cloud-cli/tests/test_help_table_coverage.py +127 -0
  226. package/.next/standalone/fp-cloud-cli/tests/test_keys_queries.py +496 -0
  227. package/.next/standalone/fp-cloud-cli/tests/test_list.py +59 -0
  228. package/.next/standalone/fp-cloud-cli/tests/test_multivalue.py +183 -0
  229. package/.next/standalone/fp-cloud-cli/tests/test_no_customer_identifiers.py +168 -0
  230. package/.next/standalone/fp-cloud-cli/tests/test_operator.py +492 -0
  231. package/.next/standalone/fp-cloud-cli/tests/test_orgs.py +692 -0
  232. package/.next/standalone/fp-cloud-cli/tests/test_output.py +1732 -0
  233. package/.next/standalone/fp-cloud-cli/tests/test_policy_check.py +191 -0
  234. package/.next/standalone/fp-cloud-cli/tests/test_readme_matches_reality.py +125 -0
  235. package/.next/standalone/fp-cloud-cli/tests/test_review_fixes.py +161 -0
  236. package/.next/standalone/fp-cloud-cli/tests/test_telemetry_completeness.py +90 -0
  237. package/.next/standalone/fp-cloud-cli/tests/test_usage.py +115 -0
  238. package/.next/standalone/fp-cloud-cli/tests/test_v1_origin_diagnostic.py +70 -0
  239. package/.next/standalone/fp-cloud-cli/tests/test_v1_routing.py +214 -0
  240. package/.next/standalone/fp-cloud-cli/tests/test_whoami.py +104 -0
  241. package/.next/standalone/fp-cloud-cli/uv.lock +552 -0
  242. package/.next/standalone/package.json +27 -21
  243. package/.next/standalone/sdk/python/CHANGELOG.md +70 -0
  244. package/.next/standalone/sdk/python/LICENSE +42 -0
  245. package/.next/standalone/sdk/python/MANIFEST.in +21 -0
  246. package/.next/standalone/sdk/python/README.md +466 -0
  247. package/.next/standalone/sdk/python/docs/README.md +249 -0
  248. package/.next/standalone/sdk/python/docs/_shared/README.md +43 -0
  249. package/.next/standalone/sdk/python/docs/_shared/__init__.py +195 -0
  250. package/.next/standalone/sdk/python/docs/crewai/README.md +328 -0
  251. package/.next/standalone/sdk/python/docs/crewai/examples/quickstart.py +61 -0
  252. package/.next/standalone/sdk/python/docs/crewai/examples/research_crew.py +92 -0
  253. package/.next/standalone/sdk/python/docs/langgraph/README.md +481 -0
  254. package/.next/standalone/sdk/python/docs/langgraph/examples/quickstart.py +51 -0
  255. package/.next/standalone/sdk/python/docs/langgraph/examples/research_agent.py +86 -0
  256. package/.next/standalone/sdk/python/docs/langgraph/examples/supervisor_handoff.py +83 -0
  257. package/.next/standalone/sdk/python/docs/llama_index/README.md +332 -0
  258. package/.next/standalone/sdk/python/docs/llama_index/examples/quickstart.py +62 -0
  259. package/.next/standalone/sdk/python/docs/llama_index/examples/research_agent.py +93 -0
  260. package/.next/standalone/sdk/python/docs/manual/README.md +491 -0
  261. package/.next/standalone/sdk/python/docs/manual/examples/quickstart.py +57 -0
  262. package/.next/standalone/sdk/python/docs/manual/examples/research_agent.py +133 -0
  263. package/.next/standalone/sdk/python/docs/pydantic_ai/README.md +323 -0
  264. package/.next/standalone/sdk/python/docs/pydantic_ai/examples/quickstart.py +48 -0
  265. package/.next/standalone/sdk/python/docs/pydantic_ai/examples/research_agent.py +94 -0
  266. package/.next/standalone/sdk/python/failproofai_sdk/__init__.py +131 -0
  267. package/.next/standalone/sdk/python/failproofai_sdk/_context.py +218 -0
  268. package/.next/standalone/sdk/python/failproofai_sdk/_environment.py +78 -0
  269. package/.next/standalone/sdk/python/failproofai_sdk/_events.py +752 -0
  270. package/.next/standalone/sdk/python/failproofai_sdk/_resolver.py +118 -0
  271. package/.next/standalone/sdk/python/failproofai_sdk/_runtime.py +21 -0
  272. package/.next/standalone/sdk/python/failproofai_sdk/_schema.py +317 -0
  273. package/.next/standalone/sdk/python/failproofai_sdk/_scopes.py +422 -0
  274. package/.next/standalone/sdk/python/failproofai_sdk/_version.py +1 -0
  275. package/.next/standalone/sdk/python/failproofai_sdk/_writer.py +750 -0
  276. package/.next/standalone/sdk/python/failproofai_sdk/integrations/__init__.py +274 -0
  277. package/.next/standalone/sdk/python/failproofai_sdk/integrations/_compat.py +247 -0
  278. package/.next/standalone/sdk/python/failproofai_sdk/integrations/_core.py +1076 -0
  279. package/.next/standalone/sdk/python/failproofai_sdk/integrations/crewai.py +1669 -0
  280. package/.next/standalone/sdk/python/failproofai_sdk/integrations/langchain.py +2151 -0
  281. package/.next/standalone/sdk/python/failproofai_sdk/integrations/llama_index.py +1588 -0
  282. package/.next/standalone/sdk/python/failproofai_sdk/integrations/pydantic_ai.py +977 -0
  283. package/.next/standalone/sdk/python/failproofai_sdk/py.typed +0 -0
  284. package/.next/standalone/sdk/python/pyproject.toml +92 -0
  285. package/.next/standalone/sdk/python/skill/SKILL.md +399 -0
  286. package/.next/standalone/sdk/python/skill/agents/openai.yaml +8 -0
  287. package/.next/standalone/sdk/python/skill/references/events.md +234 -0
  288. package/.next/standalone/sdk/python/skill/references/frameworks.md +314 -0
  289. package/.next/standalone/sdk/python/skill/references/install.md +100 -0
  290. package/.next/standalone/sdk/python/skill/references/integration.md +352 -0
  291. package/.next/standalone/sdk/python/tests/__init__.py +0 -0
  292. package/.next/standalone/sdk/python/tests/conftest.py +169 -0
  293. package/.next/standalone/sdk/python/tests/integrations/__init__.py +6 -0
  294. package/.next/standalone/sdk/python/tests/integrations/test_crewai.py +1299 -0
  295. package/.next/standalone/sdk/python/tests/integrations/test_langchain.py +2338 -0
  296. package/.next/standalone/sdk/python/tests/integrations/test_llama_index.py +1576 -0
  297. package/.next/standalone/sdk/python/tests/integrations/test_pydantic_ai.py +1102 -0
  298. package/.next/standalone/sdk/python/tests/test_context.py +410 -0
  299. package/.next/standalone/sdk/python/tests/test_docs.py +411 -0
  300. package/.next/standalone/sdk/python/tests/test_durability.py +1352 -0
  301. package/.next/standalone/sdk/python/tests/test_encoding.py +571 -0
  302. package/.next/standalone/sdk/python/tests/test_integrations.py +1127 -0
  303. package/.next/standalone/sdk/python/tests/test_no_customer_identifiers.py +214 -0
  304. package/.next/standalone/sdk/python/tests/test_packaging.py +185 -0
  305. package/.next/standalone/sdk/python/tests/test_resolver_umbrella.py +178 -0
  306. package/.next/standalone/sdk/python/tests/test_scopes.py +487 -0
  307. package/.next/standalone/sdk/python/tests/test_sdk.py +923 -0
  308. package/.next/standalone/sdk/python/tests/test_server_contract.py +650 -0
  309. package/.next/standalone/sdk/python/tests/test_site_docs.py +371 -0
  310. package/.next/standalone/sdk/python/tests/test_skill_snippets.py +165 -0
  311. package/.next/standalone/sdk/python/tests/test_spool_contract.py +287 -0
  312. package/.next/standalone/sdk/python/tests/test_spool_creation.py +360 -0
  313. package/.next/standalone/sdk/python/tests/test_wire_format.py +279 -0
  314. package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +378 -0
  315. package/.next/standalone/sdk/python/uv.lock +6005 -0
  316. package/.next/standalone/server.js +1 -1
  317. package/README.md +77 -21
  318. package/bin/failproofai.mjs +579 -306
  319. package/dist/cli.mjs +6499 -3662
  320. package/dist/index.js +5 -5
  321. package/dist/worker.mjs +2390 -1978
  322. package/package.json +27 -21
  323. package/scripts/build-policy-pack.mjs +121 -0
  324. package/scripts/changelog-section.py +77 -0
  325. package/scripts/prune-standalone.mjs +3 -0
  326. package/scripts/python-version.py +232 -0
  327. package/scripts/translate-docs/cli.ts +21 -0
  328. package/scripts/translate-docs/mintlify-nav.ts +85 -13
  329. package/scripts/translate-docs/translator.ts +66 -11
  330. package/src/audit/cache.ts +40 -3
  331. package/src/audit/cli.ts +1 -1
  332. package/src/audit/index.ts +1 -1
  333. package/src/audit/replay.ts +89 -3
  334. package/src/audit/report.ts +5 -5
  335. package/src/audit/schedule-cli.ts +49 -53
  336. package/src/hooks/builtin-policies.ts +217 -579
  337. package/src/hooks/cloud-enrollment-cli.ts +66 -27
  338. package/src/hooks/cloud-managed-policies.ts +6 -1
  339. package/src/hooks/configure-wizard.ts +56 -369
  340. package/src/hooks/custom-hooks-loader.ts +89 -6
  341. package/src/hooks/fp-home.ts +92 -4
  342. package/src/hooks/fp-reset.ts +34 -2
  343. package/src/hooks/handler.ts +181 -11
  344. package/src/hooks/harness-cli.ts +79 -25
  345. package/src/hooks/hook-activity-store.ts +13 -3
  346. package/src/hooks/install-prompt.ts +25 -3
  347. package/src/hooks/manager.ts +424 -172
  348. package/src/hooks/migrations.ts +2 -2
  349. package/src/hooks/pack-cli.ts +885 -0
  350. package/src/hooks/pack-failclosed.ts +189 -0
  351. package/src/hooks/pack-manifest.ts +352 -0
  352. package/src/hooks/pack-store.ts +891 -0
  353. package/src/hooks/policy-catalog.ts +535 -0
  354. package/src/hooks/policy-evaluator.ts +24 -16
  355. package/src/hooks/policy-registry.ts +8 -2
  356. package/src/hooks/policy-types.ts +26 -0
  357. package/src/hooks/session-pause-cli.ts +33 -9
  358. package/src/hooks/tui.ts +695 -39
  359. package/src/hooks/types.ts +15 -1
  360. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_usx0j._.js +0 -3
  361. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_zk340._.js +0 -3
  362. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0agdw2a._.js +0 -3
  363. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d1u_na._.js +0 -3
  364. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +0 -3
  365. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +0 -3
  366. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +0 -3
  367. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +0 -3
  368. package/.next/standalone/.next/server/chunks/_1ger0a2._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +0 -3
  370. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_1iiwm5e._.js +0 -3
  371. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07tbbf3._.js +0 -3
  372. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kc8_v5._.js +0 -4
  373. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kgy9da._.js +0 -4
  374. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mhqk5a._.js +0 -4
  375. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pltpn8._.js +0 -4
  376. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qkcyf-._.js +0 -4
  377. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0x_ok._.js +0 -4
  378. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1_dfocn._.js +0 -4
  379. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1bfex62._.js +0 -5
  380. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kzapg5._.js +0 -6
  381. package/.next/standalone/.next/server/chunks/ssr/_0lvyuv4._.js +0 -23
  382. package/.next/standalone/.next/static/chunks/2_2lhuojq2xop.js +0 -1
  383. package/.next/standalone/.next/static/chunks/36fw6yk1s6x_f.js +0 -1
  384. package/.next/standalone/.next/static/chunks/3k7mxbp9hiom0.js +0 -1
  385. package/.next/standalone/.next/static/chunks/3tzq0260n17ae.js +0 -6
  386. package/.next/standalone/.next/static/chunks/3wq9x0c-7ld5d.css +0 -2
  387. package/src/hooks/policy-presets.ts +0 -135
  388. /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → I5kEb9kSgYS63j4iqfVLO}/_buildManifest.js +0 -0
  389. /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → I5kEb9kSgYS63j4iqfVLO}/_clientMiddlewareManifest.js +0 -0
  390. /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → I5kEb9kSgYS63j4iqfVLO}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@ import { useState, useEffect, useCallback, useMemo, useRef, useTransition } from
4
4
  import * as React from "react";
5
5
  import { createPortal } from "react-dom";
6
6
  import Link from "next/link";
7
- import { Check, ChevronDown, Code, Copy, Settings, Shield, ShieldAlert, ShieldCheck, ShieldX, TriangleAlert, X } from "lucide-react";
7
+ import { Check, ChevronDown, Code, Copy, Package, Plus, Settings, Shield, ShieldAlert, ShieldCheck, ShieldX, Trash2, TriangleAlert, X } from "lucide-react";
8
8
  import PaginationControls from "@/app/components/pagination-controls";
9
9
  import { getHookActivityAction, searchHookActivityAction } from "@/app/actions/get-hook-activity";
10
10
  import type { HookActivityPayload } from "@/app/actions/get-hook-activity";
@@ -12,9 +12,17 @@ import { getActivePausesAction } from "@/app/actions/get-active-pauses";
12
12
  import type { ActivePause } from "@/src/hooks/session-pause";
13
13
  import { PausedBanner, PausedNote, PausedPill } from "@/app/components/pause-notices";
14
14
  import { getHooksConfigAction } from "@/app/actions/get-hooks-config";
15
- import type { HooksConfigPayload, PolicyInfo } from "@/app/actions/get-hooks-config";
15
+ import type { HooksConfigPayload, InstalledPackInfo, PolicyInfo } from "@/app/actions/get-hooks-config";
16
16
  import type { IntegrationType } from "@/src/hooks/types";
17
- import { toggleCustomPolicyAction, togglePolicyAction } from "@/app/actions/update-hooks-config";
17
+ import { toggleCustomPolicyAction } from "@/app/actions/update-hooks-config";
18
+ import {
19
+ addBundledPackWebAction,
20
+ addPackWebAction,
21
+ previewPackWebAction,
22
+ removePackWebAction,
23
+ togglePackPolicyAction,
24
+ } from "@/app/actions/pack-actions";
25
+ import type { PackPreviewResult } from "@/app/actions/pack-actions";
18
26
  import { installHooksWebAction, removeHooksWebAction } from "@/app/actions/install-hooks-web";
19
27
  import { updatePolicyParamsAction } from "@/app/actions/update-policy-params";
20
28
  import { useAutoRefresh } from "@/contexts/AutoRefreshContext";
@@ -481,9 +489,9 @@ function ActivityTab({
481
489
  const v = url.get("cli");
482
490
  return isKnownCli(v) ? v : "";
483
491
  });
484
- const [filterSource, setFilterSource] = useState<"" | "builtin" | "custom" | "convention" | "cloud">(() => {
492
+ const [filterSource, setFilterSource] = useState<"" | "custom" | "convention" | "cloud" | "pack">(() => {
485
493
  const v = url.get("source");
486
- return v === "builtin" || v === "custom" || v === "convention" || v === "cloud" ? v : "";
494
+ return v === "custom" || v === "convention" || v === "cloud" || v === "pack" ? v : "";
487
495
  });
488
496
  const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
489
497
  const filterTelemetryFirstRunRef = useRef(true);
@@ -654,17 +662,17 @@ function ActivityTab({
654
662
  onChange={(e) => {
655
663
  const v = e.target.value;
656
664
  setFilterSource(
657
- v === "builtin" || v === "custom" || v === "convention" || v === "cloud" ? v : "",
665
+ v === "custom" || v === "convention" || v === "cloud" || v === "pack" ? v : "",
658
666
  );
659
667
  }}
660
668
  className="filter-input"
661
669
  aria-label="Filter by policy source"
662
670
  >
663
671
  <option value="">all sources</option>
664
- <option value="builtin">builtin</option>
665
672
  <option value="custom">custom</option>
666
673
  <option value="convention">convention</option>
667
674
  <option value="cloud">cloud</option>
675
+ <option value="pack">pack</option>
668
676
  </select>
669
677
  </div>
670
678
  <div className="filter-group">
@@ -1259,7 +1267,16 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1259
1267
  });
1260
1268
  };
1261
1269
 
1262
- const handleToggle = (name: string, currentlyEnabled: boolean) => {
1270
+ /**
1271
+ * Turn one policy on or off.
1272
+ *
1273
+ * Writes the PACK's selection, because that is what enforcement reads now.
1274
+ * `togglePolicyAction` edits `enabledPolicies`, which stopped deciding
1275
+ * anything the moment this build stopped registering builtins — leaving the
1276
+ * toggle pointed there would have moved a switch that changes nothing.
1277
+ */
1278
+ const handleToggle = (policy: PolicyInfo, currentlyEnabled: boolean) => {
1279
+ const name = policy.name;
1263
1280
  if (!config) return;
1264
1281
  const installed = config.clis.some((c) => c.installed);
1265
1282
  if (!installed) {
@@ -1275,14 +1292,21 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1275
1292
  policies: prev.policies.map((p) =>
1276
1293
  p.name === name ? { ...p, enabled: !currentlyEnabled } : p,
1277
1294
  ),
1278
- enabledPolicies: currentlyEnabled
1279
- ? prev.enabledPolicies.filter((n) => n !== name)
1280
- : [...prev.enabledPolicies, name],
1295
+ packs: prev.packs.map((pack) =>
1296
+ pack.id === policy.packId
1297
+ ? {
1298
+ ...pack,
1299
+ policies: pack.policies.map((p) =>
1300
+ p.name === name ? { ...p, enabled: !currentlyEnabled } : p,
1301
+ ),
1302
+ }
1303
+ : pack,
1304
+ ),
1281
1305
  };
1282
1306
  });
1283
1307
  startTransition(async () => {
1284
1308
  try {
1285
- await togglePolicyAction(name, !currentlyEnabled);
1309
+ await togglePackPolicyAction(policy.packId, name, !currentlyEnabled);
1286
1310
  } catch {
1287
1311
  fireActionError("policy_toggle", "Failed to save policy change.");
1288
1312
  reload();
@@ -1564,7 +1588,18 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1564
1588
  {/* Policy summary */}
1565
1589
  <div className="flex items-center gap-2 px-4 py-2 border-b border-border/40 bg-muted/5">
1566
1590
  <span className="text-xs text-muted-foreground">
1567
- <span className="font-semibold text-foreground">{config.enabledPolicies.length}</span>
1591
+ {/* What is actually ON, counted from the policies rendered below.
1592
+ `enabledPolicies` is the old builtin switch list — it stopped
1593
+ deciding anything when this build stopped registering builtins, so
1594
+ counting it reported a number matching nothing on screen. */}
1595
+ <span className="font-semibold text-foreground">
1596
+ {config.policies.filter((p) => p.enabled).length +
1597
+ (config.customPolicies?.filter((p) => p.enabled).length ?? 0) +
1598
+ (config.conventionPolicies?.reduce(
1599
+ (n, e) => n + e.policies.filter((p) => p.enabled).length,
1600
+ 0,
1601
+ ) ?? 0)}
1602
+ </span>
1568
1603
  {" / "}
1569
1604
  {config.policies.length + (config.customPolicies?.length ?? 0) + (config.conventionPolicies?.reduce((n, e) => n + e.policies.length, 0) ?? 0)}{" "}
1570
1605
  policies enabled
@@ -1614,7 +1649,7 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1614
1649
  <div className="mt-0.5 shrink-0">
1615
1650
  <PolicyToggle
1616
1651
  enabled={policy.enabled}
1617
- onChange={() => handleToggle(policy.name, policy.enabled)}
1652
+ onChange={() => handleToggle(policy, policy.enabled)}
1618
1653
  disabled={isPending}
1619
1654
  />
1620
1655
  </div>
@@ -1791,11 +1826,281 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1791
1826
  )}
1792
1827
  </div>
1793
1828
  ))}
1829
+
1830
+ {/* Policy packs — sets of policies published as a GitHub release. Anyone
1831
+ can publish one from their own repository, so this is the surface that
1832
+ makes an installed pack visible and switchable without the CLI. */}
1833
+ <PackSection
1834
+ packs={config.packs ?? []}
1835
+ disabled={isPending}
1836
+ onChanged={reload}
1837
+ onError={(message) => fireActionError("pack_action", message)}
1838
+ />
1794
1839
  </div>
1795
1840
  </>
1796
1841
  );
1797
1842
  }
1798
1843
 
1844
+ /** Install a pack, and manage the ones already installed. */
1845
+ function PackSection({
1846
+ packs,
1847
+ disabled,
1848
+ onChanged,
1849
+ onError,
1850
+ }: {
1851
+ packs: InstalledPackInfo[];
1852
+ disabled?: boolean;
1853
+ onChanged: () => void;
1854
+ onError: (message: string) => void;
1855
+ }) {
1856
+ const [source, setSource] = useState("");
1857
+ const [busy, setBusy] = useState<string | null>(null);
1858
+ const [installed, setInstalled] = useState<string | null>(null);
1859
+ const [preview, setPreview] = useState<PackPreviewResult | null>(null);
1860
+ const { capture } = usePostHog();
1861
+
1862
+ // Reading a pack before installing it. Fetches the manifest only — the entry
1863
+ // artifact is never downloaded, so looking at a stranger's pack cannot run a
1864
+ // stranger's code inside this server.
1865
+ const runPreview = async () => {
1866
+ if (!source.trim()) return;
1867
+ setBusy("preview");
1868
+ setPreview(null);
1869
+ try {
1870
+ const result = await previewPackWebAction(source);
1871
+ if (!result.ok) {
1872
+ onError(result.error ?? "Could not read that pack.");
1873
+ return;
1874
+ }
1875
+ setPreview(result);
1876
+ } finally {
1877
+ setBusy(null);
1878
+ }
1879
+ };
1880
+
1881
+ const run = async (label: string, action: () => Promise<{ ok: boolean; id?: string; version?: string; error?: string }>) => {
1882
+ setBusy(label);
1883
+ setInstalled(null);
1884
+ try {
1885
+ const result = await action();
1886
+ if (!result.ok) {
1887
+ // The refusal's own words. Every one of them names what was wrong —
1888
+ // a source that resolves to nothing, a digest that does not match, a
1889
+ // manifest declaring a policy its artifact never registers.
1890
+ onError(result.error ?? "Could not install that pack.");
1891
+ return;
1892
+ }
1893
+ setInstalled(result.version ? `${result.id}@${result.version}` : (result.id ?? null));
1894
+ setSource("");
1895
+ onChanged();
1896
+ } catch (err) {
1897
+ onError(err instanceof Error ? err.message : "Could not install that pack.");
1898
+ } finally {
1899
+ setBusy(null);
1900
+ }
1901
+ };
1902
+
1903
+ return (
1904
+ <div>
1905
+ <div className="flex items-center justify-between px-4 py-2.5 bg-muted/20 border-b border-border/50">
1906
+ <span className="text-[0.7rem] font-semibold uppercase tracking-wider text-muted-foreground">
1907
+ Policy Packs
1908
+ </span>
1909
+ <span className="text-[0.7rem] text-muted-foreground">
1910
+ {packs.length === 0 ? "none installed" : `${packs.length} installed`}
1911
+ </span>
1912
+ </div>
1913
+
1914
+ {/* Install by name — any owner/repo on GitHub, not only ours. */}
1915
+ <div className="flex flex-wrap items-center gap-2 px-4 py-3 border-b border-border/20">
1916
+ <input
1917
+ value={source}
1918
+ onChange={(e) => setSource(e.target.value)}
1919
+ onKeyDown={(e) => {
1920
+ if (e.key === "Enter" && source.trim() && !busy) {
1921
+ capture("pack_install_submitted", { via: "input" });
1922
+ void run("input", () => addPackWebAction(source));
1923
+ }
1924
+ }}
1925
+ placeholder="core · acme/ops · acme/ops@v1.2.0 · a release URL"
1926
+ spellCheck={false}
1927
+ disabled={disabled || busy !== null}
1928
+ className="flex-1 min-w-[16rem] rounded-md border border-border/60 bg-background px-2.5 py-1.5 text-xs font-mono placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-ring disabled:opacity-50"
1929
+ aria-label="Pack source"
1930
+ />
1931
+ <Button
1932
+ size="sm"
1933
+ variant="outline"
1934
+ disabled={disabled || busy !== null || source.trim().length === 0}
1935
+ onClick={() => {
1936
+ capture("pack_preview_submitted", {});
1937
+ void runPreview();
1938
+ }}
1939
+ >
1940
+ {busy === "preview" ? "Reading…" : "Preview"}
1941
+ </Button>
1942
+ <Button
1943
+ size="sm"
1944
+ variant="default"
1945
+ disabled={disabled || busy !== null || source.trim().length === 0}
1946
+ onClick={() => {
1947
+ capture("pack_install_submitted", { via: "button" });
1948
+ void run("input", () => addPackWebAction(source));
1949
+ }}
1950
+ >
1951
+ <Plus className="h-3.5 w-3.5" />
1952
+ {busy === "input" ? "Installing…" : "Install"}
1953
+ </Button>
1954
+ </div>
1955
+
1956
+ {/* What the pack CONTAINS, read from its manifest before anything is
1957
+ installed. Marks are the publisher's defaults, not this machine's
1958
+ state — nothing is installed, so an "on" would describe no machine. */}
1959
+ {preview?.ok && (
1960
+ <div className="border-b border-border/20 bg-muted/5">
1961
+ <div className="flex items-center gap-3 px-4 py-2.5">
1962
+ <Package className="h-3.5 w-3.5 text-muted-foreground shrink-0" />
1963
+ <span className="text-xs font-mono text-foreground">
1964
+ {preview.id}@{preview.version}
1965
+ </span>
1966
+ <span className="text-[0.7rem] text-muted-foreground">
1967
+ {preview.policies?.length ?? 0} policies ·{" "}
1968
+ {preview.policies?.filter((p) => p.defaultEnabled).length ?? 0} on by default
1969
+ </span>
1970
+ {preview.effect === "observe" && (
1971
+ <span className="text-[0.65rem] uppercase tracking-wider text-amber-500">
1972
+ observes only
1973
+ </span>
1974
+ )}
1975
+ <button
1976
+ onClick={() => setPreview(null)}
1977
+ className="ml-auto text-muted-foreground/60 hover:text-foreground"
1978
+ aria-label="Close preview"
1979
+ >
1980
+ <X className="h-3.5 w-3.5" />
1981
+ </button>
1982
+ </div>
1983
+ <div className="max-h-64 overflow-y-auto">
1984
+ {preview.policies?.map((policy) => (
1985
+ <div key={policy.name} className="flex items-start gap-3 px-4 py-2 border-t border-border/10">
1986
+ <span
1987
+ className={`text-[0.65rem] uppercase tracking-wider w-14 shrink-0 mt-0.5 ${
1988
+ policy.defaultEnabled ? "text-emerald-500" : "text-muted-foreground/50"
1989
+ }`}
1990
+ >
1991
+ {policy.defaultEnabled ? "default" : "opt-in"}
1992
+ </span>
1993
+ <span className="text-xs font-mono text-foreground w-56 shrink-0 truncate">
1994
+ {policy.name}
1995
+ </span>
1996
+ <span className="text-xs text-muted-foreground leading-relaxed min-w-0">
1997
+ {policy.description}
1998
+ <span className="block text-[0.65rem] text-muted-foreground/40 font-mono mt-0.5">
1999
+ {policy.category}
2000
+ </span>
2001
+ </span>
2002
+ </div>
2003
+ ))}
2004
+ </div>
2005
+ <div className="px-4 py-2.5 border-t border-border/20">
2006
+ <Button
2007
+ size="sm"
2008
+ variant="default"
2009
+ disabled={disabled || busy !== null}
2010
+ onClick={() => {
2011
+ capture("pack_install_submitted", { via: "preview" });
2012
+ void run("input", () => addPackWebAction(source)).then(() => setPreview(null));
2013
+ }}
2014
+ >
2015
+ <Plus className="h-3.5 w-3.5" />
2016
+ Install its defaults
2017
+ </Button>
2018
+ </div>
2019
+ </div>
2020
+ )}
2021
+
2022
+ {/* Ours, in one click — both the released pack and the copy that ships
2023
+ inside this package, which needs no network at all. */}
2024
+ <div className="flex flex-wrap items-center gap-2 px-4 py-2.5 border-b border-border/20 bg-muted/10">
2025
+ <span className="text-[0.7rem] text-muted-foreground/70 mr-1">Failproof AI policies:</span>
2026
+ <Button
2027
+ size="sm"
2028
+ variant="outline"
2029
+ disabled={disabled || busy !== null}
2030
+ onClick={() => {
2031
+ capture("pack_install_submitted", { via: "ours" });
2032
+ void run("ours", () => addPackWebAction("FailproofAI/policies"));
2033
+ }}
2034
+ >
2035
+ {busy === "ours" ? "Installing…" : "Install from GitHub"}
2036
+ </Button>
2037
+ <Button
2038
+ size="sm"
2039
+ variant="outline"
2040
+ disabled={disabled || busy !== null}
2041
+ onClick={() => {
2042
+ capture("pack_install_submitted", { via: "bundled" });
2043
+ void run("bundled", () => addBundledPackWebAction());
2044
+ }}
2045
+ >
2046
+ {busy === "bundled" ? "Installing…" : "Install offline copy"}
2047
+ </Button>
2048
+ {installed && (
2049
+ <span className="text-[0.7rem] text-emerald-500 font-mono">installed {installed}</span>
2050
+ )}
2051
+ </div>
2052
+
2053
+ {packs.map((pack) => (
2054
+ <div key={`${pack.id}@${pack.version}`}>
2055
+ <div className="flex items-center gap-3 px-4 py-3 border-b border-border/20">
2056
+ <Package className="h-3.5 w-3.5 text-muted-foreground shrink-0" />
2057
+ <span className="text-xs font-mono text-foreground truncate">
2058
+ {pack.id}{pack.version ? `@${pack.version}` : ""}
2059
+ </span>
2060
+ {pack.effect === "observe" && (
2061
+ <span className="text-[0.65rem] uppercase tracking-wider text-amber-500">observing</span>
2062
+ )}
2063
+ <span className="text-[0.65rem] text-muted-foreground/50 font-mono truncate hidden lg:inline">
2064
+ {pack.source}
2065
+ </span>
2066
+ <button
2067
+ onClick={() => void run(pack.id, () => removePackWebAction(pack.id))}
2068
+ disabled={disabled || busy !== null}
2069
+ className="ml-auto text-muted-foreground/60 hover:text-foreground disabled:opacity-40"
2070
+ aria-label={`Remove ${pack.id}`}
2071
+ >
2072
+ <Trash2 className="h-3.5 w-3.5" />
2073
+ </button>
2074
+ </div>
2075
+
2076
+ {pack.error ? (
2077
+ // A pack that will not load is what the machine denies for. Saying
2078
+ // it here is the difference between a fixable problem and a
2079
+ // mysterious one.
2080
+ <div className="flex items-start gap-2 px-4 py-2.5 border-b border-border/20 bg-amber-500/5">
2081
+ <TriangleAlert className="h-3.5 w-3.5 text-amber-500 shrink-0 mt-0.5" />
2082
+ <p className="text-[0.7rem] text-muted-foreground leading-relaxed">
2083
+ This pack will not load: {pack.error}
2084
+ </p>
2085
+ </div>
2086
+ ) : (
2087
+ // NOT a second list of the pack's policies. Every policy that
2088
+ // enforces here is in the categorised list above, whichever pack it
2089
+ // came from — rendering them again under the pack made the same
2090
+ // toggles appear twice, the second time with no category.
2091
+ <div className="flex items-center gap-3 px-4 py-2.5 border-b border-border/20">
2092
+ <span className="text-[0.7rem] text-muted-foreground">
2093
+ {pack.policies.filter((p) => p.enabled).length} of {pack.policies.length} on —
2094
+ listed by category above
2095
+ </span>
2096
+ </div>
2097
+ )}
2098
+ </div>
2099
+ ))}
2100
+ </div>
2101
+ );
2102
+ }
2103
+
1799
2104
  // -- Tab Bar --
1800
2105
 
1801
2106
  function TabBar({
@@ -1951,7 +2256,7 @@ export default function HooksClient({ initialTab = "activity" }: { initialTab?:
1951
2256
  margin: "0 0 24px",
1952
2257
  }}
1953
2258
  >
1954
- switch policies on or off across your installed agent CLIs.
2259
+ switch policies on or off across your installed harnesses.
1955
2260
  </p>
1956
2261
  )}
1957
2262
 
@@ -27,40 +27,14 @@ const NAV_LINKS = [
27
27
  { href: "/audit", label: "audit" },
28
28
  ];
29
29
 
30
- const REMOTE_LOGO_URL =
31
- "https://exospherehost.slack.com/archives/C0B6RL08SLF/p1780910285021619?thread_ts=1780910239.057609&cid=C0B6RL08SLF";
32
- const LOCAL_LOGO_URL = "/logo.svg";
33
-
34
- /** Resolves the brand logo: first tries the remote URL, falls back to the
35
- * bundled asset (served from /public, mirrored at assets/logos/company/logo.svg)
36
- * if the fetch fails for any reason. */
37
- const useBrandLogo = (): string => {
38
- const [src, setSrc] = React.useState<string>(LOCAL_LOGO_URL);
39
- React.useEffect(() => {
40
- let cancelled = false;
41
- (async () => {
42
- try {
43
- const res = await fetch(REMOTE_LOGO_URL, { method: "GET", mode: "cors" });
44
- if (!res.ok) throw new Error(`status ${res.status}`);
45
- const blob = await res.blob();
46
- const url = URL.createObjectURL(blob);
47
- if (cancelled) URL.revokeObjectURL(url);
48
- else setSrc(url);
49
- } catch {
50
- if (!cancelled) setSrc(LOCAL_LOGO_URL);
51
- }
52
- })();
53
- return () => { cancelled = true; };
54
- }, []);
55
- return src;
56
- };
30
+ const LOGO_URL = "/logo.svg";
57
31
 
58
32
  export const Navbar: React.FC<{
59
33
  disabledPages?: string[];
60
34
  }> = ({ disabledPages = [] }) => {
61
35
  const pathname = usePathname();
62
36
  const { capture } = usePostHog();
63
- const logoSrc = useBrandLogo();
37
+ const logoSrc = LOGO_URL;
64
38
 
65
39
  const sectionLabel = (() => {
66
40
  if (pathname.startsWith("/policies")) return "policies";
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
 
4
4
  import React, { useState, useCallback } from "react";
5
- import { GitBranch, ChevronDown, Star, BookOpen, MessageCircle, MessageSquareWarning } from "lucide-react";
5
+ import { GitBranch, ChevronDown, Star, BookOpen, MessageCircle, MessagesSquare, MessageSquareWarning } from "lucide-react";
6
6
  import { Button } from "@/components/ui/button";
7
7
 
8
8
  const CONTACT_EMAIL = "failproofai@exosphere.host";
@@ -29,6 +29,13 @@ const options = [
29
29
  color: "#5865f2",
30
30
  bg: "rgba(88,101,242,0.08)",
31
31
  },
32
+ {
33
+ label: "Join r/failproofai",
34
+ icon: MessagesSquare,
35
+ href: "https://www.reddit.com/r/failproofai/",
36
+ color: "#ff4500",
37
+ bg: "rgba(255,69,0,0.08)",
38
+ },
32
39
  {
33
40
  label: "Feedback & Issues",
34
41
  icon: MessageSquareWarning,
@@ -48,7 +48,7 @@ They hand off in that order: this skill gets events flowing, the evaluator score
48
48
  ## Prerequisites
49
49
 
50
50
  1. **Python 3.10+** and the agent codebase you want to instrument.
51
- 2. **The SDK.** It is distributed to customers as a private wheel rather than from a public index your onboarding covers how to get it and install it. The skill knows the install path and will ask you rather than guess if it cannot find it.
51
+ 2. **The SDK.** `pip install failproofai-sdk` (or `uv add failproofai-sdk`). The skill knows the install path, including the one command to avoid `pip install agenteye` resolves to a stranded release of an older CLI, not to this SDK.
52
52
  3. **Nothing else.** No dashboard login, no API key, no network. The skill verifies against the event files the SDK writes, so it can finish and prove its work offline.
53
53
 
54
54
  ## Where to get it