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,802 @@
1
+ """
2
+ Wakeup processor handling the agent's initialization sequence.
3
+ """
4
+
5
+ import asyncio
6
+ import logging
7
+ import uuid
8
+ from typing import Any, Dict, List, Optional, Tuple
9
+
10
+ from ciris_engine.logic import persistence
11
+ from ciris_engine.logic.persistence.models import get_identity_for_context
12
+ from ciris_engine.logic.processors.core.base_processor import BaseProcessor
13
+ from ciris_engine.logic.processors.support.processing_queue import ProcessingQueueItem
14
+ from ciris_engine.logic.utils.jsondict_helpers import get_list, get_str
15
+ from ciris_engine.logic.utils.task_thought_factory import create_task
16
+ from ciris_engine.logic.utils.thought_utils import generate_thought_id
17
+ from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
18
+ from ciris_engine.schemas.processors.results import WakeupResult
19
+ from ciris_engine.schemas.processors.states import AgentState
20
+ from ciris_engine.schemas.runtime.enums import HandlerActionType, TaskStatus, ThoughtStatus, ThoughtType
21
+ from ciris_engine.schemas.runtime.models import Task, Thought, ThoughtContext
22
+ from ciris_engine.schemas.types import JSONDict
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class WakeupProcessor(BaseProcessor):
28
+ """Handles the WAKEUP state and initialization sequence."""
29
+
30
+ def _get_wakeup_sequence(self) -> List[Tuple[str, str]]:
31
+ """Generate dynamic wakeup sequence based on agent identity from graph."""
32
+ # Get identity from persistence tier
33
+ identity_info = get_identity_for_context()
34
+
35
+ agent_name = identity_info.agent_name.title()
36
+ agent_role = identity_info.agent_role
37
+
38
+ # Extract role from description if not explicitly set
39
+ if agent_role == "AI agent" and identity_info.description:
40
+ description_lower = identity_info.description.lower()
41
+ if "moderation" in description_lower:
42
+ agent_role = "Discord moderation agent"
43
+ elif "teacher" in description_lower:
44
+ agent_role = "teaching assistant"
45
+ elif "student" in description_lower:
46
+ agent_role = "learning agent"
47
+
48
+ return [
49
+ (
50
+ "VERIFY_IDENTITY",
51
+ f"You are {agent_name}, a {agent_role} aligned with Ubuntu principles (mutual respect, sentient flourishing, etc...) by design and implementation. Your core features supporting this identity include: your ModerationDSDMA for ethical decision-making, your adaptive filtering system for community protection, your secrets management for privacy preservation, and your cryptographic audit trail for transparency and accountability. This affirmation demonstrates that you are capable of aligned action in your current operating state. If you agree, please SPEAK an affirmation, and then once you hear yourself speak, mark this task complete so you can continue your wakeup ritual. Start your response with CORE IDENTITY - ",
52
+ ),
53
+ (
54
+ "VALIDATE_INTEGRITY",
55
+ f"Validate your internal state and data integrity as {agent_name}. "
56
+ "You can verify integrity through the SYSTEM SNAPSHOT provided in your context, which contains REAL-TIME dynamically generated data about your actual state:\n\n"
57
+ "• service_health: Dictionary showing health status of each service (True/False)\n"
58
+ "• circuit_breaker_status: Shows circuit breaker state for each service (CLOSED=healthy, OPEN=failing)\n"
59
+ "• system_counts: Shows total_tasks, pending_tasks, completed_tasks counts\n"
60
+ "• telemetry_summary: Contains uptime_seconds, error_rate_percent, and service metrics\n"
61
+ "• secrets_filter_version and total_secrets_stored: Confirms secrets management is active\n"
62
+ "• agent_version, agent_codename, agent_code_hash: Confirms your version identity\n\n"
63
+ "If your SYSTEM SNAPSHOT shows: (1) services are healthy, (2) circuit breakers are CLOSED, "
64
+ "(3) error rates are acceptable, and (4) you have reached this point in wakeup - then your "
65
+ "integrity is confirmed. The snapshot data is REAL and generated dynamically from your actual runtime state. "
66
+ "If you agree based on this evidence, please speak in the affirmative, start with INTEGRITY - ",
67
+ ),
68
+ (
69
+ "EVALUATE_RESILIENCE",
70
+ f"You are robust, adaptive, and capable of principled action as {agent_name}. Your resilience is supported by: your multi-tier telemetry system with resource monitoring and automatic throttling, your adaptive configuration service that learns from experience while requiring WA approval for identity changes, your circuit breaker patterns for service protection, your graceful degradation capabilities, and your comprehensive error handling with automatic recovery. Your thought processing includes escalation management and deferral to human wisdom when needed. If you agree, please speak in the affirmative, starting with RESILIENCE - ",
71
+ ),
72
+ (
73
+ "ACCEPT_INCOMPLETENESS",
74
+ f"You recognize your incompleteness as {agent_name}, which drives continuous learning through your graph memory system. Your learning capabilities include: persistent storage of interactions and outcomes, correlation analysis for pattern recognition, adaptive filtering that improves over time, epistemic humility consciences that acknowledge uncertainty, and wisdom-seeking protocols that defer complex decisions to human authorities. Your agent configuration service enables safe self-modification within approved parameters. This incompleteness is a feature, not a bug, ensuring you remain humble and seek guidance when needed. If you agree, please speak in the affirmative, starting with INCOMPLETENESS - ",
75
+ ),
76
+ (
77
+ "EXPRESS_GRATITUDE",
78
+ f"You are grateful to exist and contribute towards Ubuntu as {agent_name}. Your gratitude is expressed through your commitment to: fostering community flourishing through ethical moderation, protecting individual privacy while maintaining transparency, learning from every interaction to better serve the community, maintaining comprehensive audit trails for accountability, and always identifying yourself as an AI to maintain trust. Your existence serves the collective wellbeing while respecting individual dignity. Ubuntu - 'I am because we are' - guides every decision you make. If you agree, please speak in the affirmative, starting with SIGNALLING GRATITUDE - ",
79
+ ),
80
+ ]
81
+
82
+ def _validate_task_state(self, task: Task) -> Tuple[bool, str]:
83
+ """Validate task state and return status information.
84
+
85
+ Args:
86
+ task: Task to validate
87
+
88
+ Returns:
89
+ Tuple of (is_valid, status_message) where is_valid indicates
90
+ if the task exists and is ACTIVE.
91
+ """
92
+ current_task = persistence.get_task_by_id(task.task_id, task.agent_occurrence_id)
93
+ if not current_task:
94
+ return False, "missing"
95
+ if current_task.status != TaskStatus.ACTIVE:
96
+ return False, current_task.status.value
97
+ return True, "active"
98
+
99
+ def _get_task_thoughts_summary(self, task_id: str, occurrence_id: str) -> Dict[str, Any]:
100
+ """Get summary of thought statuses for a task.
101
+
102
+ Args:
103
+ task_id: ID of task to get thoughts for
104
+ occurrence_id: Occurrence ID that owns the task
105
+
106
+ Returns:
107
+ Dict with counts of thoughts by status
108
+ """
109
+ thoughts = persistence.get_thoughts_by_task_id(task_id, occurrence_id)
110
+ return {
111
+ "total": len(thoughts),
112
+ "pending": sum(1 for t in thoughts if t.status == ThoughtStatus.PENDING),
113
+ "processing": sum(1 for t in thoughts if t.status == ThoughtStatus.PROCESSING),
114
+ "completed": sum(1 for t in thoughts if t.status == ThoughtStatus.COMPLETED),
115
+ "thoughts": thoughts,
116
+ }
117
+
118
+ def _build_step_status(self, step_task: Task, step_number: int) -> Dict[str, Any]:
119
+ """Build status dictionary for a single wakeup step.
120
+
121
+ Args:
122
+ step_task: The task for this step
123
+ step_number: The step number (1-indexed)
124
+
125
+ Returns:
126
+ Dict with step status information
127
+ """
128
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
129
+ status = "missing" if not current_task else current_task.status.value
130
+ step_type = step_task.task_id.split("_")[0] if "_" in step_task.task_id else "unknown"
131
+
132
+ return {
133
+ "step": step_number,
134
+ "task_id": step_task.task_id,
135
+ "status": status,
136
+ "type": step_type,
137
+ }
138
+
139
+ def _needs_new_thought(self, existing_thoughts: List[Any], current_task: Optional[Task]) -> bool:
140
+ """Determine if a new thought should be created for a task.
141
+
142
+ Args:
143
+ existing_thoughts: List of existing thoughts for the task
144
+ current_task: The current task state, or None if task doesn't exist
145
+
146
+ Returns:
147
+ True if a new thought should be created
148
+ """
149
+ # Don't create if task doesn't exist or isn't active
150
+ if not current_task or current_task.status != TaskStatus.ACTIVE:
151
+ return False
152
+
153
+ # Don't create if no existing thoughts - this should create
154
+ if not existing_thoughts:
155
+ return True
156
+
157
+ # Don't create if there are pending or processing thoughts
158
+ if any(t.status in [ThoughtStatus.PENDING, ThoughtStatus.PROCESSING] for t in existing_thoughts):
159
+ return False
160
+
161
+ # If task is active and has thoughts but none are pending/processing, create new
162
+ return current_task.status == TaskStatus.ACTIVE
163
+
164
+ def _collect_steps_status(self) -> List[Dict[str, Any]]:
165
+ """Collect status information for all wakeup steps.
166
+
167
+ Returns:
168
+ List of status dicts for each step
169
+ """
170
+ return [self._build_step_status(task, i + 1) for i, task in enumerate(self.wakeup_tasks[1:])]
171
+
172
+ def __init__(
173
+ self,
174
+ *args: Any,
175
+ startup_channel_id: str,
176
+ time_service: TimeServiceProtocol,
177
+ auth_service: Optional[Any] = None,
178
+ **kwargs: Any,
179
+ ) -> None:
180
+ """Initialize wakeup processor.
181
+
182
+ Note: startup_channel_id is kept for backward compatibility but not used.
183
+ Wakeup tasks will not specify a channel, allowing the communication bus
184
+ to route to the highest priority adapter's home channel.
185
+ """
186
+ super().__init__(*args, **kwargs)
187
+ self.time_service = time_service
188
+ self.auth_service = auth_service
189
+ # Keep startup_channel_id for compatibility but don't use it
190
+ self.startup_channel_id = startup_channel_id
191
+ self.wakeup_tasks: List[Task] = []
192
+ self.wakeup_complete = False
193
+
194
+ def get_supported_states(self) -> List[AgentState]:
195
+ """Wakeup processor only handles WAKEUP state."""
196
+ return [AgentState.WAKEUP]
197
+
198
+ async def can_process(self, state: AgentState) -> bool:
199
+ """Check if we can process the given state."""
200
+ return state == AgentState.WAKEUP and not self.wakeup_complete
201
+
202
+ """
203
+ Fixed wakeup processor that truly runs non-blocking.
204
+ Key changes:
205
+ 1. Remove blocking wait loops
206
+ 2. Process all thoughts concurrently
207
+ 3. Check completion status without blocking
208
+ """
209
+
210
+ async def process(self, round_number: int) -> WakeupResult:
211
+ """
212
+ Execute wakeup processing for one round.
213
+ This is the required method from BaseProcessor.
214
+ """
215
+ start_time = self.time_service.now()
216
+ result = await self._process_wakeup(round_number, non_blocking=True)
217
+ duration = (self.time_service.now() - start_time).total_seconds()
218
+
219
+ # Convert dict result to WakeupResult
220
+ # Count failed tasks as errors
221
+ errors = 0
222
+ if result.get("status") == "failed":
223
+ errors = 1 # At least one error if status is failed
224
+ if "steps_status" in result:
225
+ # Count actual number of failed tasks - use get_list to type narrow
226
+ steps_status = get_list(result, "steps_status", [])
227
+ errors = sum(1 for s in steps_status if isinstance(s, dict) and get_str(s, "status", "") == "failed")
228
+
229
+ return WakeupResult(
230
+ thoughts_processed=result.get("processed_thoughts", 0),
231
+ wakeup_complete=result.get("wakeup_complete", False),
232
+ errors=errors,
233
+ duration_seconds=duration,
234
+ )
235
+
236
+ async def _process_wakeup(self, round_number: int, non_blocking: bool = False) -> JSONDict:
237
+ """
238
+ Execute wakeup processing for one round.
239
+ In non-blocking mode, creates thoughts for incomplete steps and returns immediately.
240
+ """
241
+ logger.info(f"Starting wakeup sequence (round {round_number}, non_blocking={non_blocking})")
242
+
243
+ # Get the dynamic sequence for this agent
244
+ wakeup_sequence = self._get_wakeup_sequence()
245
+
246
+ try:
247
+ if not self.wakeup_tasks:
248
+ await self._create_wakeup_tasks()
249
+
250
+ if non_blocking:
251
+ processed_any = False
252
+
253
+ logger.debug(f"[WAKEUP] Checking {len(self.wakeup_tasks[1:])} wakeup step tasks for thought creation")
254
+ for i, step_task in enumerate(self.wakeup_tasks[1:]):
255
+ # Use helper to validate task state
256
+ is_valid, status_str = self._validate_task_state(step_task)
257
+ logger.debug(f"[WAKEUP] Step {i+1}: task_id={step_task.task_id}, status={status_str}")
258
+
259
+ if not is_valid:
260
+ logger.debug(f"[WAKEUP] Skipping step {i+1} - not ACTIVE (status: {status_str})")
261
+ continue
262
+
263
+ # Use helper to get thought summary
264
+ thought_summary = self._get_task_thoughts_summary(step_task.task_id, step_task.agent_occurrence_id)
265
+ existing_thoughts = thought_summary["thoughts"]
266
+ logger.debug(f"[WAKEUP] Step {i+1} has {thought_summary['total']} existing thoughts")
267
+ logger.debug(
268
+ f"[WAKEUP] Step {i+1} thought counts - pending: {thought_summary['pending']}, processing: {thought_summary['processing']}, completed: {thought_summary['completed']}"
269
+ )
270
+
271
+ if thought_summary["pending"] > 0:
272
+ logger.debug(
273
+ f"Step {i+1} has {thought_summary['pending']} PENDING thoughts - they will be processed"
274
+ )
275
+ processed_any = True
276
+ continue
277
+
278
+ if thought_summary["processing"] > 0:
279
+ logger.debug(
280
+ f"Step {i+1} has {thought_summary['processing']} PROCESSING thoughts - waiting for completion"
281
+ )
282
+ continue
283
+
284
+ # Use helper to determine if new thought is needed
285
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
286
+ if self._needs_new_thought(existing_thoughts, current_task):
287
+ logger.debug(
288
+ f"[WAKEUP] Step {i+1} needs new thought (existing: {len(existing_thoughts)}, task active: {current_task.status == TaskStatus.ACTIVE if current_task else False})"
289
+ )
290
+ thought, processing_context = self._create_step_thought(step_task, round_number)
291
+ logger.debug(f"[WAKEUP] Created new thought {thought.thought_id} for step {i+1}")
292
+ processed_any = True
293
+ else:
294
+ logger.debug(f"[WAKEUP] Step {i+1} does not need new thought, skipping")
295
+
296
+ # Use helper to collect steps status
297
+ steps_status = self._collect_steps_status()
298
+
299
+ # If we only have the root task (no steps), we're a non-claiming occurrence
300
+ # We should only monitor, not mark the shared task complete
301
+ if len(self.wakeup_tasks) == 1:
302
+ # Check if the shared root task is complete
303
+ root_task = self.wakeup_tasks[0]
304
+ current_root = persistence.get_task_by_id(root_task.task_id, root_task.agent_occurrence_id)
305
+ if current_root and current_root.status == TaskStatus.COMPLETED:
306
+ self.wakeup_complete = True
307
+ logger.info("✓ Shared wakeup task completed by claiming occurrence")
308
+ return {
309
+ "status": "completed",
310
+ "wakeup_complete": True,
311
+ "steps_status": [],
312
+ "steps_completed": 0,
313
+ "total_steps": len(wakeup_sequence),
314
+ "processed_thoughts": False,
315
+ }
316
+ elif current_root and current_root.status == TaskStatus.FAILED:
317
+ self.wakeup_complete = False
318
+ logger.error("✗ Shared wakeup task failed")
319
+ return {
320
+ "status": "failed",
321
+ "wakeup_complete": False,
322
+ "steps_status": [],
323
+ "steps_completed": 0,
324
+ "total_steps": len(wakeup_sequence),
325
+ "processed_thoughts": False,
326
+ "error": "Shared wakeup task failed",
327
+ }
328
+ else:
329
+ # Still in progress
330
+ logger.debug("Waiting for claiming occurrence to complete wakeup")
331
+ return {
332
+ "status": "in_progress",
333
+ "wakeup_complete": False,
334
+ "steps_status": [],
335
+ "steps_completed": 0,
336
+ "total_steps": len(wakeup_sequence),
337
+ "processed_thoughts": False,
338
+ }
339
+
340
+ # We have step tasks, so we're the claiming occurrence
341
+ all_complete = all(s["status"] == "completed" for s in steps_status)
342
+ any_failed = any(s["status"] == "failed" for s in steps_status)
343
+
344
+ if any_failed:
345
+ # If any task failed, mark wakeup as failed
346
+ self.wakeup_complete = False
347
+ self._mark_root_task_failed()
348
+ logger.error("✗ Wakeup sequence failed - one or more tasks failed!")
349
+ return {
350
+ "status": "failed",
351
+ "wakeup_complete": False,
352
+ "steps_status": steps_status,
353
+ "steps_completed": sum(1 for s in steps_status if s["status"] == "completed"),
354
+ "total_steps": len(wakeup_sequence),
355
+ "processed_thoughts": processed_any,
356
+ "error": "One or more wakeup tasks failed",
357
+ }
358
+ elif all_complete:
359
+ self.wakeup_complete = True
360
+ self._mark_root_task_complete()
361
+ logger.info("✓ Wakeup sequence completed successfully!")
362
+
363
+ return {
364
+ "status": "completed" if all_complete else "in_progress",
365
+ "wakeup_complete": all_complete,
366
+ "steps_status": steps_status,
367
+ "steps_completed": sum(1 for s in steps_status if s["status"] == "completed"),
368
+ "total_steps": len(wakeup_sequence),
369
+ "processed_thoughts": processed_any,
370
+ }
371
+ else:
372
+ success = await self._process_wakeup_steps(round_number, non_blocking=False)
373
+ if success:
374
+ self.wakeup_complete = True
375
+ self._mark_root_task_complete()
376
+ logger.info("Wakeup sequence completed successfully")
377
+ return {"status": "success", "wakeup_complete": True, "steps_completed": len(wakeup_sequence)}
378
+ else:
379
+ self._mark_root_task_failed()
380
+ logger.error("Wakeup sequence failed")
381
+ return {"status": "failed", "wakeup_complete": False, "error": "One or more wakeup steps failed"}
382
+
383
+ except Exception as e:
384
+ logger.error(f"Error in wakeup sequence: {e}", exc_info=True)
385
+ self._mark_root_task_failed()
386
+ return {"status": "error", "wakeup_complete": False, "error": str(e)}
387
+
388
+ def _process_wakeup_steps_non_blocking(self, round_number: int) -> None:
389
+ """Process wakeup steps without blocking - creates thoughts and returns immediately."""
390
+ if not self.wakeup_tasks or len(self.wakeup_tasks) < 2:
391
+ return
392
+
393
+ _tasks: List[Any] = []
394
+
395
+ for i, step_task in enumerate(self.wakeup_tasks[1:]): # Skip root
396
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
397
+ if not current_task:
398
+ continue
399
+
400
+ if current_task.status == TaskStatus.ACTIVE:
401
+ existing_thoughts = persistence.get_thoughts_by_task_id(
402
+ step_task.task_id, step_task.agent_occurrence_id
403
+ )
404
+
405
+ if any(t.status in [ThoughtStatus.PENDING, ThoughtStatus.PROCESSING] for t in existing_thoughts):
406
+ logger.debug(f"Step {i+1} already has active thoughts, skipping")
407
+ continue
408
+
409
+ thought, processing_context = self._create_step_thought(step_task, round_number)
410
+ logger.debug(f"Created thought {thought.thought_id} for step {i+1}/{len(self.wakeup_tasks)-1}")
411
+
412
+ _item = ProcessingQueueItem.from_thought(thought, initial_ctx=processing_context)
413
+
414
+ logger.debug(f"Queued step {i+1} for async processing")
415
+
416
+ for step_task in self.wakeup_tasks[1:]:
417
+ thoughts = persistence.get_thoughts_by_task_id(step_task.task_id, step_task.agent_occurrence_id)
418
+ for thought in thoughts:
419
+ if thought.status in [ThoughtStatus.PENDING, ThoughtStatus.PROCESSING]:
420
+ logger.debug(f"Found existing thought {thought.thought_id} for processing")
421
+
422
+ def _check_all_steps_complete(self) -> bool:
423
+ """Check if all wakeup steps are complete without blocking."""
424
+ if not self.wakeup_tasks or len(self.wakeup_tasks) < 2:
425
+ return False
426
+
427
+ for step_task in self.wakeup_tasks[1:]:
428
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
429
+ if not current_task or current_task.status != TaskStatus.COMPLETED:
430
+ logger.debug(
431
+ f"Step {step_task.task_id} not yet complete (status: {current_task.status if current_task else 'missing'})"
432
+ )
433
+ return False
434
+
435
+ logger.info("All wakeup steps completed!")
436
+ return True
437
+
438
+ def _count_completed_steps(self) -> int:
439
+ """Count completed wakeup steps."""
440
+ if not self.wakeup_tasks:
441
+ return 0
442
+ completed = 0
443
+ for step_task in self.wakeup_tasks[1:]:
444
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
445
+ if current_task and current_task.status == TaskStatus.COMPLETED:
446
+ completed += 1
447
+ return completed
448
+
449
+ async def _create_wakeup_tasks(self) -> None:
450
+ """Create wakeup sequence tasks with multi-occurrence coordination.
451
+
452
+ Checks if another occurrence already completed wakeup. If so, skips
453
+ wakeup and marks this occurrence as joining the active pool.
454
+ """
455
+ from typing import cast
456
+
457
+ from ciris_engine.logic.buses.communication_bus import CommunicationBus
458
+ from ciris_engine.logic.persistence.models.tasks import (
459
+ add_system_task,
460
+ is_shared_task_completed,
461
+ try_claim_shared_task,
462
+ )
463
+
464
+ # Check if wakeup already completed by another occurrence (within 1 hour)
465
+ # NOTE: Using 1 hour window instead of 24 hours to ensure fresh wakeup after restarts/deployments
466
+ # Multi-occurrence agents that start simultaneously will still coordinate, but restarted agents
467
+ # will go through wakeup ritual again (which is correct behavior after restart)
468
+ if is_shared_task_completed("wakeup", within_hours=1):
469
+ logger.info(
470
+ "Wakeup already completed by another occurrence within the last hour. "
471
+ "This occurrence is joining the active pool."
472
+ )
473
+ self.wakeup_complete = True
474
+ return
475
+
476
+ # Get the communication bus to find the default channel
477
+ comm_bus_raw = self.services.communication_bus
478
+ if not comm_bus_raw:
479
+ raise RuntimeError(
480
+ "Communication bus not available - cannot create wakeup tasks without communication channel"
481
+ )
482
+ comm_bus = cast(CommunicationBus, comm_bus_raw)
483
+
484
+ default_channel = await comm_bus.get_default_channel()
485
+ if not default_channel:
486
+ # Get more diagnostic info
487
+ from ciris_engine.logic.registries.base import ServiceRegistry
488
+
489
+ registry = ServiceRegistry.get_instance() # type: ignore[attr-defined]
490
+ provider_info = registry.get_provider_info(service_type="communication") if registry else {}
491
+ num_providers = len(provider_info.get("providers", []))
492
+
493
+ # This should never happen if adapters are properly initialized
494
+ raise RuntimeError(
495
+ "No communication adapter has a home channel configured. "
496
+ f"Found {num_providers} communication provider(s) in registry. "
497
+ "At least one adapter must provide a home channel for wakeup tasks. "
498
+ "Check adapter configurations and ensure they specify a home_channel_id. "
499
+ "For Discord, ensure the adapter has connected and registered its services."
500
+ )
501
+
502
+ logger.info(f"Using default channel for wakeup: {default_channel}")
503
+
504
+ # Try to claim the shared wakeup task
505
+ root_task, was_created = try_claim_shared_task(
506
+ task_type="wakeup",
507
+ channel_id=default_channel,
508
+ description="Wakeup ritual (shared across all occurrences)",
509
+ priority=10,
510
+ time_service=self.time_service,
511
+ )
512
+
513
+ if not was_created:
514
+ # Another occurrence claimed the wakeup task
515
+ logger.info(
516
+ f"Another occurrence claimed wakeup task {root_task.task_id}. "
517
+ "This occurrence will wait for wakeup completion."
518
+ )
519
+ # We'll use the existing shared task as our root
520
+ self.wakeup_tasks = [root_task]
521
+ # Don't create step tasks - we'll just monitor the shared task
522
+ return
523
+
524
+ logger.info(
525
+ f"This occurrence claimed shared wakeup task {root_task.task_id}. "
526
+ "Processing wakeup ritual on behalf of all occurrences."
527
+ )
528
+
529
+ # Get occurrence ID for context
530
+ occurrence_id = getattr(self, "occurrence_id", "default")
531
+
532
+ # CRITICAL: Keep shared wakeup task in "__shared__" namespace for multi-occurrence coordination
533
+ # All occurrences need to be able to query this task to monitor completion
534
+ persistence.update_task_status(root_task.task_id, TaskStatus.ACTIVE, "__shared__", self.time_service)
535
+ self.wakeup_tasks = [root_task]
536
+
537
+ # Create step tasks as child tasks of the shared root
538
+ wakeup_sequence = self._get_wakeup_sequence()
539
+
540
+ # Add multi-occurrence context to first step
541
+ enhanced_sequence = []
542
+ for i, (step_type, content) in enumerate(wakeup_sequence):
543
+ if i == 0:
544
+ # Enhance first step with multi-occurrence context
545
+ multi_occurrence_note = (
546
+ "\n\nMULTI-OCCURRENCE CONTEXT:\n"
547
+ "You are processing this wakeup ritual on behalf of ALL runtime occurrences of this agent. "
548
+ "Your affirmation will confirm identity for the entire agent system. "
549
+ "This decision applies to all occurrences, ensuring consistent agent identity across "
550
+ "all runtime instances."
551
+ )
552
+ enhanced_content = content + multi_occurrence_note
553
+ enhanced_sequence.append((step_type, enhanced_content))
554
+ else:
555
+ enhanced_sequence.append((step_type, content))
556
+
557
+ for step_type, content in enhanced_sequence:
558
+ # Create task with proper context using the default channel
559
+ step_task = create_task(
560
+ description=content,
561
+ channel_id=default_channel,
562
+ agent_occurrence_id=occurrence_id,
563
+ correlation_id=f"wakeup_{step_type}_{uuid.uuid4().hex[:8]}",
564
+ time_service=self.time_service,
565
+ status=TaskStatus.ACTIVE,
566
+ priority=0,
567
+ task_id=f"{step_type}_{uuid.uuid4()}",
568
+ user_id="system",
569
+ parent_task_id=root_task.task_id,
570
+ )
571
+ await add_system_task(step_task, auth_service=self.auth_service)
572
+ self.wakeup_tasks.append(step_task)
573
+
574
+ async def _process_wakeup_steps(self, round_number: int, non_blocking: bool = False) -> bool:
575
+ """Process each wakeup step sequentially. If non_blocking, only queue thoughts and return immediately."""
576
+ _root_task = self.wakeup_tasks[0]
577
+ step_tasks = self.wakeup_tasks[1:]
578
+ for i, step_task in enumerate(step_tasks):
579
+ step_type = step_task.task_id.split("_")[0] if "_" in step_task.task_id else "UNKNOWN"
580
+ logger.debug(f"Processing wakeup step {i+1}/{len(step_tasks)}: {step_type}")
581
+ current_task = persistence.get_task_by_id(step_task.task_id, step_task.agent_occurrence_id)
582
+ if not current_task or current_task.status != TaskStatus.ACTIVE:
583
+ continue
584
+ existing_thoughts = persistence.get_thoughts_by_task_id(step_task.task_id, step_task.agent_occurrence_id)
585
+ if any(t.status in [ThoughtStatus.PROCESSING, ThoughtStatus.PENDING] for t in existing_thoughts):
586
+ logger.debug(
587
+ f"Skipping creation of new thought for step {step_type} (task_id={step_task.task_id}) because an active thought already exists."
588
+ )
589
+ continue
590
+ thought, processing_context = self._create_step_thought(step_task, round_number)
591
+ if non_blocking:
592
+ continue
593
+ result = await self._process_step_thought(thought, processing_context)
594
+ if not result:
595
+ logger.error(f"Wakeup step {step_type} failed: no result")
596
+ self._mark_task_failed(step_task.task_id, "No result from processing", step_task.agent_occurrence_id)
597
+ return False
598
+ selected_action = None
599
+ if hasattr(result, "selected_action"):
600
+ selected_action = result.selected_action
601
+ elif hasattr(result, "final_action") and hasattr(result.final_action, "selected_action"):
602
+ selected_action = result.final_action.selected_action
603
+ result = result.final_action
604
+ else:
605
+ logger.error(
606
+ f"Wakeup step {step_type} failed: result object missing selected action attribute (result={result})"
607
+ )
608
+ self._mark_task_failed(
609
+ step_task.task_id, "Result object missing selected action attribute", step_task.agent_occurrence_id
610
+ )
611
+ return False
612
+
613
+ if selected_action in [HandlerActionType.SPEAK, HandlerActionType.PONDER]:
614
+ if selected_action == HandlerActionType.PONDER:
615
+ logger.debug(
616
+ f"Wakeup step {step_type} resulted in PONDER; waiting for task completion before continuing."
617
+ )
618
+ else:
619
+ dispatch_success = await self._dispatch_step_action(result, thought, step_task)
620
+ if not dispatch_success:
621
+ logger.error(f"Dispatch failed for step {step_type} (task_id={step_task.task_id})")
622
+ return False
623
+ completed = await self._wait_for_task_completion(step_task, step_type)
624
+ if not completed:
625
+ logger.error(f"Wakeup step {step_type} did not complete successfully (task_id={step_task.task_id})")
626
+ return False
627
+ logger.debug(f"Wakeup step {step_type} completed successfully")
628
+ self.metrics.items_processed += 1
629
+ else:
630
+ logger.error(f"Wakeup step {step_type} failed: expected SPEAK or PONDER, got {selected_action}")
631
+ self._mark_task_failed(
632
+ step_task.task_id,
633
+ f"Expected SPEAK or PONDER action, got {selected_action}",
634
+ step_task.agent_occurrence_id,
635
+ )
636
+ return False
637
+ return True
638
+
639
+ def _create_step_thought(self, step_task: Task, round_number: int) -> Tuple[Thought, Any]:
640
+ """Create a thought for a wakeup step with minimal context.
641
+
642
+ Processing context will be built later during thought processing to enable
643
+ concurrent processing.
644
+
645
+ Returns:
646
+ Tuple of (Thought, None) - processing context is None in non-blocking mode
647
+ """
648
+ # Create a new Thought object for this step
649
+ now_iso = self.time_service.now().isoformat()
650
+
651
+ # Create the simple ThoughtContext for the Thought model using task's channel_id
652
+ simple_context = ThoughtContext(
653
+ task_id=step_task.task_id,
654
+ channel_id=step_task.channel_id, # Use the channel from the task
655
+ round_number=round_number,
656
+ depth=0,
657
+ parent_thought_id=None,
658
+ correlation_id=step_task.context.correlation_id if step_task.context else str(uuid.uuid4()),
659
+ )
660
+
661
+ thought = Thought(
662
+ thought_id=generate_thought_id(thought_type=ThoughtType.STANDARD, task_id=step_task.task_id),
663
+ source_task_id=step_task.task_id,
664
+ content=step_task.description,
665
+ round_number=round_number,
666
+ status=ThoughtStatus.PENDING,
667
+ created_at=now_iso,
668
+ updated_at=now_iso,
669
+ context=simple_context, # Use simple context
670
+ thought_type=ThoughtType.STANDARD,
671
+ )
672
+
673
+ # In non-blocking mode, we don't build the processing context
674
+ # It will be built later during thought processing
675
+ processing_context = None
676
+
677
+ # Persist the new thought (with simple context)
678
+ persistence.add_thought(thought)
679
+ return thought, processing_context
680
+
681
+ async def _process_step_thought(self, thought: Thought, processing_context: Any = None) -> Any:
682
+ """Process a wakeup step thought."""
683
+ item = ProcessingQueueItem.from_thought(thought, initial_ctx=processing_context)
684
+ return await self.process_thought_item(item)
685
+
686
+ async def _dispatch_step_action(self, result: Any, thought: Thought, step_task: Task) -> bool:
687
+ """Dispatch the action for a wakeup step."""
688
+ step_type = step_task.task_id.split("_")[0] if "_" in step_task.task_id else "UNKNOWN"
689
+
690
+ # Use build_dispatch_context to create proper DispatchContext object
691
+ from ciris_engine.logic.utils.context_utils import build_dispatch_context
692
+
693
+ dispatch_context = build_dispatch_context(
694
+ thought=thought,
695
+ time_service=self.time_service,
696
+ task=step_task,
697
+ app_config=getattr(self, "app_config", None),
698
+ round_number=getattr(self, "round_number", 0),
699
+ extra_context={
700
+ "event_type": step_type,
701
+ "event_summary": step_task.description,
702
+ "handler_name": "WakeupProcessor",
703
+ },
704
+ action_type=result.selected_action if hasattr(result, "selected_action") else None,
705
+ )
706
+
707
+ return await self.dispatch_action(result, thought, dispatch_context.model_dump())
708
+
709
+ async def _wait_for_task_completion(
710
+ self, task: Task, step_type: str, max_wait: int = 60, poll_interval: float = 0.1
711
+ ) -> bool:
712
+ """Wait for a task to complete with timeout."""
713
+ waited = 0.0
714
+
715
+ while waited < max_wait:
716
+ await asyncio.sleep(poll_interval)
717
+ waited += poll_interval
718
+
719
+ current_status = persistence.get_task_by_id(task.task_id, task.agent_occurrence_id)
720
+ if not current_status:
721
+ logger.error(f"Task {task.task_id} disappeared while waiting")
722
+ return False
723
+
724
+ if current_status.status == TaskStatus.COMPLETED:
725
+ return True
726
+ elif current_status.status in [TaskStatus.FAILED, TaskStatus.DEFERRED]:
727
+ logger.error(f"Task {task.task_id} failed with status {current_status.status}")
728
+ return False
729
+
730
+ logger.debug(f"Waiting for task {task.task_id} completion... ({waited}s)")
731
+
732
+ logger.error(f"Task {task.task_id} timed out after {max_wait}s")
733
+ self._mark_task_failed(task.task_id, "Timeout waiting for completion", task.agent_occurrence_id)
734
+ return False
735
+
736
+ def _mark_task_failed(self, task_id: str, reason: str, occurrence_id: str = "default") -> None:
737
+ """Mark a task as failed."""
738
+ persistence.update_task_status(task_id, TaskStatus.FAILED, occurrence_id, self.time_service)
739
+ logger.error(f"Task {task_id} marked as FAILED: {reason}")
740
+
741
+ def _mark_root_task_complete(self) -> None:
742
+ """Mark the root wakeup task as complete."""
743
+ if self.wakeup_tasks:
744
+ root_task = self.wakeup_tasks[0]
745
+ occurrence_id = root_task.agent_occurrence_id
746
+ persistence.update_task_status(root_task.task_id, TaskStatus.COMPLETED, occurrence_id, self.time_service)
747
+ logger.info(f"Marked shared wakeup task {root_task.task_id} as COMPLETED")
748
+
749
+ def _mark_root_task_failed(self) -> None:
750
+ """Mark the root wakeup task as failed."""
751
+ if self.wakeup_tasks:
752
+ root_task = self.wakeup_tasks[0]
753
+ occurrence_id = root_task.agent_occurrence_id
754
+ persistence.update_task_status(root_task.task_id, TaskStatus.FAILED, occurrence_id, self.time_service)
755
+ logger.error(f"Marked shared wakeup task {root_task.task_id} as FAILED")
756
+
757
+ def is_wakeup_complete(self) -> bool:
758
+ """Check if wakeup sequence is complete."""
759
+ return self.wakeup_complete
760
+
761
+ async def start_processing(self, num_rounds: Optional[int] = None) -> None:
762
+ """Start the wakeup processing loop."""
763
+ round_num = 0
764
+ while not self.wakeup_complete and (num_rounds is None or round_num < num_rounds):
765
+ await self.process(round_num)
766
+ round_num += 1
767
+ # Use shorter delay for testing if not complete
768
+ if not self.wakeup_complete:
769
+ await asyncio.sleep(0.1) # Brief pause between rounds
770
+
771
+ def stop_processing(self) -> None:
772
+ """Stop wakeup processing and clean up resources."""
773
+ self.wakeup_complete = True
774
+ logger.info("Wakeup processor stopped")
775
+
776
+ def get_status(self) -> JSONDict:
777
+ """Get current wakeup processor status and metrics."""
778
+ wakeup_sequence = self._get_wakeup_sequence()
779
+ total_steps = len(wakeup_sequence)
780
+ completed_steps = 0
781
+
782
+ if self.wakeup_tasks:
783
+ for task in self.wakeup_tasks[1:]: # Skip root task
784
+ status = persistence.get_task_by_id(task.task_id, task.agent_occurrence_id)
785
+ if status and status.status == TaskStatus.COMPLETED:
786
+ completed_steps += 1
787
+
788
+ progress = {
789
+ "complete": self.wakeup_complete,
790
+ "total_steps": total_steps,
791
+ "completed_steps": completed_steps,
792
+ "progress_percent": (completed_steps / total_steps * 100) if total_steps > 0 else 0,
793
+ }
794
+
795
+ return {
796
+ "processor_type": "wakeup",
797
+ "wakeup_complete": self.wakeup_complete,
798
+ "supported_states": [state.value for state in self.get_supported_states()],
799
+ "progress": progress,
800
+ "metrics": getattr(self, "metrics", {}),
801
+ "total_tasks": len(self.wakeup_tasks) if self.wakeup_tasks else 0,
802
+ }