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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +6 -6
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js +3 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +5 -4
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +4 -3
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +4 -4
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +4 -4
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +66 -22
- package/.next/standalone/.next/server/app/policies/page.js +5 -4
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +2 -2
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +2 -2
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__1qzqcio._.js → [externals]__0e32-7c._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[externals]__1s462yl._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01eqny5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1p8poxd._.js → [root-of-the-server]__0igxt32._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0neqlu-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t9oqnn._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0bs-v8p._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +3 -0
- package/.next/standalone/.next/server/chunks/_185gyk9._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1ek68ln._.js +5 -6
- package/.next/standalone/.next/server/chunks/lib_telemetry-id_ts_1k8gj9o._.js +3 -0
- 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
- 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
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_0xbw3bu._.js +12 -0
- package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0spkm68._.js → [root-of-the-server]__07gm3zl._.js} +21 -20
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07tbbf3._.js → [root-of-the-server]__0zig5sv._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__192nhvh._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0lvyuv4._.js → _00e9tnf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0u5zauv._.js → _12l4a_k._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +13 -13
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_08o7bqo._.js +10 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +71 -27
- package/.next/standalone/.next/static/chunks/{37fcpc36x9gpe.js → 0eqky-7n7dgdm.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1ide1wl2f7zi1.js → 0sa9v5mhc8861.js} +13 -13
- package/.next/standalone/.next/static/chunks/1mfzsja6ftim5.css +2 -0
- package/.next/standalone/.next/static/chunks/{3k7mxbp9hiom0.js → 1nuqytbta44af.js} +1 -1
- package/.next/standalone/.next/static/chunks/1sl2xmn9inx3y.js +6 -0
- package/.next/standalone/.next/static/chunks/{2_2lhuojq2xop.js → 2aawsjld9ied_.js} +1 -1
- package/.next/standalone/.next/static/chunks/2gn7ut4svofm2.js +1 -0
- package/.next/standalone/.next/static/chunks/{31s1smp-g7gks.js → 2hs7ycvsav7v2.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0k5050ezjvv49.js → 2i2yt3hzjredm.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3c808qrfcq0im.js → 35xg6retpe6rp.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2zpp1we2jv6tb.js → 3y54nw0i7dsjl.js} +1 -1
- package/.next/standalone/SECURITY.md +5 -4
- package/.next/standalone/app/actions/get-hooks-config.ts +108 -17
- package/.next/standalone/app/actions/pack-actions.ts +153 -0
- package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
- package/.next/standalone/app/audit/_components/share-templates.ts +13 -13
- package/.next/standalone/app/policies/hooks-client.tsx +320 -14
- package/.next/standalone/components/navbar.tsx +2 -28
- package/.next/standalone/components/reach-developers.tsx +8 -1
- package/.next/standalone/docs-old/agenteye/python-sdk-skill.mdx +1 -1
- package/.next/standalone/docs-old/agenteye/python-sdk.mdx +59 -35
- package/.next/standalone/docs-old/i18n/README.ar.md +1 -0
- package/.next/standalone/docs-old/i18n/README.de.md +1 -0
- package/.next/standalone/docs-old/i18n/README.es.md +1 -0
- package/.next/standalone/docs-old/i18n/README.fr.md +1 -0
- package/.next/standalone/docs-old/i18n/README.he.md +1 -0
- package/.next/standalone/docs-old/i18n/README.hi.md +1 -0
- package/.next/standalone/docs-old/i18n/README.it.md +1 -0
- package/.next/standalone/docs-old/i18n/README.ja.md +1 -0
- package/.next/standalone/docs-old/i18n/README.ko.md +1 -0
- package/.next/standalone/docs-old/i18n/README.pt-br.md +1 -0
- package/.next/standalone/docs-old/i18n/README.ru.md +1 -0
- package/.next/standalone/docs-old/i18n/README.tr.md +1 -0
- package/.next/standalone/docs-old/i18n/README.vi.md +1 -0
- package/.next/standalone/docs-old/i18n/README.zh.md +1 -0
- package/.next/standalone/fp-cloud-cli/CHANGELOG.md +431 -0
- package/.next/standalone/fp-cloud-cli/LICENSE +42 -0
- package/.next/standalone/fp-cloud-cli/MANIFEST.in +10 -0
- package/.next/standalone/fp-cloud-cli/README.md +259 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/__init__.py +10 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/__main__.py +4 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/_click_compat.py +64 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/_context.py +332 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/_version.py +1 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/analytics.py +432 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/analytics_config.py +77 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/analytics_registry.py +83 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/app.py +492 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/auth.py +160 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/client.py +1694 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/__init__.py +0 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/_write.py +214 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/agent_cmds.py +407 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/alerts_cmds.py +445 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/audits_cmds.py +1054 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/auth_cmds.py +512 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/errors_cmds.py +190 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/evals_cmds.py +161 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/events_cmds.py +159 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/fleet_cmds.py +416 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/guardrails_cmds.py +148 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/incidents_cmds.py +472 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/keys_cmds.py +407 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/list_cmds.py +63 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/orgs_cmds.py +319 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/policies_cmds.py +499 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/queries_cmds.py +378 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/sessions_cmds.py +151 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/settings_cmds.py +150 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/usage_cmds.py +35 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/commands/users_cmds.py +404 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/config.py +330 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/dates.py +78 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/enforcement.py +345 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/errors.py +98 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/models.py +891 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/orgs.py +30 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/output.py +6593 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/permissions.py +208 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/policy_check.py +290 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/py.typed +0 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/select.py +322 -0
- package/.next/standalone/fp-cloud-cli/fp_cli/theme.py +53 -0
- package/.next/standalone/fp-cloud-cli/pyproject.toml +106 -0
- package/.next/standalone/fp-cloud-cli/skill/SKILL.md +302 -0
- package/.next/standalone/fp-cloud-cli/skill/agents/openai.yaml +8 -0
- package/.next/standalone/fp-cloud-cli/skill/references/commands.md +254 -0
- package/.next/standalone/fp-cloud-cli/tests/__init__.py +0 -0
- package/.next/standalone/fp-cloud-cli/tests/conftest.py +92 -0
- package/.next/standalone/fp-cloud-cli/tests/test_alerting.py +644 -0
- package/.next/standalone/fp-cloud-cli/tests/test_analytics.py +385 -0
- package/.next/standalone/fp-cloud-cli/tests/test_audits.py +950 -0
- package/.next/standalone/fp-cloud-cli/tests/test_auth.py +98 -0
- package/.next/standalone/fp-cloud-cli/tests/test_auth_mode.py +272 -0
- package/.next/standalone/fp-cloud-cli/tests/test_click_compat.py +118 -0
- package/.next/standalone/fp-cloud-cli/tests/test_client.py +299 -0
- package/.next/standalone/fp-cloud-cli/tests/test_commands.py +814 -0
- package/.next/standalone/fp-cloud-cli/tests/test_config.py +99 -0
- package/.next/standalone/fp-cloud-cli/tests/test_dashboards_agent.py +340 -0
- package/.next/standalone/fp-cloud-cli/tests/test_dates.py +76 -0
- package/.next/standalone/fp-cloud-cli/tests/test_enforcement_logic.py +481 -0
- package/.next/standalone/fp-cloud-cli/tests/test_facets.py +170 -0
- package/.next/standalone/fp-cloud-cli/tests/test_failproofai_home.py +722 -0
- package/.next/standalone/fp-cloud-cli/tests/test_fp_home_contract.py +198 -0
- package/.next/standalone/fp-cloud-cli/tests/test_hardening.py +186 -0
- package/.next/standalone/fp-cloud-cli/tests/test_help_table_coverage.py +127 -0
- package/.next/standalone/fp-cloud-cli/tests/test_keys_queries.py +496 -0
- package/.next/standalone/fp-cloud-cli/tests/test_list.py +59 -0
- package/.next/standalone/fp-cloud-cli/tests/test_multivalue.py +183 -0
- package/.next/standalone/fp-cloud-cli/tests/test_no_customer_identifiers.py +168 -0
- package/.next/standalone/fp-cloud-cli/tests/test_operator.py +492 -0
- package/.next/standalone/fp-cloud-cli/tests/test_orgs.py +692 -0
- package/.next/standalone/fp-cloud-cli/tests/test_output.py +1732 -0
- package/.next/standalone/fp-cloud-cli/tests/test_policy_check.py +191 -0
- package/.next/standalone/fp-cloud-cli/tests/test_readme_matches_reality.py +125 -0
- package/.next/standalone/fp-cloud-cli/tests/test_review_fixes.py +161 -0
- package/.next/standalone/fp-cloud-cli/tests/test_telemetry_completeness.py +90 -0
- package/.next/standalone/fp-cloud-cli/tests/test_usage.py +115 -0
- package/.next/standalone/fp-cloud-cli/tests/test_v1_origin_diagnostic.py +70 -0
- package/.next/standalone/fp-cloud-cli/tests/test_v1_routing.py +214 -0
- package/.next/standalone/fp-cloud-cli/tests/test_whoami.py +104 -0
- package/.next/standalone/fp-cloud-cli/uv.lock +552 -0
- package/.next/standalone/package.json +29 -22
- package/.next/standalone/sdk/python/CHANGELOG.md +70 -0
- package/.next/standalone/sdk/python/LICENSE +42 -0
- package/.next/standalone/sdk/python/MANIFEST.in +21 -0
- package/.next/standalone/sdk/python/README.md +466 -0
- package/.next/standalone/sdk/python/docs/README.md +249 -0
- package/.next/standalone/sdk/python/docs/_shared/README.md +43 -0
- package/.next/standalone/sdk/python/docs/_shared/__init__.py +195 -0
- package/.next/standalone/sdk/python/docs/crewai/README.md +328 -0
- package/.next/standalone/sdk/python/docs/crewai/examples/quickstart.py +61 -0
- package/.next/standalone/sdk/python/docs/crewai/examples/research_crew.py +92 -0
- package/.next/standalone/sdk/python/docs/langgraph/README.md +481 -0
- package/.next/standalone/sdk/python/docs/langgraph/examples/quickstart.py +51 -0
- package/.next/standalone/sdk/python/docs/langgraph/examples/research_agent.py +86 -0
- package/.next/standalone/sdk/python/docs/langgraph/examples/supervisor_handoff.py +83 -0
- package/.next/standalone/sdk/python/docs/llama_index/README.md +332 -0
- package/.next/standalone/sdk/python/docs/llama_index/examples/quickstart.py +62 -0
- package/.next/standalone/sdk/python/docs/llama_index/examples/research_agent.py +93 -0
- package/.next/standalone/sdk/python/docs/manual/README.md +491 -0
- package/.next/standalone/sdk/python/docs/manual/examples/quickstart.py +57 -0
- package/.next/standalone/sdk/python/docs/manual/examples/research_agent.py +133 -0
- package/.next/standalone/sdk/python/docs/pydantic_ai/README.md +323 -0
- package/.next/standalone/sdk/python/docs/pydantic_ai/examples/quickstart.py +48 -0
- package/.next/standalone/sdk/python/docs/pydantic_ai/examples/research_agent.py +94 -0
- package/.next/standalone/sdk/python/failproofai_sdk/__init__.py +131 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_context.py +218 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_environment.py +78 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_events.py +752 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_resolver.py +118 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_runtime.py +21 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_schema.py +317 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_scopes.py +422 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_version.py +1 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_writer.py +750 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/__init__.py +274 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/_compat.py +247 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/_core.py +1076 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/crewai.py +1669 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/langchain.py +2151 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/llama_index.py +1588 -0
- package/.next/standalone/sdk/python/failproofai_sdk/integrations/pydantic_ai.py +977 -0
- package/.next/standalone/sdk/python/failproofai_sdk/py.typed +0 -0
- package/.next/standalone/sdk/python/pyproject.toml +92 -0
- package/.next/standalone/sdk/python/skill/SKILL.md +399 -0
- package/.next/standalone/sdk/python/skill/agents/openai.yaml +8 -0
- package/.next/standalone/sdk/python/skill/references/events.md +234 -0
- package/.next/standalone/sdk/python/skill/references/frameworks.md +314 -0
- package/.next/standalone/sdk/python/skill/references/install.md +100 -0
- package/.next/standalone/sdk/python/skill/references/integration.md +352 -0
- package/.next/standalone/sdk/python/tests/__init__.py +0 -0
- package/.next/standalone/sdk/python/tests/conftest.py +169 -0
- package/.next/standalone/sdk/python/tests/integrations/__init__.py +6 -0
- package/.next/standalone/sdk/python/tests/integrations/test_crewai.py +1299 -0
- package/.next/standalone/sdk/python/tests/integrations/test_langchain.py +2338 -0
- package/.next/standalone/sdk/python/tests/integrations/test_llama_index.py +1576 -0
- package/.next/standalone/sdk/python/tests/integrations/test_pydantic_ai.py +1102 -0
- package/.next/standalone/sdk/python/tests/test_context.py +410 -0
- package/.next/standalone/sdk/python/tests/test_docs.py +411 -0
- package/.next/standalone/sdk/python/tests/test_durability.py +1352 -0
- package/.next/standalone/sdk/python/tests/test_encoding.py +571 -0
- package/.next/standalone/sdk/python/tests/test_integrations.py +1127 -0
- package/.next/standalone/sdk/python/tests/test_no_customer_identifiers.py +214 -0
- package/.next/standalone/sdk/python/tests/test_packaging.py +185 -0
- package/.next/standalone/sdk/python/tests/test_resolver_umbrella.py +178 -0
- package/.next/standalone/sdk/python/tests/test_scopes.py +487 -0
- package/.next/standalone/sdk/python/tests/test_sdk.py +923 -0
- package/.next/standalone/sdk/python/tests/test_server_contract.py +650 -0
- package/.next/standalone/sdk/python/tests/test_site_docs.py +371 -0
- package/.next/standalone/sdk/python/tests/test_skill_snippets.py +165 -0
- package/.next/standalone/sdk/python/tests/test_spool_contract.py +287 -0
- package/.next/standalone/sdk/python/tests/test_spool_creation.py +360 -0
- package/.next/standalone/sdk/python/tests/test_wire_format.py +279 -0
- package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +378 -0
- package/.next/standalone/sdk/python/uv.lock +6005 -0
- package/.next/standalone/server.js +1 -1
- package/README.md +77 -21
- package/bin/failproofai.mjs +145 -11
- package/dist/cli.mjs +4482 -2205
- package/dist/index.js +5 -5
- package/dist/worker.mjs +2399 -1978
- package/package.json +29 -22
- package/policy-pack/SHA256SUMS +2 -0
- package/policy-pack/failproofai-pack.json +732 -0
- package/policy-pack/failproofai-pack.mjs +2017 -0
- package/scripts/build-policy-pack.mjs +121 -0
- package/scripts/changelog-section.py +77 -0
- package/scripts/prune-standalone.mjs +3 -0
- package/scripts/python-version.py +232 -0
- package/scripts/translate-docs/cli.ts +21 -0
- package/scripts/translate-docs/mintlify-nav.ts +85 -13
- package/scripts/translate-docs/translator.ts +66 -11
- package/src/audit/cache.ts +40 -3
- package/src/audit/cli.ts +1 -1
- package/src/audit/index.ts +1 -1
- package/src/audit/replay.ts +89 -3
- package/src/audit/report.ts +5 -5
- package/src/audit/schedule-cli.ts +49 -53
- package/src/hooks/builtin-policies.ts +217 -579
- package/src/hooks/cloud-enrollment-cli.ts +66 -27
- package/src/hooks/cloud-managed-policies.ts +6 -1
- package/src/hooks/configure-wizard.ts +1 -1
- package/src/hooks/custom-hooks-loader.ts +89 -6
- package/src/hooks/fp-home.ts +92 -4
- package/src/hooks/fp-reset.ts +26 -2
- package/src/hooks/handler.ts +181 -11
- package/src/hooks/harness-cli.ts +79 -25
- package/src/hooks/hook-activity-store.ts +13 -3
- package/src/hooks/install-prompt.ts +25 -3
- package/src/hooks/manager.ts +418 -172
- package/src/hooks/migrations.ts +2 -2
- package/src/hooks/pack-cli.ts +505 -0
- package/src/hooks/pack-failclosed.ts +189 -0
- package/src/hooks/pack-manifest.ts +344 -0
- package/src/hooks/pack-store.ts +930 -0
- package/src/hooks/policy-catalog.ts +535 -0
- package/src/hooks/policy-evaluator.ts +24 -16
- package/src/hooks/policy-presets.ts +4 -2
- package/src/hooks/policy-registry.ts +8 -2
- package/src/hooks/policy-types.ts +26 -0
- package/src/hooks/session-pause-cli.ts +33 -9
- package/src/hooks/tui.ts +570 -0
- package/src/hooks/types.ts +15 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_usx0j._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_zk340._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0agdw2a._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d1u_na._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1ger0a2._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_1iiwm5e._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kc8_v5._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kgy9da._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mhqk5a._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pltpn8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qkcyf-._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0x_ok._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1_dfocn._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1bfex62._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kzapg5._.js +0 -6
- package/.next/standalone/.next/static/chunks/36fw6yk1s6x_f.js +0 -1
- package/.next/standalone/.next/static/chunks/3tzq0260n17ae.js +0 -6
- package/.next/standalone/.next/static/chunks/3wq9x0c-7ld5d.css +0 -2
- /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → nwbyWT06Ud0XdXOrVJyvS}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ZklXxyA5ygsWSQz2u_zii → nwbyWT06Ud0XdXOrVJyvS}/_clientMiddlewareManifest.js +0 -0
- /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
|