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
@@ -0,0 +1,431 @@
1
+ # Changelog — `fp` CLI
2
+
3
+ ## 0.0.1b1 — 2026-08-24
4
+
5
+ ### The package is `fp-cloud-cli`; the command is still `fp`
6
+
7
+ - **What you type to install it changed. What you type to use it did not.**
8
+
9
+ ```bash
10
+ pipx install fp-cloud-cli # or: uv tool install fp-cloud-cli
11
+ fp --version
12
+ ```
13
+
14
+ - **Why not `fp-cli`.** PyPI refuses a name "too similar to an existing project",
15
+ and its similarity check strips separators — so `fp-cli` collides with `fpcli`,
16
+ a real package with 42 releases and uploads as recent as April 2025. It is not
17
+ a squat, so there is no PEP 541 claim to make: the name simply is not available.
18
+ (`fp` itself was taken long before that, which is why the command and the
19
+ distribution never matched in the first place.)
20
+ - **`fp-cloud-cli` also says what this is.** It talks to the FailproofAI Cloud
21
+ dashboard's `/api` surface and nothing else — never the Rust server directly —
22
+ and it is not the `failproofai` npm CLI, which enforces inside the agent loop
23
+ rather than reading back what the loop did.
24
+ - **Nothing else moved.** `~/.failproofai/fpcli/cli-auth.json` keeps its name, so
25
+ nobody is signed out — it is a contract with the Enforcement CLI's
26
+ `src/hooks/fp-home.ts`, not a label. `FP_HOME` still works and still wins. The
27
+ import package stays `fp_cli`, which nobody types: this is an application, and
28
+ the `fp` command is its entire public surface.
29
+
30
+ ### Versioning restarts at `0.0.1b1`
31
+
32
+ - **The number was inherited from a distribution this is not.** `0.1.22` was where the
33
+ CLI had got to under the shared `agenteye` name in the private monorepo. It came over
34
+ verbatim when the CLI was open-sourced as `fp-cloud-cli` and nothing has moved it since — but
35
+ `fp-cloud-cli` is a 404 on PyPI, so that number would have opened the project's first release
36
+ claiming a history that lives entirely on another name.
37
+ - **`0.1.22` also said "stable" where everything else says beta.** It is a plain release
38
+ version, so `pip install fp-cloud-cli` would resolve it by default while the classifier
39
+ (`Development Status :: 4 - Beta`) and every doc page call the CLI beta. `0.0.1b1` is a
40
+ PEP 440 pre-release, which is the only mechanism PyPI has for that distinction — there
41
+ are no dist-tags here the way there are on npm.
42
+ - **Nothing is stranded and nobody is downgraded.** There is no published `fp-cloud-cli` version
43
+ to reuse or to fall behind, and pip, pipx and uv all install a pre-release when it is the
44
+ only release available, so `pipx install fp-cloud-cli` keeps working with no `--pre`.
45
+ - **The `## 0.1.7` and older sections below predate the rename.** They are the `agenteye`
46
+ CLI's history, kept because the behaviour they describe is this CLI's behaviour. They are
47
+ not versions of `fp-cloud-cli`, and no `fp-cloud-cli` release will ever carry those numbers.
48
+
49
+ ### The session moved to `~/.failproofai/fpcli/cli-auth.json`
50
+
51
+ - **Nothing to do. Nobody is signed out.** The session was at `~/.fp/cli.json`; it is now
52
+ `~/.failproofai/fpcli/cli-auth.json`, still mode `0600`. A session at the old path is
53
+ adopted on the next command, so an upgrade is invisible.
54
+ - **Adoption is a COPY.** The old file is left exactly where it is, which keeps a
55
+ downgrade working — an older `fp` still finds its session where it left it — and means
56
+ nothing irreversible happens on a machine mid-rollout. Remove `~/.fp/` yourself once
57
+ you are happy.
58
+ - **It is best-effort on purpose.** If the new location cannot be written (read-only
59
+ home, full disk, a symlink we refuse) the session found is still returned, so a machine
60
+ that cannot be migrated keeps working rather than being logged out by our own
61
+ housekeeping.
62
+ - **Why:** one product owned three top-level dotfiles — `~/.fp` (this CLI),
63
+ `~/.failproofai` (the Enforcement CLI) and `~/.agenteye` (the SDK/collector spool).
64
+ This collapses the first into the second. `~/.agenteye` stays: it is a wire contract
65
+ with the collector, and renaming it from the SDK's side would write events into a
66
+ directory nothing watches, with no error on either side.
67
+ - **`FP_HOME` still works and still wins.** Resolution is `FP_HOME` >
68
+ `$FAILPROOFAI_HOME/fpcli` > `~/.failproofai/fpcli`. `FP_HOME` names the CLI's own
69
+ directory and is used as-is, so an existing export addresses the same place it always
70
+ did; `FAILPROOFAI_HOME` names the shared home root, so `fpcli/` is appended. The
71
+ filename changed too (`cli.json` → `cli-auth.json`), so an `FP_HOME` user's old session
72
+ sits beside the new path and is adopted from there. A redirected config is never
73
+ reached past: with `FP_HOME` set the CLI does not look in `~/.fp` at all, because that
74
+ would adopt a session from a context the user explicitly moved away from.
75
+ - **Nothing that authenticates without the config file changed.** `--token` / `FP_TOKEN`
76
+ and `--api-key` / `FP_API_KEY` never touched disk and still do not, so CI that
77
+ authenticates by environment never enters any of this. Read-only commands still create
78
+ no file at all.
79
+ - **The CLI only ever creates.** It will bring `~/.failproofai` into existence on a
80
+ machine that has never run the Enforcement CLI, and leaves a populated one untouched.
81
+ The new path is registered in that home's layout (`src/hooks/fp-home.ts`) and
82
+ classified `user-typed`, so a layout migration cannot drop it — `resettablePaths()` is
83
+ a filter over that table, and only `derived` / `refetchable` entries are deleted. No
84
+ `LAYOUT_VERSION` bump: nothing moved, and a bump would mark every existing home stale
85
+ and run a reset on machines that have nothing to migrate.
86
+
87
+ ### Two hardenings the shared directory made necessary
88
+
89
+ Both are consequences of writing next to another product's secrets rather than
90
+ into a directory the CLI owned outright.
91
+
92
+ - **A symlinked config no longer writes through to whatever it points at.**
93
+ `O_TRUNC` follows symlinks, so a link at `cli-auth.json` pointing at
94
+ `../credentials.json` made `fp login` silently truncate the Enforcement CLI's
95
+ token and write the session over it — no error, nothing in either product's
96
+ logs. The final component is now opened `O_NOFOLLOW` and a link is refused
97
+ with a message naming the file. The link is not deleted: a symlink is
98
+ something a person put there.
99
+ - **`fpcli/` is created `0700` rather than inheriting the umask.** A common
100
+ `0002` umask made it `0775`. The session file itself was always `0600`, so it
101
+ was never readable — but a group-writable directory lets anyone in the group
102
+ replace the file, which is a session swap. The shared parent is untouched: if
103
+ the CLI is the first to create `~/.failproofai` it leaves it to the umask, as
104
+ the Enforcement CLI would, and an existing directory is never re-permissioned.
105
+ - **The session is written atomically, to a temp file that is renamed into place.**
106
+ `O_NOFOLLOW` closed the symlink hole but says nothing about a **hard link** —
107
+ that is not a link, it is a second name for one inode, so an in-place write
108
+ went straight through it into the neighbour's file exactly as before. `rename`
109
+ swaps the directory entry instead, so the other name keeps the old inode. The
110
+ same change buys three more things: a reader never observes a half-written
111
+ credential, two racing `fp` processes end with one whole session rather than a
112
+ splice, and a FIFO left in the config position can no longer hang the CLI
113
+ forever (`open` on a FIFO blocks for a reader; the previous code sat there
114
+ indefinitely with no output). The temp file is removed on every failure path.
115
+
116
+ ## 0.1.7
117
+
118
+ ### Packaging fix: declare `click` and `pygments` explicitly
119
+ - **Fixes `ModuleNotFoundError: No module named 'click'` on a fresh install.** The CLI imports
120
+ `click` directly (and `pygments` for SQL highlighting) but only ever got them transitively via
121
+ `typer` / `rich`. Modern `typer` (>=0.13) **no longer installs `click`**, so a clean
122
+ `pipx install fp-cloud-cli` left `click` absent and the CLI crashed on startup. Both are now listed
123
+ as direct dependencies (`click>=8.1`, `pygments>=2.13`) so installs are self-contained.
124
+ - No behaviour change — same code, correct dependency metadata.
125
+
126
+ ### `keys create` / `keys update`: compact permission format + shared ending
127
+ - **New permission input**: the compact `slug:action.action` token format, space-separated and/or
128
+ repeated `-p` (both compose) — `keys create "ci-bot" -p events:read.add keys:read` expands to
129
+ `events:read, events:add, keys:read` (de-duped). A malformed token (`events`, `events:`) or an
130
+ unknown permission → a red `✗ bad permission …` box **before** any mutation (exit 2). Replaces
131
+ the old one-permission-per-`-p` form.
132
+ - **`keys update` now takes the unique key NAME** (resolved to the id), not a UUID — consistent
133
+ with `regenerate`/`disable`. Permissions REPLACE the current grants; a calm confirm (`replace
134
+ permissions on key <name>? the key keeps working …`, default no, `--yes` skips); decline → faint
135
+ `cancelled — permissions unchanged` box.
136
+ - **Shared ending** (both): a green `✓ created/updated key <name> · {n} permissions` line + the
137
+ **same grouped permissions box** as `whoami` / `orgs perms`. `create` shows a `secret · shown
138
+ once` green box first (piping still captures just the bare secret); name-collision → red box.
139
+ - `--json`: create `{id,name,permissions,created_at,key}`, update `{id,name,permissions,created_at,
140
+ revoked_at}` — `permissions` is the expanded flat list.
141
+
142
+ ### `keys`: boxed `list` (active-first), and name-based `regenerate` / `disable` flows
143
+ - **`keys list`** → a boxed `api keys · {n} · active first` table (`created · name · permissions ·
144
+ status`) — **active keys sort to the top** (then revoked), each group newest-first. Status is
145
+ colour-coded (`● active` green / `○ revoked` red; filled = live, hollow = dead) with a
146
+ `{total} keys · {n} active · {m} revoked` footer. The raw UUID is hidden by default (`--show-id`
147
+ for a short id, `--json` for the full id); created shows compact `MM-DD HH:MM`. `--json` unchanged.
148
+ - **`keys regenerate <name>` / `keys disable <name>`** now take the **unique key name** (resolved
149
+ to the id), not a UUID. Every flow state is a **rounded notice box** (one consistent boxed
150
+ family): an amber `confirm` box (`⚠ … <name>?` + dim consequence) with a `[y/N]` prompt below
151
+ defaulting to **no**; a faint `cancelled` box (`○ nothing changed`) on decline (exit 0, no more
152
+ red "Aborted"); a red `error` box (`✗ no key named <name>` + hint) when not found (exit 6); a
153
+ green `secret rotated` box (regenerate — piping still captures just the bare secret on stdout)
154
+ or `disabled` box (disable); a faint `no change` box when already disabled. `--json`: regenerate
155
+ → `{name, secret}`, disable → `{name, status:"disabled"}`, decline → `{cancelled:true}`.
156
+ - Shared helpers `confirm_destructive` + `print_cancelled` + `_notice_box` (reused by the
157
+ destructive key actions). `keys create` / `keys update` are unchanged (separate pass).
158
+
159
+ ### `list <kind>`: one boxed, column-flowing view
160
+ All nine `list` subcommands (envs, agents, event_types, score_filters, models, hooks, triggers,
161
+ tools, error_types) now render through one shared boxed renderer (`render_value_list`):
162
+ - An ACCENT panel titled `{kind} · {count} {description}` with the (sorted) values in
163
+ **column-major flow** — a column fills to 8 rows then overflows to the next; the column count
164
+ is capped to the terminal width (prefers taller over wider-than-screen; never overflows; min
165
+ one column). Empty → `none found`.
166
+ - A dim **filter-hint footer** for kinds that map to a real filter flag: `envs`/`agents`/
167
+ `event_types` → `fp events --env/--agent-id/--event-type`, `error_types` →
168
+ `fp errors --error-type`. Kinds with no matching value filter (models/hooks/triggers/
169
+ tools/score_filters) get no footer.
170
+ - `--json` is unchanged (`{"kind", "values"}`).
171
+
172
+ ### `orgs`: boxed `list`, a `current` identity card, and a new `orgs perms`
173
+ - **`orgs list`** now renders the same boxed `your orgs · N` panel as `whoami` (marker / org /
174
+ name / role / perms + a `switch with …` line) instead of a plain table.
175
+ - **`orgs current`** is a compact `current org` identity card (slug + name · role + permission
176
+ count · signed-in email) with a footer cross-linking `orgs perms` / `orgs switch`. The
177
+ 28-permission comma wall moved out. `--json`: `{slug, name, role, permission_count, user_email}`.
178
+ - **New `orgs perms`** — your grants in the active org as the grouped, risk-coloured permissions
179
+ panel (the **same shared renderer** as `whoami`: read=green, create/modify=pink, invoke=amber,
180
+ destructive=red; NO_COLOR `*`). `--json`: `{slug, role, permissions, permission_count}`.
181
+ - The permissions panel and the orgs panel are now single shared helpers
182
+ (`render_permissions_panel` / `render_orgs_panel`) used by `whoami`, `orgs perms`, and
183
+ `orgs list` so they can't drift. Resource order aligned (dashboards · keys · queries · users · …).
184
+
185
+ ### `errors` now lists the errored events (with `--aggregate` for the old summary)
186
+ `errors` was a summary-only command; it now **fetches and lists the errored events** (the
187
+ dashboard `/errors` view), with the rollup moved behind a flag — mirroring `evals`.
188
+ - **`errors`** (default) — one row per errored event in an error-themed (muted red-purple)
189
+ boxed table: `time · event · env · agent · session · summary`. The `event` cell is `● {type}`,
190
+ **red only when the type names an error** (`error`/`fail`); the `summary` is derived from the
191
+ payload (tool name, `error_type: message`, hook name, …) and truncates with `…`. Session ids
192
+ truncate (`--full-ids` for whole). Same filter/paging options as `events`/`sessions` plus the
193
+ errors-specific `--error-type`/`--search-exclude`.
194
+ - **`errors --aggregate`** — the old summary, redesigned as an errors-themed card: a large red
195
+ hero count + `across N sessions · N agents · last <relative>`; zero errors → a calm green
196
+ `✓ no errors found` in a neutral panel.
197
+ - `--json`: list → `{"errors": [...], "next_cursor": …}` (full event rows); aggregate → `{total,
198
+ sessions, agents, last_ts, bins}`. Re-added `errored`/`error_type`/`search_exclude` to the
199
+ `list_events` client. `analytics_cmds.py` renamed → `errors_cmds.py`.
200
+
201
+ ### Score bar → braille + unified colour bands
202
+ - The `evals --aggregate` score bar now uses **braille** (`⣿` fill / `⣀` track) on a **zoomed
203
+ `.40–1.0` scale** (so the typical .7–.9 range shows visible variation), with a band-tinted
204
+ track. Falls back to solid blocks (`█`/`░`) under `NO_COLOR` (clearer in mono; failing avgs
205
+ get a trailing `!`).
206
+ - **Unified score colour bands** (`.80`/`.50`, was `.85`/`.70`) used **everywhere** a score is
207
+ coloured — the evals score cells, the aggregate avg, and the bar: **≥.80** cyan-green
208
+ `#3ddbb8`, **.50–.80** amber, **<.50** red. So a given score reads the same colour CLI-wide.
209
+ - Aggregate gains a one-line legend under the panel: `scale .40–1.0 · ⣿ ≥.80 ⣿ .50–.80 ⣿ <.50`;
210
+ the evals list footer legend updates to the new bands. Presentation only.
211
+
212
+ ### Split scores back out: `sessions` (runs) vs `evals` (scores + `--aggregate`)
213
+ Refined the previous merge into a clearer operational-vs-quality split:
214
+ - **`sessions`** is now a pure run list — columns `time · env · agent · session · status`
215
+ (the **scores column is gone**, and so are `--score`/`--scores-full`). Footer has no score
216
+ legend. `--json` still includes `scores` per row.
217
+ - **`evals`** (renamed from `eval-aggregate`, now a full command) has **two modes, same filters**:
218
+ - bare → the eval **list** with the scores column (`time · env · agent · session · status · scores`).
219
+ - **`--aggregate`** → a redesigned two-panel view: a **totals card** (hero count + colour-coded
220
+ status dots + a derived success-rate line) and a **score-stats table** (per metric: n, avg +
221
+ a 10-cell threshold-coloured bar, min/max/p50), sorted worst-average first, all metrics shown.
222
+ - `--json`: list → `{"evaluations": [...], "next_cursor": …}`; aggregate → `{total,
223
+ status_counts, score_stats[], timeline}`.
224
+ - The standalone `eval-aggregate` command is removed (use `evals --aggregate`). Aggregate numbers
225
+ are rounded to 2 decimals for display (full precision stays in `--json`); under `NO_COLOR` a
226
+ failing avg (<.70) gets a trailing `!`. No change to what's computed or fetched.
227
+
228
+ ### Merged `evals` into `sessions` (one command, not two)
229
+ `evals` and `sessions` both listed evaluation results from the same endpoint, so they're now
230
+ **one command: `sessions`**. The richer `evals` implementation (boxed output, full option set,
231
+ width-aware scores) was kept and renamed; the old `sessions` command was removed.
232
+ - `sessions` lists evaluation results newest-first with the boxed renderer (status colours,
233
+ threshold-coloured scores, session-id truncation, `--full-ids`/`--scores-full`, score legend).
234
+ - `--json` returns `{"sessions": [...], "next_cursor": ...}`.
235
+ - The dead `list_sessions` client helper was removed. (`eval-aggregate` is unchanged.)
236
+ - Help/schema/README scrubbed of `evals`; top-level examples fixed to put the global `--json`
237
+ before the command.
238
+
239
+ ### Validation hardening (`--score` / `--from` / `--to`)
240
+ - **`--score KEY:..` (both bounds empty) is now a clean usage error (exit 2).** It used to pass
241
+ validation and the server silently dropped it → the **unfiltered** set came back.
242
+ - **`--from`/`--to` now require a full RFC3339 UTC timestamp** (a `T` separator + a `Z`/offset).
243
+ A timezone-less (`2026-05-01T00:00:00`) or space-separated value used to slip through and hit
244
+ a server 400 (exit 1); it's now caught client-side as a usage error (exit 2).
245
+
246
+ ### Redesigned the `evals` table
247
+ - **New default output**: the same accent-bordered rounded panel as `events`, built on a shared
248
+ `render_list_panel` helper. Columns `time · env · agent · session · status · scores` (agent
249
+ bright, the rest contextual-dim). **status** is colour-coded by state (done green / running
250
+ amber / failed-error-timeout red); **scores** render as `metric value` with the value coloured
251
+ by threshold (**≥.85** green / **.70–.85** amber / **<.70** red) and compacted (`.94`, `1.0`).
252
+ - **Scores are width-aware**: as many pairs as fit, then `+N`; an eval always stays one row and
253
+ the `time`/`status` columns never get squeezed. `--scores-full` shows every pair (may wrap).
254
+ - **Session ids truncate** by default (`sess-…fcf97e01`); `--full-ids` keeps them whole. `--json`
255
+ always has full ids + structured scores.
256
+ - **Footer** carries a compact score-colour legend (`score: ≥.85 .70–.85 <.70`), dropped on a
257
+ narrow terminal. Under `NO_COLOR`, failing scores (<.70) get a trailing `!` so they stay visible.
258
+
259
+ ### `evals`: fix docs, reorder options, drop `--latest-per-session`
260
+ - **Fixed the broken `--json` examples** in the `evals` help — `--json` is a **global** option and
261
+ goes before the command (`fp --json evals …`), not after it (`fp evals … --json`,
262
+ which exits 2). The docstring examples now show the correct form.
263
+ - **Reordered the options** to match the `events -h` layout: limit, since, from, to, session-id,
264
+ env, agent-id, status, score, all, cursor, page-size, fields.
265
+ - **Removed `--latest-per-session`** — use `fp sessions` for the newest evaluation per
266
+ session (it's the same query, deduped). The flag's client param is retained internally (the
267
+ `sessions` command still forces it).
268
+
269
+ ### Redesigned the `events` table + trimmed its filters
270
+ - **New default output**: an accent-bordered rounded box whose title carries the row count,
271
+ sort direction and date (`events · 10 · newest first · 2026-06-22`), with columns
272
+ `time · type · env · agent · session` (now sharing the `render_list_panel` helper with `evals`:
273
+ a dim LABEL header + a thin rule). Rows show clock time (the date lives in the title); a
274
+ window spanning more than one UTC day adds the date back into each row. The summary line below
275
+ reads `<n> shown · more available · fp events --all`. `--json` is unchanged; `--fields`
276
+ still prints the plain projected table.
277
+ - **Removed filters**: `--tool-name`, `--error-type`, `--errored`, `--search-exclude` (the
278
+ `errors` command keeps the error/exclude filters). The now-orphaned `list_events` client params
279
+ were dropped too.
280
+ - **`--environment` dropped in favour of `--env`** (one spelling). `evals`/`sessions`/`errors`
281
+ still accept both.
282
+
283
+ ### Replaced `facets` with `fp list <thing>`
284
+ The single `fp facets --kind <kind>` command is now a `list` group with one named
285
+ subcommand per dropdown, matching the dashboard's filters:
286
+ `list envs | agents | event_types | score_filters | models | hooks | triggers | tools | error_types`.
287
+ Each prints a flat list of the distinct values (or `--json {"kind", "values"}`) — the same
288
+ per-org cached data behind the dashboard dropdowns. **New: `list score_filters`** surfaces the
289
+ evaluation score keys/metrics (needs `evaluations:read`; the others need `events:read`).
290
+
291
+ ### Slimmed the command surface (removed 7 commands)
292
+ Trimmed the CLI to a focused, maintainable core — each of these is still available in the
293
+ dashboard:
294
+ - **`environments`**, **`latency`**, **`score-keys`** — niche analytics one-offs; use `facets`
295
+ (value discovery), `errors`, and `eval-aggregate` instead.
296
+ - **`session`** (the singular `session show` / `session export` group) — inspect a single session
297
+ with `sessions`, `events --session-id <id>`, and `evals --session-id <id>`.
298
+ - **`re-evaluate`** — redundant; trigger a fresh evaluation from the dashboard.
299
+ - **`permission-sets`** (list/show/create/update/delete) — manage sets in the dashboard;
300
+ `users`/`keys` still accept a set by name via `--permission-set`.
301
+ - **`dashboards`** (list/show/create/update/delete/tiles) — manage dashboards in the dashboard UI.
302
+
303
+ The orphaned client/model plumbing and their unit tests were removed alongside the commands.
304
+
305
+ ### Reworked the `agent` command surface (chats + models; `compose-sql` removed)
306
+ - Dropped the `conversation-` prefix and renamed the list: **`conversations` → `chats`**,
307
+ `conversation-show` → **`show`**, `conversation-rename` → **`rename`**, `conversation-delete`
308
+ → **`delete`**. (`agent chats --json` now returns `{"chats": [...]}`.)
309
+ - **Removed `agent conversation-create`** — `ask` manages the chat lifecycle itself now.
310
+ - **`agent ask` is chat-first.** With **`--chat <id>`** it continues that chat (prior thread
311
+ sent for context, new turn appended); **without it** it starts a **new** chat, answers,
312
+ persists, and prints the new `chat_id` (the first question auto-titles it). The chat is created
313
+ only once an answer lands, so a failed/aborted ask leaves no empty chat. (`--conversation` →
314
+ **`--chat`**; `--json` now includes `chat_id`.)
315
+ - **New `agent models`** — lists the deployment's model allowlist (default marked), read from the
316
+ agent health endpoint. **`agent ask --model`** is now validated against that allowlist
317
+ client-side (an unknown model exits 2 with the valid choices) instead of silently falling back
318
+ to the default.
319
+ - **Removed `agent compose-sql`** from the CLI.
320
+
321
+ ### Fixed: `alerts update` single-field edits (were HTTP 500)
322
+ - A flag-only update such as `fp alerts update <id> --disabled` (the documented
323
+ example) used to send a **partial** body to a server endpoint that does a **full
324
+ replace**, which failed with `HTTP 500`. Only a complete `--file` AlertInput worked.
325
+ - `alerts update` now does a **read-merge** (like `users update`): with override flags and
326
+ no `--file`, it fetches the current alert and re-sends it with just the named fields
327
+ changed — so `--disabled`, `--severity`, `--name`, etc. work on their own. This path now
328
+ needs `alerts:read` **and** `alerts:write`, and a missing alert returns a clean not-found
329
+ (exit 6) instead of a 500. The `--file` path is unchanged (a straight full replace).
330
+
331
+ ### Single `orgs` group (merged `org` + `orgs`)
332
+ - All tenant functionality now lives under one group, **`orgs`** — the separate singular
333
+ `org` group was removed.
334
+ - **`orgs list`** — list the orgs you belong to with your role (permission set) and permission
335
+ count in each; the active org is marked. `--json` adds `is_instance_admin` and a per-org
336
+ `active` flag.
337
+ - **`orgs switch [slug]`** — switch the active tenant. Pass a slug (`orgs switch acme`) for a
338
+ direct switch, or omit it (`orgs switch`) to choose from a list in a terminal — the current
339
+ org is the Enter-to-keep default, a sole org auto-selects, and a non-interactive run requires
340
+ a slug. Same access validation as `orgs use` (a non-existent/unauthorised slug is rejected).
341
+ - **`orgs use <slug>`** — set the default active tenant (unchanged behaviour, now under `orgs`).
342
+ - The interactive picker is shared between `login` and `orgs switch` (one implementation).
343
+
344
+ ### Removed the `logs` alias
345
+ - Dropped the `logs` command (it was a duplicate alias of `events`). Use `fp events`.
346
+
347
+ ### Consistent visual language across commands
348
+ - Unified the icon/colour vocabulary used everywhere: `◆` brand/identity (login header,
349
+ `whoami`, `orgs list`), `›` step, `✓` success (green), `○` neutral status (dim), `✗` error
350
+ (red). `whoami` when signed out is now a neutral `○ not signed in` line (not plain text), and
351
+ when signed in leads with the `◆ <email>` banner + a clean key/value + orgs table.
352
+ - Errors render as a clean one-line `✗ <message>` (with a `try '… -h'` nudge for usage errors)
353
+ instead of Typer's heavy red panel, so failures match the success/status lines. A doubled
354
+ "Did you mean …?" suggestion is collapsed.
355
+
356
+ ### Cleaner login output
357
+ - The sign-in flow now shows a single line — **`sending a 6-digit OTP to <email> …`** (the
358
+ email highlighted) — and drops the dashboard-URL line and the "code is in your email / dev
359
+ SMTP" hint. It states only that an OTP was sent, never whether the address is valid.
360
+
361
+ ### Logout clears the whole session
362
+ - `logout` now clears the **active org**, email, and user id from `~/.fp/cli.json`
363
+ (not just the token) — previously the file kept `org`/`email`/`user_id`, so the CLI
364
+ "remembered" the last tenant after logout. `base_url`, the `insecure` preference, and the
365
+ machine-stable `anonymous_id` are kept. The next `login` therefore starts the org picker
366
+ fresh, with no remembered default.
367
+ - `logout` when you are **not** signed in is now a no-op that reports `○ already signed out`
368
+ (and `"already_signed_out": true` in `--json`) instead of falsely confirming a `✓ signed out`.
369
+
370
+ ### Nicer login/logout experience (presentation only)
371
+ - Restyled the sign-in flow — a compact `◆ fp · sign in` header, `›` step lines, a
372
+ cleaner numbered org picker, and a `✓ signed in as … · <org>` confirmation (and `✓ signed
373
+ out`). No behaviour change; all of it is stderr chrome, so `--json` stdout is unchanged.
374
+
375
+ ### Org validation at login / `orgs use`
376
+ - `login --org <slug>`, `FP_ORG`, and `orgs use <slug>` now **validate the org
377
+ against the server before saving it** — it must exist and be accessible to you. This
378
+ fixes a hole where an instance admin could activate (and persist) a non-existent or
379
+ unauthorised slug (e.g. a typo like `--org fp`), which then broke every later
380
+ command. A member's own orgs are accepted with no extra round-trip; a non-member org is
381
+ verified via a cheap org-scoped probe (HTTP 200 → ok, otherwise rejected with
382
+ "Org '<slug>' does not exist or you do not have access to it").
383
+
384
+ ### Login org picker
385
+ - `login` now shows an **interactive org picker** after your email is verified when you
386
+ belong to more than one org, so you choose the active tenant each login instead of
387
+ silently re-entering a previously-saved one. A still-valid saved org is offered as the
388
+ Enter-to-keep default (marked `(current)`). An explicit `--org`/`FP_ORG` still skips
389
+ the picker; single-org users still auto-select. In a non-interactive run (`--json` / piped
390
+ stdin) a still-valid saved org is reused, else login reports `needs_org_selection`.
391
+
392
+ ## 0.1.6
393
+
394
+ Full parity with the dashboard API, multi-tenant support, and exhaustive telemetry.
395
+
396
+ ### Multi-tenancy (correctness fix)
397
+ - The CLI is now org-aware. The active tenant is chosen **at login** (`login --org <slug>`)
398
+ and persisted; override per command with the global `--org` / `FP_ORG`, or change the
399
+ default with `orgs list` / `org use <slug>`.
400
+ - Every request now sends the `X-AgentEye-Org` header, so **multi-org accounts work** (previously
401
+ they were rejected). Permissions are resolved per org.
402
+ - `whoami` reports the active org, instance-admin status, per-org permissions, and all memberships
403
+ (the session model dropped the old flat `permissions` list).
404
+
405
+ ### New command groups
406
+ - **keys** — create/list/update/disable/regenerate API keys (secret shown once).
407
+ - **query** — saved SQL + ad-hoc runner (`query run`), schema introspection.
408
+ - **users**, **permission-sets**, **settings** — org administration.
409
+ - **alerts**, **incidents** — alert definitions and incident triage.
410
+ - **dashboards** (+ tiles), **agent** (`ask`, `compose-sql`, conversations) — JSON/streaming.
411
+ - **facets**, **errors**, **latency**, **score-keys**, **eval-aggregate** — discovery & analytics.
412
+ - `events` gains `--tool-name`, `--error-type`, `--errored`, `--order`, `--search`, `--search-exclude`.
413
+ - **schema** — emits the entire CLI surface as JSON for agents/tooling.
414
+
415
+ ### Safety & ergonomics
416
+ - Mutations confirm in a terminal but auto-skip under `--json` / non-TTY; `--yes`/`-y` to skip.
417
+ - Complex bodies accepted via `--file payload.json` (or `--file -` for stdin).
418
+ - One-time API-key secrets print to stdout (capturable) with the warning on stderr.
419
+
420
+ ### Telemetry
421
+ - Every command/subcommand and flag is tracked (the catalog is derived from the app, with an
422
+ anti-drift test that fails if anything goes untracked). Per-action events for all mutations.
423
+ Privacy unchanged: only static names/enums/coarse counts — never ids, emails, SQL, or values.
424
+
425
+ ### Notes
426
+ - Exit code `6` (resource not found) is now documented.
427
+ - New global option `--org`/`FP_ORG`.
428
+
429
+ ## 0.1.5 and earlier
430
+
431
+ See the repository changelog.
@@ -0,0 +1,42 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ExosphereHost Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ Commons Clause License Condition v1.0
24
+
25
+ The Software is provided to you by the Licensor under the License, as defined
26
+ below, subject to the following condition.
27
+
28
+ Without limiting other conditions in the License, the grant of rights under
29
+ the License will not include, and the License does not grant to you, the right
30
+ to Sell the Software.
31
+
32
+ For purposes of the foregoing, "Sell" means practicing any or all of the
33
+ rights granted to you under the License to provide to third parties, for a
34
+ fee or other consideration (including without limitation fees for hosting or
35
+ consulting/support services related to the Software), a product or service
36
+ whose value derives, entirely or substantially, from the functionality of the
37
+ Software. Any license notice or attribution required by the License must also
38
+ include this Commons Clause License Condition notice.
39
+
40
+ Software: failproofai
41
+ License: MIT
42
+ Licensor: ExosphereHost Inc
@@ -0,0 +1,10 @@
1
+ # Same reason as the SDK's: setuptools' default sdist heuristic picks up only
2
+ # top-level `test*.py`, so the suite shipped without `tests/conftest.py` (the
3
+ # `home`/`runner`/`logged_in` fixtures) and was simply unrunnable — every test
4
+ # erroring on a missing fixture. Loud rather than destructive here, unlike the
5
+ # SDK, but a suite that cannot run is not worth shipping either.
6
+ graft tests
7
+ include LICENSE
8
+ include README.md
9
+ include CHANGELOG.md
10
+ recursive-include fp_cli py.typed