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.
Files changed (986) hide show
  1. ciris_adapters/README.md +113 -0
  2. ciris_adapters/__init__.py +30 -0
  3. ciris_adapters/ciris_covenant_metrics/README.md +144 -0
  4. ciris_adapters/ciris_covenant_metrics/__init__.py +36 -0
  5. ciris_adapters/ciris_covenant_metrics/adapter.py +249 -0
  6. ciris_adapters/ciris_covenant_metrics/manifest.json +152 -0
  7. ciris_adapters/ciris_covenant_metrics/services.py +403 -0
  8. ciris_adapters/ciris_hosted_tools/__init__.py +24 -0
  9. ciris_adapters/ciris_hosted_tools/adapter.py +169 -0
  10. ciris_adapters/ciris_hosted_tools/manifest.json +94 -0
  11. ciris_adapters/ciris_hosted_tools/services.py +744 -0
  12. ciris_adapters/external_data_sql/README.md +559 -0
  13. ciris_adapters/external_data_sql/__init__.py +43 -0
  14. ciris_adapters/external_data_sql/adapter.py +144 -0
  15. ciris_adapters/external_data_sql/configurable.py +315 -0
  16. ciris_adapters/external_data_sql/dialects/__init__.py +37 -0
  17. ciris_adapters/external_data_sql/dialects/base.py +133 -0
  18. ciris_adapters/external_data_sql/dialects/mysql.py +63 -0
  19. ciris_adapters/external_data_sql/dialects/postgresql.py +59 -0
  20. ciris_adapters/external_data_sql/dialects/sqlite.py +62 -0
  21. ciris_adapters/external_data_sql/example_config.json +88 -0
  22. ciris_adapters/external_data_sql/example_privacy_schema.yaml +127 -0
  23. ciris_adapters/external_data_sql/manifest.json +195 -0
  24. ciris_adapters/external_data_sql/privacy_schema_loader.py +189 -0
  25. ciris_adapters/external_data_sql/protocol.py +101 -0
  26. ciris_adapters/external_data_sql/schemas.py +146 -0
  27. ciris_adapters/external_data_sql/service.py +1547 -0
  28. ciris_adapters/external_data_sql/service_old.py +492 -0
  29. ciris_adapters/home_assistant/__init__.py +63 -0
  30. ciris_adapters/home_assistant/adapter.py +201 -0
  31. ciris_adapters/home_assistant/communication_service.py +347 -0
  32. ciris_adapters/home_assistant/configurable.py +667 -0
  33. ciris_adapters/home_assistant/manifest.json +203 -0
  34. ciris_adapters/home_assistant/schemas.py +129 -0
  35. ciris_adapters/home_assistant/service.py +751 -0
  36. ciris_adapters/home_assistant/tool_service.py +441 -0
  37. ciris_adapters/mcp_client/__init__.py +82 -0
  38. ciris_adapters/mcp_client/adapter.py +847 -0
  39. ciris_adapters/mcp_client/config.py +280 -0
  40. ciris_adapters/mcp_client/configurable.py +422 -0
  41. ciris_adapters/mcp_client/manifest.json +185 -0
  42. ciris_adapters/mcp_client/mcp_communication_service.py +393 -0
  43. ciris_adapters/mcp_client/mcp_tool_service.py +463 -0
  44. ciris_adapters/mcp_client/mcp_wise_service.py +394 -0
  45. ciris_adapters/mcp_client/schemas.py +149 -0
  46. ciris_adapters/mcp_client/security.py +592 -0
  47. ciris_adapters/mcp_common/__init__.py +44 -0
  48. ciris_adapters/mcp_common/manifest.json +25 -0
  49. ciris_adapters/mcp_common/protocol.py +315 -0
  50. ciris_adapters/mcp_common/schemas.py +225 -0
  51. ciris_adapters/mcp_server/__init__.py +47 -0
  52. ciris_adapters/mcp_server/adapter.py +581 -0
  53. ciris_adapters/mcp_server/config.py +260 -0
  54. ciris_adapters/mcp_server/configurable.py +393 -0
  55. ciris_adapters/mcp_server/handlers.py +663 -0
  56. ciris_adapters/mcp_server/manifest.json +211 -0
  57. ciris_adapters/mcp_server/security.py +500 -0
  58. ciris_adapters/mock_llm/README.md +117 -0
  59. ciris_adapters/mock_llm/__init__.py +21 -0
  60. ciris_adapters/mock_llm/adapter.py +131 -0
  61. ciris_adapters/mock_llm/configurable.py +237 -0
  62. ciris_adapters/mock_llm/manifest.json +106 -0
  63. ciris_adapters/mock_llm/protocol.py +37 -0
  64. ciris_adapters/mock_llm/responses.py +520 -0
  65. ciris_adapters/mock_llm/responses_action_selection.py +1041 -0
  66. ciris_adapters/mock_llm/responses_epistemic.py +17 -0
  67. ciris_adapters/mock_llm/responses_feedback.py +27 -0
  68. ciris_adapters/mock_llm/schemas.py +35 -0
  69. ciris_adapters/mock_llm/service.py +294 -0
  70. ciris_adapters/navigation/__init__.py +21 -0
  71. ciris_adapters/navigation/adapter.py +129 -0
  72. ciris_adapters/navigation/configurable.py +239 -0
  73. ciris_adapters/navigation/manifest.json +104 -0
  74. ciris_adapters/navigation/service.py +487 -0
  75. ciris_adapters/reddit/README.md +132 -0
  76. ciris_adapters/reddit/REDDIT_ADAPTER_ANALYSIS.md +715 -0
  77. ciris_adapters/reddit/REDDIT_ADAPTER_SUMMARY.txt +278 -0
  78. ciris_adapters/reddit/REDDIT_ANALYSIS_INDEX.md +307 -0
  79. ciris_adapters/reddit/REDDIT_PRODUCTION_READINESS_PLAN.md +518 -0
  80. ciris_adapters/reddit/__init__.py +15 -0
  81. ciris_adapters/reddit/adapter.py +189 -0
  82. ciris_adapters/reddit/configurable.py +274 -0
  83. ciris_adapters/reddit/error_handler.py +307 -0
  84. ciris_adapters/reddit/manifest.json +218 -0
  85. ciris_adapters/reddit/observer.py +532 -0
  86. ciris_adapters/reddit/protocol.py +34 -0
  87. ciris_adapters/reddit/schemas.py +433 -0
  88. ciris_adapters/reddit/service.py +1471 -0
  89. ciris_adapters/sample_adapter/README.md +474 -0
  90. ciris_adapters/sample_adapter/__init__.py +45 -0
  91. ciris_adapters/sample_adapter/adapter.py +208 -0
  92. ciris_adapters/sample_adapter/configurable.py +469 -0
  93. ciris_adapters/sample_adapter/manifest.json +247 -0
  94. ciris_adapters/sample_adapter/services.py +486 -0
  95. ciris_adapters/weather/__init__.py +16 -0
  96. ciris_adapters/weather/adapter.py +130 -0
  97. ciris_adapters/weather/configurable.py +240 -0
  98. ciris_adapters/weather/manifest.json +156 -0
  99. ciris_adapters/weather/service.py +600 -0
  100. ciris_agent-1.7.7.dist-info/METADATA +284 -0
  101. ciris_agent-1.7.7.dist-info/RECORD +986 -0
  102. ciris_agent-1.7.7.dist-info/WHEEL +5 -0
  103. ciris_agent-1.7.7.dist-info/entry_points.txt +15 -0
  104. ciris_agent-1.7.7.dist-info/licenses/LICENSE +205 -0
  105. ciris_agent-1.7.7.dist-info/licenses/NOTICE +82 -0
  106. ciris_agent-1.7.7.dist-info/top_level.txt +4 -0
  107. ciris_engine/__init__.py +15 -0
  108. ciris_engine/ciris_templates/ally.yaml +632 -0
  109. ciris_engine/ciris_templates/default.yaml +411 -0
  110. ciris_engine/ciris_templates/echo-core.yaml +629 -0
  111. ciris_engine/ciris_templates/echo-speculative.yaml +764 -0
  112. ciris_engine/ciris_templates/echo.yaml +647 -0
  113. ciris_engine/ciris_templates/sage.yaml +332 -0
  114. ciris_engine/ciris_templates/scout.yaml +338 -0
  115. ciris_engine/ciris_templates/test.yaml +168 -0
  116. ciris_engine/cli.py +42 -0
  117. ciris_engine/config/CIRIS_SERVICES.json +19 -0
  118. ciris_engine/config/MODEL_CAPABILITIES.json +419 -0
  119. ciris_engine/config/PRICING_DATA.json +179 -0
  120. ciris_engine/config/__init__.py +50 -0
  121. ciris_engine/config/ciris_services.py +113 -0
  122. ciris_engine/config/model_capabilities.py +388 -0
  123. ciris_engine/config/pricing_models.py +276 -0
  124. ciris_engine/constants.py +35 -0
  125. ciris_engine/data/__init__.py +1 -0
  126. ciris_engine/data/covenant_1.0b.txt +978 -0
  127. ciris_engine/gui_static/11steps.svg +107 -0
  128. ciris_engine/gui_static/2x-schematics.png +0 -0
  129. ciris_engine/gui_static/404/index.html +1 -0
  130. ciris_engine/gui_static/404.html +1 -0
  131. ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_buildManifest.js +1 -0
  132. ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_ssgManifest.js +1 -0
  133. ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_buildManifest.js +1 -0
  134. ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_ssgManifest.js +1 -0
  135. ciris_engine/gui_static/_next/static/chunks/3297-60e86ba0f8a7b040.js +1 -0
  136. ciris_engine/gui_static/_next/static/chunks/3835-2aad4b7f5f8e4643.js +1 -0
  137. ciris_engine/gui_static/_next/static/chunks/4499-99a0bc47de0b8975.js +1 -0
  138. ciris_engine/gui_static/_next/static/chunks/4534-af88cd4ba6e99bff.js +1 -0
  139. ciris_engine/gui_static/_next/static/chunks/4541-84b455f9e0dc4cfe.js +1 -0
  140. ciris_engine/gui_static/_next/static/chunks/4789-61412711484754bb.js +1 -0
  141. ciris_engine/gui_static/_next/static/chunks/6539-c6398bc9d7018430.js +1 -0
  142. ciris_engine/gui_static/_next/static/chunks/704-8e827b26cc8c2d32.js +1 -0
  143. ciris_engine/gui_static/_next/static/chunks/704-fb45d630f3192c6f.js +1 -0
  144. ciris_engine/gui_static/_next/static/chunks/8072-de4952a2e6d2b33f.js +1 -0
  145. ciris_engine/gui_static/_next/static/chunks/8315-b91d03a3949db0af.js +1 -0
  146. ciris_engine/gui_static/_next/static/chunks/8386-f93a83ccbd789bd9.js +1 -0
  147. ciris_engine/gui_static/_next/static/chunks/87c73c54-781a7f35148d5433.js +1 -0
  148. ciris_engine/gui_static/_next/static/chunks/8903-fefea3339a02d41b.js +1 -0
  149. ciris_engine/gui_static/_next/static/chunks/9090-e66485adf8d9d990.js +1 -0
  150. ciris_engine/gui_static/_next/static/chunks/app/_not-found/page-a67d9808462c23b1.js +1 -0
  151. ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-2d7ee1583bbbd02e.js +1 -0
  152. ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-6a3c2bae6fe92b7b.js +1 -0
  153. ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-2ed3a035136bc4e8.js +1 -0
  154. ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-b2f5c91844a32422.js +1 -0
  155. ciris_engine/gui_static/_next/static/chunks/app/account/page-25b90f89af3ea58c.js +1 -0
  156. ciris_engine/gui_static/_next/static/chunks/app/account/page-b65d16c94ecaf69c.js +1 -0
  157. ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-675b6d05c8f9184f.js +1 -0
  158. ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-cbee2e1c8ab52145.js +1 -0
  159. ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-0f44da06697cf9f0.js +1 -0
  160. ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-563420253577edbf.js +1 -0
  161. ciris_engine/gui_static/_next/static/chunks/app/adapters/page-1854631018bc32be.js +1 -0
  162. ciris_engine/gui_static/_next/static/chunks/app/agents/page-8353752c176a7c70.js +1 -0
  163. ciris_engine/gui_static/_next/static/chunks/app/agents/page-f61a529f110a6040.js +1 -0
  164. ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-7f19b9d20d39be28.js +1 -0
  165. ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-d1063938f249b8bd.js +1 -0
  166. ciris_engine/gui_static/_next/static/chunks/app/audit/page-321b6728b8fff0bb.js +1 -0
  167. ciris_engine/gui_static/_next/static/chunks/app/audit/page-ebac35ca961a1277.js +1 -0
  168. ciris_engine/gui_static/_next/static/chunks/app/billing/page-6f3dc3bd02924f8e.js +1 -0
  169. ciris_engine/gui_static/_next/static/chunks/app/billing/page-fa4a469f814c821a.js +1 -0
  170. ciris_engine/gui_static/_next/static/chunks/app/comms/page-0d4f734269addd8f.js +1 -0
  171. ciris_engine/gui_static/_next/static/chunks/app/comms/page-79227d426050089c.js +1 -0
  172. ciris_engine/gui_static/_next/static/chunks/app/config/page-018d21d683b6e5bc.js +1 -0
  173. ciris_engine/gui_static/_next/static/chunks/app/config/page-2aa5a5363ca2a371.js +1 -0
  174. ciris_engine/gui_static/_next/static/chunks/app/consent/page-198373205fd316e2.js +1 -0
  175. ciris_engine/gui_static/_next/static/chunks/app/consent/page-f2ca39e7713b13f8.js +1 -0
  176. ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-1dd5a196f643c60d.js +1 -0
  177. ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-530a04d3abbb8cda.js +1 -0
  178. ciris_engine/gui_static/_next/static/chunks/app/docs/page-3193b06d094ab654.js +1 -0
  179. ciris_engine/gui_static/_next/static/chunks/app/docs/page-330e996dedb87aba.js +1 -0
  180. ciris_engine/gui_static/_next/static/chunks/app/layout-0a70f5fc460298b1.js +1 -0
  181. ciris_engine/gui_static/_next/static/chunks/app/layout-21f2f99dd5b336e9.js +1 -0
  182. ciris_engine/gui_static/_next/static/chunks/app/login/page-33240e6c6034a49d.js +1 -0
  183. ciris_engine/gui_static/_next/static/chunks/app/login/page-68ffab6d54a7fdcd.js +1 -0
  184. ciris_engine/gui_static/_next/static/chunks/app/logs/page-8a6167aecc4a475c.js +1 -0
  185. ciris_engine/gui_static/_next/static/chunks/app/memory/page-9ca8c5d0056de3ff.js +1 -0
  186. ciris_engine/gui_static/_next/static/chunks/app/memory/page-e961226941c18f81.js +1 -0
  187. ciris_engine/gui_static/_next/static/chunks/app/page-6fdb065a787a4974.js +1 -0
  188. ciris_engine/gui_static/_next/static/chunks/app/page-89f87d431be6064a.js +1 -0
  189. ciris_engine/gui_static/_next/static/chunks/app/runtime/page-2e728b9c43aa164d.js +1 -0
  190. ciris_engine/gui_static/_next/static/chunks/app/runtime/page-c7dd033dc40a72f0.js +1 -0
  191. ciris_engine/gui_static/_next/static/chunks/app/services/page-ae9f0bdf11d01a95.js +1 -0
  192. ciris_engine/gui_static/_next/static/chunks/app/services/page-b10feb79ca5d75e5.js +1 -0
  193. ciris_engine/gui_static/_next/static/chunks/app/sessions/page-13ebe7ef1c16ae11.js +1 -0
  194. ciris_engine/gui_static/_next/static/chunks/app/sessions/page-e6c82b16d617f785.js +1 -0
  195. ciris_engine/gui_static/_next/static/chunks/app/setup/page-0beb5f5b5a5c20fc.js +1 -0
  196. ciris_engine/gui_static/_next/static/chunks/app/setup/page-2595e729eae30c0e.js +1 -0
  197. ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-1037c987aecc3653.js +1 -0
  198. ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-2ffd147f6d3162ff.js +1 -0
  199. ciris_engine/gui_static/_next/static/chunks/app/system/page-2c5798d58cafcd91.js +1 -0
  200. ciris_engine/gui_static/_next/static/chunks/app/system/page-505b1ba4eceb01c3.js +1 -0
  201. ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-b0cad31d5cb1b2fa.js +1 -0
  202. ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-f3ecd7a8012df230.js +1 -0
  203. ciris_engine/gui_static/_next/static/chunks/app/test-login/page-f35117fdc4105801.js +1 -0
  204. ciris_engine/gui_static/_next/static/chunks/app/test-login/page-fb583a7924114906.js +1 -0
  205. ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-50f116fd76935563.js +1 -0
  206. ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-c37d8aa5ba623a44.js +1 -0
  207. ciris_engine/gui_static/_next/static/chunks/app/tools/page-429aec7a707777ef.js +1 -0
  208. ciris_engine/gui_static/_next/static/chunks/app/tools/page-5f705aad60e0c04e.js +1 -0
  209. ciris_engine/gui_static/_next/static/chunks/app/users/page-13476b8b0f3808cc.js +1 -0
  210. ciris_engine/gui_static/_next/static/chunks/app/users/page-7e500d154ed5bba4.js +1 -0
  211. ciris_engine/gui_static/_next/static/chunks/app/wa/page-cc4a9d8a5cb44d08.js +1 -0
  212. ciris_engine/gui_static/_next/static/chunks/app/wa/page-ec3e429efbc79230.js +1 -0
  213. ciris_engine/gui_static/_next/static/chunks/framework-9d29490f5ba089ba.js +1 -0
  214. ciris_engine/gui_static/_next/static/chunks/main-1f554952e47a82c4.js +1 -0
  215. ciris_engine/gui_static/_next/static/chunks/main-app-26fa8aed029082e5.js +1 -0
  216. ciris_engine/gui_static/_next/static/chunks/main-app-97b0486ef6bcef25.js +1 -0
  217. ciris_engine/gui_static/_next/static/chunks/pages/_app-6ce685456e616eb2.js +1 -0
  218. ciris_engine/gui_static/_next/static/chunks/pages/_error-d4bce98d93fe21e7.js +1 -0
  219. ciris_engine/gui_static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  220. ciris_engine/gui_static/_next/static/chunks/webpack-fcebd240b7f8477d.js +1 -0
  221. ciris_engine/gui_static/_next/static/css/16b94b1fe0cc6e37.css +3 -0
  222. ciris_engine/gui_static/_next/static/css/77a24ceaae86deff.css +3 -0
  223. ciris_engine/gui_static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  224. ciris_engine/gui_static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
  225. ciris_engine/gui_static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
  226. ciris_engine/gui_static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  227. ciris_engine/gui_static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
  228. ciris_engine/gui_static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  229. ciris_engine/gui_static/_next/static/media/d8298875641ec7d4-s.p.woff2 +0 -0
  230. ciris_engine/gui_static/account/api-keys/index.html +1 -0
  231. ciris_engine/gui_static/account/api-keys/index.txt +27 -0
  232. ciris_engine/gui_static/account/consent/index.html +1 -0
  233. ciris_engine/gui_static/account/consent/index.txt +27 -0
  234. ciris_engine/gui_static/account/index.html +1 -0
  235. ciris_engine/gui_static/account/index.txt +27 -0
  236. ciris_engine/gui_static/account/privacy/index.html +1 -0
  237. ciris_engine/gui_static/account/privacy/index.txt +27 -0
  238. ciris_engine/gui_static/account/settings/index.html +1 -0
  239. ciris_engine/gui_static/account/settings/index.txt +27 -0
  240. ciris_engine/gui_static/adapters/index.html +1 -0
  241. ciris_engine/gui_static/adapters/index.txt +27 -0
  242. ciris_engine/gui_static/agents/index.html +1 -0
  243. ciris_engine/gui_static/agents/index.txt +27 -0
  244. ciris_engine/gui_static/andrew-roberts-euBRXcx57T4-unsplash.jpg +0 -0
  245. ciris_engine/gui_static/api-demo/index.html +1 -0
  246. ciris_engine/gui_static/api-demo/index.txt +27 -0
  247. ciris_engine/gui_static/audit/index.html +1 -0
  248. ciris_engine/gui_static/audit/index.txt +27 -0
  249. ciris_engine/gui_static/billing/index.html +1 -0
  250. ciris_engine/gui_static/billing/index.txt +27 -0
  251. ciris_engine/gui_static/blurryinfo.png +0 -0
  252. ciris_engine/gui_static/chip-vincent-PkQDwfl9Flc-unsplash.jpg +0 -0
  253. ciris_engine/gui_static/ciris-architecture.svg +338 -0
  254. ciris_engine/gui_static/comms/index.html +1 -0
  255. ciris_engine/gui_static/comms/index.txt +27 -0
  256. ciris_engine/gui_static/config/index.html +1 -0
  257. ciris_engine/gui_static/config/index.txt +27 -0
  258. ciris_engine/gui_static/consent/index.html +1 -0
  259. ciris_engine/gui_static/consent/index.txt +27 -0
  260. ciris_engine/gui_static/dashboard/index.html +1 -0
  261. ciris_engine/gui_static/dashboard/index.txt +27 -0
  262. ciris_engine/gui_static/docs/index.html +1 -0
  263. ciris_engine/gui_static/docs/index.txt +27 -0
  264. ciris_engine/gui_static/eric.png +0 -0
  265. ciris_engine/gui_static/file.svg +1 -0
  266. ciris_engine/gui_static/globe.svg +1 -0
  267. ciris_engine/gui_static/index.html +1 -0
  268. ciris_engine/gui_static/index.txt +27 -0
  269. ciris_engine/gui_static/infogfx-1@2x.png +0 -0
  270. ciris_engine/gui_static/infogfx-2.png +0 -0
  271. ciris_engine/gui_static/infogfx-dark-1.png +0 -0
  272. ciris_engine/gui_static/kelly-vohs-soSTXmIxTDU-unsplash.jpg +0 -0
  273. ciris_engine/gui_static/login/index.html +1 -0
  274. ciris_engine/gui_static/login/index.txt +27 -0
  275. ciris_engine/gui_static/logs/index.html +1 -0
  276. ciris_engine/gui_static/logs/index.txt +27 -0
  277. ciris_engine/gui_static/memory/index.html +1 -0
  278. ciris_engine/gui_static/memory/index.txt +27 -0
  279. ciris_engine/gui_static/nathan-farrish-ArcTfEoBgzs-unsplash.jpg +0 -0
  280. ciris_engine/gui_static/next.svg +1 -0
  281. ciris_engine/gui_static/overview.svg +512 -0
  282. ciris_engine/gui_static/overview1.svg +407 -0
  283. ciris_engine/gui_static/overview2.svg +370 -0
  284. ciris_engine/gui_static/pipeline-visualization.svg +278 -0
  285. ciris_engine/gui_static/privacy-policy.html +160 -0
  286. ciris_engine/gui_static/runtime/index.html +8 -0
  287. ciris_engine/gui_static/runtime/index.txt +27 -0
  288. ciris_engine/gui_static/services/index.html +1 -0
  289. ciris_engine/gui_static/services/index.txt +27 -0
  290. ciris_engine/gui_static/sessions/index.html +1 -0
  291. ciris_engine/gui_static/sessions/index.txt +27 -0
  292. ciris_engine/gui_static/setup/index.html +1 -0
  293. ciris_engine/gui_static/setup/index.txt +27 -0
  294. ciris_engine/gui_static/status-dashboard/index.html +1 -0
  295. ciris_engine/gui_static/status-dashboard/index.txt +27 -0
  296. ciris_engine/gui_static/system/index.html +1 -0
  297. ciris_engine/gui_static/system/index.txt +27 -0
  298. ciris_engine/gui_static/terms-of-service.html +174 -0
  299. ciris_engine/gui_static/test-auth/index.html +1 -0
  300. ciris_engine/gui_static/test-auth/index.txt +27 -0
  301. ciris_engine/gui_static/test-login/index.html +1 -0
  302. ciris_engine/gui_static/test-login/index.txt +27 -0
  303. ciris_engine/gui_static/test-sdk/index.html +1 -0
  304. ciris_engine/gui_static/test-sdk/index.txt +27 -0
  305. ciris_engine/gui_static/tools/index.html +1 -0
  306. ciris_engine/gui_static/tools/index.txt +27 -0
  307. ciris_engine/gui_static/users/index.html +1 -0
  308. ciris_engine/gui_static/users/index.txt +27 -0
  309. ciris_engine/gui_static/vercel.svg +1 -0
  310. ciris_engine/gui_static/videos/video1.mp4 +0 -0
  311. ciris_engine/gui_static/videos/video3.mp4 +0 -0
  312. ciris_engine/gui_static/wa/index.html +1 -0
  313. ciris_engine/gui_static/wa/index.txt +27 -0
  314. ciris_engine/gui_static/window.svg +1 -0
  315. ciris_engine/logic/__init__.py +8 -0
  316. ciris_engine/logic/adapters/__init__.py +74 -0
  317. ciris_engine/logic/adapters/api/__init__.py +5 -0
  318. ciris_engine/logic/adapters/api/adapter.py +1037 -0
  319. ciris_engine/logic/adapters/api/api_communication.py +370 -0
  320. ciris_engine/logic/adapters/api/api_document.py +330 -0
  321. ciris_engine/logic/adapters/api/api_observer.py +24 -0
  322. ciris_engine/logic/adapters/api/api_runtime_control.py +388 -0
  323. ciris_engine/logic/adapters/api/api_tools.py +299 -0
  324. ciris_engine/logic/adapters/api/api_vision.py +215 -0
  325. ciris_engine/logic/adapters/api/app.py +272 -0
  326. ciris_engine/logic/adapters/api/auth.py +159 -0
  327. ciris_engine/logic/adapters/api/config.py +101 -0
  328. ciris_engine/logic/adapters/api/constants.py +55 -0
  329. ciris_engine/logic/adapters/api/dependencies/__init__.py +1 -0
  330. ciris_engine/logic/adapters/api/dependencies/auth.py +260 -0
  331. ciris_engine/logic/adapters/api/endpoints/__init__.py +1 -0
  332. ciris_engine/logic/adapters/api/endpoints/emergency.py +86 -0
  333. ciris_engine/logic/adapters/api/middleware/__init__.py +1 -0
  334. ciris_engine/logic/adapters/api/middleware/rate_limiter.py +302 -0
  335. ciris_engine/logic/adapters/api/models.py +29 -0
  336. ciris_engine/logic/adapters/api/routes/__init__.py +52 -0
  337. ciris_engine/logic/adapters/api/routes/agent.py +1762 -0
  338. ciris_engine/logic/adapters/api/routes/audit.py +707 -0
  339. ciris_engine/logic/adapters/api/routes/auth.py +1745 -0
  340. ciris_engine/logic/adapters/api/routes/billing.py +895 -0
  341. ciris_engine/logic/adapters/api/routes/config.py +329 -0
  342. ciris_engine/logic/adapters/api/routes/connectors.py +534 -0
  343. ciris_engine/logic/adapters/api/routes/consent.py +637 -0
  344. ciris_engine/logic/adapters/api/routes/dsar.py +637 -0
  345. ciris_engine/logic/adapters/api/routes/dsar_multi_source.py +484 -0
  346. ciris_engine/logic/adapters/api/routes/emergency.py +302 -0
  347. ciris_engine/logic/adapters/api/routes/memory.py +733 -0
  348. ciris_engine/logic/adapters/api/routes/memory_filters.py +230 -0
  349. ciris_engine/logic/adapters/api/routes/memory_models.py +112 -0
  350. ciris_engine/logic/adapters/api/routes/memory_queries.py +236 -0
  351. ciris_engine/logic/adapters/api/routes/memory_query_helpers.py +394 -0
  352. ciris_engine/logic/adapters/api/routes/memory_visualization.py +359 -0
  353. ciris_engine/logic/adapters/api/routes/memory_visualization_helpers.py +110 -0
  354. ciris_engine/logic/adapters/api/routes/partnership.py +541 -0
  355. ciris_engine/logic/adapters/api/routes/setup.py +1374 -0
  356. ciris_engine/logic/adapters/api/routes/system.py +3049 -0
  357. ciris_engine/logic/adapters/api/routes/system_extensions.py +952 -0
  358. ciris_engine/logic/adapters/api/routes/telemetry.py +1987 -0
  359. ciris_engine/logic/adapters/api/routes/telemetry_converters.py +141 -0
  360. ciris_engine/logic/adapters/api/routes/telemetry_helpers.py +111 -0
  361. ciris_engine/logic/adapters/api/routes/telemetry_logs_reader.py +280 -0
  362. ciris_engine/logic/adapters/api/routes/telemetry_metrics.py +131 -0
  363. ciris_engine/logic/adapters/api/routes/telemetry_models.py +190 -0
  364. ciris_engine/logic/adapters/api/routes/telemetry_otlp.py +878 -0
  365. ciris_engine/logic/adapters/api/routes/telemetry_resource_helpers.py +191 -0
  366. ciris_engine/logic/adapters/api/routes/tickets.py +541 -0
  367. ciris_engine/logic/adapters/api/routes/tools.py +556 -0
  368. ciris_engine/logic/adapters/api/routes/transparency.py +281 -0
  369. ciris_engine/logic/adapters/api/routes/users.py +981 -0
  370. ciris_engine/logic/adapters/api/routes/verification.py +373 -0
  371. ciris_engine/logic/adapters/api/routes/wa.py +369 -0
  372. ciris_engine/logic/adapters/api/service_configuration.py +177 -0
  373. ciris_engine/logic/adapters/api/services/__init__.py +1 -0
  374. ciris_engine/logic/adapters/api/services/auth_service.py +1417 -0
  375. ciris_engine/logic/adapters/api/services/oauth_security.py +68 -0
  376. ciris_engine/logic/adapters/base.py +141 -0
  377. ciris_engine/logic/adapters/base_adapter.py +73 -0
  378. ciris_engine/logic/adapters/base_observer.py +1141 -0
  379. ciris_engine/logic/adapters/base_vision.py +312 -0
  380. ciris_engine/logic/adapters/cirisnode_client.py +307 -0
  381. ciris_engine/logic/adapters/cli/__init__.py +3 -0
  382. ciris_engine/logic/adapters/cli/adapter.py +207 -0
  383. ciris_engine/logic/adapters/cli/cli_adapter.py +902 -0
  384. ciris_engine/logic/adapters/cli/cli_observer.py +268 -0
  385. ciris_engine/logic/adapters/cli/cli_tools.py +427 -0
  386. ciris_engine/logic/adapters/cli/cli_wa_service.py +134 -0
  387. ciris_engine/logic/adapters/cli/config.py +73 -0
  388. ciris_engine/logic/adapters/discord/__init__.py +3 -0
  389. ciris_engine/logic/adapters/discord/adapter.py +783 -0
  390. ciris_engine/logic/adapters/discord/ciris_discord_client.py +159 -0
  391. ciris_engine/logic/adapters/discord/config.py +177 -0
  392. ciris_engine/logic/adapters/discord/constants.py +185 -0
  393. ciris_engine/logic/adapters/discord/discord-stubs.pyi +50 -0
  394. ciris_engine/logic/adapters/discord/discord_adapter.py +1584 -0
  395. ciris_engine/logic/adapters/discord/discord_audit.py +150 -0
  396. ciris_engine/logic/adapters/discord/discord_channel_manager.py +351 -0
  397. ciris_engine/logic/adapters/discord/discord_connection_manager.py +313 -0
  398. ciris_engine/logic/adapters/discord/discord_embed_formatter.py +369 -0
  399. ciris_engine/logic/adapters/discord/discord_error_classifier.py +302 -0
  400. ciris_engine/logic/adapters/discord/discord_error_handler.py +316 -0
  401. ciris_engine/logic/adapters/discord/discord_guidance_handler.py +460 -0
  402. ciris_engine/logic/adapters/discord/discord_message_handler.py +207 -0
  403. ciris_engine/logic/adapters/discord/discord_observer.py +670 -0
  404. ciris_engine/logic/adapters/discord/discord_rate_limiter.py +249 -0
  405. ciris_engine/logic/adapters/discord/discord_reaction_handler.py +278 -0
  406. ciris_engine/logic/adapters/discord/discord_tool_handler.py +465 -0
  407. ciris_engine/logic/adapters/discord/discord_tool_service.py +790 -0
  408. ciris_engine/logic/adapters/discord/discord_tools.py +90 -0
  409. ciris_engine/logic/adapters/discord/discord_vision_helper.py +148 -0
  410. ciris_engine/logic/adapters/discord/py.typed +0 -0
  411. ciris_engine/logic/adapters/document_parser.py +320 -0
  412. ciris_engine/logic/audit/__init__.py +10 -0
  413. ciris_engine/logic/audit/hash_chain.py +313 -0
  414. ciris_engine/logic/audit/signature_manager.py +352 -0
  415. ciris_engine/logic/audit/verifier.py +408 -0
  416. ciris_engine/logic/buses/__init__.py +21 -0
  417. ciris_engine/logic/buses/base_bus.py +178 -0
  418. ciris_engine/logic/buses/bus_manager.py +121 -0
  419. ciris_engine/logic/buses/communication_bus.py +387 -0
  420. ciris_engine/logic/buses/llm_bus.py +722 -0
  421. ciris_engine/logic/buses/memory_bus.py +577 -0
  422. ciris_engine/logic/buses/prohibitions.py +502 -0
  423. ciris_engine/logic/buses/runtime_control_bus.py +539 -0
  424. ciris_engine/logic/buses/tool_bus.py +482 -0
  425. ciris_engine/logic/buses/wise_bus.py +684 -0
  426. ciris_engine/logic/config/__init__.py +25 -0
  427. ciris_engine/logic/config/bootstrap.py +255 -0
  428. ciris_engine/logic/config/config_accessor.py +202 -0
  429. ciris_engine/logic/config/db_paths.py +194 -0
  430. ciris_engine/logic/config/env_utils.py +39 -0
  431. ciris_engine/logic/conscience/__init__.py +16 -0
  432. ciris_engine/logic/conscience/build_deferral_package.py +0 -0
  433. ciris_engine/logic/conscience/core.py +688 -0
  434. ciris_engine/logic/conscience/interface.py +33 -0
  435. ciris_engine/logic/conscience/registry.py +76 -0
  436. ciris_engine/logic/conscience/thought_depth_guardrail.py +231 -0
  437. ciris_engine/logic/conscience/updated_status_conscience.py +156 -0
  438. ciris_engine/logic/context/__init__.py +10 -0
  439. ciris_engine/logic/context/batch_context.py +550 -0
  440. ciris_engine/logic/context/builder.py +149 -0
  441. ciris_engine/logic/context/channel_resolution.py +136 -0
  442. ciris_engine/logic/context/secrets_snapshot.py +52 -0
  443. ciris_engine/logic/context/system_snapshot.py +116 -0
  444. ciris_engine/logic/context/system_snapshot_helpers.py +1651 -0
  445. ciris_engine/logic/covenant/__init__.py +33 -0
  446. ciris_engine/logic/covenant/executor.py +303 -0
  447. ciris_engine/logic/covenant/extractor.py +382 -0
  448. ciris_engine/logic/covenant/handler.py +241 -0
  449. ciris_engine/logic/covenant/verifier.py +383 -0
  450. ciris_engine/logic/dma/__init__.py +15 -0
  451. ciris_engine/logic/dma/action_selection/__init__.py +11 -0
  452. ciris_engine/logic/dma/action_selection/action_instruction_generator.py +444 -0
  453. ciris_engine/logic/dma/action_selection/context_builder.py +508 -0
  454. ciris_engine/logic/dma/action_selection/faculty_integration.py +193 -0
  455. ciris_engine/logic/dma/action_selection/special_cases.py +132 -0
  456. ciris_engine/logic/dma/action_selection_pdma.py +365 -0
  457. ciris_engine/logic/dma/base_dma.py +335 -0
  458. ciris_engine/logic/dma/csdma.py +239 -0
  459. ciris_engine/logic/dma/dma_executor.py +575 -0
  460. ciris_engine/logic/dma/dsdma_base.py +410 -0
  461. ciris_engine/logic/dma/exceptions.py +4 -0
  462. ciris_engine/logic/dma/factory.py +150 -0
  463. ciris_engine/logic/dma/pdma.py +120 -0
  464. ciris_engine/logic/dma/prompt_loader.py +189 -0
  465. ciris_engine/logic/dma/prompts/action_selection_pdma.yml +58 -0
  466. ciris_engine/logic/dma/prompts/csdma_common_sense.yml +28 -0
  467. ciris_engine/logic/dma/prompts/dsdma_base.yml +17 -0
  468. ciris_engine/logic/dma/prompts/pdma_ethical.yml +42 -0
  469. ciris_engine/logic/formatters/__init__.py +26 -0
  470. ciris_engine/logic/formatters/crisis_resources.py +80 -0
  471. ciris_engine/logic/formatters/escalation.py +21 -0
  472. ciris_engine/logic/formatters/identity.py +224 -0
  473. ciris_engine/logic/formatters/prompt_blocks.py +64 -0
  474. ciris_engine/logic/formatters/system_snapshot.py +193 -0
  475. ciris_engine/logic/formatters/user_profiles.py +108 -0
  476. ciris_engine/logic/handlers/__init__.py +1 -0
  477. ciris_engine/logic/handlers/control/__init__.py +1 -0
  478. ciris_engine/logic/handlers/control/defer_handler.py +195 -0
  479. ciris_engine/logic/handlers/control/ponder_handler.py +154 -0
  480. ciris_engine/logic/handlers/control/reject_handler.py +81 -0
  481. ciris_engine/logic/handlers/external/__init__.py +1 -0
  482. ciris_engine/logic/handlers/external/observe_handler.py +154 -0
  483. ciris_engine/logic/handlers/external/speak_handler.py +250 -0
  484. ciris_engine/logic/handlers/external/tool_handler.py +148 -0
  485. ciris_engine/logic/handlers/memory/__init__.py +1 -0
  486. ciris_engine/logic/handlers/memory/forget_handler.py +107 -0
  487. ciris_engine/logic/handlers/memory/memorize_handler.py +391 -0
  488. ciris_engine/logic/handlers/memory/recall_handler.py +213 -0
  489. ciris_engine/logic/handlers/terminal/__init__.py +1 -0
  490. ciris_engine/logic/handlers/terminal/task_complete_handler.py +299 -0
  491. ciris_engine/logic/infrastructure/__init__.py +1 -0
  492. ciris_engine/logic/infrastructure/handlers/__init__.py +8 -0
  493. ciris_engine/logic/infrastructure/handlers/action_dispatcher.py +382 -0
  494. ciris_engine/logic/infrastructure/handlers/base_handler.py +450 -0
  495. ciris_engine/logic/infrastructure/handlers/exceptions.py +2 -0
  496. ciris_engine/logic/infrastructure/handlers/handler_registry.py +59 -0
  497. ciris_engine/logic/infrastructure/handlers/helpers.py +55 -0
  498. ciris_engine/logic/infrastructure/step_streaming.py +149 -0
  499. ciris_engine/logic/infrastructure/sub_services/__init__.py +1 -0
  500. ciris_engine/logic/infrastructure/sub_services/identity_variance_monitor.py +1035 -0
  501. ciris_engine/logic/infrastructure/sub_services/pattern_analysis_loop.py +758 -0
  502. ciris_engine/logic/infrastructure/sub_services/wa_cli_bootstrap.py +229 -0
  503. ciris_engine/logic/infrastructure/sub_services/wa_cli_display.py +176 -0
  504. ciris_engine/logic/infrastructure/sub_services/wa_cli_oauth.py +404 -0
  505. ciris_engine/logic/infrastructure/sub_services/wa_cli_wizard.py +181 -0
  506. ciris_engine/logic/persistence/__init__.py +130 -0
  507. ciris_engine/logic/persistence/analytics.py +97 -0
  508. ciris_engine/logic/persistence/db/__init__.py +28 -0
  509. ciris_engine/logic/persistence/db/core.py +520 -0
  510. ciris_engine/logic/persistence/db/dialect.py +380 -0
  511. ciris_engine/logic/persistence/db/execution_helpers.py +216 -0
  512. ciris_engine/logic/persistence/db/migration_runner.py +191 -0
  513. ciris_engine/logic/persistence/db/operations.py +313 -0
  514. ciris_engine/logic/persistence/db/query_builder.py +232 -0
  515. ciris_engine/logic/persistence/db/retry.py +154 -0
  516. ciris_engine/logic/persistence/db/setup.py +18 -0
  517. ciris_engine/logic/persistence/migrations/postgres/001_initial_schema.sql +4 -0
  518. ciris_engine/logic/persistence/migrations/postgres/002_add_retry_status.sql +3 -0
  519. ciris_engine/logic/persistence/migrations/postgres/003_add_task_update_tracking.sql +8 -0
  520. ciris_engine/logic/persistence/migrations/postgres/004_add_occurrence_id.sql +54 -0
  521. ciris_engine/logic/persistence/migrations/postgres/005_add_consolidation_locks.sql +22 -0
  522. ciris_engine/logic/persistence/migrations/postgres/006_add_correlation_id_unique_index.sql +16 -0
  523. ciris_engine/logic/persistence/migrations/postgres/007_add_dsar_tickets.sql +39 -0
  524. ciris_engine/logic/persistence/migrations/postgres/008_rename_to_tickets_add_sop.sql +123 -0
  525. ciris_engine/logic/persistence/migrations/postgres/009_add_ticket_status_columns.sql +39 -0
  526. ciris_engine/logic/persistence/migrations/postgres/010_add_images_to_tasks.sql +5 -0
  527. ciris_engine/logic/persistence/migrations/sqlite/001_initial_schema.sql +357 -0
  528. ciris_engine/logic/persistence/migrations/sqlite/002_add_retry_status.sql +3 -0
  529. ciris_engine/logic/persistence/migrations/sqlite/003_add_task_update_tracking.sql +8 -0
  530. ciris_engine/logic/persistence/migrations/sqlite/004_add_occurrence_id.sql +45 -0
  531. ciris_engine/logic/persistence/migrations/sqlite/005_add_consolidation_locks.sql +22 -0
  532. ciris_engine/logic/persistence/migrations/sqlite/006_add_correlation_id_unique_index.sql +16 -0
  533. ciris_engine/logic/persistence/migrations/sqlite/007_add_dsar_tickets.sql +39 -0
  534. ciris_engine/logic/persistence/migrations/sqlite/008_rename_to_tickets_add_sop.sql +120 -0
  535. ciris_engine/logic/persistence/migrations/sqlite/009_add_ticket_status_columns.sql +129 -0
  536. ciris_engine/logic/persistence/migrations/sqlite/010_add_images_to_tasks.sql +17 -0
  537. ciris_engine/logic/persistence/models/__init__.py +141 -0
  538. ciris_engine/logic/persistence/models/correlations.py +881 -0
  539. ciris_engine/logic/persistence/models/deferral.py +68 -0
  540. ciris_engine/logic/persistence/models/dsar.py +286 -0
  541. ciris_engine/logic/persistence/models/graph.py +362 -0
  542. ciris_engine/logic/persistence/models/identity.py +264 -0
  543. ciris_engine/logic/persistence/models/queue_status.py +139 -0
  544. ciris_engine/logic/persistence/models/tasks.py +1043 -0
  545. ciris_engine/logic/persistence/models/thoughts.py +400 -0
  546. ciris_engine/logic/persistence/models/tickets.py +518 -0
  547. ciris_engine/logic/persistence/stores/__init__.py +13 -0
  548. ciris_engine/logic/persistence/stores/auth_helpers.py +117 -0
  549. ciris_engine/logic/persistence/stores/authentication_store.py +414 -0
  550. ciris_engine/logic/persistence/utils.py +212 -0
  551. ciris_engine/logic/processors/__init__.py +30 -0
  552. ciris_engine/logic/processors/core/__init__.py +1 -0
  553. ciris_engine/logic/processors/core/base_processor.py +280 -0
  554. ciris_engine/logic/processors/core/main_processor.py +1777 -0
  555. ciris_engine/logic/processors/core/step_decorators.py +1583 -0
  556. ciris_engine/logic/processors/core/thought_processor/__init__.py +20 -0
  557. ciris_engine/logic/processors/core/thought_processor/action_execution.py +49 -0
  558. ciris_engine/logic/processors/core/thought_processor/conscience_execution.py +382 -0
  559. ciris_engine/logic/processors/core/thought_processor/finalize_action.py +66 -0
  560. ciris_engine/logic/processors/core/thought_processor/gather_context.py +120 -0
  561. ciris_engine/logic/processors/core/thought_processor/main.py +920 -0
  562. ciris_engine/logic/processors/core/thought_processor/perform_aspdma.py +86 -0
  563. ciris_engine/logic/processors/core/thought_processor/perform_dmas.py +106 -0
  564. ciris_engine/logic/processors/core/thought_processor/recursive_processing.py +237 -0
  565. ciris_engine/logic/processors/core/thought_processor/round_complete.py +52 -0
  566. ciris_engine/logic/processors/core/thought_processor/start_round.py +64 -0
  567. ciris_engine/logic/processors/exceptions.py +59 -0
  568. ciris_engine/logic/processors/states/__init__.py +1 -0
  569. ciris_engine/logic/processors/states/dream_processor.py +1381 -0
  570. ciris_engine/logic/processors/states/play_processor.py +141 -0
  571. ciris_engine/logic/processors/states/shutdown_processor.py +623 -0
  572. ciris_engine/logic/processors/states/solitude_processor.py +305 -0
  573. ciris_engine/logic/processors/states/wakeup_processor.py +802 -0
  574. ciris_engine/logic/processors/states/work_processor.py +742 -0
  575. ciris_engine/logic/processors/support/__init__.py +1 -0
  576. ciris_engine/logic/processors/support/dma_orchestrator.py +336 -0
  577. ciris_engine/logic/processors/support/processing_queue.py +133 -0
  578. ciris_engine/logic/processors/support/shutdown_condition_evaluator.py +294 -0
  579. ciris_engine/logic/processors/support/state_manager.py +358 -0
  580. ciris_engine/logic/processors/support/task_manager.py +303 -0
  581. ciris_engine/logic/processors/support/thought_escalation.py +116 -0
  582. ciris_engine/logic/processors/support/thought_manager.py +328 -0
  583. ciris_engine/logic/processors/support/thought_manager_enhanced.py +105 -0
  584. ciris_engine/logic/registries/__init__.py +34 -0
  585. ciris_engine/logic/registries/base.py +653 -0
  586. ciris_engine/logic/registries/circuit_breaker.py +275 -0
  587. ciris_engine/logic/registries/typed_registries.py +184 -0
  588. ciris_engine/logic/runtime/__init__.py +7 -0
  589. ciris_engine/logic/runtime/adapter_loader.py +261 -0
  590. ciris_engine/logic/runtime/adapter_manager.py +1053 -0
  591. ciris_engine/logic/runtime/ciris_runtime.py +2342 -0
  592. ciris_engine/logic/runtime/ciris_runtime_helpers.py +923 -0
  593. ciris_engine/logic/runtime/component_builder.py +361 -0
  594. ciris_engine/logic/runtime/identity_manager.py +219 -0
  595. ciris_engine/logic/runtime/module_loader.py +207 -0
  596. ciris_engine/logic/runtime/prevent_sideeffects.py +30 -0
  597. ciris_engine/logic/runtime/runtime_interface.py +23 -0
  598. ciris_engine/logic/runtime/service_initializer.py +1623 -0
  599. ciris_engine/logic/secrets/__init__.py +30 -0
  600. ciris_engine/logic/secrets/encryption.py +175 -0
  601. ciris_engine/logic/secrets/filter.py +295 -0
  602. ciris_engine/logic/secrets/service.py +652 -0
  603. ciris_engine/logic/secrets/store.py +669 -0
  604. ciris_engine/logic/services/__init__.py +1 -0
  605. ciris_engine/logic/services/adaptation/__init__.py +3 -0
  606. ciris_engine/logic/services/base_graph_service.py +142 -0
  607. ciris_engine/logic/services/base_infrastructure_service.py +69 -0
  608. ciris_engine/logic/services/base_scheduled_service.py +136 -0
  609. ciris_engine/logic/services/base_service.py +247 -0
  610. ciris_engine/logic/services/governance/__init__.py +3 -0
  611. ciris_engine/logic/services/governance/adaptive_filter/__init__.py +14 -0
  612. ciris_engine/logic/services/governance/adaptive_filter/service.py +818 -0
  613. ciris_engine/logic/services/governance/consent/__init__.py +53 -0
  614. ciris_engine/logic/services/governance/consent/air.py +403 -0
  615. ciris_engine/logic/services/governance/consent/decay.py +324 -0
  616. ciris_engine/logic/services/governance/consent/dsar_automation.py +589 -0
  617. ciris_engine/logic/services/governance/consent/exceptions.py +106 -0
  618. ciris_engine/logic/services/governance/consent/metrics.py +270 -0
  619. ciris_engine/logic/services/governance/consent/partnership.py +533 -0
  620. ciris_engine/logic/services/governance/consent/service.py +1256 -0
  621. ciris_engine/logic/services/governance/dsar/__init__.py +29 -0
  622. ciris_engine/logic/services/governance/dsar/orchestrator.py +977 -0
  623. ciris_engine/logic/services/governance/dsar/schemas.py +141 -0
  624. ciris_engine/logic/services/governance/dsar/signature_service.py +283 -0
  625. ciris_engine/logic/services/governance/self_observation/__init__.py +20 -0
  626. ciris_engine/logic/services/governance/self_observation/service.py +1153 -0
  627. ciris_engine/logic/services/governance/visibility/__init__.py +17 -0
  628. ciris_engine/logic/services/governance/visibility/service.py +512 -0
  629. ciris_engine/logic/services/governance/wise_authority/__init__.py +15 -0
  630. ciris_engine/logic/services/governance/wise_authority/service.py +827 -0
  631. ciris_engine/logic/services/graph/__init__.py +5 -0
  632. ciris_engine/logic/services/graph/audit_service/__init__.py +5 -0
  633. ciris_engine/logic/services/graph/audit_service/service.py +1675 -0
  634. ciris_engine/logic/services/graph/base.py +208 -0
  635. ciris_engine/logic/services/graph/config_service/__init__.py +5 -0
  636. ciris_engine/logic/services/graph/config_service/service.py +372 -0
  637. ciris_engine/logic/services/graph/incident_service/__init__.py +5 -0
  638. ciris_engine/logic/services/graph/incident_service/service.py +803 -0
  639. ciris_engine/logic/services/graph/memory_service.py +1120 -0
  640. ciris_engine/logic/services/graph/telemetry_service/__init__.py +5 -0
  641. ciris_engine/logic/services/graph/telemetry_service/exceptions.py +104 -0
  642. ciris_engine/logic/services/graph/telemetry_service/helpers.py +1337 -0
  643. ciris_engine/logic/services/graph/telemetry_service/service.py +2429 -0
  644. ciris_engine/logic/services/graph/tsdb_consolidation/__init__.py +17 -0
  645. ciris_engine/logic/services/graph/tsdb_consolidation/aggregation_helpers.py +355 -0
  646. ciris_engine/logic/services/graph/tsdb_consolidation/cleanup_helpers.py +438 -0
  647. ciris_engine/logic/services/graph/tsdb_consolidation/compressor.py +260 -0
  648. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/__init__.py +27 -0
  649. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/audit.py +326 -0
  650. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/conversation.py +291 -0
  651. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/memory.py +197 -0
  652. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/metrics.py +251 -0
  653. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/task.py +257 -0
  654. ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/trace.py +363 -0
  655. ciris_engine/logic/services/graph/tsdb_consolidation/data_converter.py +545 -0
  656. ciris_engine/logic/services/graph/tsdb_consolidation/date_calculation_helpers.py +193 -0
  657. ciris_engine/logic/services/graph/tsdb_consolidation/db_query_helpers.py +296 -0
  658. ciris_engine/logic/services/graph/tsdb_consolidation/edge_helpers.py +92 -0
  659. ciris_engine/logic/services/graph/tsdb_consolidation/edge_manager.py +896 -0
  660. ciris_engine/logic/services/graph/tsdb_consolidation/extensive_helpers.py +322 -0
  661. ciris_engine/logic/services/graph/tsdb_consolidation/period_manager.py +152 -0
  662. ciris_engine/logic/services/graph/tsdb_consolidation/profound_helpers.py +277 -0
  663. ciris_engine/logic/services/graph/tsdb_consolidation/query_manager.py +812 -0
  664. ciris_engine/logic/services/graph/tsdb_consolidation/service.py +1692 -0
  665. ciris_engine/logic/services/graph/tsdb_consolidation/sql_builders.py +363 -0
  666. ciris_engine/logic/services/infrastructure/__init__.py +1 -0
  667. ciris_engine/logic/services/infrastructure/authentication/__init__.py +5 -0
  668. ciris_engine/logic/services/infrastructure/authentication/service.py +1634 -0
  669. ciris_engine/logic/services/infrastructure/database_maintenance/__init__.py +15 -0
  670. ciris_engine/logic/services/infrastructure/database_maintenance/service.py +764 -0
  671. ciris_engine/logic/services/infrastructure/resource_monitor/__init__.py +7 -0
  672. ciris_engine/logic/services/infrastructure/resource_monitor/ciris_billing_provider.py +755 -0
  673. ciris_engine/logic/services/infrastructure/resource_monitor/service.py +409 -0
  674. ciris_engine/logic/services/infrastructure/resource_monitor/simple_credit_provider.py +129 -0
  675. ciris_engine/logic/services/lifecycle/__init__.py +3 -0
  676. ciris_engine/logic/services/lifecycle/initialization/__init__.py +10 -0
  677. ciris_engine/logic/services/lifecycle/initialization/service.py +312 -0
  678. ciris_engine/logic/services/lifecycle/scheduler/__init__.py +5 -0
  679. ciris_engine/logic/services/lifecycle/scheduler/service.py +607 -0
  680. ciris_engine/logic/services/lifecycle/shutdown/__init__.py +9 -0
  681. ciris_engine/logic/services/lifecycle/shutdown/service.py +378 -0
  682. ciris_engine/logic/services/lifecycle/time/__init__.py +15 -0
  683. ciris_engine/logic/services/lifecycle/time/service.py +259 -0
  684. ciris_engine/logic/services/memory_service/__init__.py +8 -0
  685. ciris_engine/logic/services/mixins/__init__.py +13 -0
  686. ciris_engine/logic/services/mixins/example_usage.py +200 -0
  687. ciris_engine/logic/services/mixins/request_metrics.py +179 -0
  688. ciris_engine/logic/services/runtime/__init__.py +3 -0
  689. ciris_engine/logic/services/runtime/adapter_configuration/__init__.py +16 -0
  690. ciris_engine/logic/services/runtime/adapter_configuration/service.py +674 -0
  691. ciris_engine/logic/services/runtime/adapter_configuration/session.py +67 -0
  692. ciris_engine/logic/services/runtime/control_service/__init__.py +5 -0
  693. ciris_engine/logic/services/runtime/control_service/service.py +2269 -0
  694. ciris_engine/logic/services/runtime/llm_service/__init__.py +14 -0
  695. ciris_engine/logic/services/runtime/llm_service/pricing_calculator.py +279 -0
  696. ciris_engine/logic/services/runtime/llm_service/service.py +930 -0
  697. ciris_engine/logic/services/tools/__init__.py +5 -0
  698. ciris_engine/logic/services/tools/core_tool_service/__init__.py +8 -0
  699. ciris_engine/logic/services/tools/core_tool_service/service.py +852 -0
  700. ciris_engine/logic/setup/__init__.py +1 -0
  701. ciris_engine/logic/setup/first_run.py +250 -0
  702. ciris_engine/logic/setup/wizard.py +327 -0
  703. ciris_engine/logic/telemetry/__init__.py +46 -0
  704. ciris_engine/logic/telemetry/core.py +239 -0
  705. ciris_engine/logic/telemetry/hot_cold_config.py +133 -0
  706. ciris_engine/logic/telemetry/log_collector.py +190 -0
  707. ciris_engine/logic/telemetry/resource_monitor.py +7 -0
  708. ciris_engine/logic/telemetry/security.py +79 -0
  709. ciris_engine/logic/utils/__init__.py +18 -0
  710. ciris_engine/logic/utils/channel_utils.py +75 -0
  711. ciris_engine/logic/utils/consent/__init__.py +1 -0
  712. ciris_engine/logic/utils/consent/partnership_utils.py +172 -0
  713. ciris_engine/logic/utils/constants.py +92 -0
  714. ciris_engine/logic/utils/context_utils.py +145 -0
  715. ciris_engine/logic/utils/directory_setup.py +533 -0
  716. ciris_engine/logic/utils/graphql_context_provider.py +152 -0
  717. ciris_engine/logic/utils/identity_resolution.py +843 -0
  718. ciris_engine/logic/utils/incident_capture_handler.py +303 -0
  719. ciris_engine/logic/utils/initialization_manager.py +74 -0
  720. ciris_engine/logic/utils/jsondict_helpers.py +290 -0
  721. ciris_engine/logic/utils/log_sanitizer.py +97 -0
  722. ciris_engine/logic/utils/logging_config.py +151 -0
  723. ciris_engine/logic/utils/observability_decorators.py +544 -0
  724. ciris_engine/logic/utils/occurrence_utils.py +155 -0
  725. ciris_engine/logic/utils/path_resolution.py +281 -0
  726. ciris_engine/logic/utils/platform_detection.py +286 -0
  727. ciris_engine/logic/utils/privacy.py +266 -0
  728. ciris_engine/logic/utils/profile_loader.py +124 -0
  729. ciris_engine/logic/utils/profile_manager.py +16 -0
  730. ciris_engine/logic/utils/runtime_utils.py +69 -0
  731. ciris_engine/logic/utils/shutdown_manager.py +107 -0
  732. ciris_engine/logic/utils/task_formatters.py +60 -0
  733. ciris_engine/logic/utils/task_thought_factory.py +404 -0
  734. ciris_engine/logic/utils/thought_utils.py +54 -0
  735. ciris_engine/logic/utils/user_utils.py +70 -0
  736. ciris_engine/protocols/__init__.py +0 -0
  737. ciris_engine/protocols/adapters/__init__.py +35 -0
  738. ciris_engine/protocols/adapters/base.py +149 -0
  739. ciris_engine/protocols/adapters/configurable.py +265 -0
  740. ciris_engine/protocols/adapters/message.py +90 -0
  741. ciris_engine/protocols/audit/__init__.py +1 -0
  742. ciris_engine/protocols/buses/__init__.py +1 -0
  743. ciris_engine/protocols/config/__init__.py +1 -0
  744. ciris_engine/protocols/conscience/__init__.py +1 -0
  745. ciris_engine/protocols/consent.py +88 -0
  746. ciris_engine/protocols/context/__init__.py +1 -0
  747. ciris_engine/protocols/data/__init__.py +1 -0
  748. ciris_engine/protocols/dma/__init__.py +1 -0
  749. ciris_engine/protocols/dma/base.py +107 -0
  750. ciris_engine/protocols/faculties.py +34 -0
  751. ciris_engine/protocols/formatters/__init__.py +1 -0
  752. ciris_engine/protocols/handlers/__init__.py +1 -0
  753. ciris_engine/protocols/infrastructure/__init__.py +25 -0
  754. ciris_engine/protocols/infrastructure/base.py +377 -0
  755. ciris_engine/protocols/persistence/__init__.py +1 -0
  756. ciris_engine/protocols/pipeline_control.py +609 -0
  757. ciris_engine/protocols/processors/__init__.py +19 -0
  758. ciris_engine/protocols/processors/agent.py +299 -0
  759. ciris_engine/protocols/processors/base.py +130 -0
  760. ciris_engine/protocols/processors/orchestration.py +62 -0
  761. ciris_engine/protocols/registries/__init__.py +1 -0
  762. ciris_engine/protocols/runtime/__init__.py +1 -0
  763. ciris_engine/protocols/runtime/base.py +163 -0
  764. ciris_engine/protocols/secrets/__init__.py +1 -0
  765. ciris_engine/protocols/services/__init__.py +80 -0
  766. ciris_engine/protocols/services/adaptation/__init__.py +7 -0
  767. ciris_engine/protocols/services/adaptation/self_observation.py +265 -0
  768. ciris_engine/protocols/services/governance/__init__.py +20 -0
  769. ciris_engine/protocols/services/governance/communication.py +58 -0
  770. ciris_engine/protocols/services/governance/filter.py +56 -0
  771. ciris_engine/protocols/services/governance/visibility.py +32 -0
  772. ciris_engine/protocols/services/governance/wa_auth.py +192 -0
  773. ciris_engine/protocols/services/governance/wise_authority.py +75 -0
  774. ciris_engine/protocols/services/graph/__init__.py +19 -0
  775. ciris_engine/protocols/services/graph/audit.py +92 -0
  776. ciris_engine/protocols/services/graph/config.py +54 -0
  777. ciris_engine/protocols/services/graph/incident_management.py +103 -0
  778. ciris_engine/protocols/services/graph/memory.py +110 -0
  779. ciris_engine/protocols/services/graph/telemetry.py +51 -0
  780. ciris_engine/protocols/services/graph/tsdb_consolidation.py +87 -0
  781. ciris_engine/protocols/services/infrastructure/__init__.py +11 -0
  782. ciris_engine/protocols/services/infrastructure/authentication.py +159 -0
  783. ciris_engine/protocols/services/infrastructure/credit_gate.py +46 -0
  784. ciris_engine/protocols/services/infrastructure/database_maintenance.py +25 -0
  785. ciris_engine/protocols/services/infrastructure/resource_monitor.py +83 -0
  786. ciris_engine/protocols/services/lifecycle/__init__.py +13 -0
  787. ciris_engine/protocols/services/lifecycle/initialization.py +41 -0
  788. ciris_engine/protocols/services/lifecycle/scheduler.py +42 -0
  789. ciris_engine/protocols/services/lifecycle/shutdown.py +50 -0
  790. ciris_engine/protocols/services/lifecycle/time.py +31 -0
  791. ciris_engine/protocols/services/runtime/__init__.py +13 -0
  792. ciris_engine/protocols/services/runtime/llm.py +50 -0
  793. ciris_engine/protocols/services/runtime/runtime_control.py +193 -0
  794. ciris_engine/protocols/services/runtime/secrets.py +100 -0
  795. ciris_engine/protocols/services/runtime/tool.py +123 -0
  796. ciris_engine/protocols/telemetry/__init__.py +1 -0
  797. ciris_engine/protocols/utils/__init__.py +1 -0
  798. ciris_engine/schemas/__init__.py +112 -0
  799. ciris_engine/schemas/actions/__init__.py +37 -0
  800. ciris_engine/schemas/actions/parameters.py +137 -0
  801. ciris_engine/schemas/adapters/__init__.py +13 -0
  802. ciris_engine/schemas/adapters/cirisnode.py +135 -0
  803. ciris_engine/schemas/adapters/cli.py +97 -0
  804. ciris_engine/schemas/adapters/cli_tools.py +98 -0
  805. ciris_engine/schemas/adapters/discord.py +125 -0
  806. ciris_engine/schemas/adapters/graphql_core.py +144 -0
  807. ciris_engine/schemas/adapters/registration.py +47 -0
  808. ciris_engine/schemas/adapters/runtime_context.py +48 -0
  809. ciris_engine/schemas/adapters/tool_execution.py +45 -0
  810. ciris_engine/schemas/adapters/tools.py +96 -0
  811. ciris_engine/schemas/api/__init__.py +1 -0
  812. ciris_engine/schemas/api/agent.py +50 -0
  813. ciris_engine/schemas/api/audit.py +38 -0
  814. ciris_engine/schemas/api/auth.py +351 -0
  815. ciris_engine/schemas/api/config_security.py +242 -0
  816. ciris_engine/schemas/api/emergency.py +111 -0
  817. ciris_engine/schemas/api/responses.py +72 -0
  818. ciris_engine/schemas/api/runtime.py +26 -0
  819. ciris_engine/schemas/api/telemetry.py +109 -0
  820. ciris_engine/schemas/api/wa.py +90 -0
  821. ciris_engine/schemas/audit/__init__.py +13 -0
  822. ciris_engine/schemas/audit/core.py +139 -0
  823. ciris_engine/schemas/audit/hash_chain.py +58 -0
  824. ciris_engine/schemas/audit/verification.py +131 -0
  825. ciris_engine/schemas/buses/__init__.py +1 -0
  826. ciris_engine/schemas/config/__init__.py +41 -0
  827. ciris_engine/schemas/config/agent.py +279 -0
  828. ciris_engine/schemas/config/cognitive_state_behaviors.py +194 -0
  829. ciris_engine/schemas/config/default_dsar_sops.py +178 -0
  830. ciris_engine/schemas/config/essential.py +195 -0
  831. ciris_engine/schemas/config/tickets.py +86 -0
  832. ciris_engine/schemas/conscience/__init__.py +25 -0
  833. ciris_engine/schemas/conscience/context.py +34 -0
  834. ciris_engine/schemas/conscience/core.py +145 -0
  835. ciris_engine/schemas/conscience/results.py +24 -0
  836. ciris_engine/schemas/consent/__init__.py +5 -0
  837. ciris_engine/schemas/consent/core.py +404 -0
  838. ciris_engine/schemas/context/__init__.py +1 -0
  839. ciris_engine/schemas/covenant.py +382 -0
  840. ciris_engine/schemas/data/__init__.py +1 -0
  841. ciris_engine/schemas/dma/__init__.py +16 -0
  842. ciris_engine/schemas/dma/core.py +199 -0
  843. ciris_engine/schemas/dma/faculty.py +192 -0
  844. ciris_engine/schemas/dma/prompts.py +172 -0
  845. ciris_engine/schemas/dma/results.py +103 -0
  846. ciris_engine/schemas/formatters/__init__.py +1 -0
  847. ciris_engine/schemas/handlers/__init__.py +10 -0
  848. ciris_engine/schemas/handlers/context.py +119 -0
  849. ciris_engine/schemas/handlers/contexts.py +100 -0
  850. ciris_engine/schemas/handlers/core.py +167 -0
  851. ciris_engine/schemas/handlers/memory_schemas.py +67 -0
  852. ciris_engine/schemas/handlers/schemas.py +95 -0
  853. ciris_engine/schemas/identity.py +149 -0
  854. ciris_engine/schemas/infrastructure/__init__.py +1 -0
  855. ciris_engine/schemas/infrastructure/base.py +256 -0
  856. ciris_engine/schemas/infrastructure/behavioral_patterns.py +129 -0
  857. ciris_engine/schemas/infrastructure/feedback_loop.py +57 -0
  858. ciris_engine/schemas/infrastructure/identity_variance.py +141 -0
  859. ciris_engine/schemas/infrastructure/oauth.py +175 -0
  860. ciris_engine/schemas/infrastructure/wa_cli_wizard.py +54 -0
  861. ciris_engine/schemas/persistence/__init__.py +34 -0
  862. ciris_engine/schemas/persistence/core.py +140 -0
  863. ciris_engine/schemas/persistence/correlations.py +73 -0
  864. ciris_engine/schemas/persistence/postgres/__init__.py +1 -0
  865. ciris_engine/schemas/persistence/postgres/tables.py +280 -0
  866. ciris_engine/schemas/persistence/sqlite/__init__.py +1 -0
  867. ciris_engine/schemas/persistence/sqlite/tables.py +281 -0
  868. ciris_engine/schemas/platform.py +149 -0
  869. ciris_engine/schemas/processors/__init__.py +26 -0
  870. ciris_engine/schemas/processors/base.py +130 -0
  871. ciris_engine/schemas/processors/cognitive.py +77 -0
  872. ciris_engine/schemas/processors/context.py +35 -0
  873. ciris_engine/schemas/processors/core.py +152 -0
  874. ciris_engine/schemas/processors/dma.py +105 -0
  875. ciris_engine/schemas/processors/error.py +122 -0
  876. ciris_engine/schemas/processors/main.py +109 -0
  877. ciris_engine/schemas/processors/phase_results.py +21 -0
  878. ciris_engine/schemas/processors/results.py +99 -0
  879. ciris_engine/schemas/processors/solitude.py +79 -0
  880. ciris_engine/schemas/processors/state.py +202 -0
  881. ciris_engine/schemas/processors/state_example.py +177 -0
  882. ciris_engine/schemas/processors/states.py +21 -0
  883. ciris_engine/schemas/processors/status.py +34 -0
  884. ciris_engine/schemas/registries/__init__.py +1 -0
  885. ciris_engine/schemas/registries/base.py +66 -0
  886. ciris_engine/schemas/resources/__init__.py +15 -0
  887. ciris_engine/schemas/resources/crisis.py +315 -0
  888. ciris_engine/schemas/runtime/__init__.py +42 -0
  889. ciris_engine/schemas/runtime/adapter_management.py +186 -0
  890. ciris_engine/schemas/runtime/api.py +58 -0
  891. ciris_engine/schemas/runtime/audit.py +50 -0
  892. ciris_engine/schemas/runtime/bootstrap.py +33 -0
  893. ciris_engine/schemas/runtime/contexts.py +61 -0
  894. ciris_engine/schemas/runtime/core.py +161 -0
  895. ciris_engine/schemas/runtime/enums.py +167 -0
  896. ciris_engine/schemas/runtime/extended.py +232 -0
  897. ciris_engine/schemas/runtime/manifest.py +311 -0
  898. ciris_engine/schemas/runtime/memory.py +60 -0
  899. ciris_engine/schemas/runtime/messages.py +108 -0
  900. ciris_engine/schemas/runtime/models.py +156 -0
  901. ciris_engine/schemas/runtime/processing_context.py +43 -0
  902. ciris_engine/schemas/runtime/protocols_core.py +96 -0
  903. ciris_engine/schemas/runtime/resources.py +33 -0
  904. ciris_engine/schemas/runtime/system_context.py +417 -0
  905. ciris_engine/schemas/secrets/__init__.py +1 -0
  906. ciris_engine/schemas/secrets/core.py +267 -0
  907. ciris_engine/schemas/secrets/service.py +95 -0
  908. ciris_engine/schemas/services/__init__.py +33 -0
  909. ciris_engine/schemas/services/audit_summary_node.py +172 -0
  910. ciris_engine/schemas/services/authority/__init__.py +39 -0
  911. ciris_engine/schemas/services/authority/jwt.py +158 -0
  912. ciris_engine/schemas/services/authority/wa_updates.py +138 -0
  913. ciris_engine/schemas/services/authority/wise_authority.py +163 -0
  914. ciris_engine/schemas/services/authority_core.py +370 -0
  915. ciris_engine/schemas/services/capabilities.py +72 -0
  916. ciris_engine/schemas/services/community_core.py +95 -0
  917. ciris_engine/schemas/services/context.py +111 -0
  918. ciris_engine/schemas/services/conversation_summary_node.py +189 -0
  919. ciris_engine/schemas/services/core/__init__.py +153 -0
  920. ciris_engine/schemas/services/core/runtime.py +262 -0
  921. ciris_engine/schemas/services/core/runtime_config.py +117 -0
  922. ciris_engine/schemas/services/core/secrets.py +65 -0
  923. ciris_engine/schemas/services/correlation_node.py +179 -0
  924. ciris_engine/schemas/services/credit_gate.py +92 -0
  925. ciris_engine/schemas/services/discord_nodes.py +299 -0
  926. ciris_engine/schemas/services/feedback_core.py +131 -0
  927. ciris_engine/schemas/services/filters_core.py +270 -0
  928. ciris_engine/schemas/services/governance.py +26 -0
  929. ciris_engine/schemas/services/graph/__init__.py +26 -0
  930. ciris_engine/schemas/services/graph/attributes.py +254 -0
  931. ciris_engine/schemas/services/graph/audit.py +98 -0
  932. ciris_engine/schemas/services/graph/consolidation.py +338 -0
  933. ciris_engine/schemas/services/graph/edge_types.py +43 -0
  934. ciris_engine/schemas/services/graph/edges.py +88 -0
  935. ciris_engine/schemas/services/graph/incident.py +312 -0
  936. ciris_engine/schemas/services/graph/memory.py +84 -0
  937. ciris_engine/schemas/services/graph/node_data.py +174 -0
  938. ciris_engine/schemas/services/graph/query_results.py +82 -0
  939. ciris_engine/schemas/services/graph/telemetry.py +250 -0
  940. ciris_engine/schemas/services/graph/tsdb_consolidation.py +27 -0
  941. ciris_engine/schemas/services/graph/tsdb_models.py +107 -0
  942. ciris_engine/schemas/services/graph_core.py +196 -0
  943. ciris_engine/schemas/services/graph_typed_nodes.py +194 -0
  944. ciris_engine/schemas/services/infrastructure/__init__.py +1 -0
  945. ciris_engine/schemas/services/infrastructure/resource_monitor.py +20 -0
  946. ciris_engine/schemas/services/lifecycle/__init__.py +9 -0
  947. ciris_engine/schemas/services/lifecycle/initialization.py +33 -0
  948. ciris_engine/schemas/services/lifecycle/time.py +50 -0
  949. ciris_engine/schemas/services/llm.py +187 -0
  950. ciris_engine/schemas/services/metadata.py +43 -0
  951. ciris_engine/schemas/services/nodes.py +704 -0
  952. ciris_engine/schemas/services/operations.py +126 -0
  953. ciris_engine/schemas/services/requests.py +128 -0
  954. ciris_engine/schemas/services/resources_core.py +182 -0
  955. ciris_engine/schemas/services/runtime_control.py +1010 -0
  956. ciris_engine/schemas/services/shutdown.py +88 -0
  957. ciris_engine/schemas/services/special/__init__.py +0 -0
  958. ciris_engine/schemas/services/special/self_observation.py +396 -0
  959. ciris_engine/schemas/services/trace_summary_node.py +199 -0
  960. ciris_engine/schemas/services/visibility.py +98 -0
  961. ciris_engine/schemas/streaming/__init__.py +10 -0
  962. ciris_engine/schemas/streaming/reasoning_stream.py +95 -0
  963. ciris_engine/schemas/telemetry/__init__.py +0 -0
  964. ciris_engine/schemas/telemetry/collector.py +67 -0
  965. ciris_engine/schemas/telemetry/core.py +252 -0
  966. ciris_engine/schemas/telemetry/unified.py +59 -0
  967. ciris_engine/schemas/tools.py +72 -0
  968. ciris_engine/schemas/types.py +47 -0
  969. ciris_engine/schemas/utils/__init__.py +1 -0
  970. ciris_engine/schemas/utils/config_validator.py +54 -0
  971. ciris_engine/utils/__init__.py +1 -0
  972. ciris_engine/utils/serialization.py +35 -0
  973. ciris_sdk/__init__.py +124 -0
  974. ciris_sdk/auth_store.py +261 -0
  975. ciris_sdk/client.py +261 -0
  976. ciris_sdk/exceptions.py +73 -0
  977. ciris_sdk/model_types.py +258 -0
  978. ciris_sdk/models.py +354 -0
  979. ciris_sdk/pagination.py +214 -0
  980. ciris_sdk/rate_limiter.py +188 -0
  981. ciris_sdk/setup.py +17 -0
  982. ciris_sdk/telemetry_models.py +257 -0
  983. ciris_sdk/telemetry_responses.py +199 -0
  984. ciris_sdk/transport.py +177 -0
  985. ciris_sdk/websocket.py +400 -0
  986. 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