ciris-agent 1.7.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ciris_adapters/README.md +113 -0
- ciris_adapters/__init__.py +30 -0
- ciris_adapters/ciris_covenant_metrics/README.md +144 -0
- ciris_adapters/ciris_covenant_metrics/__init__.py +36 -0
- ciris_adapters/ciris_covenant_metrics/adapter.py +249 -0
- ciris_adapters/ciris_covenant_metrics/manifest.json +152 -0
- ciris_adapters/ciris_covenant_metrics/services.py +403 -0
- ciris_adapters/ciris_hosted_tools/__init__.py +24 -0
- ciris_adapters/ciris_hosted_tools/adapter.py +169 -0
- ciris_adapters/ciris_hosted_tools/manifest.json +94 -0
- ciris_adapters/ciris_hosted_tools/services.py +744 -0
- ciris_adapters/external_data_sql/README.md +559 -0
- ciris_adapters/external_data_sql/__init__.py +43 -0
- ciris_adapters/external_data_sql/adapter.py +144 -0
- ciris_adapters/external_data_sql/configurable.py +315 -0
- ciris_adapters/external_data_sql/dialects/__init__.py +37 -0
- ciris_adapters/external_data_sql/dialects/base.py +133 -0
- ciris_adapters/external_data_sql/dialects/mysql.py +63 -0
- ciris_adapters/external_data_sql/dialects/postgresql.py +59 -0
- ciris_adapters/external_data_sql/dialects/sqlite.py +62 -0
- ciris_adapters/external_data_sql/example_config.json +88 -0
- ciris_adapters/external_data_sql/example_privacy_schema.yaml +127 -0
- ciris_adapters/external_data_sql/manifest.json +195 -0
- ciris_adapters/external_data_sql/privacy_schema_loader.py +189 -0
- ciris_adapters/external_data_sql/protocol.py +101 -0
- ciris_adapters/external_data_sql/schemas.py +146 -0
- ciris_adapters/external_data_sql/service.py +1547 -0
- ciris_adapters/external_data_sql/service_old.py +492 -0
- ciris_adapters/home_assistant/__init__.py +63 -0
- ciris_adapters/home_assistant/adapter.py +201 -0
- ciris_adapters/home_assistant/communication_service.py +347 -0
- ciris_adapters/home_assistant/configurable.py +667 -0
- ciris_adapters/home_assistant/manifest.json +203 -0
- ciris_adapters/home_assistant/schemas.py +129 -0
- ciris_adapters/home_assistant/service.py +751 -0
- ciris_adapters/home_assistant/tool_service.py +441 -0
- ciris_adapters/mcp_client/__init__.py +82 -0
- ciris_adapters/mcp_client/adapter.py +847 -0
- ciris_adapters/mcp_client/config.py +280 -0
- ciris_adapters/mcp_client/configurable.py +422 -0
- ciris_adapters/mcp_client/manifest.json +185 -0
- ciris_adapters/mcp_client/mcp_communication_service.py +393 -0
- ciris_adapters/mcp_client/mcp_tool_service.py +463 -0
- ciris_adapters/mcp_client/mcp_wise_service.py +394 -0
- ciris_adapters/mcp_client/schemas.py +149 -0
- ciris_adapters/mcp_client/security.py +592 -0
- ciris_adapters/mcp_common/__init__.py +44 -0
- ciris_adapters/mcp_common/manifest.json +25 -0
- ciris_adapters/mcp_common/protocol.py +315 -0
- ciris_adapters/mcp_common/schemas.py +225 -0
- ciris_adapters/mcp_server/__init__.py +47 -0
- ciris_adapters/mcp_server/adapter.py +581 -0
- ciris_adapters/mcp_server/config.py +260 -0
- ciris_adapters/mcp_server/configurable.py +393 -0
- ciris_adapters/mcp_server/handlers.py +663 -0
- ciris_adapters/mcp_server/manifest.json +211 -0
- ciris_adapters/mcp_server/security.py +500 -0
- ciris_adapters/mock_llm/README.md +117 -0
- ciris_adapters/mock_llm/__init__.py +21 -0
- ciris_adapters/mock_llm/adapter.py +131 -0
- ciris_adapters/mock_llm/configurable.py +237 -0
- ciris_adapters/mock_llm/manifest.json +106 -0
- ciris_adapters/mock_llm/protocol.py +37 -0
- ciris_adapters/mock_llm/responses.py +520 -0
- ciris_adapters/mock_llm/responses_action_selection.py +1041 -0
- ciris_adapters/mock_llm/responses_epistemic.py +17 -0
- ciris_adapters/mock_llm/responses_feedback.py +27 -0
- ciris_adapters/mock_llm/schemas.py +35 -0
- ciris_adapters/mock_llm/service.py +294 -0
- ciris_adapters/navigation/__init__.py +21 -0
- ciris_adapters/navigation/adapter.py +129 -0
- ciris_adapters/navigation/configurable.py +239 -0
- ciris_adapters/navigation/manifest.json +104 -0
- ciris_adapters/navigation/service.py +487 -0
- ciris_adapters/reddit/README.md +132 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_ANALYSIS.md +715 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_SUMMARY.txt +278 -0
- ciris_adapters/reddit/REDDIT_ANALYSIS_INDEX.md +307 -0
- ciris_adapters/reddit/REDDIT_PRODUCTION_READINESS_PLAN.md +518 -0
- ciris_adapters/reddit/__init__.py +15 -0
- ciris_adapters/reddit/adapter.py +189 -0
- ciris_adapters/reddit/configurable.py +274 -0
- ciris_adapters/reddit/error_handler.py +307 -0
- ciris_adapters/reddit/manifest.json +218 -0
- ciris_adapters/reddit/observer.py +532 -0
- ciris_adapters/reddit/protocol.py +34 -0
- ciris_adapters/reddit/schemas.py +433 -0
- ciris_adapters/reddit/service.py +1471 -0
- ciris_adapters/sample_adapter/README.md +474 -0
- ciris_adapters/sample_adapter/__init__.py +45 -0
- ciris_adapters/sample_adapter/adapter.py +208 -0
- ciris_adapters/sample_adapter/configurable.py +469 -0
- ciris_adapters/sample_adapter/manifest.json +247 -0
- ciris_adapters/sample_adapter/services.py +486 -0
- ciris_adapters/weather/__init__.py +16 -0
- ciris_adapters/weather/adapter.py +130 -0
- ciris_adapters/weather/configurable.py +240 -0
- ciris_adapters/weather/manifest.json +156 -0
- ciris_adapters/weather/service.py +600 -0
- ciris_agent-1.7.7.dist-info/METADATA +284 -0
- ciris_agent-1.7.7.dist-info/RECORD +986 -0
- ciris_agent-1.7.7.dist-info/WHEEL +5 -0
- ciris_agent-1.7.7.dist-info/entry_points.txt +15 -0
- ciris_agent-1.7.7.dist-info/licenses/LICENSE +205 -0
- ciris_agent-1.7.7.dist-info/licenses/NOTICE +82 -0
- ciris_agent-1.7.7.dist-info/top_level.txt +4 -0
- ciris_engine/__init__.py +15 -0
- ciris_engine/ciris_templates/ally.yaml +632 -0
- ciris_engine/ciris_templates/default.yaml +411 -0
- ciris_engine/ciris_templates/echo-core.yaml +629 -0
- ciris_engine/ciris_templates/echo-speculative.yaml +764 -0
- ciris_engine/ciris_templates/echo.yaml +647 -0
- ciris_engine/ciris_templates/sage.yaml +332 -0
- ciris_engine/ciris_templates/scout.yaml +338 -0
- ciris_engine/ciris_templates/test.yaml +168 -0
- ciris_engine/cli.py +42 -0
- ciris_engine/config/CIRIS_SERVICES.json +19 -0
- ciris_engine/config/MODEL_CAPABILITIES.json +419 -0
- ciris_engine/config/PRICING_DATA.json +179 -0
- ciris_engine/config/__init__.py +50 -0
- ciris_engine/config/ciris_services.py +113 -0
- ciris_engine/config/model_capabilities.py +388 -0
- ciris_engine/config/pricing_models.py +276 -0
- ciris_engine/constants.py +35 -0
- ciris_engine/data/__init__.py +1 -0
- ciris_engine/data/covenant_1.0b.txt +978 -0
- ciris_engine/gui_static/11steps.svg +107 -0
- ciris_engine/gui_static/2x-schematics.png +0 -0
- ciris_engine/gui_static/404/index.html +1 -0
- ciris_engine/gui_static/404.html +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3297-60e86ba0f8a7b040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3835-2aad4b7f5f8e4643.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4499-99a0bc47de0b8975.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4534-af88cd4ba6e99bff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4541-84b455f9e0dc4cfe.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4789-61412711484754bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/6539-c6398bc9d7018430.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-8e827b26cc8c2d32.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-fb45d630f3192c6f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8072-de4952a2e6d2b33f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8315-b91d03a3949db0af.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8386-f93a83ccbd789bd9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/87c73c54-781a7f35148d5433.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8903-fefea3339a02d41b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/9090-e66485adf8d9d990.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/_not-found/page-a67d9808462c23b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-2d7ee1583bbbd02e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-6a3c2bae6fe92b7b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-2ed3a035136bc4e8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-b2f5c91844a32422.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-25b90f89af3ea58c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-b65d16c94ecaf69c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-675b6d05c8f9184f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-cbee2e1c8ab52145.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-0f44da06697cf9f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-563420253577edbf.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/adapters/page-1854631018bc32be.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-8353752c176a7c70.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-f61a529f110a6040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-7f19b9d20d39be28.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-d1063938f249b8bd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-321b6728b8fff0bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-ebac35ca961a1277.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-6f3dc3bd02924f8e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-fa4a469f814c821a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-0d4f734269addd8f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-79227d426050089c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-018d21d683b6e5bc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-2aa5a5363ca2a371.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-198373205fd316e2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-f2ca39e7713b13f8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-1dd5a196f643c60d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-530a04d3abbb8cda.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-3193b06d094ab654.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-330e996dedb87aba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-0a70f5fc460298b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-21f2f99dd5b336e9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-33240e6c6034a49d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-68ffab6d54a7fdcd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/logs/page-8a6167aecc4a475c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-9ca8c5d0056de3ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-e961226941c18f81.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-6fdb065a787a4974.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-89f87d431be6064a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-2e728b9c43aa164d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-c7dd033dc40a72f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-ae9f0bdf11d01a95.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-b10feb79ca5d75e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-13ebe7ef1c16ae11.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-e6c82b16d617f785.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-0beb5f5b5a5c20fc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-2595e729eae30c0e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-1037c987aecc3653.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-2ffd147f6d3162ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-2c5798d58cafcd91.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-505b1ba4eceb01c3.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-b0cad31d5cb1b2fa.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-f3ecd7a8012df230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-f35117fdc4105801.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-fb583a7924114906.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-50f116fd76935563.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-c37d8aa5ba623a44.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-429aec7a707777ef.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-5f705aad60e0c04e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-13476b8b0f3808cc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-7e500d154ed5bba4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-cc4a9d8a5cb44d08.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-ec3e429efbc79230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/framework-9d29490f5ba089ba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-1f554952e47a82c4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-26fa8aed029082e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-97b0486ef6bcef25.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_app-6ce685456e616eb2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_error-d4bce98d93fe21e7.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/webpack-fcebd240b7f8477d.js +1 -0
- ciris_engine/gui_static/_next/static/css/16b94b1fe0cc6e37.css +3 -0
- ciris_engine/gui_static/_next/static/css/77a24ceaae86deff.css +3 -0
- ciris_engine/gui_static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/d8298875641ec7d4-s.p.woff2 +0 -0
- ciris_engine/gui_static/account/api-keys/index.html +1 -0
- ciris_engine/gui_static/account/api-keys/index.txt +27 -0
- ciris_engine/gui_static/account/consent/index.html +1 -0
- ciris_engine/gui_static/account/consent/index.txt +27 -0
- ciris_engine/gui_static/account/index.html +1 -0
- ciris_engine/gui_static/account/index.txt +27 -0
- ciris_engine/gui_static/account/privacy/index.html +1 -0
- ciris_engine/gui_static/account/privacy/index.txt +27 -0
- ciris_engine/gui_static/account/settings/index.html +1 -0
- ciris_engine/gui_static/account/settings/index.txt +27 -0
- ciris_engine/gui_static/adapters/index.html +1 -0
- ciris_engine/gui_static/adapters/index.txt +27 -0
- ciris_engine/gui_static/agents/index.html +1 -0
- ciris_engine/gui_static/agents/index.txt +27 -0
- ciris_engine/gui_static/andrew-roberts-euBRXcx57T4-unsplash.jpg +0 -0
- ciris_engine/gui_static/api-demo/index.html +1 -0
- ciris_engine/gui_static/api-demo/index.txt +27 -0
- ciris_engine/gui_static/audit/index.html +1 -0
- ciris_engine/gui_static/audit/index.txt +27 -0
- ciris_engine/gui_static/billing/index.html +1 -0
- ciris_engine/gui_static/billing/index.txt +27 -0
- ciris_engine/gui_static/blurryinfo.png +0 -0
- ciris_engine/gui_static/chip-vincent-PkQDwfl9Flc-unsplash.jpg +0 -0
- ciris_engine/gui_static/ciris-architecture.svg +338 -0
- ciris_engine/gui_static/comms/index.html +1 -0
- ciris_engine/gui_static/comms/index.txt +27 -0
- ciris_engine/gui_static/config/index.html +1 -0
- ciris_engine/gui_static/config/index.txt +27 -0
- ciris_engine/gui_static/consent/index.html +1 -0
- ciris_engine/gui_static/consent/index.txt +27 -0
- ciris_engine/gui_static/dashboard/index.html +1 -0
- ciris_engine/gui_static/dashboard/index.txt +27 -0
- ciris_engine/gui_static/docs/index.html +1 -0
- ciris_engine/gui_static/docs/index.txt +27 -0
- ciris_engine/gui_static/eric.png +0 -0
- ciris_engine/gui_static/file.svg +1 -0
- ciris_engine/gui_static/globe.svg +1 -0
- ciris_engine/gui_static/index.html +1 -0
- ciris_engine/gui_static/index.txt +27 -0
- ciris_engine/gui_static/infogfx-1@2x.png +0 -0
- ciris_engine/gui_static/infogfx-2.png +0 -0
- ciris_engine/gui_static/infogfx-dark-1.png +0 -0
- ciris_engine/gui_static/kelly-vohs-soSTXmIxTDU-unsplash.jpg +0 -0
- ciris_engine/gui_static/login/index.html +1 -0
- ciris_engine/gui_static/login/index.txt +27 -0
- ciris_engine/gui_static/logs/index.html +1 -0
- ciris_engine/gui_static/logs/index.txt +27 -0
- ciris_engine/gui_static/memory/index.html +1 -0
- ciris_engine/gui_static/memory/index.txt +27 -0
- ciris_engine/gui_static/nathan-farrish-ArcTfEoBgzs-unsplash.jpg +0 -0
- ciris_engine/gui_static/next.svg +1 -0
- ciris_engine/gui_static/overview.svg +512 -0
- ciris_engine/gui_static/overview1.svg +407 -0
- ciris_engine/gui_static/overview2.svg +370 -0
- ciris_engine/gui_static/pipeline-visualization.svg +278 -0
- ciris_engine/gui_static/privacy-policy.html +160 -0
- ciris_engine/gui_static/runtime/index.html +8 -0
- ciris_engine/gui_static/runtime/index.txt +27 -0
- ciris_engine/gui_static/services/index.html +1 -0
- ciris_engine/gui_static/services/index.txt +27 -0
- ciris_engine/gui_static/sessions/index.html +1 -0
- ciris_engine/gui_static/sessions/index.txt +27 -0
- ciris_engine/gui_static/setup/index.html +1 -0
- ciris_engine/gui_static/setup/index.txt +27 -0
- ciris_engine/gui_static/status-dashboard/index.html +1 -0
- ciris_engine/gui_static/status-dashboard/index.txt +27 -0
- ciris_engine/gui_static/system/index.html +1 -0
- ciris_engine/gui_static/system/index.txt +27 -0
- ciris_engine/gui_static/terms-of-service.html +174 -0
- ciris_engine/gui_static/test-auth/index.html +1 -0
- ciris_engine/gui_static/test-auth/index.txt +27 -0
- ciris_engine/gui_static/test-login/index.html +1 -0
- ciris_engine/gui_static/test-login/index.txt +27 -0
- ciris_engine/gui_static/test-sdk/index.html +1 -0
- ciris_engine/gui_static/test-sdk/index.txt +27 -0
- ciris_engine/gui_static/tools/index.html +1 -0
- ciris_engine/gui_static/tools/index.txt +27 -0
- ciris_engine/gui_static/users/index.html +1 -0
- ciris_engine/gui_static/users/index.txt +27 -0
- ciris_engine/gui_static/vercel.svg +1 -0
- ciris_engine/gui_static/videos/video1.mp4 +0 -0
- ciris_engine/gui_static/videos/video3.mp4 +0 -0
- ciris_engine/gui_static/wa/index.html +1 -0
- ciris_engine/gui_static/wa/index.txt +27 -0
- ciris_engine/gui_static/window.svg +1 -0
- ciris_engine/logic/__init__.py +8 -0
- ciris_engine/logic/adapters/__init__.py +74 -0
- ciris_engine/logic/adapters/api/__init__.py +5 -0
- ciris_engine/logic/adapters/api/adapter.py +1037 -0
- ciris_engine/logic/adapters/api/api_communication.py +370 -0
- ciris_engine/logic/adapters/api/api_document.py +330 -0
- ciris_engine/logic/adapters/api/api_observer.py +24 -0
- ciris_engine/logic/adapters/api/api_runtime_control.py +388 -0
- ciris_engine/logic/adapters/api/api_tools.py +299 -0
- ciris_engine/logic/adapters/api/api_vision.py +215 -0
- ciris_engine/logic/adapters/api/app.py +272 -0
- ciris_engine/logic/adapters/api/auth.py +159 -0
- ciris_engine/logic/adapters/api/config.py +101 -0
- ciris_engine/logic/adapters/api/constants.py +55 -0
- ciris_engine/logic/adapters/api/dependencies/__init__.py +1 -0
- ciris_engine/logic/adapters/api/dependencies/auth.py +260 -0
- ciris_engine/logic/adapters/api/endpoints/__init__.py +1 -0
- ciris_engine/logic/adapters/api/endpoints/emergency.py +86 -0
- ciris_engine/logic/adapters/api/middleware/__init__.py +1 -0
- ciris_engine/logic/adapters/api/middleware/rate_limiter.py +302 -0
- ciris_engine/logic/adapters/api/models.py +29 -0
- ciris_engine/logic/adapters/api/routes/__init__.py +52 -0
- ciris_engine/logic/adapters/api/routes/agent.py +1762 -0
- ciris_engine/logic/adapters/api/routes/audit.py +707 -0
- ciris_engine/logic/adapters/api/routes/auth.py +1745 -0
- ciris_engine/logic/adapters/api/routes/billing.py +895 -0
- ciris_engine/logic/adapters/api/routes/config.py +329 -0
- ciris_engine/logic/adapters/api/routes/connectors.py +534 -0
- ciris_engine/logic/adapters/api/routes/consent.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar_multi_source.py +484 -0
- ciris_engine/logic/adapters/api/routes/emergency.py +302 -0
- ciris_engine/logic/adapters/api/routes/memory.py +733 -0
- ciris_engine/logic/adapters/api/routes/memory_filters.py +230 -0
- ciris_engine/logic/adapters/api/routes/memory_models.py +112 -0
- ciris_engine/logic/adapters/api/routes/memory_queries.py +236 -0
- ciris_engine/logic/adapters/api/routes/memory_query_helpers.py +394 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization.py +359 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization_helpers.py +110 -0
- ciris_engine/logic/adapters/api/routes/partnership.py +541 -0
- ciris_engine/logic/adapters/api/routes/setup.py +1374 -0
- ciris_engine/logic/adapters/api/routes/system.py +3049 -0
- ciris_engine/logic/adapters/api/routes/system_extensions.py +952 -0
- ciris_engine/logic/adapters/api/routes/telemetry.py +1987 -0
- ciris_engine/logic/adapters/api/routes/telemetry_converters.py +141 -0
- ciris_engine/logic/adapters/api/routes/telemetry_helpers.py +111 -0
- ciris_engine/logic/adapters/api/routes/telemetry_logs_reader.py +280 -0
- ciris_engine/logic/adapters/api/routes/telemetry_metrics.py +131 -0
- ciris_engine/logic/adapters/api/routes/telemetry_models.py +190 -0
- ciris_engine/logic/adapters/api/routes/telemetry_otlp.py +878 -0
- ciris_engine/logic/adapters/api/routes/telemetry_resource_helpers.py +191 -0
- ciris_engine/logic/adapters/api/routes/tickets.py +541 -0
- ciris_engine/logic/adapters/api/routes/tools.py +556 -0
- ciris_engine/logic/adapters/api/routes/transparency.py +281 -0
- ciris_engine/logic/adapters/api/routes/users.py +981 -0
- ciris_engine/logic/adapters/api/routes/verification.py +373 -0
- ciris_engine/logic/adapters/api/routes/wa.py +369 -0
- ciris_engine/logic/adapters/api/service_configuration.py +177 -0
- ciris_engine/logic/adapters/api/services/__init__.py +1 -0
- ciris_engine/logic/adapters/api/services/auth_service.py +1417 -0
- ciris_engine/logic/adapters/api/services/oauth_security.py +68 -0
- ciris_engine/logic/adapters/base.py +141 -0
- ciris_engine/logic/adapters/base_adapter.py +73 -0
- ciris_engine/logic/adapters/base_observer.py +1141 -0
- ciris_engine/logic/adapters/base_vision.py +312 -0
- ciris_engine/logic/adapters/cirisnode_client.py +307 -0
- ciris_engine/logic/adapters/cli/__init__.py +3 -0
- ciris_engine/logic/adapters/cli/adapter.py +207 -0
- ciris_engine/logic/adapters/cli/cli_adapter.py +902 -0
- ciris_engine/logic/adapters/cli/cli_observer.py +268 -0
- ciris_engine/logic/adapters/cli/cli_tools.py +427 -0
- ciris_engine/logic/adapters/cli/cli_wa_service.py +134 -0
- ciris_engine/logic/adapters/cli/config.py +73 -0
- ciris_engine/logic/adapters/discord/__init__.py +3 -0
- ciris_engine/logic/adapters/discord/adapter.py +783 -0
- ciris_engine/logic/adapters/discord/ciris_discord_client.py +159 -0
- ciris_engine/logic/adapters/discord/config.py +177 -0
- ciris_engine/logic/adapters/discord/constants.py +185 -0
- ciris_engine/logic/adapters/discord/discord-stubs.pyi +50 -0
- ciris_engine/logic/adapters/discord/discord_adapter.py +1584 -0
- ciris_engine/logic/adapters/discord/discord_audit.py +150 -0
- ciris_engine/logic/adapters/discord/discord_channel_manager.py +351 -0
- ciris_engine/logic/adapters/discord/discord_connection_manager.py +313 -0
- ciris_engine/logic/adapters/discord/discord_embed_formatter.py +369 -0
- ciris_engine/logic/adapters/discord/discord_error_classifier.py +302 -0
- ciris_engine/logic/adapters/discord/discord_error_handler.py +316 -0
- ciris_engine/logic/adapters/discord/discord_guidance_handler.py +460 -0
- ciris_engine/logic/adapters/discord/discord_message_handler.py +207 -0
- ciris_engine/logic/adapters/discord/discord_observer.py +670 -0
- ciris_engine/logic/adapters/discord/discord_rate_limiter.py +249 -0
- ciris_engine/logic/adapters/discord/discord_reaction_handler.py +278 -0
- ciris_engine/logic/adapters/discord/discord_tool_handler.py +465 -0
- ciris_engine/logic/adapters/discord/discord_tool_service.py +790 -0
- ciris_engine/logic/adapters/discord/discord_tools.py +90 -0
- ciris_engine/logic/adapters/discord/discord_vision_helper.py +148 -0
- ciris_engine/logic/adapters/discord/py.typed +0 -0
- ciris_engine/logic/adapters/document_parser.py +320 -0
- ciris_engine/logic/audit/__init__.py +10 -0
- ciris_engine/logic/audit/hash_chain.py +313 -0
- ciris_engine/logic/audit/signature_manager.py +352 -0
- ciris_engine/logic/audit/verifier.py +408 -0
- ciris_engine/logic/buses/__init__.py +21 -0
- ciris_engine/logic/buses/base_bus.py +178 -0
- ciris_engine/logic/buses/bus_manager.py +121 -0
- ciris_engine/logic/buses/communication_bus.py +387 -0
- ciris_engine/logic/buses/llm_bus.py +722 -0
- ciris_engine/logic/buses/memory_bus.py +577 -0
- ciris_engine/logic/buses/prohibitions.py +502 -0
- ciris_engine/logic/buses/runtime_control_bus.py +539 -0
- ciris_engine/logic/buses/tool_bus.py +482 -0
- ciris_engine/logic/buses/wise_bus.py +684 -0
- ciris_engine/logic/config/__init__.py +25 -0
- ciris_engine/logic/config/bootstrap.py +255 -0
- ciris_engine/logic/config/config_accessor.py +202 -0
- ciris_engine/logic/config/db_paths.py +194 -0
- ciris_engine/logic/config/env_utils.py +39 -0
- ciris_engine/logic/conscience/__init__.py +16 -0
- ciris_engine/logic/conscience/build_deferral_package.py +0 -0
- ciris_engine/logic/conscience/core.py +688 -0
- ciris_engine/logic/conscience/interface.py +33 -0
- ciris_engine/logic/conscience/registry.py +76 -0
- ciris_engine/logic/conscience/thought_depth_guardrail.py +231 -0
- ciris_engine/logic/conscience/updated_status_conscience.py +156 -0
- ciris_engine/logic/context/__init__.py +10 -0
- ciris_engine/logic/context/batch_context.py +550 -0
- ciris_engine/logic/context/builder.py +149 -0
- ciris_engine/logic/context/channel_resolution.py +136 -0
- ciris_engine/logic/context/secrets_snapshot.py +52 -0
- ciris_engine/logic/context/system_snapshot.py +116 -0
- ciris_engine/logic/context/system_snapshot_helpers.py +1651 -0
- ciris_engine/logic/covenant/__init__.py +33 -0
- ciris_engine/logic/covenant/executor.py +303 -0
- ciris_engine/logic/covenant/extractor.py +382 -0
- ciris_engine/logic/covenant/handler.py +241 -0
- ciris_engine/logic/covenant/verifier.py +383 -0
- ciris_engine/logic/dma/__init__.py +15 -0
- ciris_engine/logic/dma/action_selection/__init__.py +11 -0
- ciris_engine/logic/dma/action_selection/action_instruction_generator.py +444 -0
- ciris_engine/logic/dma/action_selection/context_builder.py +508 -0
- ciris_engine/logic/dma/action_selection/faculty_integration.py +193 -0
- ciris_engine/logic/dma/action_selection/special_cases.py +132 -0
- ciris_engine/logic/dma/action_selection_pdma.py +365 -0
- ciris_engine/logic/dma/base_dma.py +335 -0
- ciris_engine/logic/dma/csdma.py +239 -0
- ciris_engine/logic/dma/dma_executor.py +575 -0
- ciris_engine/logic/dma/dsdma_base.py +410 -0
- ciris_engine/logic/dma/exceptions.py +4 -0
- ciris_engine/logic/dma/factory.py +150 -0
- ciris_engine/logic/dma/pdma.py +120 -0
- ciris_engine/logic/dma/prompt_loader.py +189 -0
- ciris_engine/logic/dma/prompts/action_selection_pdma.yml +58 -0
- ciris_engine/logic/dma/prompts/csdma_common_sense.yml +28 -0
- ciris_engine/logic/dma/prompts/dsdma_base.yml +17 -0
- ciris_engine/logic/dma/prompts/pdma_ethical.yml +42 -0
- ciris_engine/logic/formatters/__init__.py +26 -0
- ciris_engine/logic/formatters/crisis_resources.py +80 -0
- ciris_engine/logic/formatters/escalation.py +21 -0
- ciris_engine/logic/formatters/identity.py +224 -0
- ciris_engine/logic/formatters/prompt_blocks.py +64 -0
- ciris_engine/logic/formatters/system_snapshot.py +193 -0
- ciris_engine/logic/formatters/user_profiles.py +108 -0
- ciris_engine/logic/handlers/__init__.py +1 -0
- ciris_engine/logic/handlers/control/__init__.py +1 -0
- ciris_engine/logic/handlers/control/defer_handler.py +195 -0
- ciris_engine/logic/handlers/control/ponder_handler.py +154 -0
- ciris_engine/logic/handlers/control/reject_handler.py +81 -0
- ciris_engine/logic/handlers/external/__init__.py +1 -0
- ciris_engine/logic/handlers/external/observe_handler.py +154 -0
- ciris_engine/logic/handlers/external/speak_handler.py +250 -0
- ciris_engine/logic/handlers/external/tool_handler.py +148 -0
- ciris_engine/logic/handlers/memory/__init__.py +1 -0
- ciris_engine/logic/handlers/memory/forget_handler.py +107 -0
- ciris_engine/logic/handlers/memory/memorize_handler.py +391 -0
- ciris_engine/logic/handlers/memory/recall_handler.py +213 -0
- ciris_engine/logic/handlers/terminal/__init__.py +1 -0
- ciris_engine/logic/handlers/terminal/task_complete_handler.py +299 -0
- ciris_engine/logic/infrastructure/__init__.py +1 -0
- ciris_engine/logic/infrastructure/handlers/__init__.py +8 -0
- ciris_engine/logic/infrastructure/handlers/action_dispatcher.py +382 -0
- ciris_engine/logic/infrastructure/handlers/base_handler.py +450 -0
- ciris_engine/logic/infrastructure/handlers/exceptions.py +2 -0
- ciris_engine/logic/infrastructure/handlers/handler_registry.py +59 -0
- ciris_engine/logic/infrastructure/handlers/helpers.py +55 -0
- ciris_engine/logic/infrastructure/step_streaming.py +149 -0
- ciris_engine/logic/infrastructure/sub_services/__init__.py +1 -0
- ciris_engine/logic/infrastructure/sub_services/identity_variance_monitor.py +1035 -0
- ciris_engine/logic/infrastructure/sub_services/pattern_analysis_loop.py +758 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_bootstrap.py +229 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_display.py +176 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_oauth.py +404 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_wizard.py +181 -0
- ciris_engine/logic/persistence/__init__.py +130 -0
- ciris_engine/logic/persistence/analytics.py +97 -0
- ciris_engine/logic/persistence/db/__init__.py +28 -0
- ciris_engine/logic/persistence/db/core.py +520 -0
- ciris_engine/logic/persistence/db/dialect.py +380 -0
- ciris_engine/logic/persistence/db/execution_helpers.py +216 -0
- ciris_engine/logic/persistence/db/migration_runner.py +191 -0
- ciris_engine/logic/persistence/db/operations.py +313 -0
- ciris_engine/logic/persistence/db/query_builder.py +232 -0
- ciris_engine/logic/persistence/db/retry.py +154 -0
- ciris_engine/logic/persistence/db/setup.py +18 -0
- ciris_engine/logic/persistence/migrations/postgres/001_initial_schema.sql +4 -0
- ciris_engine/logic/persistence/migrations/postgres/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/postgres/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/postgres/004_add_occurrence_id.sql +54 -0
- ciris_engine/logic/persistence/migrations/postgres/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/postgres/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/postgres/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/008_rename_to_tickets_add_sop.sql +123 -0
- ciris_engine/logic/persistence/migrations/postgres/009_add_ticket_status_columns.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/010_add_images_to_tasks.sql +5 -0
- ciris_engine/logic/persistence/migrations/sqlite/001_initial_schema.sql +357 -0
- ciris_engine/logic/persistence/migrations/sqlite/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/sqlite/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/sqlite/004_add_occurrence_id.sql +45 -0
- ciris_engine/logic/persistence/migrations/sqlite/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/sqlite/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/sqlite/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/sqlite/008_rename_to_tickets_add_sop.sql +120 -0
- ciris_engine/logic/persistence/migrations/sqlite/009_add_ticket_status_columns.sql +129 -0
- ciris_engine/logic/persistence/migrations/sqlite/010_add_images_to_tasks.sql +17 -0
- ciris_engine/logic/persistence/models/__init__.py +141 -0
- ciris_engine/logic/persistence/models/correlations.py +881 -0
- ciris_engine/logic/persistence/models/deferral.py +68 -0
- ciris_engine/logic/persistence/models/dsar.py +286 -0
- ciris_engine/logic/persistence/models/graph.py +362 -0
- ciris_engine/logic/persistence/models/identity.py +264 -0
- ciris_engine/logic/persistence/models/queue_status.py +139 -0
- ciris_engine/logic/persistence/models/tasks.py +1043 -0
- ciris_engine/logic/persistence/models/thoughts.py +400 -0
- ciris_engine/logic/persistence/models/tickets.py +518 -0
- ciris_engine/logic/persistence/stores/__init__.py +13 -0
- ciris_engine/logic/persistence/stores/auth_helpers.py +117 -0
- ciris_engine/logic/persistence/stores/authentication_store.py +414 -0
- ciris_engine/logic/persistence/utils.py +212 -0
- ciris_engine/logic/processors/__init__.py +30 -0
- ciris_engine/logic/processors/core/__init__.py +1 -0
- ciris_engine/logic/processors/core/base_processor.py +280 -0
- ciris_engine/logic/processors/core/main_processor.py +1777 -0
- ciris_engine/logic/processors/core/step_decorators.py +1583 -0
- ciris_engine/logic/processors/core/thought_processor/__init__.py +20 -0
- ciris_engine/logic/processors/core/thought_processor/action_execution.py +49 -0
- ciris_engine/logic/processors/core/thought_processor/conscience_execution.py +382 -0
- ciris_engine/logic/processors/core/thought_processor/finalize_action.py +66 -0
- ciris_engine/logic/processors/core/thought_processor/gather_context.py +120 -0
- ciris_engine/logic/processors/core/thought_processor/main.py +920 -0
- ciris_engine/logic/processors/core/thought_processor/perform_aspdma.py +86 -0
- ciris_engine/logic/processors/core/thought_processor/perform_dmas.py +106 -0
- ciris_engine/logic/processors/core/thought_processor/recursive_processing.py +237 -0
- ciris_engine/logic/processors/core/thought_processor/round_complete.py +52 -0
- ciris_engine/logic/processors/core/thought_processor/start_round.py +64 -0
- ciris_engine/logic/processors/exceptions.py +59 -0
- ciris_engine/logic/processors/states/__init__.py +1 -0
- ciris_engine/logic/processors/states/dream_processor.py +1381 -0
- ciris_engine/logic/processors/states/play_processor.py +141 -0
- ciris_engine/logic/processors/states/shutdown_processor.py +623 -0
- ciris_engine/logic/processors/states/solitude_processor.py +305 -0
- ciris_engine/logic/processors/states/wakeup_processor.py +802 -0
- ciris_engine/logic/processors/states/work_processor.py +742 -0
- ciris_engine/logic/processors/support/__init__.py +1 -0
- ciris_engine/logic/processors/support/dma_orchestrator.py +336 -0
- ciris_engine/logic/processors/support/processing_queue.py +133 -0
- ciris_engine/logic/processors/support/shutdown_condition_evaluator.py +294 -0
- ciris_engine/logic/processors/support/state_manager.py +358 -0
- ciris_engine/logic/processors/support/task_manager.py +303 -0
- ciris_engine/logic/processors/support/thought_escalation.py +116 -0
- ciris_engine/logic/processors/support/thought_manager.py +328 -0
- ciris_engine/logic/processors/support/thought_manager_enhanced.py +105 -0
- ciris_engine/logic/registries/__init__.py +34 -0
- ciris_engine/logic/registries/base.py +653 -0
- ciris_engine/logic/registries/circuit_breaker.py +275 -0
- ciris_engine/logic/registries/typed_registries.py +184 -0
- ciris_engine/logic/runtime/__init__.py +7 -0
- ciris_engine/logic/runtime/adapter_loader.py +261 -0
- ciris_engine/logic/runtime/adapter_manager.py +1053 -0
- ciris_engine/logic/runtime/ciris_runtime.py +2342 -0
- ciris_engine/logic/runtime/ciris_runtime_helpers.py +923 -0
- ciris_engine/logic/runtime/component_builder.py +361 -0
- ciris_engine/logic/runtime/identity_manager.py +219 -0
- ciris_engine/logic/runtime/module_loader.py +207 -0
- ciris_engine/logic/runtime/prevent_sideeffects.py +30 -0
- ciris_engine/logic/runtime/runtime_interface.py +23 -0
- ciris_engine/logic/runtime/service_initializer.py +1623 -0
- ciris_engine/logic/secrets/__init__.py +30 -0
- ciris_engine/logic/secrets/encryption.py +175 -0
- ciris_engine/logic/secrets/filter.py +295 -0
- ciris_engine/logic/secrets/service.py +652 -0
- ciris_engine/logic/secrets/store.py +669 -0
- ciris_engine/logic/services/__init__.py +1 -0
- ciris_engine/logic/services/adaptation/__init__.py +3 -0
- ciris_engine/logic/services/base_graph_service.py +142 -0
- ciris_engine/logic/services/base_infrastructure_service.py +69 -0
- ciris_engine/logic/services/base_scheduled_service.py +136 -0
- ciris_engine/logic/services/base_service.py +247 -0
- ciris_engine/logic/services/governance/__init__.py +3 -0
- ciris_engine/logic/services/governance/adaptive_filter/__init__.py +14 -0
- ciris_engine/logic/services/governance/adaptive_filter/service.py +818 -0
- ciris_engine/logic/services/governance/consent/__init__.py +53 -0
- ciris_engine/logic/services/governance/consent/air.py +403 -0
- ciris_engine/logic/services/governance/consent/decay.py +324 -0
- ciris_engine/logic/services/governance/consent/dsar_automation.py +589 -0
- ciris_engine/logic/services/governance/consent/exceptions.py +106 -0
- ciris_engine/logic/services/governance/consent/metrics.py +270 -0
- ciris_engine/logic/services/governance/consent/partnership.py +533 -0
- ciris_engine/logic/services/governance/consent/service.py +1256 -0
- ciris_engine/logic/services/governance/dsar/__init__.py +29 -0
- ciris_engine/logic/services/governance/dsar/orchestrator.py +977 -0
- ciris_engine/logic/services/governance/dsar/schemas.py +141 -0
- ciris_engine/logic/services/governance/dsar/signature_service.py +283 -0
- ciris_engine/logic/services/governance/self_observation/__init__.py +20 -0
- ciris_engine/logic/services/governance/self_observation/service.py +1153 -0
- ciris_engine/logic/services/governance/visibility/__init__.py +17 -0
- ciris_engine/logic/services/governance/visibility/service.py +512 -0
- ciris_engine/logic/services/governance/wise_authority/__init__.py +15 -0
- ciris_engine/logic/services/governance/wise_authority/service.py +827 -0
- ciris_engine/logic/services/graph/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/service.py +1675 -0
- ciris_engine/logic/services/graph/base.py +208 -0
- ciris_engine/logic/services/graph/config_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/config_service/service.py +372 -0
- ciris_engine/logic/services/graph/incident_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/incident_service/service.py +803 -0
- ciris_engine/logic/services/graph/memory_service.py +1120 -0
- ciris_engine/logic/services/graph/telemetry_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/telemetry_service/exceptions.py +104 -0
- ciris_engine/logic/services/graph/telemetry_service/helpers.py +1337 -0
- ciris_engine/logic/services/graph/telemetry_service/service.py +2429 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/__init__.py +17 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/aggregation_helpers.py +355 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/cleanup_helpers.py +438 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/compressor.py +260 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/__init__.py +27 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/audit.py +326 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/conversation.py +291 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/memory.py +197 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/metrics.py +251 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/task.py +257 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/trace.py +363 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/data_converter.py +545 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/date_calculation_helpers.py +193 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/db_query_helpers.py +296 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_helpers.py +92 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_manager.py +896 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/extensive_helpers.py +322 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/period_manager.py +152 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/profound_helpers.py +277 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/query_manager.py +812 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/service.py +1692 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/sql_builders.py +363 -0
- ciris_engine/logic/services/infrastructure/__init__.py +1 -0
- ciris_engine/logic/services/infrastructure/authentication/__init__.py +5 -0
- ciris_engine/logic/services/infrastructure/authentication/service.py +1634 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/__init__.py +15 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/service.py +764 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/__init__.py +7 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/ciris_billing_provider.py +755 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/service.py +409 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/simple_credit_provider.py +129 -0
- ciris_engine/logic/services/lifecycle/__init__.py +3 -0
- ciris_engine/logic/services/lifecycle/initialization/__init__.py +10 -0
- ciris_engine/logic/services/lifecycle/initialization/service.py +312 -0
- ciris_engine/logic/services/lifecycle/scheduler/__init__.py +5 -0
- ciris_engine/logic/services/lifecycle/scheduler/service.py +607 -0
- ciris_engine/logic/services/lifecycle/shutdown/__init__.py +9 -0
- ciris_engine/logic/services/lifecycle/shutdown/service.py +378 -0
- ciris_engine/logic/services/lifecycle/time/__init__.py +15 -0
- ciris_engine/logic/services/lifecycle/time/service.py +259 -0
- ciris_engine/logic/services/memory_service/__init__.py +8 -0
- ciris_engine/logic/services/mixins/__init__.py +13 -0
- ciris_engine/logic/services/mixins/example_usage.py +200 -0
- ciris_engine/logic/services/mixins/request_metrics.py +179 -0
- ciris_engine/logic/services/runtime/__init__.py +3 -0
- ciris_engine/logic/services/runtime/adapter_configuration/__init__.py +16 -0
- ciris_engine/logic/services/runtime/adapter_configuration/service.py +674 -0
- ciris_engine/logic/services/runtime/adapter_configuration/session.py +67 -0
- ciris_engine/logic/services/runtime/control_service/__init__.py +5 -0
- ciris_engine/logic/services/runtime/control_service/service.py +2269 -0
- ciris_engine/logic/services/runtime/llm_service/__init__.py +14 -0
- ciris_engine/logic/services/runtime/llm_service/pricing_calculator.py +279 -0
- ciris_engine/logic/services/runtime/llm_service/service.py +930 -0
- ciris_engine/logic/services/tools/__init__.py +5 -0
- ciris_engine/logic/services/tools/core_tool_service/__init__.py +8 -0
- ciris_engine/logic/services/tools/core_tool_service/service.py +852 -0
- ciris_engine/logic/setup/__init__.py +1 -0
- ciris_engine/logic/setup/first_run.py +250 -0
- ciris_engine/logic/setup/wizard.py +327 -0
- ciris_engine/logic/telemetry/__init__.py +46 -0
- ciris_engine/logic/telemetry/core.py +239 -0
- ciris_engine/logic/telemetry/hot_cold_config.py +133 -0
- ciris_engine/logic/telemetry/log_collector.py +190 -0
- ciris_engine/logic/telemetry/resource_monitor.py +7 -0
- ciris_engine/logic/telemetry/security.py +79 -0
- ciris_engine/logic/utils/__init__.py +18 -0
- ciris_engine/logic/utils/channel_utils.py +75 -0
- ciris_engine/logic/utils/consent/__init__.py +1 -0
- ciris_engine/logic/utils/consent/partnership_utils.py +172 -0
- ciris_engine/logic/utils/constants.py +92 -0
- ciris_engine/logic/utils/context_utils.py +145 -0
- ciris_engine/logic/utils/directory_setup.py +533 -0
- ciris_engine/logic/utils/graphql_context_provider.py +152 -0
- ciris_engine/logic/utils/identity_resolution.py +843 -0
- ciris_engine/logic/utils/incident_capture_handler.py +303 -0
- ciris_engine/logic/utils/initialization_manager.py +74 -0
- ciris_engine/logic/utils/jsondict_helpers.py +290 -0
- ciris_engine/logic/utils/log_sanitizer.py +97 -0
- ciris_engine/logic/utils/logging_config.py +151 -0
- ciris_engine/logic/utils/observability_decorators.py +544 -0
- ciris_engine/logic/utils/occurrence_utils.py +155 -0
- ciris_engine/logic/utils/path_resolution.py +281 -0
- ciris_engine/logic/utils/platform_detection.py +286 -0
- ciris_engine/logic/utils/privacy.py +266 -0
- ciris_engine/logic/utils/profile_loader.py +124 -0
- ciris_engine/logic/utils/profile_manager.py +16 -0
- ciris_engine/logic/utils/runtime_utils.py +69 -0
- ciris_engine/logic/utils/shutdown_manager.py +107 -0
- ciris_engine/logic/utils/task_formatters.py +60 -0
- ciris_engine/logic/utils/task_thought_factory.py +404 -0
- ciris_engine/logic/utils/thought_utils.py +54 -0
- ciris_engine/logic/utils/user_utils.py +70 -0
- ciris_engine/protocols/__init__.py +0 -0
- ciris_engine/protocols/adapters/__init__.py +35 -0
- ciris_engine/protocols/adapters/base.py +149 -0
- ciris_engine/protocols/adapters/configurable.py +265 -0
- ciris_engine/protocols/adapters/message.py +90 -0
- ciris_engine/protocols/audit/__init__.py +1 -0
- ciris_engine/protocols/buses/__init__.py +1 -0
- ciris_engine/protocols/config/__init__.py +1 -0
- ciris_engine/protocols/conscience/__init__.py +1 -0
- ciris_engine/protocols/consent.py +88 -0
- ciris_engine/protocols/context/__init__.py +1 -0
- ciris_engine/protocols/data/__init__.py +1 -0
- ciris_engine/protocols/dma/__init__.py +1 -0
- ciris_engine/protocols/dma/base.py +107 -0
- ciris_engine/protocols/faculties.py +34 -0
- ciris_engine/protocols/formatters/__init__.py +1 -0
- ciris_engine/protocols/handlers/__init__.py +1 -0
- ciris_engine/protocols/infrastructure/__init__.py +25 -0
- ciris_engine/protocols/infrastructure/base.py +377 -0
- ciris_engine/protocols/persistence/__init__.py +1 -0
- ciris_engine/protocols/pipeline_control.py +609 -0
- ciris_engine/protocols/processors/__init__.py +19 -0
- ciris_engine/protocols/processors/agent.py +299 -0
- ciris_engine/protocols/processors/base.py +130 -0
- ciris_engine/protocols/processors/orchestration.py +62 -0
- ciris_engine/protocols/registries/__init__.py +1 -0
- ciris_engine/protocols/runtime/__init__.py +1 -0
- ciris_engine/protocols/runtime/base.py +163 -0
- ciris_engine/protocols/secrets/__init__.py +1 -0
- ciris_engine/protocols/services/__init__.py +80 -0
- ciris_engine/protocols/services/adaptation/__init__.py +7 -0
- ciris_engine/protocols/services/adaptation/self_observation.py +265 -0
- ciris_engine/protocols/services/governance/__init__.py +20 -0
- ciris_engine/protocols/services/governance/communication.py +58 -0
- ciris_engine/protocols/services/governance/filter.py +56 -0
- ciris_engine/protocols/services/governance/visibility.py +32 -0
- ciris_engine/protocols/services/governance/wa_auth.py +192 -0
- ciris_engine/protocols/services/governance/wise_authority.py +75 -0
- ciris_engine/protocols/services/graph/__init__.py +19 -0
- ciris_engine/protocols/services/graph/audit.py +92 -0
- ciris_engine/protocols/services/graph/config.py +54 -0
- ciris_engine/protocols/services/graph/incident_management.py +103 -0
- ciris_engine/protocols/services/graph/memory.py +110 -0
- ciris_engine/protocols/services/graph/telemetry.py +51 -0
- ciris_engine/protocols/services/graph/tsdb_consolidation.py +87 -0
- ciris_engine/protocols/services/infrastructure/__init__.py +11 -0
- ciris_engine/protocols/services/infrastructure/authentication.py +159 -0
- ciris_engine/protocols/services/infrastructure/credit_gate.py +46 -0
- ciris_engine/protocols/services/infrastructure/database_maintenance.py +25 -0
- ciris_engine/protocols/services/infrastructure/resource_monitor.py +83 -0
- ciris_engine/protocols/services/lifecycle/__init__.py +13 -0
- ciris_engine/protocols/services/lifecycle/initialization.py +41 -0
- ciris_engine/protocols/services/lifecycle/scheduler.py +42 -0
- ciris_engine/protocols/services/lifecycle/shutdown.py +50 -0
- ciris_engine/protocols/services/lifecycle/time.py +31 -0
- ciris_engine/protocols/services/runtime/__init__.py +13 -0
- ciris_engine/protocols/services/runtime/llm.py +50 -0
- ciris_engine/protocols/services/runtime/runtime_control.py +193 -0
- ciris_engine/protocols/services/runtime/secrets.py +100 -0
- ciris_engine/protocols/services/runtime/tool.py +123 -0
- ciris_engine/protocols/telemetry/__init__.py +1 -0
- ciris_engine/protocols/utils/__init__.py +1 -0
- ciris_engine/schemas/__init__.py +112 -0
- ciris_engine/schemas/actions/__init__.py +37 -0
- ciris_engine/schemas/actions/parameters.py +137 -0
- ciris_engine/schemas/adapters/__init__.py +13 -0
- ciris_engine/schemas/adapters/cirisnode.py +135 -0
- ciris_engine/schemas/adapters/cli.py +97 -0
- ciris_engine/schemas/adapters/cli_tools.py +98 -0
- ciris_engine/schemas/adapters/discord.py +125 -0
- ciris_engine/schemas/adapters/graphql_core.py +144 -0
- ciris_engine/schemas/adapters/registration.py +47 -0
- ciris_engine/schemas/adapters/runtime_context.py +48 -0
- ciris_engine/schemas/adapters/tool_execution.py +45 -0
- ciris_engine/schemas/adapters/tools.py +96 -0
- ciris_engine/schemas/api/__init__.py +1 -0
- ciris_engine/schemas/api/agent.py +50 -0
- ciris_engine/schemas/api/audit.py +38 -0
- ciris_engine/schemas/api/auth.py +351 -0
- ciris_engine/schemas/api/config_security.py +242 -0
- ciris_engine/schemas/api/emergency.py +111 -0
- ciris_engine/schemas/api/responses.py +72 -0
- ciris_engine/schemas/api/runtime.py +26 -0
- ciris_engine/schemas/api/telemetry.py +109 -0
- ciris_engine/schemas/api/wa.py +90 -0
- ciris_engine/schemas/audit/__init__.py +13 -0
- ciris_engine/schemas/audit/core.py +139 -0
- ciris_engine/schemas/audit/hash_chain.py +58 -0
- ciris_engine/schemas/audit/verification.py +131 -0
- ciris_engine/schemas/buses/__init__.py +1 -0
- ciris_engine/schemas/config/__init__.py +41 -0
- ciris_engine/schemas/config/agent.py +279 -0
- ciris_engine/schemas/config/cognitive_state_behaviors.py +194 -0
- ciris_engine/schemas/config/default_dsar_sops.py +178 -0
- ciris_engine/schemas/config/essential.py +195 -0
- ciris_engine/schemas/config/tickets.py +86 -0
- ciris_engine/schemas/conscience/__init__.py +25 -0
- ciris_engine/schemas/conscience/context.py +34 -0
- ciris_engine/schemas/conscience/core.py +145 -0
- ciris_engine/schemas/conscience/results.py +24 -0
- ciris_engine/schemas/consent/__init__.py +5 -0
- ciris_engine/schemas/consent/core.py +404 -0
- ciris_engine/schemas/context/__init__.py +1 -0
- ciris_engine/schemas/covenant.py +382 -0
- ciris_engine/schemas/data/__init__.py +1 -0
- ciris_engine/schemas/dma/__init__.py +16 -0
- ciris_engine/schemas/dma/core.py +199 -0
- ciris_engine/schemas/dma/faculty.py +192 -0
- ciris_engine/schemas/dma/prompts.py +172 -0
- ciris_engine/schemas/dma/results.py +103 -0
- ciris_engine/schemas/formatters/__init__.py +1 -0
- ciris_engine/schemas/handlers/__init__.py +10 -0
- ciris_engine/schemas/handlers/context.py +119 -0
- ciris_engine/schemas/handlers/contexts.py +100 -0
- ciris_engine/schemas/handlers/core.py +167 -0
- ciris_engine/schemas/handlers/memory_schemas.py +67 -0
- ciris_engine/schemas/handlers/schemas.py +95 -0
- ciris_engine/schemas/identity.py +149 -0
- ciris_engine/schemas/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/infrastructure/base.py +256 -0
- ciris_engine/schemas/infrastructure/behavioral_patterns.py +129 -0
- ciris_engine/schemas/infrastructure/feedback_loop.py +57 -0
- ciris_engine/schemas/infrastructure/identity_variance.py +141 -0
- ciris_engine/schemas/infrastructure/oauth.py +175 -0
- ciris_engine/schemas/infrastructure/wa_cli_wizard.py +54 -0
- ciris_engine/schemas/persistence/__init__.py +34 -0
- ciris_engine/schemas/persistence/core.py +140 -0
- ciris_engine/schemas/persistence/correlations.py +73 -0
- ciris_engine/schemas/persistence/postgres/__init__.py +1 -0
- ciris_engine/schemas/persistence/postgres/tables.py +280 -0
- ciris_engine/schemas/persistence/sqlite/__init__.py +1 -0
- ciris_engine/schemas/persistence/sqlite/tables.py +281 -0
- ciris_engine/schemas/platform.py +149 -0
- ciris_engine/schemas/processors/__init__.py +26 -0
- ciris_engine/schemas/processors/base.py +130 -0
- ciris_engine/schemas/processors/cognitive.py +77 -0
- ciris_engine/schemas/processors/context.py +35 -0
- ciris_engine/schemas/processors/core.py +152 -0
- ciris_engine/schemas/processors/dma.py +105 -0
- ciris_engine/schemas/processors/error.py +122 -0
- ciris_engine/schemas/processors/main.py +109 -0
- ciris_engine/schemas/processors/phase_results.py +21 -0
- ciris_engine/schemas/processors/results.py +99 -0
- ciris_engine/schemas/processors/solitude.py +79 -0
- ciris_engine/schemas/processors/state.py +202 -0
- ciris_engine/schemas/processors/state_example.py +177 -0
- ciris_engine/schemas/processors/states.py +21 -0
- ciris_engine/schemas/processors/status.py +34 -0
- ciris_engine/schemas/registries/__init__.py +1 -0
- ciris_engine/schemas/registries/base.py +66 -0
- ciris_engine/schemas/resources/__init__.py +15 -0
- ciris_engine/schemas/resources/crisis.py +315 -0
- ciris_engine/schemas/runtime/__init__.py +42 -0
- ciris_engine/schemas/runtime/adapter_management.py +186 -0
- ciris_engine/schemas/runtime/api.py +58 -0
- ciris_engine/schemas/runtime/audit.py +50 -0
- ciris_engine/schemas/runtime/bootstrap.py +33 -0
- ciris_engine/schemas/runtime/contexts.py +61 -0
- ciris_engine/schemas/runtime/core.py +161 -0
- ciris_engine/schemas/runtime/enums.py +167 -0
- ciris_engine/schemas/runtime/extended.py +232 -0
- ciris_engine/schemas/runtime/manifest.py +311 -0
- ciris_engine/schemas/runtime/memory.py +60 -0
- ciris_engine/schemas/runtime/messages.py +108 -0
- ciris_engine/schemas/runtime/models.py +156 -0
- ciris_engine/schemas/runtime/processing_context.py +43 -0
- ciris_engine/schemas/runtime/protocols_core.py +96 -0
- ciris_engine/schemas/runtime/resources.py +33 -0
- ciris_engine/schemas/runtime/system_context.py +417 -0
- ciris_engine/schemas/secrets/__init__.py +1 -0
- ciris_engine/schemas/secrets/core.py +267 -0
- ciris_engine/schemas/secrets/service.py +95 -0
- ciris_engine/schemas/services/__init__.py +33 -0
- ciris_engine/schemas/services/audit_summary_node.py +172 -0
- ciris_engine/schemas/services/authority/__init__.py +39 -0
- ciris_engine/schemas/services/authority/jwt.py +158 -0
- ciris_engine/schemas/services/authority/wa_updates.py +138 -0
- ciris_engine/schemas/services/authority/wise_authority.py +163 -0
- ciris_engine/schemas/services/authority_core.py +370 -0
- ciris_engine/schemas/services/capabilities.py +72 -0
- ciris_engine/schemas/services/community_core.py +95 -0
- ciris_engine/schemas/services/context.py +111 -0
- ciris_engine/schemas/services/conversation_summary_node.py +189 -0
- ciris_engine/schemas/services/core/__init__.py +153 -0
- ciris_engine/schemas/services/core/runtime.py +262 -0
- ciris_engine/schemas/services/core/runtime_config.py +117 -0
- ciris_engine/schemas/services/core/secrets.py +65 -0
- ciris_engine/schemas/services/correlation_node.py +179 -0
- ciris_engine/schemas/services/credit_gate.py +92 -0
- ciris_engine/schemas/services/discord_nodes.py +299 -0
- ciris_engine/schemas/services/feedback_core.py +131 -0
- ciris_engine/schemas/services/filters_core.py +270 -0
- ciris_engine/schemas/services/governance.py +26 -0
- ciris_engine/schemas/services/graph/__init__.py +26 -0
- ciris_engine/schemas/services/graph/attributes.py +254 -0
- ciris_engine/schemas/services/graph/audit.py +98 -0
- ciris_engine/schemas/services/graph/consolidation.py +338 -0
- ciris_engine/schemas/services/graph/edge_types.py +43 -0
- ciris_engine/schemas/services/graph/edges.py +88 -0
- ciris_engine/schemas/services/graph/incident.py +312 -0
- ciris_engine/schemas/services/graph/memory.py +84 -0
- ciris_engine/schemas/services/graph/node_data.py +174 -0
- ciris_engine/schemas/services/graph/query_results.py +82 -0
- ciris_engine/schemas/services/graph/telemetry.py +250 -0
- ciris_engine/schemas/services/graph/tsdb_consolidation.py +27 -0
- ciris_engine/schemas/services/graph/tsdb_models.py +107 -0
- ciris_engine/schemas/services/graph_core.py +196 -0
- ciris_engine/schemas/services/graph_typed_nodes.py +194 -0
- ciris_engine/schemas/services/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/services/infrastructure/resource_monitor.py +20 -0
- ciris_engine/schemas/services/lifecycle/__init__.py +9 -0
- ciris_engine/schemas/services/lifecycle/initialization.py +33 -0
- ciris_engine/schemas/services/lifecycle/time.py +50 -0
- ciris_engine/schemas/services/llm.py +187 -0
- ciris_engine/schemas/services/metadata.py +43 -0
- ciris_engine/schemas/services/nodes.py +704 -0
- ciris_engine/schemas/services/operations.py +126 -0
- ciris_engine/schemas/services/requests.py +128 -0
- ciris_engine/schemas/services/resources_core.py +182 -0
- ciris_engine/schemas/services/runtime_control.py +1010 -0
- ciris_engine/schemas/services/shutdown.py +88 -0
- ciris_engine/schemas/services/special/__init__.py +0 -0
- ciris_engine/schemas/services/special/self_observation.py +396 -0
- ciris_engine/schemas/services/trace_summary_node.py +199 -0
- ciris_engine/schemas/services/visibility.py +98 -0
- ciris_engine/schemas/streaming/__init__.py +10 -0
- ciris_engine/schemas/streaming/reasoning_stream.py +95 -0
- ciris_engine/schemas/telemetry/__init__.py +0 -0
- ciris_engine/schemas/telemetry/collector.py +67 -0
- ciris_engine/schemas/telemetry/core.py +252 -0
- ciris_engine/schemas/telemetry/unified.py +59 -0
- ciris_engine/schemas/tools.py +72 -0
- ciris_engine/schemas/types.py +47 -0
- ciris_engine/schemas/utils/__init__.py +1 -0
- ciris_engine/schemas/utils/config_validator.py +54 -0
- ciris_engine/utils/__init__.py +1 -0
- ciris_engine/utils/serialization.py +35 -0
- ciris_sdk/__init__.py +124 -0
- ciris_sdk/auth_store.py +261 -0
- ciris_sdk/client.py +261 -0
- ciris_sdk/exceptions.py +73 -0
- ciris_sdk/model_types.py +258 -0
- ciris_sdk/models.py +354 -0
- ciris_sdk/pagination.py +214 -0
- ciris_sdk/rate_limiter.py +188 -0
- ciris_sdk/setup.py +17 -0
- ciris_sdk/telemetry_models.py +257 -0
- ciris_sdk/telemetry_responses.py +199 -0
- ciris_sdk/transport.py +177 -0
- ciris_sdk/websocket.py +400 -0
- main.py +766 -0
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Centralized directory setup for CIRIS.
|
|
3
|
+
|
|
4
|
+
Ensures all required directories exist with correct permissions
|
|
5
|
+
before the application starts. FAILS FAST with clear error messages.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import shutil
|
|
10
|
+
import sqlite3
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import TYPE_CHECKING, Dict, Optional, Tuple
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ciris_engine.schemas.config.essential import EssentialConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DirectorySetupError(Exception):
|
|
20
|
+
"""Base exception for directory setup failures."""
|
|
21
|
+
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PermissionError(DirectorySetupError):
|
|
26
|
+
"""Raised when directory permissions are incorrect and cannot be fixed."""
|
|
27
|
+
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class DiskSpaceError(DirectorySetupError):
|
|
32
|
+
"""Raised when insufficient disk space is available."""
|
|
33
|
+
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class DirectoryCreationError(DirectorySetupError):
|
|
38
|
+
"""Raised when a directory cannot be created."""
|
|
39
|
+
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class OwnershipError(DirectorySetupError):
|
|
44
|
+
"""Raised when ownership cannot be fixed."""
|
|
45
|
+
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _get_file_owner_info(stat_info: os.stat_result) -> Tuple[str, str]:
|
|
50
|
+
"""Get owner and group names from file stat info (cross-platform).
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
stat_info: os.stat_result object
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Tuple of (owner, group) as strings
|
|
57
|
+
"""
|
|
58
|
+
# pwd/grp are Unix-only, not available on Windows
|
|
59
|
+
try:
|
|
60
|
+
import grp
|
|
61
|
+
import pwd
|
|
62
|
+
|
|
63
|
+
owner = pwd.getpwuid(stat_info.st_uid).pw_name
|
|
64
|
+
group = grp.getgrgid(stat_info.st_gid).gr_name
|
|
65
|
+
except (ImportError, KeyError, OSError):
|
|
66
|
+
owner = str(stat_info.st_uid)
|
|
67
|
+
group = str(stat_info.st_gid)
|
|
68
|
+
|
|
69
|
+
return owner, group
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class WriteTestError(DirectorySetupError):
|
|
73
|
+
"""Raised when write test fails."""
|
|
74
|
+
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class DatabaseAccessError(DirectorySetupError):
|
|
79
|
+
"""Raised when database cannot be accessed exclusively."""
|
|
80
|
+
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def ensure_database_exclusive_access(db_path: str, fail_fast: bool = True) -> None:
|
|
85
|
+
"""
|
|
86
|
+
Ensure only one agent can run on this database using WAL Mode + Busy Timeout.
|
|
87
|
+
|
|
88
|
+
Uses SQLite's WAL (Write-Ahead Logging) mode with IMMEDIATE transaction
|
|
89
|
+
to detect if another process is already using the database.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
db_path: Path to the SQLite database file or PostgreSQL connection string
|
|
93
|
+
fail_fast: If True, exit immediately on access conflict (default True)
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
DatabaseAccessError: If database is already in use by another agent
|
|
97
|
+
"""
|
|
98
|
+
# Skip exclusive access check for PostgreSQL (connection string starts with "postgresql://")
|
|
99
|
+
if db_path.startswith(("postgresql://", "postgres://")):
|
|
100
|
+
print(f"✓ Skipping exclusive access check for PostgreSQL: {db_path}")
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
db_path_obj = Path(db_path)
|
|
104
|
+
|
|
105
|
+
# Create database parent directory if needed
|
|
106
|
+
db_path_obj.parent.mkdir(parents=True, exist_ok=True)
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
# Quick connectivity test with minimal timeout
|
|
110
|
+
# Using timeout=0.1 to fail fast if database is locked
|
|
111
|
+
conn = sqlite3.connect(db_path, timeout=0.1)
|
|
112
|
+
|
|
113
|
+
# Enable WAL mode for better concurrency detection
|
|
114
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
115
|
+
|
|
116
|
+
# Attempt exclusive lock - this will fail immediately if another agent is running
|
|
117
|
+
conn.execute("BEGIN IMMEDIATE") # Exclusive lock attempt
|
|
118
|
+
conn.rollback() # Release the lock immediately
|
|
119
|
+
conn.close()
|
|
120
|
+
|
|
121
|
+
print(f"✓ Database exclusive access confirmed: {db_path}")
|
|
122
|
+
|
|
123
|
+
except sqlite3.OperationalError as e:
|
|
124
|
+
error_msg = f"CANNOT ACCESS DATABASE {db_path} - ANOTHER AGENT MAY BE RUNNING"
|
|
125
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
126
|
+
print(f" SQLite Error: {e}", file=sys.stderr)
|
|
127
|
+
print(f" Only one CIRIS agent can run per database file", file=sys.stderr)
|
|
128
|
+
print(f" Check for other running agents using: ps aux | grep ciris", file=sys.stderr)
|
|
129
|
+
|
|
130
|
+
if fail_fast:
|
|
131
|
+
sys.exit(1)
|
|
132
|
+
raise DatabaseAccessError(error_msg)
|
|
133
|
+
|
|
134
|
+
except Exception as e:
|
|
135
|
+
error_msg = f"UNEXPECTED DATABASE ERROR for {db_path}: {e}"
|
|
136
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
137
|
+
|
|
138
|
+
if fail_fast:
|
|
139
|
+
sys.exit(1)
|
|
140
|
+
raise DatabaseAccessError(error_msg)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def check_disk_space(path: Path, required_mb: int = 100) -> Tuple[bool, float]:
|
|
144
|
+
"""
|
|
145
|
+
Check if sufficient disk space is available.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
path: Path to check disk space for
|
|
149
|
+
required_mb: Required space in megabytes (default 100MB)
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Tuple of (has_enough_space, available_mb)
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
stat = shutil.disk_usage(path if path.exists() else path.parent)
|
|
156
|
+
available_mb = stat.free / (1024 * 1024)
|
|
157
|
+
return available_mb >= required_mb, available_mb
|
|
158
|
+
except Exception as e:
|
|
159
|
+
# If we can't check disk space, assume it's insufficient
|
|
160
|
+
print(f"ERROR: Cannot check disk space: {e}")
|
|
161
|
+
return False, 0.0
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _check_disk_space_or_fail(base_dir: Path, fail_fast: bool) -> None:
|
|
165
|
+
"""Check disk space and fail if insufficient."""
|
|
166
|
+
has_space, available_mb = check_disk_space(base_dir)
|
|
167
|
+
if not has_space:
|
|
168
|
+
error_msg = f"INSUFFICIENT DISK SPACE: Only {available_mb:.1f}MB available. MINIMUM 100MB REQUIRED - EXITING"
|
|
169
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
170
|
+
if fail_fast:
|
|
171
|
+
sys.exit(1)
|
|
172
|
+
raise DiskSpaceError(error_msg)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _create_directory(dir_path: Path, mode: int, fail_fast: bool) -> None:
|
|
176
|
+
"""Create a single directory with specified permissions."""
|
|
177
|
+
if not dir_path.exists():
|
|
178
|
+
dir_path.mkdir(parents=True, mode=mode)
|
|
179
|
+
print(f"✓ Created directory: {dir_path} with mode {oct(mode)}")
|
|
180
|
+
|
|
181
|
+
# Verify creation
|
|
182
|
+
if not dir_path.exists():
|
|
183
|
+
error_msg = f"UNABLE TO CREATE DIRECTORY {dir_path} - CHECK FILESYSTEM"
|
|
184
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
185
|
+
if fail_fast:
|
|
186
|
+
sys.exit(1)
|
|
187
|
+
raise DirectoryCreationError(error_msg)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _fix_directory_permissions(dir_path: Path, mode: int, fail_fast: bool) -> None:
|
|
191
|
+
"""Fix permissions on existing directory."""
|
|
192
|
+
current_mode = dir_path.stat().st_mode & 0o777
|
|
193
|
+
if current_mode != mode:
|
|
194
|
+
try:
|
|
195
|
+
dir_path.chmod(mode)
|
|
196
|
+
print(f"✓ Fixed permissions for {dir_path}: {oct(current_mode)} -> {oct(mode)}")
|
|
197
|
+
except Exception as perm_error:
|
|
198
|
+
error_msg = f"WRONG PERMS on {dir_path}: Has {oct(current_mode)}, needs {oct(mode)} - CANNOT FIX - EXITING"
|
|
199
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
200
|
+
print(f" Details: {perm_error}", file=sys.stderr)
|
|
201
|
+
if fail_fast:
|
|
202
|
+
sys.exit(1)
|
|
203
|
+
raise PermissionError(error_msg)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _check_directory_ownership(dir_path: Path, user_id: int, group_id: int, fail_fast: bool) -> None:
|
|
207
|
+
"""Check and fix directory ownership."""
|
|
208
|
+
# Skip ownership check on Windows (user_id/group_id will be -1)
|
|
209
|
+
if user_id == -1 or group_id == -1:
|
|
210
|
+
return
|
|
211
|
+
|
|
212
|
+
stat = dir_path.stat()
|
|
213
|
+
if stat.st_uid != user_id or stat.st_gid != group_id:
|
|
214
|
+
try:
|
|
215
|
+
# os.chown is Unix-only
|
|
216
|
+
if hasattr(os, "chown"):
|
|
217
|
+
os.chown(dir_path, user_id, group_id)
|
|
218
|
+
print(f"✓ Fixed ownership for {dir_path}: {stat.st_uid}:{stat.st_gid} -> {user_id}:{group_id}")
|
|
219
|
+
else:
|
|
220
|
+
# Windows doesn't have chown
|
|
221
|
+
return
|
|
222
|
+
except Exception:
|
|
223
|
+
error_msg = (
|
|
224
|
+
f"WRONG OWNER on {dir_path}: Has {stat.st_uid}:{stat.st_gid}, needs {user_id}:{group_id} - CANNOT FIX"
|
|
225
|
+
)
|
|
226
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
227
|
+
print(f" Try: sudo chown {user_id}:{group_id} {dir_path}", file=sys.stderr)
|
|
228
|
+
if fail_fast:
|
|
229
|
+
sys.exit(1)
|
|
230
|
+
raise OwnershipError(error_msg)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _check_directory_writability(dir_path: Path, fail_fast: bool) -> None:
|
|
234
|
+
"""Test if directory is writable."""
|
|
235
|
+
test_file = dir_path / ".write_test"
|
|
236
|
+
try:
|
|
237
|
+
test_file.touch()
|
|
238
|
+
test_file.unlink()
|
|
239
|
+
except Exception as write_error:
|
|
240
|
+
error_msg = f"CANNOT WRITE TO {dir_path} - CHECK PERMISSIONS AND FILESYSTEM"
|
|
241
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
242
|
+
print(f" Error: {write_error}", file=sys.stderr)
|
|
243
|
+
if fail_fast:
|
|
244
|
+
sys.exit(1)
|
|
245
|
+
raise WriteTestError(error_msg)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def setup_application_directories(
|
|
249
|
+
base_dir: Optional[Path] = None,
|
|
250
|
+
user_id: Optional[int] = None,
|
|
251
|
+
group_id: Optional[int] = None,
|
|
252
|
+
fail_fast: bool = True,
|
|
253
|
+
check_database_access: bool = True,
|
|
254
|
+
essential_config: Optional["EssentialConfig"] = None,
|
|
255
|
+
) -> None:
|
|
256
|
+
"""
|
|
257
|
+
Set up all required application directories with correct permissions.
|
|
258
|
+
|
|
259
|
+
FAILS FAST with clear error messages if directories cannot be created
|
|
260
|
+
or permissions cannot be set correctly.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
base_dir: Base directory for the application (defaults to CIRIS home directory)
|
|
264
|
+
user_id: User ID to own the directories (defaults to current user)
|
|
265
|
+
group_id: Group ID to own the directories (defaults to current group)
|
|
266
|
+
fail_fast: If True, exit immediately on any error (default True)
|
|
267
|
+
check_database_access: If True, verify exclusive database access (default True)
|
|
268
|
+
essential_config: Optional EssentialConfig for database path (avoids service registry lookup)
|
|
269
|
+
|
|
270
|
+
Raises:
|
|
271
|
+
DirectorySetupError: If any directory setup fails
|
|
272
|
+
"""
|
|
273
|
+
if base_dir is None:
|
|
274
|
+
from ciris_engine.logic.utils.path_resolution import get_ciris_home
|
|
275
|
+
|
|
276
|
+
base_dir = get_ciris_home()
|
|
277
|
+
|
|
278
|
+
if user_id is None:
|
|
279
|
+
# getuid/getgid are Unix-only, not available on Windows
|
|
280
|
+
user_id = getattr(os, "getuid", lambda: -1)()
|
|
281
|
+
|
|
282
|
+
if group_id is None:
|
|
283
|
+
# getuid/getgid are Unix-only, not available on Windows
|
|
284
|
+
group_id = getattr(os, "getgid", lambda: -1)()
|
|
285
|
+
|
|
286
|
+
# First, ensure exclusive database access (before any other checks)
|
|
287
|
+
if check_database_access:
|
|
288
|
+
if essential_config:
|
|
289
|
+
# Use the provided config directly
|
|
290
|
+
# Prefer database_url (for PostgreSQL), fallback to main_db path (for SQLite)
|
|
291
|
+
if essential_config.database.database_url:
|
|
292
|
+
main_db_path = essential_config.database.database_url
|
|
293
|
+
else:
|
|
294
|
+
main_db_path = str(Path(essential_config.database.main_db).resolve())
|
|
295
|
+
ensure_database_exclusive_access(main_db_path, fail_fast)
|
|
296
|
+
else:
|
|
297
|
+
# Try to get config from service registry
|
|
298
|
+
try:
|
|
299
|
+
from ciris_engine.logic.config import get_sqlite_db_full_path
|
|
300
|
+
|
|
301
|
+
main_db_path = get_sqlite_db_full_path()
|
|
302
|
+
ensure_database_exclusive_access(main_db_path, fail_fast)
|
|
303
|
+
except (ImportError, RuntimeError):
|
|
304
|
+
# During early bootstrap, config may not be available yet
|
|
305
|
+
# Default to checking the most likely database path
|
|
306
|
+
default_db_path = str(base_dir / "data" / "ciris_engine.db")
|
|
307
|
+
ensure_database_exclusive_access(default_db_path, fail_fast)
|
|
308
|
+
|
|
309
|
+
# Check disk space
|
|
310
|
+
_check_disk_space_or_fail(base_dir, fail_fast)
|
|
311
|
+
|
|
312
|
+
# Define directories and their required permissions
|
|
313
|
+
# 0o755 = rwxr-xr-x (readable by all, writable by owner)
|
|
314
|
+
# 0o700 = rwx------ (only owner can read/write/execute)
|
|
315
|
+
directories: Dict[str, int] = {
|
|
316
|
+
"data": 0o755, # Database files
|
|
317
|
+
"data_archive": 0o755, # Archived thoughts/tasks
|
|
318
|
+
"logs": 0o755, # Log files
|
|
319
|
+
"audit_keys": 0o700, # Sensitive audit keys - restricted!
|
|
320
|
+
"config": 0o755, # Configuration files
|
|
321
|
+
".secrets": 0o700, # Secrets storage - restricted!
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
for dir_name, mode in directories.items():
|
|
325
|
+
dir_path = base_dir / dir_name
|
|
326
|
+
|
|
327
|
+
try:
|
|
328
|
+
# Create or verify directory
|
|
329
|
+
_create_directory(dir_path, mode, fail_fast)
|
|
330
|
+
|
|
331
|
+
# Check and fix permissions if directory exists
|
|
332
|
+
if dir_path.exists():
|
|
333
|
+
_fix_directory_permissions(dir_path, mode, fail_fast)
|
|
334
|
+
|
|
335
|
+
# Test write access
|
|
336
|
+
_check_directory_writability(dir_path, fail_fast)
|
|
337
|
+
|
|
338
|
+
# Try to fix ownership (non-fatal if fails)
|
|
339
|
+
try:
|
|
340
|
+
_check_directory_ownership(dir_path, user_id, group_id, False)
|
|
341
|
+
except (OwnershipError, SystemExit): # noqa: S110
|
|
342
|
+
# Not fatal if we can't change ownership as long as we can write
|
|
343
|
+
print(f" Warning: Cannot change ownership of {dir_path} (need root), but write access confirmed")
|
|
344
|
+
|
|
345
|
+
except (DirectorySetupError, SystemExit):
|
|
346
|
+
raise # Re-raise our own exceptions and exits
|
|
347
|
+
except Exception as e:
|
|
348
|
+
error_msg = f"UNEXPECTED ERROR setting up {dir_path}: {e}"
|
|
349
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
350
|
+
if fail_fast:
|
|
351
|
+
sys.exit(1)
|
|
352
|
+
raise DirectorySetupError(error_msg)
|
|
353
|
+
|
|
354
|
+
# Check critical files that must be writable
|
|
355
|
+
critical_files = [
|
|
356
|
+
base_dir / "audit_logs.jsonl", # Audit service export file
|
|
357
|
+
]
|
|
358
|
+
|
|
359
|
+
for file_path in critical_files:
|
|
360
|
+
if file_path.exists():
|
|
361
|
+
# Check if we can write to it
|
|
362
|
+
try:
|
|
363
|
+
# Try to open in append mode (won't truncate)
|
|
364
|
+
with open(file_path, "a"):
|
|
365
|
+
# Successfully opened for writing
|
|
366
|
+
pass
|
|
367
|
+
print(f"✓ Write access verified for {file_path}")
|
|
368
|
+
except (PermissionError, IOError) as e:
|
|
369
|
+
# Get file stats for debugging
|
|
370
|
+
stat = file_path.stat()
|
|
371
|
+
owner, group = _get_file_owner_info(stat)
|
|
372
|
+
|
|
373
|
+
error_msg = f"CANNOT WRITE TO CRITICAL FILE {file_path}"
|
|
374
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
375
|
+
print(f" Owner: {owner}:{group} (uid={stat.st_uid}, gid={stat.st_gid})", file=sys.stderr)
|
|
376
|
+
print(f" Permissions: {oct(stat.st_mode & 0o777)}", file=sys.stderr)
|
|
377
|
+
print(f" Current user: uid={user_id}, gid={group_id}", file=sys.stderr)
|
|
378
|
+
print(f" FIX: sudo chown {user_id}:{group_id} {file_path}", file=sys.stderr)
|
|
379
|
+
if fail_fast:
|
|
380
|
+
sys.exit(1)
|
|
381
|
+
raise PermissionError(error_msg)
|
|
382
|
+
|
|
383
|
+
print("✓ All directories and critical files successfully configured")
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def _validate_directory(dir_path: Path) -> None:
|
|
387
|
+
"""Validate a single directory exists and is writable."""
|
|
388
|
+
if not dir_path.exists():
|
|
389
|
+
error_msg = f"REQUIRED DIRECTORY MISSING: {dir_path} - EXITING"
|
|
390
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
391
|
+
raise DirectoryCreationError(error_msg)
|
|
392
|
+
|
|
393
|
+
if not dir_path.is_dir():
|
|
394
|
+
error_msg = f"PATH EXISTS BUT IS NOT A DIRECTORY: {dir_path} - EXITING"
|
|
395
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
396
|
+
raise DirectorySetupError(error_msg)
|
|
397
|
+
|
|
398
|
+
# Check write access
|
|
399
|
+
test_file = dir_path / ".write_test"
|
|
400
|
+
try:
|
|
401
|
+
test_file.touch()
|
|
402
|
+
test_file.unlink()
|
|
403
|
+
except Exception as e:
|
|
404
|
+
error_msg = f"CANNOT WRITE TO DIRECTORY: {dir_path} - CHECK PERMISSIONS"
|
|
405
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
406
|
+
print(f" Error: {e}", file=sys.stderr)
|
|
407
|
+
raise PermissionError(error_msg)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def _validate_file_permissions(file_path: Path) -> None:
|
|
411
|
+
"""Validate a file is writable if it exists."""
|
|
412
|
+
if not file_path.exists():
|
|
413
|
+
return # File doesn't exist, that's OK
|
|
414
|
+
|
|
415
|
+
try:
|
|
416
|
+
with open(file_path, "a"):
|
|
417
|
+
# File is writable
|
|
418
|
+
pass
|
|
419
|
+
except (PermissionError, IOError):
|
|
420
|
+
# Get file stats for debugging
|
|
421
|
+
stat = file_path.stat()
|
|
422
|
+
owner, group = _get_file_owner_info(stat)
|
|
423
|
+
|
|
424
|
+
# getuid/getgid are Unix-only, not available on Windows
|
|
425
|
+
current_uid = getattr(os, "getuid", lambda: -1)()
|
|
426
|
+
current_gid = getattr(os, "getgid", lambda: -1)()
|
|
427
|
+
|
|
428
|
+
error_msg = f"CANNOT WRITE TO CRITICAL FILE {file_path}"
|
|
429
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
430
|
+
print(f" Owner: {owner}:{group} (uid={stat.st_uid}, gid={stat.st_gid})", file=sys.stderr)
|
|
431
|
+
print(f" Permissions: {oct(stat.st_mode & 0o777)}", file=sys.stderr)
|
|
432
|
+
print(f" Current user: uid={current_uid}, gid={current_gid}", file=sys.stderr)
|
|
433
|
+
print(f" FIX: sudo chown {current_uid}:{current_gid} {file_path}", file=sys.stderr)
|
|
434
|
+
raise PermissionError(error_msg)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def validate_directories(base_dir: Optional[Path] = None) -> bool:
|
|
438
|
+
"""
|
|
439
|
+
Validate that all required directories exist and are writable.
|
|
440
|
+
|
|
441
|
+
This is a lighter-weight check suitable for production where
|
|
442
|
+
directories should already exist.
|
|
443
|
+
|
|
444
|
+
Args:
|
|
445
|
+
base_dir: Base directory for the application
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
True if all directories are valid
|
|
449
|
+
|
|
450
|
+
Raises:
|
|
451
|
+
DirectorySetupError: If validation fails
|
|
452
|
+
"""
|
|
453
|
+
if base_dir is None:
|
|
454
|
+
base_dir = Path.cwd()
|
|
455
|
+
|
|
456
|
+
# Check disk space first
|
|
457
|
+
_check_disk_space_or_fail(base_dir, False)
|
|
458
|
+
|
|
459
|
+
required_dirs = ["data", "data_archive", "logs", "audit_keys", "config"]
|
|
460
|
+
|
|
461
|
+
for dir_name in required_dirs:
|
|
462
|
+
dir_path = base_dir / dir_name
|
|
463
|
+
_validate_directory(dir_path)
|
|
464
|
+
|
|
465
|
+
# Check critical files if they exist
|
|
466
|
+
critical_files = [
|
|
467
|
+
base_dir / "audit_logs.jsonl", # Audit service export file
|
|
468
|
+
]
|
|
469
|
+
|
|
470
|
+
for file_path in critical_files:
|
|
471
|
+
if file_path.exists():
|
|
472
|
+
# Check if we can write to it
|
|
473
|
+
try:
|
|
474
|
+
with open(file_path, "a"):
|
|
475
|
+
# File is writable
|
|
476
|
+
pass
|
|
477
|
+
except (PermissionError, IOError):
|
|
478
|
+
# Get file stats for debugging
|
|
479
|
+
stat = file_path.stat()
|
|
480
|
+
|
|
481
|
+
# pwd/grp are Unix-only, not available on Windows
|
|
482
|
+
try:
|
|
483
|
+
import grp
|
|
484
|
+
import pwd
|
|
485
|
+
|
|
486
|
+
owner = pwd.getpwuid(stat.st_uid).pw_name
|
|
487
|
+
group = grp.getgrgid(stat.st_gid).gr_name
|
|
488
|
+
except (ImportError, KeyError, OSError):
|
|
489
|
+
owner = str(stat.st_uid)
|
|
490
|
+
group = str(stat.st_gid)
|
|
491
|
+
|
|
492
|
+
# getuid/getgid are Unix-only, not available on Windows
|
|
493
|
+
current_uid = getattr(os, "getuid", lambda: -1)()
|
|
494
|
+
current_gid = getattr(os, "getgid", lambda: -1)()
|
|
495
|
+
|
|
496
|
+
error_msg = f"CANNOT WRITE TO CRITICAL FILE: {file_path}"
|
|
497
|
+
print(f"CRITICAL ERROR: {error_msg}", file=sys.stderr)
|
|
498
|
+
print(f" Owner: {owner}:{group} (uid={stat.st_uid}, gid={stat.st_gid})", file=sys.stderr)
|
|
499
|
+
print(f" Permissions: {oct(stat.st_mode & 0o777)}", file=sys.stderr)
|
|
500
|
+
print(f" Current user: uid={current_uid}, gid={current_gid}", file=sys.stderr)
|
|
501
|
+
print(f" FIX: sudo chown {current_uid}:{current_gid} {file_path}", file=sys.stderr)
|
|
502
|
+
raise PermissionError(error_msg)
|
|
503
|
+
|
|
504
|
+
print("✓ All directories and critical files validated successfully")
|
|
505
|
+
return True
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
if __name__ == "__main__":
|
|
509
|
+
# Run setup when executed directly
|
|
510
|
+
import argparse
|
|
511
|
+
|
|
512
|
+
parser = argparse.ArgumentParser(description="CIRIS Directory Setup")
|
|
513
|
+
parser.add_argument(
|
|
514
|
+
"--validate-only", action="store_true", help="Only validate existing directories (for production)"
|
|
515
|
+
)
|
|
516
|
+
parser.add_argument("--no-fail-fast", action="store_true", help="Continue on errors instead of exiting")
|
|
517
|
+
args = parser.parse_args()
|
|
518
|
+
|
|
519
|
+
try:
|
|
520
|
+
if args.validate_only:
|
|
521
|
+
print("Validating CIRIS application directories...")
|
|
522
|
+
validate_directories()
|
|
523
|
+
else:
|
|
524
|
+
print("Setting up CIRIS application directories...")
|
|
525
|
+
setup_application_directories(fail_fast=not args.no_fail_fast)
|
|
526
|
+
|
|
527
|
+
print("\n✓ SUCCESS: All directories properly configured!")
|
|
528
|
+
except DirectorySetupError as e:
|
|
529
|
+
print(f"\n✗ FAILED: {e}", file=sys.stderr)
|
|
530
|
+
sys.exit(1)
|
|
531
|
+
except Exception as e:
|
|
532
|
+
print(f"\n✗ UNEXPECTED ERROR: {e}", file=sys.stderr)
|
|
533
|
+
sys.exit(1)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, Optional, Set
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from ciris_engine.logic.config.env_utils import get_env_var
|
|
7
|
+
from ciris_engine.logic.services.graph.memory_service import LocalGraphMemoryService
|
|
8
|
+
from ciris_engine.schemas.adapters.graphql_core import (
|
|
9
|
+
EnrichedContext,
|
|
10
|
+
GraphQLQuery,
|
|
11
|
+
GraphQLResponse,
|
|
12
|
+
GraphQLUserProfile,
|
|
13
|
+
UserAttribute,
|
|
14
|
+
UserQueryResponse,
|
|
15
|
+
UserQueryVariables,
|
|
16
|
+
)
|
|
17
|
+
from ciris_engine.schemas.services.graph_core import GraphScope, NodeType
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class GraphQLClient:
|
|
23
|
+
def __init__(self, endpoint: str | None = None) -> None:
|
|
24
|
+
self.endpoint = endpoint or get_env_var("GRAPHQL_ENDPOINT", "https://localhost:8000/graphql")
|
|
25
|
+
self._client = httpx.AsyncClient(timeout=3.0)
|
|
26
|
+
|
|
27
|
+
async def query(self, query_obj: GraphQLQuery) -> GraphQLResponse:
|
|
28
|
+
try:
|
|
29
|
+
# Ensure endpoint is not None
|
|
30
|
+
if self.endpoint is None:
|
|
31
|
+
raise ValueError("GraphQL endpoint is not configured")
|
|
32
|
+
payload = {"query": query_obj.query, "variables": query_obj.variables.model_dump()}
|
|
33
|
+
if query_obj.operation_name:
|
|
34
|
+
payload["operationName"] = query_obj.operation_name
|
|
35
|
+
|
|
36
|
+
resp = await self._client.post(self.endpoint, json=payload)
|
|
37
|
+
resp.raise_for_status()
|
|
38
|
+
data = resp.json()
|
|
39
|
+
return GraphQLResponse.model_validate(data)
|
|
40
|
+
except Exception as exc:
|
|
41
|
+
logger.error("GraphQL query failed: %s", exc)
|
|
42
|
+
return GraphQLResponse()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class GraphQLContextProvider:
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
graphql_client: GraphQLClient | None = None,
|
|
49
|
+
memory_service: Optional[LocalGraphMemoryService] = None,
|
|
50
|
+
enable_remote_graphql: bool = False,
|
|
51
|
+
) -> None:
|
|
52
|
+
self.enable_remote_graphql = enable_remote_graphql
|
|
53
|
+
self.client: Optional[GraphQLClient]
|
|
54
|
+
if enable_remote_graphql:
|
|
55
|
+
self.client = graphql_client or GraphQLClient()
|
|
56
|
+
else:
|
|
57
|
+
self.client = graphql_client
|
|
58
|
+
self.memory_service = memory_service
|
|
59
|
+
|
|
60
|
+
async def enrich_context(self, task: Any, thought: Any = None) -> EnrichedContext:
|
|
61
|
+
authors: Set[str] = set()
|
|
62
|
+
|
|
63
|
+
# Extract author names from task context
|
|
64
|
+
if task and hasattr(task, "context"):
|
|
65
|
+
if hasattr(task.context, "initial_task_context") and task.context.initial_task_context:
|
|
66
|
+
if hasattr(task.context.initial_task_context, "author_name"):
|
|
67
|
+
authors.add(task.context.initial_task_context.author_name)
|
|
68
|
+
elif isinstance(task.context, dict) and "author_name" in task.context:
|
|
69
|
+
authors.add(task.context["author_name"])
|
|
70
|
+
|
|
71
|
+
# Extract author names from thought context
|
|
72
|
+
if thought and hasattr(thought, "context"):
|
|
73
|
+
if hasattr(thought.context, "initial_task_context") and thought.context.initial_task_context:
|
|
74
|
+
if hasattr(thought.context.initial_task_context, "author_name"):
|
|
75
|
+
authors.add(thought.context.initial_task_context.author_name)
|
|
76
|
+
elif isinstance(thought.context, dict) and "author_name" in thought.context:
|
|
77
|
+
authors.add(thought.context["author_name"])
|
|
78
|
+
|
|
79
|
+
if not authors:
|
|
80
|
+
return EnrichedContext()
|
|
81
|
+
|
|
82
|
+
query_str = """
|
|
83
|
+
query($names:[String!]!){
|
|
84
|
+
users(names:$names){ name nick channel }
|
|
85
|
+
}
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
user_profiles: Dict[str, GraphQLUserProfile] = {}
|
|
89
|
+
|
|
90
|
+
if self.enable_remote_graphql and self.client:
|
|
91
|
+
query_obj = GraphQLQuery(query=query_str, variables=UserQueryVariables(names=list(authors)))
|
|
92
|
+
response = await self.client.query(query_obj)
|
|
93
|
+
|
|
94
|
+
if response.data and "users" in response.data:
|
|
95
|
+
try:
|
|
96
|
+
user_response = UserQueryResponse.model_validate(response.data)
|
|
97
|
+
for user in user_response.users:
|
|
98
|
+
user_profiles[user.name] = GraphQLUserProfile(nick=user.nick, channel=user.channel)
|
|
99
|
+
except Exception as exc:
|
|
100
|
+
logger.warning("Failed to parse user query response: %s", exc)
|
|
101
|
+
|
|
102
|
+
# Get missing users from memory service using search
|
|
103
|
+
missing = [name for name in authors if name not in user_profiles and name is not None]
|
|
104
|
+
if self.memory_service and missing:
|
|
105
|
+
from ciris_engine.schemas.services.graph.memory import MemorySearchFilter
|
|
106
|
+
|
|
107
|
+
# Search for each missing user by name
|
|
108
|
+
for name in missing:
|
|
109
|
+
if not name:
|
|
110
|
+
continue
|
|
111
|
+
try:
|
|
112
|
+
# Use search to find user nodes that match the username
|
|
113
|
+
search_filter = MemorySearchFilter(node_type=NodeType.USER.value, scope=GraphScope.LOCAL.value)
|
|
114
|
+
logger.debug(f"[DEBUG DB TIMING] Searching memory for user profile: {name}")
|
|
115
|
+
search_results = await self.memory_service.search(query=name, filters=search_filter)
|
|
116
|
+
logger.info(
|
|
117
|
+
f"[DEBUG DB TIMING] User search complete: found {len(search_results)} results for {name}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Look for exact username match in attributes
|
|
121
|
+
for node in search_results:
|
|
122
|
+
if node.attributes:
|
|
123
|
+
attrs = (
|
|
124
|
+
node.attributes if isinstance(node.attributes, dict) else node.attributes.model_dump()
|
|
125
|
+
)
|
|
126
|
+
# Check if this node has the username we're looking for
|
|
127
|
+
if (
|
|
128
|
+
attrs.get("username") == name
|
|
129
|
+
or attrs.get("display_name") == name
|
|
130
|
+
or attrs.get("name") == name
|
|
131
|
+
):
|
|
132
|
+
# Convert attributes dict to UserAttribute list
|
|
133
|
+
user_attrs = [UserAttribute(key=k, value=str(v)) for k, v in attrs.items()]
|
|
134
|
+
user_profiles[name] = GraphQLUserProfile(attributes=user_attrs)
|
|
135
|
+
break
|
|
136
|
+
except Exception as exc:
|
|
137
|
+
logger.debug(f"Failed to search for user {name}: {exc}")
|
|
138
|
+
|
|
139
|
+
# Get identity context
|
|
140
|
+
identity_block = ""
|
|
141
|
+
if self.memory_service:
|
|
142
|
+
try:
|
|
143
|
+
identity_block = await self.memory_service.export_identity_context()
|
|
144
|
+
except Exception as exc:
|
|
145
|
+
logger.warning("Failed to export identity context: %s", exc)
|
|
146
|
+
|
|
147
|
+
# Convert user_profiles dict to list of tuples as expected by EnrichedContext
|
|
148
|
+
user_profiles_list = [(name, profile) for name, profile in user_profiles.items()]
|
|
149
|
+
|
|
150
|
+
return EnrichedContext(
|
|
151
|
+
user_profiles=user_profiles_list, identity_context=identity_block if identity_block else None
|
|
152
|
+
)
|