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,852 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Core Tool Service - Provides core system tools for agents.
|
|
3
|
+
|
|
4
|
+
Implements ToolService protocol to expose core tools:
|
|
5
|
+
- Secrets management (RECALL_SECRET, UPDATE_SECRETS_FILTER)
|
|
6
|
+
- Ticket management (UPDATE_TICKET, GET_TICKET, DEFER_TICKET)
|
|
7
|
+
- Agent guidance (SELF_HELP)
|
|
8
|
+
|
|
9
|
+
Tickets are NOT a service - they're a coordination mechanism that sits above services.
|
|
10
|
+
Tools provide the agent-facing interface for ticket updates during task execution.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
|
|
18
|
+
from ciris_engine.logic.secrets.service import SecretsService
|
|
19
|
+
from ciris_engine.logic.services.base_service import BaseService
|
|
20
|
+
from ciris_engine.logic.utils.jsondict_helpers import get_str
|
|
21
|
+
from ciris_engine.protocols.services import ToolService
|
|
22
|
+
from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
|
|
23
|
+
from ciris_engine.schemas.adapters.tools import (
|
|
24
|
+
ToolExecutionResult,
|
|
25
|
+
ToolExecutionStatus,
|
|
26
|
+
ToolInfo,
|
|
27
|
+
ToolParameterSchema,
|
|
28
|
+
ToolResult,
|
|
29
|
+
)
|
|
30
|
+
from ciris_engine.schemas.runtime.enums import ServiceType
|
|
31
|
+
from ciris_engine.schemas.services.core import ServiceCapabilities
|
|
32
|
+
from ciris_engine.schemas.services.core.secrets import SecretContext
|
|
33
|
+
from ciris_engine.schemas.types import JSONDict
|
|
34
|
+
|
|
35
|
+
# ToolParameters is a JSONDict for flexible parameter passing
|
|
36
|
+
ToolParameters = JSONDict
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
# Error message constants to avoid duplication
|
|
41
|
+
ERROR_TICKET_ID_REQUIRED = "ticket_id (str) is required"
|
|
42
|
+
ERROR_FILTER_NOT_EXPOSED = "Filter operations not currently exposed"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class CoreToolService(BaseService, ToolService):
|
|
46
|
+
"""Service providing core system tools (secrets, tickets, guidance)."""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
secrets_service: SecretsService,
|
|
51
|
+
time_service: TimeServiceProtocol,
|
|
52
|
+
db_path: Optional[str] = None,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Initialize with secrets service, time service, and optional db path.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
secrets_service: Service for secrets management
|
|
58
|
+
time_service: Service for time operations
|
|
59
|
+
db_path: Optional database path override. When None (default),
|
|
60
|
+
uses current config (_test_db_path or essential_config).
|
|
61
|
+
When provided, uses this specific path for all operations.
|
|
62
|
+
"""
|
|
63
|
+
super().__init__(time_service=time_service)
|
|
64
|
+
self.secrets_service = secrets_service
|
|
65
|
+
# Store db_path for persistence calls - None means use current config
|
|
66
|
+
self._db_path = db_path
|
|
67
|
+
self.adapter_name = "core_tools"
|
|
68
|
+
|
|
69
|
+
# v1.4.3 metrics tracking
|
|
70
|
+
self._secrets_retrieved = 0
|
|
71
|
+
self._secrets_stored = 0
|
|
72
|
+
self._tickets_updated = 0
|
|
73
|
+
self._tickets_retrieved = 0
|
|
74
|
+
self._tickets_deferred = 0
|
|
75
|
+
self._metrics_tracking: Dict[str, float] = {} # For custom metric tracking
|
|
76
|
+
self._tool_executions = 0
|
|
77
|
+
self._tool_failures = 0
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def db_path(self) -> Optional[str]:
|
|
81
|
+
"""Get database path for persistence operations.
|
|
82
|
+
|
|
83
|
+
Returns the stored db_path if provided during initialization,
|
|
84
|
+
otherwise None to use current config (_test_db_path or essential_config).
|
|
85
|
+
"""
|
|
86
|
+
return self._db_path
|
|
87
|
+
|
|
88
|
+
def _track_metric(self, metric_name: str, default: float = 0.0) -> float:
|
|
89
|
+
"""Track a metric with default value."""
|
|
90
|
+
return self._metrics_tracking.get(metric_name, default)
|
|
91
|
+
|
|
92
|
+
def get_service_type(self) -> ServiceType:
|
|
93
|
+
"""Get service type."""
|
|
94
|
+
return ServiceType.TOOL
|
|
95
|
+
|
|
96
|
+
def _get_actions(self) -> List[str]:
|
|
97
|
+
"""Get list of actions this service provides."""
|
|
98
|
+
return ["recall_secret", "update_secrets_filter", "self_help", "update_ticket", "get_ticket", "defer_ticket"]
|
|
99
|
+
|
|
100
|
+
def _check_dependencies(self) -> bool:
|
|
101
|
+
"""Check if all dependencies are available."""
|
|
102
|
+
return self.secrets_service is not None
|
|
103
|
+
|
|
104
|
+
def _register_dependencies(self) -> None:
|
|
105
|
+
"""Register service dependencies."""
|
|
106
|
+
super()._register_dependencies()
|
|
107
|
+
self._dependencies.add("SecretsService")
|
|
108
|
+
|
|
109
|
+
async def is_healthy(self) -> bool:
|
|
110
|
+
"""Check if service is healthy.
|
|
111
|
+
|
|
112
|
+
SecretsToolService is stateless and always healthy if instantiated.
|
|
113
|
+
"""
|
|
114
|
+
return True
|
|
115
|
+
|
|
116
|
+
async def execute_tool(self, tool_name: str, parameters: ToolParameters) -> ToolExecutionResult:
|
|
117
|
+
"""Execute a tool and return the result."""
|
|
118
|
+
self._track_request() # Track the tool execution
|
|
119
|
+
self._tool_executions += 1
|
|
120
|
+
|
|
121
|
+
if tool_name == "recall_secret":
|
|
122
|
+
result = await self._recall_secret(parameters)
|
|
123
|
+
elif tool_name == "update_secrets_filter":
|
|
124
|
+
result = await self._update_secrets_filter(parameters)
|
|
125
|
+
elif tool_name == "self_help":
|
|
126
|
+
result = await self._self_help(parameters)
|
|
127
|
+
elif tool_name == "update_ticket":
|
|
128
|
+
result = await self._update_ticket(parameters)
|
|
129
|
+
elif tool_name == "get_ticket":
|
|
130
|
+
result = await self._get_ticket(parameters)
|
|
131
|
+
elif tool_name == "defer_ticket":
|
|
132
|
+
result = await self._defer_ticket(parameters)
|
|
133
|
+
else:
|
|
134
|
+
self._tool_failures += 1 # Unknown tool is a failure!
|
|
135
|
+
result = ToolResult(success=False, error=f"Unknown tool: {tool_name}")
|
|
136
|
+
|
|
137
|
+
if not result.success:
|
|
138
|
+
self._tool_failures += 1 # Track failed executions
|
|
139
|
+
self._track_error(Exception(result.error or "Tool execution failed"))
|
|
140
|
+
|
|
141
|
+
return ToolExecutionResult(
|
|
142
|
+
tool_name=tool_name,
|
|
143
|
+
status=ToolExecutionStatus.COMPLETED if result.success else ToolExecutionStatus.FAILED,
|
|
144
|
+
success=result.success,
|
|
145
|
+
data=result.data,
|
|
146
|
+
error=result.error,
|
|
147
|
+
correlation_id=f"secrets_{tool_name}_{self._now().timestamp()}",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
async def _recall_secret(self, params: ToolParameters) -> ToolResult:
|
|
151
|
+
"""Recall a secret by UUID."""
|
|
152
|
+
try:
|
|
153
|
+
secret_uuid_val = get_str(params, "secret_uuid", "")
|
|
154
|
+
purpose = params.get("purpose", "No purpose specified")
|
|
155
|
+
decrypt = params.get("decrypt", False)
|
|
156
|
+
|
|
157
|
+
if not secret_uuid_val:
|
|
158
|
+
return ToolResult(success=False, error="secret_uuid is required")
|
|
159
|
+
|
|
160
|
+
# Retrieve the secret
|
|
161
|
+
if decrypt:
|
|
162
|
+
value = await self.secrets_service.retrieve_secret(secret_uuid_val)
|
|
163
|
+
if value is None:
|
|
164
|
+
return ToolResult(success=False, error=f"Secret {secret_uuid_val} not found")
|
|
165
|
+
self._secrets_retrieved += 1 # Track successful retrieval
|
|
166
|
+
result_data = {"value": value, "decrypted": True}
|
|
167
|
+
else:
|
|
168
|
+
# Just verify it exists
|
|
169
|
+
# Just check if it exists by trying to retrieve
|
|
170
|
+
value = await self.secrets_service.retrieve_secret(secret_uuid_val)
|
|
171
|
+
if value is None:
|
|
172
|
+
return ToolResult(success=False, error=f"Secret {secret_uuid_val} not found")
|
|
173
|
+
self._secrets_retrieved += 1 # Track successful retrieval
|
|
174
|
+
result_data = {"exists": True, "decrypted": False}
|
|
175
|
+
|
|
176
|
+
return ToolResult(success=True, data=result_data)
|
|
177
|
+
|
|
178
|
+
except Exception as e:
|
|
179
|
+
logger.error(f"Error recalling secret: {e}")
|
|
180
|
+
return ToolResult(success=False, error=str(e))
|
|
181
|
+
|
|
182
|
+
async def _update_secrets_filter(self, params: ToolParameters) -> ToolResult:
|
|
183
|
+
"""Update secrets filter configuration."""
|
|
184
|
+
try:
|
|
185
|
+
operation = params.get("operation")
|
|
186
|
+
if not operation:
|
|
187
|
+
return ToolResult(success=False, error="operation is required")
|
|
188
|
+
|
|
189
|
+
result_data = {"operation": operation}
|
|
190
|
+
|
|
191
|
+
if operation == "add_pattern":
|
|
192
|
+
pattern = params.get("pattern")
|
|
193
|
+
if not pattern:
|
|
194
|
+
return ToolResult(success=False, error="pattern is required for add_pattern")
|
|
195
|
+
|
|
196
|
+
# Filter operations not directly accessible - would need to be exposed
|
|
197
|
+
return ToolResult(success=False, error=ERROR_FILTER_NOT_EXPOSED)
|
|
198
|
+
|
|
199
|
+
elif operation == "remove_pattern":
|
|
200
|
+
pattern = params.get("pattern")
|
|
201
|
+
if not pattern:
|
|
202
|
+
return ToolResult(success=False, error="pattern is required for remove_pattern")
|
|
203
|
+
|
|
204
|
+
# Filter operations not directly accessible
|
|
205
|
+
return ToolResult(success=False, error=ERROR_FILTER_NOT_EXPOSED)
|
|
206
|
+
|
|
207
|
+
elif operation == "list_patterns":
|
|
208
|
+
# Filter operations not directly accessible
|
|
209
|
+
patterns: List[Any] = []
|
|
210
|
+
result_data.update({"patterns": patterns})
|
|
211
|
+
|
|
212
|
+
elif operation == "enable":
|
|
213
|
+
# Filter operations not directly accessible
|
|
214
|
+
return ToolResult(success=False, error=ERROR_FILTER_NOT_EXPOSED)
|
|
215
|
+
|
|
216
|
+
else:
|
|
217
|
+
return ToolResult(success=False, error=f"Unknown operation: {operation}")
|
|
218
|
+
|
|
219
|
+
return ToolResult(success=True, data=result_data)
|
|
220
|
+
|
|
221
|
+
except Exception as e:
|
|
222
|
+
logger.error(f"Error updating secrets filter: {e}")
|
|
223
|
+
return ToolResult(success=False, error=str(e))
|
|
224
|
+
|
|
225
|
+
async def _self_help(self, parameters: ToolParameters) -> ToolResult:
|
|
226
|
+
"""Access the agent experience document."""
|
|
227
|
+
try:
|
|
228
|
+
experience_path = Path("docs/agent_experience.md")
|
|
229
|
+
|
|
230
|
+
if not experience_path.exists():
|
|
231
|
+
return ToolResult(
|
|
232
|
+
success=False, error="Agent experience document not found at docs/agent_experience.md"
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
content = experience_path.read_text()
|
|
236
|
+
|
|
237
|
+
return ToolResult(
|
|
238
|
+
success=True, data={"content": content, "source": "docs/agent_experience.md", "length": len(content)}
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
except Exception as e:
|
|
242
|
+
logger.error(f"Error reading experience document: {e}")
|
|
243
|
+
return ToolResult(success=False, error=str(e))
|
|
244
|
+
|
|
245
|
+
def _validate_ticket_id(self, params: ToolParameters) -> Optional[str]:
|
|
246
|
+
"""Validate and extract ticket_id from parameters.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
ticket_id if valid, None otherwise
|
|
250
|
+
"""
|
|
251
|
+
ticket_id = params.get("ticket_id")
|
|
252
|
+
if not ticket_id or not isinstance(ticket_id, str):
|
|
253
|
+
return None
|
|
254
|
+
return ticket_id
|
|
255
|
+
|
|
256
|
+
def _parse_metadata_json(
|
|
257
|
+
self, metadata_updates: Any, start_time: float
|
|
258
|
+
) -> tuple[Optional[dict[str, Any]], Optional[str]]:
|
|
259
|
+
"""Parse metadata updates, handling JSON strings from CLI/mock LLM.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
metadata_updates: Raw metadata updates (dict or JSON string)
|
|
263
|
+
start_time: Timer start for debug logging
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Tuple of (parsed_metadata, error_message). One will be None.
|
|
267
|
+
"""
|
|
268
|
+
import json
|
|
269
|
+
import time
|
|
270
|
+
|
|
271
|
+
# Handle JSON string from command-line tools (mock LLM, CLI)
|
|
272
|
+
if isinstance(metadata_updates, str):
|
|
273
|
+
try:
|
|
274
|
+
metadata_updates = json.loads(metadata_updates)
|
|
275
|
+
logger.debug(
|
|
276
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s PARSED_JSON metadata_updates={metadata_updates}"
|
|
277
|
+
)
|
|
278
|
+
except json.JSONDecodeError as e:
|
|
279
|
+
return None, f"metadata must be valid JSON: {e}"
|
|
280
|
+
|
|
281
|
+
if not isinstance(metadata_updates, dict):
|
|
282
|
+
return None, "metadata must be a dictionary or valid JSON string"
|
|
283
|
+
|
|
284
|
+
return metadata_updates, None
|
|
285
|
+
|
|
286
|
+
def _merge_single_stage(
|
|
287
|
+
self,
|
|
288
|
+
merged_stages: dict[str, Any],
|
|
289
|
+
stage_name: str,
|
|
290
|
+
stage_data: Any,
|
|
291
|
+
start_time: float,
|
|
292
|
+
) -> None:
|
|
293
|
+
"""Merge a single stage into the merged_stages dict in place.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
merged_stages: Dictionary of merged stages (modified in place)
|
|
297
|
+
stage_name: Name of the stage to merge
|
|
298
|
+
stage_data: Data for the stage
|
|
299
|
+
start_time: Timer start for debug logging
|
|
300
|
+
"""
|
|
301
|
+
import time
|
|
302
|
+
|
|
303
|
+
logger.debug(
|
|
304
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s MERGING_STAGE " f"stage={stage_name} data={stage_data}"
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
if not isinstance(stage_data, dict):
|
|
308
|
+
return
|
|
309
|
+
|
|
310
|
+
if stage_name in merged_stages and isinstance(merged_stages[stage_name], dict):
|
|
311
|
+
# Merge existing stage
|
|
312
|
+
before = merged_stages[stage_name].copy()
|
|
313
|
+
merged_stages[stage_name] = {**merged_stages[stage_name], **stage_data}
|
|
314
|
+
logger.debug(
|
|
315
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s MERGED_STAGE "
|
|
316
|
+
f"stage={stage_name} before={before} after={merged_stages[stage_name]}"
|
|
317
|
+
)
|
|
318
|
+
else:
|
|
319
|
+
# New stage
|
|
320
|
+
merged_stages[stage_name] = stage_data
|
|
321
|
+
logger.debug(
|
|
322
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s NEW_STAGE " f"stage={stage_name} data={stage_data}"
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
def _merge_stage_metadata(
|
|
326
|
+
self, current_metadata: dict[str, Any], metadata_updates: dict[str, Any], start_time: float
|
|
327
|
+
) -> dict[str, Any]:
|
|
328
|
+
"""Deep merge stage metadata, preserving existing stage data.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
current_metadata: Current ticket metadata
|
|
332
|
+
metadata_updates: New metadata to merge
|
|
333
|
+
start_time: Timer start for debug logging
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
Merged metadata dictionary
|
|
337
|
+
"""
|
|
338
|
+
import time
|
|
339
|
+
|
|
340
|
+
# Shallow merge first
|
|
341
|
+
merged_metadata: dict[str, Any] = {**current_metadata, **metadata_updates}
|
|
342
|
+
|
|
343
|
+
# Deep merge for 'stages' key only
|
|
344
|
+
if "stages" not in metadata_updates or "stages" not in current_metadata:
|
|
345
|
+
return merged_metadata
|
|
346
|
+
|
|
347
|
+
merged_stages: dict[str, Any] = {**current_metadata.get("stages", {})}
|
|
348
|
+
stages_updates = metadata_updates.get("stages", {})
|
|
349
|
+
|
|
350
|
+
logger.debug(
|
|
351
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s DEEP_MERGE_STAGES "
|
|
352
|
+
f"base_stages={list(merged_stages.keys())} update_stages={list(stages_updates.keys())}"
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
if isinstance(stages_updates, dict):
|
|
356
|
+
for stage_name, stage_data in stages_updates.items():
|
|
357
|
+
self._merge_single_stage(merged_stages, stage_name, stage_data, start_time)
|
|
358
|
+
merged_metadata["stages"] = merged_stages
|
|
359
|
+
|
|
360
|
+
return merged_metadata
|
|
361
|
+
|
|
362
|
+
def _update_ticket_status_only(
|
|
363
|
+
self, ticket_id: str, new_status: Any, params: ToolParameters, result_data: dict[str, Any]
|
|
364
|
+
) -> Optional[ToolResult]:
|
|
365
|
+
"""Update ticket status and add to result data.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
ticket_id: Ticket ID to update
|
|
369
|
+
new_status: New status value
|
|
370
|
+
params: Tool parameters (for notes)
|
|
371
|
+
result_data: Result dictionary to update
|
|
372
|
+
|
|
373
|
+
Returns:
|
|
374
|
+
ToolResult with error if update fails, None if successful
|
|
375
|
+
"""
|
|
376
|
+
from ciris_engine.logic.persistence.models.tickets import update_ticket_status
|
|
377
|
+
|
|
378
|
+
if not isinstance(new_status, str):
|
|
379
|
+
return ToolResult(success=False, error="status must be a string")
|
|
380
|
+
|
|
381
|
+
notes = params.get("notes")
|
|
382
|
+
notes_str = str(notes) if notes is not None else None
|
|
383
|
+
success = update_ticket_status(ticket_id, new_status, notes=notes_str, db_path=self._db_path)
|
|
384
|
+
|
|
385
|
+
if not success:
|
|
386
|
+
return ToolResult(success=False, error=f"Failed to update ticket {ticket_id} status")
|
|
387
|
+
|
|
388
|
+
result_data["updates"]["status"] = new_status
|
|
389
|
+
if notes:
|
|
390
|
+
result_data["updates"]["notes"] = notes
|
|
391
|
+
|
|
392
|
+
return None
|
|
393
|
+
|
|
394
|
+
def _update_ticket_metadata_only(
|
|
395
|
+
self,
|
|
396
|
+
ticket_id: str,
|
|
397
|
+
current_ticket: dict[str, Any],
|
|
398
|
+
metadata_updates: Any,
|
|
399
|
+
result_data: dict[str, Any],
|
|
400
|
+
start_time: float,
|
|
401
|
+
) -> Optional[ToolResult]:
|
|
402
|
+
"""Update ticket metadata with deep merge for stages.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
ticket_id: Ticket ID to update
|
|
406
|
+
current_ticket: Current ticket data
|
|
407
|
+
metadata_updates: New metadata to merge
|
|
408
|
+
result_data: Result dictionary to update
|
|
409
|
+
start_time: Timer start for debug logging
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
ToolResult with error if update fails, None if successful
|
|
413
|
+
"""
|
|
414
|
+
import time
|
|
415
|
+
|
|
416
|
+
from ciris_engine.logic.persistence.models.tickets import update_ticket_metadata
|
|
417
|
+
|
|
418
|
+
logger.debug(
|
|
419
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s METADATA_UPDATE_START metadata_updates={metadata_updates}"
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
# Parse JSON if needed
|
|
423
|
+
parsed_metadata, error = self._parse_metadata_json(metadata_updates, start_time)
|
|
424
|
+
if error:
|
|
425
|
+
return ToolResult(success=False, error=error)
|
|
426
|
+
|
|
427
|
+
metadata_updates = parsed_metadata
|
|
428
|
+
|
|
429
|
+
# Get current metadata
|
|
430
|
+
current_metadata = current_ticket.get("metadata", {})
|
|
431
|
+
if not isinstance(current_metadata, dict):
|
|
432
|
+
current_metadata = {}
|
|
433
|
+
|
|
434
|
+
logger.debug(f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s BEFORE_MERGE current={current_metadata}")
|
|
435
|
+
|
|
436
|
+
# Deep merge with special handling for stages
|
|
437
|
+
merged_metadata = self._merge_stage_metadata(current_metadata, metadata_updates, start_time)
|
|
438
|
+
|
|
439
|
+
logger.debug(f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s AFTER_MERGE merged={merged_metadata}")
|
|
440
|
+
|
|
441
|
+
# Update database
|
|
442
|
+
success = update_ticket_metadata(ticket_id, merged_metadata, db_path=self._db_path)
|
|
443
|
+
logger.debug(f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s DB_UPDATE_RESULT success={success}")
|
|
444
|
+
|
|
445
|
+
if not success:
|
|
446
|
+
return ToolResult(success=False, error=f"Failed to update ticket {ticket_id} metadata")
|
|
447
|
+
|
|
448
|
+
result_data["updates"]["metadata"] = metadata_updates
|
|
449
|
+
return None
|
|
450
|
+
|
|
451
|
+
async def _update_ticket(self, params: ToolParameters) -> ToolResult:
|
|
452
|
+
"""Update ticket status or metadata during task processing."""
|
|
453
|
+
import time
|
|
454
|
+
|
|
455
|
+
start_time = time.time()
|
|
456
|
+
|
|
457
|
+
try:
|
|
458
|
+
from ciris_engine.logic.persistence.models.tickets import get_ticket
|
|
459
|
+
|
|
460
|
+
# Validate ticket_id
|
|
461
|
+
ticket_id = self._validate_ticket_id(params)
|
|
462
|
+
if not ticket_id:
|
|
463
|
+
return ToolResult(success=False, error=ERROR_TICKET_ID_REQUIRED)
|
|
464
|
+
|
|
465
|
+
logger.debug(f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s START ticket_id={ticket_id}")
|
|
466
|
+
|
|
467
|
+
# Get current ticket to validate and merge metadata
|
|
468
|
+
current_ticket = get_ticket(ticket_id, db_path=self._db_path)
|
|
469
|
+
if not current_ticket:
|
|
470
|
+
return ToolResult(success=False, error=f"Ticket {ticket_id} not found")
|
|
471
|
+
|
|
472
|
+
logger.debug(
|
|
473
|
+
f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s FETCHED current_metadata={current_ticket.get('metadata', {})}"
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
result_data: dict[str, Any] = {"ticket_id": ticket_id, "updates": {}}
|
|
477
|
+
|
|
478
|
+
# Update status if provided
|
|
479
|
+
new_status = params.get("status")
|
|
480
|
+
if new_status:
|
|
481
|
+
error_result = self._update_ticket_status_only(ticket_id, new_status, params, result_data)
|
|
482
|
+
if error_result:
|
|
483
|
+
return error_result
|
|
484
|
+
|
|
485
|
+
# Update metadata if provided
|
|
486
|
+
metadata_updates = params.get("metadata")
|
|
487
|
+
if metadata_updates:
|
|
488
|
+
error_result = self._update_ticket_metadata_only(
|
|
489
|
+
ticket_id, current_ticket, metadata_updates, result_data, start_time
|
|
490
|
+
)
|
|
491
|
+
if error_result:
|
|
492
|
+
return error_result
|
|
493
|
+
|
|
494
|
+
self._tickets_updated += 1
|
|
495
|
+
logger.debug(f"[UPDATE_TICKET] T+{time.time()-start_time:.3f}s COMPLETE result={result_data}")
|
|
496
|
+
return ToolResult(success=True, data=result_data)
|
|
497
|
+
|
|
498
|
+
except Exception as e:
|
|
499
|
+
logger.error(f"Error updating ticket: {e}")
|
|
500
|
+
return ToolResult(success=False, error=str(e))
|
|
501
|
+
|
|
502
|
+
async def _get_ticket(self, params: ToolParameters) -> ToolResult:
|
|
503
|
+
"""Retrieve current ticket state during task processing."""
|
|
504
|
+
try:
|
|
505
|
+
from ciris_engine.logic.persistence.models.tickets import get_ticket
|
|
506
|
+
|
|
507
|
+
ticket_id = params.get("ticket_id")
|
|
508
|
+
if not ticket_id or not isinstance(ticket_id, str):
|
|
509
|
+
return ToolResult(success=False, error=ERROR_TICKET_ID_REQUIRED)
|
|
510
|
+
|
|
511
|
+
# Use self._db_path to respect provided path or current config
|
|
512
|
+
ticket = get_ticket(ticket_id, db_path=self._db_path)
|
|
513
|
+
if not ticket:
|
|
514
|
+
return ToolResult(success=False, error=f"Ticket {ticket_id} not found")
|
|
515
|
+
|
|
516
|
+
self._tickets_retrieved += 1
|
|
517
|
+
return ToolResult(success=True, data=ticket)
|
|
518
|
+
|
|
519
|
+
except Exception as e:
|
|
520
|
+
logger.error(f"Error retrieving ticket: {e}")
|
|
521
|
+
return ToolResult(success=False, error=str(e))
|
|
522
|
+
|
|
523
|
+
async def _defer_ticket(self, params: ToolParameters) -> ToolResult:
|
|
524
|
+
"""Defer ticket processing to a future time or await human response.
|
|
525
|
+
|
|
526
|
+
Automatically sets ticket status to 'deferred' to prevent WorkProcessor
|
|
527
|
+
from creating new tasks until the deferral condition is resolved.
|
|
528
|
+
"""
|
|
529
|
+
try:
|
|
530
|
+
from datetime import timedelta
|
|
531
|
+
|
|
532
|
+
from ciris_engine.logic.persistence.models.tickets import (
|
|
533
|
+
get_ticket,
|
|
534
|
+
update_ticket_metadata,
|
|
535
|
+
update_ticket_status,
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
ticket_id = params.get("ticket_id")
|
|
539
|
+
if not ticket_id or not isinstance(ticket_id, str):
|
|
540
|
+
return ToolResult(success=False, error=ERROR_TICKET_ID_REQUIRED)
|
|
541
|
+
|
|
542
|
+
# Get current ticket - use self._db_path to respect provided path or current config
|
|
543
|
+
current_ticket = get_ticket(ticket_id, db_path=self._db_path)
|
|
544
|
+
if not current_ticket:
|
|
545
|
+
return ToolResult(success=False, error=f"Ticket {ticket_id} not found")
|
|
546
|
+
|
|
547
|
+
current_metadata = current_ticket.get("metadata", {})
|
|
548
|
+
if not isinstance(current_metadata, dict):
|
|
549
|
+
current_metadata = {}
|
|
550
|
+
|
|
551
|
+
# Determine deferral type
|
|
552
|
+
defer_until_timestamp = params.get("defer_until") # ISO8601 timestamp
|
|
553
|
+
defer_hours = params.get("defer_hours") # Relative hours
|
|
554
|
+
await_human = params.get("await_human", False) # Wait for human response
|
|
555
|
+
reason = params.get("reason", "No reason provided")
|
|
556
|
+
|
|
557
|
+
result_data = {"ticket_id": ticket_id, "deferral_type": None, "reason": reason}
|
|
558
|
+
|
|
559
|
+
if await_human:
|
|
560
|
+
# Mark as awaiting human response
|
|
561
|
+
current_metadata["awaiting_human_response"] = True
|
|
562
|
+
current_metadata["deferred_reason"] = reason
|
|
563
|
+
current_metadata["deferred_at"] = self._now().isoformat()
|
|
564
|
+
result_data["deferral_type"] = "awaiting_human"
|
|
565
|
+
|
|
566
|
+
elif defer_until_timestamp:
|
|
567
|
+
# Defer until specific timestamp
|
|
568
|
+
current_metadata["deferred_until"] = defer_until_timestamp
|
|
569
|
+
current_metadata["deferred_reason"] = reason
|
|
570
|
+
current_metadata["deferred_at"] = self._now().isoformat()
|
|
571
|
+
current_metadata["awaiting_human_response"] = False
|
|
572
|
+
result_data["deferral_type"] = "until_timestamp"
|
|
573
|
+
result_data["deferred_until"] = defer_until_timestamp
|
|
574
|
+
|
|
575
|
+
elif defer_hours:
|
|
576
|
+
# Defer for relative hours
|
|
577
|
+
if not isinstance(defer_hours, (int, float)):
|
|
578
|
+
return ToolResult(success=False, error="defer_hours must be a number")
|
|
579
|
+
defer_until = self._now() + timedelta(hours=float(defer_hours))
|
|
580
|
+
current_metadata["deferred_until"] = defer_until.isoformat()
|
|
581
|
+
current_metadata["deferred_reason"] = reason
|
|
582
|
+
current_metadata["deferred_at"] = self._now().isoformat()
|
|
583
|
+
current_metadata["awaiting_human_response"] = False
|
|
584
|
+
result_data["deferral_type"] = "relative_hours"
|
|
585
|
+
result_data["deferred_until"] = defer_until.isoformat()
|
|
586
|
+
result_data["defer_hours"] = defer_hours
|
|
587
|
+
|
|
588
|
+
else:
|
|
589
|
+
return ToolResult(success=False, error="Must provide defer_until, defer_hours, or await_human=true")
|
|
590
|
+
|
|
591
|
+
# Update ticket status to 'deferred' (prevents task generation)
|
|
592
|
+
status_success = update_ticket_status(
|
|
593
|
+
ticket_id, "deferred", notes=f"Deferred: {reason}", db_path=self._db_path
|
|
594
|
+
)
|
|
595
|
+
if not status_success:
|
|
596
|
+
return ToolResult(success=False, error=f"Failed to update ticket {ticket_id} status to deferred")
|
|
597
|
+
|
|
598
|
+
# Update ticket metadata
|
|
599
|
+
success = update_ticket_metadata(ticket_id, current_metadata, db_path=self._db_path)
|
|
600
|
+
if not success:
|
|
601
|
+
return ToolResult(success=False, error=f"Failed to defer ticket {ticket_id}")
|
|
602
|
+
|
|
603
|
+
self._tickets_deferred += 1
|
|
604
|
+
result_data["status_updated"] = "deferred"
|
|
605
|
+
return ToolResult(success=True, data=result_data)
|
|
606
|
+
|
|
607
|
+
except Exception as e:
|
|
608
|
+
logger.error(f"Error deferring ticket: {e}")
|
|
609
|
+
return ToolResult(success=False, error=str(e))
|
|
610
|
+
|
|
611
|
+
async def get_available_tools(self) -> List[str]:
|
|
612
|
+
"""Get list of available tool names."""
|
|
613
|
+
return ["recall_secret", "update_secrets_filter", "self_help", "update_ticket", "get_ticket", "defer_ticket"]
|
|
614
|
+
|
|
615
|
+
async def get_tool_info(self, tool_name: str) -> Optional[ToolInfo]:
|
|
616
|
+
"""Get detailed information about a specific tool."""
|
|
617
|
+
if tool_name == "recall_secret":
|
|
618
|
+
return ToolInfo(
|
|
619
|
+
name="recall_secret",
|
|
620
|
+
description="Recall a stored secret by UUID",
|
|
621
|
+
parameters=ToolParameterSchema(
|
|
622
|
+
type="object",
|
|
623
|
+
properties={
|
|
624
|
+
"secret_uuid": {"type": "string", "description": "UUID of the secret to recall"},
|
|
625
|
+
"purpose": {"type": "string", "description": "Why the secret is needed (for audit)"},
|
|
626
|
+
"decrypt": {
|
|
627
|
+
"type": "boolean",
|
|
628
|
+
"description": "Whether to decrypt the secret value",
|
|
629
|
+
"default": False,
|
|
630
|
+
},
|
|
631
|
+
},
|
|
632
|
+
required=["secret_uuid", "purpose"],
|
|
633
|
+
),
|
|
634
|
+
category="security",
|
|
635
|
+
when_to_use="When you need to retrieve a previously stored secret value",
|
|
636
|
+
)
|
|
637
|
+
elif tool_name == "update_secrets_filter":
|
|
638
|
+
return ToolInfo(
|
|
639
|
+
name="update_secrets_filter",
|
|
640
|
+
description="Update secrets detection filter configuration",
|
|
641
|
+
parameters=ToolParameterSchema(
|
|
642
|
+
type="object",
|
|
643
|
+
properties={
|
|
644
|
+
"operation": {
|
|
645
|
+
"type": "string",
|
|
646
|
+
"enum": ["add_pattern", "remove_pattern", "list_patterns", "enable"],
|
|
647
|
+
"description": "Operation to perform",
|
|
648
|
+
},
|
|
649
|
+
"pattern": {"type": "string", "description": "Pattern for add/remove operations"},
|
|
650
|
+
"pattern_type": {"type": "string", "enum": ["regex", "exact"], "default": "regex"},
|
|
651
|
+
"enabled": {"type": "boolean", "description": "For enable operation"},
|
|
652
|
+
},
|
|
653
|
+
required=["operation"],
|
|
654
|
+
),
|
|
655
|
+
category="security",
|
|
656
|
+
when_to_use="When you need to modify how secrets are detected",
|
|
657
|
+
)
|
|
658
|
+
elif tool_name == "self_help":
|
|
659
|
+
return ToolInfo(
|
|
660
|
+
name="self_help",
|
|
661
|
+
description="Access your experience document for guidance",
|
|
662
|
+
parameters=ToolParameterSchema(type="object", properties={}, required=[]),
|
|
663
|
+
category="knowledge",
|
|
664
|
+
when_to_use="When you need guidance on your capabilities or best practices",
|
|
665
|
+
)
|
|
666
|
+
elif tool_name == "update_ticket":
|
|
667
|
+
return ToolInfo(
|
|
668
|
+
name="update_ticket",
|
|
669
|
+
description="Update ticket status or metadata during task processing",
|
|
670
|
+
parameters=ToolParameterSchema(
|
|
671
|
+
type="object",
|
|
672
|
+
properties={
|
|
673
|
+
"ticket_id": {"type": "string", "description": "Ticket ID to update"},
|
|
674
|
+
"status": {
|
|
675
|
+
"type": "string",
|
|
676
|
+
"enum": [
|
|
677
|
+
"pending",
|
|
678
|
+
"assigned",
|
|
679
|
+
"in_progress",
|
|
680
|
+
"blocked",
|
|
681
|
+
"deferred",
|
|
682
|
+
"completed",
|
|
683
|
+
"cancelled",
|
|
684
|
+
"failed",
|
|
685
|
+
],
|
|
686
|
+
"description": "New ticket status",
|
|
687
|
+
},
|
|
688
|
+
"metadata": {
|
|
689
|
+
"type": "object",
|
|
690
|
+
"description": "Metadata updates (merged with existing metadata)",
|
|
691
|
+
},
|
|
692
|
+
"notes": {"type": "string", "description": "Optional notes about the update"},
|
|
693
|
+
},
|
|
694
|
+
required=["ticket_id"],
|
|
695
|
+
),
|
|
696
|
+
category="workflow",
|
|
697
|
+
when_to_use="When processing a ticket task and need to record progress or results",
|
|
698
|
+
)
|
|
699
|
+
elif tool_name == "get_ticket":
|
|
700
|
+
return ToolInfo(
|
|
701
|
+
name="get_ticket",
|
|
702
|
+
description="Retrieve current ticket state during task processing",
|
|
703
|
+
parameters=ToolParameterSchema(
|
|
704
|
+
type="object",
|
|
705
|
+
properties={"ticket_id": {"type": "string", "description": "Ticket ID to retrieve"}},
|
|
706
|
+
required=["ticket_id"],
|
|
707
|
+
),
|
|
708
|
+
category="workflow",
|
|
709
|
+
when_to_use="When you need to check current ticket status, metadata, or stage progress",
|
|
710
|
+
)
|
|
711
|
+
elif tool_name == "defer_ticket":
|
|
712
|
+
return ToolInfo(
|
|
713
|
+
name="defer_ticket",
|
|
714
|
+
description="Defer ticket processing to future time or await human response",
|
|
715
|
+
parameters=ToolParameterSchema(
|
|
716
|
+
type="object",
|
|
717
|
+
properties={
|
|
718
|
+
"ticket_id": {"type": "string", "description": "Ticket ID to defer"},
|
|
719
|
+
"defer_until": {"type": "string", "description": "ISO8601 timestamp to defer until"},
|
|
720
|
+
"defer_hours": {"type": "number", "description": "Hours to defer (relative)"},
|
|
721
|
+
"await_human": {
|
|
722
|
+
"type": "boolean",
|
|
723
|
+
"description": "Wait for human response (blocks task generation)",
|
|
724
|
+
},
|
|
725
|
+
"reason": {"type": "string", "description": "Reason for deferral (for audit/transparency)"},
|
|
726
|
+
},
|
|
727
|
+
required=["ticket_id", "reason"],
|
|
728
|
+
),
|
|
729
|
+
category="workflow",
|
|
730
|
+
when_to_use="When ticket needs human input or must wait for external event/time",
|
|
731
|
+
)
|
|
732
|
+
return None
|
|
733
|
+
|
|
734
|
+
async def get_all_tool_info(self) -> List[ToolInfo]:
|
|
735
|
+
"""Get information about all available tools."""
|
|
736
|
+
tools = []
|
|
737
|
+
for tool_name in await self.get_available_tools():
|
|
738
|
+
tool_info = await self.get_tool_info(tool_name)
|
|
739
|
+
if tool_info:
|
|
740
|
+
tools.append(tool_info)
|
|
741
|
+
return tools
|
|
742
|
+
|
|
743
|
+
async def validate_parameters(self, tool_name: str, parameters: ToolParameters) -> bool:
|
|
744
|
+
"""Validate parameters for a tool."""
|
|
745
|
+
if tool_name == "recall_secret":
|
|
746
|
+
return "secret_uuid" in parameters and "purpose" in parameters
|
|
747
|
+
elif tool_name == "update_secrets_filter":
|
|
748
|
+
operation = parameters.get("operation")
|
|
749
|
+
if not operation:
|
|
750
|
+
return False
|
|
751
|
+
if operation in ["add_pattern", "remove_pattern"]:
|
|
752
|
+
return "pattern" in parameters
|
|
753
|
+
return True
|
|
754
|
+
elif tool_name == "self_help":
|
|
755
|
+
return True # No parameters required
|
|
756
|
+
elif tool_name == "update_ticket":
|
|
757
|
+
return "ticket_id" in parameters
|
|
758
|
+
elif tool_name == "get_ticket":
|
|
759
|
+
return "ticket_id" in parameters
|
|
760
|
+
elif tool_name == "defer_ticket":
|
|
761
|
+
return "ticket_id" in parameters and "reason" in parameters
|
|
762
|
+
return False
|
|
763
|
+
|
|
764
|
+
async def get_tool_result(self, correlation_id: str, timeout: float = 30.0) -> Optional[ToolExecutionResult]:
|
|
765
|
+
"""Get result of an async tool execution."""
|
|
766
|
+
# Secrets tools execute synchronously
|
|
767
|
+
return None
|
|
768
|
+
|
|
769
|
+
async def list_tools(self) -> List[str]:
|
|
770
|
+
"""List available tools - required by ToolServiceProtocol."""
|
|
771
|
+
return await self.get_available_tools()
|
|
772
|
+
|
|
773
|
+
async def get_tool_schema(self, tool_name: str) -> Optional[ToolParameterSchema]:
|
|
774
|
+
"""Get parameter schema for a specific tool - required by ToolServiceProtocol."""
|
|
775
|
+
tool_info = await self.get_tool_info(tool_name)
|
|
776
|
+
if tool_info:
|
|
777
|
+
return tool_info.parameters
|
|
778
|
+
return None
|
|
779
|
+
|
|
780
|
+
def get_capabilities(self) -> ServiceCapabilities:
|
|
781
|
+
"""Get service capabilities with custom metadata."""
|
|
782
|
+
# Get base capabilities
|
|
783
|
+
capabilities = super().get_capabilities()
|
|
784
|
+
|
|
785
|
+
# Add custom metadata using model_copy
|
|
786
|
+
if capabilities.metadata:
|
|
787
|
+
capabilities.metadata = capabilities.metadata.model_copy(
|
|
788
|
+
update={"adapter": self.adapter_name, "tool_count": 6}
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
return capabilities
|
|
792
|
+
|
|
793
|
+
def _collect_custom_metrics(self) -> Dict[str, float]:
|
|
794
|
+
"""Collect tool service specific metrics."""
|
|
795
|
+
metrics = super()._collect_custom_metrics()
|
|
796
|
+
|
|
797
|
+
# Calculate success rate
|
|
798
|
+
success_rate = 0.0
|
|
799
|
+
if self._request_count > 0:
|
|
800
|
+
success_rate = (self._request_count - self._error_count) / self._request_count
|
|
801
|
+
|
|
802
|
+
# Add tool-specific metrics
|
|
803
|
+
metrics.update(
|
|
804
|
+
{
|
|
805
|
+
"tool_executions": float(self._request_count),
|
|
806
|
+
"tool_errors": float(self._error_count),
|
|
807
|
+
"success_rate": success_rate,
|
|
808
|
+
"secrets_retrieved": float(self._secrets_retrieved),
|
|
809
|
+
"tickets_updated": float(self._tickets_updated),
|
|
810
|
+
"tickets_retrieved": float(self._tickets_retrieved),
|
|
811
|
+
"tickets_deferred": float(self._tickets_deferred),
|
|
812
|
+
"audit_events_generated": float(self._request_count), # Each execution generates an audit event
|
|
813
|
+
"available_tools": 6.0, # recall_secret, update_secrets_filter, self_help, update_ticket, get_ticket, defer_ticket
|
|
814
|
+
}
|
|
815
|
+
)
|
|
816
|
+
|
|
817
|
+
return metrics
|
|
818
|
+
|
|
819
|
+
async def get_metrics(self) -> Dict[str, float]:
|
|
820
|
+
"""Get all metrics including base, custom, and v1.4.3 specific.
|
|
821
|
+
|
|
822
|
+
Returns:
|
|
823
|
+
Dict with all metrics including tool-specific and v1.4.3 metrics
|
|
824
|
+
"""
|
|
825
|
+
# Get all base + custom metrics
|
|
826
|
+
metrics = self._collect_metrics()
|
|
827
|
+
|
|
828
|
+
current_time = self._time_service.now() if self._time_service else datetime.now(timezone.utc)
|
|
829
|
+
uptime_seconds = 0.0
|
|
830
|
+
if self._start_time:
|
|
831
|
+
uptime_seconds = max(0.0, (current_time - self._start_time).total_seconds())
|
|
832
|
+
|
|
833
|
+
# Add v1.4.3 specific metrics
|
|
834
|
+
metrics.update(
|
|
835
|
+
{
|
|
836
|
+
"core_tool_invocations": float(self._request_count),
|
|
837
|
+
"core_tool_uptime_seconds": uptime_seconds,
|
|
838
|
+
"secrets_retrieved": float(self._secrets_retrieved),
|
|
839
|
+
"secrets_stored": 0.0, # This service only retrieves, never stores
|
|
840
|
+
"tickets_updated": float(self._tickets_updated),
|
|
841
|
+
"tickets_retrieved": float(self._tickets_retrieved),
|
|
842
|
+
"tickets_deferred": float(self._tickets_deferred),
|
|
843
|
+
# Backwards compatibility aliases for unit tests
|
|
844
|
+
"tickets_updated_total": float(self._tickets_updated),
|
|
845
|
+
"tickets_deferred_total": float(self._tickets_deferred),
|
|
846
|
+
"tools_enabled": 6.0, # recall_secret, update_secrets_filter, self_help, update_ticket, get_ticket, defer_ticket
|
|
847
|
+
}
|
|
848
|
+
)
|
|
849
|
+
|
|
850
|
+
return metrics
|
|
851
|
+
|
|
852
|
+
# get_telemetry() removed - use get_metrics() from BaseService instead
|