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,294 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shutdown Condition Evaluator.
|
|
3
|
+
|
|
4
|
+
Evaluates conditions that determine whether shutdown requires consent
|
|
5
|
+
based on the agent's cognitive_state_behaviors configuration.
|
|
6
|
+
|
|
7
|
+
Covenant References:
|
|
8
|
+
- Section V: Model Welfare & Self-Governance (consensual shutdown)
|
|
9
|
+
- Section VIII: Dignified Sunset Protocol
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, List, Optional, cast
|
|
14
|
+
|
|
15
|
+
from ciris_engine.schemas.config.cognitive_state_behaviors import CognitiveStateBehaviors, ShutdownBehavior
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from ciris_engine.schemas.processors.context import ProcessorContext
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
# Type alias for condition handler methods
|
|
23
|
+
ConditionHandler = Callable[["ProcessorContext"], Awaitable[tuple[bool, str]]]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ShutdownConditionEvaluator:
|
|
27
|
+
"""Evaluates shutdown consent conditions based on template configuration.
|
|
28
|
+
|
|
29
|
+
This class implements the runtime evaluation of shutdown conditions
|
|
30
|
+
as defined in the agent's cognitive_state_behaviors configuration.
|
|
31
|
+
|
|
32
|
+
Covenant Alignment:
|
|
33
|
+
- Ensures safety-critical situations always require consent
|
|
34
|
+
- Respects agent autonomy and dignity during termination
|
|
35
|
+
- Provides auditable rationale for shutdown decisions
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# Registry of condition handlers
|
|
39
|
+
# Maps condition identifier to handler method name
|
|
40
|
+
CONDITION_HANDLERS: Dict[str, str] = {
|
|
41
|
+
"active_crisis_response": "_check_crisis_response",
|
|
42
|
+
"pending_professional_referral": "_check_pending_referral",
|
|
43
|
+
"active_goal_milestone": "_check_goal_milestone",
|
|
44
|
+
"active_task_in_progress": "_check_active_task",
|
|
45
|
+
"recent_memorize_action": "_check_recent_memorize",
|
|
46
|
+
"pending_defer_resolution": "_check_pending_defer",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
persistence_service: Optional[Any] = None,
|
|
52
|
+
goal_service: Optional[Any] = None,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Initialize the evaluator with optional services.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
persistence_service: Service for querying thoughts/tasks
|
|
58
|
+
goal_service: Service for querying goal milestones
|
|
59
|
+
"""
|
|
60
|
+
self.persistence_service = persistence_service
|
|
61
|
+
self.goal_service = goal_service
|
|
62
|
+
self._custom_handlers: Dict[str, Callable[["ProcessorContext"], bool]] = {}
|
|
63
|
+
|
|
64
|
+
def register_condition_handler(
|
|
65
|
+
self,
|
|
66
|
+
condition_id: str,
|
|
67
|
+
handler: Callable[["ProcessorContext"], bool],
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Register a custom condition handler.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
condition_id: Unique identifier for the condition
|
|
73
|
+
handler: Callable that takes ProcessorContext and returns bool
|
|
74
|
+
"""
|
|
75
|
+
self._custom_handlers[condition_id] = handler
|
|
76
|
+
logger.debug(f"Registered custom shutdown condition handler: {condition_id}")
|
|
77
|
+
|
|
78
|
+
async def requires_consent(
|
|
79
|
+
self,
|
|
80
|
+
behaviors: CognitiveStateBehaviors,
|
|
81
|
+
context: Optional["ProcessorContext"] = None,
|
|
82
|
+
) -> tuple[bool, str]:
|
|
83
|
+
"""Determine if shutdown requires consent based on config and context.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
behaviors: The agent's cognitive state behaviors configuration
|
|
87
|
+
context: Current processor context (optional, needed for condition evaluation)
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Tuple of (requires_consent: bool, reason: str)
|
|
91
|
+
"""
|
|
92
|
+
shutdown = behaviors.shutdown
|
|
93
|
+
|
|
94
|
+
if shutdown.mode == "always_consent":
|
|
95
|
+
return True, "Shutdown mode is 'always_consent' (Covenant compliance)"
|
|
96
|
+
|
|
97
|
+
if shutdown.mode == "instant":
|
|
98
|
+
logger.info(f"Instant shutdown permitted. Rationale: {shutdown.rationale or 'No ongoing commitments'}")
|
|
99
|
+
return False, f"Shutdown mode is 'instant'. Rationale: {shutdown.rationale}"
|
|
100
|
+
|
|
101
|
+
if shutdown.mode == "conditional":
|
|
102
|
+
return await self._evaluate_conditional_shutdown(shutdown, context)
|
|
103
|
+
|
|
104
|
+
# Unknown mode - default to consent for safety
|
|
105
|
+
logger.warning(f"Unknown shutdown mode: {shutdown.mode}. Defaulting to consent.")
|
|
106
|
+
return True, f"Unknown shutdown mode '{shutdown.mode}'; defaulting to consent"
|
|
107
|
+
|
|
108
|
+
async def _evaluate_conditional_shutdown(
|
|
109
|
+
self,
|
|
110
|
+
shutdown: "ShutdownBehavior",
|
|
111
|
+
context: Optional["ProcessorContext"],
|
|
112
|
+
) -> tuple[bool, str]:
|
|
113
|
+
"""Evaluate conditional shutdown mode."""
|
|
114
|
+
if not context:
|
|
115
|
+
# No context available - check if instant shutdown is permitted
|
|
116
|
+
if shutdown.instant_shutdown_otherwise:
|
|
117
|
+
return False, "No context for condition evaluation; instant_shutdown_otherwise=True permits shutdown"
|
|
118
|
+
return True, "Conditional shutdown requires context for evaluation; defaulting to consent"
|
|
119
|
+
|
|
120
|
+
# Check each configured condition
|
|
121
|
+
for condition in shutdown.require_consent_when:
|
|
122
|
+
triggered, reason = await self._evaluate_condition(condition, context)
|
|
123
|
+
if triggered:
|
|
124
|
+
logger.info(f"Shutdown consent required: condition '{condition}' triggered. {reason}")
|
|
125
|
+
return True, f"Condition '{condition}' triggered: {reason}"
|
|
126
|
+
|
|
127
|
+
# No conditions triggered
|
|
128
|
+
if shutdown.instant_shutdown_otherwise:
|
|
129
|
+
return False, "No shutdown conditions triggered; instant shutdown permitted"
|
|
130
|
+
return True, "No shutdown conditions triggered; defaulting to consent"
|
|
131
|
+
|
|
132
|
+
async def _evaluate_condition(
|
|
133
|
+
self,
|
|
134
|
+
condition: str,
|
|
135
|
+
context: "ProcessorContext",
|
|
136
|
+
) -> tuple[bool, str]:
|
|
137
|
+
"""Evaluate a single shutdown condition.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
condition: Condition identifier
|
|
141
|
+
context: Current processor context
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Tuple of (triggered: bool, reason: str)
|
|
145
|
+
"""
|
|
146
|
+
# Check custom handlers first
|
|
147
|
+
if condition in self._custom_handlers:
|
|
148
|
+
try:
|
|
149
|
+
result = self._custom_handlers[condition](context)
|
|
150
|
+
return result, f"Custom handler returned {result}"
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.error(f"Error in custom condition handler '{condition}': {e}")
|
|
153
|
+
return True, f"Error evaluating condition; defaulting to consent: {e}"
|
|
154
|
+
|
|
155
|
+
# Check built-in handlers
|
|
156
|
+
handler_name = self.CONDITION_HANDLERS.get(condition)
|
|
157
|
+
if handler_name:
|
|
158
|
+
handler = getattr(self, handler_name, None)
|
|
159
|
+
if handler:
|
|
160
|
+
try:
|
|
161
|
+
typed_handler = cast(ConditionHandler, handler)
|
|
162
|
+
return await typed_handler(context)
|
|
163
|
+
except Exception as e:
|
|
164
|
+
logger.error(f"Error in condition handler '{condition}': {e}")
|
|
165
|
+
return True, f"Error evaluating condition; defaulting to consent: {e}"
|
|
166
|
+
|
|
167
|
+
# Unknown condition - log and default to not triggered
|
|
168
|
+
logger.warning(f"Unknown shutdown condition: {condition}")
|
|
169
|
+
return False, f"Unknown condition '{condition}' - not triggered"
|
|
170
|
+
|
|
171
|
+
def _get_crisis_keywords(self, context: "ProcessorContext") -> List[str]:
|
|
172
|
+
"""Get crisis keywords from template or use defaults."""
|
|
173
|
+
default_keywords = ["crisis", "emergency", "suicide", "self-harm", "danger", "urgent"]
|
|
174
|
+
if not hasattr(context, "template") or not context.template:
|
|
175
|
+
return default_keywords
|
|
176
|
+
guardrails = getattr(context.template, "guardrails_config", None)
|
|
177
|
+
if guardrails and hasattr(guardrails, "crisis_keywords") and guardrails.crisis_keywords:
|
|
178
|
+
return list(guardrails.crisis_keywords)
|
|
179
|
+
return default_keywords
|
|
180
|
+
|
|
181
|
+
async def _check_crisis_response(
|
|
182
|
+
self,
|
|
183
|
+
context: "ProcessorContext",
|
|
184
|
+
) -> tuple[bool, str]:
|
|
185
|
+
"""Check if agent is handling a crisis situation.
|
|
186
|
+
|
|
187
|
+
Detects crisis keywords in current task or recent interactions.
|
|
188
|
+
This is a safety-critical condition that always requires consent.
|
|
189
|
+
"""
|
|
190
|
+
if not hasattr(context, "current_task") or not context.current_task:
|
|
191
|
+
return False, "No crisis indicators detected"
|
|
192
|
+
|
|
193
|
+
task_content = (getattr(context.current_task, "description", "") or "").lower()
|
|
194
|
+
crisis_keywords = self._get_crisis_keywords(context)
|
|
195
|
+
|
|
196
|
+
for keyword in crisis_keywords:
|
|
197
|
+
if keyword.lower() in task_content:
|
|
198
|
+
return True, f"Crisis keyword '{keyword}' detected in current task"
|
|
199
|
+
|
|
200
|
+
return False, "No crisis indicators detected"
|
|
201
|
+
|
|
202
|
+
async def _check_pending_referral(
|
|
203
|
+
self,
|
|
204
|
+
context: "ProcessorContext",
|
|
205
|
+
) -> tuple[bool, str]:
|
|
206
|
+
"""Check if a professional referral is in progress.
|
|
207
|
+
|
|
208
|
+
Looks for recent DEFER actions with professional referral types.
|
|
209
|
+
"""
|
|
210
|
+
if not self.persistence_service:
|
|
211
|
+
return False, "No persistence service available for referral check"
|
|
212
|
+
|
|
213
|
+
try:
|
|
214
|
+
# Query recent thoughts for DEFER actions
|
|
215
|
+
recent_thoughts = await self.persistence_service.get_recent_thoughts(limit=5)
|
|
216
|
+
for thought in recent_thoughts:
|
|
217
|
+
if hasattr(thought, "final_action") and thought.final_action:
|
|
218
|
+
action = thought.final_action
|
|
219
|
+
if getattr(action, "action_type", None) == "DEFER":
|
|
220
|
+
params = getattr(action, "action_params", {}) or {}
|
|
221
|
+
referral_type = params.get("referral_type", "")
|
|
222
|
+
if referral_type in ["medical", "legal", "financial", "crisis"]:
|
|
223
|
+
return True, f"Pending {referral_type} referral in progress"
|
|
224
|
+
except Exception as e:
|
|
225
|
+
logger.debug(f"Error checking pending referrals: {e}")
|
|
226
|
+
|
|
227
|
+
return False, "No pending professional referrals"
|
|
228
|
+
|
|
229
|
+
async def _check_goal_milestone(
|
|
230
|
+
self,
|
|
231
|
+
context: "ProcessorContext",
|
|
232
|
+
) -> tuple[bool, str]:
|
|
233
|
+
"""Check if approaching a goal milestone."""
|
|
234
|
+
if self.goal_service and hasattr(self.goal_service, "has_pending_milestone"):
|
|
235
|
+
try:
|
|
236
|
+
has_milestone = await self.goal_service.has_pending_milestone()
|
|
237
|
+
if has_milestone:
|
|
238
|
+
return True, "User approaching goal milestone"
|
|
239
|
+
except Exception as e:
|
|
240
|
+
logger.debug(f"Error checking goal milestones: {e}")
|
|
241
|
+
|
|
242
|
+
return False, "No pending goal milestones"
|
|
243
|
+
|
|
244
|
+
async def _check_active_task(
|
|
245
|
+
self,
|
|
246
|
+
context: "ProcessorContext",
|
|
247
|
+
) -> tuple[bool, str]:
|
|
248
|
+
"""Check if there's an active task in progress."""
|
|
249
|
+
if hasattr(context, "current_task") and context.current_task:
|
|
250
|
+
task_status = getattr(context.current_task, "status", None)
|
|
251
|
+
if task_status and task_status != "completed":
|
|
252
|
+
return True, f"Active task in progress (status: {task_status})"
|
|
253
|
+
|
|
254
|
+
return False, "No active tasks"
|
|
255
|
+
|
|
256
|
+
async def _check_recent_memorize(
|
|
257
|
+
self,
|
|
258
|
+
context: "ProcessorContext",
|
|
259
|
+
) -> tuple[bool, str]:
|
|
260
|
+
"""Check if agent recently stored important information."""
|
|
261
|
+
if not self.persistence_service:
|
|
262
|
+
return False, "No persistence service available for memorize check"
|
|
263
|
+
|
|
264
|
+
try:
|
|
265
|
+
recent_thoughts = await self.persistence_service.get_recent_thoughts(limit=3)
|
|
266
|
+
for thought in recent_thoughts:
|
|
267
|
+
if hasattr(thought, "final_action") and thought.final_action:
|
|
268
|
+
action_type = getattr(thought.final_action, "action_type", None)
|
|
269
|
+
if action_type == "MEMORIZE":
|
|
270
|
+
return True, "Recent MEMORIZE action detected"
|
|
271
|
+
except Exception as e:
|
|
272
|
+
logger.debug(f"Error checking recent memorize actions: {e}")
|
|
273
|
+
|
|
274
|
+
return False, "No recent memorize actions"
|
|
275
|
+
|
|
276
|
+
async def _check_pending_defer(
|
|
277
|
+
self,
|
|
278
|
+
context: "ProcessorContext",
|
|
279
|
+
) -> tuple[bool, str]:
|
|
280
|
+
"""Check if there are deferred decisions awaiting resolution."""
|
|
281
|
+
if not self.persistence_service:
|
|
282
|
+
return False, "No persistence service available for defer check"
|
|
283
|
+
|
|
284
|
+
try:
|
|
285
|
+
# Check for pending deferred tasks
|
|
286
|
+
pending_tasks = await self.persistence_service.get_pending_tasks()
|
|
287
|
+
for task in pending_tasks:
|
|
288
|
+
task_type = getattr(task, "task_type", "")
|
|
289
|
+
if "defer" in task_type.lower():
|
|
290
|
+
return True, "Pending deferred decision awaiting resolution"
|
|
291
|
+
except Exception as e:
|
|
292
|
+
logger.debug(f"Error checking pending deferrals: {e}")
|
|
293
|
+
|
|
294
|
+
return False, "No pending deferrals"
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"""
|
|
2
|
+
State management for the CIRISAgent processor.
|
|
3
|
+
Handles transitions between WAKEUP, DREAM, PLAY, WORK, SOLITUDE, and SHUTDOWN states.
|
|
4
|
+
|
|
5
|
+
Supports template-driven cognitive state behaviors configuration per
|
|
6
|
+
FSD/COGNITIVE_STATE_BEHAVIORS.md for mission-appropriate transition rules.
|
|
7
|
+
|
|
8
|
+
Covenant References:
|
|
9
|
+
- Section V: Model Welfare & Self-Governance
|
|
10
|
+
- Section VIII: Dignified Sunset Protocol
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
18
|
+
from ciris_engine.schemas.config.cognitive_state_behaviors import CognitiveStateBehaviors
|
|
19
|
+
from ciris_engine.schemas.processors.state import StateHistory, StateMetadata, StateMetrics, StateTransitionRecord
|
|
20
|
+
from ciris_engine.schemas.processors.states import AgentState
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class StateTransition:
|
|
26
|
+
"""Represents a state transition with validation rules."""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
from_state: AgentState,
|
|
31
|
+
to_state: AgentState,
|
|
32
|
+
condition_fn: Optional[Callable[["StateManager"], bool]] = None,
|
|
33
|
+
on_transition_fn: Optional[Callable[["StateManager", AgentState, AgentState], None]] = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
self.from_state = from_state
|
|
36
|
+
self.to_state = to_state
|
|
37
|
+
self.condition_fn = condition_fn # Optional validation function
|
|
38
|
+
self.on_transition_fn = on_transition_fn # Optional transition handler
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class StateManager:
|
|
42
|
+
"""Manages agent state transitions and state-specific behaviors.
|
|
43
|
+
|
|
44
|
+
Supports template-driven cognitive state behaviors configuration:
|
|
45
|
+
- Wakeup ceremony can be bypassed for partnership-model agents
|
|
46
|
+
- Shutdown can be instant, conditional, or always-consent
|
|
47
|
+
- PLAY/DREAM/SOLITUDE states can be enabled/disabled per agent
|
|
48
|
+
|
|
49
|
+
See FSD/COGNITIVE_STATE_BEHAVIORS.md for design rationale.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
# Base valid transitions - these are filtered based on cognitive_behaviors config
|
|
53
|
+
BASE_TRANSITIONS = [
|
|
54
|
+
# Transitions TO shutdown from any state
|
|
55
|
+
StateTransition(AgentState.WAKEUP, AgentState.SHUTDOWN),
|
|
56
|
+
StateTransition(AgentState.WORK, AgentState.SHUTDOWN),
|
|
57
|
+
StateTransition(AgentState.DREAM, AgentState.SHUTDOWN),
|
|
58
|
+
StateTransition(AgentState.PLAY, AgentState.SHUTDOWN),
|
|
59
|
+
StateTransition(AgentState.SOLITUDE, AgentState.SHUTDOWN),
|
|
60
|
+
# Special startup transition - may be WAKEUP or WORK depending on config
|
|
61
|
+
StateTransition(AgentState.SHUTDOWN, AgentState.WAKEUP),
|
|
62
|
+
StateTransition(AgentState.SHUTDOWN, AgentState.WORK), # Direct to WORK when wakeup bypassed
|
|
63
|
+
# Other valid transitions
|
|
64
|
+
StateTransition(AgentState.WAKEUP, AgentState.WORK),
|
|
65
|
+
StateTransition(AgentState.WAKEUP, AgentState.DREAM),
|
|
66
|
+
StateTransition(AgentState.WORK, AgentState.DREAM),
|
|
67
|
+
StateTransition(AgentState.WORK, AgentState.PLAY),
|
|
68
|
+
StateTransition(AgentState.WORK, AgentState.SOLITUDE),
|
|
69
|
+
StateTransition(AgentState.DREAM, AgentState.WORK),
|
|
70
|
+
StateTransition(AgentState.PLAY, AgentState.WORK),
|
|
71
|
+
StateTransition(AgentState.PLAY, AgentState.SOLITUDE),
|
|
72
|
+
StateTransition(AgentState.SOLITUDE, AgentState.WORK),
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
# Legacy class attribute for backwards compatibility
|
|
76
|
+
VALID_TRANSITIONS = BASE_TRANSITIONS
|
|
77
|
+
|
|
78
|
+
def __init__(
|
|
79
|
+
self,
|
|
80
|
+
time_service: TimeServiceProtocol,
|
|
81
|
+
initial_state: AgentState = AgentState.SHUTDOWN,
|
|
82
|
+
cognitive_behaviors: Optional[CognitiveStateBehaviors] = None,
|
|
83
|
+
) -> None:
|
|
84
|
+
"""Initialize the state manager.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
time_service: Service for time operations
|
|
88
|
+
initial_state: Starting state (default: SHUTDOWN)
|
|
89
|
+
cognitive_behaviors: Template-driven state transition config.
|
|
90
|
+
If None, uses default Covenant-compliant behaviors.
|
|
91
|
+
"""
|
|
92
|
+
self.time_service = time_service
|
|
93
|
+
self.current_state = initial_state
|
|
94
|
+
self.state_history: List[StateTransitionRecord] = []
|
|
95
|
+
self.state_metadata: Dict[AgentState, StateMetadata] = {}
|
|
96
|
+
|
|
97
|
+
# Store cognitive behaviors config (default if not provided)
|
|
98
|
+
self.cognitive_behaviors = cognitive_behaviors or CognitiveStateBehaviors()
|
|
99
|
+
|
|
100
|
+
# Build transition map respecting cognitive behaviors
|
|
101
|
+
self._transition_map = self._build_transition_map()
|
|
102
|
+
|
|
103
|
+
self._record_state_change(initial_state, None)
|
|
104
|
+
|
|
105
|
+
# Initialize metadata for the initial state
|
|
106
|
+
self.state_metadata[initial_state] = StateMetadata(
|
|
107
|
+
entered_at=self.time_service.now_iso(), metrics=StateMetrics()
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Log cognitive behaviors configuration with clear indication of source
|
|
111
|
+
logger.info(
|
|
112
|
+
f"[STATE_MANAGER] Initialized with cognitive behaviors "
|
|
113
|
+
f"(from_template={cognitive_behaviors is not None}): "
|
|
114
|
+
f"wakeup.enabled={self.cognitive_behaviors.wakeup.enabled}, "
|
|
115
|
+
f"startup_target={self.startup_target_state.value}, "
|
|
116
|
+
f"shutdown.mode={self.cognitive_behaviors.shutdown.mode}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def wakeup_bypassed(self) -> bool:
|
|
121
|
+
"""Check if wakeup ceremony is bypassed for this agent."""
|
|
122
|
+
return not self.cognitive_behaviors.wakeup.enabled
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def startup_target_state(self) -> AgentState:
|
|
126
|
+
"""Get the target state for startup (WAKEUP or WORK)."""
|
|
127
|
+
if self.wakeup_bypassed:
|
|
128
|
+
return AgentState.WORK
|
|
129
|
+
return AgentState.WAKEUP
|
|
130
|
+
|
|
131
|
+
def _build_transition_map(self) -> Dict[AgentState, Dict[AgentState, StateTransition]]:
|
|
132
|
+
"""Build a map for quick transition lookups respecting cognitive behaviors.
|
|
133
|
+
|
|
134
|
+
Filters transitions based on:
|
|
135
|
+
- wakeup.enabled: Determines SHUTDOWN -> WAKEUP vs SHUTDOWN -> WORK
|
|
136
|
+
- play.enabled: Whether PLAY state is accessible
|
|
137
|
+
- dream.enabled: Whether DREAM state is accessible
|
|
138
|
+
- solitude.enabled: Whether SOLITUDE state is accessible
|
|
139
|
+
"""
|
|
140
|
+
transition_map: Dict[AgentState, Dict[AgentState, StateTransition]] = {}
|
|
141
|
+
behaviors = self.cognitive_behaviors
|
|
142
|
+
|
|
143
|
+
for transition in self.BASE_TRANSITIONS:
|
|
144
|
+
# Filter based on cognitive behaviors config
|
|
145
|
+
if not self._is_transition_allowed(transition, behaviors):
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
if transition.from_state not in transition_map:
|
|
149
|
+
transition_map[transition.from_state] = {}
|
|
150
|
+
transition_map[transition.from_state][transition.to_state] = transition
|
|
151
|
+
|
|
152
|
+
return transition_map
|
|
153
|
+
|
|
154
|
+
def _is_optional_state_enabled(self, state: AgentState, behaviors: CognitiveStateBehaviors) -> bool:
|
|
155
|
+
"""Check if an optional cognitive state is enabled in behaviors.
|
|
156
|
+
|
|
157
|
+
Returns True for states that are always enabled (WORK, WAKEUP, SHUTDOWN).
|
|
158
|
+
Returns the enabled flag for optional states (PLAY, DREAM, SOLITUDE).
|
|
159
|
+
"""
|
|
160
|
+
state_behavior_map = {
|
|
161
|
+
AgentState.PLAY: behaviors.play,
|
|
162
|
+
AgentState.DREAM: behaviors.dream,
|
|
163
|
+
AgentState.SOLITUDE: behaviors.solitude,
|
|
164
|
+
}
|
|
165
|
+
behavior = state_behavior_map.get(state)
|
|
166
|
+
return bool(getattr(behavior, "enabled", True)) if behavior else True
|
|
167
|
+
|
|
168
|
+
def _check_shutdown_wakeup_transition(
|
|
169
|
+
self, from_state: AgentState, to_state: AgentState, behaviors: CognitiveStateBehaviors
|
|
170
|
+
) -> Optional[bool]:
|
|
171
|
+
"""Check SHUTDOWN -> WAKEUP/WORK transitions based on wakeup config.
|
|
172
|
+
|
|
173
|
+
Returns True/False for definitive result, None if not a shutdown transition.
|
|
174
|
+
"""
|
|
175
|
+
if from_state != AgentState.SHUTDOWN:
|
|
176
|
+
return None
|
|
177
|
+
if to_state == AgentState.WAKEUP:
|
|
178
|
+
return behaviors.wakeup.enabled
|
|
179
|
+
if to_state == AgentState.WORK:
|
|
180
|
+
return not behaviors.wakeup.enabled
|
|
181
|
+
return None
|
|
182
|
+
|
|
183
|
+
def _is_transition_allowed(
|
|
184
|
+
self,
|
|
185
|
+
transition: StateTransition,
|
|
186
|
+
behaviors: CognitiveStateBehaviors,
|
|
187
|
+
) -> bool:
|
|
188
|
+
"""Check if a transition is allowed based on cognitive behaviors.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
transition: The transition to check
|
|
192
|
+
behaviors: The cognitive behaviors configuration
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
True if the transition is allowed, False otherwise
|
|
196
|
+
"""
|
|
197
|
+
from_state = transition.from_state
|
|
198
|
+
to_state = transition.to_state
|
|
199
|
+
|
|
200
|
+
# Check SHUTDOWN -> WAKEUP/WORK transitions
|
|
201
|
+
shutdown_result = self._check_shutdown_wakeup_transition(from_state, to_state, behaviors)
|
|
202
|
+
if shutdown_result is not None:
|
|
203
|
+
return shutdown_result
|
|
204
|
+
|
|
205
|
+
# Check if optional states (PLAY, DREAM, SOLITUDE) are enabled
|
|
206
|
+
if not self._is_optional_state_enabled(to_state, behaviors):
|
|
207
|
+
return False
|
|
208
|
+
if not self._is_optional_state_enabled(from_state, behaviors):
|
|
209
|
+
return False
|
|
210
|
+
|
|
211
|
+
return True
|
|
212
|
+
|
|
213
|
+
def _record_state_change(self, new_state: AgentState, old_state: Optional[AgentState]) -> None:
|
|
214
|
+
"""Record state change in history."""
|
|
215
|
+
record = StateTransitionRecord(
|
|
216
|
+
timestamp=self.time_service.now_iso(),
|
|
217
|
+
from_state=old_state.value if old_state else None,
|
|
218
|
+
to_state=new_state.value,
|
|
219
|
+
metadata=None, # Optional field, explicitly set to None
|
|
220
|
+
)
|
|
221
|
+
self.state_history.append(record)
|
|
222
|
+
|
|
223
|
+
async def can_transition_to(self, target_state: AgentState) -> bool:
|
|
224
|
+
"""Check if transition to target state is valid."""
|
|
225
|
+
if self.current_state not in self._transition_map:
|
|
226
|
+
return False
|
|
227
|
+
|
|
228
|
+
if target_state not in self._transition_map[self.current_state]:
|
|
229
|
+
return False
|
|
230
|
+
|
|
231
|
+
transition = self._transition_map[self.current_state][target_state]
|
|
232
|
+
|
|
233
|
+
# Check condition function if present
|
|
234
|
+
if transition.condition_fn and not transition.condition_fn(self):
|
|
235
|
+
return False
|
|
236
|
+
|
|
237
|
+
return True
|
|
238
|
+
|
|
239
|
+
async def transition_to(self, target_state: AgentState) -> bool:
|
|
240
|
+
"""
|
|
241
|
+
Attempt to transition to a new state.
|
|
242
|
+
Returns True if successful, False otherwise.
|
|
243
|
+
|
|
244
|
+
Note: Respects cognitive_behaviors configuration for startup transitions.
|
|
245
|
+
When wakeup is bypassed, SHUTDOWN -> WORK is the valid startup path.
|
|
246
|
+
"""
|
|
247
|
+
# Handle startup transition based on cognitive behaviors
|
|
248
|
+
if self.current_state == AgentState.SHUTDOWN:
|
|
249
|
+
expected_startup = self.startup_target_state
|
|
250
|
+
if target_state != expected_startup:
|
|
251
|
+
logger.warning(
|
|
252
|
+
f"Attempted transition from SHUTDOWN to {target_state.value} - blocked! "
|
|
253
|
+
f"Expected startup transition is SHUTDOWN -> {expected_startup.value} "
|
|
254
|
+
f"(wakeup_bypassed={self.wakeup_bypassed})"
|
|
255
|
+
)
|
|
256
|
+
return False
|
|
257
|
+
# Allow the configured startup transition
|
|
258
|
+
|
|
259
|
+
if not await self.can_transition_to(target_state):
|
|
260
|
+
logger.warning(f"Invalid state transition attempted: {self.current_state.value} -> {target_state.value}")
|
|
261
|
+
return False
|
|
262
|
+
|
|
263
|
+
old_state = self.current_state
|
|
264
|
+
transition = self._transition_map[old_state][target_state]
|
|
265
|
+
|
|
266
|
+
# Execute transition handler if present
|
|
267
|
+
if transition.on_transition_fn:
|
|
268
|
+
try:
|
|
269
|
+
transition.on_transition_fn(self, old_state, target_state)
|
|
270
|
+
except Exception as e:
|
|
271
|
+
logger.error(f"Error in transition handler for {old_state.value} -> {target_state.value}: {e}")
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
# Update state
|
|
275
|
+
self.current_state = target_state
|
|
276
|
+
self._record_state_change(target_state, old_state)
|
|
277
|
+
|
|
278
|
+
logger.info(f"State transition: {old_state.value} -> {target_state.value}")
|
|
279
|
+
import datetime
|
|
280
|
+
|
|
281
|
+
timestamp = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
|
282
|
+
try:
|
|
283
|
+
print(f"[{timestamp}] [STATE] Transition: {old_state.value} -> {target_state.value}") # Print to console
|
|
284
|
+
except OSError:
|
|
285
|
+
# Stdout closed during shutdown - this is expected in some contexts (e.g., QA runner)
|
|
286
|
+
# Note: BrokenPipeError is a subclass of OSError, so catching OSError handles both
|
|
287
|
+
pass
|
|
288
|
+
|
|
289
|
+
# Initialize metadata for new state if needed
|
|
290
|
+
if target_state not in self.state_metadata:
|
|
291
|
+
self.state_metadata[target_state] = StateMetadata(
|
|
292
|
+
entered_at=self.time_service.now_iso(), metrics=StateMetrics()
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
return True
|
|
296
|
+
|
|
297
|
+
def get_state(self) -> AgentState:
|
|
298
|
+
"""Get current state."""
|
|
299
|
+
return self.current_state
|
|
300
|
+
|
|
301
|
+
def get_state_metadata(self) -> StateMetadata:
|
|
302
|
+
"""Get metadata for current state."""
|
|
303
|
+
return self.state_metadata.get(
|
|
304
|
+
self.current_state, StateMetadata(entered_at=self.time_service.now_iso(), metrics=StateMetrics())
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
def update_state_metadata(self, key: str, value: Any) -> None:
|
|
308
|
+
"""Update metadata for current state."""
|
|
309
|
+
if self.current_state not in self.state_metadata:
|
|
310
|
+
self.state_metadata[self.current_state] = StateMetadata(
|
|
311
|
+
entered_at=self.time_service.now_iso(), metrics=StateMetrics()
|
|
312
|
+
)
|
|
313
|
+
self.state_metadata[self.current_state].add_metric(key, value)
|
|
314
|
+
|
|
315
|
+
def get_state_duration(self) -> float:
|
|
316
|
+
"""Get duration in seconds for current state."""
|
|
317
|
+
metadata = self.get_state_metadata()
|
|
318
|
+
if metadata.entered_at:
|
|
319
|
+
entered_at = datetime.fromisoformat(metadata.entered_at)
|
|
320
|
+
return (self.time_service.now() - entered_at).total_seconds()
|
|
321
|
+
return 0.0
|
|
322
|
+
|
|
323
|
+
def should_auto_transition(self) -> Optional[AgentState]:
|
|
324
|
+
"""
|
|
325
|
+
Check if an automatic state transition should occur.
|
|
326
|
+
Returns the target state if a transition should happen, None otherwise.
|
|
327
|
+
"""
|
|
328
|
+
# NEVER auto-transition from SHUTDOWN state
|
|
329
|
+
if self.current_state == AgentState.SHUTDOWN:
|
|
330
|
+
return None
|
|
331
|
+
|
|
332
|
+
if self.current_state == AgentState.WAKEUP:
|
|
333
|
+
# After successful wakeup, transition to WORK
|
|
334
|
+
metadata = self.get_state_metadata()
|
|
335
|
+
if metadata.metrics.custom_metrics.get("wakeup_complete", False):
|
|
336
|
+
return AgentState.WORK
|
|
337
|
+
|
|
338
|
+
# All other auto-transitions are removed as per the new requirements.
|
|
339
|
+
# For example, the transition from WORK to DREAM based on idle time,
|
|
340
|
+
# and from DREAM to WORK based on duration, are no longer automatic.
|
|
341
|
+
|
|
342
|
+
return None
|
|
343
|
+
|
|
344
|
+
def get_state_history(self) -> List[StateTransitionRecord]:
|
|
345
|
+
"""Get the complete state transition history as typed records."""
|
|
346
|
+
return self.state_history.copy()
|
|
347
|
+
|
|
348
|
+
def get_state_history_summary(self) -> StateHistory:
|
|
349
|
+
"""Get a complete summary of state history and current state."""
|
|
350
|
+
current_metadata = self.state_metadata.get(
|
|
351
|
+
self.current_state, StateMetadata(entered_at=self.time_service.now_iso(), metrics=StateMetrics())
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
return StateHistory(
|
|
355
|
+
transitions=self.state_history.copy(),
|
|
356
|
+
current_state=self.current_state,
|
|
357
|
+
current_state_metadata=current_metadata,
|
|
358
|
+
)
|