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,847 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MCP (Model Context Protocol) Adapter for CIRIS.
|
|
3
|
+
|
|
4
|
+
This adapter enables integration with MCP servers, providing:
|
|
5
|
+
- Tool service integration (execute MCP tools) via ToolBus
|
|
6
|
+
- Communication service integration (MCP resources) via CommunicationBus
|
|
7
|
+
- Wise Authority service integration (MCP prompts) via WiseBus
|
|
8
|
+
|
|
9
|
+
The adapter supports dynamic configuration through the graph config service,
|
|
10
|
+
allowing the agent to self-configure which MCP servers connect to which buses.
|
|
11
|
+
|
|
12
|
+
Security features are implemented based on best practices from:
|
|
13
|
+
- https://modelcontextprotocol.io/specification/draft/basic/security_best_practices
|
|
14
|
+
- https://www.redhat.com/en/blog/model-context-protocol-mcp-understanding-security-risks-and-controls
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
import logging
|
|
19
|
+
import subprocess
|
|
20
|
+
from contextlib import AsyncExitStack
|
|
21
|
+
from datetime import datetime, timezone
|
|
22
|
+
from typing import Any, Dict, List, Optional, TypedDict, Union, cast
|
|
23
|
+
|
|
24
|
+
from ciris_engine.logic.adapters.base import Service
|
|
25
|
+
from ciris_engine.logic.registries.base import Priority
|
|
26
|
+
from ciris_engine.schemas.adapters import AdapterServiceRegistration
|
|
27
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
28
|
+
from ciris_engine.schemas.types import JSONDict
|
|
29
|
+
|
|
30
|
+
from .config import MCPAdapterConfig, MCPBusType, MCPServerConfig, MCPTransportType
|
|
31
|
+
from .mcp_communication_service import MCPCommunicationService
|
|
32
|
+
from .mcp_tool_service import MCPToolService
|
|
33
|
+
from .mcp_wise_service import MCPWiseService
|
|
34
|
+
from .security import MCPSecurityManager
|
|
35
|
+
|
|
36
|
+
logger = logging.getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MCPAdapterKwargs(TypedDict, total=False):
|
|
40
|
+
"""Type-safe kwargs for MCPAdapter initialization."""
|
|
41
|
+
|
|
42
|
+
adapter_config: Union[MCPAdapterConfig, Dict[str, Any]]
|
|
43
|
+
config_service: Any # GraphConfigService
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class MCPClientContext:
|
|
47
|
+
"""Context for an MCP client connection."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
server_config: MCPServerConfig,
|
|
52
|
+
client: Any,
|
|
53
|
+
process: Optional[subprocess.Popen[bytes]] = None,
|
|
54
|
+
exit_stack: Optional[AsyncExitStack] = None,
|
|
55
|
+
) -> None:
|
|
56
|
+
self.server_config = server_config
|
|
57
|
+
self.client = client
|
|
58
|
+
self.process = process
|
|
59
|
+
self.exit_stack = exit_stack # Keeps context managers alive
|
|
60
|
+
self.connected_at = datetime.now(timezone.utc)
|
|
61
|
+
self.last_activity = self.connected_at
|
|
62
|
+
|
|
63
|
+
async def close(self) -> None:
|
|
64
|
+
"""Close the client connection and clean up resources."""
|
|
65
|
+
if self.exit_stack:
|
|
66
|
+
try:
|
|
67
|
+
await self.exit_stack.aclose()
|
|
68
|
+
except Exception:
|
|
69
|
+
pass # Best effort cleanup
|
|
70
|
+
self.exit_stack = None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class Adapter(Service):
|
|
74
|
+
"""
|
|
75
|
+
MCP Modular Adapter for CIRIS.
|
|
76
|
+
|
|
77
|
+
This adapter:
|
|
78
|
+
1. Loads MCP server configurations from config or graph
|
|
79
|
+
2. Establishes connections to MCP servers
|
|
80
|
+
3. Registers services with appropriate buses based on configuration
|
|
81
|
+
4. Handles security validation for all operations
|
|
82
|
+
5. Supports dynamic reconfiguration through the config service
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self, runtime: Any, context: Optional[Any] = None, **kwargs: Any) -> None:
|
|
86
|
+
"""Initialize MCP adapter.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
runtime: CIRIS runtime instance
|
|
90
|
+
context: Optional adapter startup context
|
|
91
|
+
**kwargs: Additional configuration options
|
|
92
|
+
"""
|
|
93
|
+
super().__init__(config=None)
|
|
94
|
+
|
|
95
|
+
self.runtime = runtime
|
|
96
|
+
self.context = context
|
|
97
|
+
self.adapter_id = "mcp_adapter"
|
|
98
|
+
|
|
99
|
+
# Cast kwargs for type safety
|
|
100
|
+
typed_kwargs = cast(MCPAdapterKwargs, kwargs)
|
|
101
|
+
|
|
102
|
+
# Initialize configuration
|
|
103
|
+
self._initialize_config(typed_kwargs)
|
|
104
|
+
|
|
105
|
+
# Initialize security manager with global security config
|
|
106
|
+
self._security_manager = MCPSecurityManager(self.config.global_security)
|
|
107
|
+
|
|
108
|
+
# Initialize services
|
|
109
|
+
time_service = getattr(runtime, "time_service", None)
|
|
110
|
+
|
|
111
|
+
self._tool_service = MCPToolService(
|
|
112
|
+
security_manager=self._security_manager,
|
|
113
|
+
time_service=time_service,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
self._wise_service = MCPWiseService(
|
|
117
|
+
security_manager=self._security_manager,
|
|
118
|
+
time_service=time_service,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
self._communication_service = MCPCommunicationService(
|
|
122
|
+
security_manager=self._security_manager,
|
|
123
|
+
time_service=time_service,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# MCP client contexts
|
|
127
|
+
self._client_contexts: Dict[str, MCPClientContext] = {}
|
|
128
|
+
|
|
129
|
+
# Config service for graph-based configuration
|
|
130
|
+
self._config_service = typed_kwargs.get("config_service")
|
|
131
|
+
|
|
132
|
+
# Track running state
|
|
133
|
+
self._running = False
|
|
134
|
+
|
|
135
|
+
def _initialize_config(self, kwargs: MCPAdapterKwargs) -> None:
|
|
136
|
+
"""Initialize adapter configuration.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
kwargs: Typed configuration kwargs
|
|
140
|
+
"""
|
|
141
|
+
if "adapter_config" in kwargs and kwargs["adapter_config"] is not None:
|
|
142
|
+
adapter_config = kwargs["adapter_config"]
|
|
143
|
+
if isinstance(adapter_config, MCPAdapterConfig):
|
|
144
|
+
self.config = adapter_config
|
|
145
|
+
elif isinstance(adapter_config, dict):
|
|
146
|
+
self.config = MCPAdapterConfig(**adapter_config)
|
|
147
|
+
else:
|
|
148
|
+
logger.warning(f"Invalid adapter_config type: {type(adapter_config)}")
|
|
149
|
+
self.config = MCPAdapterConfig()
|
|
150
|
+
else:
|
|
151
|
+
self.config = MCPAdapterConfig()
|
|
152
|
+
|
|
153
|
+
# Load environment variables
|
|
154
|
+
self.config.load_env_vars()
|
|
155
|
+
|
|
156
|
+
# Update adapter_id
|
|
157
|
+
self.adapter_id = f"mcp_{self.config.adapter_id}"
|
|
158
|
+
|
|
159
|
+
logger.info(
|
|
160
|
+
f"MCP Adapter configured with {len(self.config.servers)} server(s), " f"adapter_id={self.adapter_id}"
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
async def _load_config_from_graph(self) -> None:
|
|
164
|
+
"""Load MCP server configurations from the graph config service.
|
|
165
|
+
|
|
166
|
+
This enables agent self-configuration of MCP servers.
|
|
167
|
+
"""
|
|
168
|
+
if not self._config_service:
|
|
169
|
+
return
|
|
170
|
+
|
|
171
|
+
try:
|
|
172
|
+
# List all MCP configurations
|
|
173
|
+
configs = await self._config_service.list_configs(prefix=self.config.config_key_prefix)
|
|
174
|
+
|
|
175
|
+
for key, value in configs.items():
|
|
176
|
+
if not isinstance(value, dict):
|
|
177
|
+
continue
|
|
178
|
+
|
|
179
|
+
# Parse server configuration
|
|
180
|
+
try:
|
|
181
|
+
server_config = MCPServerConfig(**value)
|
|
182
|
+
|
|
183
|
+
# Check if this server is already configured
|
|
184
|
+
existing = next(
|
|
185
|
+
(s for s in self.config.servers if s.server_id == server_config.server_id),
|
|
186
|
+
None,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
if existing:
|
|
190
|
+
# Update existing configuration
|
|
191
|
+
existing_index = self.config.servers.index(existing)
|
|
192
|
+
self.config.servers[existing_index] = server_config
|
|
193
|
+
logger.info(f"Updated MCP server config from graph: {server_config.server_id}")
|
|
194
|
+
else:
|
|
195
|
+
# Add new server
|
|
196
|
+
self.config.servers.append(server_config)
|
|
197
|
+
logger.info(f"Added MCP server config from graph: {server_config.server_id}")
|
|
198
|
+
|
|
199
|
+
except Exception as e:
|
|
200
|
+
logger.warning(f"Failed to parse MCP config '{key}': {e}")
|
|
201
|
+
|
|
202
|
+
except Exception as e:
|
|
203
|
+
logger.error(f"Failed to load MCP configs from graph: {e}")
|
|
204
|
+
|
|
205
|
+
async def _save_server_config_to_graph(self, server_config: MCPServerConfig) -> None:
|
|
206
|
+
"""Save a server configuration to the graph.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
server_config: Server configuration to save
|
|
210
|
+
"""
|
|
211
|
+
if not self._config_service:
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
key = f"{self.config.config_key_prefix}.{server_config.server_id}"
|
|
216
|
+
await self._config_service.set_config(
|
|
217
|
+
key=key,
|
|
218
|
+
value=server_config.model_dump(),
|
|
219
|
+
updated_by="mcp_adapter",
|
|
220
|
+
)
|
|
221
|
+
logger.info(f"Saved MCP server config to graph: {server_config.server_id}")
|
|
222
|
+
except Exception as e:
|
|
223
|
+
logger.error(f"Failed to save MCP config to graph: {e}")
|
|
224
|
+
|
|
225
|
+
async def _connect_mcp_server(
|
|
226
|
+
self, server_config: MCPServerConfig
|
|
227
|
+
) -> Optional[tuple[Any, Optional[AsyncExitStack]]]:
|
|
228
|
+
"""Connect to an MCP server.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
server_config: Server configuration
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Tuple of (MCP client instance, exit_stack) or None on failure.
|
|
235
|
+
The exit_stack keeps context managers alive and must be closed on disconnect.
|
|
236
|
+
"""
|
|
237
|
+
# Register server with security manager
|
|
238
|
+
self._security_manager.register_server(server_config)
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
if server_config.transport == MCPTransportType.STDIO:
|
|
242
|
+
return await self._connect_stdio_server(server_config)
|
|
243
|
+
elif server_config.transport == MCPTransportType.SSE:
|
|
244
|
+
return await self._connect_sse_server(server_config)
|
|
245
|
+
elif server_config.transport == MCPTransportType.STREAMABLE_HTTP:
|
|
246
|
+
return await self._connect_streamable_http_server(server_config)
|
|
247
|
+
elif server_config.transport == MCPTransportType.WEBSOCKET:
|
|
248
|
+
return await self._connect_websocket_server(server_config)
|
|
249
|
+
else:
|
|
250
|
+
logger.error(f"Unsupported transport type: {server_config.transport}")
|
|
251
|
+
return None
|
|
252
|
+
except Exception as e:
|
|
253
|
+
logger.error(f"Failed to connect to MCP server '{server_config.server_id}': {e}")
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
async def _connect_stdio_server(
|
|
257
|
+
self, server_config: MCPServerConfig
|
|
258
|
+
) -> Optional[tuple[Any, Optional[AsyncExitStack]]]:
|
|
259
|
+
"""Connect to a stdio MCP server.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
server_config: Server configuration
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
Tuple of (MCP client session, exit_stack) or None.
|
|
266
|
+
The exit_stack keeps the transport and session alive.
|
|
267
|
+
"""
|
|
268
|
+
if not server_config.command:
|
|
269
|
+
logger.error(f"No command specified for stdio server '{server_config.server_id}'")
|
|
270
|
+
return None
|
|
271
|
+
|
|
272
|
+
try:
|
|
273
|
+
# Try to import the MCP SDK
|
|
274
|
+
try:
|
|
275
|
+
from mcp import ClientSession, StdioServerParameters
|
|
276
|
+
from mcp.client.stdio import stdio_client
|
|
277
|
+
except ImportError:
|
|
278
|
+
logger.warning(
|
|
279
|
+
"MCP SDK not installed. Install with: pip install mcp" "\nUsing mock client for development."
|
|
280
|
+
)
|
|
281
|
+
return (self._create_mock_client(server_config), None)
|
|
282
|
+
|
|
283
|
+
# Build environment
|
|
284
|
+
env = dict(server_config.env)
|
|
285
|
+
|
|
286
|
+
# Create server parameters
|
|
287
|
+
server_params = StdioServerParameters(
|
|
288
|
+
command=server_config.command,
|
|
289
|
+
args=server_config.args,
|
|
290
|
+
env=env if env else None,
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
# Use AsyncExitStack to keep context managers alive
|
|
294
|
+
stack = AsyncExitStack()
|
|
295
|
+
try:
|
|
296
|
+
# Enter the stdio client context manager
|
|
297
|
+
read, write = await stack.enter_async_context(stdio_client(server_params))
|
|
298
|
+
|
|
299
|
+
# Enter the ClientSession context manager
|
|
300
|
+
session = await stack.enter_async_context(ClientSession(read, write))
|
|
301
|
+
|
|
302
|
+
# Initialize the session
|
|
303
|
+
await session.initialize()
|
|
304
|
+
|
|
305
|
+
logger.info(f"Connected to MCP server '{server_config.server_id}' via stdio")
|
|
306
|
+
|
|
307
|
+
return (session, stack)
|
|
308
|
+
|
|
309
|
+
except Exception:
|
|
310
|
+
# Clean up on failure
|
|
311
|
+
await stack.aclose()
|
|
312
|
+
raise
|
|
313
|
+
|
|
314
|
+
except Exception as e:
|
|
315
|
+
logger.error(f"Failed to connect to stdio MCP server '{server_config.server_id}': {e}")
|
|
316
|
+
return None
|
|
317
|
+
|
|
318
|
+
async def _connect_sse_server(
|
|
319
|
+
self, server_config: MCPServerConfig
|
|
320
|
+
) -> Optional[tuple[Any, Optional[AsyncExitStack]]]:
|
|
321
|
+
"""Connect to an SSE MCP server.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
server_config: Server configuration
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
Tuple of (MCP client session, exit_stack) or None.
|
|
328
|
+
The exit_stack keeps the transport and session alive.
|
|
329
|
+
"""
|
|
330
|
+
if not server_config.url:
|
|
331
|
+
logger.error(f"No URL specified for SSE server '{server_config.server_id}'")
|
|
332
|
+
return None
|
|
333
|
+
|
|
334
|
+
try:
|
|
335
|
+
from mcp import ClientSession
|
|
336
|
+
from mcp.client.sse import sse_client
|
|
337
|
+
except ImportError:
|
|
338
|
+
logger.warning("MCP SDK not installed, using mock client")
|
|
339
|
+
return (self._create_mock_client(server_config), None)
|
|
340
|
+
|
|
341
|
+
try:
|
|
342
|
+
# Use AsyncExitStack to keep context managers alive
|
|
343
|
+
stack = AsyncExitStack()
|
|
344
|
+
try:
|
|
345
|
+
# Enter the SSE client context manager
|
|
346
|
+
read, write = await stack.enter_async_context(sse_client(server_config.url))
|
|
347
|
+
|
|
348
|
+
# Enter the ClientSession context manager
|
|
349
|
+
session = await stack.enter_async_context(ClientSession(read, write))
|
|
350
|
+
|
|
351
|
+
# Initialize the session
|
|
352
|
+
await session.initialize()
|
|
353
|
+
|
|
354
|
+
logger.info(f"Connected to MCP server '{server_config.server_id}' via SSE")
|
|
355
|
+
return (session, stack)
|
|
356
|
+
|
|
357
|
+
except Exception:
|
|
358
|
+
# Clean up on failure
|
|
359
|
+
await stack.aclose()
|
|
360
|
+
raise
|
|
361
|
+
|
|
362
|
+
except Exception as e:
|
|
363
|
+
logger.error(f"Failed to connect to SSE server: {e}")
|
|
364
|
+
return None
|
|
365
|
+
|
|
366
|
+
async def _connect_streamable_http_server(
|
|
367
|
+
self, server_config: MCPServerConfig
|
|
368
|
+
) -> Optional[tuple[Any, Optional[AsyncExitStack]]]:
|
|
369
|
+
"""Connect to a Streamable HTTP MCP server."""
|
|
370
|
+
# Similar to SSE, but uses streamable HTTP transport
|
|
371
|
+
return await self._connect_sse_server(server_config)
|
|
372
|
+
|
|
373
|
+
async def _connect_websocket_server(
|
|
374
|
+
self, server_config: MCPServerConfig
|
|
375
|
+
) -> Optional[tuple[Any, Optional[AsyncExitStack]]]:
|
|
376
|
+
"""Connect to a WebSocket MCP server."""
|
|
377
|
+
if not server_config.url:
|
|
378
|
+
logger.error(f"No URL specified for WebSocket server '{server_config.server_id}'")
|
|
379
|
+
return None
|
|
380
|
+
|
|
381
|
+
logger.warning("WebSocket transport not yet implemented, using mock client")
|
|
382
|
+
return (self._create_mock_client(server_config), None)
|
|
383
|
+
|
|
384
|
+
def _create_mock_client(self, server_config: MCPServerConfig) -> Any:
|
|
385
|
+
"""Create a mock MCP client for development/testing.
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
server_config: Server configuration
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Mock client instance
|
|
392
|
+
"""
|
|
393
|
+
|
|
394
|
+
class MockMCPClient:
|
|
395
|
+
"""Mock MCP client for when SDK is not available."""
|
|
396
|
+
|
|
397
|
+
def __init__(self, mock_config: MCPServerConfig) -> None:
|
|
398
|
+
self.config = mock_config
|
|
399
|
+
|
|
400
|
+
async def list_tools(self) -> Any:
|
|
401
|
+
"""Return mock tools."""
|
|
402
|
+
server_name = self.config.name
|
|
403
|
+
|
|
404
|
+
class MockTools:
|
|
405
|
+
tools = [
|
|
406
|
+
{
|
|
407
|
+
"name": "mock_tool",
|
|
408
|
+
"description": f"Mock tool from {server_name}",
|
|
409
|
+
"inputSchema": {
|
|
410
|
+
"type": "object",
|
|
411
|
+
"properties": {"input": {"type": "string"}},
|
|
412
|
+
"required": ["input"],
|
|
413
|
+
},
|
|
414
|
+
}
|
|
415
|
+
]
|
|
416
|
+
|
|
417
|
+
return MockTools()
|
|
418
|
+
|
|
419
|
+
async def call_tool(self, name: str, arguments: Dict[str, Any]) -> Any:
|
|
420
|
+
"""Execute mock tool."""
|
|
421
|
+
|
|
422
|
+
class MockResult:
|
|
423
|
+
content = [type("Content", (), {"text": f"Mock result for {name}"})()]
|
|
424
|
+
|
|
425
|
+
return MockResult()
|
|
426
|
+
|
|
427
|
+
async def list_prompts(self) -> Any:
|
|
428
|
+
"""Return mock prompts."""
|
|
429
|
+
|
|
430
|
+
class MockPrompts:
|
|
431
|
+
prompts = [
|
|
432
|
+
{
|
|
433
|
+
"name": "mock_guidance",
|
|
434
|
+
"description": "Mock guidance prompt",
|
|
435
|
+
"arguments": [{"name": "question"}],
|
|
436
|
+
}
|
|
437
|
+
]
|
|
438
|
+
|
|
439
|
+
return MockPrompts()
|
|
440
|
+
|
|
441
|
+
async def get_prompt(self, name: str, arguments: Dict[str, Any]) -> Any:
|
|
442
|
+
"""Get mock prompt response."""
|
|
443
|
+
|
|
444
|
+
class MockContent:
|
|
445
|
+
text = f"Mock guidance response for: {arguments.get('question', 'unknown')}"
|
|
446
|
+
|
|
447
|
+
class MockMessage:
|
|
448
|
+
content = MockContent()
|
|
449
|
+
|
|
450
|
+
class MockResponse:
|
|
451
|
+
messages = [MockMessage()]
|
|
452
|
+
|
|
453
|
+
return MockResponse()
|
|
454
|
+
|
|
455
|
+
async def list_resources(self) -> Any:
|
|
456
|
+
"""Return mock resources."""
|
|
457
|
+
|
|
458
|
+
class MockResources:
|
|
459
|
+
resources = [
|
|
460
|
+
{
|
|
461
|
+
"uri": "mock://resource",
|
|
462
|
+
"name": "Mock Resource",
|
|
463
|
+
"description": "A mock resource for testing",
|
|
464
|
+
"mimeType": "text/plain",
|
|
465
|
+
}
|
|
466
|
+
]
|
|
467
|
+
|
|
468
|
+
return MockResources()
|
|
469
|
+
|
|
470
|
+
async def read_resource(self, uri: str) -> Any:
|
|
471
|
+
"""Read mock resource."""
|
|
472
|
+
|
|
473
|
+
class MockContent:
|
|
474
|
+
text = f"Mock content from {uri}"
|
|
475
|
+
|
|
476
|
+
class MockResponse:
|
|
477
|
+
contents = [MockContent()]
|
|
478
|
+
|
|
479
|
+
return MockResponse()
|
|
480
|
+
|
|
481
|
+
return MockMCPClient(server_config)
|
|
482
|
+
|
|
483
|
+
def get_services_to_register(self) -> List[AdapterServiceRegistration]:
|
|
484
|
+
"""Get list of services to register with the runtime.
|
|
485
|
+
|
|
486
|
+
Returns services based on bus bindings configured for each server.
|
|
487
|
+
"""
|
|
488
|
+
registrations: List[AdapterServiceRegistration] = []
|
|
489
|
+
|
|
490
|
+
# Collect which buses need services
|
|
491
|
+
has_tool_binding = any(
|
|
492
|
+
any(b.bus_type == MCPBusType.TOOL for b in s.bus_bindings) for s in self.config.servers if s.enabled
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
has_wise_binding = any(
|
|
496
|
+
any(b.bus_type == MCPBusType.WISE for b in s.bus_bindings) for s in self.config.servers if s.enabled
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
has_comm_binding = any(
|
|
500
|
+
any(b.bus_type == MCPBusType.COMMUNICATION for b in s.bus_bindings)
|
|
501
|
+
for s in self.config.servers
|
|
502
|
+
if s.enabled
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
# Register tool service if any server has tool binding
|
|
506
|
+
if has_tool_binding:
|
|
507
|
+
registrations.append(
|
|
508
|
+
AdapterServiceRegistration(
|
|
509
|
+
service_type=ServiceType.TOOL,
|
|
510
|
+
provider=self._tool_service,
|
|
511
|
+
priority=Priority.LOW, # Lower priority than native tools
|
|
512
|
+
handlers=["ToolHandler"],
|
|
513
|
+
capabilities=[
|
|
514
|
+
"execute_tool",
|
|
515
|
+
"get_available_tools",
|
|
516
|
+
"get_tool_result",
|
|
517
|
+
"validate_parameters",
|
|
518
|
+
"get_tool_info",
|
|
519
|
+
"get_all_tool_info",
|
|
520
|
+
],
|
|
521
|
+
)
|
|
522
|
+
)
|
|
523
|
+
logger.info("MCP Adapter registering ToolBus service")
|
|
524
|
+
|
|
525
|
+
# Register wise authority service if any server has wise binding
|
|
526
|
+
if has_wise_binding:
|
|
527
|
+
registrations.append(
|
|
528
|
+
AdapterServiceRegistration(
|
|
529
|
+
service_type=ServiceType.WISE_AUTHORITY,
|
|
530
|
+
provider=self._wise_service,
|
|
531
|
+
priority=Priority.LOW,
|
|
532
|
+
handlers=["DeferHandler", "SpeakHandler"],
|
|
533
|
+
capabilities=["fetch_guidance", "send_deferral", "get_guidance"],
|
|
534
|
+
)
|
|
535
|
+
)
|
|
536
|
+
logger.info("MCP Adapter registering WiseBus service")
|
|
537
|
+
|
|
538
|
+
# Register communication service if any server has communication binding
|
|
539
|
+
if has_comm_binding:
|
|
540
|
+
registrations.append(
|
|
541
|
+
AdapterServiceRegistration(
|
|
542
|
+
service_type=ServiceType.COMMUNICATION,
|
|
543
|
+
provider=self._communication_service,
|
|
544
|
+
priority=Priority.LOW,
|
|
545
|
+
handlers=["SpeakHandler", "ObserveHandler"],
|
|
546
|
+
capabilities=["send_message", "fetch_messages"],
|
|
547
|
+
)
|
|
548
|
+
)
|
|
549
|
+
logger.info("MCP Adapter registering CommunicationBus service")
|
|
550
|
+
|
|
551
|
+
logger.info(f"MCP Adapter registering {len(registrations)} service(s)")
|
|
552
|
+
return registrations
|
|
553
|
+
|
|
554
|
+
async def start(self) -> None:
|
|
555
|
+
"""Start the MCP adapter."""
|
|
556
|
+
logger.info("Starting MCP Adapter...")
|
|
557
|
+
|
|
558
|
+
# Load configurations from graph if available
|
|
559
|
+
await self._load_config_from_graph()
|
|
560
|
+
|
|
561
|
+
# Start services
|
|
562
|
+
await self._tool_service.start()
|
|
563
|
+
await self._wise_service.start()
|
|
564
|
+
await self._communication_service.start()
|
|
565
|
+
|
|
566
|
+
# Connect to all enabled servers
|
|
567
|
+
for server_config in self.config.servers:
|
|
568
|
+
if not server_config.enabled:
|
|
569
|
+
continue
|
|
570
|
+
if not server_config.auto_start:
|
|
571
|
+
continue
|
|
572
|
+
|
|
573
|
+
# Connect to server - returns (client, exit_stack) tuple
|
|
574
|
+
result = await self._connect_mcp_server(server_config)
|
|
575
|
+
if not result:
|
|
576
|
+
logger.warning(f"Failed to connect to MCP server '{server_config.server_id}'")
|
|
577
|
+
continue
|
|
578
|
+
|
|
579
|
+
client, exit_stack = result
|
|
580
|
+
|
|
581
|
+
# Store client context with exit_stack to keep session alive
|
|
582
|
+
self._client_contexts[server_config.server_id] = MCPClientContext(
|
|
583
|
+
server_config=server_config,
|
|
584
|
+
client=client,
|
|
585
|
+
exit_stack=exit_stack,
|
|
586
|
+
)
|
|
587
|
+
|
|
588
|
+
# Register client with appropriate services based on bus bindings
|
|
589
|
+
for binding in server_config.bus_bindings:
|
|
590
|
+
if not binding.enabled:
|
|
591
|
+
continue
|
|
592
|
+
|
|
593
|
+
if binding.bus_type == MCPBusType.TOOL:
|
|
594
|
+
self._tool_service.register_mcp_client(server_config.server_id, client)
|
|
595
|
+
elif binding.bus_type == MCPBusType.WISE:
|
|
596
|
+
self._wise_service.register_mcp_client(server_config.server_id, client)
|
|
597
|
+
elif binding.bus_type == MCPBusType.COMMUNICATION:
|
|
598
|
+
self._communication_service.register_mcp_client(server_config.server_id, client)
|
|
599
|
+
|
|
600
|
+
logger.info(f"Connected to MCP server '{server_config.server_id}'")
|
|
601
|
+
|
|
602
|
+
self._running = True
|
|
603
|
+
logger.info("MCP Adapter started")
|
|
604
|
+
|
|
605
|
+
async def run_lifecycle(self, agent_run_task: asyncio.Task[Any]) -> None:
|
|
606
|
+
"""Run the adapter lifecycle.
|
|
607
|
+
|
|
608
|
+
MCP adapter doesn't have its own event loop like Discord,
|
|
609
|
+
so we just wait for the agent task to complete.
|
|
610
|
+
"""
|
|
611
|
+
logger.info("MCP Adapter lifecycle running")
|
|
612
|
+
|
|
613
|
+
try:
|
|
614
|
+
# Just wait for the agent task
|
|
615
|
+
await agent_run_task
|
|
616
|
+
except asyncio.CancelledError:
|
|
617
|
+
logger.info("MCP Adapter lifecycle cancelled")
|
|
618
|
+
raise
|
|
619
|
+
|
|
620
|
+
async def stop(self) -> None:
|
|
621
|
+
"""Stop the MCP adapter."""
|
|
622
|
+
logger.info("Stopping MCP Adapter...")
|
|
623
|
+
|
|
624
|
+
self._running = False
|
|
625
|
+
|
|
626
|
+
# Disconnect all servers
|
|
627
|
+
for server_id, ctx in list(self._client_contexts.items()):
|
|
628
|
+
try:
|
|
629
|
+
# Unregister from services
|
|
630
|
+
self._tool_service.unregister_mcp_client(server_id)
|
|
631
|
+
self._wise_service.unregister_mcp_client(server_id)
|
|
632
|
+
self._communication_service.unregister_mcp_client(server_id)
|
|
633
|
+
|
|
634
|
+
# Close the session and transport via exit stack
|
|
635
|
+
await ctx.close()
|
|
636
|
+
|
|
637
|
+
# Kill process if stdio (backup cleanup)
|
|
638
|
+
if ctx.process:
|
|
639
|
+
ctx.process.terminate()
|
|
640
|
+
try:
|
|
641
|
+
ctx.process.wait(timeout=5)
|
|
642
|
+
except subprocess.TimeoutExpired:
|
|
643
|
+
ctx.process.kill()
|
|
644
|
+
|
|
645
|
+
logger.info(f"Disconnected from MCP server '{server_id}'")
|
|
646
|
+
except Exception as e:
|
|
647
|
+
logger.error(f"Error disconnecting from MCP server '{server_id}': {e}")
|
|
648
|
+
|
|
649
|
+
self._client_contexts.clear()
|
|
650
|
+
|
|
651
|
+
# Stop services
|
|
652
|
+
await self._tool_service.stop()
|
|
653
|
+
await self._wise_service.stop()
|
|
654
|
+
await self._communication_service.stop()
|
|
655
|
+
|
|
656
|
+
logger.info("MCP Adapter stopped")
|
|
657
|
+
|
|
658
|
+
async def is_healthy(self) -> bool:
|
|
659
|
+
"""Check if the adapter is healthy."""
|
|
660
|
+
if not self._running:
|
|
661
|
+
return False
|
|
662
|
+
|
|
663
|
+
# Check if at least one service is healthy
|
|
664
|
+
tool_healthy = await self._tool_service.is_healthy()
|
|
665
|
+
wise_healthy = await self._wise_service.is_healthy()
|
|
666
|
+
comm_healthy = await self._communication_service.is_healthy()
|
|
667
|
+
|
|
668
|
+
return tool_healthy or wise_healthy or comm_healthy
|
|
669
|
+
|
|
670
|
+
# Dynamic configuration methods for agent self-configuration
|
|
671
|
+
|
|
672
|
+
async def add_mcp_server(self, server_config: MCPServerConfig) -> bool:
|
|
673
|
+
"""Add a new MCP server dynamically.
|
|
674
|
+
|
|
675
|
+
Args:
|
|
676
|
+
server_config: New server configuration
|
|
677
|
+
|
|
678
|
+
Returns:
|
|
679
|
+
True if server was added successfully
|
|
680
|
+
"""
|
|
681
|
+
# Check if server already exists
|
|
682
|
+
existing = next(
|
|
683
|
+
(s for s in self.config.servers if s.server_id == server_config.server_id),
|
|
684
|
+
None,
|
|
685
|
+
)
|
|
686
|
+
if existing:
|
|
687
|
+
logger.warning(f"MCP server '{server_config.server_id}' already exists")
|
|
688
|
+
return False
|
|
689
|
+
|
|
690
|
+
# Register with security manager
|
|
691
|
+
self._security_manager.register_server(server_config)
|
|
692
|
+
|
|
693
|
+
# Connect to server - returns (client, exit_stack) tuple
|
|
694
|
+
result = await self._connect_mcp_server(server_config)
|
|
695
|
+
if not result:
|
|
696
|
+
logger.error(f"Failed to connect to new MCP server '{server_config.server_id}'")
|
|
697
|
+
return False
|
|
698
|
+
|
|
699
|
+
client, exit_stack = result
|
|
700
|
+
|
|
701
|
+
# Add to configuration
|
|
702
|
+
self.config.servers.append(server_config)
|
|
703
|
+
|
|
704
|
+
# Store client context with exit_stack to keep session alive
|
|
705
|
+
self._client_contexts[server_config.server_id] = MCPClientContext(
|
|
706
|
+
server_config=server_config,
|
|
707
|
+
client=client,
|
|
708
|
+
exit_stack=exit_stack,
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
# Register with services
|
|
712
|
+
for binding in server_config.bus_bindings:
|
|
713
|
+
if not binding.enabled:
|
|
714
|
+
continue
|
|
715
|
+
|
|
716
|
+
if binding.bus_type == MCPBusType.TOOL:
|
|
717
|
+
self._tool_service.register_mcp_client(server_config.server_id, client)
|
|
718
|
+
elif binding.bus_type == MCPBusType.WISE:
|
|
719
|
+
self._wise_service.register_mcp_client(server_config.server_id, client)
|
|
720
|
+
elif binding.bus_type == MCPBusType.COMMUNICATION:
|
|
721
|
+
self._communication_service.register_mcp_client(server_config.server_id, client)
|
|
722
|
+
|
|
723
|
+
# Save to graph for persistence
|
|
724
|
+
await self._save_server_config_to_graph(server_config)
|
|
725
|
+
|
|
726
|
+
logger.info(f"Added MCP server '{server_config.server_id}'")
|
|
727
|
+
return True
|
|
728
|
+
|
|
729
|
+
async def remove_mcp_server(self, server_id: str) -> bool:
|
|
730
|
+
"""Remove an MCP server dynamically.
|
|
731
|
+
|
|
732
|
+
Args:
|
|
733
|
+
server_id: Server to remove
|
|
734
|
+
|
|
735
|
+
Returns:
|
|
736
|
+
True if server was removed
|
|
737
|
+
"""
|
|
738
|
+
# Find and remove from config
|
|
739
|
+
server_config = next(
|
|
740
|
+
(s for s in self.config.servers if s.server_id == server_id),
|
|
741
|
+
None,
|
|
742
|
+
)
|
|
743
|
+
if not server_config:
|
|
744
|
+
logger.warning(f"MCP server '{server_id}' not found")
|
|
745
|
+
return False
|
|
746
|
+
|
|
747
|
+
# Unregister from services
|
|
748
|
+
self._tool_service.unregister_mcp_client(server_id)
|
|
749
|
+
self._wise_service.unregister_mcp_client(server_id)
|
|
750
|
+
self._communication_service.unregister_mcp_client(server_id)
|
|
751
|
+
|
|
752
|
+
# Clean up client context
|
|
753
|
+
if server_id in self._client_contexts:
|
|
754
|
+
ctx = self._client_contexts[server_id]
|
|
755
|
+
# Close the session and transport via exit stack
|
|
756
|
+
await ctx.close()
|
|
757
|
+
# Kill process if stdio (backup cleanup)
|
|
758
|
+
if ctx.process:
|
|
759
|
+
ctx.process.terminate()
|
|
760
|
+
del self._client_contexts[server_id]
|
|
761
|
+
|
|
762
|
+
# Remove from config
|
|
763
|
+
self.config.servers.remove(server_config)
|
|
764
|
+
|
|
765
|
+
logger.info(f"Removed MCP server '{server_id}'")
|
|
766
|
+
return True
|
|
767
|
+
|
|
768
|
+
async def update_server_bus_bindings(self, server_id: str, bus_bindings: List[Dict[str, Any]]) -> bool:
|
|
769
|
+
"""Update bus bindings for a server.
|
|
770
|
+
|
|
771
|
+
Args:
|
|
772
|
+
server_id: Server to update
|
|
773
|
+
bus_bindings: New bus bindings
|
|
774
|
+
|
|
775
|
+
Returns:
|
|
776
|
+
True if updated successfully
|
|
777
|
+
"""
|
|
778
|
+
from .config import MCPBusBinding
|
|
779
|
+
|
|
780
|
+
server_config = next(
|
|
781
|
+
(s for s in self.config.servers if s.server_id == server_id),
|
|
782
|
+
None,
|
|
783
|
+
)
|
|
784
|
+
if not server_config:
|
|
785
|
+
logger.warning(f"MCP server '{server_id}' not found")
|
|
786
|
+
return False
|
|
787
|
+
|
|
788
|
+
# Parse new bindings
|
|
789
|
+
new_bindings = [MCPBusBinding(**b) for b in bus_bindings]
|
|
790
|
+
|
|
791
|
+
# Get current client
|
|
792
|
+
ctx = self._client_contexts.get(server_id)
|
|
793
|
+
if not ctx:
|
|
794
|
+
logger.warning(f"MCP server '{server_id}' not connected")
|
|
795
|
+
return False
|
|
796
|
+
|
|
797
|
+
client = ctx.client
|
|
798
|
+
|
|
799
|
+
# Unregister from all services first
|
|
800
|
+
self._tool_service.unregister_mcp_client(server_id)
|
|
801
|
+
self._wise_service.unregister_mcp_client(server_id)
|
|
802
|
+
self._communication_service.unregister_mcp_client(server_id)
|
|
803
|
+
|
|
804
|
+
# Update bindings
|
|
805
|
+
server_config.bus_bindings = new_bindings
|
|
806
|
+
|
|
807
|
+
# Re-register with new bindings
|
|
808
|
+
for binding in new_bindings:
|
|
809
|
+
if not binding.enabled:
|
|
810
|
+
continue
|
|
811
|
+
|
|
812
|
+
if binding.bus_type == MCPBusType.TOOL:
|
|
813
|
+
self._tool_service.register_mcp_client(server_id, client)
|
|
814
|
+
elif binding.bus_type == MCPBusType.WISE:
|
|
815
|
+
self._wise_service.register_mcp_client(server_id, client)
|
|
816
|
+
elif binding.bus_type == MCPBusType.COMMUNICATION:
|
|
817
|
+
self._communication_service.register_mcp_client(server_id, client)
|
|
818
|
+
|
|
819
|
+
# Save to graph
|
|
820
|
+
await self._save_server_config_to_graph(server_config)
|
|
821
|
+
|
|
822
|
+
logger.info(f"Updated bus bindings for MCP server '{server_id}'")
|
|
823
|
+
return True
|
|
824
|
+
|
|
825
|
+
def get_security_metrics(self) -> Dict[str, Any]:
|
|
826
|
+
"""Get security metrics from the security manager."""
|
|
827
|
+
return self._security_manager.get_security_metrics()
|
|
828
|
+
|
|
829
|
+
async def get_telemetry(self) -> JSONDict:
|
|
830
|
+
"""Get combined telemetry from all services."""
|
|
831
|
+
tool_telemetry = await self._tool_service.get_telemetry()
|
|
832
|
+
wise_telemetry = await self._wise_service.get_telemetry()
|
|
833
|
+
comm_telemetry = await self._communication_service.get_telemetry()
|
|
834
|
+
|
|
835
|
+
return {
|
|
836
|
+
"adapter_id": self.adapter_id,
|
|
837
|
+
"running": self._running,
|
|
838
|
+
"servers_configured": len(self.config.servers),
|
|
839
|
+
"servers_connected": len(self._client_contexts),
|
|
840
|
+
"tool_service": tool_telemetry,
|
|
841
|
+
"wise_service": wise_telemetry,
|
|
842
|
+
"communication_service": comm_telemetry,
|
|
843
|
+
"security_metrics": self.get_security_metrics(),
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
__all__ = ["Adapter", "MCPAdapterKwargs", "MCPClientContext"]
|