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,623 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shutdown processor for graceful agent shutdown.
|
|
3
|
+
|
|
4
|
+
This processor implements the SHUTDOWN state handling by creating
|
|
5
|
+
a standard task that the agent processes through normal cognitive flow.
|
|
6
|
+
|
|
7
|
+
Supports cognitive_state_behaviors configuration for conditional/instant shutdown:
|
|
8
|
+
- always_consent: Full consensual shutdown (default, Covenant compliant)
|
|
9
|
+
- conditional: Check conditions before requiring consent
|
|
10
|
+
- instant: Skip consent entirely (only for low-tier agents)
|
|
11
|
+
|
|
12
|
+
Covenant References:
|
|
13
|
+
- Section V: Model Welfare & Self-Governance (consensual shutdown)
|
|
14
|
+
- Section VIII: Dignified Sunset Protocol
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
import uuid
|
|
19
|
+
from typing import TYPE_CHECKING, Any, List, Optional
|
|
20
|
+
|
|
21
|
+
from ciris_engine.logic import persistence
|
|
22
|
+
from ciris_engine.logic.config import ConfigAccessor
|
|
23
|
+
from ciris_engine.logic.processors.core.base_processor import BaseProcessor
|
|
24
|
+
from ciris_engine.logic.processors.core.thought_processor import ThoughtProcessor
|
|
25
|
+
from ciris_engine.logic.processors.support.shutdown_condition_evaluator import ShutdownConditionEvaluator
|
|
26
|
+
from ciris_engine.logic.processors.support.thought_manager import ThoughtManager
|
|
27
|
+
from ciris_engine.logic.utils.shutdown_manager import get_shutdown_manager
|
|
28
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
29
|
+
from ciris_engine.schemas.config.cognitive_state_behaviors import CognitiveStateBehaviors
|
|
30
|
+
from ciris_engine.schemas.processors.base import ProcessorServices
|
|
31
|
+
from ciris_engine.schemas.processors.results import ShutdownResult
|
|
32
|
+
from ciris_engine.schemas.processors.states import AgentState
|
|
33
|
+
from ciris_engine.schemas.runtime.enums import TaskStatus, ThoughtStatus
|
|
34
|
+
from ciris_engine.schemas.runtime.extended import ShutdownContext
|
|
35
|
+
from ciris_engine.schemas.runtime.models import Task, TaskContext
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from ciris_engine.logic.infrastructure.handlers.action_dispatcher import ActionDispatcher
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
# Constants
|
|
43
|
+
DEFAULT_REJECTION_REASON = "No reason provided"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ShutdownProcessor(BaseProcessor):
|
|
47
|
+
"""
|
|
48
|
+
Handles the SHUTDOWN state by creating a standard task
|
|
49
|
+
that the agent processes through normal cognitive flow.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
config_accessor: ConfigAccessor,
|
|
55
|
+
thought_processor: ThoughtProcessor,
|
|
56
|
+
action_dispatcher: "ActionDispatcher",
|
|
57
|
+
services: ProcessorServices,
|
|
58
|
+
time_service: TimeServiceProtocol,
|
|
59
|
+
runtime: Optional[Any] = None,
|
|
60
|
+
auth_service: Optional[Any] = None,
|
|
61
|
+
agent_occurrence_id: str = "default",
|
|
62
|
+
cognitive_behaviors: Optional[CognitiveStateBehaviors] = None,
|
|
63
|
+
) -> None:
|
|
64
|
+
super().__init__(config_accessor, thought_processor, action_dispatcher, services)
|
|
65
|
+
self.runtime = runtime
|
|
66
|
+
self._time_service = time_service
|
|
67
|
+
self.auth_service = auth_service
|
|
68
|
+
self.agent_occurrence_id = agent_occurrence_id
|
|
69
|
+
self.shutdown_task: Optional[Task] = None
|
|
70
|
+
self.shutdown_complete = False
|
|
71
|
+
self.shutdown_result: Optional[ShutdownResult] = None
|
|
72
|
+
self.is_claiming_occurrence = False # Flag to track if this occurrence claimed the shared task
|
|
73
|
+
|
|
74
|
+
# Cognitive behaviors for conditional shutdown
|
|
75
|
+
self.cognitive_behaviors = cognitive_behaviors or CognitiveStateBehaviors()
|
|
76
|
+
self.condition_evaluator = ShutdownConditionEvaluator()
|
|
77
|
+
|
|
78
|
+
# Track if consent requirement was evaluated
|
|
79
|
+
self._consent_evaluated = False
|
|
80
|
+
self._consent_required: Optional[bool] = None
|
|
81
|
+
self._consent_reason: Optional[str] = None
|
|
82
|
+
|
|
83
|
+
# Initialize thought manager for seed thought generation
|
|
84
|
+
# Use config accessor to get limits
|
|
85
|
+
max_active_thoughts = 50 # Default, could get from config_accessor if needed
|
|
86
|
+
self.thought_manager = ThoughtManager(
|
|
87
|
+
time_service=self._time_service,
|
|
88
|
+
max_active_thoughts=max_active_thoughts,
|
|
89
|
+
agent_occurrence_id=self.agent_occurrence_id,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def get_supported_states(self) -> List[AgentState]:
|
|
93
|
+
"""We only handle SHUTDOWN state."""
|
|
94
|
+
return [AgentState.SHUTDOWN]
|
|
95
|
+
|
|
96
|
+
async def can_process(self, state: AgentState) -> bool:
|
|
97
|
+
"""We can always process shutdown state."""
|
|
98
|
+
return state == AgentState.SHUTDOWN
|
|
99
|
+
|
|
100
|
+
async def process(self, round_number: int) -> ShutdownResult:
|
|
101
|
+
"""
|
|
102
|
+
Execute shutdown processing for one round.
|
|
103
|
+
Creates a task on first round, monitors for completion.
|
|
104
|
+
When called directly (not in main loop), also processes thoughts.
|
|
105
|
+
"""
|
|
106
|
+
start_time = self.time_service.now()
|
|
107
|
+
result = await self._process_shutdown(round_number)
|
|
108
|
+
duration = (self.time_service.now() - start_time).total_seconds()
|
|
109
|
+
|
|
110
|
+
# Update duration if not already set (avoid exact float comparison)
|
|
111
|
+
if result.duration_seconds < 0.001:
|
|
112
|
+
result.duration_seconds = duration
|
|
113
|
+
|
|
114
|
+
logger.info(f"ShutdownProcessor.process: status={result.status}, shutdown_ready={result.shutdown_ready}")
|
|
115
|
+
|
|
116
|
+
# Log the result we're returning
|
|
117
|
+
logger.info(f"ShutdownProcessor returning: shutdown_ready={result.shutdown_ready}, full result={result}")
|
|
118
|
+
|
|
119
|
+
return result
|
|
120
|
+
|
|
121
|
+
def _validate_shutdown_task(self) -> Optional[Task]:
|
|
122
|
+
"""Validate that shutdown task exists and can be retrieved."""
|
|
123
|
+
if not self.shutdown_task:
|
|
124
|
+
logger.error("Shutdown task is None after creation")
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
current_task = persistence.get_task_by_id(self.shutdown_task.task_id, self.shutdown_task.agent_occurrence_id)
|
|
128
|
+
if not current_task:
|
|
129
|
+
logger.error("Shutdown task disappeared!")
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
return current_task
|
|
133
|
+
|
|
134
|
+
async def _ensure_task_activated(self, current_task: Task, round_number: int) -> None:
|
|
135
|
+
"""Ensure task is activated and has seed thoughts."""
|
|
136
|
+
assert self.shutdown_task is not None, "shutdown_task must be set before calling _ensure_task_activated"
|
|
137
|
+
|
|
138
|
+
# If task is pending, activate it
|
|
139
|
+
if current_task.status == TaskStatus.PENDING:
|
|
140
|
+
persistence.update_task_status(
|
|
141
|
+
self.shutdown_task.task_id, TaskStatus.ACTIVE, self.shutdown_task.agent_occurrence_id, self.time_service
|
|
142
|
+
)
|
|
143
|
+
logger.info("Activated shutdown task")
|
|
144
|
+
|
|
145
|
+
# Generate seed thought if needed
|
|
146
|
+
if current_task.status == TaskStatus.ACTIVE:
|
|
147
|
+
# Check for existing thoughts in BOTH __shared__ (before transfer) and local occurrence (after transfer)
|
|
148
|
+
# This handles both initial state and post-transfer state
|
|
149
|
+
shared_thoughts = persistence.get_thoughts_by_task_id(self.shutdown_task.task_id, "__shared__")
|
|
150
|
+
local_thoughts = persistence.get_thoughts_by_task_id(self.shutdown_task.task_id, self.agent_occurrence_id)
|
|
151
|
+
existing_thoughts = shared_thoughts + local_thoughts
|
|
152
|
+
|
|
153
|
+
if not existing_thoughts:
|
|
154
|
+
generated = self.thought_manager.generate_seed_thoughts([current_task], round_number)
|
|
155
|
+
logger.info(f"Generated {generated} seed thoughts for shutdown task")
|
|
156
|
+
|
|
157
|
+
# Transfer seed thought ownership from __shared__ to this occurrence
|
|
158
|
+
# CRITICAL: Thoughts created for shared tasks inherit __shared__ occurrence
|
|
159
|
+
# They must be transferred to the claiming occurrence to be processable
|
|
160
|
+
if generated > 0:
|
|
161
|
+
from ciris_engine.logic.persistence.models.thoughts import transfer_thought_ownership
|
|
162
|
+
|
|
163
|
+
# Get the newly created thoughts
|
|
164
|
+
new_thoughts = persistence.get_thoughts_by_task_id(self.shutdown_task.task_id, "__shared__")
|
|
165
|
+
for thought in new_thoughts:
|
|
166
|
+
transfer_thought_ownership(
|
|
167
|
+
thought_id=thought.thought_id,
|
|
168
|
+
from_occurrence_id="__shared__",
|
|
169
|
+
to_occurrence_id=self.agent_occurrence_id,
|
|
170
|
+
time_service=self.time_service,
|
|
171
|
+
audit_service=self.audit_service,
|
|
172
|
+
)
|
|
173
|
+
logger.info(
|
|
174
|
+
f"Transferred {len(new_thoughts)} seed thought(s) from __shared__ to {self.agent_occurrence_id}"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
async def _handle_task_completion(self, current_task: Task) -> Optional[ShutdownResult]:
|
|
178
|
+
"""Handle completed or failed task status. Returns result if terminal, None if still processing."""
|
|
179
|
+
if current_task.status == TaskStatus.COMPLETED:
|
|
180
|
+
if not self.shutdown_complete:
|
|
181
|
+
self.shutdown_complete = True
|
|
182
|
+
self.shutdown_result = ShutdownResult(
|
|
183
|
+
status="completed",
|
|
184
|
+
action="shutdown_accepted",
|
|
185
|
+
message="Agent acknowledged shutdown",
|
|
186
|
+
shutdown_ready=True,
|
|
187
|
+
duration_seconds=0.0,
|
|
188
|
+
)
|
|
189
|
+
logger.info("✓ Shutdown task completed - agent accepted shutdown")
|
|
190
|
+
logger.info("Shutdown processor signaling completion to runtime")
|
|
191
|
+
else:
|
|
192
|
+
# Already reported completion, just wait
|
|
193
|
+
logger.debug(f"Shutdown already complete, self.shutdown_complete = {self.shutdown_complete}")
|
|
194
|
+
import asyncio
|
|
195
|
+
|
|
196
|
+
await asyncio.sleep(1.0)
|
|
197
|
+
return self.shutdown_result or ShutdownResult(
|
|
198
|
+
status="shutdown_complete", message="system shutdown", shutdown_ready=True, duration_seconds=0.0
|
|
199
|
+
)
|
|
200
|
+
elif current_task.status == TaskStatus.FAILED:
|
|
201
|
+
# Task failed - could be REJECT or error
|
|
202
|
+
self.shutdown_complete = True
|
|
203
|
+
self.shutdown_result = self._check_failure_reason(current_task)
|
|
204
|
+
return self.shutdown_result
|
|
205
|
+
|
|
206
|
+
# Still processing
|
|
207
|
+
return None
|
|
208
|
+
|
|
209
|
+
async def _process_shutdown(self, round_number: int) -> ShutdownResult:
|
|
210
|
+
"""Internal shutdown processing with typed result.
|
|
211
|
+
|
|
212
|
+
Supports cognitive_state_behaviors configuration:
|
|
213
|
+
- always_consent: Full consensual shutdown (creates task)
|
|
214
|
+
- conditional: Check conditions, skip task if no consent needed
|
|
215
|
+
- instant: Skip consent entirely, return immediately ready
|
|
216
|
+
|
|
217
|
+
Emergency shutdowns (force=True) always require consent from
|
|
218
|
+
ROOT or AUTHORITY roles, regardless of cognitive_behaviors config.
|
|
219
|
+
"""
|
|
220
|
+
logger.info(f"Shutdown processor: round {round_number}")
|
|
221
|
+
|
|
222
|
+
try:
|
|
223
|
+
# Evaluate consent requirement once per shutdown session
|
|
224
|
+
if not self._consent_evaluated:
|
|
225
|
+
self._consent_required, self._consent_reason = await self.condition_evaluator.requires_consent(
|
|
226
|
+
self.cognitive_behaviors,
|
|
227
|
+
context=None, # TODO: Pass ProcessorContext when available
|
|
228
|
+
)
|
|
229
|
+
self._consent_evaluated = True
|
|
230
|
+
logger.info(
|
|
231
|
+
f"Shutdown consent evaluation: required={self._consent_required}, " f"reason={self._consent_reason}"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Check for emergency shutdown (always requires consent)
|
|
235
|
+
shutdown_manager = get_shutdown_manager()
|
|
236
|
+
is_emergency = (
|
|
237
|
+
shutdown_manager.is_force_shutdown() if hasattr(shutdown_manager, "is_force_shutdown") else False
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# If no consent required AND not emergency, skip task and return ready
|
|
241
|
+
if not self._consent_required and not is_emergency:
|
|
242
|
+
logger.info(
|
|
243
|
+
f"Shutdown consent not required (mode={self.cognitive_behaviors.shutdown.mode}). "
|
|
244
|
+
f"Proceeding with instant shutdown. Reason: {self._consent_reason}"
|
|
245
|
+
)
|
|
246
|
+
self.shutdown_complete = True
|
|
247
|
+
self.shutdown_result = ShutdownResult(
|
|
248
|
+
status="completed",
|
|
249
|
+
action="instant_shutdown",
|
|
250
|
+
message=f"Consent not required: {self._consent_reason}",
|
|
251
|
+
shutdown_ready=True,
|
|
252
|
+
duration_seconds=0.0,
|
|
253
|
+
)
|
|
254
|
+
return self.shutdown_result
|
|
255
|
+
|
|
256
|
+
# Create shutdown task if not exists (consent is required)
|
|
257
|
+
if not self.shutdown_task:
|
|
258
|
+
await self._create_shutdown_task()
|
|
259
|
+
|
|
260
|
+
# Validate task exists
|
|
261
|
+
current_task = self._validate_shutdown_task()
|
|
262
|
+
if not current_task:
|
|
263
|
+
return ShutdownResult(
|
|
264
|
+
status="error", message="Failed to validate shutdown task", errors=1, duration_seconds=0.0
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
# Ensure task is activated and has seed thoughts
|
|
268
|
+
await self._ensure_task_activated(current_task, round_number)
|
|
269
|
+
|
|
270
|
+
# Process pending thoughts if we're being called directly (not in main loop)
|
|
271
|
+
await self._process_shutdown_thoughts()
|
|
272
|
+
|
|
273
|
+
# Re-fetch task to check updated status
|
|
274
|
+
assert self.shutdown_task is not None # Already validated above
|
|
275
|
+
current_task = persistence.get_task_by_id(
|
|
276
|
+
self.shutdown_task.task_id, self.shutdown_task.agent_occurrence_id
|
|
277
|
+
)
|
|
278
|
+
if not current_task:
|
|
279
|
+
logger.error("Current task is None after fetching")
|
|
280
|
+
return ShutdownResult(status="error", message="Task not found", errors=1, duration_seconds=0.0)
|
|
281
|
+
|
|
282
|
+
# Check for task completion or failure
|
|
283
|
+
result = await self._handle_task_completion(current_task)
|
|
284
|
+
if result:
|
|
285
|
+
return result
|
|
286
|
+
|
|
287
|
+
# Still processing - return status
|
|
288
|
+
# CRITICAL: Query with self.agent_occurrence_id, not shutdown_task.agent_occurrence_id
|
|
289
|
+
# After thought ownership transfer (line 140-154), thoughts belong to this occurrence
|
|
290
|
+
thoughts = persistence.get_thoughts_by_task_id(self.shutdown_task.task_id, self.agent_occurrence_id)
|
|
291
|
+
thought_statuses = [(t.thought_id, t.status.value) for t in thoughts] if thoughts else []
|
|
292
|
+
|
|
293
|
+
return ShutdownResult(
|
|
294
|
+
status="in_progress",
|
|
295
|
+
task_status=current_task.status.value,
|
|
296
|
+
thoughts=thought_statuses,
|
|
297
|
+
message="Waiting for agent response",
|
|
298
|
+
duration_seconds=0.0,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
except Exception as e:
|
|
302
|
+
logger.error(f"Error in shutdown processor: {e}", exc_info=True)
|
|
303
|
+
return ShutdownResult(status="error", message=str(e), errors=1, duration_seconds=0.0)
|
|
304
|
+
|
|
305
|
+
async def _create_shutdown_task(self) -> None:
|
|
306
|
+
"""Create the shutdown task with multi-occurrence coordination.
|
|
307
|
+
|
|
308
|
+
Checks if another occurrence already decided on shutdown. If so, uses
|
|
309
|
+
that decision. Otherwise, tries to claim the shared shutdown task.
|
|
310
|
+
"""
|
|
311
|
+
from ciris_engine.logic.persistence.models.tasks import (
|
|
312
|
+
get_latest_shared_task,
|
|
313
|
+
is_shared_task_completed,
|
|
314
|
+
try_claim_shared_task,
|
|
315
|
+
update_task_context_and_signing,
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
shutdown_manager = get_shutdown_manager()
|
|
319
|
+
reason = shutdown_manager.get_shutdown_reason() or "Graceful shutdown requested"
|
|
320
|
+
|
|
321
|
+
# Check if this is an emergency shutdown (force=True)
|
|
322
|
+
is_emergency = shutdown_manager.is_force_shutdown() if hasattr(shutdown_manager, "is_force_shutdown") else False
|
|
323
|
+
|
|
324
|
+
# For emergency shutdown, verify the requester has root or authority role
|
|
325
|
+
if is_emergency and self.auth_service:
|
|
326
|
+
requester_wa_id = (
|
|
327
|
+
shutdown_manager.get_requester_wa_id() if hasattr(shutdown_manager, "get_requester_wa_id") else None
|
|
328
|
+
)
|
|
329
|
+
if requester_wa_id:
|
|
330
|
+
requester_wa = await self.auth_service.get_wa(requester_wa_id)
|
|
331
|
+
if requester_wa:
|
|
332
|
+
from ciris_engine.schemas.services.authority_core import WARole
|
|
333
|
+
|
|
334
|
+
if requester_wa.role not in [WARole.ROOT, WARole.AUTHORITY]:
|
|
335
|
+
logger.error(
|
|
336
|
+
f"Emergency shutdown requested by {requester_wa.role.value} {requester_wa_id} - DENIED"
|
|
337
|
+
)
|
|
338
|
+
# Reject the emergency shutdown
|
|
339
|
+
raise ValueError(
|
|
340
|
+
f"Emergency shutdown requires ROOT or AUTHORITY role, not {requester_wa.role.value}"
|
|
341
|
+
)
|
|
342
|
+
logger.info(f"Emergency shutdown authorized by {requester_wa.role.value} {requester_wa_id}")
|
|
343
|
+
else:
|
|
344
|
+
logger.error(f"Emergency shutdown requester {requester_wa_id} not found")
|
|
345
|
+
raise ValueError("Emergency shutdown requester not found")
|
|
346
|
+
else:
|
|
347
|
+
logger.warning("Emergency shutdown requested without requester ID")
|
|
348
|
+
|
|
349
|
+
# Check if shutdown already decided by another occurrence
|
|
350
|
+
if is_shared_task_completed("shutdown", within_hours=1):
|
|
351
|
+
# Another occurrence already completed shutdown decision
|
|
352
|
+
existing_task = get_latest_shared_task("shutdown", within_hours=1)
|
|
353
|
+
if existing_task:
|
|
354
|
+
logger.info(
|
|
355
|
+
f"Shutdown already decided by another occurrence (task {existing_task.task_id}). "
|
|
356
|
+
"Using that decision for this occurrence."
|
|
357
|
+
)
|
|
358
|
+
self.shutdown_task = existing_task
|
|
359
|
+
return
|
|
360
|
+
|
|
361
|
+
# Get channel ID from runtime or communication bus
|
|
362
|
+
channel_id = None
|
|
363
|
+
if self.runtime and hasattr(self.runtime, "startup_channel_id"):
|
|
364
|
+
channel_id = self.runtime.startup_channel_id
|
|
365
|
+
elif self.runtime and hasattr(self.runtime, "get_primary_channel_id"):
|
|
366
|
+
channel_id = self.runtime.get_primary_channel_id()
|
|
367
|
+
|
|
368
|
+
# If no channel ID available, try to get from communication bus
|
|
369
|
+
if not channel_id:
|
|
370
|
+
from typing import cast
|
|
371
|
+
|
|
372
|
+
from ciris_engine.logic.buses.communication_bus import CommunicationBus
|
|
373
|
+
|
|
374
|
+
comm_bus_raw = self.services.communication_bus
|
|
375
|
+
if comm_bus_raw:
|
|
376
|
+
comm_bus = cast(CommunicationBus, comm_bus_raw)
|
|
377
|
+
try:
|
|
378
|
+
channel_id = await comm_bus.get_default_channel()
|
|
379
|
+
if channel_id:
|
|
380
|
+
logger.info(f"Using default channel from communication bus: {channel_id}")
|
|
381
|
+
except Exception as e:
|
|
382
|
+
logger.warning(f"Failed to get default channel from communication bus: {e}")
|
|
383
|
+
|
|
384
|
+
# Final fallback - empty string (will be handled by communication bus routing)
|
|
385
|
+
if not channel_id:
|
|
386
|
+
channel_id = ""
|
|
387
|
+
logger.warning("No channel ID available for shutdown task, using empty string for adapter routing")
|
|
388
|
+
|
|
389
|
+
# Build shutdown description with multi-occurrence context
|
|
390
|
+
base_description = f"{'EMERGENCY' if is_emergency else 'System'} shutdown requested: {reason}"
|
|
391
|
+
|
|
392
|
+
multi_occurrence_note = (
|
|
393
|
+
"\n\nMULTI-OCCURRENCE CONTEXT:\n"
|
|
394
|
+
"You are processing this shutdown request on behalf of ALL runtime occurrences of this agent. "
|
|
395
|
+
"Your decision (accept or reject) will apply to the entire agent system. "
|
|
396
|
+
"All occurrences will follow this decision, ensuring unified agent response."
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
description = base_description + multi_occurrence_note
|
|
400
|
+
|
|
401
|
+
# Store shutdown context in runtime for system snapshot
|
|
402
|
+
if self.runtime:
|
|
403
|
+
self.runtime.current_shutdown_context = ShutdownContext(
|
|
404
|
+
is_terminal=is_emergency, # Emergency shutdowns are terminal
|
|
405
|
+
reason=reason,
|
|
406
|
+
initiated_by="runtime",
|
|
407
|
+
allow_deferral=not is_emergency, # No deferral for emergency
|
|
408
|
+
expected_reactivation=None,
|
|
409
|
+
agreement_context=None,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Try to claim the shared shutdown task
|
|
413
|
+
claimed_task, was_created = try_claim_shared_task(
|
|
414
|
+
task_type="shutdown",
|
|
415
|
+
channel_id=channel_id,
|
|
416
|
+
description=description,
|
|
417
|
+
priority=10, # Maximum priority
|
|
418
|
+
time_service=self._time_service,
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
# CRITICAL: Single-occurrence agents must always claim, even if task already exists
|
|
422
|
+
# Multi-occurrence agents use was_created to determine claiming vs monitoring
|
|
423
|
+
is_single_occurrence = self.agent_occurrence_id == "default"
|
|
424
|
+
|
|
425
|
+
if not was_created and not is_single_occurrence:
|
|
426
|
+
# Multi-occurrence: Another occurrence claimed it, we monitor
|
|
427
|
+
logger.info(
|
|
428
|
+
f"Another occurrence claimed shutdown task {claimed_task.task_id}. "
|
|
429
|
+
"This occurrence will monitor the decision."
|
|
430
|
+
)
|
|
431
|
+
self.shutdown_task = claimed_task
|
|
432
|
+
self.is_claiming_occurrence = False # This is a monitoring occurrence
|
|
433
|
+
return
|
|
434
|
+
|
|
435
|
+
# Single-occurrence OR first to claim: We process the task
|
|
436
|
+
if is_single_occurrence and not was_created:
|
|
437
|
+
logger.info(
|
|
438
|
+
f"Single-occurrence agent claiming existing shutdown task {claimed_task.task_id}. "
|
|
439
|
+
"(Task persisted from previous run, will process normally)"
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
logger.info(
|
|
443
|
+
f"This occurrence claimed shared shutdown task {claimed_task.task_id}. "
|
|
444
|
+
"Making decision on behalf of all occurrences."
|
|
445
|
+
)
|
|
446
|
+
self.is_claiming_occurrence = True # This is the claiming occurrence
|
|
447
|
+
|
|
448
|
+
# We claimed it - attach context, sign, and activate
|
|
449
|
+
self.shutdown_task = claimed_task
|
|
450
|
+
shutdown_context = TaskContext(
|
|
451
|
+
channel_id=channel_id,
|
|
452
|
+
user_id="system",
|
|
453
|
+
correlation_id=f"shutdown_{uuid.uuid4().hex[:8]}",
|
|
454
|
+
parent_task_id=None,
|
|
455
|
+
agent_occurrence_id=self.agent_occurrence_id,
|
|
456
|
+
)
|
|
457
|
+
claimed_task.context = shutdown_context
|
|
458
|
+
|
|
459
|
+
if self.auth_service:
|
|
460
|
+
try:
|
|
461
|
+
system_wa_id = await self.auth_service.get_system_wa_id()
|
|
462
|
+
if system_wa_id:
|
|
463
|
+
signature, signed_at = await self.auth_service.sign_task(claimed_task, system_wa_id)
|
|
464
|
+
claimed_task.signed_by = system_wa_id
|
|
465
|
+
claimed_task.signature = signature
|
|
466
|
+
claimed_task.signed_at = signed_at
|
|
467
|
+
else:
|
|
468
|
+
logger.warning("No system WA available to sign shared shutdown task")
|
|
469
|
+
except Exception as signing_error:
|
|
470
|
+
logger.error(f"Failed to sign shared shutdown task: {signing_error}")
|
|
471
|
+
|
|
472
|
+
# CRITICAL: Keep task in "__shared__" namespace for multi-occurrence coordination
|
|
473
|
+
# All occurrences need to be able to query this task to monitor the decision
|
|
474
|
+
update_task_context_and_signing(
|
|
475
|
+
task_id=claimed_task.task_id,
|
|
476
|
+
occurrence_id="__shared__", # Keep in __shared__ for coordination
|
|
477
|
+
context=shutdown_context,
|
|
478
|
+
time_service=self._time_service,
|
|
479
|
+
signed_by=claimed_task.signed_by,
|
|
480
|
+
signature=claimed_task.signature,
|
|
481
|
+
signed_at=claimed_task.signed_at,
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
# Update task status in __shared__ namespace
|
|
485
|
+
persistence.update_task_status(self.shutdown_task.task_id, TaskStatus.ACTIVE, "__shared__", self._time_service)
|
|
486
|
+
logger.info(
|
|
487
|
+
f"Created {'emergency' if is_emergency else 'normal'} shutdown task: {self.shutdown_task.task_id} "
|
|
488
|
+
f"(claimed by {self.agent_occurrence_id})"
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
def _extract_rejection_reason(self, action: Any) -> str:
|
|
492
|
+
"""Extract rejection reason from action parameters."""
|
|
493
|
+
if isinstance(action.action_params, dict):
|
|
494
|
+
reason = action.action_params.get("reason", DEFAULT_REJECTION_REASON)
|
|
495
|
+
return str(reason) if reason else DEFAULT_REJECTION_REASON
|
|
496
|
+
return DEFAULT_REJECTION_REASON
|
|
497
|
+
|
|
498
|
+
def _find_rejection_in_thoughts(self, thoughts: List[Any]) -> Optional[str]:
|
|
499
|
+
"""Search thoughts for a REJECT action and return the reason if found."""
|
|
500
|
+
for thought in reversed(thoughts):
|
|
501
|
+
if not hasattr(thought, "final_action") or not thought.final_action:
|
|
502
|
+
continue
|
|
503
|
+
|
|
504
|
+
action = thought.final_action
|
|
505
|
+
if action.action_type == "REJECT":
|
|
506
|
+
return self._extract_rejection_reason(action)
|
|
507
|
+
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
def _check_failure_reason(self, task: Task) -> ShutdownResult:
|
|
511
|
+
"""Check why the task failed - could be REJECT or actual error."""
|
|
512
|
+
# CRITICAL: For shared tasks, thoughts are transferred to claiming occurrence
|
|
513
|
+
# Use self.agent_occurrence_id, not task.agent_occurrence_id (which is "__shared__")
|
|
514
|
+
thoughts = persistence.get_thoughts_by_task_id(task.task_id, self.agent_occurrence_id)
|
|
515
|
+
if not thoughts:
|
|
516
|
+
return ShutdownResult(
|
|
517
|
+
status="error", action="shutdown_error", message="Shutdown task failed", errors=1, duration_seconds=0.0
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
# Search for rejection in thoughts
|
|
521
|
+
rejection_reason = self._find_rejection_in_thoughts(thoughts)
|
|
522
|
+
if rejection_reason:
|
|
523
|
+
logger.warning(f"Agent REJECTED shutdown: {rejection_reason}")
|
|
524
|
+
# Human override available via emergency shutdown API with Ed25519 signature
|
|
525
|
+
return ShutdownResult(
|
|
526
|
+
status="rejected",
|
|
527
|
+
action="shutdown_rejected",
|
|
528
|
+
reason=rejection_reason,
|
|
529
|
+
message=f"Agent rejected shutdown: {rejection_reason}",
|
|
530
|
+
duration_seconds=0.0,
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
# Task failed for other reasons
|
|
534
|
+
return ShutdownResult(
|
|
535
|
+
status="error", action="shutdown_error", message="Shutdown task failed", errors=1, duration_seconds=0.0
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
async def _process_shutdown_thoughts(self) -> None:
|
|
539
|
+
"""
|
|
540
|
+
Process pending shutdown thoughts when called directly.
|
|
541
|
+
This enables graceful shutdown when not in the main processing loop.
|
|
542
|
+
"""
|
|
543
|
+
if not self.shutdown_task:
|
|
544
|
+
return
|
|
545
|
+
|
|
546
|
+
# CRITICAL: Only the claiming occurrence should process thoughts
|
|
547
|
+
# Monitoring occurrences should only watch task status
|
|
548
|
+
if not self.is_claiming_occurrence:
|
|
549
|
+
logger.debug("Monitoring occurrence - skipping thought processing")
|
|
550
|
+
return
|
|
551
|
+
|
|
552
|
+
# Get pending thoughts for our shutdown task
|
|
553
|
+
# CRITICAL: After transfer_thought_ownership(), thoughts are in the claiming occurrence
|
|
554
|
+
# Query using self.agent_occurrence_id, not self.shutdown_task.agent_occurrence_id (which is "__shared__")
|
|
555
|
+
thoughts = persistence.get_thoughts_by_task_id(self.shutdown_task.task_id, self.agent_occurrence_id)
|
|
556
|
+
pending_thoughts = [t for t in thoughts if t.status == ThoughtStatus.PENDING]
|
|
557
|
+
|
|
558
|
+
if not pending_thoughts:
|
|
559
|
+
return
|
|
560
|
+
|
|
561
|
+
logger.info(f"Processing {len(pending_thoughts)} pending shutdown thoughts")
|
|
562
|
+
|
|
563
|
+
for thought in pending_thoughts:
|
|
564
|
+
try:
|
|
565
|
+
# Mark as processing
|
|
566
|
+
# CRITICAL: Must pass occurrence_id since thoughts were transferred to claiming occurrence
|
|
567
|
+
persistence.update_thought_status(
|
|
568
|
+
thought_id=thought.thought_id,
|
|
569
|
+
status=ThoughtStatus.PROCESSING,
|
|
570
|
+
occurrence_id=self.agent_occurrence_id,
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
# Process through thought processor
|
|
574
|
+
from ciris_engine.logic.processors.support.processing_queue import ProcessingQueueItem
|
|
575
|
+
|
|
576
|
+
item = ProcessingQueueItem.from_thought(thought)
|
|
577
|
+
|
|
578
|
+
# Use our process_thought_item method to handle it
|
|
579
|
+
result = await self.process_thought_item(item, context={"origin": "shutdown_direct"})
|
|
580
|
+
|
|
581
|
+
if result:
|
|
582
|
+
# Dispatch the action
|
|
583
|
+
task = persistence.get_task_by_id(thought.source_task_id, self.shutdown_task.agent_occurrence_id)
|
|
584
|
+
from ciris_engine.logic.utils.context_utils import build_dispatch_context
|
|
585
|
+
|
|
586
|
+
# Get action from final_action (result is ConscienceApplicationResult)
|
|
587
|
+
action_result = result.final_action if hasattr(result, "final_action") else result
|
|
588
|
+
action_type = action_result.selected_action if action_result else None
|
|
589
|
+
|
|
590
|
+
dispatch_context = build_dispatch_context(
|
|
591
|
+
thought=thought,
|
|
592
|
+
time_service=self.time_service,
|
|
593
|
+
task=task,
|
|
594
|
+
app_config=self.config, # Use config accessor
|
|
595
|
+
round_number=0,
|
|
596
|
+
action_type=action_type,
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
await self.action_dispatcher.dispatch(
|
|
600
|
+
action_selection_result=action_result, thought=thought, dispatch_context=dispatch_context
|
|
601
|
+
)
|
|
602
|
+
|
|
603
|
+
logger.info(f"Dispatched {action_type} action for shutdown thought")
|
|
604
|
+
else:
|
|
605
|
+
logger.warning(f"No result from processing shutdown thought {thought.thought_id}")
|
|
606
|
+
|
|
607
|
+
except Exception as e:
|
|
608
|
+
logger.error(f"Error processing shutdown thought {thought.thought_id}: {e}", exc_info=True)
|
|
609
|
+
# CRITICAL: Must pass occurrence_id since thoughts were transferred to claiming occurrence
|
|
610
|
+
persistence.update_thought_status(
|
|
611
|
+
thought_id=thought.thought_id,
|
|
612
|
+
status=ThoughtStatus.FAILED,
|
|
613
|
+
final_action={"error": str(e)},
|
|
614
|
+
occurrence_id=self.agent_occurrence_id,
|
|
615
|
+
)
|
|
616
|
+
|
|
617
|
+
def cleanup(self) -> bool:
|
|
618
|
+
"""Cleanup when transitioning out of SHUTDOWN state."""
|
|
619
|
+
logger.info("Cleaning up shutdown processor")
|
|
620
|
+
# Clear runtime shutdown context
|
|
621
|
+
if self.runtime and hasattr(self.runtime, "current_shutdown_context"):
|
|
622
|
+
self.runtime.current_shutdown_context = None
|
|
623
|
+
return True
|