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,812 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Query management for TSDB consolidation.
|
|
3
|
+
|
|
4
|
+
Handles querying both graph nodes and service correlations for consolidation periods.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import sqlite3
|
|
10
|
+
from collections import defaultdict
|
|
11
|
+
from datetime import datetime, timezone
|
|
12
|
+
from typing import Any, Dict, List, Optional, Set, TypedDict, Union
|
|
13
|
+
|
|
14
|
+
from ciris_engine.constants import UTC_TIMEZONE_SUFFIX
|
|
15
|
+
from ciris_engine.logic.buses.memory_bus import MemoryBus
|
|
16
|
+
from ciris_engine.logic.persistence.db.core import PostgreSQLConnectionWrapper, RetryConnection, get_db_connection
|
|
17
|
+
from ciris_engine.logic.services.graph.tsdb_consolidation.data_converter import TSDBDataConverter
|
|
18
|
+
from ciris_engine.schemas.services.graph.consolidation import (
|
|
19
|
+
MetricCorrelationData,
|
|
20
|
+
ServiceInteractionData,
|
|
21
|
+
TaskCorrelationData,
|
|
22
|
+
TraceSpanData,
|
|
23
|
+
)
|
|
24
|
+
from ciris_engine.schemas.services.graph.query_results import ServiceCorrelationQueryResult, TSDBNodeQueryResult
|
|
25
|
+
from ciris_engine.schemas.services.graph_core import GraphNode, GraphScope, NodeType
|
|
26
|
+
from ciris_engine.schemas.services.operations import MemoryQuery
|
|
27
|
+
from ciris_engine.schemas.types import JSONDict
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
# Type alias for database connections (both SQLite and PostgreSQL wrappers)
|
|
32
|
+
DBConnection = Union[sqlite3.Connection, RetryConnection, PostgreSQLConnectionWrapper]
|
|
33
|
+
|
|
34
|
+
# SQL constants for consolidation_locks table
|
|
35
|
+
_CREATE_LOCKS_TABLE_SQL = """
|
|
36
|
+
CREATE TABLE IF NOT EXISTS consolidation_locks (
|
|
37
|
+
lock_key TEXT PRIMARY KEY,
|
|
38
|
+
locked_by TEXT,
|
|
39
|
+
locked_at TEXT,
|
|
40
|
+
lock_timeout_seconds INTEGER DEFAULT 300
|
|
41
|
+
)
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
_CREATE_LOCKS_INDEX_SQL = """
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_consolidation_locks_expiry
|
|
46
|
+
ON consolidation_locks(locked_at)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ThoughtQueryResult(TypedDict):
|
|
51
|
+
"""Type for thought query results."""
|
|
52
|
+
|
|
53
|
+
thought_id: str
|
|
54
|
+
thought_type: str
|
|
55
|
+
status: str
|
|
56
|
+
created_at: str
|
|
57
|
+
final_action: Optional[JSONDict]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class QueryManager:
|
|
61
|
+
"""Manages querying data for consolidation."""
|
|
62
|
+
|
|
63
|
+
def __init__(self, memory_bus: Optional[MemoryBus] = None, db_path: Optional[str] = None):
|
|
64
|
+
"""
|
|
65
|
+
Initialize query manager.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
memory_bus: Memory bus for graph operations
|
|
69
|
+
db_path: Database path to use (if not provided, uses default)
|
|
70
|
+
"""
|
|
71
|
+
self._memory_bus = memory_bus
|
|
72
|
+
self._db_path = db_path
|
|
73
|
+
# Hostname for identifying this instance in locks
|
|
74
|
+
import socket
|
|
75
|
+
|
|
76
|
+
self._instance_id = socket.gethostname()
|
|
77
|
+
|
|
78
|
+
# Ensure consolidation_locks table exists
|
|
79
|
+
self._ensure_locks_table_exists()
|
|
80
|
+
|
|
81
|
+
def _ensure_locks_table_exists(self) -> None:
|
|
82
|
+
"""
|
|
83
|
+
Ensure the consolidation_locks table exists.
|
|
84
|
+
|
|
85
|
+
Creates the table and index if they don't already exist (safe for repeated calls).
|
|
86
|
+
This is necessary for tests and fresh databases that haven't run migrations yet.
|
|
87
|
+
"""
|
|
88
|
+
from ciris_engine.logic.persistence.db.core import get_db_connection
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
92
|
+
cursor = conn.cursor()
|
|
93
|
+
|
|
94
|
+
# Create table (idempotent - safe to call multiple times)
|
|
95
|
+
cursor.execute(_CREATE_LOCKS_TABLE_SQL)
|
|
96
|
+
|
|
97
|
+
# Create index (idempotent)
|
|
98
|
+
cursor.execute(_CREATE_LOCKS_INDEX_SQL)
|
|
99
|
+
|
|
100
|
+
conn.commit()
|
|
101
|
+
except Exception as e:
|
|
102
|
+
# Log warning but don't fail - table might already exist in multi-instance scenario
|
|
103
|
+
logger.warning(f"Error ensuring consolidation_locks table exists: {e}")
|
|
104
|
+
|
|
105
|
+
def _query_thoughts_for_tasks(
|
|
106
|
+
self, cursor: Any, adapter: Any, task_ids: List[str]
|
|
107
|
+
) -> Dict[str, List[ThoughtQueryResult]]:
|
|
108
|
+
"""Query thoughts for a list of task IDs.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
cursor: Database cursor
|
|
112
|
+
adapter: Database adapter for placeholders
|
|
113
|
+
task_ids: List of task IDs to query
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Dict mapping task_id to list of thought query results
|
|
117
|
+
"""
|
|
118
|
+
placeholders = ",".join([adapter.placeholder()] * len(task_ids))
|
|
119
|
+
cursor.execute(
|
|
120
|
+
f"""
|
|
121
|
+
SELECT source_task_id, thought_id, thought_type, status,
|
|
122
|
+
created_at, final_action_json
|
|
123
|
+
FROM thoughts
|
|
124
|
+
WHERE source_task_id IN ({placeholders})
|
|
125
|
+
ORDER BY created_at
|
|
126
|
+
""",
|
|
127
|
+
task_ids,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
thoughts_by_task = defaultdict(list)
|
|
131
|
+
for row in cursor.fetchall():
|
|
132
|
+
# Handle PostgreSQL datetime vs SQLite string
|
|
133
|
+
created_at = row["created_at"]
|
|
134
|
+
if isinstance(created_at, datetime):
|
|
135
|
+
created_at = created_at.isoformat()
|
|
136
|
+
|
|
137
|
+
thoughts_by_task[row["source_task_id"]].append(
|
|
138
|
+
{
|
|
139
|
+
"thought_id": row["thought_id"],
|
|
140
|
+
"thought_type": row["thought_type"],
|
|
141
|
+
"status": row["status"],
|
|
142
|
+
"created_at": created_at,
|
|
143
|
+
"final_action": row["final_action_json"],
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return dict(thoughts_by_task)
|
|
148
|
+
|
|
149
|
+
def query_all_nodes_in_period(self, period_start: datetime, period_end: datetime) -> Dict[str, TSDBNodeQueryResult]:
|
|
150
|
+
"""
|
|
151
|
+
Query ALL graph nodes created or updated within a period.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
period_start: Period start time
|
|
155
|
+
period_end: Period end time
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Dictionary mapping node types to TSDBNodeQueryResult objects
|
|
159
|
+
"""
|
|
160
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
161
|
+
from ciris_engine.logic.services.graph.tsdb_consolidation.sql_builders import (
|
|
162
|
+
build_nodes_in_period_query,
|
|
163
|
+
parse_graph_node_row,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
nodes_by_type = defaultdict(list)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
adapter = get_adapter()
|
|
170
|
+
|
|
171
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
172
|
+
cursor = conn.cursor()
|
|
173
|
+
|
|
174
|
+
# Build and execute query using helper
|
|
175
|
+
sql, params = build_nodes_in_period_query(adapter, period_start.isoformat(), period_end.isoformat())
|
|
176
|
+
cursor.execute(sql, params)
|
|
177
|
+
|
|
178
|
+
# Parse rows using helper
|
|
179
|
+
for row in cursor.fetchall():
|
|
180
|
+
node = parse_graph_node_row(row)
|
|
181
|
+
node_type_str = row["node_type"]
|
|
182
|
+
nodes_by_type[node_type_str].append(node)
|
|
183
|
+
|
|
184
|
+
logger.info(
|
|
185
|
+
f"Found {sum(len(nodes) for nodes in nodes_by_type.values())} nodes across {len(nodes_by_type)} types for period {period_start}"
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
except Exception as e:
|
|
189
|
+
logger.error(f"Failed to query nodes for period: {e}")
|
|
190
|
+
|
|
191
|
+
# Convert to TSDBNodeQueryResult for each node type
|
|
192
|
+
result: Dict[str, TSDBNodeQueryResult] = {}
|
|
193
|
+
for node_type, nodes in nodes_by_type.items():
|
|
194
|
+
result[node_type] = TSDBNodeQueryResult(nodes=nodes, period_start=period_start, period_end=period_end)
|
|
195
|
+
|
|
196
|
+
return result
|
|
197
|
+
|
|
198
|
+
def query_tsdb_data_nodes(self, period_start: datetime, period_end: datetime) -> TSDBNodeQueryResult:
|
|
199
|
+
"""
|
|
200
|
+
Query TSDB_DATA nodes specifically for a period.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
period_start: Period start time
|
|
204
|
+
period_end: Period end time
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
TSDBNodeQueryResult containing TSDB_DATA nodes
|
|
208
|
+
"""
|
|
209
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
210
|
+
from ciris_engine.logic.services.graph.tsdb_consolidation.sql_builders import (
|
|
211
|
+
build_tsdb_data_query,
|
|
212
|
+
parse_graph_node_row,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
nodes = []
|
|
216
|
+
|
|
217
|
+
try:
|
|
218
|
+
adapter = get_adapter()
|
|
219
|
+
|
|
220
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
221
|
+
cursor = conn.cursor()
|
|
222
|
+
|
|
223
|
+
# Build and execute query using helper
|
|
224
|
+
sql, params = build_tsdb_data_query(adapter, period_start.isoformat(), period_end.isoformat())
|
|
225
|
+
cursor.execute(sql, params)
|
|
226
|
+
|
|
227
|
+
# Parse rows using helper
|
|
228
|
+
for row in cursor.fetchall():
|
|
229
|
+
node = parse_graph_node_row(row, node_type=NodeType.TSDB_DATA)
|
|
230
|
+
nodes.append(node)
|
|
231
|
+
|
|
232
|
+
logger.info(f"Found {len(nodes)} TSDB_DATA nodes for period {period_start}")
|
|
233
|
+
|
|
234
|
+
except Exception as e:
|
|
235
|
+
logger.error(f"Failed to query TSDB data nodes: {e}")
|
|
236
|
+
|
|
237
|
+
return TSDBNodeQueryResult(nodes=nodes, period_start=period_start, period_end=period_end)
|
|
238
|
+
|
|
239
|
+
def query_service_correlations(
|
|
240
|
+
self, period_start: datetime, period_end: datetime, correlation_types: Optional[List[str]] = None
|
|
241
|
+
) -> ServiceCorrelationQueryResult:
|
|
242
|
+
"""
|
|
243
|
+
Query service correlations for a period.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
period_start: Period start time
|
|
247
|
+
period_end: Period end time
|
|
248
|
+
correlation_types: Optional list of correlation types to filter
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
ServiceCorrelationQueryResult with typed correlation data
|
|
252
|
+
"""
|
|
253
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
254
|
+
from ciris_engine.logic.services.graph.tsdb_consolidation.sql_builders import (
|
|
255
|
+
build_service_correlations_query,
|
|
256
|
+
parse_correlation_row,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
service_interactions: List[ServiceInteractionData] = []
|
|
260
|
+
metric_correlations: List[MetricCorrelationData] = []
|
|
261
|
+
trace_spans: List[TraceSpanData] = []
|
|
262
|
+
task_correlations: List[TaskCorrelationData] = []
|
|
263
|
+
|
|
264
|
+
try:
|
|
265
|
+
adapter = get_adapter()
|
|
266
|
+
|
|
267
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
268
|
+
cursor = conn.cursor()
|
|
269
|
+
|
|
270
|
+
# Build and execute query using helper
|
|
271
|
+
query, params = build_service_correlations_query(
|
|
272
|
+
adapter, period_start.isoformat(), period_end.isoformat(), correlation_types
|
|
273
|
+
)
|
|
274
|
+
cursor.execute(query, params)
|
|
275
|
+
|
|
276
|
+
# Parse rows using helper
|
|
277
|
+
for row in cursor.fetchall():
|
|
278
|
+
raw_correlation = parse_correlation_row(row)
|
|
279
|
+
correlation_type = row["correlation_type"]
|
|
280
|
+
|
|
281
|
+
# Convert to typed models based on correlation type
|
|
282
|
+
if correlation_type == "service_interaction":
|
|
283
|
+
converted_interaction = TSDBDataConverter.convert_service_interaction(raw_correlation)
|
|
284
|
+
if converted_interaction:
|
|
285
|
+
service_interactions.append(converted_interaction)
|
|
286
|
+
elif correlation_type == "metric_datapoint":
|
|
287
|
+
converted_metric = TSDBDataConverter.convert_metric_correlation(raw_correlation)
|
|
288
|
+
if converted_metric:
|
|
289
|
+
metric_correlations.append(converted_metric)
|
|
290
|
+
elif correlation_type == "trace_span":
|
|
291
|
+
converted_trace = TSDBDataConverter.convert_trace_span(raw_correlation)
|
|
292
|
+
if converted_trace:
|
|
293
|
+
trace_spans.append(converted_trace)
|
|
294
|
+
|
|
295
|
+
total = len(service_interactions) + len(metric_correlations) + len(trace_spans) + len(task_correlations)
|
|
296
|
+
logger.info(f"Found {total} correlations for period {period_start}")
|
|
297
|
+
|
|
298
|
+
except Exception as e:
|
|
299
|
+
logger.error(f"Failed to query service correlations: {e}")
|
|
300
|
+
import traceback
|
|
301
|
+
|
|
302
|
+
traceback.print_exc()
|
|
303
|
+
|
|
304
|
+
return ServiceCorrelationQueryResult(
|
|
305
|
+
service_interactions=service_interactions,
|
|
306
|
+
metric_correlations=metric_correlations,
|
|
307
|
+
trace_spans=trace_spans,
|
|
308
|
+
task_correlations=task_correlations,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
def query_tasks_in_period(self, period_start: datetime, period_end: datetime) -> List[TaskCorrelationData]:
|
|
312
|
+
"""
|
|
313
|
+
Query tasks completed or updated in a period.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
period_start: Period start time
|
|
317
|
+
period_end: Period end time
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
List of TaskCorrelationData objects
|
|
321
|
+
"""
|
|
322
|
+
task_correlations = []
|
|
323
|
+
|
|
324
|
+
try:
|
|
325
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
326
|
+
|
|
327
|
+
adapter = get_adapter()
|
|
328
|
+
|
|
329
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
330
|
+
cursor = conn.cursor()
|
|
331
|
+
|
|
332
|
+
# Query tasks (excluding deferred ones)
|
|
333
|
+
# PostgreSQL: TIMESTAMP column, compare directly
|
|
334
|
+
# SQLite: TEXT column, use datetime() function
|
|
335
|
+
if adapter.is_postgresql():
|
|
336
|
+
sql = f"""
|
|
337
|
+
SELECT task_id, channel_id, description, status, priority,
|
|
338
|
+
created_at, updated_at, parent_task_id,
|
|
339
|
+
context_json, outcome_json, retry_count
|
|
340
|
+
FROM tasks
|
|
341
|
+
WHERE updated_at >= {adapter.placeholder()} AND updated_at < {adapter.placeholder()}
|
|
342
|
+
AND status != 'deferred'
|
|
343
|
+
ORDER BY updated_at
|
|
344
|
+
"""
|
|
345
|
+
else:
|
|
346
|
+
sql = f"""
|
|
347
|
+
SELECT task_id, channel_id, description, status, priority,
|
|
348
|
+
created_at, updated_at, parent_task_id,
|
|
349
|
+
context_json, outcome_json, retry_count
|
|
350
|
+
FROM tasks
|
|
351
|
+
WHERE datetime(updated_at) >= datetime({adapter.placeholder()}) AND datetime(updated_at) < datetime({adapter.placeholder()})
|
|
352
|
+
AND status != 'deferred'
|
|
353
|
+
ORDER BY updated_at
|
|
354
|
+
"""
|
|
355
|
+
|
|
356
|
+
cursor.execute(sql, (period_start.isoformat(), period_end.isoformat()))
|
|
357
|
+
|
|
358
|
+
raw_tasks = []
|
|
359
|
+
for row in cursor.fetchall():
|
|
360
|
+
# Handle PostgreSQL datetime vs SQLite string for timestamps
|
|
361
|
+
created_at = row["created_at"]
|
|
362
|
+
if isinstance(created_at, datetime):
|
|
363
|
+
created_at = created_at.isoformat()
|
|
364
|
+
|
|
365
|
+
updated_at = row["updated_at"]
|
|
366
|
+
if isinstance(updated_at, datetime):
|
|
367
|
+
updated_at = updated_at.isoformat()
|
|
368
|
+
|
|
369
|
+
task = {
|
|
370
|
+
"task_id": row["task_id"],
|
|
371
|
+
"channel_id": row["channel_id"],
|
|
372
|
+
"description": row["description"],
|
|
373
|
+
"status": row["status"],
|
|
374
|
+
"priority": row["priority"],
|
|
375
|
+
"created_at": created_at,
|
|
376
|
+
"updated_at": updated_at,
|
|
377
|
+
"parent_task_id": row["parent_task_id"],
|
|
378
|
+
"context": row["context_json"],
|
|
379
|
+
"outcome": row["outcome_json"],
|
|
380
|
+
"retry_count": row["retry_count"],
|
|
381
|
+
}
|
|
382
|
+
raw_tasks.append(task)
|
|
383
|
+
|
|
384
|
+
# Also get thoughts for these tasks
|
|
385
|
+
if raw_tasks:
|
|
386
|
+
task_ids = [t["task_id"] for t in raw_tasks]
|
|
387
|
+
thoughts_by_task = self._query_thoughts_for_tasks(cursor, adapter, task_ids)
|
|
388
|
+
|
|
389
|
+
# Add thoughts to tasks and convert to typed models
|
|
390
|
+
for task in raw_tasks:
|
|
391
|
+
task["thoughts"] = thoughts_by_task.get(task["task_id"], [])
|
|
392
|
+
|
|
393
|
+
# Convert to TaskCorrelationData
|
|
394
|
+
converted = TSDBDataConverter.convert_task(task)
|
|
395
|
+
if converted:
|
|
396
|
+
task_correlations.append(converted)
|
|
397
|
+
|
|
398
|
+
logger.info(f"Found {len(task_correlations)} tasks for period {period_start}")
|
|
399
|
+
|
|
400
|
+
except Exception as e:
|
|
401
|
+
logger.error(f"Failed to query tasks: {e}")
|
|
402
|
+
|
|
403
|
+
return task_correlations
|
|
404
|
+
|
|
405
|
+
def _ensure_lock_row_exists(self, lock_key: str) -> None:
|
|
406
|
+
"""
|
|
407
|
+
Ensure a row exists in consolidation_locks for the given key.
|
|
408
|
+
|
|
409
|
+
Uses INSERT OR IGNORE pattern to safely create row if it doesn't exist.
|
|
410
|
+
|
|
411
|
+
Args:
|
|
412
|
+
lock_key: Lock key to ensure exists
|
|
413
|
+
"""
|
|
414
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
415
|
+
|
|
416
|
+
adapter = get_adapter()
|
|
417
|
+
|
|
418
|
+
try:
|
|
419
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
420
|
+
cursor = conn.cursor()
|
|
421
|
+
|
|
422
|
+
# Ensure table exists (necessary for :memory: databases in tests)
|
|
423
|
+
cursor.execute(_CREATE_LOCKS_TABLE_SQL)
|
|
424
|
+
|
|
425
|
+
# INSERT OR IGNORE - creates row only if it doesn't exist
|
|
426
|
+
if adapter.is_postgresql():
|
|
427
|
+
cursor.execute(
|
|
428
|
+
"""
|
|
429
|
+
INSERT INTO consolidation_locks (lock_key, locked_by, locked_at)
|
|
430
|
+
VALUES (%s, NULL, NULL)
|
|
431
|
+
ON CONFLICT (lock_key) DO NOTHING
|
|
432
|
+
""",
|
|
433
|
+
(lock_key,),
|
|
434
|
+
)
|
|
435
|
+
else:
|
|
436
|
+
cursor.execute(
|
|
437
|
+
"""
|
|
438
|
+
INSERT OR IGNORE INTO consolidation_locks (lock_key, locked_by, locked_at)
|
|
439
|
+
VALUES (?, NULL, NULL)
|
|
440
|
+
""",
|
|
441
|
+
(lock_key,),
|
|
442
|
+
)
|
|
443
|
+
conn.commit()
|
|
444
|
+
|
|
445
|
+
except Exception as e:
|
|
446
|
+
logger.warning(f"Error ensuring lock row exists for {lock_key}: {e}")
|
|
447
|
+
# Non-fatal - the conditional UPDATE will handle missing rows gracefully
|
|
448
|
+
|
|
449
|
+
def _try_acquire_lock(self, lock_key: str, consolidation_type: str, period_identifier: str) -> bool:
|
|
450
|
+
"""
|
|
451
|
+
Try to acquire lock using conditional UPDATE pattern.
|
|
452
|
+
|
|
453
|
+
This pattern works for both SQLite and PostgreSQL:
|
|
454
|
+
- UPDATE with WHERE clause checking lock availability
|
|
455
|
+
- If rowcount > 0, we got the lock
|
|
456
|
+
- If rowcount = 0, lock held by another instance
|
|
457
|
+
|
|
458
|
+
Locks auto-expire after 5 minutes (lock_timeout_seconds).
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
lock_key: Lock key string (e.g., "basic:2025-10-22T06:00:00+00:00")
|
|
462
|
+
consolidation_type: Type of consolidation (for logging)
|
|
463
|
+
period_identifier: Period identifier (for logging)
|
|
464
|
+
|
|
465
|
+
Returns:
|
|
466
|
+
True if lock acquired, False if held by another instance
|
|
467
|
+
"""
|
|
468
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
469
|
+
|
|
470
|
+
adapter = get_adapter()
|
|
471
|
+
|
|
472
|
+
try:
|
|
473
|
+
# Calculate expiry threshold (5 minutes ago)
|
|
474
|
+
from datetime import datetime, timedelta, timezone
|
|
475
|
+
|
|
476
|
+
now = datetime.now(timezone.utc)
|
|
477
|
+
expiry_threshold = now - timedelta(seconds=300) # 5 minutes
|
|
478
|
+
|
|
479
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
480
|
+
cursor = conn.cursor()
|
|
481
|
+
|
|
482
|
+
# Ensure table exists (necessary for :memory: databases in tests)
|
|
483
|
+
cursor.execute(_CREATE_LOCKS_TABLE_SQL)
|
|
484
|
+
|
|
485
|
+
# Ensure lock row exists in THIS connection (necessary for :memory: databases)
|
|
486
|
+
if adapter.is_postgresql():
|
|
487
|
+
cursor.execute(
|
|
488
|
+
"""
|
|
489
|
+
INSERT INTO consolidation_locks (lock_key, locked_by, locked_at)
|
|
490
|
+
VALUES (%s, NULL, NULL)
|
|
491
|
+
ON CONFLICT (lock_key) DO NOTHING
|
|
492
|
+
""",
|
|
493
|
+
(lock_key,),
|
|
494
|
+
)
|
|
495
|
+
else:
|
|
496
|
+
cursor.execute(
|
|
497
|
+
"""
|
|
498
|
+
INSERT OR IGNORE INTO consolidation_locks (lock_key, locked_by, locked_at)
|
|
499
|
+
VALUES (?, NULL, NULL)
|
|
500
|
+
""",
|
|
501
|
+
(lock_key,),
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
# Conditional UPDATE: claim lock if it's NULL or expired
|
|
505
|
+
if adapter.is_postgresql():
|
|
506
|
+
cursor.execute(
|
|
507
|
+
"""
|
|
508
|
+
UPDATE consolidation_locks
|
|
509
|
+
SET locked_by = %s, locked_at = %s
|
|
510
|
+
WHERE lock_key = %s
|
|
511
|
+
AND (locked_by IS NULL OR locked_at < %s)
|
|
512
|
+
""",
|
|
513
|
+
(self._instance_id, now, lock_key, expiry_threshold),
|
|
514
|
+
)
|
|
515
|
+
else:
|
|
516
|
+
cursor.execute(
|
|
517
|
+
"""
|
|
518
|
+
UPDATE consolidation_locks
|
|
519
|
+
SET locked_by = ?, locked_at = ?
|
|
520
|
+
WHERE lock_key = ?
|
|
521
|
+
AND (locked_by IS NULL OR locked_at < ?)
|
|
522
|
+
""",
|
|
523
|
+
(self._instance_id, now.isoformat(), lock_key, expiry_threshold.isoformat()),
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
conn.commit()
|
|
527
|
+
|
|
528
|
+
# Check if we acquired the lock
|
|
529
|
+
acquired = cursor.rowcount > 0
|
|
530
|
+
|
|
531
|
+
if acquired:
|
|
532
|
+
logger.info(
|
|
533
|
+
f"Acquired {consolidation_type} lock for {period_identifier} (instance: {self._instance_id})"
|
|
534
|
+
)
|
|
535
|
+
else:
|
|
536
|
+
logger.info(
|
|
537
|
+
f"Failed to acquire {consolidation_type} lock for {period_identifier} "
|
|
538
|
+
f"(held by another instance)"
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
return acquired
|
|
542
|
+
|
|
543
|
+
except Exception as e:
|
|
544
|
+
logger.error(
|
|
545
|
+
f"Error acquiring {consolidation_type} lock for {period_identifier}: {type(e).__name__}: {e}",
|
|
546
|
+
exc_info=True,
|
|
547
|
+
)
|
|
548
|
+
return False
|
|
549
|
+
|
|
550
|
+
def acquire_consolidation_lock(self, consolidation_type: str, period_identifier: str) -> bool:
|
|
551
|
+
"""
|
|
552
|
+
Try to acquire exclusive lock for a consolidation activity.
|
|
553
|
+
|
|
554
|
+
This is a generic locking mechanism that works for all consolidation types:
|
|
555
|
+
- basic: Lock individual 6-hour periods
|
|
556
|
+
- extensive: Lock a specific week
|
|
557
|
+
- profound: Lock a specific month
|
|
558
|
+
|
|
559
|
+
Uses database-backed locking via conditional UPDATE pattern:
|
|
560
|
+
- Works identically for both SQLite and PostgreSQL
|
|
561
|
+
- Locks stored in consolidation_locks table
|
|
562
|
+
- Locks auto-expire after 5 minutes
|
|
563
|
+
- Non-blocking - other database operations continue normally
|
|
564
|
+
|
|
565
|
+
Args:
|
|
566
|
+
consolidation_type: Type of consolidation ('basic', 'extensive', 'profound')
|
|
567
|
+
period_identifier: Period identifier (ISO datetime for basic, date string for others)
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
True if lock acquired successfully, False if another instance holds it
|
|
571
|
+
"""
|
|
572
|
+
lock_key = f"{consolidation_type}:{period_identifier}"
|
|
573
|
+
return self._try_acquire_lock(lock_key, consolidation_type, period_identifier)
|
|
574
|
+
|
|
575
|
+
def _release_lock(self, lock_key: str, consolidation_type: str, period_identifier: str) -> None:
|
|
576
|
+
"""
|
|
577
|
+
Release lock using conditional UPDATE pattern.
|
|
578
|
+
|
|
579
|
+
Only releases if this instance holds the lock (locked_by matches instance_id).
|
|
580
|
+
Works identically for both SQLite and PostgreSQL.
|
|
581
|
+
|
|
582
|
+
Args:
|
|
583
|
+
lock_key: Lock key string (e.g., "basic:2025-10-22T06:00:00+00:00")
|
|
584
|
+
consolidation_type: Type of consolidation (for logging)
|
|
585
|
+
period_identifier: Period identifier (for logging)
|
|
586
|
+
"""
|
|
587
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
588
|
+
|
|
589
|
+
adapter = get_adapter()
|
|
590
|
+
|
|
591
|
+
try:
|
|
592
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
593
|
+
cursor = conn.cursor()
|
|
594
|
+
|
|
595
|
+
# Ensure table exists (necessary for :memory: databases in tests)
|
|
596
|
+
cursor.execute(_CREATE_LOCKS_TABLE_SQL)
|
|
597
|
+
|
|
598
|
+
# Conditional UPDATE: release lock only if we hold it
|
|
599
|
+
if adapter.is_postgresql():
|
|
600
|
+
cursor.execute(
|
|
601
|
+
"""
|
|
602
|
+
UPDATE consolidation_locks
|
|
603
|
+
SET locked_by = NULL, locked_at = NULL
|
|
604
|
+
WHERE lock_key = %s AND locked_by = %s
|
|
605
|
+
""",
|
|
606
|
+
(lock_key, self._instance_id),
|
|
607
|
+
)
|
|
608
|
+
else:
|
|
609
|
+
cursor.execute(
|
|
610
|
+
"""
|
|
611
|
+
UPDATE consolidation_locks
|
|
612
|
+
SET locked_by = NULL, locked_at = NULL
|
|
613
|
+
WHERE lock_key = ? AND locked_by = ?
|
|
614
|
+
""",
|
|
615
|
+
(lock_key, self._instance_id),
|
|
616
|
+
)
|
|
617
|
+
|
|
618
|
+
conn.commit()
|
|
619
|
+
|
|
620
|
+
if cursor.rowcount > 0:
|
|
621
|
+
logger.debug(
|
|
622
|
+
f"Released {consolidation_type} lock for {period_identifier} (instance: {self._instance_id})"
|
|
623
|
+
)
|
|
624
|
+
else:
|
|
625
|
+
logger.warning(
|
|
626
|
+
f"Attempted to release {consolidation_type} lock for {period_identifier} "
|
|
627
|
+
f"but lock not held by this instance (instance: {self._instance_id})"
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
except Exception as e:
|
|
631
|
+
logger.error(
|
|
632
|
+
f"Error releasing {consolidation_type} lock for {period_identifier}: {type(e).__name__}: {e}",
|
|
633
|
+
exc_info=True,
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
def release_consolidation_lock(self, consolidation_type: str, period_identifier: str) -> None:
|
|
637
|
+
"""
|
|
638
|
+
Release the consolidation lock.
|
|
639
|
+
|
|
640
|
+
Uses database-backed locking via conditional UPDATE pattern.
|
|
641
|
+
Only releases if this instance currently holds the lock.
|
|
642
|
+
|
|
643
|
+
Args:
|
|
644
|
+
consolidation_type: Type of consolidation
|
|
645
|
+
period_identifier: Period identifier
|
|
646
|
+
"""
|
|
647
|
+
lock_key = f"{consolidation_type}:{period_identifier}"
|
|
648
|
+
self._release_lock(lock_key, consolidation_type, period_identifier)
|
|
649
|
+
|
|
650
|
+
def acquire_period_lock(self, period_start: datetime) -> bool:
|
|
651
|
+
"""
|
|
652
|
+
Try to acquire exclusive lock for consolidating a period.
|
|
653
|
+
|
|
654
|
+
Convenience wrapper for acquire_consolidation_lock for basic consolidation.
|
|
655
|
+
|
|
656
|
+
Args:
|
|
657
|
+
period_start: Period start time to lock
|
|
658
|
+
|
|
659
|
+
Returns:
|
|
660
|
+
True if lock acquired successfully, False if another instance holds it
|
|
661
|
+
"""
|
|
662
|
+
return self.acquire_consolidation_lock("basic", period_start.isoformat())
|
|
663
|
+
|
|
664
|
+
def release_period_lock(self, period_start: datetime) -> None:
|
|
665
|
+
"""
|
|
666
|
+
Release the consolidation lock for a period.
|
|
667
|
+
|
|
668
|
+
Convenience wrapper for release_consolidation_lock for basic consolidation.
|
|
669
|
+
|
|
670
|
+
Args:
|
|
671
|
+
period_start: Period start time to unlock
|
|
672
|
+
"""
|
|
673
|
+
self.release_consolidation_lock("basic", period_start.isoformat())
|
|
674
|
+
|
|
675
|
+
def get_special_node_types(self) -> Set[str]:
|
|
676
|
+
"""
|
|
677
|
+
Get the list of special node types to track in summaries.
|
|
678
|
+
|
|
679
|
+
Returns:
|
|
680
|
+
Set of node type strings
|
|
681
|
+
"""
|
|
682
|
+
return {
|
|
683
|
+
"concept",
|
|
684
|
+
"shutdown_memory",
|
|
685
|
+
"identity_update",
|
|
686
|
+
"config_update",
|
|
687
|
+
"wise_feedback",
|
|
688
|
+
"self_observation",
|
|
689
|
+
"task_assignment",
|
|
690
|
+
"user",
|
|
691
|
+
"agent",
|
|
692
|
+
"observation",
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
def check_period_consolidated(self, period_start: datetime) -> bool:
|
|
696
|
+
"""
|
|
697
|
+
Check if a period has already been consolidated.
|
|
698
|
+
|
|
699
|
+
Args:
|
|
700
|
+
period_start: Start of the period
|
|
701
|
+
|
|
702
|
+
Returns:
|
|
703
|
+
True if already consolidated
|
|
704
|
+
"""
|
|
705
|
+
if not self._memory_bus:
|
|
706
|
+
return False
|
|
707
|
+
|
|
708
|
+
try:
|
|
709
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
710
|
+
|
|
711
|
+
adapter = get_adapter()
|
|
712
|
+
|
|
713
|
+
# Query the database directly to check for ANY tsdb_summary nodes for this period
|
|
714
|
+
# This prevents duplicates from test runs or other sources
|
|
715
|
+
with get_db_connection(db_path=self._db_path) as conn:
|
|
716
|
+
cursor = conn.cursor()
|
|
717
|
+
|
|
718
|
+
# Check for any tsdb_summary nodes with matching period_start
|
|
719
|
+
# Backwards compatible: Accept summaries with consolidation_level='basic' OR no level (legacy)
|
|
720
|
+
# PostgreSQL: Use JSONB operators
|
|
721
|
+
# SQLite: Use json_extract() function
|
|
722
|
+
if adapter.is_postgresql():
|
|
723
|
+
sql = f"""
|
|
724
|
+
SELECT COUNT(*) as count
|
|
725
|
+
FROM graph_nodes
|
|
726
|
+
WHERE node_type = 'tsdb_summary'
|
|
727
|
+
AND attributes_json->>'period_start' = {adapter.placeholder()}
|
|
728
|
+
AND (
|
|
729
|
+
attributes_json->>'consolidation_level' = 'basic'
|
|
730
|
+
OR attributes_json->>'consolidation_level' IS NULL
|
|
731
|
+
)
|
|
732
|
+
"""
|
|
733
|
+
else:
|
|
734
|
+
sql = f"""
|
|
735
|
+
SELECT COUNT(*) as count
|
|
736
|
+
FROM graph_nodes
|
|
737
|
+
WHERE node_type = 'tsdb_summary'
|
|
738
|
+
AND json_extract(attributes_json, '$.period_start') = {adapter.placeholder()}
|
|
739
|
+
AND (
|
|
740
|
+
json_extract(attributes_json, '$.consolidation_level') = 'basic'
|
|
741
|
+
OR json_extract(attributes_json, '$.consolidation_level') IS NULL
|
|
742
|
+
)
|
|
743
|
+
"""
|
|
744
|
+
|
|
745
|
+
cursor.execute(sql, (period_start.isoformat(),))
|
|
746
|
+
|
|
747
|
+
row = cursor.fetchone()
|
|
748
|
+
count = row["count"] if row else 0
|
|
749
|
+
|
|
750
|
+
if count > 0:
|
|
751
|
+
logger.info(f"Period {period_start} already has {count} consolidation(s)")
|
|
752
|
+
|
|
753
|
+
return count > 0
|
|
754
|
+
|
|
755
|
+
except Exception as e:
|
|
756
|
+
logger.error(f"Failed to check consolidation status: {e}")
|
|
757
|
+
return False
|
|
758
|
+
|
|
759
|
+
async def get_last_consolidated_period(self) -> Optional[datetime]:
|
|
760
|
+
"""
|
|
761
|
+
Get the timestamp of the last successfully consolidated period.
|
|
762
|
+
|
|
763
|
+
Returns:
|
|
764
|
+
Datetime of the last consolidated period start, or None if no consolidation found
|
|
765
|
+
"""
|
|
766
|
+
if not self._memory_bus:
|
|
767
|
+
return None
|
|
768
|
+
|
|
769
|
+
try:
|
|
770
|
+
# Query for TSDB summary nodes using wildcard
|
|
771
|
+
query = MemoryQuery(
|
|
772
|
+
node_id="tsdb_summary_*", # Wildcard to match all TSDB summaries
|
|
773
|
+
scope=GraphScope.LOCAL,
|
|
774
|
+
type=NodeType.TSDB_SUMMARY,
|
|
775
|
+
include_edges=False,
|
|
776
|
+
depth=1,
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
summaries = await self._memory_bus.recall(query, handler_name="tsdb_consolidation")
|
|
780
|
+
|
|
781
|
+
if not summaries:
|
|
782
|
+
return None
|
|
783
|
+
|
|
784
|
+
# Extract period timestamps from node IDs
|
|
785
|
+
periods = []
|
|
786
|
+
for summary in summaries:
|
|
787
|
+
# Node ID format: tsdb_summary_YYYYMMDD_HH
|
|
788
|
+
if summary.id.startswith("tsdb_summary_"):
|
|
789
|
+
period_str = summary.id.replace("tsdb_summary_", "")
|
|
790
|
+
try:
|
|
791
|
+
# Parse format YYYYMMDD_HH
|
|
792
|
+
date_part, hour_part = period_str.split("_")
|
|
793
|
+
year = int(date_part[:4])
|
|
794
|
+
month = int(date_part[4:6])
|
|
795
|
+
day = int(date_part[6:8])
|
|
796
|
+
hour = int(hour_part)
|
|
797
|
+
|
|
798
|
+
period_dt = datetime(year, month, day, hour, tzinfo=timezone.utc)
|
|
799
|
+
periods.append(period_dt)
|
|
800
|
+
except (ValueError, IndexError) as e:
|
|
801
|
+
logger.warning(f"Failed to parse period from summary ID {summary.id}: {e}")
|
|
802
|
+
continue
|
|
803
|
+
|
|
804
|
+
# Return the most recent period
|
|
805
|
+
if periods:
|
|
806
|
+
return max(periods)
|
|
807
|
+
|
|
808
|
+
return None
|
|
809
|
+
|
|
810
|
+
except Exception as e:
|
|
811
|
+
logger.error(f"Failed to get last consolidated period: {e}")
|
|
812
|
+
return None
|