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,827 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Wise Authority Service - Authorization and Guidance
|
|
3
|
+
|
|
4
|
+
This service handles:
|
|
5
|
+
- Authorization checks (what can you do?)
|
|
6
|
+
- Decision deferrals to humans
|
|
7
|
+
- Guidance for complex situations
|
|
8
|
+
- Permission management
|
|
9
|
+
|
|
10
|
+
Authentication (who are you?) is handled by AuthenticationService.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
from datetime import datetime, timedelta
|
|
16
|
+
from typing import Dict, List, Optional, Union
|
|
17
|
+
|
|
18
|
+
from ciris_engine.logic.config import get_sqlite_db_full_path
|
|
19
|
+
from ciris_engine.logic.persistence.db.core import get_db_connection
|
|
20
|
+
from ciris_engine.logic.persistence.db.dialect import get_adapter
|
|
21
|
+
from ciris_engine.logic.services.base_service import BaseService
|
|
22
|
+
from ciris_engine.logic.services.infrastructure.authentication import AuthenticationService
|
|
23
|
+
from ciris_engine.protocols.services.governance.wise_authority import WiseAuthorityServiceProtocol
|
|
24
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
25
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
26
|
+
from ciris_engine.schemas.services.authority.wise_authority import PendingDeferral
|
|
27
|
+
from ciris_engine.schemas.services.authority_core import (
|
|
28
|
+
DeferralApprovalContext,
|
|
29
|
+
DeferralRequest,
|
|
30
|
+
DeferralResponse,
|
|
31
|
+
GuidanceRequest,
|
|
32
|
+
GuidanceResponse,
|
|
33
|
+
WAPermission,
|
|
34
|
+
WARole,
|
|
35
|
+
)
|
|
36
|
+
from ciris_engine.schemas.services.context import GuidanceContext
|
|
37
|
+
from ciris_engine.schemas.services.core import ServiceStatus
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class WiseAuthorityService(BaseService, WiseAuthorityServiceProtocol):
|
|
43
|
+
"""
|
|
44
|
+
Wise Authority Service for authorization and guidance.
|
|
45
|
+
|
|
46
|
+
Handles:
|
|
47
|
+
- Authorization checks
|
|
48
|
+
- Decision deferrals
|
|
49
|
+
- Guidance requests
|
|
50
|
+
- Permission management
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self, time_service: TimeServiceProtocol, auth_service: AuthenticationService, db_path: Optional[str] = None
|
|
55
|
+
) -> None:
|
|
56
|
+
"""Initialize the WA authorization service."""
|
|
57
|
+
# Initialize BaseService with time service
|
|
58
|
+
super().__init__(time_service=time_service)
|
|
59
|
+
|
|
60
|
+
# Use configured database if not specified
|
|
61
|
+
self.db_path = db_path or get_sqlite_db_full_path()
|
|
62
|
+
|
|
63
|
+
# Store injected services
|
|
64
|
+
self.auth_service = auth_service
|
|
65
|
+
|
|
66
|
+
# Metrics tracking
|
|
67
|
+
self._guidance_provided_count = 0
|
|
68
|
+
self._queries_handled_count = 0
|
|
69
|
+
|
|
70
|
+
# All deferrals and guidance are persisted in the database
|
|
71
|
+
|
|
72
|
+
logger.info(f"Consolidated WA Service initialized with DB: {self.db_path}")
|
|
73
|
+
|
|
74
|
+
def _get_placeholder(self) -> str:
|
|
75
|
+
"""Get the appropriate parameter placeholder for the current dialect."""
|
|
76
|
+
return get_adapter().placeholder()
|
|
77
|
+
|
|
78
|
+
def _get_context_json_like_clause(self) -> str:
|
|
79
|
+
"""Get the appropriate LIKE clause for context_json based on dialect."""
|
|
80
|
+
adapter = get_adapter()
|
|
81
|
+
placeholder = self._get_placeholder()
|
|
82
|
+
if adapter.is_postgresql():
|
|
83
|
+
return f"context_json::text LIKE {placeholder}"
|
|
84
|
+
else:
|
|
85
|
+
return f"context_json LIKE {placeholder}"
|
|
86
|
+
|
|
87
|
+
async def _on_start(self) -> None:
|
|
88
|
+
"""Custom startup logic for WA service."""
|
|
89
|
+
# Bootstrap if needed
|
|
90
|
+
await self.auth_service.bootstrap_if_needed()
|
|
91
|
+
|
|
92
|
+
# Deferrals are persisted in the thoughts table with status='deferred'
|
|
93
|
+
# They can be queried via get_pending_deferrals()
|
|
94
|
+
|
|
95
|
+
async def _on_stop(self) -> None:
|
|
96
|
+
"""Custom cleanup logic for WA service."""
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
def _get_actions(self) -> List[str]:
|
|
100
|
+
"""Get list of actions this service provides."""
|
|
101
|
+
return [
|
|
102
|
+
# Authorization
|
|
103
|
+
"check_authorization",
|
|
104
|
+
"request_approval",
|
|
105
|
+
# Guidance
|
|
106
|
+
"get_guidance",
|
|
107
|
+
# Deferrals
|
|
108
|
+
"send_deferral",
|
|
109
|
+
"get_pending_deferrals",
|
|
110
|
+
"resolve_deferral",
|
|
111
|
+
# Permissions
|
|
112
|
+
"grant_permission",
|
|
113
|
+
"revoke_permission",
|
|
114
|
+
"list_permissions",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
# ========== Deferral Helper Methods ==========
|
|
118
|
+
|
|
119
|
+
def _parse_deferral_context(
|
|
120
|
+
self, context_json: Optional[Union[str, Dict[str, object]]]
|
|
121
|
+
) -> tuple[Dict[str, object], Dict[str, object]]:
|
|
122
|
+
"""Parse context JSON and extract deferral info.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
context_json: JSON string or dict containing context data
|
|
126
|
+
(PostgreSQL jsonb returns dict directly)
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
Tuple of (context_dict, deferral_info_dict)
|
|
130
|
+
"""
|
|
131
|
+
context: Dict[str, object] = {}
|
|
132
|
+
deferral_info: Dict[str, object] = {}
|
|
133
|
+
if context_json:
|
|
134
|
+
try:
|
|
135
|
+
# Handle both string JSON and pre-parsed dict (PostgreSQL jsonb)
|
|
136
|
+
if isinstance(context_json, dict):
|
|
137
|
+
context = context_json
|
|
138
|
+
else:
|
|
139
|
+
context = json.loads(context_json)
|
|
140
|
+
deferral_info = context.get("deferral", {}) # type: ignore[assignment]
|
|
141
|
+
except (json.JSONDecodeError, TypeError):
|
|
142
|
+
pass
|
|
143
|
+
return context, deferral_info
|
|
144
|
+
|
|
145
|
+
def _priority_to_string(self, priority: Optional[int]) -> str:
|
|
146
|
+
"""Convert integer priority to string representation.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
priority: Integer priority value (can be None or string from DB)
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
String priority: 'high', 'medium', or 'low'
|
|
153
|
+
"""
|
|
154
|
+
priority_int = int(priority) if priority else 0
|
|
155
|
+
if priority_int > 5:
|
|
156
|
+
return "high"
|
|
157
|
+
elif priority_int > 0:
|
|
158
|
+
return "medium"
|
|
159
|
+
return "low"
|
|
160
|
+
|
|
161
|
+
def _build_ui_context(self, description: Optional[str], deferral_info: Dict[str, object]) -> Dict[str, str]:
|
|
162
|
+
"""Build UI context dictionary from description and deferral info.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
description: Task description
|
|
166
|
+
deferral_info: Dictionary containing deferral-specific data
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Dictionary with string keys and values for UI display
|
|
170
|
+
"""
|
|
171
|
+
ui_context: Dict[str, str] = {
|
|
172
|
+
"task_description": (description[:500] if description else ""),
|
|
173
|
+
}
|
|
174
|
+
# Add deferral-specific context fields (converted to strings for UI)
|
|
175
|
+
deferral_context = deferral_info.get("context", {})
|
|
176
|
+
if isinstance(deferral_context, dict):
|
|
177
|
+
for key, value in deferral_context.items():
|
|
178
|
+
if value is not None:
|
|
179
|
+
ui_context[key] = str(value)[:200]
|
|
180
|
+
# Include original message if available
|
|
181
|
+
original_message = deferral_info.get("original_message")
|
|
182
|
+
if original_message:
|
|
183
|
+
ui_context["original_message"] = str(original_message)[:500]
|
|
184
|
+
return ui_context
|
|
185
|
+
|
|
186
|
+
def _create_pending_deferral(
|
|
187
|
+
self,
|
|
188
|
+
task_id: str,
|
|
189
|
+
channel_id: str,
|
|
190
|
+
updated_at: Optional[str],
|
|
191
|
+
deferral_info: Dict[str, object],
|
|
192
|
+
priority_str: str,
|
|
193
|
+
ui_context: Dict[str, str],
|
|
194
|
+
description: Optional[str],
|
|
195
|
+
) -> PendingDeferral:
|
|
196
|
+
"""Create a PendingDeferral object from parsed data.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
task_id: The task ID
|
|
200
|
+
channel_id: Channel where deferral originated
|
|
201
|
+
updated_at: Timestamp of last update
|
|
202
|
+
deferral_info: Parsed deferral information
|
|
203
|
+
priority_str: String priority ('high', 'medium', 'low')
|
|
204
|
+
ui_context: UI-formatted context dictionary
|
|
205
|
+
description: Task description
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
PendingDeferral object
|
|
209
|
+
"""
|
|
210
|
+
deferral_id = str(deferral_info.get("deferral_id", f"defer_{task_id}"))
|
|
211
|
+
thought_id = str(deferral_info.get("thought_id", ""))
|
|
212
|
+
reason = str(deferral_info.get("reason", description or ""))[:200]
|
|
213
|
+
|
|
214
|
+
deferral_context = deferral_info.get("context", {})
|
|
215
|
+
user_id = deferral_context.get("user_id") if isinstance(deferral_context, dict) else None
|
|
216
|
+
|
|
217
|
+
created_at_dt = datetime.fromisoformat(updated_at.replace(" ", "T")) if updated_at else self._now()
|
|
218
|
+
timeout_dt = created_at_dt + timedelta(days=7)
|
|
219
|
+
|
|
220
|
+
return PendingDeferral(
|
|
221
|
+
deferral_id=deferral_id,
|
|
222
|
+
created_at=created_at_dt,
|
|
223
|
+
deferred_by="ciris_agent",
|
|
224
|
+
task_id=task_id,
|
|
225
|
+
thought_id=thought_id,
|
|
226
|
+
reason=reason,
|
|
227
|
+
channel_id=channel_id,
|
|
228
|
+
user_id=str(user_id) if user_id else None,
|
|
229
|
+
priority=priority_str,
|
|
230
|
+
assigned_wa_id=None,
|
|
231
|
+
requires_role=None,
|
|
232
|
+
status="pending",
|
|
233
|
+
question=reason,
|
|
234
|
+
context=ui_context,
|
|
235
|
+
timeout_at=timeout_dt.isoformat(),
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# ========== Authorization Operations ==========
|
|
239
|
+
|
|
240
|
+
async def check_authorization(self, wa_id: str, action: str, resource: Optional[str] = None) -> bool:
|
|
241
|
+
"""Check if a WA is authorized for an action on a resource.
|
|
242
|
+
|
|
243
|
+
Simple role-based authorization:
|
|
244
|
+
- ROOT: Can do everything
|
|
245
|
+
- AUTHORITY: Can approve/reject deferrals, provide guidance (no minting)
|
|
246
|
+
- OBSERVER: Can only read and send messages
|
|
247
|
+
"""
|
|
248
|
+
wa = await self.auth_service.get_wa(wa_id)
|
|
249
|
+
if not wa:
|
|
250
|
+
return False
|
|
251
|
+
|
|
252
|
+
# Check role permissions
|
|
253
|
+
if wa.role == WARole.ROOT:
|
|
254
|
+
# Root can do anything
|
|
255
|
+
return True
|
|
256
|
+
elif wa.role == WARole.AUTHORITY:
|
|
257
|
+
# Authority can do most things except mint WAs
|
|
258
|
+
return action not in ["mint_wa", "create_wa", "bootstrap_root"]
|
|
259
|
+
else: # wa.role == WARole.OBSERVER
|
|
260
|
+
# Observer can only read and send messages
|
|
261
|
+
return action in ["read", "send_message", "observe", "get_status"]
|
|
262
|
+
|
|
263
|
+
async def request_approval(self, action: str, context: DeferralApprovalContext) -> bool:
|
|
264
|
+
"""Request approval for an action - may defer to human.
|
|
265
|
+
|
|
266
|
+
Returns True if immediately approved (e.g., requester is ROOT),
|
|
267
|
+
False if deferred to human WA.
|
|
268
|
+
"""
|
|
269
|
+
# Check if requester can self-approve
|
|
270
|
+
can_self_approve = await self.check_authorization(
|
|
271
|
+
context.requester_id, action, context.metadata.get("resource") if context.metadata else None
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
if can_self_approve:
|
|
275
|
+
logger.info(f"Action {action} auto-approved for {context.requester_id}")
|
|
276
|
+
return True
|
|
277
|
+
|
|
278
|
+
# Create a deferral for human approval
|
|
279
|
+
deferral_context = {
|
|
280
|
+
"action": action,
|
|
281
|
+
"requester": context.requester_id,
|
|
282
|
+
}
|
|
283
|
+
# Flatten action params into context
|
|
284
|
+
for key, value in context.action_params.items():
|
|
285
|
+
deferral_context[f"param_{key}"] = str(value)
|
|
286
|
+
|
|
287
|
+
deferral = DeferralRequest(
|
|
288
|
+
task_id=context.task_id,
|
|
289
|
+
thought_id=context.thought_id,
|
|
290
|
+
reason=f"Action '{action}' requires human approval",
|
|
291
|
+
defer_until=(
|
|
292
|
+
self._time_service.now() + timedelta(hours=24)
|
|
293
|
+
if self._time_service
|
|
294
|
+
else datetime.now() + timedelta(hours=24)
|
|
295
|
+
),
|
|
296
|
+
context=deferral_context,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
deferral_id = await self.send_deferral(deferral)
|
|
300
|
+
logger.info(f"Created deferral {deferral_id} for action {action}")
|
|
301
|
+
return False
|
|
302
|
+
|
|
303
|
+
async def grant_permission(self, wa_id: str, permission: str, resource: Optional[str] = None) -> bool:
|
|
304
|
+
"""Grant a permission to a WA.
|
|
305
|
+
|
|
306
|
+
In our simplified model, permissions are role-based.
|
|
307
|
+
This method could be used to promote a WA to a higher role.
|
|
308
|
+
"""
|
|
309
|
+
# For beta, we don't support dynamic permission grants
|
|
310
|
+
# Permissions are determined by role
|
|
311
|
+
_ = permission # Unused in current implementation
|
|
312
|
+
_ = resource # Unused in current implementation
|
|
313
|
+
logger.warning(
|
|
314
|
+
"grant_permission called but permissions are role-based. " "Use update_wa to change roles instead."
|
|
315
|
+
)
|
|
316
|
+
return False
|
|
317
|
+
|
|
318
|
+
async def revoke_permission(self, wa_id: str, permission: str, resource: Optional[str] = None) -> bool:
|
|
319
|
+
"""Revoke a permission from a WA.
|
|
320
|
+
|
|
321
|
+
In our simplified model, permissions are role-based.
|
|
322
|
+
This method could be used to demote or deactivate a WA.
|
|
323
|
+
"""
|
|
324
|
+
# For beta, we don't support dynamic permission revocation
|
|
325
|
+
# Permissions are determined by role
|
|
326
|
+
_ = permission # Unused in current implementation
|
|
327
|
+
_ = resource # Unused in current implementation
|
|
328
|
+
logger.warning(
|
|
329
|
+
"revoke_permission called but permissions are role-based. "
|
|
330
|
+
"Use update_wa to change roles or revoke_wa to deactivate."
|
|
331
|
+
)
|
|
332
|
+
return False
|
|
333
|
+
|
|
334
|
+
async def list_permissions(self, wa_id: str) -> List[WAPermission]:
|
|
335
|
+
"""List all permissions for a WA.
|
|
336
|
+
|
|
337
|
+
Returns permissions based on the WA's role.
|
|
338
|
+
"""
|
|
339
|
+
wa = await self.auth_service.get_wa(wa_id)
|
|
340
|
+
if not wa:
|
|
341
|
+
return []
|
|
342
|
+
|
|
343
|
+
# Define role-based permissions
|
|
344
|
+
role_permissions = {
|
|
345
|
+
WARole.ROOT: ["*"], # Root can do everything
|
|
346
|
+
WARole.AUTHORITY: [
|
|
347
|
+
"read",
|
|
348
|
+
"write",
|
|
349
|
+
"approve_deferrals",
|
|
350
|
+
"provide_guidance",
|
|
351
|
+
"manage_tasks",
|
|
352
|
+
"access_audit",
|
|
353
|
+
"manage_memory",
|
|
354
|
+
],
|
|
355
|
+
WARole.OBSERVER: ["read", "send_message", "observe"],
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
permissions = role_permissions.get(wa.role, [])
|
|
359
|
+
|
|
360
|
+
# Convert to WAPermission objects for protocol compliance
|
|
361
|
+
return [
|
|
362
|
+
WAPermission(
|
|
363
|
+
permission_id=f"{wa.wa_id}_{perm}",
|
|
364
|
+
wa_id=wa.wa_id,
|
|
365
|
+
permission_type="role_based",
|
|
366
|
+
permission_name=perm,
|
|
367
|
+
resource=None,
|
|
368
|
+
granted_by="system",
|
|
369
|
+
granted_at=wa.created_at,
|
|
370
|
+
expires_at=None,
|
|
371
|
+
metadata={"role": wa.role.value},
|
|
372
|
+
)
|
|
373
|
+
for perm in permissions
|
|
374
|
+
]
|
|
375
|
+
|
|
376
|
+
# ========== Deferral Operations ==========
|
|
377
|
+
|
|
378
|
+
async def send_deferral(self, deferral: DeferralRequest) -> str:
|
|
379
|
+
"""Send a deferral to appropriate WA.
|
|
380
|
+
|
|
381
|
+
Stores the deferral in the tasks table by updating the task status to 'deferred'
|
|
382
|
+
and storing deferral metadata in context_json.
|
|
383
|
+
"""
|
|
384
|
+
try:
|
|
385
|
+
# Generate deferral ID
|
|
386
|
+
timestamp = self._time_service.timestamp() if self._time_service else datetime.now().timestamp()
|
|
387
|
+
deferral_id = f"defer_{deferral.task_id}_{timestamp}"
|
|
388
|
+
|
|
389
|
+
import json
|
|
390
|
+
|
|
391
|
+
conn = get_db_connection(db_path=self.db_path)
|
|
392
|
+
cursor = conn.cursor()
|
|
393
|
+
|
|
394
|
+
# Get existing task to preserve context
|
|
395
|
+
placeholder = self._get_placeholder()
|
|
396
|
+
cursor.execute(
|
|
397
|
+
f"""
|
|
398
|
+
SELECT context_json, priority FROM tasks
|
|
399
|
+
WHERE task_id = {placeholder}
|
|
400
|
+
""",
|
|
401
|
+
(deferral.task_id,),
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
row = cursor.fetchone()
|
|
405
|
+
if not row:
|
|
406
|
+
logger.error(f"Task {deferral.task_id} not found for deferral")
|
|
407
|
+
conn.close()
|
|
408
|
+
raise ValueError(f"Task {deferral.task_id} not found")
|
|
409
|
+
|
|
410
|
+
existing_context = {}
|
|
411
|
+
if row[0]:
|
|
412
|
+
try:
|
|
413
|
+
existing_context = json.loads(row[0])
|
|
414
|
+
except json.JSONDecodeError:
|
|
415
|
+
pass
|
|
416
|
+
|
|
417
|
+
# Add deferral information to context
|
|
418
|
+
existing_context["deferral"] = {
|
|
419
|
+
"deferral_id": deferral_id,
|
|
420
|
+
"thought_id": deferral.thought_id,
|
|
421
|
+
"reason": deferral.reason,
|
|
422
|
+
"defer_until": deferral.defer_until.isoformat() if deferral.defer_until else None,
|
|
423
|
+
"requires_wa_approval": True, # Always true when sent to WA
|
|
424
|
+
"context": deferral.context or {},
|
|
425
|
+
"created_at": self._now().isoformat(),
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
# Update task status to deferred
|
|
429
|
+
cursor.execute(
|
|
430
|
+
f"""
|
|
431
|
+
UPDATE tasks
|
|
432
|
+
SET status = 'deferred',
|
|
433
|
+
context_json = {placeholder},
|
|
434
|
+
updated_at = {placeholder}
|
|
435
|
+
WHERE task_id = {placeholder}
|
|
436
|
+
""",
|
|
437
|
+
(json.dumps(existing_context), self._now().isoformat(), deferral.task_id),
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
conn.commit()
|
|
441
|
+
conn.close()
|
|
442
|
+
|
|
443
|
+
logger.info(f"Task {deferral.task_id} marked as deferred - visible via /v1/wa/deferrals API")
|
|
444
|
+
|
|
445
|
+
return deferral_id
|
|
446
|
+
except Exception as e:
|
|
447
|
+
logger.error(f"Failed to send deferral: {e}")
|
|
448
|
+
raise
|
|
449
|
+
|
|
450
|
+
async def get_pending_deferrals(self, wa_id: Optional[str] = None) -> List[PendingDeferral]:
|
|
451
|
+
"""Get pending deferrals from the tasks table."""
|
|
452
|
+
result: List[PendingDeferral] = []
|
|
453
|
+
|
|
454
|
+
try:
|
|
455
|
+
conn = get_db_connection(db_path=self.db_path)
|
|
456
|
+
cursor = conn.cursor()
|
|
457
|
+
|
|
458
|
+
cursor.execute(
|
|
459
|
+
"""
|
|
460
|
+
SELECT task_id, channel_id, description, priority, created_at, updated_at, context_json
|
|
461
|
+
FROM tasks
|
|
462
|
+
WHERE status = 'deferred'
|
|
463
|
+
ORDER BY updated_at DESC
|
|
464
|
+
"""
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
for row in cursor.fetchall():
|
|
468
|
+
# Handle both dict (PostgreSQL RealDictCursor) and tuple (SQLite) row formats
|
|
469
|
+
if isinstance(row, dict):
|
|
470
|
+
task_id = row["task_id"]
|
|
471
|
+
channel_id = row["channel_id"]
|
|
472
|
+
description = row["description"]
|
|
473
|
+
priority = row["priority"]
|
|
474
|
+
updated_at = row["updated_at"]
|
|
475
|
+
context_json = row["context_json"]
|
|
476
|
+
else:
|
|
477
|
+
task_id, channel_id, description, priority, _, updated_at, context_json = row
|
|
478
|
+
|
|
479
|
+
_, deferral_info = self._parse_deferral_context(context_json)
|
|
480
|
+
priority_str = self._priority_to_string(priority)
|
|
481
|
+
ui_context = self._build_ui_context(description, deferral_info)
|
|
482
|
+
|
|
483
|
+
deferral = self._create_pending_deferral(
|
|
484
|
+
task_id=task_id,
|
|
485
|
+
channel_id=channel_id,
|
|
486
|
+
updated_at=updated_at,
|
|
487
|
+
deferral_info=deferral_info,
|
|
488
|
+
priority_str=priority_str,
|
|
489
|
+
ui_context=ui_context,
|
|
490
|
+
description=description,
|
|
491
|
+
)
|
|
492
|
+
result.append(deferral)
|
|
493
|
+
|
|
494
|
+
conn.close()
|
|
495
|
+
|
|
496
|
+
except Exception as e:
|
|
497
|
+
logger.error(f"Failed to get pending deferrals from database: {e}")
|
|
498
|
+
return []
|
|
499
|
+
|
|
500
|
+
return result
|
|
501
|
+
|
|
502
|
+
async def resolve_deferral(self, deferral_id: str, response: DeferralResponse) -> bool:
|
|
503
|
+
"""Resolve a deferral by updating task status and adding resolution to context."""
|
|
504
|
+
try:
|
|
505
|
+
conn = get_db_connection(db_path=self.db_path)
|
|
506
|
+
cursor = conn.cursor()
|
|
507
|
+
|
|
508
|
+
# Extract task_id from deferral_id
|
|
509
|
+
# Format can be either defer_{task_id} or defer_{task_id}_{timestamp}
|
|
510
|
+
if deferral_id.startswith("defer_"):
|
|
511
|
+
parts = deferral_id.split("_", 2) # Split into at most 3 parts
|
|
512
|
+
if len(parts) == 2:
|
|
513
|
+
# Simple format: defer_{task_id}
|
|
514
|
+
task_id = parts[1]
|
|
515
|
+
elif len(parts) >= 3:
|
|
516
|
+
# Timestamp format: defer_{task_id}_{timestamp}
|
|
517
|
+
# The task_id might contain underscores, so we need to handle that
|
|
518
|
+
# Remove 'defer_' prefix and find the last underscore for timestamp
|
|
519
|
+
without_prefix = deferral_id[6:] # Remove 'defer_'
|
|
520
|
+
last_underscore = without_prefix.rfind("_")
|
|
521
|
+
if last_underscore > 0:
|
|
522
|
+
# Check if the part after last underscore looks like a timestamp
|
|
523
|
+
potential_timestamp = without_prefix[last_underscore + 1 :]
|
|
524
|
+
try:
|
|
525
|
+
float(potential_timestamp) # Timestamps are floats
|
|
526
|
+
task_id = without_prefix[:last_underscore]
|
|
527
|
+
except ValueError:
|
|
528
|
+
# Not a timestamp, so the whole thing is the task_id
|
|
529
|
+
task_id = without_prefix
|
|
530
|
+
else:
|
|
531
|
+
task_id = without_prefix
|
|
532
|
+
else:
|
|
533
|
+
# Shouldn't happen, but handle it
|
|
534
|
+
task_id = deferral_id[6:] # Remove 'defer_' prefix
|
|
535
|
+
else:
|
|
536
|
+
# Try to find by deferral_id in context
|
|
537
|
+
like_clause = self._get_context_json_like_clause()
|
|
538
|
+
cursor.execute(
|
|
539
|
+
f"""
|
|
540
|
+
SELECT task_id, context_json
|
|
541
|
+
FROM tasks
|
|
542
|
+
WHERE status = 'deferred'
|
|
543
|
+
AND {like_clause}
|
|
544
|
+
""",
|
|
545
|
+
(f'%"deferral_id":"{deferral_id}"%',),
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
row = cursor.fetchone()
|
|
549
|
+
if row:
|
|
550
|
+
task_id = row[0]
|
|
551
|
+
else:
|
|
552
|
+
logger.error(f"Deferral {deferral_id} not found")
|
|
553
|
+
conn.close()
|
|
554
|
+
return False
|
|
555
|
+
|
|
556
|
+
# Get existing context
|
|
557
|
+
placeholder = self._get_placeholder()
|
|
558
|
+
cursor.execute(
|
|
559
|
+
f"""
|
|
560
|
+
SELECT context_json FROM tasks
|
|
561
|
+
WHERE task_id = {placeholder} AND status = 'deferred'
|
|
562
|
+
""",
|
|
563
|
+
(task_id,),
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
row = cursor.fetchone()
|
|
567
|
+
if not row:
|
|
568
|
+
logger.error(f"Task {task_id} not found or not deferred")
|
|
569
|
+
conn.close()
|
|
570
|
+
return False
|
|
571
|
+
|
|
572
|
+
# Update context with resolution
|
|
573
|
+
context = {}
|
|
574
|
+
if row[0]:
|
|
575
|
+
try:
|
|
576
|
+
context = json.loads(row[0])
|
|
577
|
+
except json.JSONDecodeError:
|
|
578
|
+
pass
|
|
579
|
+
|
|
580
|
+
# Add resolution to deferral info
|
|
581
|
+
if "deferral" in context:
|
|
582
|
+
context["deferral"]["resolution"] = {
|
|
583
|
+
"approved": response.approved,
|
|
584
|
+
"reason": response.reason,
|
|
585
|
+
"resolved_by": response.wa_id,
|
|
586
|
+
"resolved_at": self._now().isoformat(),
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
# If approved, add guidance to context for the agent
|
|
590
|
+
if response.approved and response.reason:
|
|
591
|
+
context["wa_guidance"] = response.reason
|
|
592
|
+
# Track guidance provided via deferral resolution
|
|
593
|
+
self._guidance_provided_count += 1
|
|
594
|
+
|
|
595
|
+
# Update task status to pending so it will be picked up
|
|
596
|
+
cursor.execute(
|
|
597
|
+
f"""
|
|
598
|
+
UPDATE tasks
|
|
599
|
+
SET status = 'pending',
|
|
600
|
+
context_json = {placeholder},
|
|
601
|
+
updated_at = {placeholder}
|
|
602
|
+
WHERE task_id = {placeholder}
|
|
603
|
+
""",
|
|
604
|
+
(json.dumps(context), self._now().isoformat(), task_id),
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
if cursor.rowcount == 0:
|
|
608
|
+
logger.error(f"Failed to update task {task_id}")
|
|
609
|
+
conn.close()
|
|
610
|
+
return False
|
|
611
|
+
|
|
612
|
+
conn.commit()
|
|
613
|
+
conn.close()
|
|
614
|
+
|
|
615
|
+
logger.info(
|
|
616
|
+
f"Deferral {deferral_id} {'approved' if response.approved else 'rejected'} by {response.wa_id}, task {task_id} now pending"
|
|
617
|
+
)
|
|
618
|
+
return True
|
|
619
|
+
|
|
620
|
+
except Exception as e:
|
|
621
|
+
logger.error(f"Failed to resolve deferral: {e}")
|
|
622
|
+
return False
|
|
623
|
+
|
|
624
|
+
# ========== Guidance Operations ==========
|
|
625
|
+
|
|
626
|
+
async def fetch_guidance(self, context: GuidanceContext) -> Optional[str]:
|
|
627
|
+
"""Fetch guidance from a Wise Authority for a given context.
|
|
628
|
+
|
|
629
|
+
This is the WiseBus-compatible method that adapters call.
|
|
630
|
+
Guidance comes ONLY from authorized Wise Authorities - never
|
|
631
|
+
generated by the system.
|
|
632
|
+
"""
|
|
633
|
+
try:
|
|
634
|
+
# Track wisdom query
|
|
635
|
+
self._queries_handled_count += 1
|
|
636
|
+
|
|
637
|
+
# Log the guidance request
|
|
638
|
+
logger.info(f"Guidance requested for thought {context.thought_id}: {context.question}")
|
|
639
|
+
|
|
640
|
+
# Check if we have any stored guidance for this context
|
|
641
|
+
# In the full implementation, this would query the database
|
|
642
|
+
# for guidance provided by WAs through the API or other channels
|
|
643
|
+
|
|
644
|
+
# Guidance is provided by WAs through the API, not generated by this service
|
|
645
|
+
# Returns None when no WA has provided guidance - this is the correct behavior
|
|
646
|
+
|
|
647
|
+
logger.debug(f"No WA guidance available yet for thought {context.thought_id}")
|
|
648
|
+
return None
|
|
649
|
+
|
|
650
|
+
except Exception as e:
|
|
651
|
+
logger.error(f"Failed to fetch guidance: {e}", exc_info=True)
|
|
652
|
+
return None
|
|
653
|
+
|
|
654
|
+
async def get_guidance(self, request: GuidanceRequest) -> GuidanceResponse:
|
|
655
|
+
"""Get guidance for a situation (Protocol method).
|
|
656
|
+
|
|
657
|
+
This wraps fetch_guidance to comply with the protocol.
|
|
658
|
+
"""
|
|
659
|
+
# Convert GuidanceRequest to GuidanceContext for internal use
|
|
660
|
+
timestamp = self._time_service.timestamp() if self._time_service else datetime.now().timestamp()
|
|
661
|
+
context = GuidanceContext(
|
|
662
|
+
thought_id=f"guidance_{timestamp}",
|
|
663
|
+
task_id=f"guidance_task_{timestamp}",
|
|
664
|
+
question=request.context,
|
|
665
|
+
ethical_considerations=[], # Could extract from options
|
|
666
|
+
domain_context={
|
|
667
|
+
"urgency": request.urgency,
|
|
668
|
+
"options": ", ".join(request.options) if request.options else "",
|
|
669
|
+
"recommendation": request.recommendation or "",
|
|
670
|
+
},
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
# Use the existing fetch_guidance method
|
|
674
|
+
guidance = await self.fetch_guidance(context)
|
|
675
|
+
|
|
676
|
+
if guidance:
|
|
677
|
+
# Track guidance provided
|
|
678
|
+
self._guidance_provided_count += 1
|
|
679
|
+
|
|
680
|
+
# Audit log guidance observation
|
|
681
|
+
if hasattr(self, "_audit_service") and self._audit_service:
|
|
682
|
+
from ciris_engine.schemas.audit.core import EventPayload
|
|
683
|
+
|
|
684
|
+
event_data = EventPayload(
|
|
685
|
+
action="observe",
|
|
686
|
+
service_name="wise_authority",
|
|
687
|
+
user_id="system",
|
|
688
|
+
result="guidance_provided",
|
|
689
|
+
)
|
|
690
|
+
await self._audit_service.log_event(event_type="guidance_observation", event_data=event_data)
|
|
691
|
+
|
|
692
|
+
# Parse the guidance response (assuming it's structured)
|
|
693
|
+
return GuidanceResponse(
|
|
694
|
+
selected_option=None, # Would be parsed from guidance
|
|
695
|
+
custom_guidance=guidance,
|
|
696
|
+
reasoning="Guidance provided by Wise Authority",
|
|
697
|
+
wa_id="unknown", # Would come from the actual WA
|
|
698
|
+
signature="", # Would be signed by the WA
|
|
699
|
+
)
|
|
700
|
+
else:
|
|
701
|
+
# Audit log no guidance available
|
|
702
|
+
if hasattr(self, "_audit_service") and self._audit_service:
|
|
703
|
+
from ciris_engine.schemas.audit.core import EventPayload
|
|
704
|
+
|
|
705
|
+
event_data = EventPayload(
|
|
706
|
+
action="observe",
|
|
707
|
+
service_name="wise_authority",
|
|
708
|
+
user_id="system",
|
|
709
|
+
result="no_guidance",
|
|
710
|
+
)
|
|
711
|
+
await self._audit_service.log_event(event_type="guidance_observation", event_data=event_data)
|
|
712
|
+
|
|
713
|
+
# No guidance available
|
|
714
|
+
return GuidanceResponse(
|
|
715
|
+
selected_option=None,
|
|
716
|
+
custom_guidance=None,
|
|
717
|
+
reasoning="No Wise Authority guidance available yet",
|
|
718
|
+
wa_id="system",
|
|
719
|
+
signature="",
|
|
720
|
+
)
|
|
721
|
+
|
|
722
|
+
def get_status(self) -> ServiceStatus:
|
|
723
|
+
"""Get current service status."""
|
|
724
|
+
# Get counts from database
|
|
725
|
+
pending_deferrals_count = 0
|
|
726
|
+
resolved_deferrals_count = 0
|
|
727
|
+
|
|
728
|
+
try:
|
|
729
|
+
conn = get_db_connection(db_path=self.db_path)
|
|
730
|
+
cursor = conn.cursor()
|
|
731
|
+
|
|
732
|
+
# Count pending deferrals (deferred tasks)
|
|
733
|
+
cursor.execute(
|
|
734
|
+
"""
|
|
735
|
+
SELECT COUNT(*) FROM tasks
|
|
736
|
+
WHERE status = 'deferred'
|
|
737
|
+
"""
|
|
738
|
+
)
|
|
739
|
+
pending_deferrals_count = cursor.fetchone()[0]
|
|
740
|
+
|
|
741
|
+
# Count resolved deferrals (tasks with resolution in context)
|
|
742
|
+
like_clause = self._get_context_json_like_clause()
|
|
743
|
+
cursor.execute(
|
|
744
|
+
f"""
|
|
745
|
+
SELECT COUNT(*) FROM tasks
|
|
746
|
+
WHERE {like_clause}
|
|
747
|
+
""",
|
|
748
|
+
('%"resolution":%',),
|
|
749
|
+
)
|
|
750
|
+
resolved_deferrals_count = cursor.fetchone()[0]
|
|
751
|
+
|
|
752
|
+
conn.close()
|
|
753
|
+
except Exception as e:
|
|
754
|
+
logger.error(f"Error getting deferral counts: {e}")
|
|
755
|
+
|
|
756
|
+
return ServiceStatus(
|
|
757
|
+
service_name="WiseAuthorityService",
|
|
758
|
+
service_type="governance_service",
|
|
759
|
+
is_healthy=self._started,
|
|
760
|
+
uptime_seconds=self._calculate_uptime(),
|
|
761
|
+
last_error=self._last_error,
|
|
762
|
+
metrics={
|
|
763
|
+
"pending_deferrals": float(pending_deferrals_count),
|
|
764
|
+
"resolved_deferrals": float(resolved_deferrals_count),
|
|
765
|
+
"total_deferrals": float(pending_deferrals_count + resolved_deferrals_count),
|
|
766
|
+
},
|
|
767
|
+
last_health_check=self._last_health_check,
|
|
768
|
+
)
|
|
769
|
+
|
|
770
|
+
def get_service_type(self) -> ServiceType:
|
|
771
|
+
"""Get the service type enum value."""
|
|
772
|
+
return ServiceType.WISE_AUTHORITY
|
|
773
|
+
|
|
774
|
+
def _check_dependencies(self) -> bool:
|
|
775
|
+
"""Check if all required dependencies are available."""
|
|
776
|
+
return self.auth_service is not None
|
|
777
|
+
|
|
778
|
+
def _register_dependencies(self) -> None:
|
|
779
|
+
"""Register service dependencies."""
|
|
780
|
+
super()._register_dependencies()
|
|
781
|
+
self._dependencies.add("AuthenticationService")
|
|
782
|
+
self._dependencies.add("GraphAuditService")
|
|
783
|
+
self._dependencies.add("SecretsService")
|
|
784
|
+
|
|
785
|
+
def _collect_custom_metrics(self) -> Dict[str, float]:
|
|
786
|
+
"""Collect service-specific metrics for v1.4.3 API."""
|
|
787
|
+
# Get deferral counts from database
|
|
788
|
+
total_deferrals_count = 0
|
|
789
|
+
resolved_deferrals_count = 0
|
|
790
|
+
|
|
791
|
+
try:
|
|
792
|
+
conn = get_db_connection(db_path=self.db_path)
|
|
793
|
+
cursor = conn.cursor()
|
|
794
|
+
|
|
795
|
+
like_clause = self._get_context_json_like_clause()
|
|
796
|
+
|
|
797
|
+
# Count total deferrals - tasks that have or had deferral context
|
|
798
|
+
cursor.execute(
|
|
799
|
+
f"""
|
|
800
|
+
SELECT COUNT(*) FROM tasks
|
|
801
|
+
WHERE {like_clause}
|
|
802
|
+
""",
|
|
803
|
+
('%"deferral":%',),
|
|
804
|
+
)
|
|
805
|
+
total_deferrals_count = cursor.fetchone()[0]
|
|
806
|
+
|
|
807
|
+
# Count resolved deferrals (tasks with resolution in context)
|
|
808
|
+
cursor.execute(
|
|
809
|
+
f"""
|
|
810
|
+
SELECT COUNT(*) FROM tasks
|
|
811
|
+
WHERE {like_clause}
|
|
812
|
+
""",
|
|
813
|
+
('%"resolution":%',),
|
|
814
|
+
)
|
|
815
|
+
resolved_deferrals_count = cursor.fetchone()[0]
|
|
816
|
+
|
|
817
|
+
conn.close()
|
|
818
|
+
except Exception as e:
|
|
819
|
+
logger.error(f"Error getting deferral counts: {e}")
|
|
820
|
+
|
|
821
|
+
return {
|
|
822
|
+
# v1.4.3 specified metrics - exact names from telemetry taxonomy
|
|
823
|
+
"wise_authority_deferrals_total": float(total_deferrals_count),
|
|
824
|
+
"wise_authority_deferrals_resolved": float(resolved_deferrals_count),
|
|
825
|
+
"wise_authority_guidance_requests": float(self._guidance_provided_count),
|
|
826
|
+
"wise_authority_uptime_seconds": self._calculate_uptime(),
|
|
827
|
+
}
|