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,977 @@
1
+ """Multi-source DSAR orchestration service.
2
+
3
+ Coordinates DSAR requests across CIRIS + external data sources (SQL, REST, HL7).
4
+
5
+ Architecture:
6
+ - Fast path: DSARAutomationService (CIRIS only, ~500ms)
7
+ - Slow path: DSAROrchestrator (multi-source, ~3-10s)
8
+
9
+ For CIRIS-only DSAR, use DSARAutomationService in consent/.
10
+ For multi-source DSAR, use this orchestrator.
11
+ """
12
+
13
+ import logging
14
+ from datetime import datetime, timedelta
15
+ from typing import Any, Dict, List, Optional, cast
16
+
17
+ from fastapi import HTTPException, status
18
+
19
+ from ciris_engine.logic.buses.memory_bus import MemoryBus
20
+ from ciris_engine.logic.buses.tool_bus import ToolBus
21
+ from ciris_engine.logic.services.governance.consent import ConsentService
22
+ from ciris_engine.logic.services.governance.consent.dsar_automation import DSARAutomationService
23
+ from ciris_engine.protocols.services.graph.memory import MemoryServiceProtocol
24
+ from ciris_engine.protocols.services.lifecycle.time import TimeServiceProtocol
25
+ from ciris_engine.schemas.consent.core import (
26
+ ConsentCategory,
27
+ ConsentImpactReport,
28
+ ConsentStatus,
29
+ ConsentStream,
30
+ DSARExportFormat,
31
+ )
32
+
33
+ from .schemas import (
34
+ DataSourceDeletion,
35
+ DataSourceExport,
36
+ MultiSourceDSARAccessPackage,
37
+ MultiSourceDSARCorrectionResult,
38
+ MultiSourceDSARDeletionResult,
39
+ MultiSourceDSARExportPackage,
40
+ )
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+
45
+ class DSAROrchestrator:
46
+ """Orchestrates DSAR across CIRIS + external data sources.
47
+
48
+ Coordinates multi-source data subject access requests using:
49
+ - DSARAutomationService for CIRIS internal data
50
+ - ConsentService for initiating decay protocol
51
+ - ToolBus for discovering SQL/REST/HL7 connectors
52
+ - Identity resolution for mapping users across systems
53
+ """
54
+
55
+ def __init__(
56
+ self,
57
+ time_service: TimeServiceProtocol,
58
+ dsar_automation: DSARAutomationService,
59
+ consent_service: ConsentService,
60
+ tool_bus: ToolBus,
61
+ memory_bus: MemoryBus,
62
+ ):
63
+ """Initialize DSAR orchestrator.
64
+
65
+ Args:
66
+ time_service: Time service for consistent timestamps
67
+ dsar_automation: CIRIS-only DSAR automation service
68
+ consent_service: Consent service for revoking consent and initiating decay
69
+ tool_bus: Tool bus for discovering external connectors
70
+ memory_bus: Memory bus for identity resolution
71
+ """
72
+ self._time_service = time_service
73
+ self._dsar_automation = dsar_automation
74
+ self._consent_service = consent_service
75
+ self._tool_bus = tool_bus
76
+ self._memory_bus = memory_bus
77
+
78
+ # Metrics
79
+ self._multi_source_requests = 0
80
+ self._total_sources_queried = 0
81
+ self._total_processing_time = 0.0
82
+
83
+ def _now(self) -> datetime:
84
+ """Get current time from time service."""
85
+ return self._time_service.now()
86
+
87
+ async def handle_access_request_multi_source(
88
+ self, user_identifier: str, request_id: Optional[str] = None
89
+ ) -> MultiSourceDSARAccessPackage:
90
+ """Handle GDPR Article 15 access request across all data sources.
91
+
92
+ Coordinates access request across:
93
+ 1. CIRIS internal data (via DSARAutomationService)
94
+ 2. SQL databases (via ToolBus)
95
+ 3. REST APIs (via ToolBus)
96
+ 4. HL7 systems (via ToolBus - future)
97
+
98
+ Args:
99
+ user_identifier: User identifier (email, user_id, etc.)
100
+ request_id: Optional request ID for tracking
101
+
102
+ Returns:
103
+ Aggregated access package from all sources
104
+
105
+ Implementation:
106
+ - Resolves user identity across systems
107
+ - Gets CIRIS internal data (fast path)
108
+ - Queries all SQL/REST connectors via ToolBus
109
+ - Aggregates results with performance tracking
110
+ """
111
+ import hashlib
112
+ import time
113
+
114
+ from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
115
+
116
+ # Start timer
117
+ start_time = time.time()
118
+
119
+ # Generate request ID if not provided
120
+ if not request_id:
121
+ request_id = f"DSAR-ACCESS-{self._now().strftime('%Y%m%d-%H%M%S')}"
122
+
123
+ logger.info(f"Starting multi-source access request {request_id} for {user_identifier}")
124
+
125
+ # Step 1: Resolve user identity across all systems
126
+ identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
127
+
128
+ # Step 2: Get CIRIS internal data (fast path)
129
+ try:
130
+ ciris_data = await self._dsar_automation.handle_access_request(user_identifier)
131
+ except Exception as e:
132
+ logger.exception(f"Failed to get CIRIS data for {user_identifier}: {e}")
133
+ # Create empty package as fallback
134
+ from ciris_engine.schemas.consent.core import ConsentAuditEntry, DSARAccessPackage
135
+
136
+ ciris_data = DSARAccessPackage(
137
+ user_id=user_identifier,
138
+ request_id=request_id,
139
+ generated_at=self._now(),
140
+ consent_status=ConsentStatus(
141
+ user_id=user_identifier,
142
+ stream=ConsentStream.TEMPORARY,
143
+ categories=[],
144
+ granted_at=self._now(),
145
+ last_modified=self._now(),
146
+ ),
147
+ consent_history=[],
148
+ interaction_summary={},
149
+ contribution_metrics=ConsentImpactReport(
150
+ user_id=user_identifier,
151
+ total_interactions=0,
152
+ patterns_contributed=0,
153
+ users_helped=0,
154
+ categories_active=[],
155
+ impact_score=0.0,
156
+ example_contributions=[],
157
+ ),
158
+ data_categories=[],
159
+ retention_periods={},
160
+ processing_purposes=[],
161
+ )
162
+
163
+ # Step 3: Discover and query SQL connectors
164
+ external_sources: List[DataSourceExport] = []
165
+ sql_connectors = await self._discover_sql_connectors()
166
+
167
+ for connector_id in sql_connectors:
168
+ try:
169
+ export = await self._export_from_sql(connector_id, user_identifier)
170
+ external_sources.append(export)
171
+ except Exception as e:
172
+ logger.error(f"Failed to export from SQL connector {connector_id}: {e}")
173
+ # Add error entry
174
+ external_sources.append(
175
+ DataSourceExport(
176
+ source_id=connector_id,
177
+ source_type="sql",
178
+ source_name=connector_id,
179
+ export_timestamp=self._now().isoformat(),
180
+ errors=[str(e)],
181
+ )
182
+ )
183
+
184
+ # Step 4: Discover and query REST connectors (future)
185
+ # TODO Phase 2: Implement REST connector discovery and export
186
+ # Implementation:
187
+ # 1. Call _discover_rest_connectors() to find REST API connectors
188
+ # 2. For each connector, call _export_from_rest(connector_id, user_identifier)
189
+ # 3. Aggregate REST exports into external_sources list
190
+ # 4. Handle errors gracefully (similar to SQL connector pattern above)
191
+
192
+ # Step 5: Calculate totals
193
+ total_records = sum(src.total_records for src in external_sources)
194
+ processing_time = time.time() - start_time
195
+
196
+ # Step 6: Update metrics
197
+ self._multi_source_requests += 1
198
+ self._total_sources_queried += 1 + len(external_sources) # CIRIS + external
199
+ self._total_processing_time += processing_time
200
+
201
+ # Step 7: Build aggregated package
202
+ package = MultiSourceDSARAccessPackage(
203
+ request_id=request_id,
204
+ user_identifier=user_identifier,
205
+ ciris_data=ciris_data,
206
+ external_sources=external_sources,
207
+ identity_node=identity_node,
208
+ total_sources=1 + len(external_sources),
209
+ total_records=total_records,
210
+ generated_at=self._now().isoformat(),
211
+ processing_time_seconds=processing_time,
212
+ )
213
+
214
+ logger.info(
215
+ f"Completed multi-source access request {request_id}: "
216
+ f"{package.total_sources} sources, {total_records} records, {processing_time:.2f}s"
217
+ )
218
+
219
+ return package
220
+
221
+ async def handle_export_request_multi_source(
222
+ self,
223
+ user_identifier: str,
224
+ export_format: DSARExportFormat,
225
+ request_id: Optional[str] = None,
226
+ ) -> MultiSourceDSARExportPackage:
227
+ """Handle GDPR Article 20 export request across all data sources.
228
+
229
+ Generates downloadable export aggregating data from all sources.
230
+
231
+ Args:
232
+ user_identifier: User identifier
233
+ export_format: Desired format (JSON, CSV, SQLite)
234
+ request_id: Optional request ID for tracking
235
+
236
+ Returns:
237
+ Aggregated export package from all sources
238
+
239
+ Implementation:
240
+ - Resolves user identity
241
+ - Gets CIRIS export in specified format
242
+ - Queries all SQL connectors for exports
243
+ - Aggregates data and calculates total size/checksum
244
+ """
245
+ import hashlib
246
+ import json
247
+ import time
248
+
249
+ from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
250
+
251
+ # Start timer
252
+ start_time = time.time()
253
+
254
+ # Generate request ID if not provided
255
+ if not request_id:
256
+ request_id = f"DSAR-EXPORT-{self._now().strftime('%Y%m%d-%H%M%S')}"
257
+
258
+ logger.info(
259
+ f"Starting multi-source export request {request_id} for {user_identifier} (format: {export_format})"
260
+ )
261
+
262
+ # Step 1: Resolve user identity
263
+ identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
264
+
265
+ # Step 2: Get CIRIS export
266
+ try:
267
+ ciris_export = await self._dsar_automation.handle_export_request(user_identifier, export_format)
268
+ except Exception as e:
269
+ logger.exception(f"Failed to get CIRIS export for {user_identifier}: {e}")
270
+ # Create empty export as fallback
271
+ from ciris_engine.schemas.consent.core import DSARExportPackage
272
+
273
+ ciris_export = DSARExportPackage(
274
+ user_id=user_identifier,
275
+ request_id=request_id,
276
+ export_format=export_format,
277
+ generated_at=self._now(),
278
+ file_path=None,
279
+ file_size_bytes=0,
280
+ record_counts={},
281
+ checksum="",
282
+ includes_readme=True,
283
+ )
284
+
285
+ # Step 3: Discover and export from SQL connectors
286
+ external_exports: List[DataSourceExport] = []
287
+ sql_connectors = await self._discover_sql_connectors()
288
+
289
+ for connector_id in sql_connectors:
290
+ try:
291
+ export = await self._export_from_sql(connector_id, user_identifier)
292
+ external_exports.append(export)
293
+ except Exception as e:
294
+ logger.error(f"Failed to export from SQL connector {connector_id}: {e}")
295
+ external_exports.append(
296
+ DataSourceExport(
297
+ source_id=connector_id,
298
+ source_type="sql",
299
+ source_name=connector_id,
300
+ export_timestamp=self._now().isoformat(),
301
+ errors=[str(e)],
302
+ )
303
+ )
304
+
305
+ # Step 4: Calculate total size
306
+ total_size_bytes = ciris_export.file_size_bytes + sum(
307
+ len(json.dumps(src.data).encode("utf-8")) for src in external_exports
308
+ )
309
+ total_records = sum(src.total_records for src in external_exports)
310
+
311
+ # Step 5: Calculate processing time
312
+ processing_time = time.time() - start_time
313
+
314
+ # Step 6: Update metrics
315
+ self._multi_source_requests += 1
316
+ self._total_sources_queried += 1 + len(external_exports)
317
+ self._total_processing_time += processing_time
318
+
319
+ # Step 7: Build export package
320
+ package = MultiSourceDSARExportPackage(
321
+ request_id=request_id,
322
+ user_identifier=user_identifier,
323
+ ciris_export=ciris_export,
324
+ external_exports=external_exports,
325
+ identity_node=identity_node,
326
+ total_sources=1 + len(external_exports),
327
+ total_records=total_records,
328
+ total_size_bytes=total_size_bytes,
329
+ export_format=export_format.value if hasattr(export_format, "value") else str(export_format),
330
+ generated_at=self._now().isoformat(),
331
+ processing_time_seconds=processing_time,
332
+ )
333
+
334
+ logger.info(
335
+ f"Completed multi-source export {request_id}: "
336
+ f"{package.total_sources} sources, {total_size_bytes} bytes, {processing_time:.2f}s"
337
+ )
338
+
339
+ return package
340
+
341
+ async def handle_deletion_request_multi_source(
342
+ self, user_identifier: str, request_id: Optional[str] = None
343
+ ) -> MultiSourceDSARDeletionResult:
344
+ """Handle GDPR Article 17 deletion request across all data sources.
345
+
346
+ Coordinates deletion across:
347
+ 1. CIRIS internal data (90-day decay protocol)
348
+ 2. SQL databases (immediate deletion with verification)
349
+ 3. REST APIs (API-based deletion)
350
+ 4. HL7 systems (medical data deletion - future)
351
+
352
+ Args:
353
+ user_identifier: User identifier
354
+ request_id: Optional request ID for tracking
355
+
356
+ Returns:
357
+ Aggregated deletion result from all sources
358
+
359
+ Implementation:
360
+ - Resolves user identity
361
+ - Initiates 90-day decay in CIRIS (via ConsentService - future)
362
+ - Deletes from all SQL connectors with verification
363
+ - Tracks success/failure across all sources
364
+
365
+ Note: CIRIS internal deletion requires ConsentService.revoke_consent()
366
+ which isn't available in DSAROrchestrator constructor. This should be
367
+ added when orchestrator is integrated into the service layer.
368
+ """
369
+ import time
370
+
371
+ from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
372
+
373
+ # Start timer
374
+ start_time = time.time()
375
+
376
+ # Generate request ID if not provided
377
+ if not request_id:
378
+ request_id = f"DSAR-DELETE-{self._now().strftime('%Y%m%d-%H%M%S')}"
379
+
380
+ logger.info(f"Starting multi-source deletion request {request_id} for {user_identifier}")
381
+
382
+ # Step 1: Resolve user identity
383
+ identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
384
+
385
+ # Step 2: Initiate CIRIS deletion (90-day decay protocol)
386
+ try:
387
+ # Revoke consent to initiate decay protocol
388
+ await self._consent_service.revoke_consent(
389
+ user_id=user_identifier,
390
+ reason=f"GDPR Article 17 - Multi-source deletion request {request_id}",
391
+ )
392
+ logger.info(f"Initiated consent revocation and decay protocol for {user_identifier}")
393
+
394
+ # Get actual deletion status from DSAR automation
395
+ ciris_deletion = await self._dsar_automation.get_deletion_status(user_identifier, request_id)
396
+
397
+ # If no status found yet, create initial status
398
+ if ciris_deletion is None:
399
+ from ciris_engine.schemas.consent.core import DSARDeletionStatus
400
+
401
+ ciris_deletion = DSARDeletionStatus(
402
+ ticket_id=request_id,
403
+ user_id=user_identifier,
404
+ decay_started=self._now(),
405
+ current_phase="identity_severed", # First phase of decay
406
+ completion_percentage=0.0,
407
+ estimated_completion=self._now() + timedelta(days=90),
408
+ milestones_completed=[],
409
+ next_milestone="interaction_history_purged",
410
+ safety_patterns_retained=0,
411
+ )
412
+ except Exception as e:
413
+ logger.exception(f"Failed to initiate consent revocation for {user_identifier}: {e}")
414
+ raise HTTPException(
415
+ status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
416
+ detail=f"Failed to initiate CIRIS deletion: {str(e)}",
417
+ ) from e
418
+
419
+ # Step 3: Delete from SQL connectors with verification
420
+ external_deletions: List[DataSourceDeletion] = []
421
+ sql_connectors = await self._discover_sql_connectors()
422
+
423
+ for connector_id in sql_connectors:
424
+ try:
425
+ deletion = await self._delete_from_sql(connector_id, user_identifier, verify=True)
426
+ external_deletions.append(deletion)
427
+ except Exception as e:
428
+ logger.error(f"Failed to delete from SQL connector {connector_id}: {e}")
429
+ external_deletions.append(
430
+ DataSourceDeletion(
431
+ source_id=connector_id,
432
+ source_type="sql",
433
+ source_name=connector_id,
434
+ success=False,
435
+ deletion_timestamp=self._now().isoformat(),
436
+ errors=[str(e)],
437
+ )
438
+ )
439
+
440
+ # Step 4: Calculate aggregated status
441
+ sources_completed = sum(1 for d in external_deletions if d.success and d.verification_passed)
442
+ sources_failed = sum(1 for d in external_deletions if not d.success)
443
+ total_records_deleted = sum(d.total_records_deleted for d in external_deletions)
444
+ all_verified = all(d.verification_passed for d in external_deletions if d.success)
445
+
446
+ # Step 5: Calculate processing time
447
+ processing_time = time.time() - start_time
448
+
449
+ # Step 6: Update metrics
450
+ self._multi_source_requests += 1
451
+ self._total_sources_queried += 1 + len(external_deletions)
452
+ self._total_processing_time += processing_time
453
+
454
+ # Step 7: Build deletion result
455
+ result = MultiSourceDSARDeletionResult(
456
+ request_id=request_id,
457
+ user_identifier=user_identifier,
458
+ ciris_deletion=ciris_deletion,
459
+ external_deletions=external_deletions,
460
+ identity_node=identity_node,
461
+ total_sources=1 + len(external_deletions),
462
+ sources_completed=sources_completed,
463
+ sources_failed=sources_failed,
464
+ total_records_deleted=total_records_deleted,
465
+ all_verified=all_verified,
466
+ initiated_at=self._now().isoformat(),
467
+ completed_at=self._now().isoformat() if sources_failed == 0 else None,
468
+ processing_time_seconds=processing_time,
469
+ )
470
+
471
+ logger.info(
472
+ f"Completed multi-source deletion {request_id}: "
473
+ f"{sources_completed}/{result.total_sources} completed, "
474
+ f"{total_records_deleted} records deleted, {processing_time:.2f}s"
475
+ )
476
+
477
+ return result
478
+
479
+ async def handle_correction_request_multi_source(
480
+ self, user_identifier: str, corrections: Dict[str, Any], request_id: Optional[str] = None
481
+ ) -> MultiSourceDSARCorrectionResult:
482
+ """Handle GDPR Article 16 correction request across all data sources.
483
+
484
+ Applies corrections to user data in all connected systems.
485
+
486
+ Args:
487
+ user_identifier: User identifier
488
+ corrections: Dict of field → new_value corrections
489
+ request_id: Optional request ID for tracking
490
+
491
+ Returns:
492
+ Aggregated correction result from all sources
493
+
494
+ Implementation:
495
+ - Resolves user identity
496
+ - Applies corrections to CIRIS data
497
+ - Applies corrections to all SQL sources
498
+ - Tracks applied/rejected corrections per source
499
+ """
500
+ import time
501
+
502
+ from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
503
+
504
+ # Start timer
505
+ start_time = time.time()
506
+
507
+ # Generate request ID if not provided
508
+ if not request_id:
509
+ request_id = f"DSAR-CORRECT-{self._now().strftime('%Y%m%d-%H%M%S')}"
510
+
511
+ logger.info(f"Starting multi-source correction request {request_id} for {user_identifier}")
512
+
513
+ # Step 1: Resolve user identity
514
+ identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
515
+
516
+ # Step 2: Apply CIRIS corrections
517
+ corrections_by_source: Dict[str, Dict[str, Any]] = {}
518
+ total_corrections_applied = 0
519
+ total_corrections_rejected = 0
520
+
521
+ try:
522
+ # Apply corrections to CIRIS via DSARAutomationService
523
+ from ciris_engine.schemas.consent.core import DSARCorrectionRequest
524
+
525
+ # Build correction requests for each field
526
+ for field_name, new_value in corrections.items():
527
+ correction_req = DSARCorrectionRequest(
528
+ user_id=user_identifier,
529
+ field_name=field_name,
530
+ current_value=None, # Could query current value first
531
+ new_value=str(new_value),
532
+ reason="Multi-source DSAR correction request",
533
+ )
534
+ ciris_result = await self._dsar_automation.handle_correction_request(correction_req, request_id)
535
+
536
+ # Track CIRIS corrections
537
+ corrections_by_source["ciris"] = corrections
538
+ total_corrections_applied += len(corrections)
539
+ logger.info(f"Applied {len(corrections)} corrections to CIRIS for {user_identifier}")
540
+ except Exception as e:
541
+ logger.exception(f"Failed to apply CIRIS corrections for {user_identifier}: {e}")
542
+ corrections_by_source["ciris"] = {}
543
+ total_corrections_rejected += len(corrections)
544
+
545
+ # Step 3: Apply corrections to SQL sources
546
+ # Note: This requires UPDATE statement support via SQL connectors
547
+ # For now, we'll log that SQL corrections are not yet implemented
548
+ sql_connectors = await self._discover_sql_connectors()
549
+ for connector_id in sql_connectors:
550
+ try:
551
+ # TODO Phase 2: Implement SQL UPDATE via tool_bus
552
+ # Implementation:
553
+ # 1. Create sql_update_user tool that accepts corrections dict
554
+ # 2. Call await tool_bus.execute_tool("sql_update_user", {
555
+ # "connector_id": connector_id,
556
+ # "user_identifier": user_identifier,
557
+ # "corrections": corrections
558
+ # })
559
+ # 3. Parse result to determine which corrections were applied/rejected
560
+ # 4. Update corrections_by_source and counters accordingly
561
+ # For now, mark as rejected
562
+ corrections_by_source[connector_id] = {}
563
+ total_corrections_rejected += len(corrections)
564
+ logger.warning(f"SQL corrections not yet implemented for {connector_id}")
565
+ except Exception as e:
566
+ logger.error(f"Failed to apply corrections to SQL connector {connector_id}: {e}")
567
+ corrections_by_source[connector_id] = {}
568
+ total_corrections_rejected += len(corrections)
569
+
570
+ # Step 4: Calculate processing time
571
+ processing_time = time.time() - start_time
572
+
573
+ # Step 5: Update metrics
574
+ self._multi_source_requests += 1
575
+ self._total_sources_queried += 1 + len(sql_connectors)
576
+ self._total_processing_time += processing_time
577
+
578
+ # Step 6: Build correction result
579
+ result = MultiSourceDSARCorrectionResult(
580
+ request_id=request_id,
581
+ user_identifier=user_identifier,
582
+ corrections_by_source=corrections_by_source,
583
+ identity_node=identity_node,
584
+ total_sources=1 + len(sql_connectors),
585
+ total_corrections_applied=total_corrections_applied,
586
+ total_corrections_rejected=total_corrections_rejected,
587
+ generated_at=self._now().isoformat(),
588
+ processing_time_seconds=processing_time,
589
+ )
590
+
591
+ logger.info(
592
+ f"Completed multi-source correction {request_id}: "
593
+ f"{total_corrections_applied} applied, {total_corrections_rejected} rejected, {processing_time:.2f}s"
594
+ )
595
+
596
+ return result
597
+
598
+ async def get_deletion_status_multi_source(
599
+ self, user_identifier: str, request_id: str
600
+ ) -> MultiSourceDSARDeletionResult:
601
+ """Get deletion status across all sources.
602
+
603
+ Checks deletion progress for:
604
+ - CIRIS (90-day decay progress)
605
+ - SQL databases (immediate, verification status)
606
+ - REST APIs (job status)
607
+ - HL7 systems (future)
608
+
609
+ Args:
610
+ user_identifier: User identifier
611
+ request_id: Original deletion request ID
612
+
613
+ Returns:
614
+ Current deletion status across all sources
615
+ """
616
+ import time
617
+
618
+ from ciris_engine.logic.utils.identity_resolution import resolve_user_identity
619
+
620
+ # Start timer
621
+ start_time = time.time()
622
+
623
+ logger.info(f"Checking multi-source deletion status for {request_id} - {user_identifier}")
624
+
625
+ # Step 1: Resolve user identity
626
+ identity_node = await resolve_user_identity(user_identifier, cast(MemoryServiceProtocol, self._memory_bus))
627
+
628
+ # Step 2: Get CIRIS deletion status
629
+ try:
630
+ ciris_deletion = await self._dsar_automation.get_deletion_status(user_identifier, request_id)
631
+ except Exception as e:
632
+ logger.exception(f"Failed to get CIRIS deletion status for {user_identifier}: {e}")
633
+ ciris_deletion = None
634
+
635
+ # Create fallback if no status found
636
+ if ciris_deletion is None:
637
+ from ciris_engine.schemas.consent.core import DSARDeletionStatus
638
+
639
+ ciris_deletion = DSARDeletionStatus(
640
+ ticket_id=request_id,
641
+ user_id=user_identifier,
642
+ decay_started=self._now(),
643
+ current_phase="unknown",
644
+ completion_percentage=0.0,
645
+ estimated_completion=self._now() + timedelta(days=90),
646
+ milestones_completed=[],
647
+ next_milestone="unknown",
648
+ safety_patterns_retained=0,
649
+ )
650
+
651
+ # Step 3: Check SQL deletion verification for all connectors
652
+ external_deletions: List[DataSourceDeletion] = []
653
+ sql_connectors = await self._discover_sql_connectors()
654
+
655
+ for connector_id in sql_connectors:
656
+ try:
657
+ # Verify deletion for this connector
658
+ verification_passed = await self._verify_deletion_sql(connector_id, user_identifier)
659
+
660
+ # Create deletion status entry
661
+ external_deletions.append(
662
+ DataSourceDeletion(
663
+ source_id=connector_id,
664
+ source_type="sql",
665
+ source_name=connector_id,
666
+ success=verification_passed, # If verification passed, deletion was successful
667
+ total_records_deleted=0, # Unknown - already deleted
668
+ verification_passed=verification_passed,
669
+ deletion_timestamp=self._now().isoformat(),
670
+ errors=[] if verification_passed else ["Deletion verification failed - data still present"],
671
+ )
672
+ )
673
+ except Exception as e:
674
+ logger.error(f"Failed to verify deletion from SQL connector {connector_id}: {e}")
675
+ external_deletions.append(
676
+ DataSourceDeletion(
677
+ source_id=connector_id,
678
+ source_type="sql",
679
+ source_name=connector_id,
680
+ success=False,
681
+ verification_passed=False,
682
+ deletion_timestamp=self._now().isoformat(),
683
+ errors=[str(e)],
684
+ )
685
+ )
686
+
687
+ # Step 4: Calculate aggregated status
688
+ sources_completed = sum(1 for d in external_deletions if d.success and d.verification_passed)
689
+ sources_failed = sum(1 for d in external_deletions if not d.success)
690
+ total_records_deleted = sum(d.total_records_deleted for d in external_deletions)
691
+ all_verified = all(d.verification_passed for d in external_deletions if d.success)
692
+
693
+ # Step 5: Calculate processing time
694
+ processing_time = time.time() - start_time
695
+
696
+ # Step 6: Build deletion result
697
+ result = MultiSourceDSARDeletionResult(
698
+ request_id=request_id,
699
+ user_identifier=user_identifier,
700
+ ciris_deletion=ciris_deletion,
701
+ external_deletions=external_deletions,
702
+ identity_node=identity_node,
703
+ total_sources=1 + len(external_deletions),
704
+ sources_completed=sources_completed,
705
+ sources_failed=sources_failed,
706
+ total_records_deleted=total_records_deleted,
707
+ all_verified=all_verified,
708
+ initiated_at=(
709
+ ciris_deletion.decay_started.isoformat() if ciris_deletion.decay_started else self._now().isoformat()
710
+ ),
711
+ completed_at=(
712
+ self._now().isoformat()
713
+ if sources_failed == 0 and ciris_deletion.completion_percentage >= 100.0
714
+ else None
715
+ ),
716
+ processing_time_seconds=processing_time,
717
+ )
718
+
719
+ logger.info(
720
+ f"Deletion status check complete for {request_id}: "
721
+ f"{sources_completed}/{result.total_sources} verified, "
722
+ f"CIRIS at {ciris_deletion.completion_percentage:.1f}%"
723
+ )
724
+
725
+ return result
726
+
727
+ async def _discover_sql_connectors(self) -> List[str]:
728
+ """Discover all registered SQL connectors via ToolBus.
729
+
730
+ Returns:
731
+ List of SQL connector IDs
732
+ """
733
+ try:
734
+ # Get SQL data sources using metadata
735
+ sql_services = self._tool_bus.get_tools_by_metadata({"data_source": True, "data_source_type": "sql"})
736
+
737
+ # Extract connector IDs from metadata
738
+ connector_ids = []
739
+ for service in sql_services:
740
+ try:
741
+ metadata = service.get_service_metadata()
742
+ connector_id = metadata.get("connector_id") or metadata.get("service_name")
743
+ if connector_id:
744
+ connector_ids.append(connector_id)
745
+ except Exception as e:
746
+ logger.warning(f"Failed to get metadata from SQL service: {e}")
747
+ continue
748
+
749
+ logger.info(f"Discovered {len(connector_ids)} SQL connectors: {connector_ids}")
750
+ return connector_ids
751
+
752
+ except Exception as e:
753
+ logger.error(f"Failed to discover SQL connectors: {e}")
754
+ return []
755
+
756
+ async def _discover_rest_connectors(self) -> List[str]:
757
+ """Discover all registered REST connectors via ToolBus.
758
+
759
+ Returns:
760
+ List of REST connector IDs
761
+
762
+ TODO Phase 2: Implement REST connector discovery
763
+ Implementation:
764
+ 1. Query tool_bus for tools with metadata:
765
+ - data_source=True, data_source_type="rest"
766
+ 2. Extract connector_id from each service's metadata
767
+ 3. Return list of connector IDs
768
+ 4. Similar pattern to _discover_sql_connectors()
769
+ """
770
+ # TODO: Implement REST connector discovery
771
+ raise NotImplementedError("REST connector discovery not yet implemented")
772
+
773
+ async def _discover_hl7_connectors(self) -> List[str]:
774
+ """Discover all registered HL7 connectors via ToolBus.
775
+
776
+ Returns:
777
+ List of HL7 connector IDs
778
+
779
+ TODO Phase 2+: Implement HL7 connector discovery
780
+ Implementation:
781
+ 1. Query tool_bus for tools with metadata:
782
+ - data_source=True, data_source_type="hl7"
783
+ 2. Extract connector_id from each service's metadata
784
+ 3. Return list of connector IDs
785
+ 4. Similar pattern to _discover_sql_connectors()
786
+
787
+ Note: HL7 is a future feature and lower priority than REST
788
+ """
789
+ # TODO: Implement HL7 connector discovery
790
+ raise NotImplementedError("HL7 connector discovery not yet implemented")
791
+
792
+ async def _export_from_sql(self, connector_id: str, user_identifier: str) -> DataSourceExport:
793
+ """Export user data from SQL connector.
794
+
795
+ Args:
796
+ connector_id: SQL connector ID
797
+ user_identifier: User identifier
798
+
799
+ Returns:
800
+ Data source export result
801
+ """
802
+ import hashlib
803
+ import json
804
+
805
+ try:
806
+ # Call SQL export tool via ToolBus
807
+ # SQL tools are registered with fixed names (sql_export_user, not connector_id prefix)
808
+ tool_name = "sql_export_user"
809
+ exec_result = await self._tool_bus.execute_tool(
810
+ tool_name=tool_name,
811
+ parameters={
812
+ "connector_id": connector_id,
813
+ "user_identifier": user_identifier,
814
+ "identifier_type": "email", # Default to email for DSAR requests
815
+ },
816
+ handler_name="default",
817
+ )
818
+
819
+ # Parse export result from ToolExecutionResult
820
+ if exec_result.data and isinstance(exec_result.data, dict):
821
+ data = exec_result.data.get("data", {})
822
+ tables = exec_result.data.get("tables_scanned", [])
823
+ total_records = exec_result.data.get("total_records", 0)
824
+ else:
825
+ # Fallback: treat result as data
826
+ data = {"export": str(exec_result.data) if exec_result.data else ""}
827
+ tables = []
828
+ total_records = 0
829
+
830
+ # Calculate checksum
831
+ data_json = json.dumps(data, sort_keys=True)
832
+ checksum = hashlib.sha256(data_json.encode("utf-8")).hexdigest()
833
+
834
+ return DataSourceExport(
835
+ source_id=connector_id,
836
+ source_type="sql",
837
+ source_name=connector_id,
838
+ tables_or_endpoints=tables,
839
+ total_records=total_records,
840
+ data=data,
841
+ checksum=checksum,
842
+ export_timestamp=self._now().isoformat(),
843
+ errors=[],
844
+ )
845
+
846
+ except Exception as e:
847
+ logger.exception(f"Failed to export from SQL connector {connector_id}: {e}")
848
+ return DataSourceExport(
849
+ source_id=connector_id,
850
+ source_type="sql",
851
+ source_name=connector_id,
852
+ export_timestamp=self._now().isoformat(),
853
+ errors=[str(e)],
854
+ )
855
+
856
+ async def _delete_from_sql(
857
+ self, connector_id: str, user_identifier: str, verify: bool = True
858
+ ) -> DataSourceDeletion:
859
+ """Delete user data from SQL connector.
860
+
861
+ Args:
862
+ connector_id: SQL connector ID
863
+ user_identifier: User identifier
864
+ verify: Whether to verify deletion
865
+
866
+ Returns:
867
+ Data source deletion result
868
+ """
869
+ try:
870
+ # Call SQL delete tool via ToolBus
871
+ # SQL tools are registered with fixed names (sql_delete_user, not connector_id prefix)
872
+ tool_name = "sql_delete_user"
873
+ exec_result = await self._tool_bus.execute_tool(
874
+ tool_name=tool_name,
875
+ parameters={
876
+ "connector_id": connector_id,
877
+ "user_identifier": user_identifier,
878
+ "identifier_type": "email", # Default to email for DSAR requests
879
+ "verify": verify,
880
+ },
881
+ handler_name="default",
882
+ )
883
+
884
+ # Parse deletion result from ToolExecutionResult
885
+ if exec_result.data and isinstance(exec_result.data, dict):
886
+ success = exec_result.data.get("success", False)
887
+ tables_affected = exec_result.data.get("tables_affected", [])
888
+ total_records_deleted = exec_result.data.get("total_records_deleted", 0)
889
+ else:
890
+ # Fallback: assume success if no error
891
+ success = exec_result.success
892
+ tables_affected = []
893
+ total_records_deleted = 0
894
+
895
+ # Verify deletion if requested
896
+ verification_passed = False
897
+ if verify and success:
898
+ verification_passed = await self._verify_deletion_sql(connector_id, user_identifier)
899
+
900
+ return DataSourceDeletion(
901
+ source_id=connector_id,
902
+ source_type="sql",
903
+ source_name=connector_id,
904
+ success=success,
905
+ tables_affected=tables_affected,
906
+ total_records_deleted=total_records_deleted,
907
+ verification_passed=verification_passed,
908
+ deletion_timestamp=self._now().isoformat(),
909
+ errors=[],
910
+ )
911
+
912
+ except Exception as e:
913
+ logger.exception(f"Failed to delete from SQL connector {connector_id}: {e}")
914
+ return DataSourceDeletion(
915
+ source_id=connector_id,
916
+ source_type="sql",
917
+ source_name=connector_id,
918
+ success=False,
919
+ deletion_timestamp=self._now().isoformat(),
920
+ errors=[str(e)],
921
+ )
922
+
923
+ async def _verify_deletion_sql(self, connector_id: str, user_identifier: str) -> bool:
924
+ """Verify user data deletion from SQL connector.
925
+
926
+ Args:
927
+ connector_id: SQL connector ID
928
+ user_identifier: User identifier
929
+
930
+ Returns:
931
+ True if zero data confirmed, False otherwise
932
+ """
933
+ try:
934
+ # Call SQL verify_deletion tool via ToolBus
935
+ # SQL tools are registered with fixed names (sql_verify_deletion, not connector_id prefix)
936
+ tool_name = "sql_verify_deletion"
937
+ exec_result = await self._tool_bus.execute_tool(
938
+ tool_name=tool_name,
939
+ parameters={
940
+ "connector_id": connector_id,
941
+ "user_identifier": user_identifier,
942
+ "identifier_type": "email", # Default to email for DSAR requests
943
+ },
944
+ handler_name="default",
945
+ )
946
+
947
+ # Parse verification result from ToolExecutionResult
948
+ if exec_result.data and isinstance(exec_result.data, dict):
949
+ zero_data_confirmed = bool(exec_result.data.get("zero_data_confirmed", False))
950
+ return zero_data_confirmed
951
+ elif isinstance(exec_result.data, bool):
952
+ return exec_result.data
953
+ else:
954
+ # Fallback: assume not verified if unexpected result
955
+ logger.warning(f"Unexpected verification result from {connector_id}: {exec_result.data}")
956
+ return False
957
+
958
+ except Exception as e:
959
+ logger.exception(f"Failed to verify deletion from SQL connector {connector_id}: {e}")
960
+ return False
961
+
962
+ def get_metrics(self) -> Dict[str, Any]:
963
+ """Get orchestrator metrics.
964
+
965
+ Returns:
966
+ Dict with metrics:
967
+ - multi_source_requests: Total multi-source requests
968
+ - total_sources_queried: Total sources queried
969
+ - avg_processing_time: Average processing time
970
+ """
971
+ avg_time = self._total_processing_time / self._multi_source_requests if self._multi_source_requests > 0 else 0.0
972
+
973
+ return {
974
+ "multi_source_requests": self._multi_source_requests,
975
+ "total_sources_queried": self._total_sources_queried,
976
+ "avg_processing_time_seconds": avg_time,
977
+ }