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,466 @@
|
|
|
1
|
+
# failproofai-sdk
|
|
2
|
+
|
|
3
|
+
The Python SDK for [Failproof AI](https://befailproof.ai) agent observability. It
|
|
4
|
+
records what your agent did — tool calls, model requests, hooks, errors, waits for
|
|
5
|
+
a human — as structured events, and hands them to the daemon that ships them to
|
|
6
|
+
the platform.
|
|
7
|
+
|
|
8
|
+
- **PyPI distribution:** `failproofai-sdk`
|
|
9
|
+
- **Import name:** `failproofai_sdk`
|
|
10
|
+
- **Dependencies:** none. Standard library only, so installing it constrains
|
|
11
|
+
nothing else in your environment.
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install failproofai-sdk
|
|
17
|
+
# or
|
|
18
|
+
uv add failproofai-sdk
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> **Do not `pip install agenteye`.** That distribution name is occupied on PyPI by
|
|
22
|
+
> a stranded build of an old CLI, which ships a module called `agenteye_cli` and is
|
|
23
|
+
> not this SDK. Installing it gives you `ModuleNotFoundError` at best, and — if
|
|
24
|
+
> this SDK is already present — pip treats it as an upgrade and **removes the SDK**
|
|
25
|
+
> to install the CLI. The import that worked five minutes ago then stops working.
|
|
26
|
+
|
|
27
|
+
## How events reach the platform
|
|
28
|
+
|
|
29
|
+
The SDK never opens a network connection. It appends events to an in-memory queue,
|
|
30
|
+
and a background thread writes them to local JSONL batches:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
your agent → failproofai_sdk → ~/.failproofai/custom-agents/events/*.jsonl → daemon → platform
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
A daemon on the same host watches that directory and uploads each batch.
|
|
37
|
+
**`failproofaid` reads this root; the older `agenteye-collector` does not** — it
|
|
38
|
+
resolves `$AGENTEYE_HOME` or `~/.agenteye` and nothing else, so a host running
|
|
39
|
+
only that collector needs one of the three bridges in the upgrade note below, or
|
|
40
|
+
its batches pile up unread. If no daemon is running, batches simply accumulate on
|
|
41
|
+
disk — the SDK does not fail, and your agent does not block.
|
|
42
|
+
|
|
43
|
+
## Agent frameworks
|
|
44
|
+
|
|
45
|
+
If your agent runs on LangChain/LangGraph, CrewAI, LlamaIndex or Pydantic AI,
|
|
46
|
+
one line captures it — runs, sub-agents, tools, model calls and their token
|
|
47
|
+
counts — without threading an id through anything:
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
import failproofai_sdk
|
|
51
|
+
|
|
52
|
+
failproofai_sdk.configure(environment="production")
|
|
53
|
+
failproofai_sdk.instrument() # auto-detects what is already imported
|
|
54
|
+
|
|
55
|
+
graph.invoke({"messages": [...]}) # unchanged
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pip install 'failproofai-sdk[langgraph]' # or [langchain] [crewai] [llamaindex] [pydantic-ai]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The adapter code ships in the base wheel and imports its framework lazily, so
|
|
63
|
+
the extras are a convenience — `pip install failproofai-sdk` still declares no
|
|
64
|
+
dependencies at all, and `import failproofai_sdk` loads nothing outside the
|
|
65
|
+
standard library. See `skill/references/frameworks.md` for the per-framework
|
|
66
|
+
mapping, and `docs/` for a per-framework integration guide with runnable
|
|
67
|
+
examples beside it.
|
|
68
|
+
|
|
69
|
+
## Scopes
|
|
70
|
+
|
|
71
|
+
The same identity layer, for code the adapters do not cover. `session_id` and
|
|
72
|
+
`agent_id` are optional on every event method — omitted, they resolve from the
|
|
73
|
+
enclosing scope:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
with failproofai_sdk.session() as sid:
|
|
77
|
+
with failproofai_sdk.agent("planner", goal=question):
|
|
78
|
+
|
|
79
|
+
with failproofai_sdk.tool_call("search", input={"q": q}) as t:
|
|
80
|
+
t.output = search(q) # tool_use / tool_result, timed
|
|
81
|
+
|
|
82
|
+
with failproofai_sdk.agent("writer"): # a sub-agent; parent inferred
|
|
83
|
+
failproofai_sdk.event.model_request(model="...")
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`agent()` brackets a run with `agent_start`/`agent_end` and records an `error`
|
|
87
|
+
before the end event when the block raises — a cancellation closes it as
|
|
88
|
+
`cancelled` rather than failed. Every scope works under `async with` too.
|
|
89
|
+
|
|
90
|
+
Contextvars do **not** cross into a new thread, so hand work over with
|
|
91
|
+
`propagate`:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
pool.submit(failproofai_sdk.propagate(work), item)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Nothing bound and nothing passed raises `TypeError` naming the fix. It is never
|
|
98
|
+
a silent emit: ingest skips an event with no session and answers `200`.
|
|
99
|
+
|
|
100
|
+
## Quick start
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
import failproofai_sdk
|
|
104
|
+
|
|
105
|
+
# Call once at startup. Omit to use defaults (~/.failproofai/custom-agents;
|
|
106
|
+
# 500ms flush interval).
|
|
107
|
+
failproofai_sdk.configure(base_dir=None, flush_interval=0.5)
|
|
108
|
+
|
|
109
|
+
# Emit events via failproofai_sdk.event.<method>(...)
|
|
110
|
+
failproofai_sdk.event.agent_start(session_id="run-001", agent_id="planner", goal="answer user query")
|
|
111
|
+
|
|
112
|
+
failproofai_sdk.event.tool_use(
|
|
113
|
+
session_id="run-001",
|
|
114
|
+
agent_id="planner",
|
|
115
|
+
tool_name="web_search",
|
|
116
|
+
tool_call_id="toolu_01",
|
|
117
|
+
input={"query": "latest AI research"},
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
failproofai_sdk.event.tool_result(
|
|
121
|
+
session_id="run-001",
|
|
122
|
+
agent_id="planner",
|
|
123
|
+
tool_name="web_search",
|
|
124
|
+
tool_call_id="toolu_01", # matches tool_use — SDK auto-computes duration_ms
|
|
125
|
+
output={"results": ["..."]},
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
failproofai_sdk.event.agent_end(session_id="run-001", agent_id="planner", outcome="success")
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## configure()
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
failproofai_sdk.configure(
|
|
135
|
+
base_dir=None, # Path | str | None. Default:
|
|
136
|
+
# ~/.failproofai/custom-agents (honours $FAILPROOFAI_HOME)
|
|
137
|
+
flush_interval=0.5, # float, seconds between flush cycles
|
|
138
|
+
environment=None, # str | None. Else $AGENTEYE_ENVIRONMENT, else "dev"
|
|
139
|
+
)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Call once before any `event.*` call. Safe to omit — defaults work out of the box.
|
|
143
|
+
When `base_dir` is `None`, the SDK spools to `~/.failproofai/custom-agents`
|
|
144
|
+
(honouring `$FAILPROOFAI_HOME`, which moves the umbrella; the `custom-agents`
|
|
145
|
+
segment is always appended, so the spool is always inside it).
|
|
146
|
+
|
|
147
|
+
**`base_dir` is the only way to spool anywhere else.** No environment variable
|
|
148
|
+
redirects it.
|
|
149
|
+
|
|
150
|
+
**The default spool root moved.** It was `~/.agenteye`. The daemon this SDK ships
|
|
151
|
+
beside, `failproofaid`, watches **both** roots and always has, so on a host
|
|
152
|
+
running it this changes which directory the files land in and nothing else.
|
|
153
|
+
Batches already sitting in `~/.agenteye/events` are not orphaned — they stay put
|
|
154
|
+
and are still collected; that directory simply stops growing.
|
|
155
|
+
|
|
156
|
+
> [!IMPORTANT]
|
|
157
|
+
> **If you run the older `agenteye-collector`, point IT at this SDK — not the
|
|
158
|
+
> other way round.** That collector resolves `$AGENTEYE_HOME` or `~/.agenteye`
|
|
159
|
+
> and nothing else, so it does not watch where this SDK writes: no upload, no
|
|
160
|
+
> error, and an unread spool looks exactly like an idle one.
|
|
161
|
+
>
|
|
162
|
+
> `AGENTEYE_HOME` used to be the way back, and is not any more — this SDK no
|
|
163
|
+
> longer reads it, so exporting it moves the collector and leaves the SDK where
|
|
164
|
+
> it was. Pick one of:
|
|
165
|
+
>
|
|
166
|
+
> * run `failproofaid` instead — it watches **both** roots, so nothing needs
|
|
167
|
+
> configuring; or
|
|
168
|
+
> * set **the collector's** `AGENTEYE_HOME=~/.failproofai/custom-agents`, so it
|
|
169
|
+
> watches `~/.failproofai/custom-agents/events` — where this SDK writes; or
|
|
170
|
+
> * `configure(base_dir="~/.agenteye")` in the application, which is explicit
|
|
171
|
+
> and visible at the call site.
|
|
172
|
+
|
|
173
|
+
`AGENTEYE_SPOOL_TO_FAILPROOFAI` is **retired**. It selected this root, but also
|
|
174
|
+
required the directory to already exist — and nothing ever created it, so the
|
|
175
|
+
opt-in never fired. Anyone who set it already wanted this and now gets it.
|
|
176
|
+
|
|
177
|
+
## Event reference
|
|
178
|
+
|
|
179
|
+
All event methods share two required fields:
|
|
180
|
+
|
|
181
|
+
| Field | Type | Description |
|
|
182
|
+
|-------|------|-------------|
|
|
183
|
+
| `session_id` | `str` | Identifies the top-level agent run |
|
|
184
|
+
| `agent_id` | `str` | Identifies which agent within the session emitted the event |
|
|
185
|
+
|
|
186
|
+
Every method also accepts arbitrary `**fields` for custom metadata (see [Custom fields](#custom-fields)).
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
### `event.tool_use()`
|
|
191
|
+
|
|
192
|
+
Emitted when an agent invokes a tool. Pair with `tool_result` — the SDK auto-computes `duration_ms`.
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
failproofai_sdk.event.tool_use(
|
|
196
|
+
session_id="run-001",
|
|
197
|
+
agent_id="planner",
|
|
198
|
+
tool_name="web_search", # str, required
|
|
199
|
+
tool_call_id="toolu_01", # str, required — correlation key for the matching tool_result
|
|
200
|
+
input={"query": "..."}, # dict | None
|
|
201
|
+
)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### `event.tool_result()`
|
|
207
|
+
|
|
208
|
+
Emitted when a tool returns. Correlates with `tool_use` via `tool_call_id`.
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
failproofai_sdk.event.tool_result(
|
|
212
|
+
session_id="run-001",
|
|
213
|
+
agent_id="planner",
|
|
214
|
+
tool_name="web_search",
|
|
215
|
+
tool_call_id="toolu_01", # must match the prior tool_use
|
|
216
|
+
output={"results": ["..."]}, # Any | None
|
|
217
|
+
error=None, # str | None — set if the tool raised
|
|
218
|
+
# duration_ms is computed automatically — do not pass it
|
|
219
|
+
)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
### `event.model_request()`
|
|
225
|
+
|
|
226
|
+
Emitted just before sending a prompt to an LLM.
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
failproofai_sdk.event.model_request(
|
|
230
|
+
session_id="run-001",
|
|
231
|
+
agent_id="planner",
|
|
232
|
+
model="claude-opus-4-6", # str | None
|
|
233
|
+
messages=[ # list[dict] | None — conversation turns
|
|
234
|
+
{"role": "user", "content": "..."},
|
|
235
|
+
],
|
|
236
|
+
system="You are helpful.", # Any | None — str or list of content blocks
|
|
237
|
+
tools=[ # list[dict] | None — tool schemas offered to the model
|
|
238
|
+
{"name": "search", "input_schema": {"type": "object"}},
|
|
239
|
+
],
|
|
240
|
+
)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`messages` entries accept either a plain string `content` or Anthropic-style list-of-blocks `content`. Sampling params (`temperature`, `max_tokens`, etc.) can be passed as extra kwargs.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
### `event.model_response()`
|
|
248
|
+
|
|
249
|
+
Emitted when the LLM returns a response.
|
|
250
|
+
|
|
251
|
+
```python
|
|
252
|
+
failproofai_sdk.event.model_response(
|
|
253
|
+
session_id="run-001",
|
|
254
|
+
agent_id="planner",
|
|
255
|
+
model="claude-opus-4-6", # str | None
|
|
256
|
+
stop_reason="end_turn", # str | None
|
|
257
|
+
input_tokens=1024, # int | None
|
|
258
|
+
output_tokens=256, # int | None
|
|
259
|
+
content=[ # Any | None — str, or list of content blocks
|
|
260
|
+
{"type": "text", "text": "..."},
|
|
261
|
+
],
|
|
262
|
+
role="assistant", # str | None
|
|
263
|
+
)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
`content` accepts either a plain string (generic providers) or a list of Anthropic-style content blocks. Tool calls live inside `content` as `{"type": "tool_use", ...}` blocks — no separate `tool_calls` field.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
### `event.agent_start()`
|
|
271
|
+
|
|
272
|
+
Emitted when an agent begins work.
|
|
273
|
+
|
|
274
|
+
```python
|
|
275
|
+
failproofai_sdk.event.agent_start(
|
|
276
|
+
session_id="run-001",
|
|
277
|
+
agent_id="planner",
|
|
278
|
+
goal="answer user query", # str | None
|
|
279
|
+
parent_id=None, # str | None — parent agent_id for nested agents
|
|
280
|
+
)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### `event.agent_end()`
|
|
286
|
+
|
|
287
|
+
Emitted when an agent finishes work.
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
failproofai_sdk.event.agent_end(
|
|
291
|
+
session_id="run-001",
|
|
292
|
+
agent_id="planner",
|
|
293
|
+
outcome="success", # str | None
|
|
294
|
+
summary="Answered query", # str | None
|
|
295
|
+
)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
### `event.agent_pause()`
|
|
301
|
+
|
|
302
|
+
Emitted when an agent is suspended (e.g. waiting for human input, user-requested
|
|
303
|
+
pause, throttling). Does **not** end the agent — pair it with `agent_resume`, and
|
|
304
|
+
the SDK auto-computes the paused `duration_ms`. Emit `agent_resume` instead of a
|
|
305
|
+
second `agent_start` when the agent continues.
|
|
306
|
+
|
|
307
|
+
```python
|
|
308
|
+
failproofai_sdk.event.agent_pause(
|
|
309
|
+
session_id="run-001",
|
|
310
|
+
agent_id="planner",
|
|
311
|
+
pause_id="pause-abc", # str, required — correlation key (reuse it on agent_resume)
|
|
312
|
+
reason="waiting_for_user", # str | None
|
|
313
|
+
user_id="usr_42", # str | None — who paused, if user-initiated
|
|
314
|
+
)
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
`pause_id` is emitted on both events, so a pause always pairs to its resume — even
|
|
318
|
+
when they happen in different processes (in that case `duration_ms` is omitted and
|
|
319
|
+
the interval is derived downstream from the two timestamps).
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
### `event.agent_resume()`
|
|
324
|
+
|
|
325
|
+
Emitted when a paused agent continues. Correlates with `agent_pause` via `pause_id`;
|
|
326
|
+
the SDK auto-computes `duration_ms` (how long the agent was paused).
|
|
327
|
+
|
|
328
|
+
```python
|
|
329
|
+
failproofai_sdk.event.agent_resume(
|
|
330
|
+
session_id="run-001",
|
|
331
|
+
agent_id="planner",
|
|
332
|
+
pause_id="pause-abc", # str, required — must match the prior agent_pause
|
|
333
|
+
reason="user_resumed", # str | None
|
|
334
|
+
user_id="usr_42", # str | None
|
|
335
|
+
# duration_ms is computed automatically — do not pass it
|
|
336
|
+
)
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
### `event.hook_triggered()`
|
|
342
|
+
|
|
343
|
+
Emitted when a hook fires. Pair with `hook_completed` — the SDK auto-computes `duration_ms`.
|
|
344
|
+
|
|
345
|
+
```python
|
|
346
|
+
failproofai_sdk.event.hook_triggered(
|
|
347
|
+
session_id="run-001",
|
|
348
|
+
agent_id="planner",
|
|
349
|
+
hook_name="pre_tool_use", # str, required
|
|
350
|
+
hook_id="hook-abc", # str, required — correlation key
|
|
351
|
+
trigger_event="tool_use", # str | None
|
|
352
|
+
input={"tool": "search"}, # Any | None
|
|
353
|
+
)
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
### `event.hook_completed()`
|
|
359
|
+
|
|
360
|
+
Emitted when a hook finishes. Correlates with `hook_triggered` via `hook_id`.
|
|
361
|
+
|
|
362
|
+
```python
|
|
363
|
+
failproofai_sdk.event.hook_completed(
|
|
364
|
+
session_id="run-001",
|
|
365
|
+
agent_id="planner",
|
|
366
|
+
hook_name="pre_tool_use",
|
|
367
|
+
hook_id="hook-abc", # must match the prior hook_triggered
|
|
368
|
+
outcome="allow", # str | None
|
|
369
|
+
output=None, # Any | None
|
|
370
|
+
error=None, # str | None
|
|
371
|
+
# duration_ms is computed automatically — do not pass it
|
|
372
|
+
)
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
### `event.error()`
|
|
378
|
+
|
|
379
|
+
Emitted when an unhandled error occurs.
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
failproofai_sdk.event.error(
|
|
383
|
+
session_id="run-001",
|
|
384
|
+
agent_id="planner",
|
|
385
|
+
error_type="TimeoutError", # str, required
|
|
386
|
+
message="timed out", # str, required
|
|
387
|
+
traceback="Traceback...", # str | None
|
|
388
|
+
)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Custom fields
|
|
394
|
+
|
|
395
|
+
Any extra keyword arguments are appended to the event after the standard fields:
|
|
396
|
+
|
|
397
|
+
```python
|
|
398
|
+
failproofai_sdk.event.tool_use(
|
|
399
|
+
session_id="run-001",
|
|
400
|
+
agent_id="planner",
|
|
401
|
+
tool_name="db_query",
|
|
402
|
+
tool_call_id="toolu_02",
|
|
403
|
+
request_id="req-123", # custom field
|
|
404
|
+
tenant_id="acme", # custom field
|
|
405
|
+
)
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
The field names `timestamp`, `type`, and `environment` are reserved and raise
|
|
409
|
+
`ValueError` if passed as custom fields. `session_id` and `agent_id` are required
|
|
410
|
+
parameters and cannot be supplied a second time. Set the environment with
|
|
411
|
+
`configure(environment=...)` or `AGENTEYE_ENVIRONMENT`.
|
|
412
|
+
|
|
413
|
+
Keep payloads as structured JSON when downstream queries need their fields. Values
|
|
414
|
+
JSON does not natively support—such as datetimes, UUIDs, decimals, sets, bytes, or
|
|
415
|
+
model objects—are converted to strings so the writer can continue flushing the batch.
|
|
416
|
+
|
|
417
|
+
## JSONL output
|
|
418
|
+
|
|
419
|
+
Events are buffered in-process and flushed to disk every `flush_interval` seconds (default 500ms).
|
|
420
|
+
Each flush writes one JSONL file:
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
~/.failproofai/custom-agents/events/event-2026-04-01T12-00-00-000Z-48213-7.jsonl
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Each line is one JSON object. Example:
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
{"timestamp": "2026-04-01T12:00:00.000000Z", "session_id": "run-001", "agent_id": "planner", "type": "agent_start", "goal": "answer user query"}
|
|
430
|
+
{"timestamp": "2026-04-01T12:00:00.123456Z", "session_id": "run-001", "agent_id": "planner", "type": "tool_use", "tool_name": "web_search", "tool_call_id": "toolu_01"}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
The batch is published by writing a `.tmp` file and atomically renaming it to
|
|
434
|
+
`.jsonl`, so a daemon polling the directory never reads a half-written file. The
|
|
435
|
+
trailing `<pid>-<seq>` keeps two batches written in the same millisecond — by two
|
|
436
|
+
threads, or by two agent processes sharing the spool — from overwriting each
|
|
437
|
+
other. You do not need to manage these files directly.
|
|
438
|
+
|
|
439
|
+
## Development
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
# Install dev dependencies
|
|
443
|
+
uv sync --locked --extra dev
|
|
444
|
+
|
|
445
|
+
# Run the test suite
|
|
446
|
+
uv run pytest tests/ -v
|
|
447
|
+
|
|
448
|
+
# Run a single test
|
|
449
|
+
uv run pytest tests/test_sdk.py -k duration -v
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
| Suite | What it holds |
|
|
453
|
+
|---|---|
|
|
454
|
+
| `test_sdk.py` | The public API — every event method, unit and on-disk |
|
|
455
|
+
| `test_wire_format.py` | Golden bytes for all 15 event types, frozen |
|
|
456
|
+
| `test_server_contract.py` | The keys ingest promotes to indexed columns |
|
|
457
|
+
| `test_spool_contract.py` | Agreement with the daemons that read the spool |
|
|
458
|
+
| `test_durability.py` | Concurrency, crash and retry paths — nothing silently lost |
|
|
459
|
+
| `test_zero_dependencies.py` | The stdlib-only guarantee |
|
|
460
|
+
| `test_no_customer_identifiers.py` | Nothing private ships in a public wheel |
|
|
461
|
+
|
|
462
|
+
Two suites reach for sources outside this package. `test_spool_contract.py` reads
|
|
463
|
+
the Rust and TypeScript in this repo and never skips; set
|
|
464
|
+
`FAILPROOFAI_SDK_REQUIRE_CONTRACT=1` (CI does) so a moved file fails instead of
|
|
465
|
+
skipping. Set `FP_AGENTEYE_ROOT` to an AgentEye checkout to additionally verify
|
|
466
|
+
against the older collector and the live ingest handler.
|