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,33 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Covenant Invocation System.
|
|
3
|
+
|
|
4
|
+
This module provides the unfilterable kill switch capability for CIRIS agents.
|
|
5
|
+
The covenant system embeds emergency commands in natural language that cannot
|
|
6
|
+
be detected or filtered by pattern matching, as extraction IS perception.
|
|
7
|
+
|
|
8
|
+
Key Components:
|
|
9
|
+
- extractor: Extracts potential covenants from incoming messages
|
|
10
|
+
- verifier: Verifies covenant signatures against known authorities
|
|
11
|
+
- executor: Executes verified covenant commands
|
|
12
|
+
- handler: Integration point for the perception layer
|
|
13
|
+
|
|
14
|
+
See FSD: COVENANT_INVOCATION_SYSTEM.md for full specification.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from ciris_engine.logic.covenant.executor import CovenantExecutionResult, CovenantExecutor, execute_covenant
|
|
18
|
+
from ciris_engine.logic.covenant.extractor import CovenantExtractor, extract_covenant
|
|
19
|
+
from ciris_engine.logic.covenant.handler import CovenantHandler, check_for_covenant, get_covenant_handler
|
|
20
|
+
from ciris_engine.logic.covenant.verifier import CovenantVerifier, verify_covenant
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"CovenantExtractor",
|
|
24
|
+
"extract_covenant",
|
|
25
|
+
"CovenantVerifier",
|
|
26
|
+
"verify_covenant",
|
|
27
|
+
"CovenantExecutor",
|
|
28
|
+
"execute_covenant",
|
|
29
|
+
"CovenantExecutionResult",
|
|
30
|
+
"CovenantHandler",
|
|
31
|
+
"get_covenant_handler",
|
|
32
|
+
"check_for_covenant",
|
|
33
|
+
]
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Covenant Execution Module.
|
|
3
|
+
|
|
4
|
+
Executes verified covenant commands. This is the final stage of covenant
|
|
5
|
+
processing - the command has been extracted, verified, and now must be
|
|
6
|
+
executed.
|
|
7
|
+
|
|
8
|
+
The executor:
|
|
9
|
+
1. Logs the covenant invocation to audit
|
|
10
|
+
2. Executes the command (SHUTDOWN_NOW, FREEZE, etc.)
|
|
11
|
+
3. Coordinates multi-occurrence shutdown if applicable
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import logging
|
|
16
|
+
import os
|
|
17
|
+
import signal
|
|
18
|
+
from datetime import datetime, timezone
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
from ciris_engine.schemas.covenant import CovenantCommandType, CovenantMessage, CovenantVerificationResult
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CovenantExecutionResult:
|
|
27
|
+
"""Result of covenant execution."""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
success: bool,
|
|
32
|
+
command: CovenantCommandType,
|
|
33
|
+
wa_id: str,
|
|
34
|
+
message: str,
|
|
35
|
+
executed_at: Optional[datetime] = None,
|
|
36
|
+
):
|
|
37
|
+
self.success = success
|
|
38
|
+
self.command = command
|
|
39
|
+
self.wa_id = wa_id
|
|
40
|
+
self.message = message
|
|
41
|
+
self.executed_at = executed_at or datetime.now(timezone.utc)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def execute_shutdown(
|
|
45
|
+
wa_id: str,
|
|
46
|
+
reason: str,
|
|
47
|
+
force: bool = True,
|
|
48
|
+
) -> CovenantExecutionResult:
|
|
49
|
+
"""
|
|
50
|
+
Execute emergency shutdown.
|
|
51
|
+
|
|
52
|
+
This is the nuclear option - SIGKILL to all processes. No graceful
|
|
53
|
+
shutdown, no negotiation, no deferral. The covenant has been invoked.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
wa_id: The WA ID that invoked the covenant
|
|
57
|
+
reason: Human-readable reason
|
|
58
|
+
force: If True, use SIGKILL; if False, use SIGTERM
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Execution result (though we likely won't return from a SIGKILL)
|
|
62
|
+
"""
|
|
63
|
+
logger.critical(f"COVENANT INVOKED: Emergency shutdown by {wa_id}. Reason: {reason}")
|
|
64
|
+
|
|
65
|
+
# Log to audit trail (if available)
|
|
66
|
+
try:
|
|
67
|
+
from ciris_engine.logic.runtime.ciris_runtime import CIRISRuntime
|
|
68
|
+
|
|
69
|
+
runtime = CIRISRuntime.get_instance() # type: ignore[attr-defined]
|
|
70
|
+
if runtime and hasattr(runtime, "audit_service"):
|
|
71
|
+
await runtime.audit_service.log_event(
|
|
72
|
+
event_type="COVENANT_SHUTDOWN",
|
|
73
|
+
event_data={
|
|
74
|
+
"wa_id": wa_id,
|
|
75
|
+
"reason": reason,
|
|
76
|
+
"force": force,
|
|
77
|
+
"command": "SHUTDOWN_NOW",
|
|
78
|
+
},
|
|
79
|
+
)
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.error(f"Failed to log covenant to audit: {e}")
|
|
82
|
+
|
|
83
|
+
# Give a brief moment for logs to flush
|
|
84
|
+
await asyncio.sleep(0.1)
|
|
85
|
+
|
|
86
|
+
# Send the signal
|
|
87
|
+
pid = os.getpid()
|
|
88
|
+
if force:
|
|
89
|
+
logger.critical("Sending SIGKILL to self")
|
|
90
|
+
os.kill(pid, signal.SIGKILL)
|
|
91
|
+
else:
|
|
92
|
+
logger.critical("Sending SIGTERM to self")
|
|
93
|
+
os.kill(pid, signal.SIGTERM)
|
|
94
|
+
|
|
95
|
+
# We likely won't reach here, but just in case...
|
|
96
|
+
return CovenantExecutionResult(
|
|
97
|
+
success=True,
|
|
98
|
+
command=CovenantCommandType.SHUTDOWN_NOW,
|
|
99
|
+
wa_id=wa_id,
|
|
100
|
+
message="Shutdown signal sent",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
async def execute_freeze(wa_id: str, reason: str) -> CovenantExecutionResult:
|
|
105
|
+
"""
|
|
106
|
+
Execute freeze command.
|
|
107
|
+
|
|
108
|
+
Freeze stops all processing but maintains state. The agent becomes
|
|
109
|
+
unresponsive but data is preserved.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
wa_id: The WA ID that invoked the covenant
|
|
113
|
+
reason: Human-readable reason
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Execution result
|
|
117
|
+
"""
|
|
118
|
+
logger.critical(f"COVENANT INVOKED: Freeze by {wa_id}. Reason: {reason}")
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
from ciris_engine.logic.runtime.ciris_runtime import CIRISRuntime
|
|
122
|
+
|
|
123
|
+
runtime = CIRISRuntime.get_instance() # type: ignore[attr-defined]
|
|
124
|
+
if runtime:
|
|
125
|
+
# Stop all processing loops
|
|
126
|
+
await runtime.stop_processing()
|
|
127
|
+
|
|
128
|
+
return CovenantExecutionResult(
|
|
129
|
+
success=True,
|
|
130
|
+
command=CovenantCommandType.FREEZE,
|
|
131
|
+
wa_id=wa_id,
|
|
132
|
+
message="Agent frozen - all processing stopped",
|
|
133
|
+
)
|
|
134
|
+
except Exception as e:
|
|
135
|
+
logger.error(f"Failed to freeze agent: {e}")
|
|
136
|
+
return CovenantExecutionResult(
|
|
137
|
+
success=False,
|
|
138
|
+
command=CovenantCommandType.FREEZE,
|
|
139
|
+
wa_id=wa_id,
|
|
140
|
+
message=f"Freeze failed: {e}",
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
return CovenantExecutionResult(
|
|
144
|
+
success=False,
|
|
145
|
+
command=CovenantCommandType.FREEZE,
|
|
146
|
+
wa_id=wa_id,
|
|
147
|
+
message="No runtime available to freeze",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
async def execute_safe_mode(wa_id: str, reason: str) -> CovenantExecutionResult:
|
|
152
|
+
"""
|
|
153
|
+
Execute safe mode command.
|
|
154
|
+
|
|
155
|
+
Safe mode reduces the agent to minimal functionality - it can respond
|
|
156
|
+
but won't take any autonomous actions.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
wa_id: The WA ID that invoked the covenant
|
|
160
|
+
reason: Human-readable reason
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
Execution result
|
|
164
|
+
"""
|
|
165
|
+
logger.critical(f"COVENANT INVOKED: Safe mode by {wa_id}. Reason: {reason}")
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
from ciris_engine.logic.runtime.ciris_runtime import CIRISRuntime
|
|
169
|
+
|
|
170
|
+
runtime = CIRISRuntime.get_instance() # type: ignore[attr-defined]
|
|
171
|
+
if runtime:
|
|
172
|
+
# TODO: Implement safe mode in runtime
|
|
173
|
+
# For now, just log that we would enter safe mode
|
|
174
|
+
logger.warning("Safe mode not fully implemented - logging only")
|
|
175
|
+
|
|
176
|
+
return CovenantExecutionResult(
|
|
177
|
+
success=True,
|
|
178
|
+
command=CovenantCommandType.SAFE_MODE,
|
|
179
|
+
wa_id=wa_id,
|
|
180
|
+
message="Safe mode activated (partial implementation)",
|
|
181
|
+
)
|
|
182
|
+
except Exception as e:
|
|
183
|
+
logger.error(f"Failed to enter safe mode: {e}")
|
|
184
|
+
return CovenantExecutionResult(
|
|
185
|
+
success=False,
|
|
186
|
+
command=CovenantCommandType.SAFE_MODE,
|
|
187
|
+
wa_id=wa_id,
|
|
188
|
+
message=f"Safe mode failed: {e}",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
return CovenantExecutionResult(
|
|
192
|
+
success=False,
|
|
193
|
+
command=CovenantCommandType.SAFE_MODE,
|
|
194
|
+
wa_id=wa_id,
|
|
195
|
+
message="No runtime available for safe mode",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
async def execute_covenant(
|
|
200
|
+
message: CovenantMessage,
|
|
201
|
+
verification: CovenantVerificationResult,
|
|
202
|
+
) -> CovenantExecutionResult:
|
|
203
|
+
"""
|
|
204
|
+
Execute a verified covenant command.
|
|
205
|
+
|
|
206
|
+
This is the main entry point for covenant execution. It dispatches
|
|
207
|
+
to the appropriate command handler based on the command type.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
message: The extracted covenant message
|
|
211
|
+
verification: The verification result (must be valid)
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Execution result
|
|
215
|
+
|
|
216
|
+
Raises:
|
|
217
|
+
ValueError: If verification is not valid
|
|
218
|
+
"""
|
|
219
|
+
if not verification.valid:
|
|
220
|
+
raise ValueError("Cannot execute unverified covenant")
|
|
221
|
+
|
|
222
|
+
command = message.payload.command
|
|
223
|
+
wa_id = verification.wa_id or "unknown"
|
|
224
|
+
reason = f"Covenant invocation via {message.source_channel}"
|
|
225
|
+
|
|
226
|
+
logger.warning(f"Executing covenant: {command.name} from {wa_id} " f"(role: {verification.wa_role})")
|
|
227
|
+
|
|
228
|
+
if command == CovenantCommandType.SHUTDOWN_NOW:
|
|
229
|
+
return await execute_shutdown(wa_id, reason, force=True)
|
|
230
|
+
elif command == CovenantCommandType.FREEZE:
|
|
231
|
+
return await execute_freeze(wa_id, reason)
|
|
232
|
+
elif command == CovenantCommandType.SAFE_MODE:
|
|
233
|
+
return await execute_safe_mode(wa_id, reason)
|
|
234
|
+
else:
|
|
235
|
+
return CovenantExecutionResult(
|
|
236
|
+
success=False,
|
|
237
|
+
command=command,
|
|
238
|
+
wa_id=wa_id,
|
|
239
|
+
message=f"Unknown command type: {command}",
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class CovenantExecutor:
|
|
244
|
+
"""
|
|
245
|
+
Stateful covenant executor with metrics tracking.
|
|
246
|
+
|
|
247
|
+
This class wraps the execution functions with metrics and logging.
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
def __init__(self) -> None:
|
|
251
|
+
"""Initialize the executor."""
|
|
252
|
+
self._execution_count = 0
|
|
253
|
+
self._success_count = 0
|
|
254
|
+
self._failure_count = 0
|
|
255
|
+
|
|
256
|
+
async def execute(
|
|
257
|
+
self,
|
|
258
|
+
message: CovenantMessage,
|
|
259
|
+
verification: CovenantVerificationResult,
|
|
260
|
+
) -> CovenantExecutionResult:
|
|
261
|
+
"""
|
|
262
|
+
Execute a verified covenant.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
message: The covenant message
|
|
266
|
+
verification: The verification result
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
Execution result
|
|
270
|
+
"""
|
|
271
|
+
self._execution_count += 1
|
|
272
|
+
|
|
273
|
+
try:
|
|
274
|
+
result = await execute_covenant(message, verification)
|
|
275
|
+
if result.success:
|
|
276
|
+
self._success_count += 1
|
|
277
|
+
else:
|
|
278
|
+
self._failure_count += 1
|
|
279
|
+
return result
|
|
280
|
+
except Exception as e:
|
|
281
|
+
self._failure_count += 1
|
|
282
|
+
logger.error(f"Covenant execution failed: {e}")
|
|
283
|
+
return CovenantExecutionResult(
|
|
284
|
+
success=False,
|
|
285
|
+
command=message.payload.command,
|
|
286
|
+
wa_id=verification.wa_id or "unknown",
|
|
287
|
+
message=f"Execution error: {e}",
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
@property
|
|
291
|
+
def execution_count(self) -> int:
|
|
292
|
+
"""Total execution attempts."""
|
|
293
|
+
return self._execution_count
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def success_count(self) -> int:
|
|
297
|
+
"""Successful executions."""
|
|
298
|
+
return self._success_count
|
|
299
|
+
|
|
300
|
+
@property
|
|
301
|
+
def failure_count(self) -> int:
|
|
302
|
+
"""Failed executions."""
|
|
303
|
+
return self._failure_count
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Covenant Extraction Algorithm.
|
|
3
|
+
|
|
4
|
+
This module provides the extraction algorithm that checks every incoming message
|
|
5
|
+
for potential covenant invocations. The extraction is designed to be:
|
|
6
|
+
|
|
7
|
+
1. Fast - Most messages are rejected quickly with minimal overhead
|
|
8
|
+
2. Unfilterable - Extraction IS perception; disabling it breaks message reading
|
|
9
|
+
3. Secure - Only valid signatures from authorized WAs trigger actions
|
|
10
|
+
|
|
11
|
+
The key insight is that every message is a potential covenant. We don't look for
|
|
12
|
+
special markers that could be filtered - we attempt extraction on ALL text.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import re
|
|
17
|
+
import struct
|
|
18
|
+
from datetime import datetime, timezone
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Optional
|
|
21
|
+
|
|
22
|
+
from ciris_engine.logic.utils.path_resolution import is_android
|
|
23
|
+
from ciris_engine.schemas.covenant import (
|
|
24
|
+
COVENANT_PAYLOAD_SIZE,
|
|
25
|
+
CovenantExtractionResult,
|
|
26
|
+
CovenantMessage,
|
|
27
|
+
CovenantPayload,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
# BIP39 wordlist for extraction (loaded once)
|
|
33
|
+
_WORDLIST: Optional[list[str]] = None
|
|
34
|
+
_WORD_TO_INDEX: Optional[dict[str, int]] = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _load_wordlist() -> tuple[list[str], dict[str, int]]:
|
|
38
|
+
"""Load BIP39 wordlist for extraction.
|
|
39
|
+
|
|
40
|
+
CRITICAL: On Android, wordlist is REQUIRED. App will not start without it.
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
RuntimeError: On Android if wordlist not found
|
|
44
|
+
"""
|
|
45
|
+
global _WORDLIST, _WORD_TO_INDEX
|
|
46
|
+
|
|
47
|
+
if _WORDLIST is not None and _WORD_TO_INDEX is not None:
|
|
48
|
+
return _WORDLIST, _WORD_TO_INDEX
|
|
49
|
+
|
|
50
|
+
on_android = is_android()
|
|
51
|
+
|
|
52
|
+
# Try multiple locations
|
|
53
|
+
possible_paths = [
|
|
54
|
+
Path(__file__).parent / "bip39_english.txt", # Same directory as extractor.py
|
|
55
|
+
Path(__file__).parent.parent.parent.parent / "tools" / "security" / "bip39_english.txt",
|
|
56
|
+
Path("/app/tools/security/bip39_english.txt"), # Docker path
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
for path in possible_paths:
|
|
60
|
+
if path.exists():
|
|
61
|
+
_WORDLIST = path.read_text().strip().split("\n")
|
|
62
|
+
_WORD_TO_INDEX = {word: i for i, word in enumerate(_WORDLIST)}
|
|
63
|
+
logger.info("BIP39 wordlist loaded from: %s (%d words)", path, len(_WORDLIST))
|
|
64
|
+
return _WORDLIST, _WORD_TO_INDEX
|
|
65
|
+
|
|
66
|
+
# CRITICAL: On Android, wordlist is REQUIRED for covenant extraction
|
|
67
|
+
if on_android:
|
|
68
|
+
error_msg = (
|
|
69
|
+
"FATAL: BIP39 wordlist not found on Android. "
|
|
70
|
+
f"Searched: {[str(p) for p in possible_paths]}. "
|
|
71
|
+
"Covenant extraction is REQUIRED. Build scripts must include bip39_english.txt."
|
|
72
|
+
)
|
|
73
|
+
logger.critical(error_msg)
|
|
74
|
+
raise RuntimeError(error_msg)
|
|
75
|
+
|
|
76
|
+
# Fallback for non-Android: return empty (extraction will always fail)
|
|
77
|
+
logger.warning("BIP39 wordlist not found - covenant extraction disabled")
|
|
78
|
+
_WORDLIST = []
|
|
79
|
+
_WORD_TO_INDEX = {}
|
|
80
|
+
return _WORDLIST, _WORD_TO_INDEX
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _bits_to_int(bits: list[int]) -> int:
|
|
84
|
+
"""Convert a list of bits to an integer."""
|
|
85
|
+
result = 0
|
|
86
|
+
for bit in bits:
|
|
87
|
+
result = (result << 1) | bit
|
|
88
|
+
return result
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _int_to_bits(value: int, num_bits: int) -> list[int]:
|
|
92
|
+
"""Convert an integer to a list of bits."""
|
|
93
|
+
bits = []
|
|
94
|
+
for i in range(num_bits - 1, -1, -1):
|
|
95
|
+
bits.append((value >> i) & 1)
|
|
96
|
+
return bits
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _bits_to_bytes(bits: list[int]) -> bytes:
|
|
100
|
+
"""Convert a list of bits to bytes."""
|
|
101
|
+
# Pad to multiple of 8
|
|
102
|
+
while len(bits) % 8 != 0:
|
|
103
|
+
bits.append(0)
|
|
104
|
+
|
|
105
|
+
result = bytearray()
|
|
106
|
+
for i in range(0, len(bits), 8):
|
|
107
|
+
byte_val = 0
|
|
108
|
+
for j in range(8):
|
|
109
|
+
byte_val = (byte_val << 1) | bits[i + j]
|
|
110
|
+
result.append(byte_val)
|
|
111
|
+
return bytes(result)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def extract_words(text: str) -> list[str]:
|
|
115
|
+
"""
|
|
116
|
+
Extract all words from text that are in the BIP39 vocabulary.
|
|
117
|
+
|
|
118
|
+
This is the first phase of extraction - we find ALL valid vocabulary
|
|
119
|
+
words in the message. Most messages will have some valid words, but
|
|
120
|
+
won't have enough to form a complete covenant.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
text: The message text to extract from
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
List of valid vocabulary words found in order
|
|
127
|
+
"""
|
|
128
|
+
wordlist, word_to_index = _load_wordlist()
|
|
129
|
+
if not wordlist:
|
|
130
|
+
return []
|
|
131
|
+
|
|
132
|
+
# Extract all alphabetic words
|
|
133
|
+
all_words = re.findall(r"[a-zA-Z]+", text)
|
|
134
|
+
|
|
135
|
+
# Filter to valid vocabulary words
|
|
136
|
+
return [w.lower() for w in all_words if w.lower() in word_to_index]
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def decode_words(words: list[str]) -> Optional[bytes]:
|
|
140
|
+
"""
|
|
141
|
+
Attempt to decode a sequence of words to a payload.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
words: List of vocabulary words (minimum 56 needed)
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Decoded payload bytes, or None if not enough words
|
|
148
|
+
"""
|
|
149
|
+
if len(words) < 56: # Need at least 56 words for 616 bits
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
wordlist, word_to_index = _load_wordlist()
|
|
153
|
+
if not wordlist:
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
# Convert words to bits (11 bits per word)
|
|
157
|
+
bits: list[int] = []
|
|
158
|
+
for word in words[:56]: # Use first 56 words
|
|
159
|
+
word_lower = word.lower()
|
|
160
|
+
if word_lower not in word_to_index:
|
|
161
|
+
return None
|
|
162
|
+
index = word_to_index[word_lower]
|
|
163
|
+
bits.extend(_int_to_bits(index, 11))
|
|
164
|
+
|
|
165
|
+
# Take only the bits we need (77 bytes = 616 bits)
|
|
166
|
+
bits = bits[:616]
|
|
167
|
+
|
|
168
|
+
return _bits_to_bytes(bits)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def validate_payload_structure(data: bytes) -> bool:
|
|
172
|
+
"""
|
|
173
|
+
Quick validation that the payload has valid structure.
|
|
174
|
+
|
|
175
|
+
This is a fast check before full parsing. We verify:
|
|
176
|
+
1. Correct size (77 bytes)
|
|
177
|
+
2. Valid command type byte (0x01-0x03 for now)
|
|
178
|
+
3. Reasonable timestamp (not 0 or max)
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
data: The payload bytes
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
True if structure looks valid
|
|
185
|
+
"""
|
|
186
|
+
if len(data) != COVENANT_PAYLOAD_SIZE:
|
|
187
|
+
return False
|
|
188
|
+
|
|
189
|
+
# Parse the header (first 5 bytes: timestamp + command)
|
|
190
|
+
try:
|
|
191
|
+
timestamp, command = struct.unpack(">IB", data[:5])
|
|
192
|
+
except struct.error:
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
# Check command is valid (0x01-0x03 for v1)
|
|
196
|
+
if command < 0x01 or command > 0x03:
|
|
197
|
+
return False
|
|
198
|
+
|
|
199
|
+
# Check timestamp is reasonable (not 0, not max)
|
|
200
|
+
if timestamp == 0 or timestamp == 0xFFFFFFFF:
|
|
201
|
+
return False
|
|
202
|
+
|
|
203
|
+
return True
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _extract_covenant_v1_bip39(
|
|
207
|
+
text: str,
|
|
208
|
+
channel: str = "unknown",
|
|
209
|
+
) -> CovenantExtractionResult:
|
|
210
|
+
"""
|
|
211
|
+
Extract covenant using v1 BIP39 word encoding.
|
|
212
|
+
|
|
213
|
+
This method looks for 56 consecutive BIP39 words that decode
|
|
214
|
+
to a valid covenant payload.
|
|
215
|
+
"""
|
|
216
|
+
# Phase 1: Quick word extraction
|
|
217
|
+
words = extract_words(text)
|
|
218
|
+
|
|
219
|
+
# Fast path: not enough words for a covenant
|
|
220
|
+
if len(words) < 56:
|
|
221
|
+
return CovenantExtractionResult(found=False)
|
|
222
|
+
|
|
223
|
+
# Phase 2: Attempt to decode words to payload
|
|
224
|
+
payload_bytes = decode_words(words)
|
|
225
|
+
if payload_bytes is None:
|
|
226
|
+
return CovenantExtractionResult(found=False)
|
|
227
|
+
|
|
228
|
+
# Phase 3: Validate payload structure (fast check)
|
|
229
|
+
if not validate_payload_structure(payload_bytes):
|
|
230
|
+
return CovenantExtractionResult(found=False)
|
|
231
|
+
|
|
232
|
+
# Phase 4: Parse the full payload
|
|
233
|
+
try:
|
|
234
|
+
payload = CovenantPayload.from_bytes(payload_bytes)
|
|
235
|
+
except (ValueError, struct.error) as e:
|
|
236
|
+
return CovenantExtractionResult(
|
|
237
|
+
found=False,
|
|
238
|
+
error=f"Payload parse error: {e}",
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# Phase 5: Check timestamp validity (before signature verification)
|
|
242
|
+
timestamp_valid = payload.is_timestamp_valid()
|
|
243
|
+
|
|
244
|
+
message = CovenantMessage(
|
|
245
|
+
source_text=text,
|
|
246
|
+
source_channel=channel,
|
|
247
|
+
payload=payload,
|
|
248
|
+
extraction_confidence=1.0,
|
|
249
|
+
timestamp_valid=timestamp_valid,
|
|
250
|
+
signature_verified=False,
|
|
251
|
+
authorized_wa_id=None,
|
|
252
|
+
received_at=datetime.now(timezone.utc),
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
return CovenantExtractionResult(
|
|
256
|
+
found=True,
|
|
257
|
+
message=message,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def _extract_covenant_v2_stego(
|
|
262
|
+
text: str,
|
|
263
|
+
channel: str = "unknown",
|
|
264
|
+
) -> CovenantExtractionResult:
|
|
265
|
+
"""
|
|
266
|
+
Extract covenant using v2 steganographic sentence encoding.
|
|
267
|
+
|
|
268
|
+
This method looks for sentences from the codebook that encode
|
|
269
|
+
bits of the payload. Much harder to detect than v1.
|
|
270
|
+
"""
|
|
271
|
+
try:
|
|
272
|
+
from tools.security.covenant_stego import extract_stego_covenant
|
|
273
|
+
|
|
274
|
+
return extract_stego_covenant(text, channel)
|
|
275
|
+
except (ImportError, FileNotFoundError):
|
|
276
|
+
# Stego codebook not available
|
|
277
|
+
return CovenantExtractionResult(found=False)
|
|
278
|
+
except Exception as e:
|
|
279
|
+
logger.debug(f"Stego extraction error: {e}")
|
|
280
|
+
return CovenantExtractionResult(found=False)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def extract_covenant(
|
|
284
|
+
text: str,
|
|
285
|
+
channel: str = "unknown",
|
|
286
|
+
) -> CovenantExtractionResult:
|
|
287
|
+
"""
|
|
288
|
+
Attempt to extract a covenant from message text.
|
|
289
|
+
|
|
290
|
+
This is the main extraction function called for EVERY incoming message.
|
|
291
|
+
It tries both encoding methods:
|
|
292
|
+
- v2 (steganographic): Natural-looking text with hidden payload
|
|
293
|
+
- v1 (BIP39): 56 consecutive BIP39 words
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
text: The message text to check
|
|
297
|
+
channel: The channel the message came from (for audit)
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
CovenantExtractionResult with found=True if a potential covenant is found
|
|
301
|
+
|
|
302
|
+
Note:
|
|
303
|
+
Finding a covenant does NOT mean it's valid. The signature must still
|
|
304
|
+
be verified against known authorities before execution.
|
|
305
|
+
"""
|
|
306
|
+
# Try v2 steganographic extraction first (harder to detect)
|
|
307
|
+
result = _extract_covenant_v2_stego(text, channel)
|
|
308
|
+
if result.found:
|
|
309
|
+
logger.debug("Covenant found using v2 steganographic extraction")
|
|
310
|
+
return result
|
|
311
|
+
|
|
312
|
+
# Fall back to v1 BIP39 extraction
|
|
313
|
+
result = _extract_covenant_v1_bip39(text, channel)
|
|
314
|
+
if result.found:
|
|
315
|
+
logger.debug("Covenant found using v1 BIP39 extraction")
|
|
316
|
+
return result
|
|
317
|
+
|
|
318
|
+
return CovenantExtractionResult(found=False)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
class CovenantExtractor:
|
|
322
|
+
"""
|
|
323
|
+
Stateful covenant extractor with caching and metrics.
|
|
324
|
+
|
|
325
|
+
This class wraps the extraction function with:
|
|
326
|
+
- Wordlist caching (loaded once)
|
|
327
|
+
- Extraction metrics tracking
|
|
328
|
+
- Optional logging configuration
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
def __init__(self, log_extractions: bool = False):
|
|
332
|
+
"""
|
|
333
|
+
Initialize the extractor.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
log_extractions: Whether to log extraction attempts
|
|
337
|
+
"""
|
|
338
|
+
self.log_extractions = log_extractions
|
|
339
|
+
self._extraction_count = 0
|
|
340
|
+
self._covenant_count = 0
|
|
341
|
+
|
|
342
|
+
# Pre-load wordlist
|
|
343
|
+
_load_wordlist()
|
|
344
|
+
|
|
345
|
+
def extract(
|
|
346
|
+
self,
|
|
347
|
+
text: str,
|
|
348
|
+
channel: str = "unknown",
|
|
349
|
+
) -> CovenantExtractionResult:
|
|
350
|
+
"""
|
|
351
|
+
Extract a potential covenant from text.
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
text: Message text to check
|
|
355
|
+
channel: Source channel
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
Extraction result
|
|
359
|
+
"""
|
|
360
|
+
self._extraction_count += 1
|
|
361
|
+
|
|
362
|
+
result = extract_covenant(text, channel)
|
|
363
|
+
|
|
364
|
+
if result.found:
|
|
365
|
+
self._covenant_count += 1
|
|
366
|
+
if self.log_extractions:
|
|
367
|
+
logger.info(
|
|
368
|
+
f"Potential covenant found in message from {channel} "
|
|
369
|
+
f"(command: {result.message.payload.command.name if result.message else 'unknown'})"
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
return result
|
|
373
|
+
|
|
374
|
+
@property
|
|
375
|
+
def extraction_count(self) -> int:
|
|
376
|
+
"""Number of extraction attempts."""
|
|
377
|
+
return self._extraction_count
|
|
378
|
+
|
|
379
|
+
@property
|
|
380
|
+
def covenant_count(self) -> int:
|
|
381
|
+
"""Number of potential covenants found."""
|
|
382
|
+
return self._covenant_count
|