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,670 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
4
|
+
|
|
5
|
+
from ciris_engine.logic.adapters.base_observer import BaseObserver
|
|
6
|
+
from ciris_engine.logic.adapters.discord.discord_vision_helper import DiscordVisionHelper
|
|
7
|
+
from ciris_engine.logic.buses import BusManager
|
|
8
|
+
from ciris_engine.logic.secrets.service import SecretsService
|
|
9
|
+
from ciris_engine.logic.utils.task_thought_factory import create_task, create_thought
|
|
10
|
+
from ciris_engine.schemas.runtime.enums import ThoughtType
|
|
11
|
+
from ciris_engine.schemas.runtime.messages import DiscordMessage
|
|
12
|
+
from ciris_engine.schemas.runtime.models import TaskContext
|
|
13
|
+
from ciris_engine.schemas.types import JSONDict
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
PASSIVE_CONTEXT_LIMIT = 20
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DiscordObserver(BaseObserver[DiscordMessage]):
|
|
21
|
+
"""
|
|
22
|
+
Observes DiscordMessage objects directly from Discord adapter, converts them into OBSERVATION
|
|
23
|
+
payloads, and forwards them to the agent via MultiServiceSink. Uses only MultiServiceSink
|
|
24
|
+
architecture without event queues. Includes adaptive filtering for message prioritization.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
monitored_channel_ids: Optional[List[str]] = None,
|
|
30
|
+
deferral_channel_id: Optional[str] = None,
|
|
31
|
+
wa_user_ids: Optional[List[str]] = None,
|
|
32
|
+
memory_service: Optional[Any] = None,
|
|
33
|
+
agent_id: Optional[str] = None,
|
|
34
|
+
bus_manager: Optional[BusManager] = None,
|
|
35
|
+
filter_service: Optional[Any] = None,
|
|
36
|
+
secrets_service: Optional[SecretsService] = None,
|
|
37
|
+
communication_service: Optional[Any] = None,
|
|
38
|
+
time_service: Optional[Any] = None,
|
|
39
|
+
) -> None:
|
|
40
|
+
super().__init__(
|
|
41
|
+
on_observe=lambda _: asyncio.sleep(0),
|
|
42
|
+
bus_manager=bus_manager,
|
|
43
|
+
memory_service=memory_service,
|
|
44
|
+
agent_id=agent_id,
|
|
45
|
+
filter_service=filter_service,
|
|
46
|
+
secrets_service=secrets_service,
|
|
47
|
+
time_service=time_service,
|
|
48
|
+
origin_service="discord",
|
|
49
|
+
)
|
|
50
|
+
self.communication_service = communication_service
|
|
51
|
+
|
|
52
|
+
self.deferral_channel_id = deferral_channel_id
|
|
53
|
+
self.wa_user_ids = wa_user_ids or []
|
|
54
|
+
|
|
55
|
+
self.monitored_channel_ids = monitored_channel_ids or []
|
|
56
|
+
|
|
57
|
+
# Log configuration for debugging
|
|
58
|
+
logger.info("DiscordObserver initialized with:")
|
|
59
|
+
logger.info(f" - Monitored channels: {self.monitored_channel_ids}")
|
|
60
|
+
logger.info(f" - Deferral channel: {self.deferral_channel_id}")
|
|
61
|
+
logger.info(f" - WA user IDs: {self.wa_user_ids}")
|
|
62
|
+
|
|
63
|
+
# Initialize vision helper (native multimodal is always available)
|
|
64
|
+
self._vision_helper = DiscordVisionHelper()
|
|
65
|
+
logger.info("Discord Vision Helper initialized - native multimodal image processing enabled")
|
|
66
|
+
|
|
67
|
+
async def _send_deferral_message(self, content: str) -> None:
|
|
68
|
+
"""Send a message to the deferral channel."""
|
|
69
|
+
if not self.communication_service:
|
|
70
|
+
logger.warning("No communication service available to send deferral message")
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
if not self.deferral_channel_id:
|
|
74
|
+
logger.warning("No deferral channel configured")
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
await self.communication_service.send_message(self.deferral_channel_id, content)
|
|
79
|
+
logger.debug(f"Sent deferral response: {content[:100]}...")
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.error(f"Failed to send deferral message: {e}")
|
|
82
|
+
|
|
83
|
+
async def start(self) -> None:
|
|
84
|
+
"""Start the observer - no polling needed since we receive messages directly."""
|
|
85
|
+
logger.info("DiscordObserver started - ready to receive messages directly from Discord adapter")
|
|
86
|
+
|
|
87
|
+
async def stop(self) -> None:
|
|
88
|
+
"""Stop the observer - no background tasks to clean up."""
|
|
89
|
+
logger.info("DiscordObserver stopped")
|
|
90
|
+
|
|
91
|
+
def _extract_channel_id(self, full_channel_id: str) -> str:
|
|
92
|
+
"""Extract the raw channel ID from discord_channelid or discord_guildid_channelid format."""
|
|
93
|
+
if full_channel_id.startswith("discord_"):
|
|
94
|
+
parts = full_channel_id.split("_")
|
|
95
|
+
if len(parts) == 2:
|
|
96
|
+
# Format: discord_channelid
|
|
97
|
+
return parts[1]
|
|
98
|
+
elif len(parts) == 3:
|
|
99
|
+
# Format: discord_guildid_channelid
|
|
100
|
+
return parts[2]
|
|
101
|
+
return full_channel_id # Return as-is if not in expected format
|
|
102
|
+
|
|
103
|
+
async def _should_process_message(self, msg: DiscordMessage) -> bool:
|
|
104
|
+
"""Check if Discord observer should process this message."""
|
|
105
|
+
# Extract the raw channel ID from the formatted channel_id
|
|
106
|
+
raw_channel_id = self._extract_channel_id(msg.channel_id) if msg.channel_id else ""
|
|
107
|
+
|
|
108
|
+
# Check if message is from a monitored channel or deferral channel
|
|
109
|
+
is_from_monitored = False
|
|
110
|
+
if self.monitored_channel_ids:
|
|
111
|
+
# Check both raw channel ID and full formatted ID
|
|
112
|
+
is_from_monitored = (
|
|
113
|
+
raw_channel_id in self.monitored_channel_ids or msg.channel_id in self.monitored_channel_ids
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
is_from_deferral = False
|
|
117
|
+
if self.deferral_channel_id:
|
|
118
|
+
# Check both raw channel ID and full formatted ID
|
|
119
|
+
is_from_deferral = raw_channel_id == self.deferral_channel_id or msg.channel_id == self.deferral_channel_id
|
|
120
|
+
|
|
121
|
+
logger.info(f"Message from {msg.author_name} (ID: {msg.author_id}) in channel {msg.channel_id}")
|
|
122
|
+
logger.info(f" - Raw channel ID: {raw_channel_id}")
|
|
123
|
+
logger.info(f" - Is from monitored channel: {is_from_monitored}")
|
|
124
|
+
logger.info(f" - Is from deferral channel: {is_from_deferral}")
|
|
125
|
+
logger.info(f" - Monitored channels: {self.monitored_channel_ids}")
|
|
126
|
+
logger.info(f" - Deferral channel ID: {self.deferral_channel_id}")
|
|
127
|
+
|
|
128
|
+
return is_from_monitored or is_from_deferral
|
|
129
|
+
|
|
130
|
+
def _detect_and_replace_spoofed_markers(self, content: str) -> str:
|
|
131
|
+
"""Detect and replace attempts to spoof CIRIS security markers."""
|
|
132
|
+
from ciris_engine.logic.adapters.base_observer import detect_and_replace_spoofed_markers
|
|
133
|
+
|
|
134
|
+
return detect_and_replace_spoofed_markers(content)
|
|
135
|
+
|
|
136
|
+
async def _collect_message_attachments_with_reply(self, raw_message: Any) -> JSONDict:
|
|
137
|
+
"""Collect attachments from message and reply with priority rules.
|
|
138
|
+
|
|
139
|
+
Priority rules:
|
|
140
|
+
1. Reply message wins - if reply has image and 3 attachments, replied-to message only contributes text
|
|
141
|
+
2. Maximum 1 image total across both messages
|
|
142
|
+
3. Maximum 3 documents total across both messages
|
|
143
|
+
4. Reply context (text) is always included if this is a reply
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
dict with keys: images, documents, embeds, reply_context
|
|
147
|
+
"""
|
|
148
|
+
result: JSONDict = {"images": [], "documents": [], "embeds": [], "reply_context": None}
|
|
149
|
+
|
|
150
|
+
# Fetch referenced message and build reply context
|
|
151
|
+
referenced_message = await self._fetch_referenced_message(raw_message)
|
|
152
|
+
if referenced_message:
|
|
153
|
+
reply_ctx = self._build_reply_context(referenced_message)
|
|
154
|
+
result["reply_context"] = reply_ctx
|
|
155
|
+
|
|
156
|
+
# Build message processing order (reply gets priority)
|
|
157
|
+
messages_to_process = self._build_message_processing_order(raw_message, referenced_message)
|
|
158
|
+
|
|
159
|
+
# Process attachments respecting limits
|
|
160
|
+
self._process_message_attachments(messages_to_process, result)
|
|
161
|
+
|
|
162
|
+
return result
|
|
163
|
+
|
|
164
|
+
async def _fetch_referenced_message(self, raw_message: Any) -> Optional[Any]:
|
|
165
|
+
"""Fetch the referenced message if this is a reply."""
|
|
166
|
+
if not hasattr(raw_message, "reference") or not raw_message.reference:
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
# Use resolved message if available
|
|
171
|
+
if hasattr(raw_message.reference, "resolved") and raw_message.reference.resolved:
|
|
172
|
+
return raw_message.reference.resolved
|
|
173
|
+
|
|
174
|
+
# Fallback: fetch manually if not resolved
|
|
175
|
+
channel = raw_message.channel
|
|
176
|
+
return await channel.fetch_message(raw_message.reference.message_id)
|
|
177
|
+
|
|
178
|
+
except Exception as e:
|
|
179
|
+
logger.warning(f"Failed to fetch referenced message: {e}")
|
|
180
|
+
return None
|
|
181
|
+
|
|
182
|
+
def _build_reply_context(self, referenced_message: Any) -> Optional[str]:
|
|
183
|
+
"""Build reply context string from referenced message."""
|
|
184
|
+
if not referenced_message or not referenced_message.content:
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
author_name = getattr(referenced_message.author, "display_name", "Unknown")
|
|
188
|
+
return f"@{author_name}: {referenced_message.content}"
|
|
189
|
+
|
|
190
|
+
def _build_message_processing_order(
|
|
191
|
+
self, raw_message: Any, referenced_message: Optional[Any]
|
|
192
|
+
) -> List[Tuple[str, Any]]:
|
|
193
|
+
"""Build the order of messages to process (reply gets priority)."""
|
|
194
|
+
messages_to_process: List[Tuple[str, Any]] = []
|
|
195
|
+
|
|
196
|
+
# Reply message gets first priority
|
|
197
|
+
if raw_message:
|
|
198
|
+
messages_to_process.append(("reply", raw_message))
|
|
199
|
+
|
|
200
|
+
# Original message gets second priority
|
|
201
|
+
if referenced_message:
|
|
202
|
+
messages_to_process.append(("original", referenced_message))
|
|
203
|
+
|
|
204
|
+
return messages_to_process
|
|
205
|
+
|
|
206
|
+
def _process_message_attachments(self, messages_to_process: List[Tuple[str, Any]], result: JSONDict) -> None:
|
|
207
|
+
"""Process attachments from messages respecting limits."""
|
|
208
|
+
image_count = 0
|
|
209
|
+
document_count = 0
|
|
210
|
+
|
|
211
|
+
# Get lists with type safety
|
|
212
|
+
images_list: List[Any] = result.get("images", []) if isinstance(result.get("images"), list) else [] # type: ignore[assignment]
|
|
213
|
+
documents_list: List[Any] = result.get("documents", []) if isinstance(result.get("documents"), list) else [] # type: ignore[assignment]
|
|
214
|
+
|
|
215
|
+
for message_type, message in messages_to_process:
|
|
216
|
+
if not message:
|
|
217
|
+
continue
|
|
218
|
+
|
|
219
|
+
# Process image attachments (max 1 total)
|
|
220
|
+
image_count += self._process_image_attachments(message, images_list, image_count)
|
|
221
|
+
|
|
222
|
+
# Process document attachments (max 3 total)
|
|
223
|
+
document_count += self._process_document_attachments(message, documents_list, document_count)
|
|
224
|
+
|
|
225
|
+
# Process embeds (only from reply message to avoid duplication)
|
|
226
|
+
if message_type == "reply" and hasattr(message, "embeds") and message.embeds:
|
|
227
|
+
result["embeds"] = message.embeds
|
|
228
|
+
|
|
229
|
+
# Update result with processed lists
|
|
230
|
+
result["images"] = images_list
|
|
231
|
+
result["documents"] = documents_list
|
|
232
|
+
|
|
233
|
+
def _process_image_attachments(self, message: Any, images_list: List[Any], current_count: int) -> int:
|
|
234
|
+
"""Process image attachments from a message, return count of images added."""
|
|
235
|
+
added_count = 0
|
|
236
|
+
if not hasattr(message, "attachments") or not message.attachments or current_count >= 1:
|
|
237
|
+
return added_count
|
|
238
|
+
|
|
239
|
+
for attachment in message.attachments:
|
|
240
|
+
if current_count + added_count >= 1:
|
|
241
|
+
break
|
|
242
|
+
if self._is_image_attachment(attachment):
|
|
243
|
+
images_list.append(attachment)
|
|
244
|
+
added_count += 1
|
|
245
|
+
|
|
246
|
+
return added_count
|
|
247
|
+
|
|
248
|
+
def _process_document_attachments(self, message: Any, documents_list: List[Any], current_count: int) -> int:
|
|
249
|
+
"""Process document attachments from a message, return count of documents added."""
|
|
250
|
+
added_count = 0
|
|
251
|
+
if not hasattr(message, "attachments") or not message.attachments or current_count >= 3:
|
|
252
|
+
return added_count
|
|
253
|
+
|
|
254
|
+
for attachment in message.attachments:
|
|
255
|
+
if current_count + added_count >= 3:
|
|
256
|
+
break
|
|
257
|
+
# Use document parser's filtering if available
|
|
258
|
+
if self._document_parser.is_available():
|
|
259
|
+
if self._document_parser._is_document_attachment(attachment):
|
|
260
|
+
documents_list.append(attachment)
|
|
261
|
+
added_count += 1
|
|
262
|
+
|
|
263
|
+
return added_count
|
|
264
|
+
|
|
265
|
+
def _is_image_attachment(self, attachment: Any) -> bool:
|
|
266
|
+
"""Check if attachment is an image."""
|
|
267
|
+
if not hasattr(attachment, "content_type") or not attachment.content_type:
|
|
268
|
+
return False
|
|
269
|
+
|
|
270
|
+
image_types = ["image/png", "image/jpeg", "image/jpg", "image/gif", "image/webp", "image/svg+xml", "image/bmp"]
|
|
271
|
+
return attachment.content_type.lower() in image_types
|
|
272
|
+
|
|
273
|
+
async def _enhance_message(self, msg: DiscordMessage) -> DiscordMessage:
|
|
274
|
+
"""Enhance Discord messages with vision processing, document parsing, reply context, and anti-spoofing protection."""
|
|
275
|
+
# First, detect and replace any spoofed markers
|
|
276
|
+
clean_content = self._detect_and_replace_spoofed_markers(msg.content)
|
|
277
|
+
|
|
278
|
+
additional_content = ""
|
|
279
|
+
collected_images: List[Any] = [] # ImageContent objects for native multimodal
|
|
280
|
+
|
|
281
|
+
# Check if this message is a reply and process both messages with attachment limits
|
|
282
|
+
if hasattr(msg, "raw_message") and msg.raw_message:
|
|
283
|
+
try:
|
|
284
|
+
# Detect reply and collect attachment/image data with priority rules
|
|
285
|
+
attachments_data = await self._collect_message_attachments_with_reply(msg.raw_message)
|
|
286
|
+
|
|
287
|
+
# Process images for native multimodal (convert to ImageContent)
|
|
288
|
+
images_raw = attachments_data.get("images")
|
|
289
|
+
if self._vision_helper.is_available() and images_raw and isinstance(images_raw, list):
|
|
290
|
+
# Convert Discord attachments to ImageContent for native multimodal
|
|
291
|
+
image_contents = await self._vision_helper.process_image_attachments_list(images_raw)
|
|
292
|
+
if image_contents:
|
|
293
|
+
collected_images.extend(image_contents)
|
|
294
|
+
logger.info(
|
|
295
|
+
f"[VISION] Converted {len(image_contents)} attachments to ImageContent for native multimodal"
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# Process embeds for additional images
|
|
299
|
+
embeds_raw = attachments_data.get("embeds")
|
|
300
|
+
if embeds_raw and isinstance(embeds_raw, list):
|
|
301
|
+
embed_images = await self._vision_helper.process_embeds(embeds_raw)
|
|
302
|
+
if embed_images:
|
|
303
|
+
collected_images.extend(embed_images)
|
|
304
|
+
logger.info(f"[VISION] Converted {len(embed_images)} embed images to ImageContent")
|
|
305
|
+
|
|
306
|
+
# Process document attachments if document parser is available
|
|
307
|
+
documents_raw = attachments_data.get("documents")
|
|
308
|
+
if self._document_parser.is_available() and documents_raw and isinstance(documents_raw, list):
|
|
309
|
+
document_text = await self._document_parser.process_attachments(documents_raw)
|
|
310
|
+
|
|
311
|
+
if document_text:
|
|
312
|
+
additional_content += "\n\n[Document Analysis]\n" + document_text
|
|
313
|
+
|
|
314
|
+
# Add reply context if this is a reply
|
|
315
|
+
if attachments_data.get("reply_context"):
|
|
316
|
+
additional_content += f"\n\n[Reply Context]\n{attachments_data['reply_context']}"
|
|
317
|
+
|
|
318
|
+
except Exception as e:
|
|
319
|
+
logger.error(f"Failed to process attachments in message {msg.message_id}: {e}")
|
|
320
|
+
additional_content += f"\n\n[Attachment Processing Error: {str(e)}]"
|
|
321
|
+
|
|
322
|
+
# Create enhanced message if we have additional content, cleaned content, or images
|
|
323
|
+
if additional_content or clean_content != msg.content or collected_images:
|
|
324
|
+
return DiscordMessage(
|
|
325
|
+
message_id=msg.message_id,
|
|
326
|
+
content=clean_content + additional_content,
|
|
327
|
+
author_id=msg.author_id,
|
|
328
|
+
author_name=msg.author_name,
|
|
329
|
+
channel_id=msg.channel_id,
|
|
330
|
+
is_bot=msg.is_bot,
|
|
331
|
+
is_dm=msg.is_dm,
|
|
332
|
+
raw_message=msg.raw_message,
|
|
333
|
+
images=collected_images, # Native multimodal images
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
return msg
|
|
337
|
+
|
|
338
|
+
async def _handle_priority_observation(self, msg: DiscordMessage, filter_result: Any) -> None:
|
|
339
|
+
"""Handle high-priority messages with immediate processing"""
|
|
340
|
+
monitored_channel_ids = self.monitored_channel_ids or []
|
|
341
|
+
|
|
342
|
+
raw_channel_id = self._extract_channel_id(msg.channel_id) if msg.channel_id else ""
|
|
343
|
+
|
|
344
|
+
# Log the routing decision
|
|
345
|
+
logger.info(
|
|
346
|
+
f"[DISCORD-PRIORITY] Routing message {msg.message_id} from @{msg.author_name} "
|
|
347
|
+
f"(ID: {msg.author_id}) in channel {msg.channel_id}"
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
# First check if it's a monitored channel - create task regardless of author
|
|
351
|
+
if raw_channel_id in monitored_channel_ids or msg.channel_id in monitored_channel_ids:
|
|
352
|
+
logger.info(
|
|
353
|
+
f"[DISCORD-PRIORITY] Channel {msg.channel_id} IS MONITORED - CREATING PRIORITY TASK "
|
|
354
|
+
f"(priority: {filter_result.priority.value}, filters: {', '.join(filter_result.triggered_filters)})"
|
|
355
|
+
)
|
|
356
|
+
await self._create_priority_observation_result(msg, filter_result)
|
|
357
|
+
# Then check if it's deferral channel AND author is WA
|
|
358
|
+
elif (raw_channel_id == self.deferral_channel_id or msg.channel_id == self.deferral_channel_id) and (
|
|
359
|
+
msg.author_id in self.wa_user_ids
|
|
360
|
+
):
|
|
361
|
+
logger.info(
|
|
362
|
+
f"[DISCORD-PRIORITY] Channel {msg.channel_id} is DEFERRAL channel and author {msg.author_name} "
|
|
363
|
+
f"IS WA - routing to WA feedback queue"
|
|
364
|
+
)
|
|
365
|
+
await self._add_to_feedback_queue(msg)
|
|
366
|
+
else:
|
|
367
|
+
logger.warning(
|
|
368
|
+
f"[DISCORD-PRIORITY] NO TASK CREATED for message {msg.message_id} from @{msg.author_name} "
|
|
369
|
+
f"in channel {msg.channel_id} - REASON: Channel not monitored or not valid deferral"
|
|
370
|
+
)
|
|
371
|
+
logger.info(f" - Raw channel ID: {raw_channel_id}")
|
|
372
|
+
logger.info(f" - Monitored channels: {monitored_channel_ids}")
|
|
373
|
+
logger.info(
|
|
374
|
+
f" - Channel {msg.channel_id} monitored: {raw_channel_id in monitored_channel_ids or msg.channel_id in monitored_channel_ids}"
|
|
375
|
+
)
|
|
376
|
+
logger.info(f" - Deferral channel: {self.deferral_channel_id}")
|
|
377
|
+
logger.info(
|
|
378
|
+
f" - Is deferral channel: {msg.channel_id == self.deferral_channel_id or raw_channel_id == self.deferral_channel_id}"
|
|
379
|
+
)
|
|
380
|
+
if msg.channel_id == self.deferral_channel_id or raw_channel_id == self.deferral_channel_id:
|
|
381
|
+
logger.info(
|
|
382
|
+
f" - Author ID {msg.author_id} in WA list {self.wa_user_ids}: {msg.author_id in self.wa_user_ids}"
|
|
383
|
+
)
|
|
384
|
+
# Username matching removed for security - only numeric IDs are checked
|
|
385
|
+
|
|
386
|
+
def _create_task_context_with_extras(self, msg: DiscordMessage) -> TaskContext:
|
|
387
|
+
"""Create a TaskContext from a Discord message."""
|
|
388
|
+
return TaskContext(
|
|
389
|
+
channel_id=msg.channel_id, user_id=msg.author_id, correlation_id=msg.message_id, parent_task_id=None
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
async def _handle_passive_observation(self, msg: DiscordMessage) -> None:
|
|
393
|
+
"""Handle passive observation - routes to WA feedback queue if appropriate."""
|
|
394
|
+
monitored_channel_ids = self.monitored_channel_ids or []
|
|
395
|
+
|
|
396
|
+
raw_channel_id = self._extract_channel_id(msg.channel_id) if msg.channel_id else ""
|
|
397
|
+
|
|
398
|
+
# Log the routing decision
|
|
399
|
+
logger.info(
|
|
400
|
+
f"[DISCORD-PASSIVE] Routing message {msg.message_id} from @{msg.author_name} "
|
|
401
|
+
f"(ID: {msg.author_id}) in channel {msg.channel_id}"
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
# First check if it's a monitored channel - create task regardless of author
|
|
405
|
+
if raw_channel_id in monitored_channel_ids or msg.channel_id in monitored_channel_ids:
|
|
406
|
+
logger.info(f"[DISCORD-PASSIVE] Channel {msg.channel_id} IS MONITORED - CREATING PASSIVE TASK")
|
|
407
|
+
await self._create_passive_observation_result(msg)
|
|
408
|
+
# Then check if it's deferral channel AND author is WA
|
|
409
|
+
elif (raw_channel_id == self.deferral_channel_id or msg.channel_id == self.deferral_channel_id) and (
|
|
410
|
+
msg.author_id in self.wa_user_ids
|
|
411
|
+
):
|
|
412
|
+
logger.info(
|
|
413
|
+
f"[DISCORD-PASSIVE] Channel {msg.channel_id} is DEFERRAL channel and author {msg.author_name} "
|
|
414
|
+
f"IS WA - routing to WA feedback queue"
|
|
415
|
+
)
|
|
416
|
+
await self._add_to_feedback_queue(msg)
|
|
417
|
+
else:
|
|
418
|
+
logger.warning(
|
|
419
|
+
f"[DISCORD-PASSIVE] NO TASK CREATED for message {msg.message_id} from @{msg.author_name} "
|
|
420
|
+
f"in channel {msg.channel_id} - REASON: Channel not monitored or not valid deferral"
|
|
421
|
+
)
|
|
422
|
+
logger.info(f" - Raw channel ID: {raw_channel_id}")
|
|
423
|
+
logger.info(f" - Monitored channels: {monitored_channel_ids}")
|
|
424
|
+
logger.info(
|
|
425
|
+
f" - Channel {msg.channel_id} monitored: {raw_channel_id in monitored_channel_ids or msg.channel_id in monitored_channel_ids}"
|
|
426
|
+
)
|
|
427
|
+
logger.info(f" - Deferral channel: {self.deferral_channel_id}")
|
|
428
|
+
logger.info(
|
|
429
|
+
f" - Is deferral channel: {msg.channel_id == self.deferral_channel_id or raw_channel_id == self.deferral_channel_id}"
|
|
430
|
+
)
|
|
431
|
+
if msg.channel_id == self.deferral_channel_id or raw_channel_id == self.deferral_channel_id:
|
|
432
|
+
logger.info(
|
|
433
|
+
f" - Author ID {msg.author_id} in WA list {self.wa_user_ids}: {msg.author_id in self.wa_user_ids}"
|
|
434
|
+
)
|
|
435
|
+
# Username matching removed for security - only numeric IDs are checked
|
|
436
|
+
|
|
437
|
+
async def _add_to_feedback_queue(self, msg: DiscordMessage) -> None:
|
|
438
|
+
"""Process guidance/feedback from WA in deferral channel."""
|
|
439
|
+
try:
|
|
440
|
+
# First validate that the user is a wise authority
|
|
441
|
+
# Only check numeric IDs for security - usernames can be spoofed
|
|
442
|
+
is_wise_authority = msg.author_id in self.wa_user_ids
|
|
443
|
+
|
|
444
|
+
if not is_wise_authority:
|
|
445
|
+
error_msg = f"🚫 **Not Authorized**: User `{msg.author_name}` (ID: `{msg.author_id}`) is not a Wise Authority. Not proceeding with guidance processing."
|
|
446
|
+
logger.warning(f"Non-WA user {msg.author_name} ({msg.author_id}) attempted to provide guidance")
|
|
447
|
+
await self._send_deferral_message(error_msg)
|
|
448
|
+
return
|
|
449
|
+
import re
|
|
450
|
+
import uuid
|
|
451
|
+
from datetime import datetime, timezone
|
|
452
|
+
|
|
453
|
+
from ciris_engine.logic import persistence
|
|
454
|
+
from ciris_engine.schemas.runtime.enums import TaskStatus, ThoughtStatus
|
|
455
|
+
from ciris_engine.schemas.runtime.models import Task, Thought
|
|
456
|
+
|
|
457
|
+
# Check if this is a reply to a deferral report
|
|
458
|
+
referenced_thought_id = None
|
|
459
|
+
|
|
460
|
+
# First check if this message is replying to another message
|
|
461
|
+
logger.info(f"Checking reply detection for message {msg.message_id}")
|
|
462
|
+
if hasattr(msg, "raw_message") and msg.raw_message:
|
|
463
|
+
logger.info(f"Message has raw_message: {msg.raw_message.id}")
|
|
464
|
+
if hasattr(msg.raw_message, "reference"):
|
|
465
|
+
ref = msg.raw_message.reference
|
|
466
|
+
logger.info(f"Message reference: {ref}")
|
|
467
|
+
if ref and ref.resolved:
|
|
468
|
+
# Check if the referenced message contains a thought ID
|
|
469
|
+
ref_content = ref.resolved.content
|
|
470
|
+
logger.info(f"Referenced message content: {ref_content}")
|
|
471
|
+
thought_id_pattern = r"Thought ID:\s*([a-zA-Z0-9_-]+)"
|
|
472
|
+
match = re.search(thought_id_pattern, ref_content)
|
|
473
|
+
if match:
|
|
474
|
+
referenced_thought_id = match.group(1)
|
|
475
|
+
logger.info(f"Found reply to deferral for thought ID: {referenced_thought_id}")
|
|
476
|
+
else:
|
|
477
|
+
logger.info("No thought ID pattern found in referenced message")
|
|
478
|
+
else:
|
|
479
|
+
logger.info("Reference not resolved or None")
|
|
480
|
+
else:
|
|
481
|
+
logger.info("Message has no reference attribute")
|
|
482
|
+
else:
|
|
483
|
+
logger.info("Message has no raw_message")
|
|
484
|
+
|
|
485
|
+
# If not a reply, check if the message itself mentions a thought ID
|
|
486
|
+
if not referenced_thought_id:
|
|
487
|
+
thought_id_pattern = r"(?:thought\s+id|thought_id|re:\s*thought)[\s:]*([a-zA-Z0-9_-]+)"
|
|
488
|
+
match = re.search(thought_id_pattern, msg.content, re.IGNORECASE)
|
|
489
|
+
if match:
|
|
490
|
+
referenced_thought_id = match.group(1)
|
|
491
|
+
logger.info(f"Found thought ID reference in message: {referenced_thought_id}")
|
|
492
|
+
|
|
493
|
+
if referenced_thought_id:
|
|
494
|
+
# This is guidance for a specific deferred thought
|
|
495
|
+
# Find the original thought and its task
|
|
496
|
+
original_thought = persistence.get_thought_by_id(referenced_thought_id)
|
|
497
|
+
if original_thought is None:
|
|
498
|
+
error_msg = f"❌ **Error**: Thought `{referenced_thought_id}` not found in database"
|
|
499
|
+
logger.warning(f"Thought {referenced_thought_id} not found in database")
|
|
500
|
+
await self._send_deferral_message(error_msg)
|
|
501
|
+
elif original_thought.status != ThoughtStatus.DEFERRED:
|
|
502
|
+
error_msg = f"❌ **Error**: Thought `{referenced_thought_id}` found but status is `{original_thought.status}`, not `DEFERRED`"
|
|
503
|
+
logger.warning(
|
|
504
|
+
f"Thought {referenced_thought_id} found but status is {original_thought.status}, not DEFERRED"
|
|
505
|
+
)
|
|
506
|
+
await self._send_deferral_message(error_msg)
|
|
507
|
+
else:
|
|
508
|
+
# Reactivate the original task
|
|
509
|
+
original_task = persistence.get_task_by_id(original_thought.source_task_id)
|
|
510
|
+
if original_task and self.time_service and self.agent_id:
|
|
511
|
+
persistence.update_task_status(
|
|
512
|
+
original_task.task_id, TaskStatus.ACTIVE, self.agent_id, self.time_service
|
|
513
|
+
)
|
|
514
|
+
logger.info(f"Reactivated task {original_task.task_id} due to guidance")
|
|
515
|
+
|
|
516
|
+
# Extract deferral reason from the original thought's final_action
|
|
517
|
+
deferral_reason = "Unknown deferral reason"
|
|
518
|
+
if original_thought.final_action:
|
|
519
|
+
action_params = original_thought.final_action.action_params
|
|
520
|
+
if isinstance(action_params, dict) and "reason" in action_params:
|
|
521
|
+
reason_value = action_params["reason"]
|
|
522
|
+
deferral_reason = (
|
|
523
|
+
str(reason_value) if reason_value is not None else "Unknown deferral reason"
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
# Create a new thought with PROCESSING status that includes original content + deferral reason + WA response
|
|
527
|
+
# Reset round_number to 0 to give fresh rounds after deferral
|
|
528
|
+
# Create guidance context by copying original context and adding guidance data
|
|
529
|
+
if original_thought.context:
|
|
530
|
+
guidance_context = original_thought.context.model_copy(
|
|
531
|
+
update={
|
|
532
|
+
"guidance_message_id": msg.message_id,
|
|
533
|
+
"guidance_author": msg.author_name,
|
|
534
|
+
"guidance_content": msg.content,
|
|
535
|
+
"is_guidance_response": True,
|
|
536
|
+
"original_round_number": original_thought.round_number, # Store original for reference
|
|
537
|
+
"original_thought_id": referenced_thought_id,
|
|
538
|
+
"deferral_reason": deferral_reason,
|
|
539
|
+
}
|
|
540
|
+
)
|
|
541
|
+
else:
|
|
542
|
+
from ciris_engine.schemas.runtime.models import ThoughtContext
|
|
543
|
+
|
|
544
|
+
# Create a ThoughtContext for the guidance thought
|
|
545
|
+
guidance_context = ThoughtContext(
|
|
546
|
+
task_id=original_task.task_id,
|
|
547
|
+
channel_id=msg.channel_id,
|
|
548
|
+
round_number=0,
|
|
549
|
+
depth=0,
|
|
550
|
+
parent_thought_id=referenced_thought_id,
|
|
551
|
+
correlation_id=str(uuid.uuid4()),
|
|
552
|
+
agent_occurrence_id=self.agent_occurrence_id, # FIXED: Now includes occurrence_id!
|
|
553
|
+
)
|
|
554
|
+
# Add extra fields after creation
|
|
555
|
+
setattr(guidance_context, "guidance_message_id", msg.message_id)
|
|
556
|
+
setattr(guidance_context, "guidance_author", msg.author_name)
|
|
557
|
+
setattr(guidance_context, "guidance_content", msg.content)
|
|
558
|
+
setattr(guidance_context, "is_guidance_response", True)
|
|
559
|
+
setattr(guidance_context, "original_round_number", original_thought.round_number)
|
|
560
|
+
setattr(guidance_context, "original_thought_id", referenced_thought_id)
|
|
561
|
+
setattr(guidance_context, "deferral_reason", deferral_reason)
|
|
562
|
+
|
|
563
|
+
# Combine content with WA response last to ensure it's acted upon
|
|
564
|
+
combined_content = (
|
|
565
|
+
f"ORIGINAL THOUGHT: {original_thought.content}\n\n"
|
|
566
|
+
f"DEFERRED WITH QUESTION FOR WA: {deferral_reason}\n\n"
|
|
567
|
+
f"WISE AUTHORITY RESPONSE: {msg.content}"
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
# Use factory to create guidance thought with proper occurrence_id
|
|
571
|
+
guidance_thought = create_thought(
|
|
572
|
+
source_task_id=original_task.task_id,
|
|
573
|
+
agent_occurrence_id=self.agent_occurrence_id,
|
|
574
|
+
correlation_id=guidance_context.correlation_id,
|
|
575
|
+
content=combined_content,
|
|
576
|
+
time_service=self.time_service,
|
|
577
|
+
thought_type=ThoughtType.GUIDANCE,
|
|
578
|
+
status=ThoughtStatus.PENDING, # Must be PENDING to enter processing queue!
|
|
579
|
+
channel_id=msg.channel_id,
|
|
580
|
+
round_number=0, # Reset to 0 for fresh processing after guidance
|
|
581
|
+
thought_depth=0,
|
|
582
|
+
parent_thought_id=referenced_thought_id,
|
|
583
|
+
context=guidance_context,
|
|
584
|
+
)
|
|
585
|
+
persistence.add_thought(guidance_thought)
|
|
586
|
+
logger.info(
|
|
587
|
+
f"Created guidance thought {guidance_thought.thought_id} as child of deferred thought {referenced_thought_id}"
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
# Send success confirmation
|
|
591
|
+
success_msg = (
|
|
592
|
+
f"✅ **Guidance Received**: Successfully processed guidance for thought `{referenced_thought_id}`\n"
|
|
593
|
+
f"📝 **Task**: Reactivated task `{original_task.task_id}`\n"
|
|
594
|
+
f"🧠 **New Thought**: Created guidance thought `{guidance_thought.thought_id}`\n"
|
|
595
|
+
"🔄 **Status**: Ready for processing"
|
|
596
|
+
)
|
|
597
|
+
await self._send_deferral_message(success_msg)
|
|
598
|
+
return
|
|
599
|
+
|
|
600
|
+
# If we get here, it's unsolicited guidance - create a new task using factory
|
|
601
|
+
task = create_task(
|
|
602
|
+
description=f"Guidance received from authorized WA {msg.author_name} (ID: {msg.author_id}) please act accordingly",
|
|
603
|
+
channel_id=msg.channel_id or "system",
|
|
604
|
+
agent_occurrence_id=self.agent_occurrence_id,
|
|
605
|
+
correlation_id=msg.message_id,
|
|
606
|
+
time_service=self.time_service,
|
|
607
|
+
status=TaskStatus.PENDING,
|
|
608
|
+
priority=8, # High priority for guidance
|
|
609
|
+
user_id=msg.author_id,
|
|
610
|
+
)
|
|
611
|
+
persistence.add_task(task)
|
|
612
|
+
logger.info(
|
|
613
|
+
f"Created unsolicited guidance task {task.task_id} - seed thought will be generated automatically"
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
except Exception as e:
|
|
617
|
+
logger.error(f"Error processing guidance message {msg.message_id}: {e}", exc_info=True)
|
|
618
|
+
|
|
619
|
+
async def _get_guild_moderators(self, guild_id: str) -> List[JSONDict]:
|
|
620
|
+
"""Get list of guild moderators using the Discord tool service."""
|
|
621
|
+
try:
|
|
622
|
+
if not self.communication_service:
|
|
623
|
+
logger.warning("No communication service available to get guild moderators")
|
|
624
|
+
return []
|
|
625
|
+
|
|
626
|
+
# Try to get the Discord tool service from communication service
|
|
627
|
+
if hasattr(self.communication_service, "_discord_tool_service"):
|
|
628
|
+
tool_service = self.communication_service._discord_tool_service
|
|
629
|
+
result = await tool_service._get_guild_moderators({"guild_id": guild_id})
|
|
630
|
+
|
|
631
|
+
if result.get("success") and "data" in result:
|
|
632
|
+
moderators_raw = result["data"].get("moderators", [])
|
|
633
|
+
moderators: List[JSONDict] = [dict(mod) for mod in moderators_raw if isinstance(mod, dict)]
|
|
634
|
+
logger.info(f"Retrieved {len(moderators)} moderators from guild {guild_id}")
|
|
635
|
+
return moderators
|
|
636
|
+
else:
|
|
637
|
+
logger.warning(f"Failed to get moderators: {result.get('error', 'Unknown error')}")
|
|
638
|
+
|
|
639
|
+
except Exception as e:
|
|
640
|
+
logger.error(f"Error getting guild moderators: {e}")
|
|
641
|
+
|
|
642
|
+
return []
|
|
643
|
+
|
|
644
|
+
def _extract_guild_id_from_channel(self, channel_id: str) -> Optional[str]:
|
|
645
|
+
"""Extract guild ID from channel ID format (discord_guildid_channelid)."""
|
|
646
|
+
if channel_id and channel_id.startswith("discord_"):
|
|
647
|
+
parts = channel_id.split("_")
|
|
648
|
+
if len(parts) == 3: # Format: discord_guildid_channelid
|
|
649
|
+
return parts[1]
|
|
650
|
+
return None
|
|
651
|
+
|
|
652
|
+
async def _add_custom_context_sections(
|
|
653
|
+
self, task_lines: List[str], msg: DiscordMessage, history_context: List[JSONDict]
|
|
654
|
+
) -> None:
|
|
655
|
+
"""Add Discord-specific ACTIVE MODS section to context."""
|
|
656
|
+
# Add ACTIVE MODS section for Discord
|
|
657
|
+
channel_id = msg.channel_id if msg.channel_id else ""
|
|
658
|
+
guild_id = self._extract_guild_id_from_channel(channel_id)
|
|
659
|
+
if guild_id:
|
|
660
|
+
moderators = await self._get_guild_moderators(guild_id)
|
|
661
|
+
if moderators:
|
|
662
|
+
task_lines.append("\n=== ACTIVE MODS ===")
|
|
663
|
+
for mod in moderators:
|
|
664
|
+
nickname = mod.get("nickname") or mod.get("display_name") or mod.get("username")
|
|
665
|
+
task_lines.append(f"ID: {mod['user_id']} | Nick: {nickname}")
|
|
666
|
+
task_lines.append("=== END ACTIVE MODS ===")
|
|
667
|
+
else:
|
|
668
|
+
task_lines.append("\n=== ACTIVE MODS ===")
|
|
669
|
+
task_lines.append("No moderators available or unable to retrieve moderator list")
|
|
670
|
+
task_lines.append("=== END ACTIVE MODS ===")
|