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,881 @@
1
+ import json
2
+ import logging
3
+ from datetime import datetime, timedelta, timezone
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
5
+
6
+ from ciris_engine.constants import UTC_TIMEZONE_SUFFIX
7
+ from ciris_engine.logic.persistence.db import get_db_connection
8
+ from ciris_engine.logic.persistence.db.dialect import get_adapter
9
+ from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
10
+ from ciris_engine.schemas.persistence.core import CorrelationUpdateRequest, MetricsQuery
11
+ from ciris_engine.schemas.persistence.correlations import ChannelInfo
12
+ from ciris_engine.schemas.telemetry.core import CorrelationType, ServiceCorrelation, ServiceCorrelationStatus
13
+ from ciris_engine.schemas.types import JSONDict
14
+
15
+ if TYPE_CHECKING:
16
+ from ciris_engine.logic.services.graph.telemetry_service import GraphTelemetryService
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ # JSON path constants for database queries
21
+ JSON_PATH_CHANNEL_ID = "$.channel_id"
22
+
23
+
24
+ def _parse_response_data(
25
+ response_data_json: Optional[JSONDict], timestamp: Optional[datetime] = None
26
+ ) -> Optional[JSONDict]:
27
+ """Parse response data JSON with backward compatibility for missing fields."""
28
+ if not response_data_json:
29
+ return None
30
+
31
+ # Ensure response_timestamp exists for backward compatibility
32
+ if isinstance(response_data_json, dict) and "response_timestamp" not in response_data_json:
33
+ # Use the correlation timestamp or current time as fallback
34
+ response_data_json["response_timestamp"] = (timestamp or datetime.now(timezone.utc)).isoformat()
35
+
36
+ # Note: We keep returning Dict for backward compatibility with database storage
37
+ # The typed schemas are used at the API boundaries
38
+ return response_data_json
39
+
40
+
41
+ def add_correlation(
42
+ corr: ServiceCorrelation, time_service: Optional[TimeServiceProtocol] = None, db_path: Optional[str] = None
43
+ ) -> str:
44
+ sql = """
45
+ INSERT INTO service_correlations (
46
+ correlation_id, service_type, handler_name, action_type,
47
+ request_data, response_data, status, created_at, updated_at,
48
+ correlation_type, timestamp, metric_name, metric_value, log_level,
49
+ trace_id, span_id, parent_span_id, tags, retention_policy
50
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
51
+ """
52
+ # Convert timestamp to ISO string
53
+ timestamp_str = corr.timestamp.isoformat()
54
+
55
+ params = (
56
+ corr.correlation_id,
57
+ corr.service_type,
58
+ corr.handler_name,
59
+ corr.action_type,
60
+ (
61
+ corr.request_data.model_dump_json()
62
+ if corr.request_data and hasattr(corr.request_data, "model_dump_json")
63
+ else json.dumps(corr.request_data) if corr.request_data else None
64
+ ),
65
+ (
66
+ corr.response_data.model_dump_json()
67
+ if corr.response_data and hasattr(corr.response_data, "model_dump_json")
68
+ else json.dumps(corr.response_data) if corr.response_data else None
69
+ ),
70
+ corr.status.value,
71
+ (
72
+ corr.created_at.isoformat()
73
+ if isinstance(corr.created_at, datetime)
74
+ else (
75
+ str(corr.created_at)
76
+ if corr.created_at
77
+ else (time_service.now().isoformat() if time_service else datetime.now(timezone.utc).isoformat())
78
+ )
79
+ ),
80
+ (
81
+ corr.updated_at.isoformat()
82
+ if isinstance(corr.updated_at, datetime)
83
+ else (
84
+ str(corr.updated_at)
85
+ if corr.updated_at
86
+ else (time_service.now().isoformat() if time_service else datetime.now(timezone.utc).isoformat())
87
+ )
88
+ ),
89
+ corr.correlation_type.value,
90
+ timestamp_str,
91
+ corr.metric_data.metric_name if corr.metric_data else None,
92
+ corr.metric_data.metric_value if corr.metric_data else None,
93
+ corr.log_data.log_level if corr.log_data else None,
94
+ corr.trace_context.trace_id if corr.trace_context else None,
95
+ corr.trace_context.span_id if corr.trace_context else None,
96
+ corr.trace_context.parent_span_id if corr.trace_context else None,
97
+ json.dumps(corr.tags) if corr.tags else None,
98
+ corr.retention_policy,
99
+ )
100
+ try:
101
+ with get_db_connection(db_path=db_path) as conn:
102
+ conn.execute(sql, params)
103
+ conn.commit()
104
+ logger.debug("Inserted correlation %s", corr.correlation_id)
105
+ return corr.correlation_id
106
+ except Exception as e:
107
+ logger.exception("Failed to add correlation %s: %s", corr.correlation_id, e)
108
+ raise
109
+
110
+
111
+ def update_correlation(
112
+ update_request_or_id: Union[CorrelationUpdateRequest, str],
113
+ correlation_or_time_service: Union[ServiceCorrelation, TimeServiceProtocol],
114
+ time_service: Optional[TimeServiceProtocol] = None,
115
+ db_path: Optional[str] = None,
116
+ ) -> bool:
117
+ """Update correlation - handles both old and new signatures for compatibility."""
118
+ # Handle old signature: update_correlation(correlation_id, correlation, time_service)
119
+ if isinstance(update_request_or_id, str) and isinstance(correlation_or_time_service, ServiceCorrelation):
120
+ # Convert old signature to new
121
+ correlation = correlation_or_time_service
122
+ actual_time_service = time_service
123
+ if not actual_time_service:
124
+ raise ValueError("time_service required for old signature")
125
+
126
+ # Build update request from correlation object
127
+ update_request = CorrelationUpdateRequest(
128
+ correlation_id=update_request_or_id,
129
+ response_data=(
130
+ {
131
+ "success": str(getattr(correlation.response_data, "success", False)).lower(),
132
+ "error_message": str(getattr(correlation.response_data, "error_message", "")),
133
+ "execution_time_ms": str(getattr(correlation.response_data, "execution_time_ms", 0)),
134
+ "response_timestamp": str(
135
+ getattr(correlation.response_data, "response_timestamp", actual_time_service.now()).isoformat()
136
+ ),
137
+ }
138
+ if correlation.response_data
139
+ else None
140
+ ),
141
+ status=(
142
+ ServiceCorrelationStatus.COMPLETED
143
+ if correlation.response_data and getattr(correlation.response_data, "success", False)
144
+ else ServiceCorrelationStatus.FAILED
145
+ ),
146
+ )
147
+ # db_path is already set from parameter
148
+ # Handle new signature: update_correlation(update_request, time_service)
149
+ elif isinstance(update_request_or_id, CorrelationUpdateRequest):
150
+ update_request = update_request_or_id
151
+ actual_time_service = correlation_or_time_service # type: ignore[assignment]
152
+ if not hasattr(actual_time_service, "now"):
153
+ raise ValueError("time_service must have 'now' method for new signature")
154
+ else:
155
+ raise ValueError("Invalid arguments to update_correlation")
156
+
157
+ # Call the implementation
158
+ return _update_correlation_impl(update_request, actual_time_service, db_path) # type: ignore[arg-type]
159
+
160
+
161
+ def _update_correlation_impl(
162
+ update_request: CorrelationUpdateRequest, time_service: TimeServiceProtocol, db_path: Optional[str] = None
163
+ ) -> bool:
164
+ updates: List[Any] = []
165
+ params: List[Any] = []
166
+ if update_request.response_data is not None:
167
+ updates.append("response_data = ?")
168
+ params.append(json.dumps(update_request.response_data))
169
+ if update_request.status is not None:
170
+ updates.append("status = ?")
171
+ params.append(update_request.status.value)
172
+ if update_request.metric_value is not None:
173
+ updates.append("metric_value = ?")
174
+ params.append(update_request.metric_value)
175
+ if update_request.tags is not None:
176
+ updates.append("tags = ?")
177
+ params.append(json.dumps(update_request.tags))
178
+ updates.append("updated_at = ?")
179
+ params.append(time_service.now().isoformat())
180
+ params.append(update_request.correlation_id)
181
+
182
+ sql = f"UPDATE service_correlations SET {', '.join(updates)} WHERE correlation_id = ?" # nosec B608 - updates are hardcoded strings like 'status = ?'
183
+ try:
184
+ with get_db_connection(db_path=db_path) as conn:
185
+ cursor = conn.execute(sql, params)
186
+ conn.commit()
187
+ return cursor.rowcount > 0
188
+ except Exception as e:
189
+ logger.exception("Failed to update correlation %s: %s", update_request.correlation_id, e)
190
+ return False
191
+
192
+
193
+ def get_correlation(correlation_id: str, db_path: Optional[str] = None) -> Optional[ServiceCorrelation]:
194
+ sql = "SELECT * FROM service_correlations WHERE correlation_id = ?"
195
+ try:
196
+ with get_db_connection(db_path=db_path) as conn:
197
+ cursor = conn.cursor()
198
+ cursor.execute(sql, (correlation_id,))
199
+ row = cursor.fetchone()
200
+ return _row_to_service_correlation(row) if row else None
201
+ except Exception as e:
202
+ logger.exception("Failed to fetch correlation %s: %s", correlation_id, e)
203
+ return None
204
+
205
+
206
+ def get_correlations_by_task_and_action(
207
+ task_id: str, action_type: str, status: Optional[ServiceCorrelationStatus] = None, db_path: Optional[str] = None
208
+ ) -> List[ServiceCorrelation]:
209
+ """Get correlations for a specific task and action type."""
210
+ adapter = get_adapter()
211
+ sql = f"""
212
+ SELECT * FROM service_correlations
213
+ WHERE action_type = {adapter.placeholder()}
214
+ AND {adapter.json_extract('request_data', '$.task_id')} = {adapter.placeholder()}
215
+ """
216
+ params = [action_type, task_id]
217
+
218
+ if status is not None:
219
+ sql += f" AND status = {adapter.placeholder()}"
220
+ params.append(status.value)
221
+
222
+ sql += " ORDER BY created_at DESC"
223
+
224
+ try:
225
+ with get_db_connection(db_path=db_path) as conn:
226
+ cursor = conn.cursor()
227
+ cursor.execute(sql, params)
228
+ rows = cursor.fetchall()
229
+
230
+ return [_row_to_service_correlation(row) for row in rows]
231
+ except Exception as e:
232
+ logger.exception("Failed to fetch correlations for task %s and action %s: %s", task_id, action_type, e)
233
+ return []
234
+
235
+
236
+ def get_correlations_by_type_and_time(
237
+ correlation_type: CorrelationType,
238
+ start_time: Optional[str] = None,
239
+ end_time: Optional[str] = None,
240
+ metric_names: Optional[List[str]] = None,
241
+ log_levels: Optional[List[str]] = None,
242
+ limit: int = 1000,
243
+ db_path: Optional[str] = None,
244
+ ) -> List[ServiceCorrelation]:
245
+ """Get correlations by type with optional time filtering for TSDB queries."""
246
+ sql = "SELECT * FROM service_correlations WHERE correlation_type = ?"
247
+ if hasattr(correlation_type, "value"):
248
+ params: List[Any] = [correlation_type.value]
249
+ else:
250
+ params = [str(correlation_type)]
251
+
252
+ if start_time:
253
+ sql += " AND timestamp >= ?"
254
+ params.append(start_time)
255
+
256
+ if end_time:
257
+ sql += " AND timestamp <= ?"
258
+ params.append(end_time)
259
+
260
+ if metric_names:
261
+ placeholders = ",".join("?" * len(metric_names))
262
+ sql += f" AND metric_name IN ({placeholders})" # nosec B608 - placeholders are '?' strings, not user input
263
+ params.extend(metric_names)
264
+
265
+ if log_levels:
266
+ placeholders = ",".join("?" * len(log_levels))
267
+ sql += f" AND log_level IN ({placeholders})" # nosec B608 - placeholders are '?' strings, not user input
268
+ params.extend(log_levels)
269
+
270
+ sql += " ORDER BY timestamp DESC LIMIT ?"
271
+ params.append(limit)
272
+
273
+ try:
274
+ with get_db_connection(db_path=db_path) as conn:
275
+ cursor = conn.cursor()
276
+ cursor.execute(sql, params)
277
+ rows = cursor.fetchall()
278
+
279
+ return [_row_to_service_correlation(row) for row in rows]
280
+ except Exception as e:
281
+ logger.exception("Failed to fetch correlations by type %s: %s", correlation_type, e)
282
+ return []
283
+
284
+
285
+ def get_correlations_by_channel(
286
+ channel_id: str, limit: int = 50, before: Optional[datetime] = None, db_path: Optional[str] = None
287
+ ) -> List[ServiceCorrelation]:
288
+ """Get correlations for a specific channel (for message history)."""
289
+ adapter = get_adapter()
290
+ ph = adapter.placeholder()
291
+ json_channel_id = adapter.json_extract("request_data", JSON_PATH_CHANNEL_ID)
292
+
293
+ sql = f"""
294
+ SELECT * FROM service_correlations
295
+ WHERE (
296
+ (action_type = 'speak' AND {json_channel_id} = {ph}) OR
297
+ (action_type = 'observe' AND {json_channel_id} = {ph})
298
+ )
299
+ """
300
+ params: List[Any] = [channel_id, channel_id]
301
+
302
+ if before:
303
+ sql += f" AND timestamp < {ph}"
304
+ before_str = before.isoformat() if hasattr(before, "isoformat") else str(before)
305
+ params.append(before_str)
306
+
307
+ sql += f" ORDER BY timestamp DESC LIMIT {ph}"
308
+ params.append(limit)
309
+
310
+ try:
311
+ with get_db_connection(db_path=db_path) as conn:
312
+ cursor = conn.cursor()
313
+ cursor.execute(sql, params)
314
+ rows = cursor.fetchall()
315
+
316
+ correlations = [_row_to_service_correlation(row) for row in rows]
317
+ # Reverse to get chronological order (oldest first)
318
+ correlations.reverse()
319
+ return correlations
320
+ except Exception as e:
321
+ logger.exception("Failed to fetch correlations for channel %s: %s", channel_id, e)
322
+ return []
323
+
324
+
325
+ def get_metrics_timeseries(query: MetricsQuery, db_path: Optional[str] = None) -> List[ServiceCorrelation]:
326
+ """Get metric correlations as time series data."""
327
+ adapter = get_adapter()
328
+ ph = adapter.placeholder()
329
+
330
+ sql = f"""
331
+ SELECT * FROM service_correlations
332
+ WHERE correlation_type = 'metric_datapoint'
333
+ AND metric_name = {ph}
334
+ """
335
+ params: List[Any] = [query.metric_name]
336
+
337
+ if query.start_time:
338
+ sql += f" AND timestamp >= {ph}"
339
+ params.append(query.start_time.isoformat() if hasattr(query.start_time, "isoformat") else query.start_time)
340
+
341
+ if query.end_time:
342
+ sql += f" AND timestamp <= {ph}"
343
+ params.append(query.end_time.isoformat() if hasattr(query.end_time, "isoformat") else query.end_time)
344
+
345
+ if query.tags:
346
+ for key, value in query.tags.items():
347
+ sql += f" AND {adapter.json_extract('tags', f'$.{key}')} = {ph}"
348
+ params.append(value)
349
+
350
+ # Default limit to 1000 if not specified
351
+ limit = 1000 if not hasattr(query, "limit") else getattr(query, "limit", 1000)
352
+ sql += f" ORDER BY timestamp ASC LIMIT {ph}"
353
+ params.append(limit)
354
+
355
+ try:
356
+ with get_db_connection(db_path=db_path) as conn:
357
+ cursor = conn.cursor()
358
+ cursor.execute(sql, params)
359
+ rows = cursor.fetchall()
360
+
361
+ correlations = []
362
+ for row in rows:
363
+ timestamp = None
364
+ if row["timestamp"]:
365
+ try:
366
+ # Handle both 'Z' and '+00:00' formats
367
+ timestamp_str = row["timestamp"]
368
+ if timestamp_str.endswith("Z"):
369
+ timestamp_str = timestamp_str[:-1] + UTC_TIMEZONE_SUFFIX
370
+ timestamp = datetime.fromisoformat(timestamp_str)
371
+ except (ValueError, AttributeError):
372
+ timestamp = None
373
+
374
+ # Import required types
375
+ from ciris_engine.schemas.telemetry.core import LogData, MetricData, TraceContext
376
+
377
+ # Build metric_data if this is a metric correlation
378
+ metric_data = None
379
+ if row["metric_name"] and row["metric_value"] is not None:
380
+ metric_data = MetricData(
381
+ metric_name=row["metric_name"],
382
+ metric_value=row["metric_value"],
383
+ metric_unit="count",
384
+ metric_type="gauge",
385
+ labels={},
386
+ )
387
+
388
+ # Build log_data if this is a log correlation
389
+ log_data = None
390
+ if row["log_level"]:
391
+ log_data = LogData(
392
+ log_level=row["log_level"],
393
+ log_message="", # Not stored in DB
394
+ logger_name="",
395
+ module_name="",
396
+ function_name="",
397
+ line_number=0,
398
+ )
399
+
400
+ # Build trace_context if this is a trace correlation
401
+ trace_context = None
402
+ if row["trace_id"]:
403
+ trace_context = TraceContext(trace_id=row["trace_id"], span_id=row["span_id"] or "", span_name="")
404
+ if row["parent_span_id"]:
405
+ trace_context.parent_span_id = row["parent_span_id"]
406
+
407
+ # Map 'success' to 'completed' for backwards compatibility
408
+ status_value = row["status"]
409
+ if status_value == "success":
410
+ status_value = "completed"
411
+
412
+ correlations.append(
413
+ ServiceCorrelation(
414
+ correlation_id=row["correlation_id"],
415
+ service_type=row["service_type"],
416
+ handler_name=row["handler_name"],
417
+ action_type=row["action_type"],
418
+ request_data=json.loads(row["request_data"]) if row["request_data"] else None,
419
+ response_data=_parse_response_data(
420
+ json.loads(row["response_data"]) if row["response_data"] else None, timestamp
421
+ ),
422
+ status=ServiceCorrelationStatus(status_value),
423
+ created_at=row["created_at"],
424
+ updated_at=row["updated_at"],
425
+ correlation_type=CorrelationType(row["correlation_type"] or "service_interaction"),
426
+ timestamp=timestamp,
427
+ metric_data=metric_data,
428
+ log_data=log_data,
429
+ trace_context=trace_context,
430
+ tags={k: str(v) for k, v in json.loads(row["tags"]).items()} if row["tags"] else {},
431
+ retention_policy=row["retention_policy"] or "raw",
432
+ )
433
+ )
434
+ return correlations
435
+ except Exception as e:
436
+ logger.exception("Failed to fetch metrics timeseries for %s: %s", query.metric_name, e)
437
+ return []
438
+
439
+
440
+ def get_active_channels_by_adapter(
441
+ adapter_type: str,
442
+ since_days: int = 30,
443
+ time_service: Optional[TimeServiceProtocol] = None,
444
+ db_path: Optional[str] = None,
445
+ ) -> List[ChannelInfo]:
446
+ """
447
+ Get active channels for a specific adapter type from correlations.
448
+
449
+ This function discovers channels organically from actual usage in both:
450
+ - Recent correlations (last since_days)
451
+ - Historical conversation summaries from TSDB consolidation
452
+
453
+ Args:
454
+ adapter_type: The adapter type (e.g., "discord", "api", "cli")
455
+ since_days: Number of days to look back (default 30)
456
+ time_service: Optional time service for testing
457
+ db_path: Optional database path
458
+
459
+ Returns:
460
+ List of ChannelInfo objects with channel details
461
+ """
462
+ # Calculate cutoff time
463
+ if time_service:
464
+ cutoff_time = time_service.now() - timedelta(days=since_days)
465
+ else:
466
+ cutoff_time = datetime.now(timezone.utc) - timedelta(days=since_days)
467
+
468
+ channels: Dict[str, ChannelInfo] = {}
469
+
470
+ # Query recent correlations for speak/observe actions
471
+ adapter = get_adapter()
472
+ ph = adapter.placeholder()
473
+ json_channel_id = adapter.json_extract("request_data", JSON_PATH_CHANNEL_ID)
474
+
475
+ sql = f"""
476
+ SELECT
477
+ {json_channel_id} as channel_id,
478
+ MAX(timestamp) as last_activity,
479
+ COUNT(*) as message_count
480
+ FROM service_correlations
481
+ WHERE action_type IN ('speak', 'observe')
482
+ AND timestamp >= {ph}
483
+ AND {json_channel_id} IS NOT NULL
484
+ AND {json_channel_id} LIKE {ph}
485
+ GROUP BY channel_id
486
+ """
487
+
488
+ # Build adapter pattern (e.g., "api_%" for API channels)
489
+ adapter_pattern = f"{adapter_type}_%"
490
+
491
+ try:
492
+ with get_db_connection(db_path=db_path) as conn:
493
+ cursor = conn.cursor()
494
+ cursor.execute(sql, (cutoff_time.isoformat(), adapter_pattern))
495
+ rows = cursor.fetchall()
496
+
497
+ for row in rows:
498
+ channel_id = row[0]
499
+ if channel_id:
500
+ # Parse timestamp
501
+ last_activity = None
502
+ if row[1]:
503
+ try:
504
+ timestamp_str = row[1]
505
+ if timestamp_str.endswith("Z"):
506
+ timestamp_str = timestamp_str[:-1] + UTC_TIMEZONE_SUFFIX
507
+ last_activity = datetime.fromisoformat(timestamp_str)
508
+ except (ValueError, AttributeError):
509
+ last_activity = cutoff_time
510
+
511
+ channels[channel_id] = ChannelInfo(
512
+ channel_id=channel_id,
513
+ channel_type=adapter_type,
514
+ last_activity=last_activity or cutoff_time,
515
+ message_count=row[2] or 0,
516
+ is_active=True,
517
+ )
518
+ except Exception as e:
519
+ logger.warning("Failed to query recent correlations: %s", e)
520
+
521
+ # Also check conversation summaries from TSDB consolidation
522
+ # These provide historical channel activity beyond the correlation retention window
523
+ try:
524
+ # Query memory graph for ConversationSummaryNodes
525
+ json_period_start = adapter.json_extract("node_data", "$.period_start")
526
+ sql_summaries = f"""
527
+ SELECT
528
+ node_data
529
+ FROM graph_nodes
530
+ WHERE node_type = 'ConversationSummaryNode'
531
+ AND {json_period_start} >= {ph}
532
+ ORDER BY {json_period_start} DESC
533
+ """
534
+
535
+ with get_db_connection(db_path=db_path) as conn:
536
+ cursor = conn.cursor()
537
+ cursor.execute(sql_summaries, (cutoff_time.isoformat(),))
538
+ rows = cursor.fetchall()
539
+
540
+ for row in rows:
541
+ if row[0]:
542
+ try:
543
+ node_data = json.loads(row[0])
544
+ conversations_by_channel = node_data.get("conversations_by_channel", {})
545
+
546
+ # Extract channels matching our adapter type
547
+ for channel_id, conversations in conversations_by_channel.items():
548
+ if channel_id.startswith(f"{adapter_type}_"):
549
+ # Update channel info if not already present or if this is more recent
550
+ if channel_id not in channels:
551
+ channels[channel_id] = ChannelInfo(
552
+ channel_id=channel_id,
553
+ channel_type=adapter_type,
554
+ last_activity=datetime.fromisoformat(
555
+ node_data.get("period_end", cutoff_time.isoformat())
556
+ ),
557
+ message_count=len(conversations),
558
+ is_active=True,
559
+ )
560
+ else:
561
+ # Update message count
562
+ channels[channel_id].message_count += len(conversations)
563
+ except Exception as e:
564
+ logger.debug("Failed to parse conversation summary: %s", e)
565
+ except Exception as e:
566
+ logger.debug("Memory graph query failed (expected if not using memory service): %s", e)
567
+
568
+ # Convert to list and sort by last activity
569
+ channel_list = list(channels.values())
570
+ channel_list.sort(key=lambda x: x.last_activity, reverse=True)
571
+
572
+ return channel_list
573
+
574
+
575
+ def get_channel_last_activity(
576
+ channel_id: str, time_service: Optional[TimeServiceProtocol] = None, db_path: Optional[str] = None
577
+ ) -> Optional[datetime]:
578
+ """
579
+ Get the last activity timestamp for a specific channel.
580
+
581
+ Checks both recent correlations and TSDB conversation summaries.
582
+
583
+ Args:
584
+ channel_id: The channel ID to check
585
+ time_service: Optional time service
586
+ db_path: Optional database path
587
+
588
+ Returns:
589
+ Last activity datetime or None if no activity found
590
+ """
591
+ last_activity = None
592
+
593
+ # Check recent correlations
594
+ adapter = get_adapter()
595
+ ph = adapter.placeholder()
596
+ json_channel_id = adapter.json_extract("request_data", JSON_PATH_CHANNEL_ID)
597
+
598
+ sql = f"""
599
+ SELECT MAX(timestamp) as last_activity
600
+ FROM service_correlations
601
+ WHERE action_type IN ('speak', 'observe')
602
+ AND {json_channel_id} = {ph}
603
+ """
604
+
605
+ try:
606
+ with get_db_connection(db_path=db_path) as conn:
607
+ cursor = conn.cursor()
608
+ cursor.execute(sql, (channel_id,))
609
+ row = cursor.fetchone()
610
+
611
+ if row and row[0]:
612
+ try:
613
+ timestamp_str = row[0]
614
+ if timestamp_str.endswith("Z"):
615
+ timestamp_str = timestamp_str[:-1] + UTC_TIMEZONE_SUFFIX
616
+ last_activity = datetime.fromisoformat(timestamp_str)
617
+ except (ValueError, AttributeError):
618
+ pass
619
+ except Exception as e:
620
+ logger.warning("Failed to query channel activity: %s", e)
621
+
622
+ # Also check conversation summaries for historical activity
623
+ try:
624
+ json_period_end = adapter.json_extract("node_data", "$.period_end")
625
+ json_conversations = adapter.json_extract("node_data", "$.conversations_by_channel")
626
+
627
+ sql_summaries = f"""
628
+ SELECT
629
+ {json_period_end} as period_end
630
+ FROM graph_nodes
631
+ WHERE node_type = 'ConversationSummaryNode'
632
+ AND {json_conversations} LIKE {ph}
633
+ ORDER BY {json_period_end} DESC
634
+ LIMIT 1
635
+ """
636
+
637
+ # Use LIKE pattern to find channels in the JSON
638
+ pattern = f'%"{channel_id}":%'
639
+
640
+ with get_db_connection(db_path=db_path) as conn:
641
+ cursor = conn.cursor()
642
+ cursor.execute(sql_summaries, (pattern,))
643
+ row = cursor.fetchone()
644
+
645
+ if row and row[0]:
646
+ try:
647
+ summary_time = datetime.fromisoformat(row[0])
648
+ if not last_activity or summary_time > last_activity:
649
+ last_activity = summary_time
650
+ except (ValueError, AttributeError):
651
+ pass
652
+ except Exception as e:
653
+ logger.debug("Memory graph query failed: %s", e)
654
+
655
+ return last_activity
656
+
657
+
658
+ def _row_to_service_correlation(row: Any) -> ServiceCorrelation:
659
+ """
660
+ Convert a database row to a ServiceCorrelation object.
661
+
662
+ Centralizes the row parsing logic to eliminate code duplication.
663
+
664
+ Args:
665
+ row: Database row with correlation data
666
+
667
+ Returns:
668
+ ServiceCorrelation object
669
+ """
670
+ # Parse timestamp if present - handle both PostgreSQL (datetime) and SQLite (string)
671
+ timestamp = None
672
+ if row["timestamp"]:
673
+ try:
674
+ timestamp_value = row["timestamp"]
675
+ # PostgreSQL returns datetime objects directly
676
+ if isinstance(timestamp_value, datetime):
677
+ timestamp = timestamp_value
678
+ # SQLite returns strings - parse them
679
+ elif isinstance(timestamp_value, str):
680
+ # Handle both 'Z' and '+00:00' formats
681
+ if timestamp_value.endswith("Z"):
682
+ timestamp_value = timestamp_value[:-1] + UTC_TIMEZONE_SUFFIX
683
+ timestamp = datetime.fromisoformat(timestamp_value)
684
+ except (ValueError, AttributeError, TypeError):
685
+ timestamp = None
686
+
687
+ # Parse request_data - handle PostgreSQL JSONB vs SQLite TEXT
688
+ request_data_raw = row["request_data"]
689
+ if request_data_raw:
690
+ request_data_json = request_data_raw if isinstance(request_data_raw, dict) else json.loads(request_data_raw)
691
+ else:
692
+ request_data_json = {}
693
+
694
+ # Parse response_data - handle PostgreSQL JSONB vs SQLite TEXT
695
+ response_data_raw = row["response_data"]
696
+ if response_data_raw:
697
+ response_data_parsed = (
698
+ response_data_raw if isinstance(response_data_raw, dict) else json.loads(response_data_raw)
699
+ )
700
+ else:
701
+ response_data_parsed = None
702
+
703
+ # Parse tags - handle PostgreSQL JSONB vs SQLite TEXT
704
+ tags_raw = row["tags"]
705
+ if tags_raw:
706
+ tags_parsed = tags_raw if isinstance(tags_raw, dict) else json.loads(tags_raw)
707
+ else:
708
+ tags_parsed = {}
709
+
710
+ # Map 'success' to 'completed' for backwards compatibility
711
+ status_value = row["status"]
712
+ if status_value == "success":
713
+ status_value = "completed"
714
+
715
+ # Build the correlation without None values for optional fields
716
+ correlation_data = {
717
+ "correlation_id": row["correlation_id"],
718
+ "service_type": row["service_type"],
719
+ "handler_name": row["handler_name"],
720
+ "action_type": row["action_type"],
721
+ "request_data": request_data_json if request_data_json else None,
722
+ "response_data": _parse_response_data(response_data_parsed, timestamp),
723
+ "status": ServiceCorrelationStatus(status_value),
724
+ "created_at": row["created_at"],
725
+ "updated_at": row["updated_at"],
726
+ "correlation_type": CorrelationType(row["correlation_type"] or "service_interaction"),
727
+ "timestamp": timestamp or datetime.now(timezone.utc),
728
+ "tags": tags_parsed,
729
+ "retention_policy": row["retention_policy"] or "raw",
730
+ }
731
+
732
+ # Only add optional TSDB fields if they have values
733
+ if row["metric_name"] and row["metric_value"] is not None:
734
+ from ciris_engine.schemas.telemetry.core import MetricData
735
+
736
+ correlation_data["metric_data"] = MetricData(
737
+ metric_name=row["metric_name"],
738
+ metric_value=row["metric_value"],
739
+ metric_unit="count",
740
+ metric_type="gauge",
741
+ labels={},
742
+ )
743
+
744
+ if row["log_level"]:
745
+ from ciris_engine.schemas.telemetry.core import LogData
746
+
747
+ correlation_data["log_data"] = LogData(
748
+ log_level=row["log_level"],
749
+ log_message="",
750
+ logger_name="",
751
+ module_name="",
752
+ function_name="",
753
+ line_number=0,
754
+ )
755
+
756
+ if row["trace_id"]:
757
+ from ciris_engine.schemas.telemetry.core import TraceContext
758
+
759
+ trace_context = TraceContext(trace_id=row["trace_id"], span_id=row["span_id"] or "", span_name="")
760
+ if row["parent_span_id"]:
761
+ trace_context.parent_span_id = row["parent_span_id"]
762
+ correlation_data["trace_context"] = trace_context
763
+
764
+ return ServiceCorrelation(**correlation_data)
765
+
766
+
767
+ def is_admin_channel(channel_id: str, db_path: Optional[str] = None) -> bool:
768
+ """
769
+ Determine if a channel belongs to an admin user.
770
+
771
+ For API channels, checks if the channel has been used with admin credentials.
772
+ This is done by looking for correlations with admin role in the tags.
773
+
774
+ Args:
775
+ channel_id: The channel ID to check
776
+ db_path: Optional database path
777
+
778
+ Returns:
779
+ True if the channel is associated with admin usage
780
+ """
781
+ # Only API channels can be admin channels
782
+ if not channel_id.startswith("api_"):
783
+ return False
784
+
785
+ # Check for admin role in correlation tags
786
+ adapter = get_adapter()
787
+ ph = adapter.placeholder()
788
+ json_channel_id = adapter.json_extract("request_data", JSON_PATH_CHANNEL_ID)
789
+ json_user_role = adapter.json_extract("tags", "$.user_role")
790
+ json_is_admin = adapter.json_extract("tags", "$.is_admin")
791
+ json_auth_role = adapter.json_extract("tags", "$.auth.role")
792
+
793
+ sql = f"""
794
+ SELECT COUNT(*) as admin_count
795
+ FROM service_correlations
796
+ WHERE {json_channel_id} = {ph}
797
+ AND (
798
+ {json_user_role} IN ('ADMIN', 'AUTHORITY', 'SYSTEM_ADMIN')
799
+ OR {json_is_admin} = 1
800
+ OR {json_auth_role} IN ('ADMIN', 'AUTHORITY', 'SYSTEM_ADMIN')
801
+ )
802
+ LIMIT 1
803
+ """
804
+
805
+ try:
806
+ with get_db_connection(db_path=db_path) as conn:
807
+ cursor = conn.cursor()
808
+ cursor.execute(sql, (channel_id,))
809
+ row = cursor.fetchone()
810
+
811
+ if row and row[0] > 0:
812
+ return True
813
+ except Exception as e:
814
+ logger.warning("Failed to check admin status for channel %s: %s", channel_id, e)
815
+
816
+ return False
817
+
818
+
819
+ def get_recent_correlations(limit: int = 100, db_path: Optional[str] = None) -> List[ServiceCorrelation]:
820
+ """
821
+ Get recent correlations ordered by timestamp.
822
+
823
+ Args:
824
+ limit: Maximum number of correlations to return (default 100)
825
+ db_path: Optional database path
826
+
827
+ Returns:
828
+ List of recent ServiceCorrelation objects
829
+ """
830
+ sql = """
831
+ SELECT * FROM service_correlations
832
+ ORDER BY timestamp DESC
833
+ LIMIT ?
834
+ """
835
+
836
+ try:
837
+ with get_db_connection(db_path=db_path) as conn:
838
+ cursor = conn.cursor()
839
+ cursor.execute(sql, (limit,))
840
+ rows = cursor.fetchall()
841
+
842
+ return [_row_to_service_correlation(row) for row in rows]
843
+ except Exception as e:
844
+ logger.exception("Failed to fetch recent correlations: %s", e)
845
+ return []
846
+
847
+
848
+ async def add_correlation_with_telemetry(
849
+ corr: ServiceCorrelation,
850
+ time_service: Optional[TimeServiceProtocol] = None,
851
+ telemetry_service: Optional["GraphTelemetryService"] = None,
852
+ db_path: Optional[str] = None,
853
+ ) -> str:
854
+ """
855
+ Add correlation to both persistence (SQLite) and telemetry service (memory graph).
856
+
857
+ This ensures distributed tracing works by storing correlations in the memory graph
858
+ for OTLP export while also persisting them to SQLite for durability.
859
+
860
+ Args:
861
+ corr: The ServiceCorrelation to store
862
+ time_service: Optional time service for timestamps
863
+ telemetry_service: Optional telemetry service for distributed tracing
864
+ db_path: Optional database path for SQLite storage
865
+
866
+ Returns:
867
+ The correlation ID
868
+ """
869
+ # Store in SQLite persistence
870
+ correlation_id = add_correlation(corr, time_service, db_path)
871
+
872
+ # Also store in telemetry service for distributed tracing if available
873
+ if telemetry_service and hasattr(telemetry_service, "_store_correlation"):
874
+ try:
875
+ await telemetry_service._store_correlation(corr)
876
+ logger.debug(f"Stored correlation {correlation_id} in telemetry service for tracing")
877
+ except Exception as e:
878
+ # Don't fail if telemetry storage fails - it's supplementary
879
+ logger.warning(f"Failed to store correlation in telemetry service: {e}")
880
+
881
+ return correlation_id