failproofai 1.0.1 → 1.0.2-beta.0

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 (389) 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]__0oa1lav._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +6 -0
  99. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07tbbf3._.js → [root-of-the-server]__0zig5sv._.js} +2 -2
  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/{_0lvyuv4._.js → _00e9tnf._.js} +2 -2
  103. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  104. package/.next/standalone/.next/server/chunks/ssr/{_0u5zauv._.js → _12l4a_k._.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/{37fcpc36x9gpe.js → 0eqky-7n7dgdm.js} +1 -1
  121. package/.next/standalone/.next/static/chunks/{1ide1wl2f7zi1.js → 0sa9v5mhc8861.js} +13 -13
  122. package/.next/standalone/.next/static/chunks/1mfzsja6ftim5.css +2 -0
  123. package/.next/standalone/.next/static/chunks/{3k7mxbp9hiom0.js → 1nuqytbta44af.js} +1 -1
  124. package/.next/standalone/.next/static/chunks/1sl2xmn9inx3y.js +6 -0
  125. package/.next/standalone/.next/static/chunks/{2_2lhuojq2xop.js → 2aawsjld9ied_.js} +1 -1
  126. package/.next/standalone/.next/static/chunks/2gn7ut4svofm2.js +1 -0
  127. package/.next/standalone/.next/static/chunks/{31s1smp-g7gks.js → 2hs7ycvsav7v2.js} +1 -1
  128. package/.next/standalone/.next/static/chunks/{0k5050ezjvv49.js → 2i2yt3hzjredm.js} +1 -1
  129. package/.next/standalone/.next/static/chunks/{3c808qrfcq0im.js → 35xg6retpe6rp.js} +1 -1
  130. package/.next/standalone/.next/static/chunks/{2zpp1we2jv6tb.js → 3y54nw0i7dsjl.js} +1 -1
  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 +153 -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 -14
  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 +29 -22
  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 +145 -11
  319. package/dist/cli.mjs +4482 -2205
  320. package/dist/index.js +5 -5
  321. package/dist/worker.mjs +2399 -1978
  322. package/package.json +29 -22
  323. package/policy-pack/SHA256SUMS +2 -0
  324. package/policy-pack/failproofai-pack.json +732 -0
  325. package/policy-pack/failproofai-pack.mjs +2017 -0
  326. package/scripts/build-policy-pack.mjs +121 -0
  327. package/scripts/changelog-section.py +77 -0
  328. package/scripts/prune-standalone.mjs +3 -0
  329. package/scripts/python-version.py +232 -0
  330. package/scripts/translate-docs/cli.ts +21 -0
  331. package/scripts/translate-docs/mintlify-nav.ts +85 -13
  332. package/scripts/translate-docs/translator.ts +66 -11
  333. package/src/audit/cache.ts +40 -3
  334. package/src/audit/cli.ts +1 -1
  335. package/src/audit/index.ts +1 -1
  336. package/src/audit/replay.ts +89 -3
  337. package/src/audit/report.ts +5 -5
  338. package/src/audit/schedule-cli.ts +49 -53
  339. package/src/hooks/builtin-policies.ts +217 -579
  340. package/src/hooks/cloud-enrollment-cli.ts +66 -27
  341. package/src/hooks/cloud-managed-policies.ts +6 -1
  342. package/src/hooks/configure-wizard.ts +1 -1
  343. package/src/hooks/custom-hooks-loader.ts +89 -6
  344. package/src/hooks/fp-home.ts +92 -4
  345. package/src/hooks/fp-reset.ts +26 -2
  346. package/src/hooks/handler.ts +181 -11
  347. package/src/hooks/harness-cli.ts +79 -25
  348. package/src/hooks/hook-activity-store.ts +13 -3
  349. package/src/hooks/install-prompt.ts +25 -3
  350. package/src/hooks/manager.ts +418 -172
  351. package/src/hooks/migrations.ts +2 -2
  352. package/src/hooks/pack-cli.ts +505 -0
  353. package/src/hooks/pack-failclosed.ts +189 -0
  354. package/src/hooks/pack-manifest.ts +344 -0
  355. package/src/hooks/pack-store.ts +930 -0
  356. package/src/hooks/policy-catalog.ts +535 -0
  357. package/src/hooks/policy-evaluator.ts +24 -16
  358. package/src/hooks/policy-presets.ts +4 -2
  359. package/src/hooks/policy-registry.ts +8 -2
  360. package/src/hooks/policy-types.ts +26 -0
  361. package/src/hooks/session-pause-cli.ts +33 -9
  362. package/src/hooks/tui.ts +570 -0
  363. package/src/hooks/types.ts +15 -1
  364. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_usx0j._.js +0 -3
  365. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_zk340._.js +0 -3
  366. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0agdw2a._.js +0 -3
  367. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d1u_na._.js +0 -3
  368. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +0 -3
  370. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +0 -3
  371. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +0 -3
  372. package/.next/standalone/.next/server/chunks/_1ger0a2._.js +0 -3
  373. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +0 -3
  374. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_1iiwm5e._.js +0 -3
  375. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kc8_v5._.js +0 -4
  376. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kgy9da._.js +0 -4
  377. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mhqk5a._.js +0 -4
  378. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pltpn8._.js +0 -4
  379. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qkcyf-._.js +0 -4
  380. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0x_ok._.js +0 -4
  381. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1_dfocn._.js +0 -4
  382. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1bfex62._.js +0 -5
  383. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kzapg5._.js +0 -6
  384. package/.next/standalone/.next/static/chunks/36fw6yk1s6x_f.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/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → nwbyWT06Ud0XdXOrVJyvS}/_buildManifest.js +0 -0
  388. /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → nwbyWT06Ud0XdXOrVJyvS}/_clientMiddlewareManifest.js +0 -0
  389. /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → nwbyWT06Ud0XdXOrVJyvS}/_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<"" | "builtin" | "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 === "builtin" || 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,7 +662,7 @@ 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 === "builtin" || v === "custom" || v === "convention" || v === "cloud" || v === "pack" ? v : "",
658
666
  );
659
667
  }}
660
668
  className="filter-input"
@@ -665,6 +673,7 @@ function ActivityTab({
665
673
  <option value="custom">custom</option>
666
674
  <option value="convention">convention</option>
667
675
  <option value="cloud">cloud</option>
676
+ <option value="pack">pack</option>
668
677
  </select>
669
678
  </div>
670
679
  <div className="filter-group">
@@ -1259,7 +1268,16 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1259
1268
  });
1260
1269
  };
1261
1270
 
1262
- const handleToggle = (name: string, currentlyEnabled: boolean) => {
1271
+ /**
1272
+ * Turn one policy on or off.
1273
+ *
1274
+ * Writes the PACK's selection, because that is what enforcement reads now.
1275
+ * `togglePolicyAction` edits `enabledPolicies`, which stopped deciding
1276
+ * anything the moment this build stopped registering builtins — leaving the
1277
+ * toggle pointed there would have moved a switch that changes nothing.
1278
+ */
1279
+ const handleToggle = (policy: PolicyInfo, currentlyEnabled: boolean) => {
1280
+ const name = policy.name;
1263
1281
  if (!config) return;
1264
1282
  const installed = config.clis.some((c) => c.installed);
1265
1283
  if (!installed) {
@@ -1275,14 +1293,21 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1275
1293
  policies: prev.policies.map((p) =>
1276
1294
  p.name === name ? { ...p, enabled: !currentlyEnabled } : p,
1277
1295
  ),
1278
- enabledPolicies: currentlyEnabled
1279
- ? prev.enabledPolicies.filter((n) => n !== name)
1280
- : [...prev.enabledPolicies, name],
1296
+ packs: prev.packs.map((pack) =>
1297
+ pack.id === policy.packId
1298
+ ? {
1299
+ ...pack,
1300
+ policies: pack.policies.map((p) =>
1301
+ p.name === name ? { ...p, enabled: !currentlyEnabled } : p,
1302
+ ),
1303
+ }
1304
+ : pack,
1305
+ ),
1281
1306
  };
1282
1307
  });
1283
1308
  startTransition(async () => {
1284
1309
  try {
1285
- await togglePolicyAction(name, !currentlyEnabled);
1310
+ await togglePackPolicyAction(policy.packId, name, !currentlyEnabled);
1286
1311
  } catch {
1287
1312
  fireActionError("policy_toggle", "Failed to save policy change.");
1288
1313
  reload();
@@ -1564,7 +1589,18 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1564
1589
  {/* Policy summary */}
1565
1590
  <div className="flex items-center gap-2 px-4 py-2 border-b border-border/40 bg-muted/5">
1566
1591
  <span className="text-xs text-muted-foreground">
1567
- <span className="font-semibold text-foreground">{config.enabledPolicies.length}</span>
1592
+ {/* What is actually ON, counted from the policies rendered below.
1593
+ `enabledPolicies` is the old builtin switch list — it stopped
1594
+ deciding anything when this build stopped registering builtins, so
1595
+ counting it reported a number matching nothing on screen. */}
1596
+ <span className="font-semibold text-foreground">
1597
+ {config.policies.filter((p) => p.enabled).length +
1598
+ (config.customPolicies?.filter((p) => p.enabled).length ?? 0) +
1599
+ (config.conventionPolicies?.reduce(
1600
+ (n, e) => n + e.policies.filter((p) => p.enabled).length,
1601
+ 0,
1602
+ ) ?? 0)}
1603
+ </span>
1568
1604
  {" / "}
1569
1605
  {config.policies.length + (config.customPolicies?.length ?? 0) + (config.conventionPolicies?.reduce((n, e) => n + e.policies.length, 0) ?? 0)}{" "}
1570
1606
  policies enabled
@@ -1614,7 +1650,7 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1614
1650
  <div className="mt-0.5 shrink-0">
1615
1651
  <PolicyToggle
1616
1652
  enabled={policy.enabled}
1617
- onChange={() => handleToggle(policy.name, policy.enabled)}
1653
+ onChange={() => handleToggle(policy, policy.enabled)}
1618
1654
  disabled={isPending}
1619
1655
  />
1620
1656
  </div>
@@ -1791,11 +1827,281 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1791
1827
  )}
1792
1828
  </div>
1793
1829
  ))}
1830
+
1831
+ {/* Policy packs — sets of policies published as a GitHub release. Anyone
1832
+ can publish one from their own repository, so this is the surface that
1833
+ makes an installed pack visible and switchable without the CLI. */}
1834
+ <PackSection
1835
+ packs={config.packs ?? []}
1836
+ disabled={isPending}
1837
+ onChanged={reload}
1838
+ onError={(message) => fireActionError("pack_action", message)}
1839
+ />
1794
1840
  </div>
1795
1841
  </>
1796
1842
  );
1797
1843
  }
1798
1844
 
1845
+ /** Install a pack, and manage the ones already installed. */
1846
+ function PackSection({
1847
+ packs,
1848
+ disabled,
1849
+ onChanged,
1850
+ onError,
1851
+ }: {
1852
+ packs: InstalledPackInfo[];
1853
+ disabled?: boolean;
1854
+ onChanged: () => void;
1855
+ onError: (message: string) => void;
1856
+ }) {
1857
+ const [source, setSource] = useState("");
1858
+ const [busy, setBusy] = useState<string | null>(null);
1859
+ const [installed, setInstalled] = useState<string | null>(null);
1860
+ const [preview, setPreview] = useState<PackPreviewResult | null>(null);
1861
+ const { capture } = usePostHog();
1862
+
1863
+ // Reading a pack before installing it. Fetches the manifest only — the entry
1864
+ // artifact is never downloaded, so looking at a stranger's pack cannot run a
1865
+ // stranger's code inside this server.
1866
+ const runPreview = async () => {
1867
+ if (!source.trim()) return;
1868
+ setBusy("preview");
1869
+ setPreview(null);
1870
+ try {
1871
+ const result = await previewPackWebAction(source);
1872
+ if (!result.ok) {
1873
+ onError(result.error ?? "Could not read that pack.");
1874
+ return;
1875
+ }
1876
+ setPreview(result);
1877
+ } finally {
1878
+ setBusy(null);
1879
+ }
1880
+ };
1881
+
1882
+ const run = async (label: string, action: () => Promise<{ ok: boolean; id?: string; version?: string; error?: string }>) => {
1883
+ setBusy(label);
1884
+ setInstalled(null);
1885
+ try {
1886
+ const result = await action();
1887
+ if (!result.ok) {
1888
+ // The refusal's own words. Every one of them names what was wrong —
1889
+ // a source that resolves to nothing, a digest that does not match, a
1890
+ // manifest declaring a policy its artifact never registers.
1891
+ onError(result.error ?? "Could not install that pack.");
1892
+ return;
1893
+ }
1894
+ setInstalled(result.version ? `${result.id}@${result.version}` : (result.id ?? null));
1895
+ setSource("");
1896
+ onChanged();
1897
+ } catch (err) {
1898
+ onError(err instanceof Error ? err.message : "Could not install that pack.");
1899
+ } finally {
1900
+ setBusy(null);
1901
+ }
1902
+ };
1903
+
1904
+ return (
1905
+ <div>
1906
+ <div className="flex items-center justify-between px-4 py-2.5 bg-muted/20 border-b border-border/50">
1907
+ <span className="text-[0.7rem] font-semibold uppercase tracking-wider text-muted-foreground">
1908
+ Policy Packs
1909
+ </span>
1910
+ <span className="text-[0.7rem] text-muted-foreground">
1911
+ {packs.length === 0 ? "none installed" : `${packs.length} installed`}
1912
+ </span>
1913
+ </div>
1914
+
1915
+ {/* Install by name — any owner/repo on GitHub, not only ours. */}
1916
+ <div className="flex flex-wrap items-center gap-2 px-4 py-3 border-b border-border/20">
1917
+ <input
1918
+ value={source}
1919
+ onChange={(e) => setSource(e.target.value)}
1920
+ onKeyDown={(e) => {
1921
+ if (e.key === "Enter" && source.trim() && !busy) {
1922
+ capture("pack_install_submitted", { via: "input" });
1923
+ void run("input", () => addPackWebAction(source));
1924
+ }
1925
+ }}
1926
+ placeholder="core · acme/ops · acme/ops@v1.2.0 · a release URL"
1927
+ spellCheck={false}
1928
+ disabled={disabled || busy !== null}
1929
+ 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"
1930
+ aria-label="Pack source"
1931
+ />
1932
+ <Button
1933
+ size="sm"
1934
+ variant="outline"
1935
+ disabled={disabled || busy !== null || source.trim().length === 0}
1936
+ onClick={() => {
1937
+ capture("pack_preview_submitted", {});
1938
+ void runPreview();
1939
+ }}
1940
+ >
1941
+ {busy === "preview" ? "Reading…" : "Preview"}
1942
+ </Button>
1943
+ <Button
1944
+ size="sm"
1945
+ variant="default"
1946
+ disabled={disabled || busy !== null || source.trim().length === 0}
1947
+ onClick={() => {
1948
+ capture("pack_install_submitted", { via: "button" });
1949
+ void run("input", () => addPackWebAction(source));
1950
+ }}
1951
+ >
1952
+ <Plus className="h-3.5 w-3.5" />
1953
+ {busy === "input" ? "Installing…" : "Install"}
1954
+ </Button>
1955
+ </div>
1956
+
1957
+ {/* What the pack CONTAINS, read from its manifest before anything is
1958
+ installed. Marks are the publisher's defaults, not this machine's
1959
+ state — nothing is installed, so an "on" would describe no machine. */}
1960
+ {preview?.ok && (
1961
+ <div className="border-b border-border/20 bg-muted/5">
1962
+ <div className="flex items-center gap-3 px-4 py-2.5">
1963
+ <Package className="h-3.5 w-3.5 text-muted-foreground shrink-0" />
1964
+ <span className="text-xs font-mono text-foreground">
1965
+ {preview.id}@{preview.version}
1966
+ </span>
1967
+ <span className="text-[0.7rem] text-muted-foreground">
1968
+ {preview.policies?.length ?? 0} policies ·{" "}
1969
+ {preview.policies?.filter((p) => p.defaultEnabled).length ?? 0} on by default
1970
+ </span>
1971
+ {preview.effect === "observe" && (
1972
+ <span className="text-[0.65rem] uppercase tracking-wider text-amber-500">
1973
+ observes only
1974
+ </span>
1975
+ )}
1976
+ <button
1977
+ onClick={() => setPreview(null)}
1978
+ className="ml-auto text-muted-foreground/60 hover:text-foreground"
1979
+ aria-label="Close preview"
1980
+ >
1981
+ <X className="h-3.5 w-3.5" />
1982
+ </button>
1983
+ </div>
1984
+ <div className="max-h-64 overflow-y-auto">
1985
+ {preview.policies?.map((policy) => (
1986
+ <div key={policy.name} className="flex items-start gap-3 px-4 py-2 border-t border-border/10">
1987
+ <span
1988
+ className={`text-[0.65rem] uppercase tracking-wider w-14 shrink-0 mt-0.5 ${
1989
+ policy.defaultEnabled ? "text-emerald-500" : "text-muted-foreground/50"
1990
+ }`}
1991
+ >
1992
+ {policy.defaultEnabled ? "default" : "opt-in"}
1993
+ </span>
1994
+ <span className="text-xs font-mono text-foreground w-56 shrink-0 truncate">
1995
+ {policy.name}
1996
+ </span>
1997
+ <span className="text-xs text-muted-foreground leading-relaxed min-w-0">
1998
+ {policy.description}
1999
+ <span className="block text-[0.65rem] text-muted-foreground/40 font-mono mt-0.5">
2000
+ {policy.category}
2001
+ </span>
2002
+ </span>
2003
+ </div>
2004
+ ))}
2005
+ </div>
2006
+ <div className="px-4 py-2.5 border-t border-border/20">
2007
+ <Button
2008
+ size="sm"
2009
+ variant="default"
2010
+ disabled={disabled || busy !== null}
2011
+ onClick={() => {
2012
+ capture("pack_install_submitted", { via: "preview" });
2013
+ void run("input", () => addPackWebAction(source)).then(() => setPreview(null));
2014
+ }}
2015
+ >
2016
+ <Plus className="h-3.5 w-3.5" />
2017
+ Install its defaults
2018
+ </Button>
2019
+ </div>
2020
+ </div>
2021
+ )}
2022
+
2023
+ {/* Ours, in one click — both the released pack and the copy that ships
2024
+ inside this package, which needs no network at all. */}
2025
+ <div className="flex flex-wrap items-center gap-2 px-4 py-2.5 border-b border-border/20 bg-muted/10">
2026
+ <span className="text-[0.7rem] text-muted-foreground/70 mr-1">Failproof AI policies:</span>
2027
+ <Button
2028
+ size="sm"
2029
+ variant="outline"
2030
+ disabled={disabled || busy !== null}
2031
+ onClick={() => {
2032
+ capture("pack_install_submitted", { via: "ours" });
2033
+ void run("ours", () => addPackWebAction("FailproofAI/policies"));
2034
+ }}
2035
+ >
2036
+ {busy === "ours" ? "Installing…" : "Install from GitHub"}
2037
+ </Button>
2038
+ <Button
2039
+ size="sm"
2040
+ variant="outline"
2041
+ disabled={disabled || busy !== null}
2042
+ onClick={() => {
2043
+ capture("pack_install_submitted", { via: "bundled" });
2044
+ void run("bundled", () => addBundledPackWebAction());
2045
+ }}
2046
+ >
2047
+ {busy === "bundled" ? "Installing…" : "Install offline copy"}
2048
+ </Button>
2049
+ {installed && (
2050
+ <span className="text-[0.7rem] text-emerald-500 font-mono">installed {installed}</span>
2051
+ )}
2052
+ </div>
2053
+
2054
+ {packs.map((pack) => (
2055
+ <div key={`${pack.id}@${pack.version}`}>
2056
+ <div className="flex items-center gap-3 px-4 py-3 border-b border-border/20">
2057
+ <Package className="h-3.5 w-3.5 text-muted-foreground shrink-0" />
2058
+ <span className="text-xs font-mono text-foreground truncate">
2059
+ {pack.id}{pack.version ? `@${pack.version}` : ""}
2060
+ </span>
2061
+ {pack.effect === "observe" && (
2062
+ <span className="text-[0.65rem] uppercase tracking-wider text-amber-500">observing</span>
2063
+ )}
2064
+ <span className="text-[0.65rem] text-muted-foreground/50 font-mono truncate hidden lg:inline">
2065
+ {pack.source}
2066
+ </span>
2067
+ <button
2068
+ onClick={() => void run(pack.id, () => removePackWebAction(pack.id))}
2069
+ disabled={disabled || busy !== null}
2070
+ className="ml-auto text-muted-foreground/60 hover:text-foreground disabled:opacity-40"
2071
+ aria-label={`Remove ${pack.id}`}
2072
+ >
2073
+ <Trash2 className="h-3.5 w-3.5" />
2074
+ </button>
2075
+ </div>
2076
+
2077
+ {pack.error ? (
2078
+ // A pack that will not load is what the machine denies for. Saying
2079
+ // it here is the difference between a fixable problem and a
2080
+ // mysterious one.
2081
+ <div className="flex items-start gap-2 px-4 py-2.5 border-b border-border/20 bg-amber-500/5">
2082
+ <TriangleAlert className="h-3.5 w-3.5 text-amber-500 shrink-0 mt-0.5" />
2083
+ <p className="text-[0.7rem] text-muted-foreground leading-relaxed">
2084
+ This pack will not load: {pack.error}
2085
+ </p>
2086
+ </div>
2087
+ ) : (
2088
+ // NOT a second list of the pack's policies. Every policy that
2089
+ // enforces here is in the categorised list above, whichever pack it
2090
+ // came from — rendering them again under the pack made the same
2091
+ // toggles appear twice, the second time with no category.
2092
+ <div className="flex items-center gap-3 px-4 py-2.5 border-b border-border/20">
2093
+ <span className="text-[0.7rem] text-muted-foreground">
2094
+ {pack.policies.filter((p) => p.enabled).length} of {pack.policies.length} on —
2095
+ listed by category above
2096
+ </span>
2097
+ </div>
2098
+ )}
2099
+ </div>
2100
+ ))}
2101
+ </div>
2102
+ );
2103
+ }
2104
+
1799
2105
  // -- Tab Bar --
1800
2106
 
1801
2107
  function TabBar({
@@ -1951,7 +2257,7 @@ export default function HooksClient({ initialTab = "activity" }: { initialTab?:
1951
2257
  margin: "0 0 24px",
1952
2258
  }}
1953
2259
  >
1954
- switch policies on or off across your installed agent CLIs.
2260
+ switch policies on or off across your installed harnesses.
1955
2261
  </p>
1956
2262
  )}
1957
2263
 
@@ -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