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
main.py
ADDED
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Load environment variables from .env if present
|
|
3
|
+
# Load from all standard config paths in priority order
|
|
4
|
+
try:
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from dotenv import load_dotenv
|
|
8
|
+
|
|
9
|
+
# Priority order: ./env (highest), ~/ciris/.env, /etc/ciris/.env (lowest)
|
|
10
|
+
# Note: ~/.ciris/ is for keys/secrets only, NOT config!
|
|
11
|
+
config_paths = [
|
|
12
|
+
Path.cwd() / ".env",
|
|
13
|
+
Path.home() / "ciris" / ".env",
|
|
14
|
+
Path("/etc/ciris/.env"),
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
for config_path in config_paths:
|
|
18
|
+
if config_path.exists():
|
|
19
|
+
load_dotenv(config_path, override=False) # Don't override already-set vars
|
|
20
|
+
|
|
21
|
+
except ImportError:
|
|
22
|
+
pass # dotenv is optional; skip if not installed
|
|
23
|
+
import asyncio
|
|
24
|
+
import json
|
|
25
|
+
import logging
|
|
26
|
+
import os
|
|
27
|
+
import signal
|
|
28
|
+
import sys
|
|
29
|
+
import uuid
|
|
30
|
+
from datetime import datetime, timezone
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from typing import Any, Optional
|
|
33
|
+
|
|
34
|
+
import click
|
|
35
|
+
|
|
36
|
+
from ciris_engine.logic.runtime.ciris_runtime import CIRISRuntime
|
|
37
|
+
from ciris_engine.logic.utils.logging_config import setup_basic_logging
|
|
38
|
+
from ciris_engine.logic.utils.runtime_utils import load_config
|
|
39
|
+
from ciris_engine.schemas.dma.results import ActionSelectionDMAResult
|
|
40
|
+
from ciris_engine.schemas.runtime.enums import HandlerActionType, ThoughtStatus
|
|
41
|
+
from ciris_engine.schemas.runtime.models import Thought
|
|
42
|
+
|
|
43
|
+
logger = logging.getLogger(__name__)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def setup_signal_handlers(runtime: CIRISRuntime) -> None:
|
|
47
|
+
"""Setup signal handlers for graceful shutdown."""
|
|
48
|
+
shutdown_initiated = {"value": False} # Use dict to allow modification in nested function
|
|
49
|
+
|
|
50
|
+
def signal_handler(signum: int, frame: Any) -> None:
|
|
51
|
+
if shutdown_initiated["value"]:
|
|
52
|
+
logger.warning(f"Signal {signum} received again, forcing immediate exit")
|
|
53
|
+
# Don't call sys.exit() in async context - just raise to let Python handle it
|
|
54
|
+
raise KeyboardInterrupt("Forced shutdown")
|
|
55
|
+
|
|
56
|
+
shutdown_initiated["value"] = True
|
|
57
|
+
logger.info(f"Received signal {signum}, requesting graceful shutdown...")
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
runtime.request_shutdown(f"Signal {signum}")
|
|
61
|
+
except Exception as e:
|
|
62
|
+
logger.error(f"Error during shutdown request: {e}")
|
|
63
|
+
# Don't call sys.exit() in async context - raise instead
|
|
64
|
+
raise KeyboardInterrupt("Shutdown error") from e
|
|
65
|
+
|
|
66
|
+
signal.signal(signal.SIGTERM, signal_handler)
|
|
67
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def setup_global_exception_handler() -> None:
|
|
71
|
+
"""Setup global exception handler to catch all uncaught exceptions."""
|
|
72
|
+
|
|
73
|
+
def handle_exception(exc_type: type[BaseException], exc_value: BaseException, exc_traceback: Any) -> None:
|
|
74
|
+
if issubclass(exc_type, KeyboardInterrupt):
|
|
75
|
+
# Let KeyboardInterrupt be handled by signal handlers
|
|
76
|
+
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
logger.error("UNCAUGHT EXCEPTION:", exc_info=(exc_type, exc_value, exc_traceback))
|
|
80
|
+
logger.error("This should never happen - please report this bug!")
|
|
81
|
+
|
|
82
|
+
sys.excepthook = handle_exception
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _create_thought() -> Thought:
|
|
86
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
87
|
+
return Thought(
|
|
88
|
+
thought_id=str(uuid.uuid4()),
|
|
89
|
+
source_task_id=str(uuid.uuid4()),
|
|
90
|
+
thought_type="standard",
|
|
91
|
+
status=ThoughtStatus.PENDING,
|
|
92
|
+
created_at=now,
|
|
93
|
+
updated_at=now,
|
|
94
|
+
content="manual invocation",
|
|
95
|
+
context={},
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
async def _execute_handler(runtime: CIRISRuntime, handler: str, params: Optional[str]) -> None:
|
|
100
|
+
if not runtime.agent_processor:
|
|
101
|
+
raise RuntimeError("Agent processor not initialized")
|
|
102
|
+
handler_type = HandlerActionType[handler.upper()]
|
|
103
|
+
dispatcher = runtime.agent_processor.action_dispatcher
|
|
104
|
+
handler_instance = dispatcher.handlers.get(handler_type)
|
|
105
|
+
if not handler_instance:
|
|
106
|
+
raise ValueError(f"Handler {handler} not registered")
|
|
107
|
+
payload = json.loads(params) if params else {}
|
|
108
|
+
result = ActionSelectionDMAResult(
|
|
109
|
+
selected_action=handler_type,
|
|
110
|
+
action_parameters=payload,
|
|
111
|
+
rationale="manual trigger",
|
|
112
|
+
)
|
|
113
|
+
thought = _create_thought()
|
|
114
|
+
# Create a proper DispatchContext
|
|
115
|
+
from ciris_engine.schemas.runtime.contexts import DispatchContext
|
|
116
|
+
from ciris_engine.schemas.runtime.system_context import ChannelContext
|
|
117
|
+
|
|
118
|
+
dispatch_context = DispatchContext(
|
|
119
|
+
channel_context=ChannelContext(
|
|
120
|
+
channel_id=runtime.startup_channel_id, channel_type="CLI", created_at=datetime.now(timezone.utc)
|
|
121
|
+
),
|
|
122
|
+
author_id="system",
|
|
123
|
+
author_name="System",
|
|
124
|
+
origin_service="main",
|
|
125
|
+
handler_name=handler,
|
|
126
|
+
action_type=handler_type,
|
|
127
|
+
thought_id=thought.thought_id,
|
|
128
|
+
task_id=thought.source_task_id,
|
|
129
|
+
source_task_id=thought.source_task_id,
|
|
130
|
+
event_summary=f"Manual trigger: {handler}",
|
|
131
|
+
event_timestamp=datetime.now(timezone.utc).isoformat(),
|
|
132
|
+
)
|
|
133
|
+
await handler_instance.handle(result, thought, dispatch_context)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
async def _run_runtime(runtime: CIRISRuntime, timeout: Optional[int], num_rounds: Optional[int] = None) -> None:
|
|
137
|
+
"""Run the runtime with optional timeout and graceful shutdown."""
|
|
138
|
+
logger.debug(f"[DEBUG] _run_runtime called with timeout={timeout}, num_rounds={num_rounds}")
|
|
139
|
+
shutdown_called = False
|
|
140
|
+
try:
|
|
141
|
+
if timeout:
|
|
142
|
+
# Create task and handle timeout manually to allow graceful shutdown
|
|
143
|
+
logger.debug(f"[DEBUG] Setting up timeout for {timeout} seconds")
|
|
144
|
+
runtime_task = asyncio.create_task(runtime.run(num_rounds))
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
# Wait for either the task to complete or timeout
|
|
148
|
+
await asyncio.wait_for(asyncio.shield(runtime_task), timeout=timeout)
|
|
149
|
+
except asyncio.TimeoutError:
|
|
150
|
+
logger.info(f"Timeout of {timeout} seconds reached, initiating graceful shutdown...")
|
|
151
|
+
# Request shutdown but don't cancel the task immediately
|
|
152
|
+
runtime.request_shutdown(f"Runtime timeout after {timeout} seconds")
|
|
153
|
+
|
|
154
|
+
# Give the shutdown processor time to run (up to 30 seconds)
|
|
155
|
+
try:
|
|
156
|
+
await asyncio.wait_for(runtime_task, timeout=30.0)
|
|
157
|
+
logger.info("Graceful shutdown completed within timeout")
|
|
158
|
+
except asyncio.TimeoutError:
|
|
159
|
+
logger.warning("Graceful shutdown did not complete within 30 seconds, cancelling...")
|
|
160
|
+
runtime_task.cancel()
|
|
161
|
+
try:
|
|
162
|
+
await runtime_task
|
|
163
|
+
except asyncio.CancelledError:
|
|
164
|
+
# Expected when we cancel the task
|
|
165
|
+
pass # NOSONAR - Intentionally not re-raising after timeout cancellation
|
|
166
|
+
|
|
167
|
+
# Ensure shutdown is called if the task was cancelled
|
|
168
|
+
logger.info("Calling shutdown explicitly after task cancellation")
|
|
169
|
+
await runtime.shutdown()
|
|
170
|
+
|
|
171
|
+
shutdown_called = True
|
|
172
|
+
else:
|
|
173
|
+
# Run without timeout
|
|
174
|
+
logger.debug("[DEBUG] Running without timeout")
|
|
175
|
+
await runtime.run(num_rounds)
|
|
176
|
+
except KeyboardInterrupt:
|
|
177
|
+
logger.info("Received interrupt signal, shutting down gracefully...")
|
|
178
|
+
runtime.request_shutdown("User interrupt")
|
|
179
|
+
# Don't call shutdown here if runtime.run() will handle it
|
|
180
|
+
if not shutdown_called:
|
|
181
|
+
await runtime.shutdown()
|
|
182
|
+
except Exception as e:
|
|
183
|
+
logger.error(f"FATAL ERROR: Unhandled exception in runtime: {e}", exc_info=True)
|
|
184
|
+
try:
|
|
185
|
+
runtime.request_shutdown(f"Fatal error: {e}")
|
|
186
|
+
if not shutdown_called:
|
|
187
|
+
await runtime.shutdown()
|
|
188
|
+
except Exception as shutdown_error:
|
|
189
|
+
logger.error(f"Error during emergency shutdown: {shutdown_error}", exc_info=True)
|
|
190
|
+
raise # Re-raise to ensure non-zero exit code
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@click.command()
|
|
194
|
+
@click.option(
|
|
195
|
+
"--adapter",
|
|
196
|
+
"adapter_types_list",
|
|
197
|
+
multiple=True,
|
|
198
|
+
default=[],
|
|
199
|
+
help="One or more adapters to run. Specify multiple times for multiple adapters (e.g., --adapter cli --adapter api --adapter discord).",
|
|
200
|
+
)
|
|
201
|
+
@click.option("--template", default="default", help="Agent template name (only used for first-time setup)")
|
|
202
|
+
@click.option("--config", "config_file_path", type=click.Path(), help="Path to app config")
|
|
203
|
+
@click.option("--task", multiple=True, help="Task description to add before starting")
|
|
204
|
+
@click.option("--timeout", type=int, help="Maximum runtime duration in seconds")
|
|
205
|
+
@click.option("--handler", help="Direct handler to execute and exit")
|
|
206
|
+
@click.option("--params", help="JSON parameters for handler execution")
|
|
207
|
+
@click.option(
|
|
208
|
+
"--host",
|
|
209
|
+
"api_host",
|
|
210
|
+
default=None,
|
|
211
|
+
help="API host (default: 127.0.0.1 for security, use 0.0.0.0 for all interfaces)",
|
|
212
|
+
)
|
|
213
|
+
@click.option("--port", "api_port", default=None, type=int, help="API port (default: 8080)")
|
|
214
|
+
@click.option("--debug/--no-debug", default=False, help="Enable debug logging")
|
|
215
|
+
@click.option(
|
|
216
|
+
"--no-interactive/--interactive", "cli_interactive", default=True, help="Enable/disable interactive CLI input"
|
|
217
|
+
)
|
|
218
|
+
@click.option(
|
|
219
|
+
"--discord-token", "discord_bot_token", default=os.environ.get("DISCORD_BOT_TOKEN"), help="Discord bot token"
|
|
220
|
+
)
|
|
221
|
+
@click.option("--mock-llm/--no-mock-llm", default=False, help="Use the mock LLM service for offline testing")
|
|
222
|
+
@click.option("--num-rounds", type=int, help="Maximum number of processing rounds (default: infinite)")
|
|
223
|
+
def main(
|
|
224
|
+
adapter_types_list: tuple[str, ...],
|
|
225
|
+
template: str,
|
|
226
|
+
config_file_path: Optional[str],
|
|
227
|
+
task: tuple[str],
|
|
228
|
+
timeout: Optional[int],
|
|
229
|
+
handler: Optional[str],
|
|
230
|
+
params: Optional[str],
|
|
231
|
+
api_host: Optional[str],
|
|
232
|
+
api_port: Optional[int],
|
|
233
|
+
debug: bool,
|
|
234
|
+
cli_interactive: bool,
|
|
235
|
+
discord_bot_token: Optional[str],
|
|
236
|
+
mock_llm: bool,
|
|
237
|
+
num_rounds: Optional[int],
|
|
238
|
+
) -> None:
|
|
239
|
+
"""Unified CIRIS agent entry point."""
|
|
240
|
+
# Setup basic console logging first (without file logging)
|
|
241
|
+
# File logging will be set up later once TimeService is available
|
|
242
|
+
setup_basic_logging(
|
|
243
|
+
level=logging.DEBUG if debug else logging.INFO,
|
|
244
|
+
log_to_file=False,
|
|
245
|
+
console_output=True,
|
|
246
|
+
enable_incident_capture=False, # Will be enabled later with TimeService
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
async def _async_main() -> None:
|
|
250
|
+
nonlocal mock_llm, handler, params, task, num_rounds
|
|
251
|
+
from ciris_engine.logic.config.env_utils import get_env_var
|
|
252
|
+
|
|
253
|
+
# Check for CIRIS_MOCK_LLM environment variable
|
|
254
|
+
if not mock_llm and get_env_var("CIRIS_MOCK_LLM"):
|
|
255
|
+
mock_llm_env = get_env_var("CIRIS_MOCK_LLM", "")
|
|
256
|
+
if mock_llm_env:
|
|
257
|
+
mock_llm_env = mock_llm_env.lower()
|
|
258
|
+
if mock_llm_env in ("true", "1", "yes", "on"):
|
|
259
|
+
logger.info("CIRIS_MOCK_LLM environment variable detected, enabling mock LLM")
|
|
260
|
+
mock_llm = True
|
|
261
|
+
|
|
262
|
+
# Handle first-run setup if needed
|
|
263
|
+
from ciris_engine.logic.setup.first_run import check_macos_python, is_first_run, is_interactive_environment
|
|
264
|
+
from ciris_engine.logic.setup.wizard import run_setup_wizard
|
|
265
|
+
|
|
266
|
+
# Check macOS Python installation
|
|
267
|
+
python_valid, python_message = check_macos_python()
|
|
268
|
+
if not python_valid:
|
|
269
|
+
click.echo("=" * 70, err=True)
|
|
270
|
+
click.echo("❌ PYTHON INSTALLATION ISSUE", err=True)
|
|
271
|
+
click.echo("=" * 70, err=True)
|
|
272
|
+
click.echo(python_message, err=True)
|
|
273
|
+
click.echo("=" * 70, err=True)
|
|
274
|
+
sys.exit(1)
|
|
275
|
+
|
|
276
|
+
first_run = is_first_run()
|
|
277
|
+
# When running in import/CI mode, bypass interactive first-run gating so
|
|
278
|
+
# CLI smoke tests can execute without configuration prompts or exits.
|
|
279
|
+
if os.environ.get("CIRIS_IMPORT_MODE") == "true":
|
|
280
|
+
first_run = False
|
|
281
|
+
|
|
282
|
+
# Handle adapter selection FIRST (before first-run wizard logic)
|
|
283
|
+
# This allows us to determine which adapter will handle first-run setup
|
|
284
|
+
final_adapter_types_list = list(adapter_types_list)
|
|
285
|
+
if not final_adapter_types_list:
|
|
286
|
+
# Check CIRIS_ADAPTER environment variable
|
|
287
|
+
env_adapter = get_env_var("CIRIS_ADAPTER")
|
|
288
|
+
if env_adapter:
|
|
289
|
+
# Support comma-separated adapters (e.g., "api,discord")
|
|
290
|
+
final_adapter_types_list = [a.strip() for a in env_adapter.split(",")]
|
|
291
|
+
else:
|
|
292
|
+
# Default to API adapter (GUI setup wizard)
|
|
293
|
+
final_adapter_types_list = ["api"]
|
|
294
|
+
|
|
295
|
+
# Check if we're running in CLI mode explicitly
|
|
296
|
+
is_cli_mode = any(adapter.startswith("cli") for adapter in final_adapter_types_list)
|
|
297
|
+
|
|
298
|
+
# First-run handling: only run CLI wizard if explicitly in CLI mode
|
|
299
|
+
if first_run and not adapter_types_list:
|
|
300
|
+
# First run detected and no adapter explicitly specified via CLI
|
|
301
|
+
|
|
302
|
+
if is_cli_mode and not is_interactive_environment():
|
|
303
|
+
# CLI mode but non-interactive environment (Docker, systemd, CI, etc.)
|
|
304
|
+
# No adapter in CLI or environment - EXIT with instructions
|
|
305
|
+
click.echo("=" * 70, err=True)
|
|
306
|
+
click.echo("❌ CONFIGURATION REQUIRED", err=True)
|
|
307
|
+
click.echo("=" * 70, err=True)
|
|
308
|
+
click.echo("CIRIS is not configured. Please set environment variables:", err=True)
|
|
309
|
+
click.echo("", err=True)
|
|
310
|
+
click.echo("Required:", err=True)
|
|
311
|
+
click.echo(" OPENAI_API_KEY=your_api_key", err=True)
|
|
312
|
+
click.echo(" CIRIS_ADAPTER=api", err=True)
|
|
313
|
+
click.echo("", err=True)
|
|
314
|
+
click.echo("For local LLM (Ollama, LM Studio, etc.):", err=True)
|
|
315
|
+
click.echo(" OPENAI_API_KEY=local", err=True)
|
|
316
|
+
click.echo(" OPENAI_API_BASE=http://localhost:11434", err=True)
|
|
317
|
+
click.echo(" OPENAI_MODEL=llama3", err=True)
|
|
318
|
+
click.echo("", err=True)
|
|
319
|
+
click.echo("Or mount a .env file at:", err=True)
|
|
320
|
+
click.echo(" ~/.ciris/.env", err=True)
|
|
321
|
+
click.echo(" ./.env", err=True)
|
|
322
|
+
click.echo("=" * 70, err=True)
|
|
323
|
+
sys.exit(1)
|
|
324
|
+
elif is_cli_mode and is_interactive_environment():
|
|
325
|
+
# CLI mode in interactive environment - run CLI setup wizard
|
|
326
|
+
try:
|
|
327
|
+
click.echo()
|
|
328
|
+
click.echo("=" * 70)
|
|
329
|
+
click.echo("First run detected - running CLI setup wizard...")
|
|
330
|
+
click.echo("=" * 70)
|
|
331
|
+
config_path = run_setup_wizard()
|
|
332
|
+
# Reload environment after setup
|
|
333
|
+
try:
|
|
334
|
+
from dotenv import load_dotenv
|
|
335
|
+
|
|
336
|
+
load_dotenv(config_path)
|
|
337
|
+
click.echo(f"✅ Configuration loaded from: {config_path}")
|
|
338
|
+
except ImportError:
|
|
339
|
+
pass # dotenv is optional
|
|
340
|
+
except KeyboardInterrupt:
|
|
341
|
+
click.echo("\nSetup cancelled by user")
|
|
342
|
+
sys.exit(1)
|
|
343
|
+
except Exception as e:
|
|
344
|
+
click.echo(f"\n❌ Setup failed: {e}", err=True)
|
|
345
|
+
click.echo("You can configure manually by creating a .env file", err=True)
|
|
346
|
+
sys.exit(1)
|
|
347
|
+
# else: API mode (default) - let API adapter handle GUI setup wizard
|
|
348
|
+
|
|
349
|
+
# Check for API key - NEVER default to mock LLM in production
|
|
350
|
+
# Skip this check during first-run (API adapter will handle setup)
|
|
351
|
+
api_key = get_env_var("OPENAI_API_KEY")
|
|
352
|
+
if not mock_llm and not api_key and not first_run:
|
|
353
|
+
# No API key and not explicitly using mock LLM
|
|
354
|
+
click.echo("=" * 70, err=True)
|
|
355
|
+
click.echo("❌ LLM API KEY REQUIRED", err=True)
|
|
356
|
+
click.echo("=" * 70, err=True)
|
|
357
|
+
click.echo("No OPENAI_API_KEY found in environment.", err=True)
|
|
358
|
+
click.echo("", err=True)
|
|
359
|
+
click.echo("Options:", err=True)
|
|
360
|
+
click.echo(" 1. Set OPENAI_API_KEY environment variable", err=True)
|
|
361
|
+
click.echo(" 2. Add to .env file", err=True)
|
|
362
|
+
click.echo(" 3. Use --mock-llm flag for testing only", err=True)
|
|
363
|
+
click.echo("", err=True)
|
|
364
|
+
click.echo("For local LLM:", err=True)
|
|
365
|
+
click.echo(" export OPENAI_API_KEY=local", err=True)
|
|
366
|
+
click.echo(" export OPENAI_API_BASE=http://localhost:11434", err=True)
|
|
367
|
+
click.echo(" export OPENAI_MODEL=llama3", err=True)
|
|
368
|
+
click.echo("=" * 70, err=True)
|
|
369
|
+
sys.exit(1)
|
|
370
|
+
|
|
371
|
+
# Support multiple instances of same adapter type like "discord:instance1" or "api:port8081"
|
|
372
|
+
selected_adapter_types = list(final_adapter_types_list)
|
|
373
|
+
|
|
374
|
+
# Validate Discord adapter types have tokens available
|
|
375
|
+
validated_adapter_types = []
|
|
376
|
+
for adapter_type in selected_adapter_types:
|
|
377
|
+
if adapter_type.startswith("discord"):
|
|
378
|
+
base_adapter_type, instance_id = (adapter_type.split(":", 1) + [None])[:2]
|
|
379
|
+
# Check for instance-specific token or fallback to general token
|
|
380
|
+
token_vars = []
|
|
381
|
+
if instance_id:
|
|
382
|
+
token_vars.extend(
|
|
383
|
+
[f"DISCORD_{instance_id.upper()}_BOT_TOKEN", f"DISCORD_BOT_TOKEN_{instance_id.upper()}"]
|
|
384
|
+
)
|
|
385
|
+
token_vars.append("DISCORD_BOT_TOKEN")
|
|
386
|
+
|
|
387
|
+
has_token = discord_bot_token or any(get_env_var(var) for var in token_vars)
|
|
388
|
+
if not has_token:
|
|
389
|
+
click.echo(
|
|
390
|
+
f"ERROR: No Discord bot token found for {adapter_type}. Discord adapter cannot start without a bot token.",
|
|
391
|
+
err=True,
|
|
392
|
+
)
|
|
393
|
+
click.echo(
|
|
394
|
+
"Please set DISCORD_BOT_TOKEN environment variable or use --discord-bot-token flag.", err=True
|
|
395
|
+
)
|
|
396
|
+
# Still add Discord to attempt loading - it will fail properly
|
|
397
|
+
validated_adapter_types.append(adapter_type)
|
|
398
|
+
else:
|
|
399
|
+
validated_adapter_types.append(adapter_type)
|
|
400
|
+
else:
|
|
401
|
+
validated_adapter_types.append(adapter_type)
|
|
402
|
+
|
|
403
|
+
selected_adapter_types = validated_adapter_types
|
|
404
|
+
|
|
405
|
+
# Check for modular services matching adapter names
|
|
406
|
+
from ciris_engine.logic.runtime.adapter_loader import AdapterLoader
|
|
407
|
+
|
|
408
|
+
adapter_loader = AdapterLoader()
|
|
409
|
+
discovered_services = adapter_loader.discover_services()
|
|
410
|
+
adapter_map = {svc.module.name.lower().replace("_adapter", ""): svc for svc in discovered_services}
|
|
411
|
+
|
|
412
|
+
# Separate built-in adapters from potential modular services
|
|
413
|
+
builtin_adapters = ["cli", "api", "discord"]
|
|
414
|
+
final_adapter_types = []
|
|
415
|
+
adapters_to_load = []
|
|
416
|
+
|
|
417
|
+
for adapter_type in selected_adapter_types:
|
|
418
|
+
base_type = adapter_type.split(":")[0] # Handle instance IDs
|
|
419
|
+
|
|
420
|
+
# Check if it's a built-in adapter
|
|
421
|
+
if any(base_type.startswith(builtin) for builtin in builtin_adapters):
|
|
422
|
+
final_adapter_types.append(adapter_type)
|
|
423
|
+
# Check if it matches a modular service
|
|
424
|
+
elif base_type.lower() in adapter_map:
|
|
425
|
+
manifest = adapter_map[base_type.lower()]
|
|
426
|
+
logger.info(f"Found modular service '{manifest.module.name}' for adapter type '{adapter_type}'")
|
|
427
|
+
|
|
428
|
+
# Validate required configuration is present
|
|
429
|
+
if manifest.configuration:
|
|
430
|
+
missing_required = []
|
|
431
|
+
for config_key, config_spec in manifest.configuration.items():
|
|
432
|
+
env_var = config_spec.env
|
|
433
|
+
if env_var and not get_env_var(env_var):
|
|
434
|
+
# Check if it has a default value
|
|
435
|
+
if config_spec.default is None:
|
|
436
|
+
missing_required.append(f"{env_var}")
|
|
437
|
+
|
|
438
|
+
if missing_required:
|
|
439
|
+
click.echo(
|
|
440
|
+
f"ERROR: Modular service '{manifest.module.name}' requires configuration:",
|
|
441
|
+
err=True,
|
|
442
|
+
)
|
|
443
|
+
for var in missing_required:
|
|
444
|
+
click.echo(f" - {var}", err=True)
|
|
445
|
+
click.echo(
|
|
446
|
+
f"Skipping modular service '{manifest.module.name}' due to missing configuration.",
|
|
447
|
+
err=True,
|
|
448
|
+
)
|
|
449
|
+
continue
|
|
450
|
+
|
|
451
|
+
# Add to modular services to load
|
|
452
|
+
adapters_to_load.append((adapter_type, manifest))
|
|
453
|
+
logger.info(f"Modular service '{manifest.module.name}' validated and will be loaded")
|
|
454
|
+
else:
|
|
455
|
+
# Unknown adapter type
|
|
456
|
+
click.echo(
|
|
457
|
+
f"WARNING: Unknown adapter type '{adapter_type}'. Not a built-in adapter or modular service.",
|
|
458
|
+
err=True,
|
|
459
|
+
)
|
|
460
|
+
final_adapter_types.append(adapter_type) # Try to load anyway
|
|
461
|
+
|
|
462
|
+
selected_adapter_types = final_adapter_types
|
|
463
|
+
|
|
464
|
+
# Load config
|
|
465
|
+
try:
|
|
466
|
+
# Validate config file exists if provided
|
|
467
|
+
if config_file_path and not Path(config_file_path).exists():
|
|
468
|
+
logger.error(f"Configuration file not found: {config_file_path}")
|
|
469
|
+
raise SystemExit(1)
|
|
470
|
+
|
|
471
|
+
# Create CLI overrides including the template parameter
|
|
472
|
+
cli_overrides: dict[str, Any] = {}
|
|
473
|
+
if template and template != "default":
|
|
474
|
+
cli_overrides["default_template"] = template
|
|
475
|
+
|
|
476
|
+
app_config = await load_config(config_file_path, cli_overrides)
|
|
477
|
+
except SystemExit:
|
|
478
|
+
raise # Re-raise SystemExit to exit cleanly
|
|
479
|
+
except Exception as e:
|
|
480
|
+
error_msg = f"Failed to load config: {e}"
|
|
481
|
+
logger.error(error_msg)
|
|
482
|
+
# Write directly to stderr to ensure it's captured
|
|
483
|
+
print(error_msg, file=sys.stderr)
|
|
484
|
+
# Ensure outputs are flushed before exit
|
|
485
|
+
sys.stdout.flush()
|
|
486
|
+
sys.stderr.flush()
|
|
487
|
+
# Also flush logging handlers
|
|
488
|
+
for log_handler in logger.handlers:
|
|
489
|
+
log_handler.flush()
|
|
490
|
+
# Give a tiny bit of time for output to be written
|
|
491
|
+
import time
|
|
492
|
+
|
|
493
|
+
time.sleep(0.1) # NOSONAR - Sync sleep is appropriate here before program exit
|
|
494
|
+
# Force immediate exit to avoid hanging in subprocess
|
|
495
|
+
# Use os._exit only when running under coverage
|
|
496
|
+
if sys.gettrace() is not None or "coverage" in sys.modules:
|
|
497
|
+
logger.debug("EXITING NOW VIA os._exit(1) AT _handle_precommit_wrapper coverage")
|
|
498
|
+
os._exit(1)
|
|
499
|
+
else:
|
|
500
|
+
logger.debug("EXITING NOW VIA sys.exit(1) AT _handle_precommit_wrapper")
|
|
501
|
+
sys.exit(1)
|
|
502
|
+
|
|
503
|
+
# Handle mock LLM as a module to load
|
|
504
|
+
modules_to_load = []
|
|
505
|
+
if mock_llm:
|
|
506
|
+
modules_to_load.append("mock_llm")
|
|
507
|
+
logger.info("Mock LLM module will be loaded")
|
|
508
|
+
|
|
509
|
+
# Add modular services as modules to load
|
|
510
|
+
for adapter_type, manifest in adapters_to_load:
|
|
511
|
+
modules_to_load.append(f"modular:{manifest.module.name}")
|
|
512
|
+
logger.info(f"Modular service '{manifest.module.name}' added to modules to load")
|
|
513
|
+
|
|
514
|
+
# Import AdapterConfig for proper type conversion
|
|
515
|
+
from ciris_engine.schemas.runtime.adapter_management import AdapterConfig
|
|
516
|
+
|
|
517
|
+
# Create adapter configurations for each adapter type and determine startup channel
|
|
518
|
+
adapter_configs = {}
|
|
519
|
+
startup_channel_id = getattr(app_config, "startup_channel_id", None)
|
|
520
|
+
# No discord_channel_id in EssentialConfig
|
|
521
|
+
|
|
522
|
+
for adapter_type in selected_adapter_types:
|
|
523
|
+
if adapter_type.startswith("api"):
|
|
524
|
+
base_adapter_type, instance_id = (adapter_type.split(":", 1) + [None])[:2]
|
|
525
|
+
from ciris_engine.logic.adapters.api.config import APIAdapterConfig
|
|
526
|
+
|
|
527
|
+
api_config = APIAdapterConfig()
|
|
528
|
+
# Load environment variables first
|
|
529
|
+
api_config.load_env_vars()
|
|
530
|
+
# Then override with command line args if provided
|
|
531
|
+
if api_host:
|
|
532
|
+
api_config.host = api_host
|
|
533
|
+
if api_port:
|
|
534
|
+
api_config.port = api_port
|
|
535
|
+
|
|
536
|
+
# Convert APIAdapterConfig to generic AdapterConfig
|
|
537
|
+
adapter_configs[adapter_type] = AdapterConfig(
|
|
538
|
+
adapter_type="api", enabled=True, settings=api_config.model_dump() # Convert all fields to dict
|
|
539
|
+
)
|
|
540
|
+
api_channel_id = api_config.get_home_channel_id(api_config.host, api_config.port)
|
|
541
|
+
if not startup_channel_id:
|
|
542
|
+
startup_channel_id = api_channel_id
|
|
543
|
+
|
|
544
|
+
elif adapter_type.startswith("discord"):
|
|
545
|
+
base_adapter_type, instance_id = (adapter_type.split(":", 1) + [None])[:2]
|
|
546
|
+
from ciris_engine.logic.adapters.discord.config import DiscordAdapterConfig
|
|
547
|
+
|
|
548
|
+
discord_config = DiscordAdapterConfig()
|
|
549
|
+
if discord_bot_token:
|
|
550
|
+
discord_config.bot_token = discord_bot_token
|
|
551
|
+
|
|
552
|
+
# Load environment variables into the config
|
|
553
|
+
discord_config.load_env_vars()
|
|
554
|
+
|
|
555
|
+
# Convert DiscordAdapterConfig to generic AdapterConfig
|
|
556
|
+
adapter_configs[adapter_type] = AdapterConfig(
|
|
557
|
+
adapter_type="discord",
|
|
558
|
+
enabled=True,
|
|
559
|
+
settings=discord_config.model_dump(), # Convert all fields to dict
|
|
560
|
+
)
|
|
561
|
+
discord_channel_id = discord_config.get_home_channel_id()
|
|
562
|
+
if discord_channel_id and not startup_channel_id:
|
|
563
|
+
# For Discord, use formatted channel ID with discord_ prefix
|
|
564
|
+
# Guild ID will be added by the adapter when it connects
|
|
565
|
+
startup_channel_id = discord_config.get_formatted_startup_channel_id()
|
|
566
|
+
|
|
567
|
+
elif adapter_type.startswith("cli"):
|
|
568
|
+
base_adapter_type, instance_id = (adapter_type.split(":", 1) + [None])[:2]
|
|
569
|
+
from ciris_engine.logic.adapters.cli.config import CLIAdapterConfig
|
|
570
|
+
|
|
571
|
+
cli_config = CLIAdapterConfig()
|
|
572
|
+
|
|
573
|
+
# Environment variables are loaded by global configuration bootstrap
|
|
574
|
+
|
|
575
|
+
# CLI arguments take precedence over environment variables
|
|
576
|
+
if not cli_interactive:
|
|
577
|
+
cli_config.interactive = False
|
|
578
|
+
|
|
579
|
+
# Convert CLIAdapterConfig to generic AdapterConfig
|
|
580
|
+
adapter_configs[adapter_type] = AdapterConfig(
|
|
581
|
+
adapter_type="cli", enabled=True, settings=cli_config.model_dump() # Convert all fields to dict
|
|
582
|
+
)
|
|
583
|
+
cli_channel_id = cli_config.get_home_channel_id()
|
|
584
|
+
if not startup_channel_id:
|
|
585
|
+
startup_channel_id = cli_channel_id
|
|
586
|
+
|
|
587
|
+
# Setup global exception handling
|
|
588
|
+
setup_global_exception_handler()
|
|
589
|
+
|
|
590
|
+
# Template parameter is now passed via cli_overrides to the essential config
|
|
591
|
+
|
|
592
|
+
# Create runtime using new CIRISRuntime directly with adapter configs
|
|
593
|
+
runtime = CIRISRuntime(
|
|
594
|
+
adapter_types=selected_adapter_types,
|
|
595
|
+
essential_config=app_config, # app_config is actually EssentialConfig
|
|
596
|
+
startup_channel_id=startup_channel_id,
|
|
597
|
+
adapter_configs=adapter_configs,
|
|
598
|
+
interactive=cli_interactive,
|
|
599
|
+
host=api_host,
|
|
600
|
+
port=api_port,
|
|
601
|
+
discord_bot_token=discord_bot_token,
|
|
602
|
+
modules=modules_to_load, # Pass modules to load
|
|
603
|
+
)
|
|
604
|
+
await runtime.initialize()
|
|
605
|
+
|
|
606
|
+
# Setup signal handlers for graceful shutdown
|
|
607
|
+
setup_signal_handlers(runtime)
|
|
608
|
+
|
|
609
|
+
# Store preload tasks to be loaded after WORK state transition
|
|
610
|
+
preload_tasks = list(task) if task else []
|
|
611
|
+
runtime.set_preload_tasks(preload_tasks)
|
|
612
|
+
|
|
613
|
+
if handler:
|
|
614
|
+
await _execute_handler(runtime, handler, params)
|
|
615
|
+
await runtime.shutdown()
|
|
616
|
+
return
|
|
617
|
+
|
|
618
|
+
# Use CLI num_rounds if provided, otherwise fall back to config
|
|
619
|
+
effective_num_rounds = num_rounds
|
|
620
|
+
# Use default num_rounds if not specified
|
|
621
|
+
if effective_num_rounds is None:
|
|
622
|
+
from ciris_engine.logic.utils.constants import DEFAULT_NUM_ROUNDS
|
|
623
|
+
|
|
624
|
+
effective_num_rounds = DEFAULT_NUM_ROUNDS
|
|
625
|
+
|
|
626
|
+
# For CLI adapter, create a monitor task that forces exit when shutdown completes
|
|
627
|
+
monitor_task = None
|
|
628
|
+
if "cli" in selected_adapter_types:
|
|
629
|
+
# Create an event for signaling shutdown completion
|
|
630
|
+
shutdown_event = asyncio.Event()
|
|
631
|
+
# Store the event on the runtime so shutdown() can set it
|
|
632
|
+
runtime._shutdown_event = shutdown_event
|
|
633
|
+
|
|
634
|
+
async def monitor_shutdown() -> None:
|
|
635
|
+
"""Monitor for shutdown completion and force exit for CLI mode."""
|
|
636
|
+
# Wait for the shutdown event to be set by the shutdown() method
|
|
637
|
+
await shutdown_event.wait()
|
|
638
|
+
|
|
639
|
+
# Shutdown is truly complete, give a moment for final logs
|
|
640
|
+
logger.info("CLI runtime shutdown complete, preparing clean exit")
|
|
641
|
+
await asyncio.sleep(0.2) # Brief pause for final log entries
|
|
642
|
+
|
|
643
|
+
# Flush all output in parallel
|
|
644
|
+
async def flush_handler(handler: Any) -> None:
|
|
645
|
+
"""Flush a single handler."""
|
|
646
|
+
try:
|
|
647
|
+
await asyncio.to_thread(handler.flush)
|
|
648
|
+
except Exception:
|
|
649
|
+
pass # Ignore flush errors during shutdown
|
|
650
|
+
|
|
651
|
+
# Create flush tasks for all operations
|
|
652
|
+
flush_tasks = [
|
|
653
|
+
asyncio.create_task(asyncio.to_thread(sys.stdout.flush)),
|
|
654
|
+
asyncio.create_task(asyncio.to_thread(sys.stderr.flush)),
|
|
655
|
+
]
|
|
656
|
+
|
|
657
|
+
# Add tasks for each log handler
|
|
658
|
+
for log_handler in logging.getLogger().handlers:
|
|
659
|
+
flush_tasks.append(asyncio.create_task(flush_handler(log_handler)))
|
|
660
|
+
|
|
661
|
+
# Wait for all flush operations to complete
|
|
662
|
+
await asyncio.gather(*flush_tasks, return_exceptions=True)
|
|
663
|
+
|
|
664
|
+
# Force exit to handle the blocking input thread
|
|
665
|
+
logger.info("Forcing exit to handle blocking CLI input thread")
|
|
666
|
+
# COMMENTED OUT: This was causing immediate exit before graceful shutdown could complete
|
|
667
|
+
# import os
|
|
668
|
+
# logger.info("DEBUG: EXITING NOW VIA os._exit(0) AT monitor_shutdown for CLI adapter")
|
|
669
|
+
# os._exit(0)
|
|
670
|
+
|
|
671
|
+
monitor_task = asyncio.create_task(monitor_shutdown())
|
|
672
|
+
|
|
673
|
+
try:
|
|
674
|
+
await _run_runtime(runtime, timeout, effective_num_rounds)
|
|
675
|
+
finally:
|
|
676
|
+
# For CLI adapter, wait for monitor task to force exit
|
|
677
|
+
if monitor_task and not monitor_task.done():
|
|
678
|
+
logger.debug("Waiting for CLI monitor task to detect shutdown completion...")
|
|
679
|
+
try:
|
|
680
|
+
# Give the monitor task time to detect shutdown and force exit
|
|
681
|
+
await asyncio.wait_for(monitor_task, timeout=5.0)
|
|
682
|
+
except asyncio.TimeoutError:
|
|
683
|
+
logger.warning("Monitor task did not complete within 5 seconds")
|
|
684
|
+
monitor_task.cancel()
|
|
685
|
+
except Exception as e:
|
|
686
|
+
logger.error(f"Monitor task error: {e}")
|
|
687
|
+
|
|
688
|
+
# If we get here and CLI adapter is used, force exit anyway
|
|
689
|
+
if "cli" in selected_adapter_types:
|
|
690
|
+
logger.info("CLI runtime completed, forcing exit")
|
|
691
|
+
await asyncio.sleep(0.5) # Give time for final logs to flush
|
|
692
|
+
|
|
693
|
+
# Flush all output in parallel
|
|
694
|
+
async def flush_handler(handler: Any) -> None:
|
|
695
|
+
"""Flush a single handler."""
|
|
696
|
+
try:
|
|
697
|
+
await asyncio.to_thread(handler.flush)
|
|
698
|
+
except Exception:
|
|
699
|
+
pass # Ignore flush errors during shutdown
|
|
700
|
+
|
|
701
|
+
# Create flush tasks for all operations
|
|
702
|
+
flush_tasks = [
|
|
703
|
+
asyncio.create_task(asyncio.to_thread(sys.stdout.flush)),
|
|
704
|
+
asyncio.create_task(asyncio.to_thread(sys.stderr.flush)),
|
|
705
|
+
]
|
|
706
|
+
|
|
707
|
+
# Add tasks for each log handler
|
|
708
|
+
for log_handler in logging.getLogger().handlers:
|
|
709
|
+
flush_tasks.append(asyncio.create_task(flush_handler(log_handler)))
|
|
710
|
+
|
|
711
|
+
# Wait for all flush operations to complete
|
|
712
|
+
await asyncio.gather(*flush_tasks, return_exceptions=True)
|
|
713
|
+
|
|
714
|
+
logger.debug("EXITING NOW VIA os._exit(0) AT CLI runtime completed")
|
|
715
|
+
os._exit(0)
|
|
716
|
+
|
|
717
|
+
try:
|
|
718
|
+
asyncio.run(_async_main())
|
|
719
|
+
except KeyboardInterrupt:
|
|
720
|
+
logger.info("Interrupted by user, exiting...")
|
|
721
|
+
logger.debug("EXITING NOW VIA sys.exit(0) AT KeyboardInterrupt in main")
|
|
722
|
+
sys.exit(0)
|
|
723
|
+
except SystemExit:
|
|
724
|
+
raise # Re-raise SystemExit to exit with the correct code
|
|
725
|
+
except Exception as e:
|
|
726
|
+
logger.error(f"Fatal error in main: {e}", exc_info=True)
|
|
727
|
+
logger.debug("EXITING NOW VIA sys.exit(1) AT Fatal error in main")
|
|
728
|
+
sys.exit(1)
|
|
729
|
+
|
|
730
|
+
# Ensure clean exit after successful run
|
|
731
|
+
# Force flush all outputs
|
|
732
|
+
sys.stdout.flush()
|
|
733
|
+
sys.stderr.flush()
|
|
734
|
+
|
|
735
|
+
# asyncio.run() already closes the event loop, so we don't need to do it again
|
|
736
|
+
# Just exit cleanly
|
|
737
|
+
logger.info("CIRIS agent exiting cleanly")
|
|
738
|
+
|
|
739
|
+
# For API mode subprocess tests, ensure immediate exit
|
|
740
|
+
if "--adapter" in sys.argv and "api" in sys.argv and "--timeout" in sys.argv:
|
|
741
|
+
logger.debug("EXITING NOW VIA os._exit(0) AT API mode subprocess tests")
|
|
742
|
+
os._exit(0)
|
|
743
|
+
|
|
744
|
+
# For CLI mode, force exit to handle blocking input thread
|
|
745
|
+
# This is necessary because asyncio.to_thread(input) creates a daemon thread
|
|
746
|
+
# that prevents normal exit even after shutdown completes
|
|
747
|
+
if "--adapter" in sys.argv and "cli" in sys.argv:
|
|
748
|
+
logger.info("CLI mode completed, forcing exit to handle blocking input thread")
|
|
749
|
+
# Ensure the log message is flushed
|
|
750
|
+
sys.stdout.flush()
|
|
751
|
+
sys.stderr.flush()
|
|
752
|
+
for log_handler in logging.getLogger().handlers:
|
|
753
|
+
log_handler.flush()
|
|
754
|
+
import time
|
|
755
|
+
|
|
756
|
+
time.sleep(0.1) # Brief pause to ensure logs are written
|
|
757
|
+
|
|
758
|
+
logger.debug("EXITING NOW VIA os._exit(0) AT CLI mode force exit")
|
|
759
|
+
os._exit(0)
|
|
760
|
+
|
|
761
|
+
logger.debug("EXITING NOW VIA sys.exit(0) AT end of main")
|
|
762
|
+
sys.exit(0)
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
if __name__ == "__main__":
|
|
766
|
+
main()
|