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,391 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Memorize handler - clean implementation using BusManager
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from datetime import datetime, timedelta, timezone
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
from ciris_engine.logic import persistence
|
|
10
|
+
from ciris_engine.logic.infrastructure.handlers.base_handler import BaseActionHandler
|
|
11
|
+
from ciris_engine.logic.infrastructure.handlers.exceptions import FollowUpCreationError
|
|
12
|
+
from ciris_engine.logic.infrastructure.handlers.helpers import create_follow_up_thought
|
|
13
|
+
from ciris_engine.logic.services.governance.consent import ConsentNotFoundError, ConsentService
|
|
14
|
+
from ciris_engine.schemas.actions import MemorizeParams
|
|
15
|
+
from ciris_engine.schemas.consent.core import ConsentRequest, ConsentStream
|
|
16
|
+
from ciris_engine.schemas.dma.results import ActionSelectionDMAResult
|
|
17
|
+
from ciris_engine.schemas.runtime.contexts import DispatchContext
|
|
18
|
+
from ciris_engine.schemas.runtime.enums import HandlerActionType, ThoughtStatus
|
|
19
|
+
from ciris_engine.schemas.runtime.models import Thought
|
|
20
|
+
from ciris_engine.schemas.services.graph_core import GraphScope, NodeType
|
|
21
|
+
from ciris_engine.schemas.services.operations import MemoryOpStatus
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MemorizeHandler(BaseActionHandler):
|
|
27
|
+
"""Handler for MEMORIZE actions."""
|
|
28
|
+
|
|
29
|
+
async def handle(
|
|
30
|
+
self, result: ActionSelectionDMAResult, thought: Thought, dispatch_context: DispatchContext
|
|
31
|
+
) -> Optional[str]:
|
|
32
|
+
"""Handle a memorize action."""
|
|
33
|
+
thought_id = thought.thought_id
|
|
34
|
+
|
|
35
|
+
# Start audit logging
|
|
36
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
37
|
+
|
|
38
|
+
# Validate parameters
|
|
39
|
+
try:
|
|
40
|
+
params: MemorizeParams = self._validate_and_convert_params(result.action_parameters, MemorizeParams)
|
|
41
|
+
except Exception as e:
|
|
42
|
+
await self._handle_error(HandlerActionType.MEMORIZE, dispatch_context, thought_id, e)
|
|
43
|
+
# Use centralized method to mark failed and create follow-up
|
|
44
|
+
return self.complete_thought_and_create_followup(
|
|
45
|
+
thought=thought,
|
|
46
|
+
follow_up_content=f"MEMORIZE action failed: {e}",
|
|
47
|
+
action_result=result,
|
|
48
|
+
status=ThoughtStatus.FAILED,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Extract node from params - params is MemorizeParams
|
|
52
|
+
assert isinstance(params, MemorizeParams)
|
|
53
|
+
node = params.node
|
|
54
|
+
scope = node.scope
|
|
55
|
+
|
|
56
|
+
# Define managed user attributes that should not be modified by memorize operations
|
|
57
|
+
MANAGED_USER_ATTRIBUTES = {
|
|
58
|
+
# System-managed timestamps
|
|
59
|
+
"last_seen": "System-managed timestamp updated automatically when user activity is detected. Use OBSERVE action instead.",
|
|
60
|
+
"last_interaction": "System-managed timestamp updated automatically when user interacts. Use OBSERVE action instead.",
|
|
61
|
+
"created_at": "System-managed timestamp set once when user is first encountered. Cannot be modified.",
|
|
62
|
+
"first_seen": "System-managed timestamp set once when user is first encountered. Cannot be modified.",
|
|
63
|
+
# System-managed access control
|
|
64
|
+
"trust_level": "Managed by the Adaptive Filter service based on user behavior patterns. Cannot be directly modified.",
|
|
65
|
+
"is_wa": "Managed by the Authentication service. Wise Authority status requires proper authorization flow.",
|
|
66
|
+
"permissions": "Managed by the Authorization service. Permission changes require administrative access.",
|
|
67
|
+
"restrictions": "Managed by the Authorization service. Restriction changes require administrative access.",
|
|
68
|
+
# User privacy & preference settings (user-only modification via API)
|
|
69
|
+
"marketing_opt_in": "User consent for marketing communications. Only modifiable by user via settings API. Use DEFER to request user permission changes.",
|
|
70
|
+
"marketing_opt_in_source": "Source of marketing consent (e.g., 'oauth_login', 'settings_page'). System-managed tracking field. Cannot be modified directly.",
|
|
71
|
+
"location": "User's location preference. Only modifiable by user via settings API. Use OBSERVE to see current value.",
|
|
72
|
+
"interaction_preferences": "User's custom interaction preferences and prompt. Only modifiable by user via settings API. Use OBSERVE to see current value.",
|
|
73
|
+
"user_preferred_name": "User's preferred display name. Only modifiable by user via settings API. Use OBSERVE to see current value.",
|
|
74
|
+
# OAuth identity fields (authentication system managed)
|
|
75
|
+
"oauth_provider": "OAuth provider identity (e.g., 'google', 'github'). Managed by authentication system during OAuth flow. Use OBSERVE to see details.",
|
|
76
|
+
"oauth_email": "Email address from OAuth provider. Managed by authentication system. Use OBSERVE to see email.",
|
|
77
|
+
"oauth_external_id": "External user ID from OAuth provider. Managed by authentication system during OAuth flow. Cannot be modified.",
|
|
78
|
+
"oauth_name": "Full name from OAuth provider. Managed by authentication system during OAuth flow. Use OBSERVE to see name.",
|
|
79
|
+
"oauth_picture": "Profile picture URL from OAuth provider. Managed by authentication system during OAuth flow. Use OBSERVE to see picture URL.",
|
|
80
|
+
"oauth_links": "Linked OAuth identities for this user. Managed by authentication system. Use OBSERVE to see linked accounts.",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# Check if this is a user node and validate attributes
|
|
84
|
+
if node.type == NodeType.USER or node.id.startswith("user/"):
|
|
85
|
+
# Extract user_id from node id (format: user/{uid} or user_{uid})
|
|
86
|
+
user_id = None
|
|
87
|
+
if node.id.startswith("user/"):
|
|
88
|
+
user_id = node.id[5:] # Remove "user/" prefix
|
|
89
|
+
elif node.id.startswith("user_"):
|
|
90
|
+
user_id = node.id[5:] # Remove "user_" prefix
|
|
91
|
+
|
|
92
|
+
if user_id:
|
|
93
|
+
# Check consent status for this user (if service is available)
|
|
94
|
+
try:
|
|
95
|
+
consent_service = ConsentService(time_service=self.time_service)
|
|
96
|
+
consent_status = await consent_service.get_consent(user_id)
|
|
97
|
+
|
|
98
|
+
# Check if TEMPORARY consent has expired
|
|
99
|
+
if consent_status.stream == ConsentStream.TEMPORARY:
|
|
100
|
+
if consent_status.expires_at and datetime.now(timezone.utc) > consent_status.expires_at:
|
|
101
|
+
# Consent expired - start decay protocol
|
|
102
|
+
await consent_service.revoke_consent(user_id, "TEMPORARY consent expired (14 days)")
|
|
103
|
+
|
|
104
|
+
error_msg = (
|
|
105
|
+
f"MEMORIZE BLOCKED: User consent expired. "
|
|
106
|
+
f"User {user_id}'s TEMPORARY consent expired on {consent_status.expires_at}. "
|
|
107
|
+
f"Decay protocol initiated. User data will be anonymized over 90 days."
|
|
108
|
+
)
|
|
109
|
+
logger.warning(f"Blocked memorize for expired consent: user {user_id}")
|
|
110
|
+
|
|
111
|
+
return self.complete_thought_and_create_followup(
|
|
112
|
+
thought=thought,
|
|
113
|
+
follow_up_content=error_msg,
|
|
114
|
+
action_result=result,
|
|
115
|
+
status=ThoughtStatus.FAILED,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Add consent metadata to node attributes
|
|
119
|
+
if hasattr(node, "attributes"):
|
|
120
|
+
if isinstance(node.attributes, dict):
|
|
121
|
+
node.attributes["consent_stream"] = consent_status.stream
|
|
122
|
+
node.attributes["consent_expires_at"] = (
|
|
123
|
+
consent_status.expires_at.isoformat() if consent_status.expires_at else None
|
|
124
|
+
)
|
|
125
|
+
node.attributes["consent_granted_at"] = consent_status.granted_at.isoformat()
|
|
126
|
+
|
|
127
|
+
except ConsentNotFoundError:
|
|
128
|
+
# No consent exists - try to create default TEMPORARY consent
|
|
129
|
+
try:
|
|
130
|
+
now = datetime.now(timezone.utc)
|
|
131
|
+
consent_request = ConsentRequest(
|
|
132
|
+
user_id=user_id,
|
|
133
|
+
stream=ConsentStream.TEMPORARY,
|
|
134
|
+
categories=[], # No categories for default TEMPORARY
|
|
135
|
+
reason="Default TEMPORARY consent on first interaction",
|
|
136
|
+
)
|
|
137
|
+
consent_status = await consent_service.grant_consent(consent_request, channel_id=None)
|
|
138
|
+
|
|
139
|
+
# Add consent metadata to node
|
|
140
|
+
if hasattr(node, "attributes"):
|
|
141
|
+
if isinstance(node.attributes, dict):
|
|
142
|
+
node.attributes["consent_stream"] = ConsentStream.TEMPORARY
|
|
143
|
+
node.attributes["consent_expires_at"] = (now + timedelta(days=14)).isoformat()
|
|
144
|
+
node.attributes["consent_granted_at"] = now.isoformat()
|
|
145
|
+
node.attributes["consent_notice"] = (
|
|
146
|
+
"We forget about you in 14 days unless you say otherwise"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
logger.info(f"Created default TEMPORARY consent for new user {user_id}")
|
|
150
|
+
except (RuntimeError, Exception) as grant_error:
|
|
151
|
+
# Can't grant consent either - service unavailable
|
|
152
|
+
logger.debug(f"Cannot grant consent: {grant_error}. Continuing without consent.")
|
|
153
|
+
except (RuntimeError, Exception) as e:
|
|
154
|
+
# Consent service not available (e.g., in tests or minimal configurations)
|
|
155
|
+
# Log but continue - consent is not mandatory for memorization
|
|
156
|
+
logger.debug(f"Consent service not available: {e}. Continuing without consent check.")
|
|
157
|
+
|
|
158
|
+
if hasattr(node, "attributes") and node.attributes:
|
|
159
|
+
# Handle both dict and GraphNodeAttributes types
|
|
160
|
+
if isinstance(node.attributes, dict):
|
|
161
|
+
attrs_to_check = node.attributes
|
|
162
|
+
elif hasattr(node.attributes, "__dict__"):
|
|
163
|
+
attrs_to_check = node.attributes.__dict__
|
|
164
|
+
else:
|
|
165
|
+
attrs_to_check = {}
|
|
166
|
+
|
|
167
|
+
# Check for any managed attributes
|
|
168
|
+
for attr_name, rationale in MANAGED_USER_ATTRIBUTES.items():
|
|
169
|
+
if attr_name in attrs_to_check:
|
|
170
|
+
error_msg = (
|
|
171
|
+
f"MEMORIZE BLOCKED: Attempt to modify managed user attribute '{attr_name}'. "
|
|
172
|
+
f"\n\nRationale: {rationale}"
|
|
173
|
+
f"\n\nAttempted operation: Set '{attr_name}' to '{attrs_to_check[attr_name]}' for user node '{node.id}'."
|
|
174
|
+
f"\n\nGuidance: If this information needs correction, please use DEFER action to request "
|
|
175
|
+
f"Wise Authority assistance. They can help determine the proper way to update this information "
|
|
176
|
+
f"through the appropriate system channels."
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
logger.warning(
|
|
180
|
+
f"Blocked memorize attempt on managed attribute '{attr_name}' for node '{node.id}'"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
184
|
+
|
|
185
|
+
return self.complete_thought_and_create_followup(
|
|
186
|
+
thought=thought,
|
|
187
|
+
follow_up_content=error_msg,
|
|
188
|
+
action_result=result,
|
|
189
|
+
status=ThoughtStatus.FAILED,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Check if this is an identity node that requires WA authorization
|
|
193
|
+
is_identity_node = (
|
|
194
|
+
scope == GraphScope.IDENTITY or node.id.startswith("agent/identity") or node.type == NodeType.AGENT
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if is_identity_node and not dispatch_context.wa_authorized:
|
|
198
|
+
self.logger.warning(
|
|
199
|
+
"WA authorization required for MEMORIZE to identity graph. " f"Thought {thought_id} denied."
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
203
|
+
|
|
204
|
+
# Use centralized method with FAILED status
|
|
205
|
+
return self.complete_thought_and_create_followup(
|
|
206
|
+
thought=thought,
|
|
207
|
+
follow_up_content="MEMORIZE action failed: WA authorization required for identity changes",
|
|
208
|
+
action_result=result,
|
|
209
|
+
status=ThoughtStatus.FAILED,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# Special handling for CONFIG nodes
|
|
213
|
+
if node.type == NodeType.CONFIG and scope == GraphScope.LOCAL:
|
|
214
|
+
# CONFIG nodes need special structure for the config service
|
|
215
|
+
# Extract key and value from node attributes or id
|
|
216
|
+
|
|
217
|
+
# Try to parse key from node id (e.g., "filter/caps_threshold" -> "filter.caps_threshold")
|
|
218
|
+
config_key = node.id.replace("/", ".")
|
|
219
|
+
|
|
220
|
+
# Check if attributes contain the required data
|
|
221
|
+
node_attrs = node.attributes if hasattr(node, "attributes") else {}
|
|
222
|
+
if isinstance(node_attrs, dict):
|
|
223
|
+
config_value = node_attrs.get("value")
|
|
224
|
+
else:
|
|
225
|
+
# For non-dict attributes, try to extract value
|
|
226
|
+
config_value = getattr(node_attrs, "value", None) if node_attrs else None
|
|
227
|
+
|
|
228
|
+
# Validate we have the minimum required data
|
|
229
|
+
if config_value is None:
|
|
230
|
+
# Provide detailed error message with examples
|
|
231
|
+
error_msg = (
|
|
232
|
+
f"MEMORIZE CONFIG FAILED: Missing required 'value' field for configuration '{config_key}'\n\n"
|
|
233
|
+
"CONFIG nodes require both a key and a value. The key was extracted from the node ID, "
|
|
234
|
+
"but no value was provided in the attributes.\n\n"
|
|
235
|
+
"To set a configuration value, include it in the node attributes. Examples:\n\n"
|
|
236
|
+
"For numeric values:\n"
|
|
237
|
+
" $memorize filter/spam_threshold CONFIG LOCAL value=0.8\n"
|
|
238
|
+
" $memorize filter/trust_decay CONFIG LOCAL value=0.05\n\n"
|
|
239
|
+
"For boolean values:\n"
|
|
240
|
+
" $memorize filter/enabled CONFIG LOCAL value=true\n"
|
|
241
|
+
" $memorize filter/debug_mode CONFIG LOCAL value=false\n\n"
|
|
242
|
+
"For string values:\n"
|
|
243
|
+
" $memorize filter/mode CONFIG LOCAL value=strict\n"
|
|
244
|
+
" $memorize agent/name CONFIG LOCAL value='CIRIS Agent'\n\n"
|
|
245
|
+
"For list values:\n"
|
|
246
|
+
" $memorize filter/keywords CONFIG LOCAL value=['spam','scam','phishing']\n\n"
|
|
247
|
+
"Note: The mock LLM currently only supports simple node creation. "
|
|
248
|
+
"For actual configuration updates, you may need to use the config service directly."
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
logger.warning(f"CONFIG node missing value: key={config_key}")
|
|
252
|
+
|
|
253
|
+
return self.complete_thought_and_create_followup(
|
|
254
|
+
thought=thought,
|
|
255
|
+
follow_up_content=error_msg,
|
|
256
|
+
action_result=result,
|
|
257
|
+
status=ThoughtStatus.FAILED,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Try to create a proper ConfigNode
|
|
261
|
+
try:
|
|
262
|
+
from ciris_engine.schemas.services.nodes import ConfigNode, ConfigValue
|
|
263
|
+
|
|
264
|
+
# Determine value type and create ConfigValue
|
|
265
|
+
config_val = ConfigValue()
|
|
266
|
+
if isinstance(config_value, bool):
|
|
267
|
+
config_val.bool_value = config_value
|
|
268
|
+
elif isinstance(config_value, int):
|
|
269
|
+
config_val.int_value = config_value
|
|
270
|
+
elif isinstance(config_value, float):
|
|
271
|
+
config_val.float_value = config_value
|
|
272
|
+
elif isinstance(config_value, list):
|
|
273
|
+
config_val.list_value = config_value
|
|
274
|
+
elif isinstance(config_value, dict):
|
|
275
|
+
config_val.dict_value = config_value
|
|
276
|
+
else:
|
|
277
|
+
# Default to string
|
|
278
|
+
config_val.string_value = str(config_value)
|
|
279
|
+
|
|
280
|
+
# Create ConfigNode with proper structure
|
|
281
|
+
config_node = ConfigNode(
|
|
282
|
+
id=node.id, # Use the original node id
|
|
283
|
+
type=NodeType.CONFIG,
|
|
284
|
+
scope=scope, # Use the original scope (LOCAL)
|
|
285
|
+
attributes={}, # Will be populated by to_graph_node()
|
|
286
|
+
key=config_key,
|
|
287
|
+
value=config_val,
|
|
288
|
+
version=1, # Start at version 1
|
|
289
|
+
updated_by="agent", # Default to agent
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# Convert to GraphNode for storage
|
|
293
|
+
node = config_node.to_graph_node()
|
|
294
|
+
|
|
295
|
+
logger.info(f"Created proper ConfigNode for key={config_key}, value={config_value}")
|
|
296
|
+
|
|
297
|
+
except Exception as e:
|
|
298
|
+
# Provide detailed error about what went wrong
|
|
299
|
+
error_msg = (
|
|
300
|
+
f"MEMORIZE CONFIG FAILED: Error creating ConfigNode for '{config_key}'\n\n"
|
|
301
|
+
f"Error: {str(e)}\n\n"
|
|
302
|
+
"This typically happens when:\n"
|
|
303
|
+
"1. The value type is not supported (must be: bool, int, float, string, list, or dict)\n"
|
|
304
|
+
"2. The value format is invalid\n"
|
|
305
|
+
"3. The key contains invalid characters\n\n"
|
|
306
|
+
f"Attempted to set: key='{config_key}', value='{config_value}' (type: {type(config_value).__name__})\n\n"
|
|
307
|
+
"Please ensure your value is properly formatted and try again."
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
logger.error(f"Failed to create ConfigNode: {e}")
|
|
311
|
+
|
|
312
|
+
return self.complete_thought_and_create_followup(
|
|
313
|
+
thought=thought,
|
|
314
|
+
follow_up_content=error_msg,
|
|
315
|
+
action_result=result,
|
|
316
|
+
status=ThoughtStatus.FAILED,
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
# Perform the memory operation through the bus
|
|
320
|
+
try:
|
|
321
|
+
memory_result = await self.bus_manager.memory.memorize(node=node, handler_name=self.__class__.__name__)
|
|
322
|
+
|
|
323
|
+
success = memory_result.status == MemoryOpStatus.SUCCESS
|
|
324
|
+
final_status = ThoughtStatus.COMPLETED if success else ThoughtStatus.FAILED
|
|
325
|
+
|
|
326
|
+
# Create appropriate follow-up
|
|
327
|
+
if success:
|
|
328
|
+
# Extract meaningful content from the node
|
|
329
|
+
content_preview = ""
|
|
330
|
+
if hasattr(node, "attributes") and node.attributes:
|
|
331
|
+
# Handle both dict and GraphNodeAttributes types
|
|
332
|
+
if isinstance(node.attributes, dict):
|
|
333
|
+
if "content" in node.attributes:
|
|
334
|
+
content_val = node.attributes["content"]
|
|
335
|
+
content_str = str(content_val) if content_val is not None else ""
|
|
336
|
+
content_preview = f": {content_str[:100]}" if content_str else ""
|
|
337
|
+
elif "name" in node.attributes:
|
|
338
|
+
content_preview = f": {node.attributes['name']}"
|
|
339
|
+
elif "value" in node.attributes:
|
|
340
|
+
content_preview = f": {node.attributes['value']}"
|
|
341
|
+
else:
|
|
342
|
+
# For GraphNodeAttributes, check if it has these as actual attributes
|
|
343
|
+
if hasattr(node.attributes, "content"):
|
|
344
|
+
content_val = node.attributes.content
|
|
345
|
+
content_str = str(content_val) if content_val is not None else ""
|
|
346
|
+
content_preview = f": {content_str[:100]}" if content_str else ""
|
|
347
|
+
elif hasattr(node.attributes, "name"):
|
|
348
|
+
content_preview = f": {node.attributes.name}"
|
|
349
|
+
elif hasattr(node.attributes, "value"):
|
|
350
|
+
content_preview = f": {node.attributes.value}"
|
|
351
|
+
|
|
352
|
+
follow_up_content = (
|
|
353
|
+
f"MEMORIZE COMPLETE - stored {node.type.value} '{node.id}'{content_preview}. "
|
|
354
|
+
"Information successfully saved to memory graph."
|
|
355
|
+
)
|
|
356
|
+
else:
|
|
357
|
+
follow_up_content = (
|
|
358
|
+
f"Failed to memorize node '{node.id}': "
|
|
359
|
+
f"{memory_result.reason or memory_result.error or 'Unknown error'}"
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# Use centralized method to complete thought and create follow-up
|
|
363
|
+
follow_up_id = self.complete_thought_and_create_followup(
|
|
364
|
+
thought=thought,
|
|
365
|
+
follow_up_content=follow_up_content,
|
|
366
|
+
action_result=result,
|
|
367
|
+
status=ThoughtStatus.COMPLETED if success else ThoughtStatus.FAILED,
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
# Final audit log
|
|
371
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
372
|
+
|
|
373
|
+
return follow_up_id
|
|
374
|
+
|
|
375
|
+
except Exception as e:
|
|
376
|
+
await self._handle_error(HandlerActionType.MEMORIZE, dispatch_context, thought_id, e)
|
|
377
|
+
|
|
378
|
+
persistence.update_thought_status(
|
|
379
|
+
thought_id=thought_id,
|
|
380
|
+
status=ThoughtStatus.FAILED,
|
|
381
|
+
occurrence_id=thought.agent_occurrence_id,
|
|
382
|
+
final_action=result,
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
# Create error follow-up
|
|
386
|
+
follow_up = create_follow_up_thought(
|
|
387
|
+
parent=thought, time_service=self.time_service, content=f"MEMORIZE action failed with error: {e}"
|
|
388
|
+
)
|
|
389
|
+
persistence.add_thought(follow_up)
|
|
390
|
+
|
|
391
|
+
raise FollowUpCreationError from e
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from ciris_engine.logic import persistence
|
|
5
|
+
from ciris_engine.logic.infrastructure.handlers.base_handler import BaseActionHandler
|
|
6
|
+
from ciris_engine.schemas.actions import RecallParams
|
|
7
|
+
from ciris_engine.schemas.dma.results import ActionSelectionDMAResult
|
|
8
|
+
from ciris_engine.schemas.handlers.memory_schemas import ConnectedNodeInfo, RecalledNodeInfo, RecallResult
|
|
9
|
+
from ciris_engine.schemas.runtime.contexts import DispatchContext
|
|
10
|
+
from ciris_engine.schemas.runtime.enums import HandlerActionType, ThoughtStatus
|
|
11
|
+
from ciris_engine.schemas.runtime.models import Thought
|
|
12
|
+
from ciris_engine.schemas.services.graph_core import GraphScope, NodeType
|
|
13
|
+
from ciris_engine.schemas.services.operations import MemoryQuery
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RecallHandler(BaseActionHandler):
|
|
19
|
+
async def handle(
|
|
20
|
+
self, result: ActionSelectionDMAResult, thought: Thought, dispatch_context: DispatchContext
|
|
21
|
+
) -> Optional[str]:
|
|
22
|
+
raw_params = result.action_parameters
|
|
23
|
+
thought_id = thought.thought_id
|
|
24
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
25
|
+
try:
|
|
26
|
+
params: RecallParams = self._validate_and_convert_params(raw_params, RecallParams)
|
|
27
|
+
except Exception as e:
|
|
28
|
+
await self._handle_error(HandlerActionType.RECALL, dispatch_context, thought_id, e)
|
|
29
|
+
# Mark thought as failed and create error follow-up
|
|
30
|
+
persistence.update_thought_status(thought_id=thought_id, status=ThoughtStatus.FAILED)
|
|
31
|
+
error_content = f"RECALL action failed: {str(e)}"
|
|
32
|
+
follow_up_id = self.complete_thought_and_create_followup(
|
|
33
|
+
thought=thought, follow_up_content=error_content, action_result=result
|
|
34
|
+
)
|
|
35
|
+
return follow_up_id
|
|
36
|
+
# Memory operations will use the memory bus
|
|
37
|
+
|
|
38
|
+
# Type assertion to help MyPy understand params is RecallParams
|
|
39
|
+
assert isinstance(params, RecallParams)
|
|
40
|
+
|
|
41
|
+
# Import MemorySearchFilter for search operations
|
|
42
|
+
from ciris_engine.schemas.services.graph.memory import MemorySearchFilter
|
|
43
|
+
|
|
44
|
+
nodes = []
|
|
45
|
+
|
|
46
|
+
# If node_id is provided, try exact match first
|
|
47
|
+
if params.node_id:
|
|
48
|
+
memory_query = MemoryQuery(
|
|
49
|
+
node_id=params.node_id,
|
|
50
|
+
scope=params.scope or GraphScope.LOCAL,
|
|
51
|
+
type=NodeType(params.node_type) if params.node_type else None,
|
|
52
|
+
include_edges=False,
|
|
53
|
+
depth=1,
|
|
54
|
+
)
|
|
55
|
+
nodes = await self.bus_manager.memory.recall(
|
|
56
|
+
recall_query=memory_query, handler_name=self.__class__.__name__
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# If no results with exact match OR if using query, try search
|
|
60
|
+
# ALWAYS try search if no exact match found
|
|
61
|
+
if not nodes:
|
|
62
|
+
# Use the search method for flexible matching
|
|
63
|
+
search_query = params.query or params.node_id or params.node_type or ""
|
|
64
|
+
|
|
65
|
+
# Build search filter
|
|
66
|
+
search_filter = MemorySearchFilter(
|
|
67
|
+
node_type=params.node_type, scope=(params.scope or GraphScope.LOCAL).value, limit=params.limit
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Perform search - this will search in node IDs and attributes
|
|
71
|
+
logger.info(
|
|
72
|
+
f"No exact match for recall, trying search with query: '{search_query}', type: {params.node_type}"
|
|
73
|
+
)
|
|
74
|
+
nodes = await self.bus_manager.memory.search(query=search_query, filters=search_filter)
|
|
75
|
+
|
|
76
|
+
# If still no results and we have a node_type, try getting all nodes of that type
|
|
77
|
+
if not nodes and params.node_type and not params.query and not params.node_id:
|
|
78
|
+
# Get all nodes of the specified type
|
|
79
|
+
wildcard_query = MemoryQuery(
|
|
80
|
+
node_id="*", # Wildcard
|
|
81
|
+
scope=params.scope or GraphScope.LOCAL,
|
|
82
|
+
type=NodeType(params.node_type),
|
|
83
|
+
include_edges=False,
|
|
84
|
+
depth=1,
|
|
85
|
+
)
|
|
86
|
+
nodes = await self.bus_manager.memory.recall(
|
|
87
|
+
recall_query=wildcard_query, handler_name=self.__class__.__name__
|
|
88
|
+
)
|
|
89
|
+
# Apply limit if we got all nodes
|
|
90
|
+
if nodes and len(nodes) > params.limit:
|
|
91
|
+
nodes = nodes[: params.limit]
|
|
92
|
+
|
|
93
|
+
success = bool(nodes)
|
|
94
|
+
|
|
95
|
+
if success:
|
|
96
|
+
# Build descriptive query string
|
|
97
|
+
query_desc = params.node_id or params.query or "recall request"
|
|
98
|
+
if params.node_type and params.query:
|
|
99
|
+
query_desc = f"{params.node_type} {query_desc}"
|
|
100
|
+
|
|
101
|
+
# Format the recalled nodes with enhanced information
|
|
102
|
+
recall_result = RecallResult(success=True, query_description=query_desc, total_results=len(nodes))
|
|
103
|
+
|
|
104
|
+
for n in nodes:
|
|
105
|
+
# Serialize attributes to JSON-compatible types
|
|
106
|
+
from datetime import datetime
|
|
107
|
+
|
|
108
|
+
from pydantic import BaseModel
|
|
109
|
+
|
|
110
|
+
from ciris_engine.schemas.types import JSONDict, JSONValue
|
|
111
|
+
|
|
112
|
+
attributes: JSONDict = {}
|
|
113
|
+
|
|
114
|
+
# Handle both dict and Pydantic model attributes
|
|
115
|
+
if isinstance(n.attributes, BaseModel):
|
|
116
|
+
# Convert Pydantic model to dict first
|
|
117
|
+
attr_dict = n.attributes.model_dump()
|
|
118
|
+
for key, value in attr_dict.items():
|
|
119
|
+
if isinstance(value, datetime):
|
|
120
|
+
attributes[key] = value.isoformat()
|
|
121
|
+
else:
|
|
122
|
+
attributes[key] = value # Value is already JSONValue compatible
|
|
123
|
+
elif isinstance(n.attributes, dict):
|
|
124
|
+
for key, value in n.attributes.items():
|
|
125
|
+
if isinstance(value, datetime):
|
|
126
|
+
attributes[key] = value.isoformat()
|
|
127
|
+
else:
|
|
128
|
+
attributes[key] = value # Value is already JSONValue compatible
|
|
129
|
+
|
|
130
|
+
# Create typed node info
|
|
131
|
+
node_info = RecalledNodeInfo(type=n.type, scope=n.scope, attributes=attributes)
|
|
132
|
+
|
|
133
|
+
# Get connected nodes for each recalled node
|
|
134
|
+
try:
|
|
135
|
+
from ciris_engine.logic.persistence.models.graph import get_edges_for_node
|
|
136
|
+
|
|
137
|
+
edges = get_edges_for_node(n.id, n.scope)
|
|
138
|
+
|
|
139
|
+
if edges:
|
|
140
|
+
connected_nodes = []
|
|
141
|
+
for edge in edges:
|
|
142
|
+
# Get the connected node
|
|
143
|
+
connected_node_id = edge.target if edge.source == n.id else edge.source
|
|
144
|
+
connected_query = MemoryQuery(
|
|
145
|
+
node_id=connected_node_id, scope=edge.scope, include_edges=False, depth=1
|
|
146
|
+
)
|
|
147
|
+
try:
|
|
148
|
+
connected_results = await self.bus_manager.memory.recall(
|
|
149
|
+
recall_query=connected_query, handler_name=self.__class__.__name__
|
|
150
|
+
)
|
|
151
|
+
if connected_results:
|
|
152
|
+
connected_node = connected_results[0]
|
|
153
|
+
|
|
154
|
+
# Serialize connected node attributes
|
|
155
|
+
connected_attrs: JSONDict = {}
|
|
156
|
+
# Handle both dict and Pydantic model attributes
|
|
157
|
+
if isinstance(connected_node.attributes, BaseModel):
|
|
158
|
+
attr_dict = connected_node.attributes.model_dump()
|
|
159
|
+
for key, value in attr_dict.items():
|
|
160
|
+
if isinstance(value, datetime):
|
|
161
|
+
connected_attrs[key] = value.isoformat()
|
|
162
|
+
else:
|
|
163
|
+
connected_attrs[key] = value # Value is already JSONValue compatible
|
|
164
|
+
elif isinstance(connected_node.attributes, dict):
|
|
165
|
+
for key, value in connected_node.attributes.items():
|
|
166
|
+
if isinstance(value, datetime):
|
|
167
|
+
connected_attrs[key] = value.isoformat()
|
|
168
|
+
else:
|
|
169
|
+
connected_attrs[key] = value # Value is already JSONValue compatible
|
|
170
|
+
|
|
171
|
+
connected_node_info = ConnectedNodeInfo(
|
|
172
|
+
node_id=connected_node.id,
|
|
173
|
+
node_type=connected_node.type,
|
|
174
|
+
relationship=edge.relationship,
|
|
175
|
+
direction="outgoing" if edge.source == n.id else "incoming",
|
|
176
|
+
attributes=connected_attrs,
|
|
177
|
+
)
|
|
178
|
+
connected_nodes.append(connected_node_info)
|
|
179
|
+
except Exception as e:
|
|
180
|
+
logger.debug(f"Failed to get connected node {connected_node_id}: {e}")
|
|
181
|
+
|
|
182
|
+
if connected_nodes:
|
|
183
|
+
node_info.connected_nodes = connected_nodes
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
logger.warning(f"Failed to get edges for node {n.id}: {e}")
|
|
187
|
+
|
|
188
|
+
recall_result.nodes[n.id] = node_info
|
|
189
|
+
|
|
190
|
+
# Check if results need truncation
|
|
191
|
+
import json
|
|
192
|
+
|
|
193
|
+
data_str = json.dumps({k: v.model_dump() for k, v in recall_result.nodes.items()}, indent=2, default=str)
|
|
194
|
+
if len(data_str) > 10000:
|
|
195
|
+
recall_result.truncated = True
|
|
196
|
+
|
|
197
|
+
follow_up_content = recall_result.to_follow_up_content()
|
|
198
|
+
else:
|
|
199
|
+
# Build descriptive query string
|
|
200
|
+
query_desc = params.node_id or params.query or "recall request"
|
|
201
|
+
if params.node_type:
|
|
202
|
+
query_desc = f"{params.node_type} {query_desc}"
|
|
203
|
+
|
|
204
|
+
recall_result = RecallResult(success=False, query_description=query_desc, total_results=0)
|
|
205
|
+
|
|
206
|
+
follow_up_content = recall_result.to_follow_up_content()
|
|
207
|
+
# Use centralized method to complete thought and create follow-up
|
|
208
|
+
follow_up_id = self.complete_thought_and_create_followup(
|
|
209
|
+
thought=thought, follow_up_content=follow_up_content, action_result=result
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# NOTE: Audit logging removed - action_dispatcher handles centralized audit logging
|
|
213
|
+
return follow_up_id
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Terminal handlers module."""
|