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,218 @@
|
|
|
1
|
+
"""Ambient run identity, carried on contextvars.
|
|
2
|
+
|
|
3
|
+
Before this module the SDK had no ambient session: every `event.*` call took
|
|
4
|
+
`session_id` and `agent_id` as required keyword arguments and nothing propagated
|
|
5
|
+
them. Threading both through every function that might emit an event is what makes
|
|
6
|
+
instrumentation sprawl into a diff nobody wants to review.
|
|
7
|
+
|
|
8
|
+
Two contextvars carry it instead. Read them through `current()`, or let
|
|
9
|
+
`failproofai_sdk._events` fall back to them when a caller omits the identity.
|
|
10
|
+
|
|
11
|
+
Why a tuple and not a list
|
|
12
|
+
--------------------------
|
|
13
|
+
`_AGENT_STACK` holds a **tuple**. A `ContextVar[list]` is shared *by reference*
|
|
14
|
+
across tasks and threads, so `.append()` in one task mutates the value every other
|
|
15
|
+
task sees — which is exactly the cross-run event mixing contextvars are here to
|
|
16
|
+
prevent, wearing a contextvars costume. It passes every single-threaded test.
|
|
17
|
+
Push is `set(stack + (aid,))`; pop is `reset(token)`.
|
|
18
|
+
|
|
19
|
+
There is deliberately no `_AGENT_ID` var: the top of the stack *is* the current
|
|
20
|
+
agent id, so the two cannot drift apart, and `parent_id` is `stack[-2]`.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import contextvars
|
|
24
|
+
import functools
|
|
25
|
+
import logging
|
|
26
|
+
from dataclasses import dataclass
|
|
27
|
+
from typing import Any, Callable
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
# The agent_id used when events are emitted with a session bound but no agent
|
|
32
|
+
# scope. "main" is the convention the skill and the reference integration already
|
|
33
|
+
# teach, so an un-scoped event lands somewhere sensible rather than raising.
|
|
34
|
+
DEFAULT_AGENT_ID = "main"
|
|
35
|
+
|
|
36
|
+
_SESSION_ID: contextvars.ContextVar[str | None] = contextvars.ContextVar(
|
|
37
|
+
"failproofai_sdk_session_id", default=None
|
|
38
|
+
)
|
|
39
|
+
_AGENT_STACK: contextvars.ContextVar[tuple[str, ...]] = contextvars.ContextVar(
|
|
40
|
+
"failproofai_sdk_agent_stack", default=()
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True, slots=True)
|
|
45
|
+
class Identity:
|
|
46
|
+
"""The run identity in scope. Never None — check `session_id is None` instead."""
|
|
47
|
+
|
|
48
|
+
session_id: str | None
|
|
49
|
+
agent_id: str | None
|
|
50
|
+
parent_id: str | None
|
|
51
|
+
depth: int
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def current() -> Identity:
|
|
55
|
+
"""The identity bound to the current context.
|
|
56
|
+
|
|
57
|
+
`failproofai_sdk.current().session_id is None` means nothing is bound — either no
|
|
58
|
+
scope was entered, or this is a fresh thread that did not inherit one (see
|
|
59
|
+
`propagate`).
|
|
60
|
+
"""
|
|
61
|
+
stack = _AGENT_STACK.get()
|
|
62
|
+
return Identity(
|
|
63
|
+
session_id=_SESSION_ID.get(),
|
|
64
|
+
agent_id=stack[-1] if stack else None,
|
|
65
|
+
parent_id=stack[-2] if len(stack) >= 2 else None,
|
|
66
|
+
depth=len(stack),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def session_id() -> str | None:
|
|
71
|
+
"""The bound session id, or None. Hot path — allocates no Identity."""
|
|
72
|
+
return _SESSION_ID.get()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def agent_id() -> str:
|
|
76
|
+
"""The current agent id, falling back to DEFAULT_AGENT_ID."""
|
|
77
|
+
stack = _AGENT_STACK.get()
|
|
78
|
+
return stack[-1] if stack else DEFAULT_AGENT_ID
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def parent_agent_id() -> str | None:
|
|
82
|
+
"""The enclosing agent id, or None at depth 0 or 1."""
|
|
83
|
+
stack = _AGENT_STACK.get()
|
|
84
|
+
return stack[-2] if len(stack) >= 2 else None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def bind_session(sid: str) -> contextvars.Token:
|
|
88
|
+
return _SESSION_ID.set(sid)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def push_agent(aid: str) -> contextvars.Token:
|
|
92
|
+
return _AGENT_STACK.set(_AGENT_STACK.get() + (aid,))
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def reset(token: contextvars.Token | None) -> bool:
|
|
96
|
+
"""Restore a contextvar to its pre-`set` value, tolerating a cross-context token.
|
|
97
|
+
|
|
98
|
+
`ContextVar.reset()` raises `ValueError: Token was created in a different
|
|
99
|
+
Context` when the token was minted in another thread *or another asyncio task*.
|
|
100
|
+
That happens when a scope is entered in one task and exited in another — not
|
|
101
|
+
always the caller's bug, as this used to say: asyncio finalizes an abandoned
|
|
102
|
+
async generator from a task of its own, so an `agent()` scope around a
|
|
103
|
+
`yield` gets its `__aexit__` run somewhere the token is foreign through no
|
|
104
|
+
fault of the code that wrote it.
|
|
105
|
+
|
|
106
|
+
Returns True when the token-based restore succeeded. It is a `bool` rather
|
|
107
|
+
than `None` so the caller can repair the values directly instead of leaving
|
|
108
|
+
a closed span on someone's stack; swallowing the error was never enough on
|
|
109
|
+
its own.
|
|
110
|
+
"""
|
|
111
|
+
if token is None:
|
|
112
|
+
return True
|
|
113
|
+
try:
|
|
114
|
+
token.var.reset(token)
|
|
115
|
+
return True
|
|
116
|
+
except ValueError:
|
|
117
|
+
# WARNING, once, not a debug line. The consequence is not cosmetic: the
|
|
118
|
+
# frame this scope pushed stays bound in whatever context it was set in,
|
|
119
|
+
# so identity is wrong for everything that follows there. The caller
|
|
120
|
+
# cannot discover that any other way — there is no exception, and the
|
|
121
|
+
# events look plausible.
|
|
122
|
+
#
|
|
123
|
+
# It cannot always be repaired, either. When the set and the reset happen
|
|
124
|
+
# in different asyncio TASKS — the async-generator case in `agent()`'s
|
|
125
|
+
# docstring — `ContextVar.set` from this task cannot reach the context
|
|
126
|
+
# the value is bound in, so the caller has to change the code. Saying so
|
|
127
|
+
# once is the most this layer can do.
|
|
128
|
+
global _warned_cross_context
|
|
129
|
+
if not _warned_cross_context:
|
|
130
|
+
_warned_cross_context = True
|
|
131
|
+
logger.warning(
|
|
132
|
+
"failproofai_sdk: a scope was entered in one context and exited in "
|
|
133
|
+
"another, so its identity could not be unwound and later events in "
|
|
134
|
+
"the entering context may be attributed to it. The usual cause is an "
|
|
135
|
+
"`agent()`/`session()` scope spanning a `yield` in an async generator; "
|
|
136
|
+
"pass session_id=/agent_id= explicitly there instead.",
|
|
137
|
+
exc_info=True,
|
|
138
|
+
)
|
|
139
|
+
return False
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def discard_agent(agent_id: str) -> None:
|
|
143
|
+
"""Remove ONE frame for `agent_id` from the current stack, innermost first.
|
|
144
|
+
|
|
145
|
+
The fallback for a token that cannot be reset. Removes a single occurrence
|
|
146
|
+
rather than every match, because the same `agent_id` may legitimately be on
|
|
147
|
+
the stack twice (a recursive agent), and dropping both would corrupt the
|
|
148
|
+
outer one to fix the inner.
|
|
149
|
+
"""
|
|
150
|
+
stack = _AGENT_STACK.get()
|
|
151
|
+
for i in range(len(stack) - 1, -1, -1):
|
|
152
|
+
if stack[i] == agent_id:
|
|
153
|
+
_AGENT_STACK.set(stack[:i] + stack[i + 1 :])
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def restore_session(session_id: str | None) -> None:
|
|
158
|
+
"""Put the session id back to a value captured before the scope was entered."""
|
|
159
|
+
_SESSION_ID.set(session_id)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
#: Deduplicates the cross-context warning above — it fires from a scope exit,
|
|
163
|
+
#: which in a streaming server is per request.
|
|
164
|
+
_warned_cross_context = False
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
Snapshot = tuple[str | None, tuple[str, ...]]
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def snapshot() -> Snapshot:
|
|
171
|
+
"""Capture the identity *values* currently bound."""
|
|
172
|
+
return (_SESSION_ID.get(), _AGENT_STACK.get())
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def restore(snap: Snapshot) -> tuple[contextvars.Token, contextvars.Token]:
|
|
176
|
+
"""Bind a snapshot into the calling context."""
|
|
177
|
+
sid, stack = snap
|
|
178
|
+
return (_SESSION_ID.set(sid), _AGENT_STACK.set(stack))
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def discard(tokens: tuple[contextvars.Token, contextvars.Token] | None) -> None:
|
|
182
|
+
if tokens is None:
|
|
183
|
+
return
|
|
184
|
+
for token in reversed(tokens):
|
|
185
|
+
reset(token)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def propagate(fn: Callable[..., Any]) -> Callable[..., Any]:
|
|
189
|
+
"""Wrap `fn` so it runs with the identity bound *right now*.
|
|
190
|
+
|
|
191
|
+
pool.submit(failproofai_sdk.propagate(work), x)
|
|
192
|
+
pool.map(failproofai_sdk.propagate(work), items)
|
|
193
|
+
threading.Thread(target=failproofai_sdk.propagate(work)).start()
|
|
194
|
+
loop.run_in_executor(None, failproofai_sdk.propagate(work), x)
|
|
195
|
+
|
|
196
|
+
contextvars propagate into asyncio tasks automatically but **not into new
|
|
197
|
+
threads** — a thread starts with an empty context, so without this every event
|
|
198
|
+
a worker emits is dropped (or, since this change, raises TypeError).
|
|
199
|
+
|
|
200
|
+
This deliberately snapshots *values* rather than doing
|
|
201
|
+
`functools.partial(contextvars.copy_context().run, fn)`. A `Context` object
|
|
202
|
+
cannot be entered by two threads at once (`RuntimeError: cannot enter context:
|
|
203
|
+
... is already entered`), so the copy_context form crashes the caller's worker
|
|
204
|
+
on any reuse — `pool.map`, a retried submit. Mutations made inside `ctx.run`
|
|
205
|
+
also persist in that Context, so a reused one leaks the previous call's agent
|
|
206
|
+
stack into the next.
|
|
207
|
+
"""
|
|
208
|
+
snap = snapshot()
|
|
209
|
+
|
|
210
|
+
@functools.wraps(fn)
|
|
211
|
+
def _failproofai_propagated(*args: Any, **kwargs: Any) -> Any:
|
|
212
|
+
tokens = restore(snap)
|
|
213
|
+
try:
|
|
214
|
+
return fn(*args, **kwargs)
|
|
215
|
+
finally:
|
|
216
|
+
discard(tokens)
|
|
217
|
+
|
|
218
|
+
return _failproofai_propagated
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
_DEFAULT_ENVIRONMENT = "dev"
|
|
4
|
+
_environment: str | None = None
|
|
5
|
+
|
|
6
|
+
#: Set once the comma warning below has been emitted. `get_environment()` runs
|
|
7
|
+
#: from `to_dict()`, i.e. once per event on the caller's own thread, and the
|
|
8
|
+
#: warning had no once-flag at all — so an `AGENTEYE_ENVIRONMENT` with a comma
|
|
9
|
+
#: put one WARNING line into the host application's log for every event emitted,
|
|
10
|
+
#: for the life of the process. At the SDK's documented ceiling that is a
|
|
11
|
+
#: logging-driven throughput collapse in a library whose first constraint is not
|
|
12
|
+
#: to disrupt the host agent. The comment two lines below already promised
|
|
13
|
+
#: "Warn once"; this is what makes that true.
|
|
14
|
+
_warned_comma = False
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger("failproofai_sdk")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _reject_comma(env: str, source: str) -> None:
|
|
20
|
+
"""A comma in `environment` makes ingest skip EVERY event carrying it.
|
|
21
|
+
|
|
22
|
+
The endpoint splits this field on commas to build its filter facets, so a
|
|
23
|
+
line whose `environment` contains one is discarded — the whole line, not the
|
|
24
|
+
field. It answers 200 with `{"accepted":0,"skipped":N}`, the daemon deletes
|
|
25
|
+
the delivered batch, and the run that produced it is simply never in the
|
|
26
|
+
dashboard: no exception here, nothing in the agent's output, and an empty
|
|
27
|
+
session list that looks exactly like an agent nobody ran.
|
|
28
|
+
|
|
29
|
+
`failproofaid` already refuses a comma in `collector.environment` for this
|
|
30
|
+
reason (`crates/fpai-collect/src/config.rs`). The SDK is the other writer of
|
|
31
|
+
the same field and did not, so `AGENTEYE_ENVIRONMENT="prod,eu"` — a wholly
|
|
32
|
+
reasonable thing to type — silently threw away everything the process
|
|
33
|
+
emitted.
|
|
34
|
+
"""
|
|
35
|
+
if "," in env:
|
|
36
|
+
raise ValueError(
|
|
37
|
+
f"environment must not contain a comma (got {env!r} from {source}). "
|
|
38
|
+
"The ingest endpoint skips every event whose environment has one, so "
|
|
39
|
+
"this would silently discard all telemetry from this process. Use a "
|
|
40
|
+
"single label, e.g. 'prod-eu'."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def get_environment() -> str:
|
|
45
|
+
if _environment is not None:
|
|
46
|
+
return _environment
|
|
47
|
+
import os
|
|
48
|
+
|
|
49
|
+
raw = os.environ.get("AGENTEYE_ENVIRONMENT")
|
|
50
|
+
if not raw:
|
|
51
|
+
return _DEFAULT_ENVIRONMENT
|
|
52
|
+
if "," in raw:
|
|
53
|
+
# Raising here would blow up inside `to_dict()` on an arbitrary event,
|
|
54
|
+
# far from the thing that set it, and take the caller's agent down with
|
|
55
|
+
# it — a telemetry library must not do that. Warn once and fall back to
|
|
56
|
+
# a label ingest will actually accept, so the events land under a
|
|
57
|
+
# visibly-wrong environment instead of vanishing.
|
|
58
|
+
global _warned_comma
|
|
59
|
+
if not _warned_comma:
|
|
60
|
+
_warned_comma = True
|
|
61
|
+
logger.warning(
|
|
62
|
+
"failproofai_sdk: AGENTEYE_ENVIRONMENT=%r contains a comma, which makes "
|
|
63
|
+
"the ingest endpoint skip every event carrying it. Falling back to %r. "
|
|
64
|
+
"Use a single label, e.g. 'prod-eu'.",
|
|
65
|
+
raw,
|
|
66
|
+
_DEFAULT_ENVIRONMENT,
|
|
67
|
+
)
|
|
68
|
+
return _DEFAULT_ENVIRONMENT
|
|
69
|
+
return raw
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def set_environment(env: str | None) -> None:
|
|
73
|
+
global _environment, _warned_comma
|
|
74
|
+
if env:
|
|
75
|
+
_reject_comma(env, "configure(environment=...)")
|
|
76
|
+
_environment = env if env else None
|
|
77
|
+
# A new label means the env var may be worth complaining about again.
|
|
78
|
+
_warned_comma = False
|