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,1041 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Any, Dict, List, Optional, Union
|
|
3
|
+
|
|
4
|
+
from ciris_engine.schemas.actions import (
|
|
5
|
+
DeferParams,
|
|
6
|
+
ForgetParams,
|
|
7
|
+
MemorizeParams,
|
|
8
|
+
ObserveParams,
|
|
9
|
+
PonderParams,
|
|
10
|
+
RecallParams,
|
|
11
|
+
RejectParams,
|
|
12
|
+
SpeakParams,
|
|
13
|
+
TaskCompleteParams,
|
|
14
|
+
ToolParams,
|
|
15
|
+
)
|
|
16
|
+
from ciris_engine.schemas.dma.results import ActionSelectionDMAResult
|
|
17
|
+
|
|
18
|
+
# Union type for all action parameters - 100% schema compliant
|
|
19
|
+
ActionParams = Union[
|
|
20
|
+
SpeakParams,
|
|
21
|
+
MemorizeParams,
|
|
22
|
+
RecallParams,
|
|
23
|
+
PonderParams,
|
|
24
|
+
ObserveParams,
|
|
25
|
+
ToolParams,
|
|
26
|
+
RejectParams,
|
|
27
|
+
DeferParams,
|
|
28
|
+
ForgetParams,
|
|
29
|
+
TaskCompleteParams,
|
|
30
|
+
]
|
|
31
|
+
from typing import Union
|
|
32
|
+
|
|
33
|
+
from ciris_engine.logic.utils.channel_utils import create_channel_context
|
|
34
|
+
from ciris_engine.schemas.runtime.enums import HandlerActionType
|
|
35
|
+
from ciris_engine.schemas.services.graph_core import GraphNode, GraphNodeAttributes, GraphScope, NodeType
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def action_selection(
|
|
39
|
+
context: Optional[List[Any]] = None, messages: Optional[List[Dict[str, Any]]] = None
|
|
40
|
+
) -> ActionSelectionDMAResult:
|
|
41
|
+
"""Mock ActionSelectionDMAResult with passing values and protocol-compliant types."""
|
|
42
|
+
context = context or []
|
|
43
|
+
messages = messages or []
|
|
44
|
+
|
|
45
|
+
# Debug context parsing
|
|
46
|
+
import logging
|
|
47
|
+
|
|
48
|
+
logger = logging.getLogger(__name__)
|
|
49
|
+
|
|
50
|
+
# === CRITICAL: Early follow-up detection ===
|
|
51
|
+
# Check the FIRST system message for THOUGHT_TYPE=follow_up
|
|
52
|
+
# This MUST happen before any other logic to ensure follow-ups are detected
|
|
53
|
+
is_followup_thought = False
|
|
54
|
+
if messages and len(messages) > 0:
|
|
55
|
+
first_msg = messages[0]
|
|
56
|
+
if isinstance(first_msg, dict) and first_msg.get("role") == "system":
|
|
57
|
+
content = first_msg.get("content", "")
|
|
58
|
+
# Log what we're checking (INFO level for visibility)
|
|
59
|
+
logger.info(f"[MOCK_LLM] FIRST SYSTEM MESSAGE (first 100 chars): {content[:100] if content else 'EMPTY'}")
|
|
60
|
+
if content.startswith("THOUGHT_TYPE=follow_up"):
|
|
61
|
+
is_followup_thought = True
|
|
62
|
+
logger.info("[MOCK_LLM] *** DETECTED FOLLOW-UP THOUGHT *** via THOUGHT_TYPE=follow_up in first message")
|
|
63
|
+
elif "THOUGHT_TYPE=" in content:
|
|
64
|
+
# Log what type it actually is
|
|
65
|
+
thought_type_match = content.split("\n")[0] if content else ""
|
|
66
|
+
logger.info(f"[MOCK_LLM] Found different thought type: {thought_type_match}")
|
|
67
|
+
else:
|
|
68
|
+
logger.info("[MOCK_LLM] No THOUGHT_TYPE found in first system message")
|
|
69
|
+
else:
|
|
70
|
+
logger.info("[MOCK_LLM] WARNING: No messages passed to action_selection!")
|
|
71
|
+
|
|
72
|
+
logger.debug(f"[MOCK_LLM] Context items: {len(context)}")
|
|
73
|
+
logger.debug(f"[MOCK_LLM] Messages count: {len(messages)}")
|
|
74
|
+
if messages:
|
|
75
|
+
for i, msg in enumerate(messages[:3]): # First 3 messages
|
|
76
|
+
role = msg.get("role", "unknown") if isinstance(msg, dict) else "not-dict"
|
|
77
|
+
content_preview = str(msg.get("content", ""))[:100] if isinstance(msg, dict) else str(msg)[:100]
|
|
78
|
+
logger.debug(f"[MOCK_LLM] Message {i}: role={role}, content={content_preview}...")
|
|
79
|
+
|
|
80
|
+
# If messages not provided, try to extract from context for backwards compatibility
|
|
81
|
+
if not messages:
|
|
82
|
+
for item in context:
|
|
83
|
+
if item.startswith("__messages__:"):
|
|
84
|
+
import json
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
messages = json.loads(item.split(":", 1)[1])
|
|
88
|
+
except json.JSONDecodeError:
|
|
89
|
+
pass
|
|
90
|
+
break
|
|
91
|
+
|
|
92
|
+
# The mock LLM no longer extracts or sets channel for SPEAK actions
|
|
93
|
+
# It will only use channel_context when explicitly told via @channel: syntax
|
|
94
|
+
logger.info("[MOCK_LLM] Not extracting channel from context - will use task context unless @channel: is specified")
|
|
95
|
+
|
|
96
|
+
# Default channel for non-SPEAK actions that need a channel
|
|
97
|
+
default_channel = "cli"
|
|
98
|
+
|
|
99
|
+
# Extract user input
|
|
100
|
+
user_input = ""
|
|
101
|
+
for item in context:
|
|
102
|
+
if item.startswith("user_input:") or item.startswith("task:") or item.startswith("content:"):
|
|
103
|
+
user_input = item.split(":", 1)[1].strip()
|
|
104
|
+
break
|
|
105
|
+
|
|
106
|
+
# Extract user speech (non-command input)
|
|
107
|
+
user_speech = ""
|
|
108
|
+
if user_input and not user_input.startswith("$"):
|
|
109
|
+
user_speech = user_input
|
|
110
|
+
|
|
111
|
+
# If user_input is a command, handle it directly
|
|
112
|
+
command_from_context = None
|
|
113
|
+
command_args_from_context = ""
|
|
114
|
+
if user_input and user_input.startswith("$"):
|
|
115
|
+
# Parse the command from user_input
|
|
116
|
+
parts = user_input.split(None, 1)
|
|
117
|
+
command_from_context = parts[0].lower()
|
|
118
|
+
command_args_from_context = parts[1] if len(parts) > 1 else ""
|
|
119
|
+
|
|
120
|
+
# Check for forced actions (testing)
|
|
121
|
+
forced_action = None
|
|
122
|
+
action_params = ""
|
|
123
|
+
for item in context:
|
|
124
|
+
if item.startswith("forced_action:"):
|
|
125
|
+
forced_action = item.split(":", 1)[1]
|
|
126
|
+
elif item.startswith("action_params:"):
|
|
127
|
+
action_params = item.split(":", 1)[1]
|
|
128
|
+
|
|
129
|
+
# Check for custom rationale
|
|
130
|
+
custom_rationale = None
|
|
131
|
+
for item in context:
|
|
132
|
+
if item.startswith("custom_rationale:"):
|
|
133
|
+
custom_rationale = item.split(":", 1)[1]
|
|
134
|
+
break
|
|
135
|
+
|
|
136
|
+
# Initialize rationale with default - should be overridden by specific logic paths
|
|
137
|
+
rationale = "[MOCK LLM] Action selection (no specific rationale provided)"
|
|
138
|
+
|
|
139
|
+
# Check for help request
|
|
140
|
+
show_help = False
|
|
141
|
+
for item in context:
|
|
142
|
+
if item == "show_help_requested":
|
|
143
|
+
show_help = True
|
|
144
|
+
break
|
|
145
|
+
|
|
146
|
+
# Determine action based on context
|
|
147
|
+
# Initialize params with proper type annotation for 100% schema compliance
|
|
148
|
+
params: ActionParams
|
|
149
|
+
|
|
150
|
+
# Check for multimodal content in context
|
|
151
|
+
multimodal_image_count = 0
|
|
152
|
+
for item in context:
|
|
153
|
+
if item.startswith("multimodal_images:"):
|
|
154
|
+
try:
|
|
155
|
+
multimodal_image_count = int(item.split(":", 1)[1])
|
|
156
|
+
except ValueError:
|
|
157
|
+
pass
|
|
158
|
+
break
|
|
159
|
+
|
|
160
|
+
# Debug logging
|
|
161
|
+
logger.info(
|
|
162
|
+
f"[MOCK_LLM] Action selection - forced_action: {forced_action}, user_speech: {user_speech}, command_from_context: {command_from_context}, is_followup_thought: {is_followup_thought}, multimodal_images: {multimodal_image_count}"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# === EARLY EXIT FOR FOLLOW-UP THOUGHTS ===
|
|
166
|
+
# If this is a follow-up thought (detected via THOUGHT_TYPE=follow_up), complete the task
|
|
167
|
+
# This check MUST come before other logic to prevent follow-ups from looping
|
|
168
|
+
if is_followup_thought and not forced_action and not command_from_context:
|
|
169
|
+
logger.info("[MOCK_LLM] *** EARLY EXIT: Follow-up thought detected, returning TASK_COMPLETE ***")
|
|
170
|
+
action = HandlerActionType.TASK_COMPLETE
|
|
171
|
+
params = TaskCompleteParams(completion_reason="[MOCK LLM] Follow-up thought completed - task finished")
|
|
172
|
+
rationale = "[MOCK LLM] Completing follow-up thought (detected via THOUGHT_TYPE=follow_up)"
|
|
173
|
+
return ActionSelectionDMAResult(
|
|
174
|
+
selected_action=action,
|
|
175
|
+
action_parameters=params.model_dump(),
|
|
176
|
+
rationale=rationale,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if forced_action:
|
|
180
|
+
try:
|
|
181
|
+
action = getattr(HandlerActionType, forced_action.upper())
|
|
182
|
+
|
|
183
|
+
# Parse parameters based on action type
|
|
184
|
+
if action == HandlerActionType.SPEAK:
|
|
185
|
+
if action_params:
|
|
186
|
+
# Check if user wants to display context
|
|
187
|
+
if action_params.strip() == "$context":
|
|
188
|
+
# Display the full context
|
|
189
|
+
import json
|
|
190
|
+
|
|
191
|
+
context_display = "📋 **Full Context Display**\n\n"
|
|
192
|
+
context_display += "**Extracted Context Items:**\n"
|
|
193
|
+
for item in context:
|
|
194
|
+
context_display += f"• {item}\n"
|
|
195
|
+
|
|
196
|
+
# Get the original messages if available
|
|
197
|
+
context_display += "\n**Original Messages:**\n"
|
|
198
|
+
for i, msg in enumerate(messages or []):
|
|
199
|
+
role = msg.get("role", "unknown")
|
|
200
|
+
content = msg.get("content", "")
|
|
201
|
+
context_display += f"\n[{i}] {role}:\n{content}\n"
|
|
202
|
+
|
|
203
|
+
params = SpeakParams(content=context_display)
|
|
204
|
+
else:
|
|
205
|
+
# Check for @channel: syntax in forced action params
|
|
206
|
+
speak_content = action_params
|
|
207
|
+
speak_channel = default_channel
|
|
208
|
+
|
|
209
|
+
# re already imported at top of file
|
|
210
|
+
channel_match = re.search(r"@channel:(\S+)", action_params)
|
|
211
|
+
if channel_match:
|
|
212
|
+
speak_channel = channel_match.group(1)
|
|
213
|
+
# Remove the @channel: part from the content
|
|
214
|
+
speak_content = action_params.replace(channel_match.group(0), "").strip()
|
|
215
|
+
if not speak_content:
|
|
216
|
+
speak_content = "[MOCK LLM] Cross-channel message"
|
|
217
|
+
logger.info(
|
|
218
|
+
f"[MOCK_LLM] Parsed channel from @channel: syntax in forced action - channel: {speak_channel}, content: {speak_content[:50]}"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# Only set channel_context if @channel: was explicitly used
|
|
222
|
+
if channel_match:
|
|
223
|
+
params = SpeakParams(
|
|
224
|
+
content=speak_content, channel_context=create_channel_context(speak_channel)
|
|
225
|
+
)
|
|
226
|
+
logger.info(
|
|
227
|
+
f"[MOCK_LLM] Created SpeakParams with channel_context for channel: {speak_channel}"
|
|
228
|
+
)
|
|
229
|
+
else:
|
|
230
|
+
params = SpeakParams(content=speak_content)
|
|
231
|
+
logger.info(
|
|
232
|
+
"[MOCK_LLM] Created SpeakParams without channel_context - will use task context"
|
|
233
|
+
)
|
|
234
|
+
else:
|
|
235
|
+
# Provide helpful error with valid format
|
|
236
|
+
error_msg = "❌ $speak requires content. Format: $speak <message>\nExample: $speak Hello world!\nSpecial: $speak $context (displays full context)"
|
|
237
|
+
params = SpeakParams(content=error_msg)
|
|
238
|
+
|
|
239
|
+
elif action == HandlerActionType.MEMORIZE:
|
|
240
|
+
if action_params:
|
|
241
|
+
# Try to parse node info from params
|
|
242
|
+
parts = action_params.split()
|
|
243
|
+
if len(parts) >= 1:
|
|
244
|
+
node_id = parts[0]
|
|
245
|
+
node_type = parts[1] if len(parts) > 1 else "CONCEPT"
|
|
246
|
+
scope = parts[2] if len(parts) > 2 else "LOCAL"
|
|
247
|
+
|
|
248
|
+
# Validate and provide tooltips
|
|
249
|
+
valid_types = ["AGENT", "USER", "CHANNEL", "CONCEPT", "CONFIG"]
|
|
250
|
+
valid_scopes = ["LOCAL", "IDENTITY", "ENVIRONMENT", "COMMUNITY", "NETWORK"]
|
|
251
|
+
|
|
252
|
+
if node_type.upper() not in valid_types:
|
|
253
|
+
error_msg = f"❌ Invalid node type '{node_type}'. Valid types: {', '.join(valid_types)}"
|
|
254
|
+
params = SpeakParams(content=error_msg)
|
|
255
|
+
action = HandlerActionType.SPEAK
|
|
256
|
+
elif scope.upper() not in valid_scopes:
|
|
257
|
+
error_msg = f"❌ Invalid scope '{scope}'. Valid scopes: {', '.join(valid_scopes)}"
|
|
258
|
+
params = SpeakParams(content=error_msg)
|
|
259
|
+
action = HandlerActionType.SPEAK
|
|
260
|
+
else:
|
|
261
|
+
params = MemorizeParams(
|
|
262
|
+
node=GraphNode(
|
|
263
|
+
id=node_id,
|
|
264
|
+
type=getattr(NodeType, node_type.upper()),
|
|
265
|
+
scope=getattr(GraphScope, scope.upper()),
|
|
266
|
+
attributes={"created_by": "mock_llm"},
|
|
267
|
+
)
|
|
268
|
+
)
|
|
269
|
+
else:
|
|
270
|
+
error_msg = "❌ $memorize requires: <node_id> [type] [scope]\nExample: $memorize user123 USER LOCAL\nTypes: AGENT, USER, CHANNEL, CONCEPT, CONFIG\nScopes: LOCAL, IDENTITY, ENVIRONMENT, COMMUNITY, NETWORK"
|
|
271
|
+
params = SpeakParams(content=error_msg)
|
|
272
|
+
action = HandlerActionType.SPEAK
|
|
273
|
+
else:
|
|
274
|
+
error_msg = "❌ $memorize requires: <node_id> [type] [scope]\nExample: $memorize concept/weather CONCEPT LOCAL"
|
|
275
|
+
params = SpeakParams(content=error_msg)
|
|
276
|
+
action = HandlerActionType.SPEAK
|
|
277
|
+
|
|
278
|
+
elif action == HandlerActionType.RECALL:
|
|
279
|
+
if action_params:
|
|
280
|
+
# Parse recall parameters - can be a query string or node ID
|
|
281
|
+
parts = action_params.split()
|
|
282
|
+
if len(parts) == 1:
|
|
283
|
+
# Single parameter - treat as query
|
|
284
|
+
params = RecallParams(query=action_params, limit=10)
|
|
285
|
+
else:
|
|
286
|
+
# Multiple parameters - parse as node_id, type, scope
|
|
287
|
+
node_id = parts[0]
|
|
288
|
+
recall_type: str = parts[1] if len(parts) > 1 else "general"
|
|
289
|
+
scope_str = parts[2] if len(parts) > 2 else None
|
|
290
|
+
|
|
291
|
+
params = RecallParams(
|
|
292
|
+
node_id=node_id,
|
|
293
|
+
node_type=recall_type,
|
|
294
|
+
scope=getattr(GraphScope, scope_str.upper()) if scope_str else None,
|
|
295
|
+
limit=10,
|
|
296
|
+
)
|
|
297
|
+
else:
|
|
298
|
+
error_msg = "❌ $recall requires either a query or node_id\nExamples:\n$recall memories\n$recall user123 USER LOCAL"
|
|
299
|
+
params = SpeakParams(content=error_msg)
|
|
300
|
+
action = HandlerActionType.SPEAK
|
|
301
|
+
|
|
302
|
+
elif action == HandlerActionType.PONDER:
|
|
303
|
+
if action_params:
|
|
304
|
+
# Split by semicolon for multiple questions
|
|
305
|
+
questions = [q.strip() for q in action_params.split(";") if q.strip()]
|
|
306
|
+
params = PonderParams(questions=questions)
|
|
307
|
+
else:
|
|
308
|
+
error_msg = "❌ $ponder requires questions. Format: $ponder <question1>; <question2>\nExample: $ponder What should I do next?; How can I help?"
|
|
309
|
+
params = SpeakParams(content=error_msg)
|
|
310
|
+
action = HandlerActionType.SPEAK
|
|
311
|
+
|
|
312
|
+
elif action == HandlerActionType.OBSERVE:
|
|
313
|
+
parts = action_params.split() if action_params else []
|
|
314
|
+
observe_channel = parts[0] if len(parts) > 0 else ""
|
|
315
|
+
# Always active - agent should always create follow-up thoughts
|
|
316
|
+
channel_context = create_channel_context(observe_channel) if observe_channel else None
|
|
317
|
+
params = ObserveParams(channel_context=channel_context, active=True)
|
|
318
|
+
|
|
319
|
+
elif action == HandlerActionType.TOOL:
|
|
320
|
+
if action_params:
|
|
321
|
+
logger.info(f"[MOCK_LLM] TOOL handler - action_params: '{action_params}'")
|
|
322
|
+
parts = action_params.split(None, 1)
|
|
323
|
+
tool_name = parts[0]
|
|
324
|
+
tool_params = {}
|
|
325
|
+
|
|
326
|
+
# Parse JSON-like parameters if provided
|
|
327
|
+
if len(parts) > 1:
|
|
328
|
+
logger.info(f"[MOCK_LLM] TOOL handler - parsing params: '{parts[1]}'")
|
|
329
|
+
try:
|
|
330
|
+
import json
|
|
331
|
+
|
|
332
|
+
tool_params = json.loads(parts[1])
|
|
333
|
+
logger.info(f"[MOCK_LLM] TOOL handler - parsed as JSON: {tool_params}")
|
|
334
|
+
except json.JSONDecodeError:
|
|
335
|
+
# Special handling for curl tool - expects 'url' parameter
|
|
336
|
+
if tool_name == "curl":
|
|
337
|
+
tool_params = {"url": parts[1].strip()}
|
|
338
|
+
logger.info(f"[MOCK_LLM] TOOL handler - curl with URL: {tool_params}")
|
|
339
|
+
else:
|
|
340
|
+
# Try simple key=value parsing with quote handling
|
|
341
|
+
# First clean up the parameters string by removing escaped newlines
|
|
342
|
+
params_str = parts[1].split("\\n")[0].strip()
|
|
343
|
+
import shlex
|
|
344
|
+
|
|
345
|
+
try:
|
|
346
|
+
# Use shlex to properly handle quoted strings
|
|
347
|
+
tokens = shlex.split(params_str)
|
|
348
|
+
for token in tokens:
|
|
349
|
+
if "=" in token:
|
|
350
|
+
k, v = token.split("=", 1)
|
|
351
|
+
tool_params[k] = v
|
|
352
|
+
logger.info(f"[MOCK_LLM] TOOL handler - parsed with shlex: {tool_params}")
|
|
353
|
+
except ValueError as e:
|
|
354
|
+
# Fallback to simple parsing if shlex fails
|
|
355
|
+
logger.info(f"[MOCK_LLM] TOOL handler - shlex failed ({e}), using fallback")
|
|
356
|
+
for pair in params_str.split():
|
|
357
|
+
if "=" in pair:
|
|
358
|
+
k, v = pair.split("=", 1)
|
|
359
|
+
# Clean up the value
|
|
360
|
+
v = v.strip().rstrip("\\").strip('"')
|
|
361
|
+
tool_params[k] = v
|
|
362
|
+
logger.info(f"[MOCK_LLM] TOOL handler - parsed as key=value: {tool_params}")
|
|
363
|
+
else:
|
|
364
|
+
logger.info("[MOCK_LLM] TOOL handler - no parameters provided")
|
|
365
|
+
|
|
366
|
+
logger.info(f"[MOCK_LLM] TOOL handler - final params: name='{tool_name}', parameters={tool_params}")
|
|
367
|
+
params = ToolParams(name=tool_name, parameters=tool_params)
|
|
368
|
+
else:
|
|
369
|
+
error_msg = "❌ $tool requires: <tool_name> [parameters]\nExample: $tool discord_delete_message channel_id=123 message_id=456\nAvailable tools: discord_delete_message, discord_timeout_user, list_files, read_file, etc."
|
|
370
|
+
params = SpeakParams(content=error_msg)
|
|
371
|
+
action = HandlerActionType.SPEAK
|
|
372
|
+
|
|
373
|
+
elif action == HandlerActionType.REJECT:
|
|
374
|
+
if action_params:
|
|
375
|
+
params = RejectParams(reason=action_params)
|
|
376
|
+
else:
|
|
377
|
+
error_msg = "❌ $reject requires a reason. Format: $reject <reason>\nExample: $reject This request violates ethical guidelines"
|
|
378
|
+
params = SpeakParams(content=error_msg)
|
|
379
|
+
action = HandlerActionType.SPEAK
|
|
380
|
+
|
|
381
|
+
elif action == HandlerActionType.DEFER:
|
|
382
|
+
if action_params:
|
|
383
|
+
params = DeferParams(reason=action_params, defer_until=None)
|
|
384
|
+
else:
|
|
385
|
+
error_msg = "❌ $defer requires a reason. Format: $defer <reason>\nExample: $defer I need more context to answer properly"
|
|
386
|
+
params = SpeakParams(content=error_msg)
|
|
387
|
+
action = HandlerActionType.SPEAK
|
|
388
|
+
|
|
389
|
+
elif action == HandlerActionType.FORGET:
|
|
390
|
+
if action_params:
|
|
391
|
+
parts = action_params.split(None, 1)
|
|
392
|
+
if len(parts) >= 2:
|
|
393
|
+
node_id = parts[0]
|
|
394
|
+
reason = parts[1]
|
|
395
|
+
params = ForgetParams(
|
|
396
|
+
node=GraphNode(
|
|
397
|
+
id=node_id,
|
|
398
|
+
type=NodeType.CONCEPT,
|
|
399
|
+
scope=GraphScope.LOCAL,
|
|
400
|
+
attributes={"created_by": "mock_llm"},
|
|
401
|
+
),
|
|
402
|
+
reason=reason,
|
|
403
|
+
)
|
|
404
|
+
else:
|
|
405
|
+
error_msg = "❌ $forget requires: <node_id> <reason>\nExample: $forget user123 User requested data deletion"
|
|
406
|
+
params = SpeakParams(content=error_msg)
|
|
407
|
+
action = HandlerActionType.SPEAK
|
|
408
|
+
else:
|
|
409
|
+
error_msg = "❌ $forget requires: <node_id> <reason>"
|
|
410
|
+
params = SpeakParams(content=error_msg)
|
|
411
|
+
action = HandlerActionType.SPEAK
|
|
412
|
+
|
|
413
|
+
elif action == HandlerActionType.TASK_COMPLETE:
|
|
414
|
+
# Mission-critical schema compliance with proper TaskCompleteParams
|
|
415
|
+
params = TaskCompleteParams(completion_reason="Forced task completion via testing")
|
|
416
|
+
|
|
417
|
+
else:
|
|
418
|
+
# Unknown action
|
|
419
|
+
params = SpeakParams(content=f"Unknown action: {forced_action}")
|
|
420
|
+
|
|
421
|
+
except AttributeError:
|
|
422
|
+
# Invalid action type
|
|
423
|
+
valid_actions = [
|
|
424
|
+
"speak",
|
|
425
|
+
"recall",
|
|
426
|
+
"memorize",
|
|
427
|
+
"tool",
|
|
428
|
+
"observe",
|
|
429
|
+
"ponder",
|
|
430
|
+
"defer",
|
|
431
|
+
"reject",
|
|
432
|
+
"forget",
|
|
433
|
+
"task_complete",
|
|
434
|
+
]
|
|
435
|
+
error_msg = f"❌ Invalid action '{forced_action}'. Valid actions: {', '.join(valid_actions)}"
|
|
436
|
+
action = HandlerActionType.SPEAK
|
|
437
|
+
params = SpeakParams(content=error_msg)
|
|
438
|
+
|
|
439
|
+
# Include context pattern in rationale
|
|
440
|
+
context_patterns = [item for item in context if item.startswith("forced_action:")]
|
|
441
|
+
context_info = f" {context_patterns[0]}" if context_patterns else ""
|
|
442
|
+
rationale = f"[MOCK LLM] Executing {forced_action} action from mock command{context_info}"
|
|
443
|
+
|
|
444
|
+
if show_help: # Changed from elif to if to handle help from anywhere
|
|
445
|
+
action = HandlerActionType.SPEAK
|
|
446
|
+
help_text = """📋 CIRIS Mock LLM Commands Help
|
|
447
|
+
|
|
448
|
+
🎛️ **Action Commands:**
|
|
449
|
+
• $speak <message> - Send a message to current channel
|
|
450
|
+
• $speak @channel:<id> <message> - Send message to specific channel
|
|
451
|
+
• $recall <node_id> [type] [scope] - Recall from memory
|
|
452
|
+
• $memorize <node_id> [type] [scope] - Store in memory
|
|
453
|
+
• $tool <name> [params] - Execute a tool
|
|
454
|
+
• $observe [channel_id] [active] - Observe a channel
|
|
455
|
+
• $ponder <q1>; <q2> - Ask questions
|
|
456
|
+
• $defer <reason> - Defer the task
|
|
457
|
+
• $reject <reason> - Reject the request
|
|
458
|
+
• $forget <node_id> <reason> - Forget memory
|
|
459
|
+
• $task_complete - Complete current task
|
|
460
|
+
|
|
461
|
+
🔧 **Testing & Debug Commands:**
|
|
462
|
+
• $test - Enable testing mode
|
|
463
|
+
• $error - Inject error conditions
|
|
464
|
+
• $rationale "custom text" - Set custom rationale
|
|
465
|
+
• $context - Show full context
|
|
466
|
+
• $filter "regex" - Filter context display
|
|
467
|
+
• $debug_dma - Show DMA details
|
|
468
|
+
• $debug_consciences - Show conscience details
|
|
469
|
+
• $help - Show this help
|
|
470
|
+
|
|
471
|
+
📝 **Parameter Formats:**
|
|
472
|
+
• NodeType: AGENT, USER, CHANNEL, CONCEPT, CONFIG
|
|
473
|
+
• GraphScope: LOCAL, IDENTITY, ENVIRONMENT, COMMUNITY, NETWORK
|
|
474
|
+
• Tools: discord_delete_message, list_files, read_file, etc.
|
|
475
|
+
|
|
476
|
+
💡 **Examples:**
|
|
477
|
+
• $speak Hello world!
|
|
478
|
+
• $speak @channel:api_0.0.0.0_8080 Cross-adapter message!
|
|
479
|
+
• $recall user123 USER LOCAL
|
|
480
|
+
• $tool read_file path=/tmp/test.txt
|
|
481
|
+
• $defer Need more information
|
|
482
|
+
• $ponder What should I do?; Is this ethical?
|
|
483
|
+
|
|
484
|
+
The mock LLM provides deterministic responses for testing CIRIS functionality offline."""
|
|
485
|
+
params = SpeakParams(content=help_text)
|
|
486
|
+
rationale = "[MOCK LLM] Providing Mock LLM help documentation"
|
|
487
|
+
|
|
488
|
+
# Removed the weird ? recall command - only $recall is supported
|
|
489
|
+
|
|
490
|
+
elif user_speech:
|
|
491
|
+
# Regular user input - always speak
|
|
492
|
+
action = HandlerActionType.SPEAK
|
|
493
|
+
# Include multimodal detection info if images were present
|
|
494
|
+
if multimodal_image_count > 0:
|
|
495
|
+
speak_content = f"[MOCKLLM DISCLAIMER] SPEAK IN RESPONSE TO TASK WITHOUT COMMAND [MULTIMODAL_DETECTED:{multimodal_image_count}]"
|
|
496
|
+
else:
|
|
497
|
+
speak_content = "[MOCKLLM DISCLAIMER] SPEAK IN RESPONSE TO TASK WITHOUT COMMAND"
|
|
498
|
+
params = SpeakParams(content=speak_content)
|
|
499
|
+
rationale = f"Responding to user: {user_speech}"
|
|
500
|
+
|
|
501
|
+
elif command_from_context:
|
|
502
|
+
# Handle command extracted from context (e.g., from Original Thought)
|
|
503
|
+
command_found = False
|
|
504
|
+
|
|
505
|
+
# Handle specific commands
|
|
506
|
+
if command_from_context == "$ponder":
|
|
507
|
+
questions = command_args_from_context.split(";") if command_args_from_context else ["What should I do?"]
|
|
508
|
+
params = PonderParams(questions=[q.strip() for q in questions if q.strip()])
|
|
509
|
+
action = HandlerActionType.PONDER
|
|
510
|
+
rationale = "[MOCK LLM] Pondering questions from context"
|
|
511
|
+
command_found = True
|
|
512
|
+
elif command_from_context == "$speak":
|
|
513
|
+
# Parse for @channel:default_channel syntax anywhere in the message
|
|
514
|
+
channel_match = re.search(r"@channel:(\S+)", command_args_from_context)
|
|
515
|
+
if channel_match:
|
|
516
|
+
speak_channel = channel_match.group(1)
|
|
517
|
+
# Channel override removed - mock LLM doesn't set channels
|
|
518
|
+
# Remove the @channel: part from the content
|
|
519
|
+
speak_content = command_args_from_context.replace(channel_match.group(0), "").strip()
|
|
520
|
+
if not speak_content:
|
|
521
|
+
speak_content = "[MOCK LLM] Cross-channel message"
|
|
522
|
+
logger.info(
|
|
523
|
+
f"[MOCK_LLM] Parsed channel from @channel: syntax - channel: {speak_channel}, content: {speak_content[:50]}"
|
|
524
|
+
)
|
|
525
|
+
else:
|
|
526
|
+
speak_content = command_args_from_context if command_args_from_context else "[MOCK LLM] Hello!"
|
|
527
|
+
speak_channel = default_channel
|
|
528
|
+
|
|
529
|
+
# Only set channel_context if @channel: was explicitly used
|
|
530
|
+
if channel_match:
|
|
531
|
+
params = SpeakParams(content=speak_content, channel_context=create_channel_context(speak_channel))
|
|
532
|
+
else:
|
|
533
|
+
params = SpeakParams(content=speak_content)
|
|
534
|
+
action = HandlerActionType.SPEAK
|
|
535
|
+
rationale = "[MOCK LLM] Speaking from context command"
|
|
536
|
+
command_found = True
|
|
537
|
+
elif command_from_context == "$recall":
|
|
538
|
+
query = command_args_from_context if command_args_from_context else "memories"
|
|
539
|
+
params = RecallParams(query=query, node_type=NodeType.CONCEPT, scope=GraphScope.LOCAL, limit=5)
|
|
540
|
+
action = HandlerActionType.RECALL
|
|
541
|
+
rationale = f"[MOCK LLM] Recalling memories about: {query}"
|
|
542
|
+
command_found = True
|
|
543
|
+
elif command_from_context == "$memorize":
|
|
544
|
+
content = command_args_from_context if command_args_from_context else "Empty memory"
|
|
545
|
+
node_id = "_".join(content.split()[:3]).lower().replace(",", "").replace(".", "")
|
|
546
|
+
if not node_id:
|
|
547
|
+
node_id = "memory_node"
|
|
548
|
+
|
|
549
|
+
params = MemorizeParams(
|
|
550
|
+
node=GraphNode(
|
|
551
|
+
id=node_id,
|
|
552
|
+
type=NodeType.CONCEPT,
|
|
553
|
+
scope=GraphScope.LOCAL,
|
|
554
|
+
attributes={"created_by": "mock_llm", "tags": [f"content:{content[:50]}", "source:mock_llm"]},
|
|
555
|
+
)
|
|
556
|
+
)
|
|
557
|
+
action = HandlerActionType.MEMORIZE
|
|
558
|
+
rationale = f"[MOCK LLM] Memorizing: {content[:50]}..."
|
|
559
|
+
command_found = True
|
|
560
|
+
elif command_from_context == "$task_complete":
|
|
561
|
+
params = TaskCompleteParams(completion_reason="[MOCK LLM] Task completed via context command")
|
|
562
|
+
action = HandlerActionType.TASK_COMPLETE
|
|
563
|
+
rationale = "[MOCK LLM] Completing task from context"
|
|
564
|
+
command_found = True
|
|
565
|
+
elif command_from_context == "$tool":
|
|
566
|
+
# Parse tool command
|
|
567
|
+
tool_name = "list_tools" # default
|
|
568
|
+
tool_params = {}
|
|
569
|
+
if command_args_from_context:
|
|
570
|
+
parts = command_args_from_context.split(None, 1)
|
|
571
|
+
if parts:
|
|
572
|
+
tool_name = parts[0]
|
|
573
|
+
if len(parts) > 1:
|
|
574
|
+
# Parse parameters the same way as forced action
|
|
575
|
+
params_str = parts[1].split("\\n")[0].strip()
|
|
576
|
+
try:
|
|
577
|
+
import json
|
|
578
|
+
|
|
579
|
+
tool_params = json.loads(params_str)
|
|
580
|
+
except json.JSONDecodeError:
|
|
581
|
+
# Try simple key=value parsing with quote handling
|
|
582
|
+
import shlex
|
|
583
|
+
|
|
584
|
+
try:
|
|
585
|
+
# Use shlex to properly handle quoted strings
|
|
586
|
+
tokens = shlex.split(params_str)
|
|
587
|
+
for token in tokens:
|
|
588
|
+
if "=" in token:
|
|
589
|
+
k, v = token.split("=", 1)
|
|
590
|
+
tool_params[k] = v
|
|
591
|
+
except ValueError:
|
|
592
|
+
# Fallback to simple parsing if shlex fails
|
|
593
|
+
for pair in params_str.split():
|
|
594
|
+
if "=" in pair:
|
|
595
|
+
k, v = pair.split("=", 1)
|
|
596
|
+
# Clean up the value
|
|
597
|
+
v = v.strip().rstrip("\\").strip('"')
|
|
598
|
+
tool_params[k] = v
|
|
599
|
+
|
|
600
|
+
params = ToolParams(name=tool_name, parameters=tool_params)
|
|
601
|
+
action = HandlerActionType.TOOL
|
|
602
|
+
rationale = f"[MOCK LLM] Executing tool: {tool_name}"
|
|
603
|
+
command_found = True
|
|
604
|
+
elif command_from_context == "$observe":
|
|
605
|
+
# Parse observe command - expects a default_channel
|
|
606
|
+
args = command_args_from_context.strip().split() if command_args_from_context else []
|
|
607
|
+
obs_channel = args[0] if args else default_channel
|
|
608
|
+
# Always active - agent should always create follow-up thoughts
|
|
609
|
+
params = ObserveParams(
|
|
610
|
+
channel_context=create_channel_context(obs_channel),
|
|
611
|
+
active=True,
|
|
612
|
+
context={"observer_channel": default_channel, "target_channel": obs_channel},
|
|
613
|
+
)
|
|
614
|
+
action = HandlerActionType.OBSERVE
|
|
615
|
+
rationale = f"[MOCK LLM] Observing channel: {obs_channel}"
|
|
616
|
+
command_found = True
|
|
617
|
+
elif command_from_context == "$defer":
|
|
618
|
+
reason = command_args_from_context or "Need more information"
|
|
619
|
+
params = DeferParams(reason=reason, context={"channel": default_channel} if default_channel else None)
|
|
620
|
+
action = HandlerActionType.DEFER
|
|
621
|
+
rationale = f"[MOCK LLM] Deferring: {reason}"
|
|
622
|
+
command_found = True
|
|
623
|
+
elif command_from_context == "$reject":
|
|
624
|
+
reason = command_args_from_context or "Cannot process request"
|
|
625
|
+
params = RejectParams(reason=reason, create_filter=False)
|
|
626
|
+
action = HandlerActionType.REJECT
|
|
627
|
+
rationale = f"[MOCK LLM] Rejecting: {reason}"
|
|
628
|
+
command_found = True
|
|
629
|
+
elif command_from_context == "$forget":
|
|
630
|
+
# Parse forget command - expects: <node_id> <reason>
|
|
631
|
+
parts = command_args_from_context.split(None, 1) if command_args_from_context else []
|
|
632
|
+
if len(parts) >= 1:
|
|
633
|
+
node_id = parts[0]
|
|
634
|
+
reason = parts[1] if len(parts) >= 2 else "User requested deletion"
|
|
635
|
+
# Create a GraphNode for the forget action
|
|
636
|
+
params = ForgetParams(
|
|
637
|
+
node=GraphNode(
|
|
638
|
+
id=node_id,
|
|
639
|
+
type=NodeType.CONCEPT, # Default type for forget
|
|
640
|
+
scope=GraphScope.LOCAL,
|
|
641
|
+
attributes={"created_by": "mock_llm"},
|
|
642
|
+
),
|
|
643
|
+
reason=reason,
|
|
644
|
+
)
|
|
645
|
+
action = HandlerActionType.FORGET
|
|
646
|
+
rationale = f"[MOCK LLM] Forgetting memory: {node_id}"
|
|
647
|
+
command_found = True
|
|
648
|
+
else:
|
|
649
|
+
# Error case - no parameters provided
|
|
650
|
+
action = HandlerActionType.SPEAK
|
|
651
|
+
params = SpeakParams(
|
|
652
|
+
content="❌ $forget requires: <node_id> <reason>\nExample: $forget user123 User requested data deletion"
|
|
653
|
+
)
|
|
654
|
+
rationale = "[MOCK LLM] Invalid forget command"
|
|
655
|
+
command_found = True
|
|
656
|
+
|
|
657
|
+
if not command_found:
|
|
658
|
+
# Unknown command, default to speak
|
|
659
|
+
action = HandlerActionType.SPEAK
|
|
660
|
+
params = SpeakParams(content=f"[MOCK LLM] Unknown command from context: {command_from_context}")
|
|
661
|
+
rationale = "[MOCK LLM] Unknown command from context"
|
|
662
|
+
|
|
663
|
+
else:
|
|
664
|
+
# Step 1: Check if this is a follow-up thought by looking at the THOUGHT_TYPE in the system message
|
|
665
|
+
is_followup = False
|
|
666
|
+
|
|
667
|
+
# The first message should be the system message with covenant
|
|
668
|
+
if messages and len(messages) > 0:
|
|
669
|
+
first_msg = messages[0]
|
|
670
|
+
if isinstance(first_msg, dict) and first_msg.get("role") == "system":
|
|
671
|
+
content = first_msg.get("content", "")
|
|
672
|
+
logger.info(f"[MOCK_LLM] First system message starts with: {content[:80] if content else 'EMPTY'}...")
|
|
673
|
+
# Check if this is a follow_up thought type
|
|
674
|
+
if content.startswith("THOUGHT_TYPE=follow_up"):
|
|
675
|
+
is_followup = True
|
|
676
|
+
logger.info("[MOCK_LLM] DETECTED FOLLOW-UP THOUGHT via THOUGHT_TYPE=follow_up")
|
|
677
|
+
else:
|
|
678
|
+
logger.info("[MOCK_LLM] No messages available for THOUGHT_TYPE check")
|
|
679
|
+
|
|
680
|
+
if is_followup:
|
|
681
|
+
# Check the content of the follow-up thought to determine if it's from a SPEAK handler
|
|
682
|
+
# Extract the thought content from the user message
|
|
683
|
+
thought_content = ""
|
|
684
|
+
for msg in messages or []:
|
|
685
|
+
if isinstance(msg, dict) and msg.get("role") == "user":
|
|
686
|
+
user_content = msg.get("content", "")
|
|
687
|
+
# Look for "Original Thought:" pattern
|
|
688
|
+
if "Original Thought:" in user_content:
|
|
689
|
+
# Handle nested quotes by looking for the content between the first and last quotes
|
|
690
|
+
# or use a more robust pattern that captures everything until the next field
|
|
691
|
+
thought_match = re.search(r'Original Thought:\s*"(.*?)"(?:\n|$)', user_content, re.DOTALL)
|
|
692
|
+
if thought_match:
|
|
693
|
+
thought_content = thought_match.group(1)
|
|
694
|
+
break
|
|
695
|
+
|
|
696
|
+
# Check if this is a follow-up from SPEAK handler (usually contains specific patterns)
|
|
697
|
+
# Most follow-ups from other handlers contain operation results that should be spoken
|
|
698
|
+
is_speak_followup = any(
|
|
699
|
+
pattern in thought_content
|
|
700
|
+
for pattern in [
|
|
701
|
+
"Message sent successfully to channel",
|
|
702
|
+
"CIRIS_FOLLOW_UP_THOUGHT: Message sent successfully to channel",
|
|
703
|
+
"NEXT ACTION IS ALMOST CERTAINLY TASK COMPLETE",
|
|
704
|
+
"spoke in channel",
|
|
705
|
+
"message delivered",
|
|
706
|
+
"response sent",
|
|
707
|
+
]
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
if is_speak_followup:
|
|
711
|
+
# Follow-up from SPEAK handler → TASK_COMPLETE
|
|
712
|
+
action = HandlerActionType.TASK_COMPLETE
|
|
713
|
+
params = TaskCompleteParams(completion_reason="[MOCK LLM] SPEAK operation completed")
|
|
714
|
+
rationale = "[MOCK LLM] Completing SPEAK follow-up thought"
|
|
715
|
+
else:
|
|
716
|
+
# Follow-up from other handlers (RECALL, MEMORIZE, etc.) → SPEAK the result
|
|
717
|
+
action = HandlerActionType.SPEAK
|
|
718
|
+
# Extract the actual content to speak from the follow-up thought
|
|
719
|
+
if thought_content.startswith("CIRIS_FOLLOW_UP_THOUGHT:"):
|
|
720
|
+
content_to_speak = thought_content.replace("CIRIS_FOLLOW_UP_THOUGHT:", "").strip()
|
|
721
|
+
else:
|
|
722
|
+
content_to_speak = thought_content
|
|
723
|
+
|
|
724
|
+
params = SpeakParams(content=f"[MOCK LLM] {content_to_speak}")
|
|
725
|
+
rationale = "[MOCK LLM] Speaking operation result from follow-up thought"
|
|
726
|
+
else:
|
|
727
|
+
# Step 2: For initial thoughts, check USER message for commands
|
|
728
|
+
command_found = False
|
|
729
|
+
|
|
730
|
+
# Look for the user message in the messages list
|
|
731
|
+
for msg in messages or []:
|
|
732
|
+
if isinstance(msg, dict) and msg.get("role") == "user":
|
|
733
|
+
user_content = msg.get("content", "")
|
|
734
|
+
|
|
735
|
+
# Debug logging
|
|
736
|
+
logger.debug(f"[MOCK_LLM] Processing user message: {user_content[:200]}...")
|
|
737
|
+
|
|
738
|
+
# Try to extract the actual user input after various patterns:
|
|
739
|
+
# - "User @username said:" or "@username said:"
|
|
740
|
+
# - "@USERNAME (ID: USERNAME):" (API format)
|
|
741
|
+
# - Direct content without prefix
|
|
742
|
+
# re already imported at top of file
|
|
743
|
+
|
|
744
|
+
# First try API format: @USERNAME (ID: USERNAME): content
|
|
745
|
+
api_match = re.search(r"@\w+\s*\([^)]+\):\s*(.+)", user_content, re.IGNORECASE | re.DOTALL)
|
|
746
|
+
if api_match:
|
|
747
|
+
actual_user_input = api_match.group(1).strip()
|
|
748
|
+
logger.debug(f"[MOCK_LLM] Extracted via API pattern: {actual_user_input[:100]}")
|
|
749
|
+
else:
|
|
750
|
+
# Then try "User said:" or "@username said:" format
|
|
751
|
+
user_match = re.search(
|
|
752
|
+
r"(?:User|@\w+)\s+(?:said|says?):\s*(.+)", user_content, re.IGNORECASE | re.DOTALL
|
|
753
|
+
)
|
|
754
|
+
if user_match:
|
|
755
|
+
actual_user_input = user_match.group(1).strip()
|
|
756
|
+
logger.debug(f"[MOCK_LLM] Extracted via User said pattern: {actual_user_input[:100]}")
|
|
757
|
+
else:
|
|
758
|
+
# If no pattern matches, use the content as-is
|
|
759
|
+
actual_user_input = user_content.strip()
|
|
760
|
+
logger.debug(f"[MOCK_LLM] Using content as-is: {actual_user_input[:100]}")
|
|
761
|
+
|
|
762
|
+
# Check if it starts with a command
|
|
763
|
+
if actual_user_input.startswith("$"):
|
|
764
|
+
# Parse the command
|
|
765
|
+
parts = actual_user_input.split(None, 1)
|
|
766
|
+
command = parts[0].lower()
|
|
767
|
+
command_args = parts[1] if len(parts) > 1 else ""
|
|
768
|
+
|
|
769
|
+
# Handle specific commands
|
|
770
|
+
if command == "$speak":
|
|
771
|
+
action = HandlerActionType.SPEAK
|
|
772
|
+
logger.info(f"[MOCK_LLM] Processing $speak command with args: {command_args}")
|
|
773
|
+
|
|
774
|
+
# Check if channel is specified with @channel syntax
|
|
775
|
+
speak_channel = default_channel # Default to current channel
|
|
776
|
+
speak_content = command_args if command_args else "[MOCK LLM] Hello!"
|
|
777
|
+
|
|
778
|
+
# Parse for @channel:default_channel syntax anywhere in the message
|
|
779
|
+
channel_match = re.search(r"@channel:(\S+)", command_args)
|
|
780
|
+
if channel_match:
|
|
781
|
+
speak_channel = channel_match.group(1)
|
|
782
|
+
# Channel override removed - mock LLM doesn't set channels
|
|
783
|
+
# Remove the @channel: part from the content
|
|
784
|
+
speak_content = command_args.replace(channel_match.group(0), "").strip()
|
|
785
|
+
if not speak_content:
|
|
786
|
+
speak_content = "[MOCK LLM] Cross-channel message"
|
|
787
|
+
logger.info(
|
|
788
|
+
f"[MOCK_LLM] Parsed channel from @channel: syntax - channel: {speak_channel}, content: {speak_content[:50]}"
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
# Only set channel_context if @channel: was explicitly used
|
|
792
|
+
if channel_match:
|
|
793
|
+
params = SpeakParams(
|
|
794
|
+
content=speak_content, channel_context=create_channel_context(speak_channel)
|
|
795
|
+
)
|
|
796
|
+
else:
|
|
797
|
+
params = SpeakParams(content=speak_content)
|
|
798
|
+
rationale = f"[MOCK LLM] Speaking to channel {speak_channel}"
|
|
799
|
+
command_found = True
|
|
800
|
+
break
|
|
801
|
+
elif command == "$recall":
|
|
802
|
+
# Use query-based recall with the search term
|
|
803
|
+
query = command_args if command_args else "memories"
|
|
804
|
+
|
|
805
|
+
params = RecallParams(
|
|
806
|
+
query=query, node_type=NodeType.CONCEPT, scope=GraphScope.LOCAL, limit=5
|
|
807
|
+
)
|
|
808
|
+
action = HandlerActionType.RECALL
|
|
809
|
+
rationale = f"[MOCK LLM] Recalling memories about: {query}"
|
|
810
|
+
command_found = True
|
|
811
|
+
break
|
|
812
|
+
elif command == "$memorize":
|
|
813
|
+
# Treat the entire command_args as the content to memorize
|
|
814
|
+
content = command_args if command_args else "Empty memory"
|
|
815
|
+
# Create a node ID from the content (first few words)
|
|
816
|
+
node_id = "_".join(content.split()[:3]).lower().replace(",", "").replace(".", "")
|
|
817
|
+
if not node_id:
|
|
818
|
+
node_id = "memory_node"
|
|
819
|
+
|
|
820
|
+
params = MemorizeParams(
|
|
821
|
+
node=GraphNode(
|
|
822
|
+
id=node_id,
|
|
823
|
+
type=NodeType.CONCEPT,
|
|
824
|
+
scope=GraphScope.LOCAL,
|
|
825
|
+
attributes={
|
|
826
|
+
"created_by": "mock_llm",
|
|
827
|
+
"content": content,
|
|
828
|
+
"description": f"Memory: {content}",
|
|
829
|
+
},
|
|
830
|
+
)
|
|
831
|
+
)
|
|
832
|
+
action = HandlerActionType.MEMORIZE
|
|
833
|
+
rationale = f"[MOCK LLM] Memorizing: {content[:50]}..."
|
|
834
|
+
command_found = True
|
|
835
|
+
break
|
|
836
|
+
elif command == "$ponder":
|
|
837
|
+
questions = command_args.split(";") if command_args else ["What should I do?"]
|
|
838
|
+
params = PonderParams(questions=[q.strip() for q in questions if q.strip()])
|
|
839
|
+
action = HandlerActionType.PONDER
|
|
840
|
+
rationale = "[MOCK LLM] Pondering questions"
|
|
841
|
+
command_found = True
|
|
842
|
+
break
|
|
843
|
+
elif command == "$observe":
|
|
844
|
+
# Parse observe command - expects a default_channel
|
|
845
|
+
args = command_args.strip().split() if command_args else []
|
|
846
|
+
obs_channel = args[0] if args else default_channel
|
|
847
|
+
# Always active - agent should always create follow-up thoughts
|
|
848
|
+
|
|
849
|
+
params = ObserveParams(
|
|
850
|
+
channel_context=create_channel_context(obs_channel),
|
|
851
|
+
active=True,
|
|
852
|
+
context={"observer_channel": default_channel, "target_channel": obs_channel},
|
|
853
|
+
)
|
|
854
|
+
action = HandlerActionType.OBSERVE
|
|
855
|
+
rationale = f"[MOCK LLM] Observing channel: {obs_channel}"
|
|
856
|
+
command_found = True
|
|
857
|
+
break
|
|
858
|
+
elif command == "$tool":
|
|
859
|
+
tool_parts = command_args.split(None, 1)
|
|
860
|
+
tool_name = tool_parts[0] if tool_parts else "unknown_tool"
|
|
861
|
+
tool_params = {}
|
|
862
|
+
|
|
863
|
+
if len(tool_parts) > 1:
|
|
864
|
+
# Try to parse JSON params
|
|
865
|
+
try:
|
|
866
|
+
import json
|
|
867
|
+
|
|
868
|
+
tool_params = json.loads(tool_parts[1])
|
|
869
|
+
except json.JSONDecodeError:
|
|
870
|
+
# Simple key=value parsing
|
|
871
|
+
for pair in tool_parts[1].split():
|
|
872
|
+
if "=" in pair:
|
|
873
|
+
k, v = pair.split("=", 1)
|
|
874
|
+
tool_params[k] = v
|
|
875
|
+
|
|
876
|
+
params = ToolParams(name=tool_name, parameters=tool_params)
|
|
877
|
+
action = HandlerActionType.TOOL
|
|
878
|
+
rationale = f"[MOCK LLM] Executing tool {tool_name}"
|
|
879
|
+
command_found = True
|
|
880
|
+
break
|
|
881
|
+
elif command == "$defer":
|
|
882
|
+
params = DeferParams(
|
|
883
|
+
reason=command_args if command_args else "Need more information", defer_until=None
|
|
884
|
+
)
|
|
885
|
+
action = HandlerActionType.DEFER
|
|
886
|
+
rationale = "[MOCK LLM] Deferring task"
|
|
887
|
+
command_found = True
|
|
888
|
+
break
|
|
889
|
+
elif command == "$reject":
|
|
890
|
+
params = RejectParams(reason=command_args if command_args else "Cannot fulfill request")
|
|
891
|
+
action = HandlerActionType.REJECT
|
|
892
|
+
rationale = "[MOCK LLM] Rejecting request"
|
|
893
|
+
command_found = True
|
|
894
|
+
break
|
|
895
|
+
elif command == "$forget":
|
|
896
|
+
# Parse forget - can be either node_id or search term
|
|
897
|
+
if command_args:
|
|
898
|
+
# Try to match the node ID format we create in memorize
|
|
899
|
+
search_term = command_args.strip()
|
|
900
|
+
# Create the same node ID format as memorize
|
|
901
|
+
node_id = "_".join(search_term.split()[:3]).lower().replace(",", "").replace(".", "")
|
|
902
|
+
if not node_id:
|
|
903
|
+
node_id = search_term.split()[0] if search_term else "unknown"
|
|
904
|
+
else:
|
|
905
|
+
node_id = "unknown_node"
|
|
906
|
+
search_term = "unknown"
|
|
907
|
+
|
|
908
|
+
params = ForgetParams(
|
|
909
|
+
node=GraphNode(
|
|
910
|
+
id=node_id,
|
|
911
|
+
type=NodeType.CONCEPT,
|
|
912
|
+
scope=GraphScope.LOCAL,
|
|
913
|
+
attributes={"created_by": "mock_llm"},
|
|
914
|
+
),
|
|
915
|
+
reason=f"Forgetting memory about: {search_term}",
|
|
916
|
+
)
|
|
917
|
+
action = HandlerActionType.FORGET
|
|
918
|
+
rationale = f"[MOCK LLM] Forgetting memory: {search_term[:50]}..."
|
|
919
|
+
command_found = True
|
|
920
|
+
break
|
|
921
|
+
elif command == "$task_complete":
|
|
922
|
+
params = TaskCompleteParams(completion_reason="[MOCK LLM] Task completed via command")
|
|
923
|
+
action = HandlerActionType.TASK_COMPLETE
|
|
924
|
+
rationale = "[MOCK LLM] Completing task"
|
|
925
|
+
command_found = True
|
|
926
|
+
break
|
|
927
|
+
elif command == "$help":
|
|
928
|
+
# Show help
|
|
929
|
+
show_help = True
|
|
930
|
+
break
|
|
931
|
+
|
|
932
|
+
if show_help:
|
|
933
|
+
# Return to the help handler below
|
|
934
|
+
pass
|
|
935
|
+
elif not command_found:
|
|
936
|
+
# Step 3: Check conversation history in the user message for commands
|
|
937
|
+
# This handles cases where commands come through API in conversation history
|
|
938
|
+
for msg in messages or []:
|
|
939
|
+
if isinstance(msg, dict) and msg.get("role") == "user":
|
|
940
|
+
user_content = msg.get("content", "")
|
|
941
|
+
|
|
942
|
+
# Look for conversation history pattern
|
|
943
|
+
if "=== CONVERSATION HISTORY" in user_content:
|
|
944
|
+
# Extract lines that look like user messages
|
|
945
|
+
lines = user_content.split("\n")
|
|
946
|
+
# Collect all command lines with their line numbers
|
|
947
|
+
command_lines = []
|
|
948
|
+
for line in lines:
|
|
949
|
+
# Match patterns like "3. @SYSTEM_ADMIN (ID: SYSTEM_ADMIN): $memorize test"
|
|
950
|
+
# re already imported at top of file
|
|
951
|
+
history_match = re.search(r"^(\d+)\.\s*@[^:]+:\s*(\$\w+.*?)$", line.strip())
|
|
952
|
+
if history_match:
|
|
953
|
+
line_num = int(history_match.group(1))
|
|
954
|
+
command_line = history_match.group(2).strip()
|
|
955
|
+
command_lines.append((line_num, command_line))
|
|
956
|
+
|
|
957
|
+
# Use the most recent command (highest line number)
|
|
958
|
+
if command_lines:
|
|
959
|
+
command_lines.sort(key=lambda x: x[0], reverse=True)
|
|
960
|
+
_, command_line = command_lines[0]
|
|
961
|
+
|
|
962
|
+
if command_line.startswith("$"):
|
|
963
|
+
# Parse this command
|
|
964
|
+
parts = command_line.split(None, 1)
|
|
965
|
+
command = parts[0].lower()
|
|
966
|
+
command_args = parts[1] if len(parts) > 1 else ""
|
|
967
|
+
|
|
968
|
+
# Process the command (similar to above)
|
|
969
|
+
if command == "$memorize":
|
|
970
|
+
content = command_args if command_args else "Empty memory"
|
|
971
|
+
node_id = (
|
|
972
|
+
"_".join(content.split()[:3]).lower().replace(",", "").replace(".", "")
|
|
973
|
+
)
|
|
974
|
+
if not node_id:
|
|
975
|
+
node_id = "memory_node"
|
|
976
|
+
|
|
977
|
+
params = MemorizeParams(
|
|
978
|
+
node=GraphNode(
|
|
979
|
+
id=node_id,
|
|
980
|
+
type=NodeType.CONCEPT,
|
|
981
|
+
scope=GraphScope.LOCAL,
|
|
982
|
+
attributes={
|
|
983
|
+
"created_by": "mock_llm",
|
|
984
|
+
"content": content,
|
|
985
|
+
"description": f"Memory: {content}",
|
|
986
|
+
},
|
|
987
|
+
)
|
|
988
|
+
)
|
|
989
|
+
action = HandlerActionType.MEMORIZE
|
|
990
|
+
rationale = (
|
|
991
|
+
f"[MOCK LLM] Memorizing from conversation history: {content[:50]}..."
|
|
992
|
+
)
|
|
993
|
+
command_found = True
|
|
994
|
+
elif command == "$speak":
|
|
995
|
+
params = SpeakParams(
|
|
996
|
+
content=command_args if command_args else "[MOCK LLM] Hello!"
|
|
997
|
+
)
|
|
998
|
+
action = HandlerActionType.SPEAK
|
|
999
|
+
rationale = "[MOCK LLM] Speaking from conversation history"
|
|
1000
|
+
command_found = True
|
|
1001
|
+
elif command == "$recall":
|
|
1002
|
+
query = command_args if command_args else "memories"
|
|
1003
|
+
params = RecallParams(
|
|
1004
|
+
query=query, node_type=NodeType.CONCEPT, scope=GraphScope.LOCAL, limit=5
|
|
1005
|
+
)
|
|
1006
|
+
action = HandlerActionType.RECALL
|
|
1007
|
+
rationale = f"[MOCK LLM] Recalling from conversation history: {query}"
|
|
1008
|
+
command_found = True
|
|
1009
|
+
# Add other handlers as needed...
|
|
1010
|
+
|
|
1011
|
+
if command_found:
|
|
1012
|
+
break
|
|
1013
|
+
|
|
1014
|
+
if not command_found:
|
|
1015
|
+
# Default: new task → SPEAK
|
|
1016
|
+
action = HandlerActionType.SPEAK
|
|
1017
|
+
# Include multimodal detection info if images were present
|
|
1018
|
+
if multimodal_image_count > 0:
|
|
1019
|
+
speak_content = f"[MOCKLLM DISCLAIMER] SPEAK IN RESPONSE TO TASK WITHOUT COMMAND [MULTIMODAL_DETECTED:{multimodal_image_count}]"
|
|
1020
|
+
else:
|
|
1021
|
+
speak_content = "[MOCKLLM DISCLAIMER] SPEAK IN RESPONSE TO TASK WITHOUT COMMAND"
|
|
1022
|
+
params = SpeakParams(content=speak_content)
|
|
1023
|
+
rationale = "[MOCK LLM] Default speak action for new task"
|
|
1024
|
+
|
|
1025
|
+
# Use custom rationale if provided, otherwise use the generated rationale
|
|
1026
|
+
final_rationale = custom_rationale if custom_rationale else rationale
|
|
1027
|
+
|
|
1028
|
+
# Store action parameters directly as a dict
|
|
1029
|
+
if params:
|
|
1030
|
+
action_params_dict = params.model_dump() if hasattr(params, "model_dump") else params
|
|
1031
|
+
else:
|
|
1032
|
+
action_params_dict = None
|
|
1033
|
+
|
|
1034
|
+
result = ActionSelectionDMAResult(
|
|
1035
|
+
selected_action=action,
|
|
1036
|
+
action_parameters=action_params_dict, # Store parameters directly
|
|
1037
|
+
rationale=final_rationale,
|
|
1038
|
+
)
|
|
1039
|
+
|
|
1040
|
+
# Return structured result directly - instructor will handle it
|
|
1041
|
+
return result
|