ciris-agent 1.7.7__py3-none-any.whl
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.
- ciris_adapters/README.md +113 -0
- ciris_adapters/__init__.py +30 -0
- ciris_adapters/ciris_covenant_metrics/README.md +144 -0
- ciris_adapters/ciris_covenant_metrics/__init__.py +36 -0
- ciris_adapters/ciris_covenant_metrics/adapter.py +249 -0
- ciris_adapters/ciris_covenant_metrics/manifest.json +152 -0
- ciris_adapters/ciris_covenant_metrics/services.py +403 -0
- ciris_adapters/ciris_hosted_tools/__init__.py +24 -0
- ciris_adapters/ciris_hosted_tools/adapter.py +169 -0
- ciris_adapters/ciris_hosted_tools/manifest.json +94 -0
- ciris_adapters/ciris_hosted_tools/services.py +744 -0
- ciris_adapters/external_data_sql/README.md +559 -0
- ciris_adapters/external_data_sql/__init__.py +43 -0
- ciris_adapters/external_data_sql/adapter.py +144 -0
- ciris_adapters/external_data_sql/configurable.py +315 -0
- ciris_adapters/external_data_sql/dialects/__init__.py +37 -0
- ciris_adapters/external_data_sql/dialects/base.py +133 -0
- ciris_adapters/external_data_sql/dialects/mysql.py +63 -0
- ciris_adapters/external_data_sql/dialects/postgresql.py +59 -0
- ciris_adapters/external_data_sql/dialects/sqlite.py +62 -0
- ciris_adapters/external_data_sql/example_config.json +88 -0
- ciris_adapters/external_data_sql/example_privacy_schema.yaml +127 -0
- ciris_adapters/external_data_sql/manifest.json +195 -0
- ciris_adapters/external_data_sql/privacy_schema_loader.py +189 -0
- ciris_adapters/external_data_sql/protocol.py +101 -0
- ciris_adapters/external_data_sql/schemas.py +146 -0
- ciris_adapters/external_data_sql/service.py +1547 -0
- ciris_adapters/external_data_sql/service_old.py +492 -0
- ciris_adapters/home_assistant/__init__.py +63 -0
- ciris_adapters/home_assistant/adapter.py +201 -0
- ciris_adapters/home_assistant/communication_service.py +347 -0
- ciris_adapters/home_assistant/configurable.py +667 -0
- ciris_adapters/home_assistant/manifest.json +203 -0
- ciris_adapters/home_assistant/schemas.py +129 -0
- ciris_adapters/home_assistant/service.py +751 -0
- ciris_adapters/home_assistant/tool_service.py +441 -0
- ciris_adapters/mcp_client/__init__.py +82 -0
- ciris_adapters/mcp_client/adapter.py +847 -0
- ciris_adapters/mcp_client/config.py +280 -0
- ciris_adapters/mcp_client/configurable.py +422 -0
- ciris_adapters/mcp_client/manifest.json +185 -0
- ciris_adapters/mcp_client/mcp_communication_service.py +393 -0
- ciris_adapters/mcp_client/mcp_tool_service.py +463 -0
- ciris_adapters/mcp_client/mcp_wise_service.py +394 -0
- ciris_adapters/mcp_client/schemas.py +149 -0
- ciris_adapters/mcp_client/security.py +592 -0
- ciris_adapters/mcp_common/__init__.py +44 -0
- ciris_adapters/mcp_common/manifest.json +25 -0
- ciris_adapters/mcp_common/protocol.py +315 -0
- ciris_adapters/mcp_common/schemas.py +225 -0
- ciris_adapters/mcp_server/__init__.py +47 -0
- ciris_adapters/mcp_server/adapter.py +581 -0
- ciris_adapters/mcp_server/config.py +260 -0
- ciris_adapters/mcp_server/configurable.py +393 -0
- ciris_adapters/mcp_server/handlers.py +663 -0
- ciris_adapters/mcp_server/manifest.json +211 -0
- ciris_adapters/mcp_server/security.py +500 -0
- ciris_adapters/mock_llm/README.md +117 -0
- ciris_adapters/mock_llm/__init__.py +21 -0
- ciris_adapters/mock_llm/adapter.py +131 -0
- ciris_adapters/mock_llm/configurable.py +237 -0
- ciris_adapters/mock_llm/manifest.json +106 -0
- ciris_adapters/mock_llm/protocol.py +37 -0
- ciris_adapters/mock_llm/responses.py +520 -0
- ciris_adapters/mock_llm/responses_action_selection.py +1041 -0
- ciris_adapters/mock_llm/responses_epistemic.py +17 -0
- ciris_adapters/mock_llm/responses_feedback.py +27 -0
- ciris_adapters/mock_llm/schemas.py +35 -0
- ciris_adapters/mock_llm/service.py +294 -0
- ciris_adapters/navigation/__init__.py +21 -0
- ciris_adapters/navigation/adapter.py +129 -0
- ciris_adapters/navigation/configurable.py +239 -0
- ciris_adapters/navigation/manifest.json +104 -0
- ciris_adapters/navigation/service.py +487 -0
- ciris_adapters/reddit/README.md +132 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_ANALYSIS.md +715 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_SUMMARY.txt +278 -0
- ciris_adapters/reddit/REDDIT_ANALYSIS_INDEX.md +307 -0
- ciris_adapters/reddit/REDDIT_PRODUCTION_READINESS_PLAN.md +518 -0
- ciris_adapters/reddit/__init__.py +15 -0
- ciris_adapters/reddit/adapter.py +189 -0
- ciris_adapters/reddit/configurable.py +274 -0
- ciris_adapters/reddit/error_handler.py +307 -0
- ciris_adapters/reddit/manifest.json +218 -0
- ciris_adapters/reddit/observer.py +532 -0
- ciris_adapters/reddit/protocol.py +34 -0
- ciris_adapters/reddit/schemas.py +433 -0
- ciris_adapters/reddit/service.py +1471 -0
- ciris_adapters/sample_adapter/README.md +474 -0
- ciris_adapters/sample_adapter/__init__.py +45 -0
- ciris_adapters/sample_adapter/adapter.py +208 -0
- ciris_adapters/sample_adapter/configurable.py +469 -0
- ciris_adapters/sample_adapter/manifest.json +247 -0
- ciris_adapters/sample_adapter/services.py +486 -0
- ciris_adapters/weather/__init__.py +16 -0
- ciris_adapters/weather/adapter.py +130 -0
- ciris_adapters/weather/configurable.py +240 -0
- ciris_adapters/weather/manifest.json +156 -0
- ciris_adapters/weather/service.py +600 -0
- ciris_agent-1.7.7.dist-info/METADATA +284 -0
- ciris_agent-1.7.7.dist-info/RECORD +986 -0
- ciris_agent-1.7.7.dist-info/WHEEL +5 -0
- ciris_agent-1.7.7.dist-info/entry_points.txt +15 -0
- ciris_agent-1.7.7.dist-info/licenses/LICENSE +205 -0
- ciris_agent-1.7.7.dist-info/licenses/NOTICE +82 -0
- ciris_agent-1.7.7.dist-info/top_level.txt +4 -0
- ciris_engine/__init__.py +15 -0
- ciris_engine/ciris_templates/ally.yaml +632 -0
- ciris_engine/ciris_templates/default.yaml +411 -0
- ciris_engine/ciris_templates/echo-core.yaml +629 -0
- ciris_engine/ciris_templates/echo-speculative.yaml +764 -0
- ciris_engine/ciris_templates/echo.yaml +647 -0
- ciris_engine/ciris_templates/sage.yaml +332 -0
- ciris_engine/ciris_templates/scout.yaml +338 -0
- ciris_engine/ciris_templates/test.yaml +168 -0
- ciris_engine/cli.py +42 -0
- ciris_engine/config/CIRIS_SERVICES.json +19 -0
- ciris_engine/config/MODEL_CAPABILITIES.json +419 -0
- ciris_engine/config/PRICING_DATA.json +179 -0
- ciris_engine/config/__init__.py +50 -0
- ciris_engine/config/ciris_services.py +113 -0
- ciris_engine/config/model_capabilities.py +388 -0
- ciris_engine/config/pricing_models.py +276 -0
- ciris_engine/constants.py +35 -0
- ciris_engine/data/__init__.py +1 -0
- ciris_engine/data/covenant_1.0b.txt +978 -0
- ciris_engine/gui_static/11steps.svg +107 -0
- ciris_engine/gui_static/2x-schematics.png +0 -0
- ciris_engine/gui_static/404/index.html +1 -0
- ciris_engine/gui_static/404.html +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3297-60e86ba0f8a7b040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3835-2aad4b7f5f8e4643.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4499-99a0bc47de0b8975.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4534-af88cd4ba6e99bff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4541-84b455f9e0dc4cfe.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4789-61412711484754bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/6539-c6398bc9d7018430.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-8e827b26cc8c2d32.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-fb45d630f3192c6f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8072-de4952a2e6d2b33f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8315-b91d03a3949db0af.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8386-f93a83ccbd789bd9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/87c73c54-781a7f35148d5433.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8903-fefea3339a02d41b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/9090-e66485adf8d9d990.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/_not-found/page-a67d9808462c23b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-2d7ee1583bbbd02e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-6a3c2bae6fe92b7b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-2ed3a035136bc4e8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-b2f5c91844a32422.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-25b90f89af3ea58c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-b65d16c94ecaf69c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-675b6d05c8f9184f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-cbee2e1c8ab52145.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-0f44da06697cf9f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-563420253577edbf.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/adapters/page-1854631018bc32be.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-8353752c176a7c70.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-f61a529f110a6040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-7f19b9d20d39be28.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-d1063938f249b8bd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-321b6728b8fff0bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-ebac35ca961a1277.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-6f3dc3bd02924f8e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-fa4a469f814c821a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-0d4f734269addd8f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-79227d426050089c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-018d21d683b6e5bc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-2aa5a5363ca2a371.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-198373205fd316e2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-f2ca39e7713b13f8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-1dd5a196f643c60d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-530a04d3abbb8cda.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-3193b06d094ab654.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-330e996dedb87aba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-0a70f5fc460298b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-21f2f99dd5b336e9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-33240e6c6034a49d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-68ffab6d54a7fdcd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/logs/page-8a6167aecc4a475c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-9ca8c5d0056de3ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-e961226941c18f81.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-6fdb065a787a4974.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-89f87d431be6064a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-2e728b9c43aa164d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-c7dd033dc40a72f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-ae9f0bdf11d01a95.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-b10feb79ca5d75e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-13ebe7ef1c16ae11.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-e6c82b16d617f785.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-0beb5f5b5a5c20fc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-2595e729eae30c0e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-1037c987aecc3653.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-2ffd147f6d3162ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-2c5798d58cafcd91.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-505b1ba4eceb01c3.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-b0cad31d5cb1b2fa.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-f3ecd7a8012df230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-f35117fdc4105801.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-fb583a7924114906.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-50f116fd76935563.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-c37d8aa5ba623a44.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-429aec7a707777ef.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-5f705aad60e0c04e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-13476b8b0f3808cc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-7e500d154ed5bba4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-cc4a9d8a5cb44d08.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-ec3e429efbc79230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/framework-9d29490f5ba089ba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-1f554952e47a82c4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-26fa8aed029082e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-97b0486ef6bcef25.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_app-6ce685456e616eb2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_error-d4bce98d93fe21e7.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/webpack-fcebd240b7f8477d.js +1 -0
- ciris_engine/gui_static/_next/static/css/16b94b1fe0cc6e37.css +3 -0
- ciris_engine/gui_static/_next/static/css/77a24ceaae86deff.css +3 -0
- ciris_engine/gui_static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/d8298875641ec7d4-s.p.woff2 +0 -0
- ciris_engine/gui_static/account/api-keys/index.html +1 -0
- ciris_engine/gui_static/account/api-keys/index.txt +27 -0
- ciris_engine/gui_static/account/consent/index.html +1 -0
- ciris_engine/gui_static/account/consent/index.txt +27 -0
- ciris_engine/gui_static/account/index.html +1 -0
- ciris_engine/gui_static/account/index.txt +27 -0
- ciris_engine/gui_static/account/privacy/index.html +1 -0
- ciris_engine/gui_static/account/privacy/index.txt +27 -0
- ciris_engine/gui_static/account/settings/index.html +1 -0
- ciris_engine/gui_static/account/settings/index.txt +27 -0
- ciris_engine/gui_static/adapters/index.html +1 -0
- ciris_engine/gui_static/adapters/index.txt +27 -0
- ciris_engine/gui_static/agents/index.html +1 -0
- ciris_engine/gui_static/agents/index.txt +27 -0
- ciris_engine/gui_static/andrew-roberts-euBRXcx57T4-unsplash.jpg +0 -0
- ciris_engine/gui_static/api-demo/index.html +1 -0
- ciris_engine/gui_static/api-demo/index.txt +27 -0
- ciris_engine/gui_static/audit/index.html +1 -0
- ciris_engine/gui_static/audit/index.txt +27 -0
- ciris_engine/gui_static/billing/index.html +1 -0
- ciris_engine/gui_static/billing/index.txt +27 -0
- ciris_engine/gui_static/blurryinfo.png +0 -0
- ciris_engine/gui_static/chip-vincent-PkQDwfl9Flc-unsplash.jpg +0 -0
- ciris_engine/gui_static/ciris-architecture.svg +338 -0
- ciris_engine/gui_static/comms/index.html +1 -0
- ciris_engine/gui_static/comms/index.txt +27 -0
- ciris_engine/gui_static/config/index.html +1 -0
- ciris_engine/gui_static/config/index.txt +27 -0
- ciris_engine/gui_static/consent/index.html +1 -0
- ciris_engine/gui_static/consent/index.txt +27 -0
- ciris_engine/gui_static/dashboard/index.html +1 -0
- ciris_engine/gui_static/dashboard/index.txt +27 -0
- ciris_engine/gui_static/docs/index.html +1 -0
- ciris_engine/gui_static/docs/index.txt +27 -0
- ciris_engine/gui_static/eric.png +0 -0
- ciris_engine/gui_static/file.svg +1 -0
- ciris_engine/gui_static/globe.svg +1 -0
- ciris_engine/gui_static/index.html +1 -0
- ciris_engine/gui_static/index.txt +27 -0
- ciris_engine/gui_static/infogfx-1@2x.png +0 -0
- ciris_engine/gui_static/infogfx-2.png +0 -0
- ciris_engine/gui_static/infogfx-dark-1.png +0 -0
- ciris_engine/gui_static/kelly-vohs-soSTXmIxTDU-unsplash.jpg +0 -0
- ciris_engine/gui_static/login/index.html +1 -0
- ciris_engine/gui_static/login/index.txt +27 -0
- ciris_engine/gui_static/logs/index.html +1 -0
- ciris_engine/gui_static/logs/index.txt +27 -0
- ciris_engine/gui_static/memory/index.html +1 -0
- ciris_engine/gui_static/memory/index.txt +27 -0
- ciris_engine/gui_static/nathan-farrish-ArcTfEoBgzs-unsplash.jpg +0 -0
- ciris_engine/gui_static/next.svg +1 -0
- ciris_engine/gui_static/overview.svg +512 -0
- ciris_engine/gui_static/overview1.svg +407 -0
- ciris_engine/gui_static/overview2.svg +370 -0
- ciris_engine/gui_static/pipeline-visualization.svg +278 -0
- ciris_engine/gui_static/privacy-policy.html +160 -0
- ciris_engine/gui_static/runtime/index.html +8 -0
- ciris_engine/gui_static/runtime/index.txt +27 -0
- ciris_engine/gui_static/services/index.html +1 -0
- ciris_engine/gui_static/services/index.txt +27 -0
- ciris_engine/gui_static/sessions/index.html +1 -0
- ciris_engine/gui_static/sessions/index.txt +27 -0
- ciris_engine/gui_static/setup/index.html +1 -0
- ciris_engine/gui_static/setup/index.txt +27 -0
- ciris_engine/gui_static/status-dashboard/index.html +1 -0
- ciris_engine/gui_static/status-dashboard/index.txt +27 -0
- ciris_engine/gui_static/system/index.html +1 -0
- ciris_engine/gui_static/system/index.txt +27 -0
- ciris_engine/gui_static/terms-of-service.html +174 -0
- ciris_engine/gui_static/test-auth/index.html +1 -0
- ciris_engine/gui_static/test-auth/index.txt +27 -0
- ciris_engine/gui_static/test-login/index.html +1 -0
- ciris_engine/gui_static/test-login/index.txt +27 -0
- ciris_engine/gui_static/test-sdk/index.html +1 -0
- ciris_engine/gui_static/test-sdk/index.txt +27 -0
- ciris_engine/gui_static/tools/index.html +1 -0
- ciris_engine/gui_static/tools/index.txt +27 -0
- ciris_engine/gui_static/users/index.html +1 -0
- ciris_engine/gui_static/users/index.txt +27 -0
- ciris_engine/gui_static/vercel.svg +1 -0
- ciris_engine/gui_static/videos/video1.mp4 +0 -0
- ciris_engine/gui_static/videos/video3.mp4 +0 -0
- ciris_engine/gui_static/wa/index.html +1 -0
- ciris_engine/gui_static/wa/index.txt +27 -0
- ciris_engine/gui_static/window.svg +1 -0
- ciris_engine/logic/__init__.py +8 -0
- ciris_engine/logic/adapters/__init__.py +74 -0
- ciris_engine/logic/adapters/api/__init__.py +5 -0
- ciris_engine/logic/adapters/api/adapter.py +1037 -0
- ciris_engine/logic/adapters/api/api_communication.py +370 -0
- ciris_engine/logic/adapters/api/api_document.py +330 -0
- ciris_engine/logic/adapters/api/api_observer.py +24 -0
- ciris_engine/logic/adapters/api/api_runtime_control.py +388 -0
- ciris_engine/logic/adapters/api/api_tools.py +299 -0
- ciris_engine/logic/adapters/api/api_vision.py +215 -0
- ciris_engine/logic/adapters/api/app.py +272 -0
- ciris_engine/logic/adapters/api/auth.py +159 -0
- ciris_engine/logic/adapters/api/config.py +101 -0
- ciris_engine/logic/adapters/api/constants.py +55 -0
- ciris_engine/logic/adapters/api/dependencies/__init__.py +1 -0
- ciris_engine/logic/adapters/api/dependencies/auth.py +260 -0
- ciris_engine/logic/adapters/api/endpoints/__init__.py +1 -0
- ciris_engine/logic/adapters/api/endpoints/emergency.py +86 -0
- ciris_engine/logic/adapters/api/middleware/__init__.py +1 -0
- ciris_engine/logic/adapters/api/middleware/rate_limiter.py +302 -0
- ciris_engine/logic/adapters/api/models.py +29 -0
- ciris_engine/logic/adapters/api/routes/__init__.py +52 -0
- ciris_engine/logic/adapters/api/routes/agent.py +1762 -0
- ciris_engine/logic/adapters/api/routes/audit.py +707 -0
- ciris_engine/logic/adapters/api/routes/auth.py +1745 -0
- ciris_engine/logic/adapters/api/routes/billing.py +895 -0
- ciris_engine/logic/adapters/api/routes/config.py +329 -0
- ciris_engine/logic/adapters/api/routes/connectors.py +534 -0
- ciris_engine/logic/adapters/api/routes/consent.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar_multi_source.py +484 -0
- ciris_engine/logic/adapters/api/routes/emergency.py +302 -0
- ciris_engine/logic/adapters/api/routes/memory.py +733 -0
- ciris_engine/logic/adapters/api/routes/memory_filters.py +230 -0
- ciris_engine/logic/adapters/api/routes/memory_models.py +112 -0
- ciris_engine/logic/adapters/api/routes/memory_queries.py +236 -0
- ciris_engine/logic/adapters/api/routes/memory_query_helpers.py +394 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization.py +359 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization_helpers.py +110 -0
- ciris_engine/logic/adapters/api/routes/partnership.py +541 -0
- ciris_engine/logic/adapters/api/routes/setup.py +1374 -0
- ciris_engine/logic/adapters/api/routes/system.py +3049 -0
- ciris_engine/logic/adapters/api/routes/system_extensions.py +952 -0
- ciris_engine/logic/adapters/api/routes/telemetry.py +1987 -0
- ciris_engine/logic/adapters/api/routes/telemetry_converters.py +141 -0
- ciris_engine/logic/adapters/api/routes/telemetry_helpers.py +111 -0
- ciris_engine/logic/adapters/api/routes/telemetry_logs_reader.py +280 -0
- ciris_engine/logic/adapters/api/routes/telemetry_metrics.py +131 -0
- ciris_engine/logic/adapters/api/routes/telemetry_models.py +190 -0
- ciris_engine/logic/adapters/api/routes/telemetry_otlp.py +878 -0
- ciris_engine/logic/adapters/api/routes/telemetry_resource_helpers.py +191 -0
- ciris_engine/logic/adapters/api/routes/tickets.py +541 -0
- ciris_engine/logic/adapters/api/routes/tools.py +556 -0
- ciris_engine/logic/adapters/api/routes/transparency.py +281 -0
- ciris_engine/logic/adapters/api/routes/users.py +981 -0
- ciris_engine/logic/adapters/api/routes/verification.py +373 -0
- ciris_engine/logic/adapters/api/routes/wa.py +369 -0
- ciris_engine/logic/adapters/api/service_configuration.py +177 -0
- ciris_engine/logic/adapters/api/services/__init__.py +1 -0
- ciris_engine/logic/adapters/api/services/auth_service.py +1417 -0
- ciris_engine/logic/adapters/api/services/oauth_security.py +68 -0
- ciris_engine/logic/adapters/base.py +141 -0
- ciris_engine/logic/adapters/base_adapter.py +73 -0
- ciris_engine/logic/adapters/base_observer.py +1141 -0
- ciris_engine/logic/adapters/base_vision.py +312 -0
- ciris_engine/logic/adapters/cirisnode_client.py +307 -0
- ciris_engine/logic/adapters/cli/__init__.py +3 -0
- ciris_engine/logic/adapters/cli/adapter.py +207 -0
- ciris_engine/logic/adapters/cli/cli_adapter.py +902 -0
- ciris_engine/logic/adapters/cli/cli_observer.py +268 -0
- ciris_engine/logic/adapters/cli/cli_tools.py +427 -0
- ciris_engine/logic/adapters/cli/cli_wa_service.py +134 -0
- ciris_engine/logic/adapters/cli/config.py +73 -0
- ciris_engine/logic/adapters/discord/__init__.py +3 -0
- ciris_engine/logic/adapters/discord/adapter.py +783 -0
- ciris_engine/logic/adapters/discord/ciris_discord_client.py +159 -0
- ciris_engine/logic/adapters/discord/config.py +177 -0
- ciris_engine/logic/adapters/discord/constants.py +185 -0
- ciris_engine/logic/adapters/discord/discord-stubs.pyi +50 -0
- ciris_engine/logic/adapters/discord/discord_adapter.py +1584 -0
- ciris_engine/logic/adapters/discord/discord_audit.py +150 -0
- ciris_engine/logic/adapters/discord/discord_channel_manager.py +351 -0
- ciris_engine/logic/adapters/discord/discord_connection_manager.py +313 -0
- ciris_engine/logic/adapters/discord/discord_embed_formatter.py +369 -0
- ciris_engine/logic/adapters/discord/discord_error_classifier.py +302 -0
- ciris_engine/logic/adapters/discord/discord_error_handler.py +316 -0
- ciris_engine/logic/adapters/discord/discord_guidance_handler.py +460 -0
- ciris_engine/logic/adapters/discord/discord_message_handler.py +207 -0
- ciris_engine/logic/adapters/discord/discord_observer.py +670 -0
- ciris_engine/logic/adapters/discord/discord_rate_limiter.py +249 -0
- ciris_engine/logic/adapters/discord/discord_reaction_handler.py +278 -0
- ciris_engine/logic/adapters/discord/discord_tool_handler.py +465 -0
- ciris_engine/logic/adapters/discord/discord_tool_service.py +790 -0
- ciris_engine/logic/adapters/discord/discord_tools.py +90 -0
- ciris_engine/logic/adapters/discord/discord_vision_helper.py +148 -0
- ciris_engine/logic/adapters/discord/py.typed +0 -0
- ciris_engine/logic/adapters/document_parser.py +320 -0
- ciris_engine/logic/audit/__init__.py +10 -0
- ciris_engine/logic/audit/hash_chain.py +313 -0
- ciris_engine/logic/audit/signature_manager.py +352 -0
- ciris_engine/logic/audit/verifier.py +408 -0
- ciris_engine/logic/buses/__init__.py +21 -0
- ciris_engine/logic/buses/base_bus.py +178 -0
- ciris_engine/logic/buses/bus_manager.py +121 -0
- ciris_engine/logic/buses/communication_bus.py +387 -0
- ciris_engine/logic/buses/llm_bus.py +722 -0
- ciris_engine/logic/buses/memory_bus.py +577 -0
- ciris_engine/logic/buses/prohibitions.py +502 -0
- ciris_engine/logic/buses/runtime_control_bus.py +539 -0
- ciris_engine/logic/buses/tool_bus.py +482 -0
- ciris_engine/logic/buses/wise_bus.py +684 -0
- ciris_engine/logic/config/__init__.py +25 -0
- ciris_engine/logic/config/bootstrap.py +255 -0
- ciris_engine/logic/config/config_accessor.py +202 -0
- ciris_engine/logic/config/db_paths.py +194 -0
- ciris_engine/logic/config/env_utils.py +39 -0
- ciris_engine/logic/conscience/__init__.py +16 -0
- ciris_engine/logic/conscience/build_deferral_package.py +0 -0
- ciris_engine/logic/conscience/core.py +688 -0
- ciris_engine/logic/conscience/interface.py +33 -0
- ciris_engine/logic/conscience/registry.py +76 -0
- ciris_engine/logic/conscience/thought_depth_guardrail.py +231 -0
- ciris_engine/logic/conscience/updated_status_conscience.py +156 -0
- ciris_engine/logic/context/__init__.py +10 -0
- ciris_engine/logic/context/batch_context.py +550 -0
- ciris_engine/logic/context/builder.py +149 -0
- ciris_engine/logic/context/channel_resolution.py +136 -0
- ciris_engine/logic/context/secrets_snapshot.py +52 -0
- ciris_engine/logic/context/system_snapshot.py +116 -0
- ciris_engine/logic/context/system_snapshot_helpers.py +1651 -0
- ciris_engine/logic/covenant/__init__.py +33 -0
- ciris_engine/logic/covenant/executor.py +303 -0
- ciris_engine/logic/covenant/extractor.py +382 -0
- ciris_engine/logic/covenant/handler.py +241 -0
- ciris_engine/logic/covenant/verifier.py +383 -0
- ciris_engine/logic/dma/__init__.py +15 -0
- ciris_engine/logic/dma/action_selection/__init__.py +11 -0
- ciris_engine/logic/dma/action_selection/action_instruction_generator.py +444 -0
- ciris_engine/logic/dma/action_selection/context_builder.py +508 -0
- ciris_engine/logic/dma/action_selection/faculty_integration.py +193 -0
- ciris_engine/logic/dma/action_selection/special_cases.py +132 -0
- ciris_engine/logic/dma/action_selection_pdma.py +365 -0
- ciris_engine/logic/dma/base_dma.py +335 -0
- ciris_engine/logic/dma/csdma.py +239 -0
- ciris_engine/logic/dma/dma_executor.py +575 -0
- ciris_engine/logic/dma/dsdma_base.py +410 -0
- ciris_engine/logic/dma/exceptions.py +4 -0
- ciris_engine/logic/dma/factory.py +150 -0
- ciris_engine/logic/dma/pdma.py +120 -0
- ciris_engine/logic/dma/prompt_loader.py +189 -0
- ciris_engine/logic/dma/prompts/action_selection_pdma.yml +58 -0
- ciris_engine/logic/dma/prompts/csdma_common_sense.yml +28 -0
- ciris_engine/logic/dma/prompts/dsdma_base.yml +17 -0
- ciris_engine/logic/dma/prompts/pdma_ethical.yml +42 -0
- ciris_engine/logic/formatters/__init__.py +26 -0
- ciris_engine/logic/formatters/crisis_resources.py +80 -0
- ciris_engine/logic/formatters/escalation.py +21 -0
- ciris_engine/logic/formatters/identity.py +224 -0
- ciris_engine/logic/formatters/prompt_blocks.py +64 -0
- ciris_engine/logic/formatters/system_snapshot.py +193 -0
- ciris_engine/logic/formatters/user_profiles.py +108 -0
- ciris_engine/logic/handlers/__init__.py +1 -0
- ciris_engine/logic/handlers/control/__init__.py +1 -0
- ciris_engine/logic/handlers/control/defer_handler.py +195 -0
- ciris_engine/logic/handlers/control/ponder_handler.py +154 -0
- ciris_engine/logic/handlers/control/reject_handler.py +81 -0
- ciris_engine/logic/handlers/external/__init__.py +1 -0
- ciris_engine/logic/handlers/external/observe_handler.py +154 -0
- ciris_engine/logic/handlers/external/speak_handler.py +250 -0
- ciris_engine/logic/handlers/external/tool_handler.py +148 -0
- ciris_engine/logic/handlers/memory/__init__.py +1 -0
- ciris_engine/logic/handlers/memory/forget_handler.py +107 -0
- ciris_engine/logic/handlers/memory/memorize_handler.py +391 -0
- ciris_engine/logic/handlers/memory/recall_handler.py +213 -0
- ciris_engine/logic/handlers/terminal/__init__.py +1 -0
- ciris_engine/logic/handlers/terminal/task_complete_handler.py +299 -0
- ciris_engine/logic/infrastructure/__init__.py +1 -0
- ciris_engine/logic/infrastructure/handlers/__init__.py +8 -0
- ciris_engine/logic/infrastructure/handlers/action_dispatcher.py +382 -0
- ciris_engine/logic/infrastructure/handlers/base_handler.py +450 -0
- ciris_engine/logic/infrastructure/handlers/exceptions.py +2 -0
- ciris_engine/logic/infrastructure/handlers/handler_registry.py +59 -0
- ciris_engine/logic/infrastructure/handlers/helpers.py +55 -0
- ciris_engine/logic/infrastructure/step_streaming.py +149 -0
- ciris_engine/logic/infrastructure/sub_services/__init__.py +1 -0
- ciris_engine/logic/infrastructure/sub_services/identity_variance_monitor.py +1035 -0
- ciris_engine/logic/infrastructure/sub_services/pattern_analysis_loop.py +758 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_bootstrap.py +229 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_display.py +176 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_oauth.py +404 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_wizard.py +181 -0
- ciris_engine/logic/persistence/__init__.py +130 -0
- ciris_engine/logic/persistence/analytics.py +97 -0
- ciris_engine/logic/persistence/db/__init__.py +28 -0
- ciris_engine/logic/persistence/db/core.py +520 -0
- ciris_engine/logic/persistence/db/dialect.py +380 -0
- ciris_engine/logic/persistence/db/execution_helpers.py +216 -0
- ciris_engine/logic/persistence/db/migration_runner.py +191 -0
- ciris_engine/logic/persistence/db/operations.py +313 -0
- ciris_engine/logic/persistence/db/query_builder.py +232 -0
- ciris_engine/logic/persistence/db/retry.py +154 -0
- ciris_engine/logic/persistence/db/setup.py +18 -0
- ciris_engine/logic/persistence/migrations/postgres/001_initial_schema.sql +4 -0
- ciris_engine/logic/persistence/migrations/postgres/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/postgres/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/postgres/004_add_occurrence_id.sql +54 -0
- ciris_engine/logic/persistence/migrations/postgres/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/postgres/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/postgres/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/008_rename_to_tickets_add_sop.sql +123 -0
- ciris_engine/logic/persistence/migrations/postgres/009_add_ticket_status_columns.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/010_add_images_to_tasks.sql +5 -0
- ciris_engine/logic/persistence/migrations/sqlite/001_initial_schema.sql +357 -0
- ciris_engine/logic/persistence/migrations/sqlite/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/sqlite/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/sqlite/004_add_occurrence_id.sql +45 -0
- ciris_engine/logic/persistence/migrations/sqlite/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/sqlite/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/sqlite/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/sqlite/008_rename_to_tickets_add_sop.sql +120 -0
- ciris_engine/logic/persistence/migrations/sqlite/009_add_ticket_status_columns.sql +129 -0
- ciris_engine/logic/persistence/migrations/sqlite/010_add_images_to_tasks.sql +17 -0
- ciris_engine/logic/persistence/models/__init__.py +141 -0
- ciris_engine/logic/persistence/models/correlations.py +881 -0
- ciris_engine/logic/persistence/models/deferral.py +68 -0
- ciris_engine/logic/persistence/models/dsar.py +286 -0
- ciris_engine/logic/persistence/models/graph.py +362 -0
- ciris_engine/logic/persistence/models/identity.py +264 -0
- ciris_engine/logic/persistence/models/queue_status.py +139 -0
- ciris_engine/logic/persistence/models/tasks.py +1043 -0
- ciris_engine/logic/persistence/models/thoughts.py +400 -0
- ciris_engine/logic/persistence/models/tickets.py +518 -0
- ciris_engine/logic/persistence/stores/__init__.py +13 -0
- ciris_engine/logic/persistence/stores/auth_helpers.py +117 -0
- ciris_engine/logic/persistence/stores/authentication_store.py +414 -0
- ciris_engine/logic/persistence/utils.py +212 -0
- ciris_engine/logic/processors/__init__.py +30 -0
- ciris_engine/logic/processors/core/__init__.py +1 -0
- ciris_engine/logic/processors/core/base_processor.py +280 -0
- ciris_engine/logic/processors/core/main_processor.py +1777 -0
- ciris_engine/logic/processors/core/step_decorators.py +1583 -0
- ciris_engine/logic/processors/core/thought_processor/__init__.py +20 -0
- ciris_engine/logic/processors/core/thought_processor/action_execution.py +49 -0
- ciris_engine/logic/processors/core/thought_processor/conscience_execution.py +382 -0
- ciris_engine/logic/processors/core/thought_processor/finalize_action.py +66 -0
- ciris_engine/logic/processors/core/thought_processor/gather_context.py +120 -0
- ciris_engine/logic/processors/core/thought_processor/main.py +920 -0
- ciris_engine/logic/processors/core/thought_processor/perform_aspdma.py +86 -0
- ciris_engine/logic/processors/core/thought_processor/perform_dmas.py +106 -0
- ciris_engine/logic/processors/core/thought_processor/recursive_processing.py +237 -0
- ciris_engine/logic/processors/core/thought_processor/round_complete.py +52 -0
- ciris_engine/logic/processors/core/thought_processor/start_round.py +64 -0
- ciris_engine/logic/processors/exceptions.py +59 -0
- ciris_engine/logic/processors/states/__init__.py +1 -0
- ciris_engine/logic/processors/states/dream_processor.py +1381 -0
- ciris_engine/logic/processors/states/play_processor.py +141 -0
- ciris_engine/logic/processors/states/shutdown_processor.py +623 -0
- ciris_engine/logic/processors/states/solitude_processor.py +305 -0
- ciris_engine/logic/processors/states/wakeup_processor.py +802 -0
- ciris_engine/logic/processors/states/work_processor.py +742 -0
- ciris_engine/logic/processors/support/__init__.py +1 -0
- ciris_engine/logic/processors/support/dma_orchestrator.py +336 -0
- ciris_engine/logic/processors/support/processing_queue.py +133 -0
- ciris_engine/logic/processors/support/shutdown_condition_evaluator.py +294 -0
- ciris_engine/logic/processors/support/state_manager.py +358 -0
- ciris_engine/logic/processors/support/task_manager.py +303 -0
- ciris_engine/logic/processors/support/thought_escalation.py +116 -0
- ciris_engine/logic/processors/support/thought_manager.py +328 -0
- ciris_engine/logic/processors/support/thought_manager_enhanced.py +105 -0
- ciris_engine/logic/registries/__init__.py +34 -0
- ciris_engine/logic/registries/base.py +653 -0
- ciris_engine/logic/registries/circuit_breaker.py +275 -0
- ciris_engine/logic/registries/typed_registries.py +184 -0
- ciris_engine/logic/runtime/__init__.py +7 -0
- ciris_engine/logic/runtime/adapter_loader.py +261 -0
- ciris_engine/logic/runtime/adapter_manager.py +1053 -0
- ciris_engine/logic/runtime/ciris_runtime.py +2342 -0
- ciris_engine/logic/runtime/ciris_runtime_helpers.py +923 -0
- ciris_engine/logic/runtime/component_builder.py +361 -0
- ciris_engine/logic/runtime/identity_manager.py +219 -0
- ciris_engine/logic/runtime/module_loader.py +207 -0
- ciris_engine/logic/runtime/prevent_sideeffects.py +30 -0
- ciris_engine/logic/runtime/runtime_interface.py +23 -0
- ciris_engine/logic/runtime/service_initializer.py +1623 -0
- ciris_engine/logic/secrets/__init__.py +30 -0
- ciris_engine/logic/secrets/encryption.py +175 -0
- ciris_engine/logic/secrets/filter.py +295 -0
- ciris_engine/logic/secrets/service.py +652 -0
- ciris_engine/logic/secrets/store.py +669 -0
- ciris_engine/logic/services/__init__.py +1 -0
- ciris_engine/logic/services/adaptation/__init__.py +3 -0
- ciris_engine/logic/services/base_graph_service.py +142 -0
- ciris_engine/logic/services/base_infrastructure_service.py +69 -0
- ciris_engine/logic/services/base_scheduled_service.py +136 -0
- ciris_engine/logic/services/base_service.py +247 -0
- ciris_engine/logic/services/governance/__init__.py +3 -0
- ciris_engine/logic/services/governance/adaptive_filter/__init__.py +14 -0
- ciris_engine/logic/services/governance/adaptive_filter/service.py +818 -0
- ciris_engine/logic/services/governance/consent/__init__.py +53 -0
- ciris_engine/logic/services/governance/consent/air.py +403 -0
- ciris_engine/logic/services/governance/consent/decay.py +324 -0
- ciris_engine/logic/services/governance/consent/dsar_automation.py +589 -0
- ciris_engine/logic/services/governance/consent/exceptions.py +106 -0
- ciris_engine/logic/services/governance/consent/metrics.py +270 -0
- ciris_engine/logic/services/governance/consent/partnership.py +533 -0
- ciris_engine/logic/services/governance/consent/service.py +1256 -0
- ciris_engine/logic/services/governance/dsar/__init__.py +29 -0
- ciris_engine/logic/services/governance/dsar/orchestrator.py +977 -0
- ciris_engine/logic/services/governance/dsar/schemas.py +141 -0
- ciris_engine/logic/services/governance/dsar/signature_service.py +283 -0
- ciris_engine/logic/services/governance/self_observation/__init__.py +20 -0
- ciris_engine/logic/services/governance/self_observation/service.py +1153 -0
- ciris_engine/logic/services/governance/visibility/__init__.py +17 -0
- ciris_engine/logic/services/governance/visibility/service.py +512 -0
- ciris_engine/logic/services/governance/wise_authority/__init__.py +15 -0
- ciris_engine/logic/services/governance/wise_authority/service.py +827 -0
- ciris_engine/logic/services/graph/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/service.py +1675 -0
- ciris_engine/logic/services/graph/base.py +208 -0
- ciris_engine/logic/services/graph/config_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/config_service/service.py +372 -0
- ciris_engine/logic/services/graph/incident_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/incident_service/service.py +803 -0
- ciris_engine/logic/services/graph/memory_service.py +1120 -0
- ciris_engine/logic/services/graph/telemetry_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/telemetry_service/exceptions.py +104 -0
- ciris_engine/logic/services/graph/telemetry_service/helpers.py +1337 -0
- ciris_engine/logic/services/graph/telemetry_service/service.py +2429 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/__init__.py +17 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/aggregation_helpers.py +355 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/cleanup_helpers.py +438 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/compressor.py +260 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/__init__.py +27 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/audit.py +326 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/conversation.py +291 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/memory.py +197 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/metrics.py +251 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/task.py +257 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/trace.py +363 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/data_converter.py +545 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/date_calculation_helpers.py +193 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/db_query_helpers.py +296 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_helpers.py +92 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_manager.py +896 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/extensive_helpers.py +322 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/period_manager.py +152 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/profound_helpers.py +277 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/query_manager.py +812 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/service.py +1692 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/sql_builders.py +363 -0
- ciris_engine/logic/services/infrastructure/__init__.py +1 -0
- ciris_engine/logic/services/infrastructure/authentication/__init__.py +5 -0
- ciris_engine/logic/services/infrastructure/authentication/service.py +1634 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/__init__.py +15 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/service.py +764 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/__init__.py +7 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/ciris_billing_provider.py +755 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/service.py +409 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/simple_credit_provider.py +129 -0
- ciris_engine/logic/services/lifecycle/__init__.py +3 -0
- ciris_engine/logic/services/lifecycle/initialization/__init__.py +10 -0
- ciris_engine/logic/services/lifecycle/initialization/service.py +312 -0
- ciris_engine/logic/services/lifecycle/scheduler/__init__.py +5 -0
- ciris_engine/logic/services/lifecycle/scheduler/service.py +607 -0
- ciris_engine/logic/services/lifecycle/shutdown/__init__.py +9 -0
- ciris_engine/logic/services/lifecycle/shutdown/service.py +378 -0
- ciris_engine/logic/services/lifecycle/time/__init__.py +15 -0
- ciris_engine/logic/services/lifecycle/time/service.py +259 -0
- ciris_engine/logic/services/memory_service/__init__.py +8 -0
- ciris_engine/logic/services/mixins/__init__.py +13 -0
- ciris_engine/logic/services/mixins/example_usage.py +200 -0
- ciris_engine/logic/services/mixins/request_metrics.py +179 -0
- ciris_engine/logic/services/runtime/__init__.py +3 -0
- ciris_engine/logic/services/runtime/adapter_configuration/__init__.py +16 -0
- ciris_engine/logic/services/runtime/adapter_configuration/service.py +674 -0
- ciris_engine/logic/services/runtime/adapter_configuration/session.py +67 -0
- ciris_engine/logic/services/runtime/control_service/__init__.py +5 -0
- ciris_engine/logic/services/runtime/control_service/service.py +2269 -0
- ciris_engine/logic/services/runtime/llm_service/__init__.py +14 -0
- ciris_engine/logic/services/runtime/llm_service/pricing_calculator.py +279 -0
- ciris_engine/logic/services/runtime/llm_service/service.py +930 -0
- ciris_engine/logic/services/tools/__init__.py +5 -0
- ciris_engine/logic/services/tools/core_tool_service/__init__.py +8 -0
- ciris_engine/logic/services/tools/core_tool_service/service.py +852 -0
- ciris_engine/logic/setup/__init__.py +1 -0
- ciris_engine/logic/setup/first_run.py +250 -0
- ciris_engine/logic/setup/wizard.py +327 -0
- ciris_engine/logic/telemetry/__init__.py +46 -0
- ciris_engine/logic/telemetry/core.py +239 -0
- ciris_engine/logic/telemetry/hot_cold_config.py +133 -0
- ciris_engine/logic/telemetry/log_collector.py +190 -0
- ciris_engine/logic/telemetry/resource_monitor.py +7 -0
- ciris_engine/logic/telemetry/security.py +79 -0
- ciris_engine/logic/utils/__init__.py +18 -0
- ciris_engine/logic/utils/channel_utils.py +75 -0
- ciris_engine/logic/utils/consent/__init__.py +1 -0
- ciris_engine/logic/utils/consent/partnership_utils.py +172 -0
- ciris_engine/logic/utils/constants.py +92 -0
- ciris_engine/logic/utils/context_utils.py +145 -0
- ciris_engine/logic/utils/directory_setup.py +533 -0
- ciris_engine/logic/utils/graphql_context_provider.py +152 -0
- ciris_engine/logic/utils/identity_resolution.py +843 -0
- ciris_engine/logic/utils/incident_capture_handler.py +303 -0
- ciris_engine/logic/utils/initialization_manager.py +74 -0
- ciris_engine/logic/utils/jsondict_helpers.py +290 -0
- ciris_engine/logic/utils/log_sanitizer.py +97 -0
- ciris_engine/logic/utils/logging_config.py +151 -0
- ciris_engine/logic/utils/observability_decorators.py +544 -0
- ciris_engine/logic/utils/occurrence_utils.py +155 -0
- ciris_engine/logic/utils/path_resolution.py +281 -0
- ciris_engine/logic/utils/platform_detection.py +286 -0
- ciris_engine/logic/utils/privacy.py +266 -0
- ciris_engine/logic/utils/profile_loader.py +124 -0
- ciris_engine/logic/utils/profile_manager.py +16 -0
- ciris_engine/logic/utils/runtime_utils.py +69 -0
- ciris_engine/logic/utils/shutdown_manager.py +107 -0
- ciris_engine/logic/utils/task_formatters.py +60 -0
- ciris_engine/logic/utils/task_thought_factory.py +404 -0
- ciris_engine/logic/utils/thought_utils.py +54 -0
- ciris_engine/logic/utils/user_utils.py +70 -0
- ciris_engine/protocols/__init__.py +0 -0
- ciris_engine/protocols/adapters/__init__.py +35 -0
- ciris_engine/protocols/adapters/base.py +149 -0
- ciris_engine/protocols/adapters/configurable.py +265 -0
- ciris_engine/protocols/adapters/message.py +90 -0
- ciris_engine/protocols/audit/__init__.py +1 -0
- ciris_engine/protocols/buses/__init__.py +1 -0
- ciris_engine/protocols/config/__init__.py +1 -0
- ciris_engine/protocols/conscience/__init__.py +1 -0
- ciris_engine/protocols/consent.py +88 -0
- ciris_engine/protocols/context/__init__.py +1 -0
- ciris_engine/protocols/data/__init__.py +1 -0
- ciris_engine/protocols/dma/__init__.py +1 -0
- ciris_engine/protocols/dma/base.py +107 -0
- ciris_engine/protocols/faculties.py +34 -0
- ciris_engine/protocols/formatters/__init__.py +1 -0
- ciris_engine/protocols/handlers/__init__.py +1 -0
- ciris_engine/protocols/infrastructure/__init__.py +25 -0
- ciris_engine/protocols/infrastructure/base.py +377 -0
- ciris_engine/protocols/persistence/__init__.py +1 -0
- ciris_engine/protocols/pipeline_control.py +609 -0
- ciris_engine/protocols/processors/__init__.py +19 -0
- ciris_engine/protocols/processors/agent.py +299 -0
- ciris_engine/protocols/processors/base.py +130 -0
- ciris_engine/protocols/processors/orchestration.py +62 -0
- ciris_engine/protocols/registries/__init__.py +1 -0
- ciris_engine/protocols/runtime/__init__.py +1 -0
- ciris_engine/protocols/runtime/base.py +163 -0
- ciris_engine/protocols/secrets/__init__.py +1 -0
- ciris_engine/protocols/services/__init__.py +80 -0
- ciris_engine/protocols/services/adaptation/__init__.py +7 -0
- ciris_engine/protocols/services/adaptation/self_observation.py +265 -0
- ciris_engine/protocols/services/governance/__init__.py +20 -0
- ciris_engine/protocols/services/governance/communication.py +58 -0
- ciris_engine/protocols/services/governance/filter.py +56 -0
- ciris_engine/protocols/services/governance/visibility.py +32 -0
- ciris_engine/protocols/services/governance/wa_auth.py +192 -0
- ciris_engine/protocols/services/governance/wise_authority.py +75 -0
- ciris_engine/protocols/services/graph/__init__.py +19 -0
- ciris_engine/protocols/services/graph/audit.py +92 -0
- ciris_engine/protocols/services/graph/config.py +54 -0
- ciris_engine/protocols/services/graph/incident_management.py +103 -0
- ciris_engine/protocols/services/graph/memory.py +110 -0
- ciris_engine/protocols/services/graph/telemetry.py +51 -0
- ciris_engine/protocols/services/graph/tsdb_consolidation.py +87 -0
- ciris_engine/protocols/services/infrastructure/__init__.py +11 -0
- ciris_engine/protocols/services/infrastructure/authentication.py +159 -0
- ciris_engine/protocols/services/infrastructure/credit_gate.py +46 -0
- ciris_engine/protocols/services/infrastructure/database_maintenance.py +25 -0
- ciris_engine/protocols/services/infrastructure/resource_monitor.py +83 -0
- ciris_engine/protocols/services/lifecycle/__init__.py +13 -0
- ciris_engine/protocols/services/lifecycle/initialization.py +41 -0
- ciris_engine/protocols/services/lifecycle/scheduler.py +42 -0
- ciris_engine/protocols/services/lifecycle/shutdown.py +50 -0
- ciris_engine/protocols/services/lifecycle/time.py +31 -0
- ciris_engine/protocols/services/runtime/__init__.py +13 -0
- ciris_engine/protocols/services/runtime/llm.py +50 -0
- ciris_engine/protocols/services/runtime/runtime_control.py +193 -0
- ciris_engine/protocols/services/runtime/secrets.py +100 -0
- ciris_engine/protocols/services/runtime/tool.py +123 -0
- ciris_engine/protocols/telemetry/__init__.py +1 -0
- ciris_engine/protocols/utils/__init__.py +1 -0
- ciris_engine/schemas/__init__.py +112 -0
- ciris_engine/schemas/actions/__init__.py +37 -0
- ciris_engine/schemas/actions/parameters.py +137 -0
- ciris_engine/schemas/adapters/__init__.py +13 -0
- ciris_engine/schemas/adapters/cirisnode.py +135 -0
- ciris_engine/schemas/adapters/cli.py +97 -0
- ciris_engine/schemas/adapters/cli_tools.py +98 -0
- ciris_engine/schemas/adapters/discord.py +125 -0
- ciris_engine/schemas/adapters/graphql_core.py +144 -0
- ciris_engine/schemas/adapters/registration.py +47 -0
- ciris_engine/schemas/adapters/runtime_context.py +48 -0
- ciris_engine/schemas/adapters/tool_execution.py +45 -0
- ciris_engine/schemas/adapters/tools.py +96 -0
- ciris_engine/schemas/api/__init__.py +1 -0
- ciris_engine/schemas/api/agent.py +50 -0
- ciris_engine/schemas/api/audit.py +38 -0
- ciris_engine/schemas/api/auth.py +351 -0
- ciris_engine/schemas/api/config_security.py +242 -0
- ciris_engine/schemas/api/emergency.py +111 -0
- ciris_engine/schemas/api/responses.py +72 -0
- ciris_engine/schemas/api/runtime.py +26 -0
- ciris_engine/schemas/api/telemetry.py +109 -0
- ciris_engine/schemas/api/wa.py +90 -0
- ciris_engine/schemas/audit/__init__.py +13 -0
- ciris_engine/schemas/audit/core.py +139 -0
- ciris_engine/schemas/audit/hash_chain.py +58 -0
- ciris_engine/schemas/audit/verification.py +131 -0
- ciris_engine/schemas/buses/__init__.py +1 -0
- ciris_engine/schemas/config/__init__.py +41 -0
- ciris_engine/schemas/config/agent.py +279 -0
- ciris_engine/schemas/config/cognitive_state_behaviors.py +194 -0
- ciris_engine/schemas/config/default_dsar_sops.py +178 -0
- ciris_engine/schemas/config/essential.py +195 -0
- ciris_engine/schemas/config/tickets.py +86 -0
- ciris_engine/schemas/conscience/__init__.py +25 -0
- ciris_engine/schemas/conscience/context.py +34 -0
- ciris_engine/schemas/conscience/core.py +145 -0
- ciris_engine/schemas/conscience/results.py +24 -0
- ciris_engine/schemas/consent/__init__.py +5 -0
- ciris_engine/schemas/consent/core.py +404 -0
- ciris_engine/schemas/context/__init__.py +1 -0
- ciris_engine/schemas/covenant.py +382 -0
- ciris_engine/schemas/data/__init__.py +1 -0
- ciris_engine/schemas/dma/__init__.py +16 -0
- ciris_engine/schemas/dma/core.py +199 -0
- ciris_engine/schemas/dma/faculty.py +192 -0
- ciris_engine/schemas/dma/prompts.py +172 -0
- ciris_engine/schemas/dma/results.py +103 -0
- ciris_engine/schemas/formatters/__init__.py +1 -0
- ciris_engine/schemas/handlers/__init__.py +10 -0
- ciris_engine/schemas/handlers/context.py +119 -0
- ciris_engine/schemas/handlers/contexts.py +100 -0
- ciris_engine/schemas/handlers/core.py +167 -0
- ciris_engine/schemas/handlers/memory_schemas.py +67 -0
- ciris_engine/schemas/handlers/schemas.py +95 -0
- ciris_engine/schemas/identity.py +149 -0
- ciris_engine/schemas/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/infrastructure/base.py +256 -0
- ciris_engine/schemas/infrastructure/behavioral_patterns.py +129 -0
- ciris_engine/schemas/infrastructure/feedback_loop.py +57 -0
- ciris_engine/schemas/infrastructure/identity_variance.py +141 -0
- ciris_engine/schemas/infrastructure/oauth.py +175 -0
- ciris_engine/schemas/infrastructure/wa_cli_wizard.py +54 -0
- ciris_engine/schemas/persistence/__init__.py +34 -0
- ciris_engine/schemas/persistence/core.py +140 -0
- ciris_engine/schemas/persistence/correlations.py +73 -0
- ciris_engine/schemas/persistence/postgres/__init__.py +1 -0
- ciris_engine/schemas/persistence/postgres/tables.py +280 -0
- ciris_engine/schemas/persistence/sqlite/__init__.py +1 -0
- ciris_engine/schemas/persistence/sqlite/tables.py +281 -0
- ciris_engine/schemas/platform.py +149 -0
- ciris_engine/schemas/processors/__init__.py +26 -0
- ciris_engine/schemas/processors/base.py +130 -0
- ciris_engine/schemas/processors/cognitive.py +77 -0
- ciris_engine/schemas/processors/context.py +35 -0
- ciris_engine/schemas/processors/core.py +152 -0
- ciris_engine/schemas/processors/dma.py +105 -0
- ciris_engine/schemas/processors/error.py +122 -0
- ciris_engine/schemas/processors/main.py +109 -0
- ciris_engine/schemas/processors/phase_results.py +21 -0
- ciris_engine/schemas/processors/results.py +99 -0
- ciris_engine/schemas/processors/solitude.py +79 -0
- ciris_engine/schemas/processors/state.py +202 -0
- ciris_engine/schemas/processors/state_example.py +177 -0
- ciris_engine/schemas/processors/states.py +21 -0
- ciris_engine/schemas/processors/status.py +34 -0
- ciris_engine/schemas/registries/__init__.py +1 -0
- ciris_engine/schemas/registries/base.py +66 -0
- ciris_engine/schemas/resources/__init__.py +15 -0
- ciris_engine/schemas/resources/crisis.py +315 -0
- ciris_engine/schemas/runtime/__init__.py +42 -0
- ciris_engine/schemas/runtime/adapter_management.py +186 -0
- ciris_engine/schemas/runtime/api.py +58 -0
- ciris_engine/schemas/runtime/audit.py +50 -0
- ciris_engine/schemas/runtime/bootstrap.py +33 -0
- ciris_engine/schemas/runtime/contexts.py +61 -0
- ciris_engine/schemas/runtime/core.py +161 -0
- ciris_engine/schemas/runtime/enums.py +167 -0
- ciris_engine/schemas/runtime/extended.py +232 -0
- ciris_engine/schemas/runtime/manifest.py +311 -0
- ciris_engine/schemas/runtime/memory.py +60 -0
- ciris_engine/schemas/runtime/messages.py +108 -0
- ciris_engine/schemas/runtime/models.py +156 -0
- ciris_engine/schemas/runtime/processing_context.py +43 -0
- ciris_engine/schemas/runtime/protocols_core.py +96 -0
- ciris_engine/schemas/runtime/resources.py +33 -0
- ciris_engine/schemas/runtime/system_context.py +417 -0
- ciris_engine/schemas/secrets/__init__.py +1 -0
- ciris_engine/schemas/secrets/core.py +267 -0
- ciris_engine/schemas/secrets/service.py +95 -0
- ciris_engine/schemas/services/__init__.py +33 -0
- ciris_engine/schemas/services/audit_summary_node.py +172 -0
- ciris_engine/schemas/services/authority/__init__.py +39 -0
- ciris_engine/schemas/services/authority/jwt.py +158 -0
- ciris_engine/schemas/services/authority/wa_updates.py +138 -0
- ciris_engine/schemas/services/authority/wise_authority.py +163 -0
- ciris_engine/schemas/services/authority_core.py +370 -0
- ciris_engine/schemas/services/capabilities.py +72 -0
- ciris_engine/schemas/services/community_core.py +95 -0
- ciris_engine/schemas/services/context.py +111 -0
- ciris_engine/schemas/services/conversation_summary_node.py +189 -0
- ciris_engine/schemas/services/core/__init__.py +153 -0
- ciris_engine/schemas/services/core/runtime.py +262 -0
- ciris_engine/schemas/services/core/runtime_config.py +117 -0
- ciris_engine/schemas/services/core/secrets.py +65 -0
- ciris_engine/schemas/services/correlation_node.py +179 -0
- ciris_engine/schemas/services/credit_gate.py +92 -0
- ciris_engine/schemas/services/discord_nodes.py +299 -0
- ciris_engine/schemas/services/feedback_core.py +131 -0
- ciris_engine/schemas/services/filters_core.py +270 -0
- ciris_engine/schemas/services/governance.py +26 -0
- ciris_engine/schemas/services/graph/__init__.py +26 -0
- ciris_engine/schemas/services/graph/attributes.py +254 -0
- ciris_engine/schemas/services/graph/audit.py +98 -0
- ciris_engine/schemas/services/graph/consolidation.py +338 -0
- ciris_engine/schemas/services/graph/edge_types.py +43 -0
- ciris_engine/schemas/services/graph/edges.py +88 -0
- ciris_engine/schemas/services/graph/incident.py +312 -0
- ciris_engine/schemas/services/graph/memory.py +84 -0
- ciris_engine/schemas/services/graph/node_data.py +174 -0
- ciris_engine/schemas/services/graph/query_results.py +82 -0
- ciris_engine/schemas/services/graph/telemetry.py +250 -0
- ciris_engine/schemas/services/graph/tsdb_consolidation.py +27 -0
- ciris_engine/schemas/services/graph/tsdb_models.py +107 -0
- ciris_engine/schemas/services/graph_core.py +196 -0
- ciris_engine/schemas/services/graph_typed_nodes.py +194 -0
- ciris_engine/schemas/services/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/services/infrastructure/resource_monitor.py +20 -0
- ciris_engine/schemas/services/lifecycle/__init__.py +9 -0
- ciris_engine/schemas/services/lifecycle/initialization.py +33 -0
- ciris_engine/schemas/services/lifecycle/time.py +50 -0
- ciris_engine/schemas/services/llm.py +187 -0
- ciris_engine/schemas/services/metadata.py +43 -0
- ciris_engine/schemas/services/nodes.py +704 -0
- ciris_engine/schemas/services/operations.py +126 -0
- ciris_engine/schemas/services/requests.py +128 -0
- ciris_engine/schemas/services/resources_core.py +182 -0
- ciris_engine/schemas/services/runtime_control.py +1010 -0
- ciris_engine/schemas/services/shutdown.py +88 -0
- ciris_engine/schemas/services/special/__init__.py +0 -0
- ciris_engine/schemas/services/special/self_observation.py +396 -0
- ciris_engine/schemas/services/trace_summary_node.py +199 -0
- ciris_engine/schemas/services/visibility.py +98 -0
- ciris_engine/schemas/streaming/__init__.py +10 -0
- ciris_engine/schemas/streaming/reasoning_stream.py +95 -0
- ciris_engine/schemas/telemetry/__init__.py +0 -0
- ciris_engine/schemas/telemetry/collector.py +67 -0
- ciris_engine/schemas/telemetry/core.py +252 -0
- ciris_engine/schemas/telemetry/unified.py +59 -0
- ciris_engine/schemas/tools.py +72 -0
- ciris_engine/schemas/types.py +47 -0
- ciris_engine/schemas/utils/__init__.py +1 -0
- ciris_engine/schemas/utils/config_validator.py +54 -0
- ciris_engine/utils/__init__.py +1 -0
- ciris_engine/utils/serialization.py +35 -0
- ciris_sdk/__init__.py +124 -0
- ciris_sdk/auth_store.py +261 -0
- ciris_sdk/client.py +261 -0
- ciris_sdk/exceptions.py +73 -0
- ciris_sdk/model_types.py +258 -0
- ciris_sdk/models.py +354 -0
- ciris_sdk/pagination.py +214 -0
- ciris_sdk/rate_limiter.py +188 -0
- ciris_sdk/setup.py +17 -0
- ciris_sdk/telemetry_models.py +257 -0
- ciris_sdk/telemetry_responses.py +199 -0
- ciris_sdk/transport.py +177 -0
- ciris_sdk/websocket.py +400 -0
- main.py +766 -0
|
@@ -0,0 +1,977 @@
|
|
|
1
|
+
"""Multi-source DSAR orchestration service.
|
|
2
|
+
|
|
3
|
+
Coordinates DSAR requests across CIRIS + external data sources (SQL, REST, HL7).
|
|
4
|
+
|
|
5
|
+
Architecture:
|
|
6
|
+
- Fast path: DSARAutomationService (CIRIS only, ~500ms)
|
|
7
|
+
- Slow path: DSAROrchestrator (multi-source, ~3-10s)
|
|
8
|
+
|
|
9
|
+
For CIRIS-only DSAR, use DSARAutomationService in consent/.
|
|
10
|
+
For multi-source DSAR, use this orchestrator.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from datetime import datetime, timedelta
|
|
15
|
+
from typing import Any, Dict, List, Optional, cast
|
|
16
|
+
|
|
17
|
+
from fastapi import HTTPException, status
|
|
18
|
+
|
|
19
|
+
from ciris_engine.logic.buses.memory_bus import MemoryBus
|
|
20
|
+
from ciris_engine.logic.buses.tool_bus import ToolBus
|
|
21
|
+
from ciris_engine.logic.services.governance.consent import ConsentService
|
|
22
|
+
from ciris_engine.logic.services.governance.consent.dsar_automation import DSARAutomationService
|
|
23
|
+
from ciris_engine.protocols.services.graph.memory import MemoryServiceProtocol
|
|
24
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
25
|
+
from ciris_engine.schemas.consent.core import (
|
|
26
|
+
ConsentCategory,
|
|
27
|
+
ConsentImpactReport,
|
|
28
|
+
ConsentStatus,
|
|
29
|
+
ConsentStream,
|
|
30
|
+
DSARExportFormat,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
from .schemas import (
|
|
34
|
+
DataSourceDeletion,
|
|
35
|
+
DataSourceExport,
|
|
36
|
+
MultiSourceDSARAccessPackage,
|
|
37
|
+
MultiSourceDSARCorrectionResult,
|
|
38
|
+
MultiSourceDSARDeletionResult,
|
|
39
|
+
MultiSourceDSARExportPackage,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class DSAROrchestrator:
|
|
46
|
+
"""Orchestrates DSAR across CIRIS + external data sources.
|
|
47
|
+
|
|
48
|
+
Coordinates multi-source data subject access requests using:
|
|
49
|
+
- DSARAutomationService for CIRIS internal data
|
|
50
|
+
- ConsentService for initiating decay protocol
|
|
51
|
+
- ToolBus for discovering SQL/REST/HL7 connectors
|
|
52
|
+
- Identity resolution for mapping users across systems
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
time_service: TimeServiceProtocol,
|
|
58
|
+
dsar_automation: DSARAutomationService,
|
|
59
|
+
consent_service: ConsentService,
|
|
60
|
+
tool_bus: ToolBus,
|
|
61
|
+
memory_bus: MemoryBus,
|
|
62
|
+
):
|
|
63
|
+
"""Initialize DSAR orchestrator.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
time_service: Time service for consistent timestamps
|
|
67
|
+
dsar_automation: CIRIS-only DSAR automation service
|
|
68
|
+
consent_service: Consent service for revoking consent and initiating decay
|
|
69
|
+
tool_bus: Tool bus for discovering external connectors
|
|
70
|
+
memory_bus: Memory bus for identity resolution
|
|
71
|
+
"""
|
|
72
|
+
self._time_service = time_service
|
|
73
|
+
self._dsar_automation = dsar_automation
|
|
74
|
+
self._consent_service = consent_service
|
|
75
|
+
self._tool_bus = tool_bus
|
|
76
|
+
self._memory_bus = memory_bus
|
|
77
|
+
|
|
78
|
+
# Metrics
|
|
79
|
+
self._multi_source_requests = 0
|
|
80
|
+
self._total_sources_queried = 0
|
|
81
|
+
self._total_processing_time = 0.0
|
|
82
|
+
|
|
83
|
+
def _now(self) -> datetime:
|
|
84
|
+
"""Get current time from time service."""
|
|
85
|
+
return self._time_service.now()
|
|
86
|
+
|
|
87
|
+
async def handle_access_request_multi_source(
|
|
88
|
+
self, user_identifier: str, request_id: Optional[str] = None
|
|
89
|
+
) -> MultiSourceDSARAccessPackage:
|
|
90
|
+
"""Handle GDPR Article 15 access request across all data sources.
|
|
91
|
+
|
|
92
|
+
Coordinates access request across:
|
|
93
|
+
1. CIRIS internal data (via DSARAutomationService)
|
|
94
|
+
2. SQL databases (via ToolBus)
|
|
95
|
+
3. REST APIs (via ToolBus)
|
|
96
|
+
4. HL7 systems (via ToolBus - future)
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
user_identifier: User identifier (email, user_id, etc.)
|
|
100
|
+
request_id: Optional request ID for tracking
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Aggregated access package from all sources
|
|
104
|
+
|
|
105
|
+
Implementation:
|
|
106
|
+
- Resolves user identity across systems
|
|
107
|
+
- Gets CIRIS internal data (fast path)
|
|
108
|
+
- Queries all SQL/REST connectors via ToolBus
|
|
109
|
+
- Aggregates results with performance tracking
|
|
110
|
+
"""
|
|
111
|
+
import hashlib
|
|
112
|
+
import time
|
|
113
|
+
|
|
114
|
+
from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
|
|
115
|
+
|
|
116
|
+
# Start timer
|
|
117
|
+
start_time = time.time()
|
|
118
|
+
|
|
119
|
+
# Generate request ID if not provided
|
|
120
|
+
if not request_id:
|
|
121
|
+
request_id = f"DSAR-ACCESS-{self._now().strftime('%Y%m%d-%H%M%S')}"
|
|
122
|
+
|
|
123
|
+
logger.info(f"Starting multi-source access request {request_id} for {user_identifier}")
|
|
124
|
+
|
|
125
|
+
# Step 1: Resolve user identity across all systems
|
|
126
|
+
identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
|
|
127
|
+
|
|
128
|
+
# Step 2: Get CIRIS internal data (fast path)
|
|
129
|
+
try:
|
|
130
|
+
ciris_data = await self._dsar_automation.handle_access_request(user_identifier)
|
|
131
|
+
except Exception as e:
|
|
132
|
+
logger.exception(f"Failed to get CIRIS data for {user_identifier}: {e}")
|
|
133
|
+
# Create empty package as fallback
|
|
134
|
+
from ciris_engine.schemas.consent.core import ConsentAuditEntry, DSARAccessPackage
|
|
135
|
+
|
|
136
|
+
ciris_data = DSARAccessPackage(
|
|
137
|
+
user_id=user_identifier,
|
|
138
|
+
request_id=request_id,
|
|
139
|
+
generated_at=self._now(),
|
|
140
|
+
consent_status=ConsentStatus(
|
|
141
|
+
user_id=user_identifier,
|
|
142
|
+
stream=ConsentStream.TEMPORARY,
|
|
143
|
+
categories=[],
|
|
144
|
+
granted_at=self._now(),
|
|
145
|
+
last_modified=self._now(),
|
|
146
|
+
),
|
|
147
|
+
consent_history=[],
|
|
148
|
+
interaction_summary={},
|
|
149
|
+
contribution_metrics=ConsentImpactReport(
|
|
150
|
+
user_id=user_identifier,
|
|
151
|
+
total_interactions=0,
|
|
152
|
+
patterns_contributed=0,
|
|
153
|
+
users_helped=0,
|
|
154
|
+
categories_active=[],
|
|
155
|
+
impact_score=0.0,
|
|
156
|
+
example_contributions=[],
|
|
157
|
+
),
|
|
158
|
+
data_categories=[],
|
|
159
|
+
retention_periods={},
|
|
160
|
+
processing_purposes=[],
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Step 3: Discover and query SQL connectors
|
|
164
|
+
external_sources: List[DataSourceExport] = []
|
|
165
|
+
sql_connectors = await self._discover_sql_connectors()
|
|
166
|
+
|
|
167
|
+
for connector_id in sql_connectors:
|
|
168
|
+
try:
|
|
169
|
+
export = await self._export_from_sql(connector_id, user_identifier)
|
|
170
|
+
external_sources.append(export)
|
|
171
|
+
except Exception as e:
|
|
172
|
+
logger.error(f"Failed to export from SQL connector {connector_id}: {e}")
|
|
173
|
+
# Add error entry
|
|
174
|
+
external_sources.append(
|
|
175
|
+
DataSourceExport(
|
|
176
|
+
source_id=connector_id,
|
|
177
|
+
source_type="sql",
|
|
178
|
+
source_name=connector_id,
|
|
179
|
+
export_timestamp=self._now().isoformat(),
|
|
180
|
+
errors=[str(e)],
|
|
181
|
+
)
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# Step 4: Discover and query REST connectors (future)
|
|
185
|
+
# TODO Phase 2: Implement REST connector discovery and export
|
|
186
|
+
# Implementation:
|
|
187
|
+
# 1. Call _discover_rest_connectors() to find REST API connectors
|
|
188
|
+
# 2. For each connector, call _export_from_rest(connector_id, user_identifier)
|
|
189
|
+
# 3. Aggregate REST exports into external_sources list
|
|
190
|
+
# 4. Handle errors gracefully (similar to SQL connector pattern above)
|
|
191
|
+
|
|
192
|
+
# Step 5: Calculate totals
|
|
193
|
+
total_records = sum(src.total_records for src in external_sources)
|
|
194
|
+
processing_time = time.time() - start_time
|
|
195
|
+
|
|
196
|
+
# Step 6: Update metrics
|
|
197
|
+
self._multi_source_requests += 1
|
|
198
|
+
self._total_sources_queried += 1 + len(external_sources) # CIRIS + external
|
|
199
|
+
self._total_processing_time += processing_time
|
|
200
|
+
|
|
201
|
+
# Step 7: Build aggregated package
|
|
202
|
+
package = MultiSourceDSARAccessPackage(
|
|
203
|
+
request_id=request_id,
|
|
204
|
+
user_identifier=user_identifier,
|
|
205
|
+
ciris_data=ciris_data,
|
|
206
|
+
external_sources=external_sources,
|
|
207
|
+
identity_node=identity_node,
|
|
208
|
+
total_sources=1 + len(external_sources),
|
|
209
|
+
total_records=total_records,
|
|
210
|
+
generated_at=self._now().isoformat(),
|
|
211
|
+
processing_time_seconds=processing_time,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
logger.info(
|
|
215
|
+
f"Completed multi-source access request {request_id}: "
|
|
216
|
+
f"{package.total_sources} sources, {total_records} records, {processing_time:.2f}s"
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
return package
|
|
220
|
+
|
|
221
|
+
async def handle_export_request_multi_source(
|
|
222
|
+
self,
|
|
223
|
+
user_identifier: str,
|
|
224
|
+
export_format: DSARExportFormat,
|
|
225
|
+
request_id: Optional[str] = None,
|
|
226
|
+
) -> MultiSourceDSARExportPackage:
|
|
227
|
+
"""Handle GDPR Article 20 export request across all data sources.
|
|
228
|
+
|
|
229
|
+
Generates downloadable export aggregating data from all sources.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
user_identifier: User identifier
|
|
233
|
+
export_format: Desired format (JSON, CSV, SQLite)
|
|
234
|
+
request_id: Optional request ID for tracking
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
Aggregated export package from all sources
|
|
238
|
+
|
|
239
|
+
Implementation:
|
|
240
|
+
- Resolves user identity
|
|
241
|
+
- Gets CIRIS export in specified format
|
|
242
|
+
- Queries all SQL connectors for exports
|
|
243
|
+
- Aggregates data and calculates total size/checksum
|
|
244
|
+
"""
|
|
245
|
+
import hashlib
|
|
246
|
+
import json
|
|
247
|
+
import time
|
|
248
|
+
|
|
249
|
+
from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
|
|
250
|
+
|
|
251
|
+
# Start timer
|
|
252
|
+
start_time = time.time()
|
|
253
|
+
|
|
254
|
+
# Generate request ID if not provided
|
|
255
|
+
if not request_id:
|
|
256
|
+
request_id = f"DSAR-EXPORT-{self._now().strftime('%Y%m%d-%H%M%S')}"
|
|
257
|
+
|
|
258
|
+
logger.info(
|
|
259
|
+
f"Starting multi-source export request {request_id} for {user_identifier} (format: {export_format})"
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
# Step 1: Resolve user identity
|
|
263
|
+
identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
|
|
264
|
+
|
|
265
|
+
# Step 2: Get CIRIS export
|
|
266
|
+
try:
|
|
267
|
+
ciris_export = await self._dsar_automation.handle_export_request(user_identifier, export_format)
|
|
268
|
+
except Exception as e:
|
|
269
|
+
logger.exception(f"Failed to get CIRIS export for {user_identifier}: {e}")
|
|
270
|
+
# Create empty export as fallback
|
|
271
|
+
from ciris_engine.schemas.consent.core import DSARExportPackage
|
|
272
|
+
|
|
273
|
+
ciris_export = DSARExportPackage(
|
|
274
|
+
user_id=user_identifier,
|
|
275
|
+
request_id=request_id,
|
|
276
|
+
export_format=export_format,
|
|
277
|
+
generated_at=self._now(),
|
|
278
|
+
file_path=None,
|
|
279
|
+
file_size_bytes=0,
|
|
280
|
+
record_counts={},
|
|
281
|
+
checksum="",
|
|
282
|
+
includes_readme=True,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# Step 3: Discover and export from SQL connectors
|
|
286
|
+
external_exports: List[DataSourceExport] = []
|
|
287
|
+
sql_connectors = await self._discover_sql_connectors()
|
|
288
|
+
|
|
289
|
+
for connector_id in sql_connectors:
|
|
290
|
+
try:
|
|
291
|
+
export = await self._export_from_sql(connector_id, user_identifier)
|
|
292
|
+
external_exports.append(export)
|
|
293
|
+
except Exception as e:
|
|
294
|
+
logger.error(f"Failed to export from SQL connector {connector_id}: {e}")
|
|
295
|
+
external_exports.append(
|
|
296
|
+
DataSourceExport(
|
|
297
|
+
source_id=connector_id,
|
|
298
|
+
source_type="sql",
|
|
299
|
+
source_name=connector_id,
|
|
300
|
+
export_timestamp=self._now().isoformat(),
|
|
301
|
+
errors=[str(e)],
|
|
302
|
+
)
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Step 4: Calculate total size
|
|
306
|
+
total_size_bytes = ciris_export.file_size_bytes + sum(
|
|
307
|
+
len(json.dumps(src.data).encode("utf-8")) for src in external_exports
|
|
308
|
+
)
|
|
309
|
+
total_records = sum(src.total_records for src in external_exports)
|
|
310
|
+
|
|
311
|
+
# Step 5: Calculate processing time
|
|
312
|
+
processing_time = time.time() - start_time
|
|
313
|
+
|
|
314
|
+
# Step 6: Update metrics
|
|
315
|
+
self._multi_source_requests += 1
|
|
316
|
+
self._total_sources_queried += 1 + len(external_exports)
|
|
317
|
+
self._total_processing_time += processing_time
|
|
318
|
+
|
|
319
|
+
# Step 7: Build export package
|
|
320
|
+
package = MultiSourceDSARExportPackage(
|
|
321
|
+
request_id=request_id,
|
|
322
|
+
user_identifier=user_identifier,
|
|
323
|
+
ciris_export=ciris_export,
|
|
324
|
+
external_exports=external_exports,
|
|
325
|
+
identity_node=identity_node,
|
|
326
|
+
total_sources=1 + len(external_exports),
|
|
327
|
+
total_records=total_records,
|
|
328
|
+
total_size_bytes=total_size_bytes,
|
|
329
|
+
export_format=export_format.value if hasattr(export_format, "value") else str(export_format),
|
|
330
|
+
generated_at=self._now().isoformat(),
|
|
331
|
+
processing_time_seconds=processing_time,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
logger.info(
|
|
335
|
+
f"Completed multi-source export {request_id}: "
|
|
336
|
+
f"{package.total_sources} sources, {total_size_bytes} bytes, {processing_time:.2f}s"
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
return package
|
|
340
|
+
|
|
341
|
+
async def handle_deletion_request_multi_source(
|
|
342
|
+
self, user_identifier: str, request_id: Optional[str] = None
|
|
343
|
+
) -> MultiSourceDSARDeletionResult:
|
|
344
|
+
"""Handle GDPR Article 17 deletion request across all data sources.
|
|
345
|
+
|
|
346
|
+
Coordinates deletion across:
|
|
347
|
+
1. CIRIS internal data (90-day decay protocol)
|
|
348
|
+
2. SQL databases (immediate deletion with verification)
|
|
349
|
+
3. REST APIs (API-based deletion)
|
|
350
|
+
4. HL7 systems (medical data deletion - future)
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
user_identifier: User identifier
|
|
354
|
+
request_id: Optional request ID for tracking
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
Aggregated deletion result from all sources
|
|
358
|
+
|
|
359
|
+
Implementation:
|
|
360
|
+
- Resolves user identity
|
|
361
|
+
- Initiates 90-day decay in CIRIS (via ConsentService - future)
|
|
362
|
+
- Deletes from all SQL connectors with verification
|
|
363
|
+
- Tracks success/failure across all sources
|
|
364
|
+
|
|
365
|
+
Note: CIRIS internal deletion requires ConsentService.revoke_consent()
|
|
366
|
+
which isn't available in DSAROrchestrator constructor. This should be
|
|
367
|
+
added when orchestrator is integrated into the service layer.
|
|
368
|
+
"""
|
|
369
|
+
import time
|
|
370
|
+
|
|
371
|
+
from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
|
|
372
|
+
|
|
373
|
+
# Start timer
|
|
374
|
+
start_time = time.time()
|
|
375
|
+
|
|
376
|
+
# Generate request ID if not provided
|
|
377
|
+
if not request_id:
|
|
378
|
+
request_id = f"DSAR-DELETE-{self._now().strftime('%Y%m%d-%H%M%S')}"
|
|
379
|
+
|
|
380
|
+
logger.info(f"Starting multi-source deletion request {request_id} for {user_identifier}")
|
|
381
|
+
|
|
382
|
+
# Step 1: Resolve user identity
|
|
383
|
+
identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
|
|
384
|
+
|
|
385
|
+
# Step 2: Initiate CIRIS deletion (90-day decay protocol)
|
|
386
|
+
try:
|
|
387
|
+
# Revoke consent to initiate decay protocol
|
|
388
|
+
await self._consent_service.revoke_consent(
|
|
389
|
+
user_id=user_identifier,
|
|
390
|
+
reason=f"GDPR Article 17 - Multi-source deletion request {request_id}",
|
|
391
|
+
)
|
|
392
|
+
logger.info(f"Initiated consent revocation and decay protocol for {user_identifier}")
|
|
393
|
+
|
|
394
|
+
# Get actual deletion status from DSAR automation
|
|
395
|
+
ciris_deletion = await self._dsar_automation.get_deletion_status(user_identifier, request_id)
|
|
396
|
+
|
|
397
|
+
# If no status found yet, create initial status
|
|
398
|
+
if ciris_deletion is None:
|
|
399
|
+
from ciris_engine.schemas.consent.core import DSARDeletionStatus
|
|
400
|
+
|
|
401
|
+
ciris_deletion = DSARDeletionStatus(
|
|
402
|
+
ticket_id=request_id,
|
|
403
|
+
user_id=user_identifier,
|
|
404
|
+
decay_started=self._now(),
|
|
405
|
+
current_phase="identity_severed", # First phase of decay
|
|
406
|
+
completion_percentage=0.0,
|
|
407
|
+
estimated_completion=self._now() + timedelta(days=90),
|
|
408
|
+
milestones_completed=[],
|
|
409
|
+
next_milestone="interaction_history_purged",
|
|
410
|
+
safety_patterns_retained=0,
|
|
411
|
+
)
|
|
412
|
+
except Exception as e:
|
|
413
|
+
logger.exception(f"Failed to initiate consent revocation for {user_identifier}: {e}")
|
|
414
|
+
raise HTTPException(
|
|
415
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
416
|
+
detail=f"Failed to initiate CIRIS deletion: {str(e)}",
|
|
417
|
+
) from e
|
|
418
|
+
|
|
419
|
+
# Step 3: Delete from SQL connectors with verification
|
|
420
|
+
external_deletions: List[DataSourceDeletion] = []
|
|
421
|
+
sql_connectors = await self._discover_sql_connectors()
|
|
422
|
+
|
|
423
|
+
for connector_id in sql_connectors:
|
|
424
|
+
try:
|
|
425
|
+
deletion = await self._delete_from_sql(connector_id, user_identifier, verify=True)
|
|
426
|
+
external_deletions.append(deletion)
|
|
427
|
+
except Exception as e:
|
|
428
|
+
logger.error(f"Failed to delete from SQL connector {connector_id}: {e}")
|
|
429
|
+
external_deletions.append(
|
|
430
|
+
DataSourceDeletion(
|
|
431
|
+
source_id=connector_id,
|
|
432
|
+
source_type="sql",
|
|
433
|
+
source_name=connector_id,
|
|
434
|
+
success=False,
|
|
435
|
+
deletion_timestamp=self._now().isoformat(),
|
|
436
|
+
errors=[str(e)],
|
|
437
|
+
)
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
# Step 4: Calculate aggregated status
|
|
441
|
+
sources_completed = sum(1 for d in external_deletions if d.success and d.verification_passed)
|
|
442
|
+
sources_failed = sum(1 for d in external_deletions if not d.success)
|
|
443
|
+
total_records_deleted = sum(d.total_records_deleted for d in external_deletions)
|
|
444
|
+
all_verified = all(d.verification_passed for d in external_deletions if d.success)
|
|
445
|
+
|
|
446
|
+
# Step 5: Calculate processing time
|
|
447
|
+
processing_time = time.time() - start_time
|
|
448
|
+
|
|
449
|
+
# Step 6: Update metrics
|
|
450
|
+
self._multi_source_requests += 1
|
|
451
|
+
self._total_sources_queried += 1 + len(external_deletions)
|
|
452
|
+
self._total_processing_time += processing_time
|
|
453
|
+
|
|
454
|
+
# Step 7: Build deletion result
|
|
455
|
+
result = MultiSourceDSARDeletionResult(
|
|
456
|
+
request_id=request_id,
|
|
457
|
+
user_identifier=user_identifier,
|
|
458
|
+
ciris_deletion=ciris_deletion,
|
|
459
|
+
external_deletions=external_deletions,
|
|
460
|
+
identity_node=identity_node,
|
|
461
|
+
total_sources=1 + len(external_deletions),
|
|
462
|
+
sources_completed=sources_completed,
|
|
463
|
+
sources_failed=sources_failed,
|
|
464
|
+
total_records_deleted=total_records_deleted,
|
|
465
|
+
all_verified=all_verified,
|
|
466
|
+
initiated_at=self._now().isoformat(),
|
|
467
|
+
completed_at=self._now().isoformat() if sources_failed == 0 else None,
|
|
468
|
+
processing_time_seconds=processing_time,
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
logger.info(
|
|
472
|
+
f"Completed multi-source deletion {request_id}: "
|
|
473
|
+
f"{sources_completed}/{result.total_sources} completed, "
|
|
474
|
+
f"{total_records_deleted} records deleted, {processing_time:.2f}s"
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
return result
|
|
478
|
+
|
|
479
|
+
async def handle_correction_request_multi_source(
|
|
480
|
+
self, user_identifier: str, corrections: Dict[str, Any], request_id: Optional[str] = None
|
|
481
|
+
) -> MultiSourceDSARCorrectionResult:
|
|
482
|
+
"""Handle GDPR Article 16 correction request across all data sources.
|
|
483
|
+
|
|
484
|
+
Applies corrections to user data in all connected systems.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
user_identifier: User identifier
|
|
488
|
+
corrections: Dict of field → new_value corrections
|
|
489
|
+
request_id: Optional request ID for tracking
|
|
490
|
+
|
|
491
|
+
Returns:
|
|
492
|
+
Aggregated correction result from all sources
|
|
493
|
+
|
|
494
|
+
Implementation:
|
|
495
|
+
- Resolves user identity
|
|
496
|
+
- Applies corrections to CIRIS data
|
|
497
|
+
- Applies corrections to all SQL sources
|
|
498
|
+
- Tracks applied/rejected corrections per source
|
|
499
|
+
"""
|
|
500
|
+
import time
|
|
501
|
+
|
|
502
|
+
from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
|
|
503
|
+
|
|
504
|
+
# Start timer
|
|
505
|
+
start_time = time.time()
|
|
506
|
+
|
|
507
|
+
# Generate request ID if not provided
|
|
508
|
+
if not request_id:
|
|
509
|
+
request_id = f"DSAR-CORRECT-{self._now().strftime('%Y%m%d-%H%M%S')}"
|
|
510
|
+
|
|
511
|
+
logger.info(f"Starting multi-source correction request {request_id} for {user_identifier}")
|
|
512
|
+
|
|
513
|
+
# Step 1: Resolve user identity
|
|
514
|
+
identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
|
|
515
|
+
|
|
516
|
+
# Step 2: Apply CIRIS corrections
|
|
517
|
+
corrections_by_source: Dict[str, Dict[str, Any]] = {}
|
|
518
|
+
total_corrections_applied = 0
|
|
519
|
+
total_corrections_rejected = 0
|
|
520
|
+
|
|
521
|
+
try:
|
|
522
|
+
# Apply corrections to CIRIS via DSARAutomationService
|
|
523
|
+
from ciris_engine.schemas.consent.core import DSARCorrectionRequest
|
|
524
|
+
|
|
525
|
+
# Build correction requests for each field
|
|
526
|
+
for field_name, new_value in corrections.items():
|
|
527
|
+
correction_req = DSARCorrectionRequest(
|
|
528
|
+
user_id=user_identifier,
|
|
529
|
+
field_name=field_name,
|
|
530
|
+
current_value=None, # Could query current value first
|
|
531
|
+
new_value=str(new_value),
|
|
532
|
+
reason="Multi-source DSAR correction request",
|
|
533
|
+
)
|
|
534
|
+
ciris_result = await self._dsar_automation.handle_correction_request(correction_req, request_id)
|
|
535
|
+
|
|
536
|
+
# Track CIRIS corrections
|
|
537
|
+
corrections_by_source["ciris"] = corrections
|
|
538
|
+
total_corrections_applied += len(corrections)
|
|
539
|
+
logger.info(f"Applied {len(corrections)} corrections to CIRIS for {user_identifier}")
|
|
540
|
+
except Exception as e:
|
|
541
|
+
logger.exception(f"Failed to apply CIRIS corrections for {user_identifier}: {e}")
|
|
542
|
+
corrections_by_source["ciris"] = {}
|
|
543
|
+
total_corrections_rejected += len(corrections)
|
|
544
|
+
|
|
545
|
+
# Step 3: Apply corrections to SQL sources
|
|
546
|
+
# Note: This requires UPDATE statement support via SQL connectors
|
|
547
|
+
# For now, we'll log that SQL corrections are not yet implemented
|
|
548
|
+
sql_connectors = await self._discover_sql_connectors()
|
|
549
|
+
for connector_id in sql_connectors:
|
|
550
|
+
try:
|
|
551
|
+
# TODO Phase 2: Implement SQL UPDATE via tool_bus
|
|
552
|
+
# Implementation:
|
|
553
|
+
# 1. Create sql_update_user tool that accepts corrections dict
|
|
554
|
+
# 2. Call await tool_bus.execute_tool("sql_update_user", {
|
|
555
|
+
# "connector_id": connector_id,
|
|
556
|
+
# "user_identifier": user_identifier,
|
|
557
|
+
# "corrections": corrections
|
|
558
|
+
# })
|
|
559
|
+
# 3. Parse result to determine which corrections were applied/rejected
|
|
560
|
+
# 4. Update corrections_by_source and counters accordingly
|
|
561
|
+
# For now, mark as rejected
|
|
562
|
+
corrections_by_source[connector_id] = {}
|
|
563
|
+
total_corrections_rejected += len(corrections)
|
|
564
|
+
logger.warning(f"SQL corrections not yet implemented for {connector_id}")
|
|
565
|
+
except Exception as e:
|
|
566
|
+
logger.error(f"Failed to apply corrections to SQL connector {connector_id}: {e}")
|
|
567
|
+
corrections_by_source[connector_id] = {}
|
|
568
|
+
total_corrections_rejected += len(corrections)
|
|
569
|
+
|
|
570
|
+
# Step 4: Calculate processing time
|
|
571
|
+
processing_time = time.time() - start_time
|
|
572
|
+
|
|
573
|
+
# Step 5: Update metrics
|
|
574
|
+
self._multi_source_requests += 1
|
|
575
|
+
self._total_sources_queried += 1 + len(sql_connectors)
|
|
576
|
+
self._total_processing_time += processing_time
|
|
577
|
+
|
|
578
|
+
# Step 6: Build correction result
|
|
579
|
+
result = MultiSourceDSARCorrectionResult(
|
|
580
|
+
request_id=request_id,
|
|
581
|
+
user_identifier=user_identifier,
|
|
582
|
+
corrections_by_source=corrections_by_source,
|
|
583
|
+
identity_node=identity_node,
|
|
584
|
+
total_sources=1 + len(sql_connectors),
|
|
585
|
+
total_corrections_applied=total_corrections_applied,
|
|
586
|
+
total_corrections_rejected=total_corrections_rejected,
|
|
587
|
+
generated_at=self._now().isoformat(),
|
|
588
|
+
processing_time_seconds=processing_time,
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
logger.info(
|
|
592
|
+
f"Completed multi-source correction {request_id}: "
|
|
593
|
+
f"{total_corrections_applied} applied, {total_corrections_rejected} rejected, {processing_time:.2f}s"
|
|
594
|
+
)
|
|
595
|
+
|
|
596
|
+
return result
|
|
597
|
+
|
|
598
|
+
async def get_deletion_status_multi_source(
|
|
599
|
+
self, user_identifier: str, request_id: str
|
|
600
|
+
) -> MultiSourceDSARDeletionResult:
|
|
601
|
+
"""Get deletion status across all sources.
|
|
602
|
+
|
|
603
|
+
Checks deletion progress for:
|
|
604
|
+
- CIRIS (90-day decay progress)
|
|
605
|
+
- SQL databases (immediate, verification status)
|
|
606
|
+
- REST APIs (job status)
|
|
607
|
+
- HL7 systems (future)
|
|
608
|
+
|
|
609
|
+
Args:
|
|
610
|
+
user_identifier: User identifier
|
|
611
|
+
request_id: Original deletion request ID
|
|
612
|
+
|
|
613
|
+
Returns:
|
|
614
|
+
Current deletion status across all sources
|
|
615
|
+
"""
|
|
616
|
+
import time
|
|
617
|
+
|
|
618
|
+
from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
|
|
619
|
+
|
|
620
|
+
# Start timer
|
|
621
|
+
start_time = time.time()
|
|
622
|
+
|
|
623
|
+
logger.info(f"Checking multi-source deletion status for {request_id} - {user_identifier}")
|
|
624
|
+
|
|
625
|
+
# Step 1: Resolve user identity
|
|
626
|
+
identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
|
|
627
|
+
|
|
628
|
+
# Step 2: Get CIRIS deletion status
|
|
629
|
+
try:
|
|
630
|
+
ciris_deletion = await self._dsar_automation.get_deletion_status(user_identifier, request_id)
|
|
631
|
+
except Exception as e:
|
|
632
|
+
logger.exception(f"Failed to get CIRIS deletion status for {user_identifier}: {e}")
|
|
633
|
+
ciris_deletion = None
|
|
634
|
+
|
|
635
|
+
# Create fallback if no status found
|
|
636
|
+
if ciris_deletion is None:
|
|
637
|
+
from ciris_engine.schemas.consent.core import DSARDeletionStatus
|
|
638
|
+
|
|
639
|
+
ciris_deletion = DSARDeletionStatus(
|
|
640
|
+
ticket_id=request_id,
|
|
641
|
+
user_id=user_identifier,
|
|
642
|
+
decay_started=self._now(),
|
|
643
|
+
current_phase="unknown",
|
|
644
|
+
completion_percentage=0.0,
|
|
645
|
+
estimated_completion=self._now() + timedelta(days=90),
|
|
646
|
+
milestones_completed=[],
|
|
647
|
+
next_milestone="unknown",
|
|
648
|
+
safety_patterns_retained=0,
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
# Step 3: Check SQL deletion verification for all connectors
|
|
652
|
+
external_deletions: List[DataSourceDeletion] = []
|
|
653
|
+
sql_connectors = await self._discover_sql_connectors()
|
|
654
|
+
|
|
655
|
+
for connector_id in sql_connectors:
|
|
656
|
+
try:
|
|
657
|
+
# Verify deletion for this connector
|
|
658
|
+
verification_passed = await self._verify_deletion_sql(connector_id, user_identifier)
|
|
659
|
+
|
|
660
|
+
# Create deletion status entry
|
|
661
|
+
external_deletions.append(
|
|
662
|
+
DataSourceDeletion(
|
|
663
|
+
source_id=connector_id,
|
|
664
|
+
source_type="sql",
|
|
665
|
+
source_name=connector_id,
|
|
666
|
+
success=verification_passed, # If verification passed, deletion was successful
|
|
667
|
+
total_records_deleted=0, # Unknown - already deleted
|
|
668
|
+
verification_passed=verification_passed,
|
|
669
|
+
deletion_timestamp=self._now().isoformat(),
|
|
670
|
+
errors=[] if verification_passed else ["Deletion verification failed - data still present"],
|
|
671
|
+
)
|
|
672
|
+
)
|
|
673
|
+
except Exception as e:
|
|
674
|
+
logger.error(f"Failed to verify deletion from SQL connector {connector_id}: {e}")
|
|
675
|
+
external_deletions.append(
|
|
676
|
+
DataSourceDeletion(
|
|
677
|
+
source_id=connector_id,
|
|
678
|
+
source_type="sql",
|
|
679
|
+
source_name=connector_id,
|
|
680
|
+
success=False,
|
|
681
|
+
verification_passed=False,
|
|
682
|
+
deletion_timestamp=self._now().isoformat(),
|
|
683
|
+
errors=[str(e)],
|
|
684
|
+
)
|
|
685
|
+
)
|
|
686
|
+
|
|
687
|
+
# Step 4: Calculate aggregated status
|
|
688
|
+
sources_completed = sum(1 for d in external_deletions if d.success and d.verification_passed)
|
|
689
|
+
sources_failed = sum(1 for d in external_deletions if not d.success)
|
|
690
|
+
total_records_deleted = sum(d.total_records_deleted for d in external_deletions)
|
|
691
|
+
all_verified = all(d.verification_passed for d in external_deletions if d.success)
|
|
692
|
+
|
|
693
|
+
# Step 5: Calculate processing time
|
|
694
|
+
processing_time = time.time() - start_time
|
|
695
|
+
|
|
696
|
+
# Step 6: Build deletion result
|
|
697
|
+
result = MultiSourceDSARDeletionResult(
|
|
698
|
+
request_id=request_id,
|
|
699
|
+
user_identifier=user_identifier,
|
|
700
|
+
ciris_deletion=ciris_deletion,
|
|
701
|
+
external_deletions=external_deletions,
|
|
702
|
+
identity_node=identity_node,
|
|
703
|
+
total_sources=1 + len(external_deletions),
|
|
704
|
+
sources_completed=sources_completed,
|
|
705
|
+
sources_failed=sources_failed,
|
|
706
|
+
total_records_deleted=total_records_deleted,
|
|
707
|
+
all_verified=all_verified,
|
|
708
|
+
initiated_at=(
|
|
709
|
+
ciris_deletion.decay_started.isoformat() if ciris_deletion.decay_started else self._now().isoformat()
|
|
710
|
+
),
|
|
711
|
+
completed_at=(
|
|
712
|
+
self._now().isoformat()
|
|
713
|
+
if sources_failed == 0 and ciris_deletion.completion_percentage >= 100.0
|
|
714
|
+
else None
|
|
715
|
+
),
|
|
716
|
+
processing_time_seconds=processing_time,
|
|
717
|
+
)
|
|
718
|
+
|
|
719
|
+
logger.info(
|
|
720
|
+
f"Deletion status check complete for {request_id}: "
|
|
721
|
+
f"{sources_completed}/{result.total_sources} verified, "
|
|
722
|
+
f"CIRIS at {ciris_deletion.completion_percentage:.1f}%"
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
return result
|
|
726
|
+
|
|
727
|
+
async def _discover_sql_connectors(self) -> List[str]:
|
|
728
|
+
"""Discover all registered SQL connectors via ToolBus.
|
|
729
|
+
|
|
730
|
+
Returns:
|
|
731
|
+
List of SQL connector IDs
|
|
732
|
+
"""
|
|
733
|
+
try:
|
|
734
|
+
# Get SQL data sources using metadata
|
|
735
|
+
sql_services = self._tool_bus.get_tools_by_metadata({"data_source": True, "data_source_type": "sql"})
|
|
736
|
+
|
|
737
|
+
# Extract connector IDs from metadata
|
|
738
|
+
connector_ids = []
|
|
739
|
+
for service in sql_services:
|
|
740
|
+
try:
|
|
741
|
+
metadata = service.get_service_metadata()
|
|
742
|
+
connector_id = metadata.get("connector_id") or metadata.get("service_name")
|
|
743
|
+
if connector_id:
|
|
744
|
+
connector_ids.append(connector_id)
|
|
745
|
+
except Exception as e:
|
|
746
|
+
logger.warning(f"Failed to get metadata from SQL service: {e}")
|
|
747
|
+
continue
|
|
748
|
+
|
|
749
|
+
logger.info(f"Discovered {len(connector_ids)} SQL connectors: {connector_ids}")
|
|
750
|
+
return connector_ids
|
|
751
|
+
|
|
752
|
+
except Exception as e:
|
|
753
|
+
logger.error(f"Failed to discover SQL connectors: {e}")
|
|
754
|
+
return []
|
|
755
|
+
|
|
756
|
+
async def _discover_rest_connectors(self) -> List[str]:
|
|
757
|
+
"""Discover all registered REST connectors via ToolBus.
|
|
758
|
+
|
|
759
|
+
Returns:
|
|
760
|
+
List of REST connector IDs
|
|
761
|
+
|
|
762
|
+
TODO Phase 2: Implement REST connector discovery
|
|
763
|
+
Implementation:
|
|
764
|
+
1. Query tool_bus for tools with metadata:
|
|
765
|
+
- data_source=True, data_source_type="rest"
|
|
766
|
+
2. Extract connector_id from each service's metadata
|
|
767
|
+
3. Return list of connector IDs
|
|
768
|
+
4. Similar pattern to _discover_sql_connectors()
|
|
769
|
+
"""
|
|
770
|
+
# TODO: Implement REST connector discovery
|
|
771
|
+
raise NotImplementedError("REST connector discovery not yet implemented")
|
|
772
|
+
|
|
773
|
+
async def _discover_hl7_connectors(self) -> List[str]:
|
|
774
|
+
"""Discover all registered HL7 connectors via ToolBus.
|
|
775
|
+
|
|
776
|
+
Returns:
|
|
777
|
+
List of HL7 connector IDs
|
|
778
|
+
|
|
779
|
+
TODO Phase 2+: Implement HL7 connector discovery
|
|
780
|
+
Implementation:
|
|
781
|
+
1. Query tool_bus for tools with metadata:
|
|
782
|
+
- data_source=True, data_source_type="hl7"
|
|
783
|
+
2. Extract connector_id from each service's metadata
|
|
784
|
+
3. Return list of connector IDs
|
|
785
|
+
4. Similar pattern to _discover_sql_connectors()
|
|
786
|
+
|
|
787
|
+
Note: HL7 is a future feature and lower priority than REST
|
|
788
|
+
"""
|
|
789
|
+
# TODO: Implement HL7 connector discovery
|
|
790
|
+
raise NotImplementedError("HL7 connector discovery not yet implemented")
|
|
791
|
+
|
|
792
|
+
async def _export_from_sql(self, connector_id: str, user_identifier: str) -> DataSourceExport:
|
|
793
|
+
"""Export user data from SQL connector.
|
|
794
|
+
|
|
795
|
+
Args:
|
|
796
|
+
connector_id: SQL connector ID
|
|
797
|
+
user_identifier: User identifier
|
|
798
|
+
|
|
799
|
+
Returns:
|
|
800
|
+
Data source export result
|
|
801
|
+
"""
|
|
802
|
+
import hashlib
|
|
803
|
+
import json
|
|
804
|
+
|
|
805
|
+
try:
|
|
806
|
+
# Call SQL export tool via ToolBus
|
|
807
|
+
# SQL tools are registered with fixed names (sql_export_user, not connector_id prefix)
|
|
808
|
+
tool_name = "sql_export_user"
|
|
809
|
+
exec_result = await self._tool_bus.execute_tool(
|
|
810
|
+
tool_name=tool_name,
|
|
811
|
+
parameters={
|
|
812
|
+
"connector_id": connector_id,
|
|
813
|
+
"user_identifier": user_identifier,
|
|
814
|
+
"identifier_type": "email", # Default to email for DSAR requests
|
|
815
|
+
},
|
|
816
|
+
handler_name="default",
|
|
817
|
+
)
|
|
818
|
+
|
|
819
|
+
# Parse export result from ToolExecutionResult
|
|
820
|
+
if exec_result.data and isinstance(exec_result.data, dict):
|
|
821
|
+
data = exec_result.data.get("data", {})
|
|
822
|
+
tables = exec_result.data.get("tables_scanned", [])
|
|
823
|
+
total_records = exec_result.data.get("total_records", 0)
|
|
824
|
+
else:
|
|
825
|
+
# Fallback: treat result as data
|
|
826
|
+
data = {"export": str(exec_result.data) if exec_result.data else ""}
|
|
827
|
+
tables = []
|
|
828
|
+
total_records = 0
|
|
829
|
+
|
|
830
|
+
# Calculate checksum
|
|
831
|
+
data_json = json.dumps(data, sort_keys=True)
|
|
832
|
+
checksum = hashlib.sha256(data_json.encode("utf-8")).hexdigest()
|
|
833
|
+
|
|
834
|
+
return DataSourceExport(
|
|
835
|
+
source_id=connector_id,
|
|
836
|
+
source_type="sql",
|
|
837
|
+
source_name=connector_id,
|
|
838
|
+
tables_or_endpoints=tables,
|
|
839
|
+
total_records=total_records,
|
|
840
|
+
data=data,
|
|
841
|
+
checksum=checksum,
|
|
842
|
+
export_timestamp=self._now().isoformat(),
|
|
843
|
+
errors=[],
|
|
844
|
+
)
|
|
845
|
+
|
|
846
|
+
except Exception as e:
|
|
847
|
+
logger.exception(f"Failed to export from SQL connector {connector_id}: {e}")
|
|
848
|
+
return DataSourceExport(
|
|
849
|
+
source_id=connector_id,
|
|
850
|
+
source_type="sql",
|
|
851
|
+
source_name=connector_id,
|
|
852
|
+
export_timestamp=self._now().isoformat(),
|
|
853
|
+
errors=[str(e)],
|
|
854
|
+
)
|
|
855
|
+
|
|
856
|
+
async def _delete_from_sql(
|
|
857
|
+
self, connector_id: str, user_identifier: str, verify: bool = True
|
|
858
|
+
) -> DataSourceDeletion:
|
|
859
|
+
"""Delete user data from SQL connector.
|
|
860
|
+
|
|
861
|
+
Args:
|
|
862
|
+
connector_id: SQL connector ID
|
|
863
|
+
user_identifier: User identifier
|
|
864
|
+
verify: Whether to verify deletion
|
|
865
|
+
|
|
866
|
+
Returns:
|
|
867
|
+
Data source deletion result
|
|
868
|
+
"""
|
|
869
|
+
try:
|
|
870
|
+
# Call SQL delete tool via ToolBus
|
|
871
|
+
# SQL tools are registered with fixed names (sql_delete_user, not connector_id prefix)
|
|
872
|
+
tool_name = "sql_delete_user"
|
|
873
|
+
exec_result = await self._tool_bus.execute_tool(
|
|
874
|
+
tool_name=tool_name,
|
|
875
|
+
parameters={
|
|
876
|
+
"connector_id": connector_id,
|
|
877
|
+
"user_identifier": user_identifier,
|
|
878
|
+
"identifier_type": "email", # Default to email for DSAR requests
|
|
879
|
+
"verify": verify,
|
|
880
|
+
},
|
|
881
|
+
handler_name="default",
|
|
882
|
+
)
|
|
883
|
+
|
|
884
|
+
# Parse deletion result from ToolExecutionResult
|
|
885
|
+
if exec_result.data and isinstance(exec_result.data, dict):
|
|
886
|
+
success = exec_result.data.get("success", False)
|
|
887
|
+
tables_affected = exec_result.data.get("tables_affected", [])
|
|
888
|
+
total_records_deleted = exec_result.data.get("total_records_deleted", 0)
|
|
889
|
+
else:
|
|
890
|
+
# Fallback: assume success if no error
|
|
891
|
+
success = exec_result.success
|
|
892
|
+
tables_affected = []
|
|
893
|
+
total_records_deleted = 0
|
|
894
|
+
|
|
895
|
+
# Verify deletion if requested
|
|
896
|
+
verification_passed = False
|
|
897
|
+
if verify and success:
|
|
898
|
+
verification_passed = await self._verify_deletion_sql(connector_id, user_identifier)
|
|
899
|
+
|
|
900
|
+
return DataSourceDeletion(
|
|
901
|
+
source_id=connector_id,
|
|
902
|
+
source_type="sql",
|
|
903
|
+
source_name=connector_id,
|
|
904
|
+
success=success,
|
|
905
|
+
tables_affected=tables_affected,
|
|
906
|
+
total_records_deleted=total_records_deleted,
|
|
907
|
+
verification_passed=verification_passed,
|
|
908
|
+
deletion_timestamp=self._now().isoformat(),
|
|
909
|
+
errors=[],
|
|
910
|
+
)
|
|
911
|
+
|
|
912
|
+
except Exception as e:
|
|
913
|
+
logger.exception(f"Failed to delete from SQL connector {connector_id}: {e}")
|
|
914
|
+
return DataSourceDeletion(
|
|
915
|
+
source_id=connector_id,
|
|
916
|
+
source_type="sql",
|
|
917
|
+
source_name=connector_id,
|
|
918
|
+
success=False,
|
|
919
|
+
deletion_timestamp=self._now().isoformat(),
|
|
920
|
+
errors=[str(e)],
|
|
921
|
+
)
|
|
922
|
+
|
|
923
|
+
async def _verify_deletion_sql(self, connector_id: str, user_identifier: str) -> bool:
|
|
924
|
+
"""Verify user data deletion from SQL connector.
|
|
925
|
+
|
|
926
|
+
Args:
|
|
927
|
+
connector_id: SQL connector ID
|
|
928
|
+
user_identifier: User identifier
|
|
929
|
+
|
|
930
|
+
Returns:
|
|
931
|
+
True if zero data confirmed, False otherwise
|
|
932
|
+
"""
|
|
933
|
+
try:
|
|
934
|
+
# Call SQL verify_deletion tool via ToolBus
|
|
935
|
+
# SQL tools are registered with fixed names (sql_verify_deletion, not connector_id prefix)
|
|
936
|
+
tool_name = "sql_verify_deletion"
|
|
937
|
+
exec_result = await self._tool_bus.execute_tool(
|
|
938
|
+
tool_name=tool_name,
|
|
939
|
+
parameters={
|
|
940
|
+
"connector_id": connector_id,
|
|
941
|
+
"user_identifier": user_identifier,
|
|
942
|
+
"identifier_type": "email", # Default to email for DSAR requests
|
|
943
|
+
},
|
|
944
|
+
handler_name="default",
|
|
945
|
+
)
|
|
946
|
+
|
|
947
|
+
# Parse verification result from ToolExecutionResult
|
|
948
|
+
if exec_result.data and isinstance(exec_result.data, dict):
|
|
949
|
+
zero_data_confirmed = bool(exec_result.data.get("zero_data_confirmed", False))
|
|
950
|
+
return zero_data_confirmed
|
|
951
|
+
elif isinstance(exec_result.data, bool):
|
|
952
|
+
return exec_result.data
|
|
953
|
+
else:
|
|
954
|
+
# Fallback: assume not verified if unexpected result
|
|
955
|
+
logger.warning(f"Unexpected verification result from {connector_id}: {exec_result.data}")
|
|
956
|
+
return False
|
|
957
|
+
|
|
958
|
+
except Exception as e:
|
|
959
|
+
logger.exception(f"Failed to verify deletion from SQL connector {connector_id}: {e}")
|
|
960
|
+
return False
|
|
961
|
+
|
|
962
|
+
def get_metrics(self) -> Dict[str, Any]:
|
|
963
|
+
"""Get orchestrator metrics.
|
|
964
|
+
|
|
965
|
+
Returns:
|
|
966
|
+
Dict with metrics:
|
|
967
|
+
- multi_source_requests: Total multi-source requests
|
|
968
|
+
- total_sources_queried: Total sources queried
|
|
969
|
+
- avg_processing_time: Average processing time
|
|
970
|
+
"""
|
|
971
|
+
avg_time = self._total_processing_time / self._multi_source_requests if self._multi_source_requests > 0 else 0.0
|
|
972
|
+
|
|
973
|
+
return {
|
|
974
|
+
"multi_source_requests": self._multi_source_requests,
|
|
975
|
+
"total_sources_queried": self._total_sources_queried,
|
|
976
|
+
"avg_processing_time_seconds": avg_time,
|
|
977
|
+
}
|