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,378 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shutdown Service for CIRIS Trinity Architecture.
|
|
3
|
+
|
|
4
|
+
Manages graceful shutdown coordination across the system.
|
|
5
|
+
This replaces the shutdown_manager.py utility with a proper service.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import logging
|
|
10
|
+
from threading import Lock
|
|
11
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
from ciris_engine.logic.services.base_infrastructure_service import BaseInfrastructureService
|
|
14
|
+
from ciris_engine.protocols.services import ShutdownServiceProtocol
|
|
15
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
16
|
+
from ciris_engine.schemas.services.core import ServiceCapabilities
|
|
17
|
+
from ciris_engine.schemas.services.metadata import ServiceMetadata
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ShutdownService(BaseInfrastructureService, ShutdownServiceProtocol):
|
|
23
|
+
"""Service for coordinating graceful shutdown."""
|
|
24
|
+
|
|
25
|
+
def __init__(self) -> None:
|
|
26
|
+
"""Initialize the shutdown service."""
|
|
27
|
+
# Initialize base class without time_service (we ARE a critical infrastructure service)
|
|
28
|
+
super().__init__(service_name="ShutdownService", version="1.0.0")
|
|
29
|
+
|
|
30
|
+
# Shutdown-specific attributes
|
|
31
|
+
self._shutdown_requested = False
|
|
32
|
+
self._shutdown_reason: Optional[str] = None
|
|
33
|
+
self._shutdown_handlers: List[Callable[[], None]] = []
|
|
34
|
+
self._async_shutdown_handlers: List[Callable[[], Awaitable[None]]] = []
|
|
35
|
+
self._lock = Lock()
|
|
36
|
+
self._shutdown_event: Optional[asyncio.Event] = None
|
|
37
|
+
self._emergency_mode = False
|
|
38
|
+
self._force_kill_task: Optional[asyncio.Task[Any]] = None
|
|
39
|
+
|
|
40
|
+
# v1.4.3 metric tracking
|
|
41
|
+
self._shutdown_requests_total = 0
|
|
42
|
+
self._shutdown_graceful_total = 0
|
|
43
|
+
self._shutdown_emergency_total = 0
|
|
44
|
+
|
|
45
|
+
async def start(self) -> None:
|
|
46
|
+
"""Start the service."""
|
|
47
|
+
await super().start()
|
|
48
|
+
try:
|
|
49
|
+
# Create shutdown event if in async context
|
|
50
|
+
self._shutdown_event = asyncio.Event()
|
|
51
|
+
except RuntimeError:
|
|
52
|
+
# Not in async context yet
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
async def stop(self) -> None:
|
|
56
|
+
"""Stop the service."""
|
|
57
|
+
await super().stop()
|
|
58
|
+
|
|
59
|
+
# Required abstract methods from BaseService
|
|
60
|
+
|
|
61
|
+
def get_service_type(self) -> ServiceType:
|
|
62
|
+
"""Get the service type enum value."""
|
|
63
|
+
return ServiceType.SHUTDOWN
|
|
64
|
+
|
|
65
|
+
def _get_actions(self) -> List[str]:
|
|
66
|
+
"""Get list of actions this service provides."""
|
|
67
|
+
return [
|
|
68
|
+
"request_shutdown",
|
|
69
|
+
"register_shutdown_handler",
|
|
70
|
+
"is_shutdown_requested",
|
|
71
|
+
"get_shutdown_reason",
|
|
72
|
+
"emergency_shutdown",
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
def _check_dependencies(self) -> bool:
|
|
76
|
+
"""Check if all required dependencies are available."""
|
|
77
|
+
# ShutdownService has no dependencies
|
|
78
|
+
return True
|
|
79
|
+
|
|
80
|
+
def get_capabilities(self) -> ServiceCapabilities:
|
|
81
|
+
"""Get service capabilities with custom metadata."""
|
|
82
|
+
# Get metadata from parent's _get_metadata()
|
|
83
|
+
service_metadata = self._get_metadata()
|
|
84
|
+
|
|
85
|
+
# Set infrastructure-specific fields
|
|
86
|
+
if service_metadata:
|
|
87
|
+
service_metadata.category = "infrastructure"
|
|
88
|
+
service_metadata.critical = True
|
|
89
|
+
service_metadata.description = "Coordinates graceful system shutdown"
|
|
90
|
+
|
|
91
|
+
return ServiceCapabilities(
|
|
92
|
+
service_name=self.service_name,
|
|
93
|
+
actions=self._get_actions(),
|
|
94
|
+
version=self._version,
|
|
95
|
+
dependencies=list(self._dependencies),
|
|
96
|
+
metadata=service_metadata,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
def _collect_custom_metrics(self) -> Dict[str, float]:
|
|
100
|
+
"""Collect shutdown-specific metrics."""
|
|
101
|
+
metrics = super()._collect_custom_metrics()
|
|
102
|
+
|
|
103
|
+
with self._lock:
|
|
104
|
+
handler_count = len(self._shutdown_handlers) + len(self._async_shutdown_handlers)
|
|
105
|
+
|
|
106
|
+
metrics.update(
|
|
107
|
+
{
|
|
108
|
+
"shutdown_requested": float(self._shutdown_requested),
|
|
109
|
+
"registered_handlers": float(handler_count),
|
|
110
|
+
"emergency_mode": float(self._emergency_mode),
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
return metrics
|
|
115
|
+
|
|
116
|
+
async def get_metrics(self) -> Dict[str, float]:
|
|
117
|
+
"""
|
|
118
|
+
Get all shutdown service metrics including base, custom, and v1.4.3 specific.
|
|
119
|
+
"""
|
|
120
|
+
# Get all base + custom metrics
|
|
121
|
+
metrics = self._collect_metrics()
|
|
122
|
+
|
|
123
|
+
with self._lock:
|
|
124
|
+
shutdown_requests_total = float(self._shutdown_requests_total)
|
|
125
|
+
shutdown_graceful_total = float(self._shutdown_graceful_total)
|
|
126
|
+
shutdown_emergency_total = float(self._shutdown_emergency_total)
|
|
127
|
+
|
|
128
|
+
# Calculate uptime from base service
|
|
129
|
+
shutdown_uptime_seconds = self._calculate_uptime()
|
|
130
|
+
|
|
131
|
+
# Add v1.4.3 specific metrics
|
|
132
|
+
metrics.update(
|
|
133
|
+
{
|
|
134
|
+
"shutdown_requests_total": shutdown_requests_total,
|
|
135
|
+
"shutdown_graceful_total": shutdown_graceful_total,
|
|
136
|
+
"shutdown_emergency_total": shutdown_emergency_total,
|
|
137
|
+
"shutdown_uptime_seconds": shutdown_uptime_seconds,
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
return metrics
|
|
142
|
+
|
|
143
|
+
async def request_shutdown(self, reason: str) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Request system shutdown (async version).
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
reason: Human-readable reason for shutdown
|
|
149
|
+
"""
|
|
150
|
+
# Call the sync version but ensure it's properly awaitable
|
|
151
|
+
self._request_shutdown_sync(reason)
|
|
152
|
+
# No need to return anything - this method is async void
|
|
153
|
+
|
|
154
|
+
def _request_shutdown_sync(self, reason: str) -> None:
|
|
155
|
+
"""
|
|
156
|
+
Request system shutdown (sync version).
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
reason: Human-readable reason for shutdown
|
|
160
|
+
"""
|
|
161
|
+
with self._lock:
|
|
162
|
+
if self._shutdown_requested:
|
|
163
|
+
logger.debug(f"Shutdown already requested, ignoring duplicate: {reason}")
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
self._shutdown_requested = True
|
|
167
|
+
self._shutdown_reason = reason
|
|
168
|
+
self._shutdown_requests_total += 1
|
|
169
|
+
self._shutdown_graceful_total += 1
|
|
170
|
+
|
|
171
|
+
logger.critical(f"SYSTEM SHUTDOWN REQUESTED: {reason}")
|
|
172
|
+
|
|
173
|
+
# Set event if available
|
|
174
|
+
if self._shutdown_event:
|
|
175
|
+
self._shutdown_event.set()
|
|
176
|
+
|
|
177
|
+
# Execute sync handlers
|
|
178
|
+
self._execute_sync_handlers()
|
|
179
|
+
|
|
180
|
+
def register_shutdown_handler(self, handler: Callable[[], None]) -> None:
|
|
181
|
+
"""
|
|
182
|
+
Register a shutdown handler.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
handler: Function to call during shutdown
|
|
186
|
+
"""
|
|
187
|
+
with self._lock:
|
|
188
|
+
self._shutdown_handlers.append(handler)
|
|
189
|
+
logger.debug(f"Registered shutdown handler: {handler.__name__}")
|
|
190
|
+
|
|
191
|
+
def _register_async_shutdown_handler(self, handler: Callable[[], Awaitable[None]]) -> None:
|
|
192
|
+
"""
|
|
193
|
+
Register an async shutdown handler (internal method).
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
handler: Async function to call during shutdown
|
|
197
|
+
"""
|
|
198
|
+
with self._lock:
|
|
199
|
+
self._async_shutdown_handlers.append(handler)
|
|
200
|
+
logger.debug(f"Registered async shutdown handler: {handler.__name__}")
|
|
201
|
+
|
|
202
|
+
def is_shutdown_requested(self) -> bool:
|
|
203
|
+
"""Check if shutdown has been requested."""
|
|
204
|
+
return self._shutdown_requested
|
|
205
|
+
|
|
206
|
+
def is_force_shutdown(self) -> bool:
|
|
207
|
+
"""Check if this is a forced/emergency shutdown."""
|
|
208
|
+
with self._lock:
|
|
209
|
+
return self._emergency_mode
|
|
210
|
+
|
|
211
|
+
async def _wait_for_shutdown(self) -> None:
|
|
212
|
+
"""Wait for shutdown signal (async) - internal method."""
|
|
213
|
+
if not self._shutdown_event:
|
|
214
|
+
# Create event if not exists
|
|
215
|
+
self._shutdown_event = asyncio.Event()
|
|
216
|
+
|
|
217
|
+
# If shutdown already requested, set the event
|
|
218
|
+
if self._shutdown_requested:
|
|
219
|
+
self._shutdown_event.set()
|
|
220
|
+
|
|
221
|
+
await self._shutdown_event.wait()
|
|
222
|
+
|
|
223
|
+
def get_shutdown_reason(self) -> Optional[str]:
|
|
224
|
+
"""Get the reason for shutdown."""
|
|
225
|
+
return self._shutdown_reason
|
|
226
|
+
|
|
227
|
+
def _execute_sync_handlers(self) -> None:
|
|
228
|
+
"""Execute all registered synchronous shutdown handlers."""
|
|
229
|
+
with self._lock:
|
|
230
|
+
handlers = self._shutdown_handlers.copy()
|
|
231
|
+
|
|
232
|
+
for handler in handlers:
|
|
233
|
+
try:
|
|
234
|
+
handler()
|
|
235
|
+
logger.debug(f"Executed shutdown handler: {handler.__name__}")
|
|
236
|
+
except Exception as e:
|
|
237
|
+
logger.error(f"Error in shutdown handler {handler.__name__}: {e}")
|
|
238
|
+
|
|
239
|
+
async def _execute_async_handlers(self) -> None:
|
|
240
|
+
"""Execute all registered asynchronous shutdown handlers - internal method."""
|
|
241
|
+
with self._lock:
|
|
242
|
+
handlers = self._async_shutdown_handlers.copy()
|
|
243
|
+
|
|
244
|
+
for handler in handlers:
|
|
245
|
+
try:
|
|
246
|
+
if asyncio.iscoroutinefunction(handler):
|
|
247
|
+
await handler()
|
|
248
|
+
else:
|
|
249
|
+
handler()
|
|
250
|
+
logger.debug(f"Executed async shutdown handler: {handler.__name__}")
|
|
251
|
+
except Exception as e:
|
|
252
|
+
logger.error(f"Error in async shutdown handler {handler.__name__}: {e}")
|
|
253
|
+
|
|
254
|
+
def wait_for_shutdown(self) -> None:
|
|
255
|
+
"""Wait for shutdown to be requested (blocking)."""
|
|
256
|
+
import time
|
|
257
|
+
|
|
258
|
+
while not self._shutdown_requested:
|
|
259
|
+
time.sleep(0.1)
|
|
260
|
+
|
|
261
|
+
async def wait_for_shutdown_async(self) -> None:
|
|
262
|
+
"""Wait for shutdown to be requested (async)."""
|
|
263
|
+
await self._wait_for_shutdown()
|
|
264
|
+
|
|
265
|
+
async def emergency_shutdown(self, reason: str, timeout_seconds: int = 5) -> None:
|
|
266
|
+
"""
|
|
267
|
+
Execute emergency shutdown without negotiation.
|
|
268
|
+
|
|
269
|
+
This method is used by the emergency shutdown endpoint to force
|
|
270
|
+
immediate system termination with minimal cleanup.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
reason: Why emergency shutdown was triggered
|
|
274
|
+
timeout_seconds: Grace period before force kill (default 5s)
|
|
275
|
+
"""
|
|
276
|
+
logger.critical(f"EMERGENCY SHUTDOWN: {reason}")
|
|
277
|
+
|
|
278
|
+
# Set emergency flags
|
|
279
|
+
self._set_emergency_flags(reason)
|
|
280
|
+
|
|
281
|
+
# Set shutdown event immediately
|
|
282
|
+
if self._shutdown_event:
|
|
283
|
+
self._shutdown_event.set()
|
|
284
|
+
|
|
285
|
+
# Notify all handlers with timeout
|
|
286
|
+
await self._execute_handlers_with_timeout(timeout_seconds)
|
|
287
|
+
|
|
288
|
+
# Start force kill timer
|
|
289
|
+
self._force_kill_task = asyncio.create_task(self._force_kill_after_timeout(timeout_seconds))
|
|
290
|
+
|
|
291
|
+
# Try graceful exit first
|
|
292
|
+
logger.info("Attempting graceful exit...")
|
|
293
|
+
import sys
|
|
294
|
+
|
|
295
|
+
sys.exit(1)
|
|
296
|
+
|
|
297
|
+
def _set_emergency_flags(self, reason: str) -> None:
|
|
298
|
+
"""Set emergency shutdown flags and update metrics."""
|
|
299
|
+
with self._lock:
|
|
300
|
+
self._shutdown_requested = True
|
|
301
|
+
self._shutdown_reason = f"EMERGENCY: {reason}"
|
|
302
|
+
self._emergency_mode = True
|
|
303
|
+
self._shutdown_requests_total += 1
|
|
304
|
+
self._shutdown_emergency_total += 1
|
|
305
|
+
|
|
306
|
+
async def _execute_handlers_with_timeout(self, timeout_seconds: int) -> None:
|
|
307
|
+
"""Execute shutdown handlers with timeout protection."""
|
|
308
|
+
try:
|
|
309
|
+
# Execute sync handlers first (quick)
|
|
310
|
+
self._execute_sync_handlers()
|
|
311
|
+
|
|
312
|
+
# Execute async handlers with timeout
|
|
313
|
+
await asyncio.wait_for(
|
|
314
|
+
self._execute_async_handlers(), timeout=timeout_seconds / 2 # Use half timeout for handlers
|
|
315
|
+
)
|
|
316
|
+
except asyncio.TimeoutError:
|
|
317
|
+
logger.warning("Emergency shutdown handlers timed out")
|
|
318
|
+
except Exception as e:
|
|
319
|
+
logger.error(f"Error during emergency shutdown: {e}")
|
|
320
|
+
|
|
321
|
+
async def _force_kill_after_timeout(self, timeout_seconds: int) -> None:
|
|
322
|
+
"""Force process termination after timeout period."""
|
|
323
|
+
await asyncio.sleep(timeout_seconds)
|
|
324
|
+
logger.critical("Emergency shutdown timeout reached - forcing termination")
|
|
325
|
+
|
|
326
|
+
import os
|
|
327
|
+
import signal
|
|
328
|
+
|
|
329
|
+
# Safety check: only kill our own process
|
|
330
|
+
pid = os.getpid()
|
|
331
|
+
logger.critical(f"Sending SIGKILL to process {pid}")
|
|
332
|
+
|
|
333
|
+
self._send_kill_signal(pid, signal)
|
|
334
|
+
|
|
335
|
+
def _send_kill_signal(self, pid: int, signal: Any) -> None:
|
|
336
|
+
"""Send kill signal to process with platform-specific handling."""
|
|
337
|
+
try:
|
|
338
|
+
self._try_primary_signal(pid, signal)
|
|
339
|
+
except (OSError, AttributeError) as e:
|
|
340
|
+
logger.error(f"Failed to force kill process: {e}")
|
|
341
|
+
self._try_fallback_signal(pid, signal)
|
|
342
|
+
|
|
343
|
+
def _try_primary_signal(self, pid: int, signal: Any) -> None:
|
|
344
|
+
"""Try to send primary kill signal (SIGKILL or SIGTERM)."""
|
|
345
|
+
import os
|
|
346
|
+
|
|
347
|
+
# Use platform-specific signals
|
|
348
|
+
# SIGKILL doesn't exist on Windows - use SIGTERM or sys.exit
|
|
349
|
+
if hasattr(signal, "SIGKILL"):
|
|
350
|
+
# NOSONAR: Safe - only sending signal to our own process (os.getpid())
|
|
351
|
+
os.kill(pid, signal.SIGKILL) # NOSONAR python:S4828
|
|
352
|
+
elif hasattr(signal, "SIGTERM"):
|
|
353
|
+
# NOSONAR: Safe - only sending signal to our own process (os.getpid())
|
|
354
|
+
os.kill(pid, signal.SIGTERM) # NOSONAR python:S4828
|
|
355
|
+
else:
|
|
356
|
+
# Windows fallback - just exit
|
|
357
|
+
import sys
|
|
358
|
+
|
|
359
|
+
sys.exit(1)
|
|
360
|
+
|
|
361
|
+
def _try_fallback_signal(self, pid: int, signal: Any) -> None:
|
|
362
|
+
"""Try fallback kill signal if primary fails."""
|
|
363
|
+
import os
|
|
364
|
+
|
|
365
|
+
try:
|
|
366
|
+
if hasattr(signal, "SIGTERM"):
|
|
367
|
+
# NOSONAR: Safe - only sending signal to our own process (os.getpid())
|
|
368
|
+
os.kill(pid, signal.SIGTERM) # NOSONAR python:S4828
|
|
369
|
+
else:
|
|
370
|
+
# Windows fallback
|
|
371
|
+
import sys
|
|
372
|
+
|
|
373
|
+
sys.exit(1)
|
|
374
|
+
except (OSError, AttributeError):
|
|
375
|
+
# Last resort
|
|
376
|
+
import sys
|
|
377
|
+
|
|
378
|
+
sys.exit(1)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Time Service Module.
|
|
3
|
+
|
|
4
|
+
Provides centralized time operations that are:
|
|
5
|
+
- Mockable for testing
|
|
6
|
+
- Timezone-aware (always UTC)
|
|
7
|
+
- Consistent across the system
|
|
8
|
+
- No direct datetime.now() usage allowed
|
|
9
|
+
|
|
10
|
+
This replaces the time_utils.py utility with a proper service.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from .service import TimeService
|
|
14
|
+
|
|
15
|
+
__all__ = ["TimeService"]
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Secure Time Service for CIRIS Trinity Architecture.
|
|
3
|
+
|
|
4
|
+
Provides centralized time operations that are:
|
|
5
|
+
- Mockable for testing
|
|
6
|
+
- Timezone-aware (always UTC)
|
|
7
|
+
- Consistent across the system
|
|
8
|
+
- No direct datetime.now() usage allowed
|
|
9
|
+
|
|
10
|
+
This replaces the time_utils.py utility with a proper service.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from typing import Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from ciris_engine.logic.services.base_infrastructure_service import BaseInfrastructureService
|
|
18
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
19
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
20
|
+
from ciris_engine.schemas.services.core import ServiceCapabilities
|
|
21
|
+
from ciris_engine.schemas.services.metadata import ServiceMetadata
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TimeService(BaseInfrastructureService, TimeServiceProtocol):
|
|
27
|
+
"""Secure time service implementation."""
|
|
28
|
+
|
|
29
|
+
def __init__(self) -> None:
|
|
30
|
+
"""Initialize the time service."""
|
|
31
|
+
# Initialize base class without time_service (we ARE the time service)
|
|
32
|
+
super().__init__(service_name="TimeService", version="1.0.0")
|
|
33
|
+
self._start_time = datetime.now(timezone.utc)
|
|
34
|
+
|
|
35
|
+
# Metrics tracking
|
|
36
|
+
self._time_requests = 0
|
|
37
|
+
self._iso_requests = 0
|
|
38
|
+
self._timestamp_requests = 0
|
|
39
|
+
self._uptime_requests = 0
|
|
40
|
+
|
|
41
|
+
# NTP drift monitoring
|
|
42
|
+
self._ntp_offset_ms = 0.0 # Current offset in milliseconds
|
|
43
|
+
self._ntp_last_check: Optional[datetime] = None # Last time we checked NTP
|
|
44
|
+
self._ntp_check_interval = 3600 # Check every hour
|
|
45
|
+
self._ntp_check_count = 0
|
|
46
|
+
self._ntp_failures = 0
|
|
47
|
+
self._ntp_pools = ["pool.ntp.org", "0.pool.ntp.org", "1.pool.ntp.org", "time.nist.gov"]
|
|
48
|
+
|
|
49
|
+
# Required abstract methods from BaseService
|
|
50
|
+
|
|
51
|
+
def get_service_type(self) -> ServiceType:
|
|
52
|
+
"""Get the service type enum value."""
|
|
53
|
+
return ServiceType.TIME
|
|
54
|
+
|
|
55
|
+
def _get_actions(self) -> List[str]:
|
|
56
|
+
"""Get list of actions this service provides."""
|
|
57
|
+
return ["now", "now_iso", "timestamp"]
|
|
58
|
+
|
|
59
|
+
def _check_dependencies(self) -> bool:
|
|
60
|
+
"""Check if all required dependencies are available."""
|
|
61
|
+
# TimeService has no dependencies
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
def get_capabilities(self) -> ServiceCapabilities:
|
|
65
|
+
"""Get service capabilities with custom metadata."""
|
|
66
|
+
# Get metadata from parent's _get_metadata()
|
|
67
|
+
service_metadata = self._get_metadata()
|
|
68
|
+
|
|
69
|
+
# Set infrastructure-specific fields
|
|
70
|
+
if service_metadata:
|
|
71
|
+
service_metadata.category = "infrastructure"
|
|
72
|
+
service_metadata.critical = True
|
|
73
|
+
service_metadata.description = "Provides consistent UTC time operations"
|
|
74
|
+
|
|
75
|
+
return ServiceCapabilities(
|
|
76
|
+
service_name=self.service_name,
|
|
77
|
+
actions=self._get_actions(),
|
|
78
|
+
version=self._version,
|
|
79
|
+
dependencies=list(self._dependencies),
|
|
80
|
+
metadata=service_metadata,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Override _now to prevent circular dependency
|
|
84
|
+
def _now(self) -> datetime:
|
|
85
|
+
"""Get current time without using time service."""
|
|
86
|
+
return datetime.now(timezone.utc)
|
|
87
|
+
|
|
88
|
+
def _collect_custom_metrics(self) -> dict[str, float]:
|
|
89
|
+
"""Collect time service specific metrics."""
|
|
90
|
+
metrics: Dict[str, float] = super()._collect_custom_metrics()
|
|
91
|
+
|
|
92
|
+
# Check NTP drift if needed
|
|
93
|
+
self._check_ntp_drift_if_needed()
|
|
94
|
+
|
|
95
|
+
# Add time service metrics
|
|
96
|
+
metrics.update(
|
|
97
|
+
{
|
|
98
|
+
"time_requests": float(self._time_requests),
|
|
99
|
+
"iso_requests": float(self._iso_requests),
|
|
100
|
+
"timestamp_requests": float(self._timestamp_requests),
|
|
101
|
+
"uptime_requests": float(self._uptime_requests),
|
|
102
|
+
"total_requests": float(
|
|
103
|
+
self._time_requests + self._iso_requests + self._timestamp_requests + self._uptime_requests
|
|
104
|
+
),
|
|
105
|
+
"days_running": self.get_uptime() / 86400.0, # Convert to days
|
|
106
|
+
"time_drift_ms": self._ntp_offset_ms, # Real NTP drift in milliseconds
|
|
107
|
+
"ntp_check_count": float(self._ntp_check_count),
|
|
108
|
+
"ntp_failures": float(self._ntp_failures),
|
|
109
|
+
"timezone_offset": 0.0, # Always 0 for UTC
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return metrics
|
|
114
|
+
|
|
115
|
+
def now(self) -> datetime:
|
|
116
|
+
"""
|
|
117
|
+
Get current time in UTC.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
datetime: Current time in UTC with timezone info
|
|
121
|
+
"""
|
|
122
|
+
self._time_requests += 1
|
|
123
|
+
return datetime.now(timezone.utc)
|
|
124
|
+
|
|
125
|
+
def now_iso(self) -> str:
|
|
126
|
+
"""
|
|
127
|
+
Get current time as ISO string.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
str: Current UTC time in ISO format
|
|
131
|
+
"""
|
|
132
|
+
self._iso_requests += 1
|
|
133
|
+
return self.now().isoformat()
|
|
134
|
+
|
|
135
|
+
def timestamp(self) -> float:
|
|
136
|
+
"""
|
|
137
|
+
Get current Unix timestamp.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
float: Seconds since Unix epoch
|
|
141
|
+
"""
|
|
142
|
+
self._timestamp_requests += 1
|
|
143
|
+
return self.now().timestamp()
|
|
144
|
+
|
|
145
|
+
def get_uptime(self) -> float:
|
|
146
|
+
"""
|
|
147
|
+
Get service uptime in seconds.
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
float: Seconds since service started
|
|
151
|
+
"""
|
|
152
|
+
self._uptime_requests += 1
|
|
153
|
+
if self._start_time is None:
|
|
154
|
+
return 0.0
|
|
155
|
+
return (self.now() - self._start_time).total_seconds()
|
|
156
|
+
|
|
157
|
+
def _check_ntp_drift_if_needed(self) -> None:
|
|
158
|
+
"""Check NTP drift if interval has passed."""
|
|
159
|
+
current_time = datetime.now(timezone.utc)
|
|
160
|
+
|
|
161
|
+
# Check if we need to update NTP offset
|
|
162
|
+
if (
|
|
163
|
+
self._ntp_last_check is None
|
|
164
|
+
or (current_time - self._ntp_last_check).total_seconds() > self._ntp_check_interval
|
|
165
|
+
):
|
|
166
|
+
self._update_ntp_offset()
|
|
167
|
+
self._ntp_last_check = current_time
|
|
168
|
+
|
|
169
|
+
def _update_ntp_offset(self) -> None:
|
|
170
|
+
"""Update NTP offset by querying NTP servers."""
|
|
171
|
+
try:
|
|
172
|
+
# Try to import ntplib (optional dependency)
|
|
173
|
+
import ntplib
|
|
174
|
+
except ImportError:
|
|
175
|
+
# ntplib not available, use simulated drift based on system clock precision
|
|
176
|
+
self._simulate_drift()
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
c = ntplib.NTPClient()
|
|
180
|
+
|
|
181
|
+
# Try each NTP server until one works
|
|
182
|
+
for server in self._ntp_pools:
|
|
183
|
+
try:
|
|
184
|
+
response = c.request(server, version=3, timeout=2)
|
|
185
|
+
# Convert offset to milliseconds
|
|
186
|
+
self._ntp_offset_ms = response.offset * 1000
|
|
187
|
+
self._ntp_check_count += 1
|
|
188
|
+
logger.debug(f"NTP drift check: {self._ntp_offset_ms:.2f}ms from {server}")
|
|
189
|
+
return
|
|
190
|
+
except Exception:
|
|
191
|
+
continue
|
|
192
|
+
|
|
193
|
+
# All servers failed
|
|
194
|
+
self._ntp_failures += 1
|
|
195
|
+
logger.warning("Failed to check NTP drift from all servers")
|
|
196
|
+
# Fall back to simulated drift
|
|
197
|
+
self._simulate_drift()
|
|
198
|
+
|
|
199
|
+
def _simulate_drift(self) -> None:
|
|
200
|
+
"""Simulate realistic drift when NTP is not available."""
|
|
201
|
+
# Typical quartz crystal drift is 20-100 ppm (parts per million)
|
|
202
|
+
# That's about 1.7-8.6 seconds per day
|
|
203
|
+
# We'll simulate a small drift based on uptime
|
|
204
|
+
uptime_hours = self.get_uptime() / 3600
|
|
205
|
+
# Assume 50 ppm drift rate (4.3 seconds/day, 0.18 seconds/hour)
|
|
206
|
+
drift_seconds = uptime_hours * 0.18
|
|
207
|
+
self._ntp_offset_ms = drift_seconds * 1000
|
|
208
|
+
|
|
209
|
+
def get_ntp_offset(self) -> float:
|
|
210
|
+
"""Get current NTP offset in seconds.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
float: Time offset in seconds (positive means local clock is ahead)
|
|
214
|
+
"""
|
|
215
|
+
self._check_ntp_drift_if_needed()
|
|
216
|
+
return self._ntp_offset_ms / 1000.0
|
|
217
|
+
|
|
218
|
+
def get_adjusted_time(self) -> datetime:
|
|
219
|
+
"""Get NTP-adjusted current time.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
datetime: Current time adjusted for NTP offset
|
|
223
|
+
"""
|
|
224
|
+
from datetime import timedelta
|
|
225
|
+
|
|
226
|
+
offset_seconds = self.get_ntp_offset()
|
|
227
|
+
return self.now() - timedelta(seconds=offset_seconds)
|
|
228
|
+
|
|
229
|
+
async def get_metrics(self) -> Dict[str, float]:
|
|
230
|
+
"""
|
|
231
|
+
Get all time service metrics including base, custom, and v1.4.3 specific.
|
|
232
|
+
"""
|
|
233
|
+
# Get all base + custom metrics
|
|
234
|
+
metrics = self._collect_metrics()
|
|
235
|
+
|
|
236
|
+
# Calculate total time queries from all tracked request types
|
|
237
|
+
total_queries = self._time_requests + self._iso_requests + self._timestamp_requests + self._uptime_requests
|
|
238
|
+
|
|
239
|
+
# Sync operations = NTP checks performed
|
|
240
|
+
sync_operations = self._ntp_check_count
|
|
241
|
+
|
|
242
|
+
# Current clock drift in milliseconds (from NTP)
|
|
243
|
+
self._check_ntp_drift_if_needed()
|
|
244
|
+
drift_ms = self._ntp_offset_ms
|
|
245
|
+
|
|
246
|
+
# Service uptime in seconds
|
|
247
|
+
uptime_seconds = self.get_uptime()
|
|
248
|
+
|
|
249
|
+
# Add v1.4.3 specific time metrics
|
|
250
|
+
metrics.update(
|
|
251
|
+
{
|
|
252
|
+
"time_queries_total": float(total_queries),
|
|
253
|
+
"time_sync_operations": float(sync_operations),
|
|
254
|
+
"time_drift_ms": drift_ms,
|
|
255
|
+
"time_uptime_seconds": uptime_seconds,
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
return metrics
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Service Mixins - Reusable functionality for CIRIS services.
|
|
3
|
+
|
|
4
|
+
Provides mixins that can be combined with service classes to add
|
|
5
|
+
common functionality like request tracking, metrics collection, etc.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .request_metrics import RequestMetrics, RequestMetricsMixin
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"RequestMetricsMixin",
|
|
12
|
+
"RequestMetrics",
|
|
13
|
+
]
|