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,923 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CIRIS Runtime Helper Functions
|
|
3
|
+
|
|
4
|
+
Production-grade helper functions to reduce cognitive complexity in ciris_runtime.py
|
|
5
|
+
Follows the Three Rules: No Untyped Dicts, No Bypass Patterns, No Exceptions
|
|
6
|
+
|
|
7
|
+
These helpers target the highest complexity methods:
|
|
8
|
+
- shutdown (CC 75) -> 8 helpers
|
|
9
|
+
- run (CC 32) -> 6 helpers
|
|
10
|
+
- _start_adapter_connections (CC 23) -> 4 helpers
|
|
11
|
+
- _wait_for_critical_services (CC 18) -> 3 helpers
|
|
12
|
+
- _register_adapter_services (CC 13) -> 3 helpers
|
|
13
|
+
- _preserve_shutdown_continuity (CC 11) -> 2 helpers
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# Import required for helper functions
|
|
17
|
+
import asyncio
|
|
18
|
+
import logging
|
|
19
|
+
import sys
|
|
20
|
+
from contextlib import asynccontextmanager
|
|
21
|
+
from dataclasses import dataclass
|
|
22
|
+
from enum import Enum
|
|
23
|
+
from typing import Any, AsyncGenerator, Dict, List, Optional, Set, Tuple
|
|
24
|
+
|
|
25
|
+
# Set up logger for helpers
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Python 3.10 compatibility: asyncio.timeout was added in Python 3.11
|
|
30
|
+
if sys.version_info >= (3, 11):
|
|
31
|
+
# Use native asyncio.timeout in Python 3.11+
|
|
32
|
+
_async_timeout = asyncio.timeout
|
|
33
|
+
else:
|
|
34
|
+
# Python 3.10 polyfill using CancelledError approach
|
|
35
|
+
@asynccontextmanager
|
|
36
|
+
async def _async_timeout(delay: float) -> AsyncGenerator[None, None]:
|
|
37
|
+
"""Python 3.10 compatible timeout context manager."""
|
|
38
|
+
loop = asyncio.get_event_loop()
|
|
39
|
+
task = asyncio.current_task()
|
|
40
|
+
if task is None:
|
|
41
|
+
raise RuntimeError("No current task")
|
|
42
|
+
|
|
43
|
+
timed_out = False
|
|
44
|
+
|
|
45
|
+
def timeout_callback() -> None:
|
|
46
|
+
nonlocal timed_out
|
|
47
|
+
timed_out = True
|
|
48
|
+
task.cancel() # type: ignore[union-attr]
|
|
49
|
+
|
|
50
|
+
# Schedule timeout
|
|
51
|
+
handle = loop.call_later(delay, timeout_callback)
|
|
52
|
+
try:
|
|
53
|
+
yield
|
|
54
|
+
except asyncio.CancelledError:
|
|
55
|
+
handle.cancel()
|
|
56
|
+
if timed_out:
|
|
57
|
+
raise asyncio.TimeoutError() from None
|
|
58
|
+
else:
|
|
59
|
+
raise # Re-raise CancelledError if not from timeout
|
|
60
|
+
else:
|
|
61
|
+
handle.cancel()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Import runtime utilities
|
|
65
|
+
from ciris_engine.logic.utils.shutdown_manager import is_global_shutdown_requested, wait_for_global_shutdown_async
|
|
66
|
+
|
|
67
|
+
# Service priority mapping for clean lookup
|
|
68
|
+
_SERVICE_SHUTDOWN_PRIORITIES = {
|
|
69
|
+
# Priority 0-2: Dependent services (shutdown first)
|
|
70
|
+
"TSDB": 0,
|
|
71
|
+
"Consolidation": 0,
|
|
72
|
+
"Task": 1,
|
|
73
|
+
"Scheduler": 1,
|
|
74
|
+
"Incident": 2,
|
|
75
|
+
"Monitor": 2,
|
|
76
|
+
# Priority 3-5: Application services
|
|
77
|
+
"Adaptive": 3,
|
|
78
|
+
"Filter": 3,
|
|
79
|
+
"Tool": 4,
|
|
80
|
+
"Control": 4,
|
|
81
|
+
"Observation": 5,
|
|
82
|
+
"Visibility": 5,
|
|
83
|
+
# Priority 6-8: Core services
|
|
84
|
+
"Telemetry": 6,
|
|
85
|
+
"Audit": 6,
|
|
86
|
+
"LLM": 7,
|
|
87
|
+
"Auth": 7,
|
|
88
|
+
"Config": 8,
|
|
89
|
+
# Priority 9-12: Infrastructure services (shutdown last)
|
|
90
|
+
"Memory": 9,
|
|
91
|
+
"Secrets": 9,
|
|
92
|
+
"Initialization": 10,
|
|
93
|
+
"Time": 11,
|
|
94
|
+
"Shutdown": 12,
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _get_service_shutdown_priority(service: Any) -> int:
|
|
99
|
+
"""Get shutdown priority for service ordering.
|
|
100
|
+
|
|
101
|
+
Lower numbers shut down first, higher numbers shut down last.
|
|
102
|
+
Infrastructure services shut down last to support other services.
|
|
103
|
+
"""
|
|
104
|
+
service_name = service.__class__.__name__
|
|
105
|
+
|
|
106
|
+
# Check for priority keywords in service name
|
|
107
|
+
for keyword, priority in _SERVICE_SHUTDOWN_PRIORITIES.items():
|
|
108
|
+
if keyword in service_name:
|
|
109
|
+
return priority
|
|
110
|
+
|
|
111
|
+
return 5 # Default priority for unmatched services
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def execute_final_maintenance_tasks(runtime: Any) -> None:
|
|
115
|
+
"""Run final maintenance and consolidation before services stop."""
|
|
116
|
+
logger = logging.getLogger(__name__)
|
|
117
|
+
|
|
118
|
+
logger.info("=" * 60)
|
|
119
|
+
logger.info("Running final maintenance tasks...")
|
|
120
|
+
|
|
121
|
+
# 1. Run final database maintenance
|
|
122
|
+
if hasattr(runtime, "maintenance_service") and runtime.maintenance_service:
|
|
123
|
+
try:
|
|
124
|
+
logger.info("Running final database maintenance before shutdown...")
|
|
125
|
+
await runtime.maintenance_service.perform_startup_cleanup()
|
|
126
|
+
logger.info("Final database maintenance completed")
|
|
127
|
+
except Exception as e:
|
|
128
|
+
logger.error(f"Failed to run final database maintenance: {e}")
|
|
129
|
+
|
|
130
|
+
# 2. Run final TSDB consolidation
|
|
131
|
+
if hasattr(runtime, "service_initializer") and runtime.service_initializer:
|
|
132
|
+
tsdb_service = getattr(runtime.service_initializer, "tsdb_consolidation_service", None)
|
|
133
|
+
if tsdb_service:
|
|
134
|
+
try:
|
|
135
|
+
logger.info("Running final TSDB consolidation before shutdown...")
|
|
136
|
+
await tsdb_service._run_consolidation()
|
|
137
|
+
logger.info("Final TSDB consolidation completed")
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.error(f"Failed to run final TSDB consolidation: {e}")
|
|
140
|
+
|
|
141
|
+
logger.info("Final maintenance tasks completed")
|
|
142
|
+
logger.info("=" * 60)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def _transition_agent_to_shutdown_state(runtime: Any, current_state: Any) -> bool:
|
|
146
|
+
"""Transition agent processor to shutdown state."""
|
|
147
|
+
from ciris_engine.schemas.processors.states import AgentState
|
|
148
|
+
|
|
149
|
+
logger = logging.getLogger(__name__)
|
|
150
|
+
|
|
151
|
+
if not await runtime.agent_processor.state_manager.can_transition_to(AgentState.SHUTDOWN):
|
|
152
|
+
logger.error(f"Cannot transition from {current_state} to SHUTDOWN state")
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
logger.info(f"Transitioning from {current_state} to SHUTDOWN state")
|
|
156
|
+
await runtime.agent_processor.state_manager.transition_to(AgentState.SHUTDOWN)
|
|
157
|
+
return True
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
async def _handle_processing_loop_shutdown(runtime: Any) -> None:
|
|
161
|
+
"""Handle shutdown of processing loop or direct shutdown processor."""
|
|
162
|
+
import asyncio
|
|
163
|
+
|
|
164
|
+
logger = logging.getLogger(__name__)
|
|
165
|
+
|
|
166
|
+
if runtime.agent_processor._processing_task and not runtime.agent_processor._processing_task.done():
|
|
167
|
+
logger.info("Processing loop is running, signaling stop")
|
|
168
|
+
if hasattr(runtime.agent_processor, "_stop_event") and runtime.agent_processor._stop_event:
|
|
169
|
+
runtime.agent_processor._stop_event.set()
|
|
170
|
+
else:
|
|
171
|
+
await _execute_shutdown_processor_directly(runtime)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
async def _execute_shutdown_processor_directly(runtime: Any) -> None:
|
|
175
|
+
"""Execute shutdown processor directly when processing loop is not running."""
|
|
176
|
+
import asyncio
|
|
177
|
+
|
|
178
|
+
logger = logging.getLogger(__name__)
|
|
179
|
+
|
|
180
|
+
logger.info("Processing loop not running, executing shutdown processor directly")
|
|
181
|
+
if hasattr(runtime.agent_processor, "shutdown_processor") and runtime.agent_processor.shutdown_processor:
|
|
182
|
+
# Run a few rounds of shutdown processing
|
|
183
|
+
for round_num in range(5):
|
|
184
|
+
try:
|
|
185
|
+
_ = await runtime.agent_processor.shutdown_processor.process(round_num)
|
|
186
|
+
if runtime.agent_processor.shutdown_processor.shutdown_complete:
|
|
187
|
+
break
|
|
188
|
+
except Exception as e:
|
|
189
|
+
logger.error(f"Error in shutdown processor: {e}", exc_info=True)
|
|
190
|
+
break
|
|
191
|
+
await asyncio.sleep(0.1)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
async def _wait_for_shutdown_processor_completion(runtime: Any) -> None:
|
|
195
|
+
"""Wait for shutdown processor to complete with timeout."""
|
|
196
|
+
import asyncio
|
|
197
|
+
|
|
198
|
+
logger = logging.getLogger(__name__)
|
|
199
|
+
|
|
200
|
+
max_wait = 5.0 # Reduced from 30s to 5s for faster shutdown
|
|
201
|
+
start_time = asyncio.get_event_loop().time()
|
|
202
|
+
|
|
203
|
+
while (asyncio.get_event_loop().time() - start_time) < max_wait:
|
|
204
|
+
if (
|
|
205
|
+
hasattr(runtime.agent_processor, "shutdown_processor")
|
|
206
|
+
and runtime.agent_processor.shutdown_processor
|
|
207
|
+
and runtime.agent_processor.shutdown_processor.shutdown_complete
|
|
208
|
+
):
|
|
209
|
+
result = runtime.agent_processor.shutdown_processor.shutdown_result
|
|
210
|
+
if result and hasattr(result, "get") and result.get("status") == "rejected":
|
|
211
|
+
logger.warning(f"Shutdown rejected by agent: {result.get('reason')}")
|
|
212
|
+
break
|
|
213
|
+
await asyncio.sleep(0.1)
|
|
214
|
+
|
|
215
|
+
logger.debug("Shutdown negotiation complete or timed out")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
async def handle_agent_processor_shutdown(runtime: Any) -> None:
|
|
219
|
+
"""Handle graceful agent processor shutdown negotiation."""
|
|
220
|
+
from ciris_engine.schemas.processors.states import AgentState
|
|
221
|
+
|
|
222
|
+
logger = logging.getLogger(__name__)
|
|
223
|
+
|
|
224
|
+
# Early exit if no agent processor
|
|
225
|
+
if not runtime.agent_processor or not hasattr(runtime.agent_processor, "state_manager"):
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
current_state = runtime.agent_processor.state_manager.get_state()
|
|
229
|
+
|
|
230
|
+
# Only do negotiation if not already in SHUTDOWN state
|
|
231
|
+
if current_state == AgentState.SHUTDOWN:
|
|
232
|
+
return
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
logger.info("Initiating graceful shutdown negotiation...")
|
|
236
|
+
|
|
237
|
+
# Transition to shutdown state
|
|
238
|
+
if await _transition_agent_to_shutdown_state(runtime, current_state):
|
|
239
|
+
# Handle processing loop shutdown
|
|
240
|
+
await _handle_processing_loop_shutdown(runtime)
|
|
241
|
+
|
|
242
|
+
# Wait for completion
|
|
243
|
+
await _wait_for_shutdown_processor_completion(runtime)
|
|
244
|
+
|
|
245
|
+
except Exception as e:
|
|
246
|
+
logger.error(f"Error during shutdown negotiation: {e}")
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# ============================================================================
|
|
250
|
+
# SHUTDOWN HELPERS (CC 75 -> CC ~8) - 8 helpers
|
|
251
|
+
# ============================================================================
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def validate_shutdown_preconditions(runtime: Any) -> bool:
|
|
255
|
+
"""Validate system state before shutdown initiation.
|
|
256
|
+
|
|
257
|
+
Returns True if shutdown can proceed safely, False otherwise.
|
|
258
|
+
"""
|
|
259
|
+
import logging
|
|
260
|
+
|
|
261
|
+
logger = logging.getLogger(__name__)
|
|
262
|
+
|
|
263
|
+
# Check if already shutdown
|
|
264
|
+
if hasattr(runtime, "_shutdown_complete") and runtime._shutdown_complete:
|
|
265
|
+
logger.debug("Shutdown already completed, skipping...")
|
|
266
|
+
return False
|
|
267
|
+
|
|
268
|
+
# Mark service registry in shutdown mode
|
|
269
|
+
if runtime.service_registry:
|
|
270
|
+
runtime.service_registry._shutdown_mode = True
|
|
271
|
+
logger.info("Service registry marked for shutdown mode")
|
|
272
|
+
|
|
273
|
+
logger.info("Shutdown preconditions validated successfully")
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _collect_scheduled_services(runtime: Any) -> List[Any]:
|
|
278
|
+
"""Collect services that have scheduled tasks."""
|
|
279
|
+
scheduled_services = []
|
|
280
|
+
if runtime.service_registry:
|
|
281
|
+
all_services = runtime.service_registry.get_all_services()
|
|
282
|
+
for service in all_services:
|
|
283
|
+
# Check for scheduled services with _task or _scheduler attributes
|
|
284
|
+
if hasattr(service, "_task") or hasattr(service, "_scheduler"):
|
|
285
|
+
scheduled_services.append(service)
|
|
286
|
+
return scheduled_services
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
async def _stop_service_task(service: Any) -> None:
|
|
290
|
+
"""Stop a specific service's task safely."""
|
|
291
|
+
import asyncio
|
|
292
|
+
|
|
293
|
+
logger = logging.getLogger(__name__)
|
|
294
|
+
|
|
295
|
+
service_name = service.__class__.__name__
|
|
296
|
+
logger.info(f"Stopping scheduled tasks for {service_name}")
|
|
297
|
+
|
|
298
|
+
if hasattr(service, "_task") and service._task:
|
|
299
|
+
# Cancel the task directly
|
|
300
|
+
service._task.cancel()
|
|
301
|
+
try:
|
|
302
|
+
await service._task
|
|
303
|
+
except asyncio.CancelledError:
|
|
304
|
+
# Only re-raise if we're being cancelled ourselves
|
|
305
|
+
current = asyncio.current_task()
|
|
306
|
+
if current is not None and current.cancelled():
|
|
307
|
+
raise
|
|
308
|
+
# Otherwise, this is a normal stop - don't propagate the cancellation
|
|
309
|
+
elif hasattr(service, "stop_scheduler"):
|
|
310
|
+
await service.stop_scheduler()
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
async def prepare_shutdown_maintenance_tasks(runtime: Any) -> List[Any]:
|
|
314
|
+
"""Prepare and schedule final maintenance operations.
|
|
315
|
+
|
|
316
|
+
Returns list of scheduled services that need to be stopped.
|
|
317
|
+
"""
|
|
318
|
+
import asyncio
|
|
319
|
+
|
|
320
|
+
logger = logging.getLogger(__name__)
|
|
321
|
+
|
|
322
|
+
# Collect scheduled services that need to be stopped
|
|
323
|
+
scheduled_services = _collect_scheduled_services(runtime)
|
|
324
|
+
|
|
325
|
+
# Stop all scheduled services first
|
|
326
|
+
for service in scheduled_services:
|
|
327
|
+
try:
|
|
328
|
+
await _stop_service_task(service)
|
|
329
|
+
except Exception as e:
|
|
330
|
+
logger.error(f"Error stopping scheduled tasks for {service.__class__.__name__}: {e}")
|
|
331
|
+
|
|
332
|
+
# Give scheduled tasks a moment to stop
|
|
333
|
+
if scheduled_services:
|
|
334
|
+
logger.info(f"Stopped {len(scheduled_services)} scheduled services, waiting for tasks to complete...")
|
|
335
|
+
await asyncio.sleep(0.5)
|
|
336
|
+
|
|
337
|
+
return scheduled_services
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _collect_all_services_to_stop(runtime: Any) -> List[Any]:
|
|
341
|
+
"""Collect all services that need to be stopped."""
|
|
342
|
+
services_to_stop = []
|
|
343
|
+
seen_ids = set()
|
|
344
|
+
|
|
345
|
+
# Get all registered services
|
|
346
|
+
all_registered_services = []
|
|
347
|
+
if runtime.service_registry:
|
|
348
|
+
all_registered_services = runtime.service_registry.get_all_services()
|
|
349
|
+
|
|
350
|
+
# Add registered services
|
|
351
|
+
for service in all_registered_services:
|
|
352
|
+
service_id = id(service)
|
|
353
|
+
if service_id not in seen_ids and hasattr(service, "stop"):
|
|
354
|
+
seen_ids.add(service_id)
|
|
355
|
+
services_to_stop.append(service)
|
|
356
|
+
|
|
357
|
+
# Add direct service references
|
|
358
|
+
direct_services = _get_direct_service_references(runtime)
|
|
359
|
+
for service in direct_services:
|
|
360
|
+
if service:
|
|
361
|
+
service_id = id(service)
|
|
362
|
+
if service_id not in seen_ids and hasattr(service, "stop"):
|
|
363
|
+
seen_ids.add(service_id)
|
|
364
|
+
services_to_stop.append(service)
|
|
365
|
+
|
|
366
|
+
return services_to_stop
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def _get_direct_service_references(runtime: Any) -> List[Any]:
|
|
370
|
+
"""Get direct service references for backward compatibility."""
|
|
371
|
+
return [
|
|
372
|
+
# From service_initializer
|
|
373
|
+
getattr(runtime.service_initializer, "tsdb_consolidation_service", None),
|
|
374
|
+
getattr(runtime.service_initializer, "task_scheduler_service", None),
|
|
375
|
+
getattr(runtime.service_initializer, "incident_management_service", None),
|
|
376
|
+
getattr(runtime.service_initializer, "resource_monitor_service", None),
|
|
377
|
+
getattr(runtime.service_initializer, "config_service", None),
|
|
378
|
+
getattr(runtime.service_initializer, "auth_service", None),
|
|
379
|
+
getattr(runtime.service_initializer, "runtime_control_service", None),
|
|
380
|
+
getattr(runtime.service_initializer, "self_observation_service", None),
|
|
381
|
+
getattr(runtime.service_initializer, "visibility_service", None),
|
|
382
|
+
getattr(runtime.service_initializer, "secrets_tool_service", None),
|
|
383
|
+
getattr(runtime.service_initializer, "wa_auth_system", None),
|
|
384
|
+
getattr(runtime.service_initializer, "initialization_service", None),
|
|
385
|
+
getattr(runtime.service_initializer, "shutdown_service", None),
|
|
386
|
+
getattr(runtime.service_initializer, "time_service", None),
|
|
387
|
+
# From runtime
|
|
388
|
+
runtime.maintenance_service,
|
|
389
|
+
runtime.adaptive_filter_service,
|
|
390
|
+
runtime.telemetry_service,
|
|
391
|
+
runtime.audit_service,
|
|
392
|
+
runtime.llm_service,
|
|
393
|
+
runtime.secrets_service,
|
|
394
|
+
runtime.memory_service,
|
|
395
|
+
]
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
async def _execute_service_stop_tasks(services_to_stop: List[Any]) -> Tuple[List[Any], List[str]]:
|
|
399
|
+
"""Execute stop tasks for all services."""
|
|
400
|
+
import asyncio
|
|
401
|
+
|
|
402
|
+
logger = logging.getLogger(__name__)
|
|
403
|
+
|
|
404
|
+
stop_tasks = []
|
|
405
|
+
service_names = []
|
|
406
|
+
|
|
407
|
+
for service in services_to_stop:
|
|
408
|
+
if service and hasattr(service, "stop"):
|
|
409
|
+
stop_method = service.stop()
|
|
410
|
+
if asyncio.iscoroutine(stop_method):
|
|
411
|
+
task = asyncio.create_task(stop_method)
|
|
412
|
+
stop_tasks.append(task)
|
|
413
|
+
service_names.append(service.__class__.__name__)
|
|
414
|
+
|
|
415
|
+
if stop_tasks:
|
|
416
|
+
logger.info(f"Stopping {len(stop_tasks)} services: {', '.join(service_names)}")
|
|
417
|
+
return await _wait_for_service_stops(stop_tasks, service_names)
|
|
418
|
+
|
|
419
|
+
return [], []
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
async def _wait_for_service_stops(stop_tasks: List[Any], service_names: List[str]) -> Tuple[List[Any], List[str]]:
|
|
423
|
+
"""Wait for service stop tasks with timeout handling."""
|
|
424
|
+
import asyncio
|
|
425
|
+
|
|
426
|
+
logger = logging.getLogger(__name__)
|
|
427
|
+
|
|
428
|
+
done, pending = await asyncio.wait(stop_tasks, timeout=10.0)
|
|
429
|
+
|
|
430
|
+
if pending:
|
|
431
|
+
await _handle_hanging_services(pending, stop_tasks, service_names)
|
|
432
|
+
else:
|
|
433
|
+
logger.info(f"All {len(stop_tasks)} services stopped successfully")
|
|
434
|
+
|
|
435
|
+
# Check for errors in completed tasks
|
|
436
|
+
await _check_service_stop_errors(done, stop_tasks, service_names)
|
|
437
|
+
|
|
438
|
+
return stop_tasks, service_names
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
async def _handle_hanging_services(pending: Set[Any], stop_tasks: List[Any], service_names: List[str]) -> None:
|
|
442
|
+
"""Handle services that didn't stop in time."""
|
|
443
|
+
import asyncio
|
|
444
|
+
|
|
445
|
+
logger = logging.getLogger(__name__)
|
|
446
|
+
|
|
447
|
+
logger.error(f"Service shutdown timed out after 10 seconds. {len(pending)} services still running.")
|
|
448
|
+
hanging_services = []
|
|
449
|
+
|
|
450
|
+
for task in pending:
|
|
451
|
+
try:
|
|
452
|
+
idx = stop_tasks.index(task)
|
|
453
|
+
service_name = service_names[idx]
|
|
454
|
+
hanging_services.append(service_name)
|
|
455
|
+
logger.warning(f"Service {service_name} did not stop in time")
|
|
456
|
+
except ValueError:
|
|
457
|
+
logger.warning("Unknown service task did not stop in time")
|
|
458
|
+
task.cancel()
|
|
459
|
+
|
|
460
|
+
logger.error(f"Hanging services: {', '.join(hanging_services)}")
|
|
461
|
+
|
|
462
|
+
# Await cancelled tasks for cleanup
|
|
463
|
+
if pending:
|
|
464
|
+
await asyncio.gather(*pending, return_exceptions=True)
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
async def _check_service_stop_errors(done: Set[Any], stop_tasks: List[Any], service_names: List[str]) -> None:
|
|
468
|
+
"""Check for errors in completed service stop tasks."""
|
|
469
|
+
logger = logging.getLogger(__name__)
|
|
470
|
+
|
|
471
|
+
for task in done:
|
|
472
|
+
if task.done() and not task.cancelled():
|
|
473
|
+
try:
|
|
474
|
+
result = task.result()
|
|
475
|
+
if isinstance(result, Exception):
|
|
476
|
+
idx = stop_tasks.index(task)
|
|
477
|
+
logger.error(f"Service {service_names[idx]} stop error: {result}")
|
|
478
|
+
except Exception as e:
|
|
479
|
+
logger.error(f"Error checking task result: {e}")
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
async def execute_service_shutdown_sequence(runtime: Any) -> Tuple[List[Any], List[str]]:
|
|
483
|
+
"""Execute orderly shutdown of all services by priority.
|
|
484
|
+
|
|
485
|
+
Returns tuple of (services_to_stop, service_names).
|
|
486
|
+
"""
|
|
487
|
+
logger = logging.getLogger(__name__)
|
|
488
|
+
|
|
489
|
+
# Collect all services to stop
|
|
490
|
+
services_to_stop = _collect_all_services_to_stop(runtime)
|
|
491
|
+
if runtime.service_registry:
|
|
492
|
+
logger.info(f"Found {len(services_to_stop)} services to stop")
|
|
493
|
+
|
|
494
|
+
# Sort services by shutdown priority
|
|
495
|
+
services_to_stop.sort(key=_get_service_shutdown_priority)
|
|
496
|
+
|
|
497
|
+
# Execute service stops
|
|
498
|
+
_, service_names = await _execute_service_stop_tasks(services_to_stop)
|
|
499
|
+
|
|
500
|
+
return services_to_stop, service_names
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
async def handle_adapter_shutdown_cleanup(runtime: Any) -> None:
|
|
504
|
+
"""Clean up adapter connections and resources."""
|
|
505
|
+
import asyncio
|
|
506
|
+
import logging
|
|
507
|
+
|
|
508
|
+
logger = logging.getLogger(__name__)
|
|
509
|
+
|
|
510
|
+
# Stop multi-service sink (bus manager)
|
|
511
|
+
if runtime.bus_manager:
|
|
512
|
+
try:
|
|
513
|
+
logger.debug("Stopping multi-service sink...")
|
|
514
|
+
await asyncio.wait_for(runtime.bus_manager.stop(), timeout=10.0)
|
|
515
|
+
logger.debug("Multi-service sink stopped.")
|
|
516
|
+
except asyncio.TimeoutError:
|
|
517
|
+
logger.error("Timeout stopping multi-service sink after 10 seconds")
|
|
518
|
+
except Exception as e:
|
|
519
|
+
logger.error(f"Error stopping multi-service sink: {e}")
|
|
520
|
+
|
|
521
|
+
# Stop all adapters
|
|
522
|
+
logger.debug(f"Stopping {len(runtime.adapters)} adapters...")
|
|
523
|
+
adapter_stop_results = await asyncio.gather(
|
|
524
|
+
*(adapter.stop() for adapter in runtime.adapters if hasattr(adapter, "stop")), return_exceptions=True
|
|
525
|
+
)
|
|
526
|
+
|
|
527
|
+
for i, stop_result in enumerate(adapter_stop_results):
|
|
528
|
+
if isinstance(stop_result, Exception):
|
|
529
|
+
logger.error(
|
|
530
|
+
f"Error stopping adapter {runtime.adapters[i].__class__.__name__}: {stop_result}", exc_info=stop_result
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
logger.debug("Adapters stopped.")
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
async def preserve_critical_system_state(runtime: Any) -> None:
|
|
537
|
+
"""Preserve essential state before shutdown."""
|
|
538
|
+
logger = logging.getLogger(__name__)
|
|
539
|
+
|
|
540
|
+
# Preserve agent continuity if identity exists
|
|
541
|
+
if hasattr(runtime, "agent_identity") and runtime.agent_identity:
|
|
542
|
+
try:
|
|
543
|
+
await runtime._preserve_shutdown_continuity()
|
|
544
|
+
logger.info("Agent continuity preserved successfully")
|
|
545
|
+
except Exception as e:
|
|
546
|
+
logger.error(f"Failed to preserve continuity during shutdown: {e}")
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
async def finalize_shutdown_logging(_: Any) -> None:
|
|
550
|
+
"""Complete logging and audit trail for shutdown."""
|
|
551
|
+
import logging
|
|
552
|
+
|
|
553
|
+
logger = logging.getLogger(__name__)
|
|
554
|
+
|
|
555
|
+
# Execute shutdown manager handlers
|
|
556
|
+
from ciris_engine.logic.utils.shutdown_manager import get_shutdown_manager
|
|
557
|
+
|
|
558
|
+
shutdown_manager = get_shutdown_manager()
|
|
559
|
+
|
|
560
|
+
try:
|
|
561
|
+
await shutdown_manager.execute_async_handlers()
|
|
562
|
+
logger.info("Shutdown handlers executed successfully")
|
|
563
|
+
except Exception as e:
|
|
564
|
+
logger.error(f"Error executing shutdown handlers: {e}")
|
|
565
|
+
|
|
566
|
+
logger.info("CIRIS Runtime shutdown complete")
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
async def cleanup_runtime_resources(runtime: Any) -> None:
|
|
570
|
+
"""Release all runtime resources and connections."""
|
|
571
|
+
import logging
|
|
572
|
+
|
|
573
|
+
logger = logging.getLogger(__name__)
|
|
574
|
+
|
|
575
|
+
# Clear service registry
|
|
576
|
+
if runtime.service_registry:
|
|
577
|
+
try:
|
|
578
|
+
runtime.service_registry.clear_all()
|
|
579
|
+
logger.debug("Service registry cleared.")
|
|
580
|
+
except Exception as e:
|
|
581
|
+
logger.error(f"Error clearing service registry: {e}")
|
|
582
|
+
|
|
583
|
+
# Ensure shutdown event is set
|
|
584
|
+
runtime._ensure_shutdown_event()
|
|
585
|
+
if runtime._shutdown_event:
|
|
586
|
+
runtime._shutdown_event.set()
|
|
587
|
+
logger.debug("Shutdown event set.")
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def validate_shutdown_completion(runtime: Any) -> None:
|
|
591
|
+
"""Verify complete and clean shutdown."""
|
|
592
|
+
import logging
|
|
593
|
+
|
|
594
|
+
logger = logging.getLogger(__name__)
|
|
595
|
+
|
|
596
|
+
# Mark shutdown as truly complete
|
|
597
|
+
runtime._shutdown_complete = True
|
|
598
|
+
|
|
599
|
+
# Set shutdown event if it exists
|
|
600
|
+
if hasattr(runtime, "_shutdown_event"):
|
|
601
|
+
runtime._shutdown_event.set()
|
|
602
|
+
|
|
603
|
+
logger.info("Shutdown completion validated and marked")
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
# ============================================================================
|
|
607
|
+
# RUN HELPERS (CC 32 -> CC ~6) - 6 helpers
|
|
608
|
+
# ============================================================================
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def initialize_runtime_execution_context(runtime: Any) -> None:
|
|
612
|
+
"""Initialize the runtime for execution if not already done."""
|
|
613
|
+
if not runtime._initialized:
|
|
614
|
+
raise RuntimeError("Runtime must be initialized before execution")
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
def setup_runtime_monitoring_tasks(runtime: Any) -> Tuple[Optional[Any], List[Any], List[Any]]:
|
|
618
|
+
"""Set up monitoring tasks for agent and adapters."""
|
|
619
|
+
from ciris_engine.logic.setup.first_run import is_first_run
|
|
620
|
+
|
|
621
|
+
# Get adapter tasks
|
|
622
|
+
adapter_tasks = getattr(runtime, "_adapter_tasks", [])
|
|
623
|
+
if not adapter_tasks:
|
|
624
|
+
logger.warning("No adapter tasks found - this may indicate a problem with initialization")
|
|
625
|
+
return None, [], []
|
|
626
|
+
|
|
627
|
+
logger.info(f"Monitoring {len(adapter_tasks)} adapter lifecycle tasks...")
|
|
628
|
+
|
|
629
|
+
# Find the agent task
|
|
630
|
+
agent_task = None
|
|
631
|
+
for task in asyncio.all_tasks():
|
|
632
|
+
if task.get_name() == "AgentProcessorTask":
|
|
633
|
+
agent_task = task
|
|
634
|
+
break
|
|
635
|
+
|
|
636
|
+
# In first-run mode, there is no agent task - just monitor adapters
|
|
637
|
+
first_run = is_first_run()
|
|
638
|
+
if not agent_task and not first_run:
|
|
639
|
+
raise RuntimeError("Agent processor task not found - initialization may have failed")
|
|
640
|
+
|
|
641
|
+
if first_run and not agent_task:
|
|
642
|
+
logger.info("First-run mode: Monitoring adapters only (no agent processor)")
|
|
643
|
+
|
|
644
|
+
# Set up monitoring tasks
|
|
645
|
+
runtime._ensure_shutdown_event()
|
|
646
|
+
shutdown_event_task = None
|
|
647
|
+
if runtime._shutdown_event:
|
|
648
|
+
shutdown_event_task = asyncio.create_task(runtime._shutdown_event.wait(), name="ShutdownEventWait")
|
|
649
|
+
|
|
650
|
+
global_shutdown_task = asyncio.create_task(wait_for_global_shutdown_async(), name="GlobalShutdownWait")
|
|
651
|
+
|
|
652
|
+
# Build task list - only include agent_task if it exists
|
|
653
|
+
all_tasks = [*adapter_tasks, global_shutdown_task]
|
|
654
|
+
if agent_task:
|
|
655
|
+
all_tasks.insert(0, agent_task)
|
|
656
|
+
if shutdown_event_task:
|
|
657
|
+
all_tasks.append(shutdown_event_task)
|
|
658
|
+
|
|
659
|
+
return agent_task, adapter_tasks, all_tasks
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def monitor_runtime_shutdown_signals(runtime: Any, shutdown_logged: bool) -> bool:
|
|
663
|
+
"""Monitor and handle shutdown signals, returns updated shutdown_logged flag."""
|
|
664
|
+
if (runtime._shutdown_event and runtime._shutdown_event.is_set()) or is_global_shutdown_requested():
|
|
665
|
+
if not shutdown_logged:
|
|
666
|
+
shutdown_reason = (
|
|
667
|
+
runtime._shutdown_reason or runtime._shutdown_manager.get_shutdown_reason() or "Unknown reason"
|
|
668
|
+
)
|
|
669
|
+
logger.critical(f"GRACEFUL SHUTDOWN TRIGGERED: {shutdown_reason}")
|
|
670
|
+
return True # Now logged
|
|
671
|
+
return shutdown_logged
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
def handle_runtime_agent_task_completion(runtime: Any, agent_task: Any, adapter_tasks: List[Any]) -> None:
|
|
675
|
+
"""Handle agent task completion and initiate adapter cleanup."""
|
|
676
|
+
logger.info(
|
|
677
|
+
f"Agent processing task completed. Result: {agent_task.result() if not agent_task.cancelled() else 'Cancelled'}"
|
|
678
|
+
)
|
|
679
|
+
# Signal shutdown for adapters
|
|
680
|
+
runtime.request_shutdown("Agent processing completed normally.")
|
|
681
|
+
for ad_task in adapter_tasks:
|
|
682
|
+
if not ad_task.done():
|
|
683
|
+
ad_task.cancel()
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
def handle_runtime_task_failures(runtime: Any, done_tasks: Set[Any], excluded_tasks: Set[Any]) -> None:
|
|
687
|
+
"""Handle completed tasks and failures, excluding monitoring tasks."""
|
|
688
|
+
for task in done_tasks:
|
|
689
|
+
if task not in excluded_tasks:
|
|
690
|
+
task_name = task.get_name() if hasattr(task, "get_name") else "Unnamed task"
|
|
691
|
+
logger.info(
|
|
692
|
+
f"Task '{task_name}' completed. Result: {task.result() if not task.cancelled() else 'Cancelled'}"
|
|
693
|
+
)
|
|
694
|
+
if task.exception():
|
|
695
|
+
logger.error(
|
|
696
|
+
f"Task '{task_name}' raised an exception: {task.exception()}",
|
|
697
|
+
exc_info=task.exception(),
|
|
698
|
+
)
|
|
699
|
+
runtime.request_shutdown(f"Task {task_name} failed: {task.exception()}")
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
async def finalize_runtime_execution(runtime: Any, pending_tasks: Set[Any]) -> None:
|
|
703
|
+
"""Finalize runtime execution by cleaning up tasks and handlers."""
|
|
704
|
+
# Await all pending tasks
|
|
705
|
+
if pending_tasks:
|
|
706
|
+
await asyncio.wait(pending_tasks, return_when=asyncio.ALL_COMPLETED)
|
|
707
|
+
|
|
708
|
+
# Execute any pending global shutdown handlers
|
|
709
|
+
if (runtime._shutdown_event and runtime._shutdown_event.is_set()) or is_global_shutdown_requested():
|
|
710
|
+
await runtime._shutdown_manager.execute_async_handlers()
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
# ============================================================================
|
|
714
|
+
# ADAPTER CONNECTION HELPERS (CC 23 -> CC ~6) - 4 helpers
|
|
715
|
+
# ============================================================================
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def log_adapter_configuration_details(adapters: List[Any]) -> None:
|
|
719
|
+
"""Log detailed configuration for each adapter."""
|
|
720
|
+
logger.info("Starting adapter connections...")
|
|
721
|
+
|
|
722
|
+
for adapter in adapters:
|
|
723
|
+
adapter_name = adapter.__class__.__name__
|
|
724
|
+
|
|
725
|
+
# Report adapter details for Discord
|
|
726
|
+
if adapter_name == "DiscordPlatform" and hasattr(adapter, "config"):
|
|
727
|
+
config = adapter.config
|
|
728
|
+
logger.info(f" → {adapter_name} configuration:")
|
|
729
|
+
if hasattr(config, "monitored_channel_ids"):
|
|
730
|
+
logger.info(f" Monitored channels: {config.monitored_channel_ids}")
|
|
731
|
+
if hasattr(config, "server_id"):
|
|
732
|
+
logger.info(f" Target server: {config.server_id}")
|
|
733
|
+
if hasattr(config, "bot_token") and config.bot_token:
|
|
734
|
+
logger.info(f" Bot token: ...{config.bot_token[-10:]}")
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
def create_adapter_lifecycle_tasks(adapters: List[Any], agent_task: Any) -> List[Any]:
|
|
738
|
+
"""Create and start adapter lifecycle tasks."""
|
|
739
|
+
logger.info("Creating agent processor task...")
|
|
740
|
+
|
|
741
|
+
adapter_tasks = []
|
|
742
|
+
for adapter in adapters:
|
|
743
|
+
adapter_name = adapter.__class__.__name__
|
|
744
|
+
|
|
745
|
+
if hasattr(adapter, "run_lifecycle"):
|
|
746
|
+
lifecycle_task = asyncio.create_task(adapter.run_lifecycle(agent_task), name=f"{adapter_name}LifecycleTask")
|
|
747
|
+
adapter_tasks.append(lifecycle_task)
|
|
748
|
+
logger.info(f" → Starting {adapter_name} lifecycle...")
|
|
749
|
+
|
|
750
|
+
return adapter_tasks
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
async def _check_adapter_health(adapter: Any) -> bool:
|
|
754
|
+
"""Check health of a single adapter."""
|
|
755
|
+
adapter_name = adapter.__class__.__name__
|
|
756
|
+
if "Discord" not in adapter_name:
|
|
757
|
+
return True
|
|
758
|
+
|
|
759
|
+
if not hasattr(adapter, "is_healthy"):
|
|
760
|
+
logger.warning(f" ⚠️ {adapter_name} has no is_healthy method")
|
|
761
|
+
return False
|
|
762
|
+
|
|
763
|
+
try:
|
|
764
|
+
is_healthy = await adapter.is_healthy()
|
|
765
|
+
if not is_healthy:
|
|
766
|
+
logger.debug(f" ⏳ {adapter_name} not yet healthy, waiting...")
|
|
767
|
+
return False
|
|
768
|
+
else:
|
|
769
|
+
logger.info(f" ✓ {adapter_name} is healthy and connected")
|
|
770
|
+
return True
|
|
771
|
+
except Exception as e:
|
|
772
|
+
logger.debug(f" ⏳ {adapter_name} health check failed: {e}")
|
|
773
|
+
return False
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
async def wait_for_adapter_readiness(adapters: List[Any]) -> bool:
|
|
777
|
+
"""Wait for all adapters to be ready and healthy."""
|
|
778
|
+
logger.info(" ⏳ Waiting for adapter connections to establish...")
|
|
779
|
+
|
|
780
|
+
try:
|
|
781
|
+
async with _async_timeout(30.0):
|
|
782
|
+
while True:
|
|
783
|
+
health_checks = [_check_adapter_health(adapter) for adapter in adapters]
|
|
784
|
+
health_results = await asyncio.gather(*health_checks)
|
|
785
|
+
|
|
786
|
+
if all(health_results):
|
|
787
|
+
return True
|
|
788
|
+
|
|
789
|
+
await asyncio.sleep(0.5)
|
|
790
|
+
except asyncio.TimeoutError:
|
|
791
|
+
return False
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
async def verify_adapter_service_registration(runtime: Any) -> bool:
|
|
795
|
+
"""Verify that adapter services are properly registered and available."""
|
|
796
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
797
|
+
|
|
798
|
+
logger.info(" → Registering adapter services...")
|
|
799
|
+
await runtime._register_adapter_services()
|
|
800
|
+
|
|
801
|
+
# Give services a moment to settle after registration
|
|
802
|
+
await asyncio.sleep(0.1)
|
|
803
|
+
|
|
804
|
+
try:
|
|
805
|
+
async with _async_timeout(30.0):
|
|
806
|
+
while True:
|
|
807
|
+
# Check if services are actually available
|
|
808
|
+
if runtime.service_registry:
|
|
809
|
+
try:
|
|
810
|
+
test_service = await runtime.service_registry.get_service(
|
|
811
|
+
handler="test",
|
|
812
|
+
service_type=ServiceType.COMMUNICATION,
|
|
813
|
+
required_capabilities=["send_message"],
|
|
814
|
+
)
|
|
815
|
+
if test_service:
|
|
816
|
+
logger.info(" ✅ All adapters connected and services registered!")
|
|
817
|
+
return True
|
|
818
|
+
except Exception as e:
|
|
819
|
+
logger.debug(f"Service registration check failed: {e}")
|
|
820
|
+
|
|
821
|
+
await asyncio.sleep(0.5)
|
|
822
|
+
except asyncio.TimeoutError:
|
|
823
|
+
return False
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
# ============================================================================
|
|
827
|
+
# CRITICAL SERVICES HELPERS (CC 18 -> CC ~6) - 3 helpers
|
|
828
|
+
# ============================================================================
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
def identify_critical_service_dependencies() -> None:
|
|
832
|
+
"""Determine critical services and dependency order"""
|
|
833
|
+
pass
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
def execute_critical_service_health_checks() -> None:
|
|
837
|
+
"""Perform comprehensive health validation"""
|
|
838
|
+
pass
|
|
839
|
+
|
|
840
|
+
|
|
841
|
+
def handle_critical_service_failures() -> None:
|
|
842
|
+
"""Implement failure recovery for critical services"""
|
|
843
|
+
pass
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
# ============================================================================
|
|
847
|
+
# SERVICE REGISTRATION HELPERS (CC 13 -> CC ~5) - 3 helpers
|
|
848
|
+
# ============================================================================
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
def prepare_service_registration_context() -> None:
|
|
852
|
+
"""Set up context for service registration"""
|
|
853
|
+
pass
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
def execute_service_registration_workflow() -> None:
|
|
857
|
+
"""Register services with proper dependency handling"""
|
|
858
|
+
pass
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
def validate_service_registration_integrity() -> None:
|
|
862
|
+
"""Verify successful service registration"""
|
|
863
|
+
pass
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
# ============================================================================
|
|
867
|
+
# CONTINUITY AWARENESS HELPERS (CC 11 -> CC ~6) - 2 helpers
|
|
868
|
+
# ============================================================================
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
def capture_runtime_continuity_state() -> None:
|
|
872
|
+
"""Capture current continuity and cognitive state"""
|
|
873
|
+
pass
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
def persist_continuity_for_recovery() -> None:
|
|
877
|
+
"""Store continuity state for future recovery"""
|
|
878
|
+
pass
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
# ============================================================================
|
|
882
|
+
# COMMON RUNTIME UTILITIES - 8 additional helpers
|
|
883
|
+
# ============================================================================
|
|
884
|
+
|
|
885
|
+
|
|
886
|
+
def validate_runtime_configuration() -> None:
|
|
887
|
+
"""Comprehensive runtime configuration validation"""
|
|
888
|
+
pass
|
|
889
|
+
|
|
890
|
+
|
|
891
|
+
def create_runtime_error_context() -> None:
|
|
892
|
+
"""Create structured error context for debugging"""
|
|
893
|
+
pass
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
def measure_runtime_performance_metrics() -> None:
|
|
897
|
+
"""Collect and analyze runtime performance data"""
|
|
898
|
+
pass
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
def handle_runtime_resource_limits() -> None:
|
|
902
|
+
"""Monitor and enforce resource constraints"""
|
|
903
|
+
pass
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
def synchronize_runtime_state_transitions() -> None:
|
|
907
|
+
"""Ensure thread-safe state transitions"""
|
|
908
|
+
pass
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
def audit_runtime_operations() -> None:
|
|
912
|
+
"""Create audit trail for runtime operations"""
|
|
913
|
+
pass
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
def optimize_runtime_memory_usage() -> None:
|
|
917
|
+
"""Manage memory allocation and cleanup"""
|
|
918
|
+
pass
|
|
919
|
+
|
|
920
|
+
|
|
921
|
+
def coordinate_runtime_service_lifecycle() -> None:
|
|
922
|
+
"""Orchestrate service start/stop sequences"""
|
|
923
|
+
pass
|