solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__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.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,340 +0,0 @@
1
- ## Quick Summary
2
-
3
- The repository directory implements the data access layer for the HTTP SSE gateway using the Repository pattern. It provides a clean separation between domain entities and database persistence through SQLAlchemy ORM models. The architecture consists of abstract interfaces, concrete implementations, domain entities with business logic, and SQLAlchemy models for database operations. The two main subdirectories (entities and models) work together to provide a complete data persistence solution for chat sessions, messages, tasks, feedback, and events.
4
-
5
- ## Files and Subdirectories Overview
6
-
7
- **Direct files:**
8
- - `__init__.py` - Main package exports for repository interfaces, implementations, entities, and models
9
- - `interfaces.py` - Abstract repository interfaces defining data access contracts for sessions, messages, tasks, and feedback
10
- - `message_repository.py` - SQLAlchemy implementation of message data access operations
11
- - `session_repository.py` - SQLAlchemy implementation of session data access operations
12
- - `feedback_repository.py` - SQLAlchemy implementation of feedback data access operations
13
- - `task_repository.py` - SQLAlchemy implementation of task data access operations
14
-
15
- **Subdirectories:**
16
- - `entities/` - Domain entities with business logic for sessions, messages, tasks, feedback, and events
17
- - `models/` - SQLAlchemy ORM models for database persistence and schema definition
18
-
19
- ## Developer API Reference
20
-
21
- ### Direct Files
22
-
23
- #### __init__.py
24
- **Purpose:** Central package exports for all repository components
25
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository import IMessageRepository, ISessionRepository, MessageRepository, SessionRepository, Session, Message, SessionHistory, Base, MessageModel, SessionModel`
26
-
27
- **Exports:**
28
- - `IMessageRepository` - Message repository interface
29
- - `ISessionRepository` - Session repository interface
30
- - `MessageRepository` - Message repository implementation
31
- - `SessionRepository` - Session repository implementation
32
- - `Message` - Message domain entity
33
- - `Session` - Session domain entity
34
- - `SessionHistory` - Session with messages composite entity
35
- - `Base` - SQLAlchemy declarative base
36
- - `MessageModel` - SQLAlchemy message model
37
- - `SessionModel` - SQLAlchemy session model
38
-
39
- #### interfaces.py
40
- **Purpose:** Defines abstract repository interfaces for data access contracts
41
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository.interfaces import ISessionRepository, IMessageRepository, ITaskRepository, IFeedbackRepository`
42
-
43
- **Classes:**
44
- - `ISessionRepository(ABC)` - Abstract interface for session data operations
45
- - `find_by_user(user_id: UserId, pagination: PaginationInfo | None = None) -> list[Session]` - Find all sessions for a user
46
- - `count_by_user(user_id: UserId) -> int` - Count total sessions for a user
47
- - `find_user_session(session_id: SessionId, user_id: UserId) -> Session | None` - Find specific user session
48
- - `save(session: Session) -> Session` - Save or update a session
49
- - `delete(session_id: SessionId, user_id: UserId) -> bool` - Delete user session
50
- - `find_user_session_with_messages(session_id: SessionId, user_id: UserId, pagination: PaginationInfo | None = None) -> tuple[Session, list[Message]] | None` - Find session with messages
51
-
52
- - `IMessageRepository(ABC)` - Abstract interface for message data operations
53
- - `find_by_session(session_id: SessionId, pagination: PaginationInfo | None = None) -> list[Message]` - Find messages in session
54
- - `save(message: Message) -> Message` - Save or update a message
55
- - `delete_by_session(session_id: SessionId) -> bool` - Delete all session messages
56
-
57
- - `ITaskRepository(ABC)` - Abstract interface for task data operations
58
- - `save_task(task: Task) -> Task` - Create or update a task
59
- - `save_event(event: TaskEvent) -> TaskEvent` - Save a task event
60
- - `find_by_id(task_id: str) -> Task | None` - Find a task by its ID
61
- - `find_by_id_with_events(task_id: str) -> tuple[Task, list[TaskEvent]] | None` - Find a task with all its events
62
- - `search(user_id: UserId, start_date: int | None = None, end_date: int | None = None, search_query: str | None = None, pagination: PaginationParams | None = None) -> list[Task]` - Search for tasks with filters
63
- - `delete_tasks_older_than(cutoff_time_ms: int, batch_size: int) -> int` - Delete tasks older than cutoff time
64
-
65
- - `IFeedbackRepository(ABC)` - Abstract interface for feedback data operations
66
- - `save(feedback: Feedback) -> Feedback` - Save feedback
67
- - `delete_feedback_older_than(cutoff_time_ms: int, batch_size: int) -> int` - Delete feedback older than cutoff time
68
-
69
- #### message_repository.py
70
- **Purpose:** SQLAlchemy implementation of message repository interface
71
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository.message_repository import MessageRepository`
72
-
73
- **Classes:**
74
- - `MessageRepository(IMessageRepository)` - SQLAlchemy message repository implementation
75
- - `__init__(db: DBSession)` - Initialize with database session
76
- - `find_by_session(session_id: SessionId, pagination: PaginationInfo | None = None) -> list[Message]` - Find messages in session with pagination
77
- - `save(message: Message) -> Message` - Save or update message in database
78
- - `delete_by_session(session_id: SessionId) -> bool` - Delete all messages in session
79
- - `_convert_model_to_entity(model: MessageModel) -> Message` - Convert SQLAlchemy model to domain entity
80
-
81
- #### session_repository.py
82
- **Purpose:** SQLAlchemy implementation of session repository interface
83
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository.session_repository import SessionRepository`
84
-
85
- **Classes:**
86
- - `SessionRepository(ISessionRepository)` - SQLAlchemy session repository implementation
87
- - `__init__(db: DBSession)` - Initialize with database session
88
- - `find_by_user(user_id: UserId, pagination: PaginationInfo | None = None) -> list[Session]` - Find user sessions with pagination
89
- - `count_by_user(user_id: UserId) -> int` - Count total sessions for a user
90
- - `find_user_session(session_id: SessionId, user_id: UserId) -> Session | None` - Find specific user session
91
- - `save(session: Session) -> Session` - Save or update session in database
92
- - `delete(session_id: SessionId, user_id: UserId) -> bool` - Delete user session
93
- - `find_user_session_with_messages(session_id: SessionId, user_id: UserId, pagination: PaginationInfo | None = None) -> tuple[Session, list[Message]] | None` - Find session with messages
94
- - `_message_model_to_entity(model: MessageModel) -> Message` - Convert message model to entity
95
-
96
- #### feedback_repository.py
97
- **Purpose:** SQLAlchemy implementation of feedback repository interface
98
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository.feedback_repository import FeedbackRepository`
99
-
100
- **Classes:**
101
- - `FeedbackRepository(IFeedbackRepository)` - SQLAlchemy feedback repository implementation
102
- - `__init__(db: DBSession)` - Initialize with database session
103
- - `save(feedback: Feedback) -> Feedback` - Save feedback to database
104
- - `delete_feedback_older_than(cutoff_time_ms: int, batch_size: int) -> int` - Delete feedback older than cutoff time using batch deletion
105
- - `_model_to_entity(model: FeedbackModel) -> Feedback` - Convert SQLAlchemy model to domain entity
106
-
107
- #### task_repository.py
108
- **Purpose:** SQLAlchemy implementation of task repository interface
109
- **Import:** `from solace_agent_mesh.gateway.http_sse.repository.task_repository import TaskRepository`
110
-
111
- **Classes:**
112
- - `TaskRepository(ITaskRepository)` - SQLAlchemy task repository implementation
113
- - `__init__(db: DBSession)` - Initialize with database session
114
- - `save_task(task: Task) -> Task` - Create or update a task
115
- - `save_event(event: TaskEvent) -> TaskEvent` - Save a task event
116
- - `find_by_id(task_id: str) -> Task | None` - Find a task by its ID
117
- - `find_by_id_with_events(task_id: str) -> tuple[Task, list[TaskEvent]] | None` - Find a task with all its events
118
- - `search(user_id: UserId, start_date: int | None = None, end_date: int | None = None, search_query: str | None = None, pagination: PaginationParams | None = None) -> list[Task]` - Search for tasks with filters
119
- - `delete_tasks_older_than(cutoff_time_ms: int, batch_size: int) -> int` - Delete tasks older than cutoff time using batch deletion
120
- - `_task_model_to_entity(model: TaskModel) -> Task` - Convert SQLAlchemy task model to domain entity
121
- - `_event_model_to_entity(model: TaskEventModel) -> TaskEvent` - Convert SQLAlchemy event model to domain entity
122
-
123
- ### Subdirectory APIs
124
-
125
- #### entities/
126
- **Purpose:** Provides domain entities with business logic for sessions, messages, tasks, feedback, and events
127
- **Key Exports:** Message, Session, SessionHistory, Task, TaskEvent, Feedback
128
- **Import Examples:**
129
- ```python
130
- from solace_agent_mesh.gateway.http_sse.repository.entities import Message, Session, SessionHistory, Task, TaskEvent, Feedback
131
- ```
132
-
133
- #### models/
134
- **Purpose:** Provides SQLAlchemy ORM models for database persistence and schema definition
135
- **Key Exports:** Base, MessageModel, SessionModel, TaskModel, TaskEventModel, FeedbackModel
136
- **Import Examples:**
137
- ```python
138
- from solace_agent_mesh.gateway.http_sse.repository.models import Base, MessageModel, SessionModel, TaskModel, TaskEventModel, FeedbackModel
139
- ```
140
-
141
- ## Complete Usage Guide
142
-
143
- ### 1. Setting Up the Repository Layer
144
-
145
- ```python
146
- from sqlalchemy import create_engine
147
- from sqlalchemy.orm import sessionmaker
148
- from solace_agent_mesh.gateway.http_sse.repository import (
149
- Base, MessageRepository, SessionRepository, TaskRepository, FeedbackRepository
150
- )
151
-
152
- # Create database engine and session
153
- engine = create_engine("sqlite:///chat.db")
154
- Base.metadata.create_all(engine)
155
- Session = sessionmaker(bind=engine)
156
- db_session = Session()
157
-
158
- # Initialize repositories
159
- message_repo = MessageRepository(db_session)
160
- session_repo = SessionRepository(db_session)
161
- task_repo = TaskRepository(db_session)
162
- feedback_repo = FeedbackRepository(db_session)
163
- ```
164
-
165
- ### 2. Working with Sessions
166
-
167
- ```python
168
- from solace_agent_mesh.gateway.http_sse.repository.entities import Session
169
- from solace_agent_mesh.gateway.http_sse.shared.types import PaginationInfo
170
- import time
171
-
172
- # Create a new session
173
- session = Session(
174
- id="session_123",
175
- user_id="user_456",
176
- name="Customer Support Chat",
177
- agent_id="agent_789",
178
- created_time=int(time.time() * 1000)
179
- )
180
-
181
- # Save session
182
- saved_session = session_repo.save(session)
183
-
184
- # Find user sessions with pagination
185
- pagination = PaginationInfo(page=1, page_size=10)
186
- user_sessions = session_repo.find_by_user("user_456", pagination)
187
-
188
- # Count total sessions for user
189
- total_sessions = session_repo.count_by_user("user_456")
190
-
191
- # Find specific session
192
- found_session = session_repo.find_user_session("session_123", "user_456")
193
-
194
- # Update session
195
- if found_session:
196
- found_session.update_name("Updated Chat Name")
197
- session_repo.save(found_session)
198
- ```
199
-
200
- ### 3. Working with Messages
201
-
202
- ```python
203
- from solace_agent_mesh.gateway.http_sse.repository.entities import Message
204
- from solace_agent_mesh.gateway.http_sse.shared.enums import SenderType, MessageType
205
-
206
- # Create a new message
207
- message = Message(
208
- id="msg_123",
209
- session_id="session_123",
210
- message="Hello, how can I help you today?",
211
- sender_type=SenderType.AGENT,
212
- sender_name="Support Agent",
213
- message_type=MessageType.TEXT,
214
- created_time=int(time.time() * 1000)
215
- )
216
-
217
- # Validate and save message
218
- message.validate_message_content()
219
- saved_message = message_repo.save(message)
220
-
221
- # Find messages in session
222
- session_messages = message_repo.find_by_session("session_123", pagination)
223
-
224
- # Check message properties
225
- if message.is_from_agent():
226
- print("Message from agent")
227
- ```
228
-
229
- ### 4. Working with Tasks and Events
230
-
231
- ```python
232
- from solace_agent_mesh.gateway.http_sse.repository.entities import Task, TaskEvent
233
-
234
- # Create a new task
235
- task = Task(
236
- id="task_123",
237
- user_id="user_456",
238
- start_time=int(time.time() * 1000),
239
- status="in_progress",
240
- initial_request_text="Help me with my order"
241
- )
242
-
243
- # Save task
244
- saved_task = task_repo.save_task(task)
245
-
246
- # Create task event
247
- event = TaskEvent(
248
- id="event_123",
249
- task_id="task_123",
250
- user_id="user_456",
251
- created_time=int(time.time() * 1000),
252
- topic="task.status.changed",
253
- direction="outbound",
254
- payload={"status": "completed", "result": "success"}
255
- )
256
-
257
- # Save event
258
- saved_event = task_repo.save_event(event)
259
-
260
- # Find task with events
261
- result = task_repo.find_by_id_with_events("task_123")
262
- if result:
263
- task, events = result
264
- print(f"Task {task.id} has {len(events)} events")
265
-
266
- # Search tasks
267
- from solace_agent_mesh.gateway.http_sse.shared.types import PaginationParams
268
- pagination_params = PaginationParams(page=1, page_size=10)
269
- tasks = task_repo.search(
270
- user_id="user_456",
271
- search_query="order",
272
- pagination=pagination_params
273
- )
274
- ```
275
-
276
- ### 5. Working with Feedback
277
-
278
- ```python
279
- from solace_agent_mesh.gateway.http_sse.repository.entities import Feedback
280
-
281
- # Create feedback
282
- feedback = Feedback(
283
- id="feedback_123",
284
- session_id="session_123",
285
- task_id="task_123",
286
- user_id="user_456",
287
- rating="up",
288
- comment="Great service!",
289
- created_time=int(time.time() * 1000)
290
- )
291
-
292
- # Save feedback
293
- saved_feedback = feedback_repo.save(feedback)
294
- ```
295
-
296
- ### 6. Working with Session History (Combined Operations)
297
-
298
- ```python
299
- from solace_agent_mesh.gateway.http_sse.repository.entities import SessionHistory
300
-
301
- # Get session with messages in one operation
302
- result = session_repo.find_user_session_with_messages(
303
- "session_123", "user_456", pagination
304
- )
305
-
306
- if result:
307
- session, messages = result
308
-
309
- # Create session history object
310
- history = SessionHistory(
311
- session=session,
312
- messages=messages,
313
- total_message_count=len(messages)
314
- )
315
-
316
- print(f"Session: {history.session.name}")
317
- print(f"Messages: {len(history.messages)}")
318
- ```
319
-
320
- ### 7. Using Repository Interfaces for Dependency Injection
321
-
322
- ```python
323
- from solace_agent_mesh.gateway.http_sse.repository.interfaces import (
324
- ISessionRepository, IMessageRepository, ITaskRepository, IFeedbackRepository
325
- )
326
-
327
- class ChatService:
328
- def __init__(
329
- self,
330
- session_repo: ISessionRepository,
331
- message_repo: IMessageRepository,
332
- task_repo: ITaskRepository,
333
- feedback_repo: IFeedbackRepository
334
- ):
335
- self.session_repo = session_repo
336
- self.message_repo = message_repo
337
- self.task_repo = task_repo
338
- self.feedback_
339
-
340
- # content_hash: e4e822acd625d1acce1f4ea0721844e7428a9b110c9e73b6657b8d3adc8ed038
@@ -1,346 +0,0 @@
1
- # DEVELOPER GUIDE: dto
2
-
3
- ## Quick Summary
4
- The `dto` directory contains Data Transfer Objects (DTOs) for API contract definition and validation in the HTTP SSE gateway. It's organized into two main subdirectories: `requests` for incoming API request validation using Pydantic models, and `responses` for structured API response formatting with automatic timestamp conversion. The DTOs primarily focus on session management operations and provide type-safe interfaces for API endpoints.
5
-
6
- ## Files and Subdirectories Overview
7
- - **Direct files:**
8
- - `__init__.py` - Main module exports for requests and responses submodules
9
- - **Subdirectories:**
10
- - `requests/` - Request DTOs for API endpoint validation (session CRUD operations)
11
- - `responses/` - Response DTOs with automatic timestamp serialization and field aliasing
12
-
13
- ## Developer API Reference
14
-
15
- ### Direct Files
16
-
17
- #### __init__.py
18
- **Purpose:** Main entry point that exports the requests and responses submodules
19
- **Import:** `from solace_agent_mesh.gateway.http_sse.routers.dto import requests, responses`
20
-
21
- **Exports:**
22
- - `requests` - Module containing all request DTOs
23
- - `responses` - Module containing all response DTOs
24
-
25
- ### Subdirectory APIs
26
-
27
- #### requests/
28
- **Purpose:** Provides Pydantic models for validating incoming API requests, specifically for session management operations
29
- **Key Exports:** GetSessionsRequest, GetSessionRequest, GetSessionHistoryRequest, UpdateSessionRequest, DeleteSessionRequest
30
- **Import Examples:**
31
- ```python
32
- from solace_agent_mesh.gateway.http_sse.routers.dto.requests import (
33
- GetSessionRequest,
34
- GetSessionHistoryRequest,
35
- UpdateSessionRequest
36
- )
37
- ```
38
-
39
- #### responses/
40
- **Purpose:** Provides structured response DTOs with automatic timestamp conversion and field aliasing for API consistency
41
- **Key Exports:** MessageResponse, SessionResponse, SessionListResponse, BaseTimestampResponse
42
- **Import Examples:**
43
- ```python
44
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses import (
45
- MessageResponse,
46
- SessionResponse,
47
- SessionListResponse
48
- )
49
- ```
50
-
51
- ## Complete Usage Guide
52
-
53
- ### 1. Basic Imports and Setup
54
-
55
- ```python
56
- # Import the main dto modules
57
- from solace_agent_mesh.gateway.http_sse.routers.dto import requests, responses
58
-
59
- # Or import specific DTOs directly
60
- from solace_agent_mesh.gateway.http_sse.routers.dto.requests import (
61
- GetSessionRequest,
62
- GetSessionHistoryRequest,
63
- UpdateSessionRequest
64
- )
65
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses import (
66
- SessionResponse,
67
- MessageResponse,
68
- SessionListResponse
69
- )
70
- ```
71
-
72
- ### 2. Working with Request DTOs
73
-
74
- ```python
75
- from solace_agent_mesh.gateway.http_sse.routers.dto.requests import (
76
- GetSessionRequest,
77
- GetSessionHistoryRequest,
78
- UpdateSessionRequest
79
- )
80
- from pydantic import ValidationError
81
-
82
- # Create a request to get a specific session
83
- def get_session(session_id: str, user_id: str):
84
- try:
85
- request = GetSessionRequest(
86
- session_id=session_id,
87
- user_id=user_id
88
- )
89
- return request
90
- except ValidationError as e:
91
- print(f"Invalid request parameters: {e}")
92
- return None
93
-
94
- # Create a request to get session history with pagination
95
- def get_session_history(session_id: str, user_id: str, page: int = 1, size: int = 20):
96
- try:
97
- request = GetSessionHistoryRequest(
98
- session_id=session_id,
99
- user_id=user_id,
100
- pagination={"page": page, "size": size}
101
- )
102
- return request
103
- except ValidationError as e:
104
- print(f"Validation failed: {e}")
105
- return None
106
-
107
- # Create a request to update session name
108
- def update_session_name(session_id: str, user_id: str, new_name: str):
109
- try:
110
- request = UpdateSessionRequest(
111
- session_id=session_id,
112
- user_id=user_id,
113
- name=new_name # Automatically validated (1-255 characters)
114
- )
115
- return request
116
- except ValidationError as e:
117
- print(f"Validation failed: {e}")
118
- return None
119
- ```
120
-
121
- ### 3. Working with Response DTOs
122
-
123
- ```python
124
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses import (
125
- SessionResponse,
126
- MessageResponse,
127
- SessionListResponse
128
- )
129
- from solace_agent_mesh.gateway.http_sse.shared.enums import MessageType, SenderType
130
- import time
131
-
132
- # Create session responses
133
- def create_session_response(session_data: dict) -> SessionResponse:
134
- return SessionResponse(
135
- id=session_data["id"],
136
- user_id=session_data["user_id"],
137
- name=session_data.get("name"),
138
- agent_id=session_data.get("agent_id"),
139
- created_time=int(time.time() * 1000), # Current time in epoch ms
140
- updated_time=session_data.get("updated_time")
141
- )
142
-
143
- # Create message responses
144
- def create_message_response(message_data: dict) -> MessageResponse:
145
- return MessageResponse(
146
- id=message_data["id"],
147
- session_id=message_data["session_id"],
148
- message=message_data["message"],
149
- sender_type=SenderType.USER,
150
- sender_name=message_data["sender_name"],
151
- message_type=MessageType.TEXT,
152
- created_time=int(time.time() * 1000)
153
- )
154
-
155
- # Create paginated session list responses
156
- def create_session_list_response(sessions: list, total: int) -> SessionListResponse:
157
- session_responses = [create_session_response(session) for session in sessions]
158
- return SessionListResponse(
159
- sessions=session_responses,
160
- pagination={"page": 1, "size": len(sessions), "total_pages": 1},
161
- total_count=total
162
- )
163
- ```
164
-
165
- ### 4. Complete API Endpoint Example
166
-
167
- ```python
168
- from fastapi import APIRouter, HTTPException
169
- from solace_agent_mesh.gateway.http_sse.routers.dto.requests import (
170
- GetSessionRequest,
171
- GetSessionHistoryRequest,
172
- UpdateSessionRequest
173
- )
174
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses import (
175
- SessionResponse,
176
- MessageResponse,
177
- SessionListResponse
178
- )
179
-
180
- router = APIRouter()
181
-
182
- @router.get("/sessions/{session_id}")
183
- async def get_session(session_id: str, user_id: str) -> SessionResponse:
184
- """Get a specific session"""
185
-
186
- # Create and validate request DTO
187
- request = GetSessionRequest(
188
- session_id=session_id,
189
- user_id=user_id
190
- )
191
-
192
- # Fetch data (mock implementation)
193
- session_data = fetch_session(request)
194
-
195
- # Return structured response with automatic timestamp conversion
196
- return SessionResponse(
197
- id=session_data["id"],
198
- user_id=session_data["user_id"],
199
- name=session_data["name"],
200
- created_time=session_data["created_time"]
201
- )
202
-
203
- @router.get("/sessions/{session_id}/history")
204
- async def get_session_history(
205
- session_id: str,
206
- user_id: str,
207
- page: int = 1,
208
- size: int = 20
209
- ) -> list[MessageResponse]:
210
- """Get session message history"""
211
-
212
- # Validate request using DTO
213
- request = GetSessionHistoryRequest(
214
- session_id=session_id,
215
- user_id=user_id,
216
- pagination={"page": page, "size": size}
217
- )
218
-
219
- # Fetch messages (mock implementation)
220
- messages_data = fetch_session_messages(request)
221
-
222
- # Return response DTOs with automatic field aliasing
223
- return [
224
- MessageResponse(
225
- id=msg["id"],
226
- session_id=msg["session_id"],
227
- message=msg["message"],
228
- sender_type=msg["sender_type"],
229
- sender_name=msg["sender_name"],
230
- message_type=msg["message_type"],
231
- created_time=msg["created_time"]
232
- )
233
- for msg in messages_data
234
- ]
235
-
236
- @router.put("/sessions/{session_id}")
237
- async def update_session(
238
- session_id: str,
239
- user_id: str,
240
- name: str
241
- ) -> SessionResponse:
242
- """Update session name"""
243
-
244
- # Validate request using DTO
245
- try:
246
- request = UpdateSessionRequest(
247
- session_id=session_id,
248
- user_id=user_id,
249
- name=name
250
- )
251
- except ValidationError as e:
252
- raise HTTPException(status_code=400, detail=str(e))
253
-
254
- # Update session (mock implementation)
255
- updated_session = update_session_in_db(request)
256
-
257
- # Return response DTO with automatic field aliasing
258
- return SessionResponse(
259
- id=updated_session["id"],
260
- user_id=updated_session["user_id"],
261
- name=updated_session["name"],
262
- created_time=updated_session["created_time"],
263
- updated_time=updated_session["updated_time"]
264
- )
265
- ```
266
-
267
- ### 5. JSON Serialization with Automatic Timestamp Conversion
268
-
269
- ```python
270
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses import SessionResponse, MessageResponse
271
- from solace_agent_mesh.gateway.http_sse.shared.enums import MessageType, SenderType
272
- import json
273
-
274
- # Create a session response
275
- session = SessionResponse(
276
- id="sess_123",
277
- user_id="user_456",
278
- name="My Session",
279
- created_time=1640995200000, # Epoch milliseconds
280
- updated_time=1640995260000
281
- )
282
-
283
- # Automatic conversion to ISO strings in JSON output
284
- json_output = session.model_dump_json()
285
- print(json_output)
286
- # Output: {
287
- # "id": "sess_123",
288
- # "userId": "user_456", # Note the camelCase aliasing
289
- # "name": "My Session",
290
- # "createdTime": "2022-01-01T00:00:00Z", # Converted to ISO string
291
- # "updatedTime": "2022-01-01T00:01:00Z"
292
- # }
293
-
294
- # Create a message response with field aliasing
295
- message = MessageResponse(
296
- id="msg_789",
297
- session_id="sess_123",
298
- message="Hello world",
299
- sender_type=SenderType.USER,
300
- sender_name="John Doe",
301
- message_type=MessageType.TEXT,
302
- created_time=1640995200000
303
- )
304
-
305
- # Get dict with converted timestamps and aliased fields
306
- dict_output = message.model_dump()
307
- print(dict_output["sessionId"]) # "sess_123" (camelCase alias)
308
- print(dict_output["senderType"]) # SenderType.USER (camelCase alias)
309
- print(dict_output["createdTime"]) # "2022-01-01T00:00:00Z" (converted timestamp)
310
- ```
311
-
312
- ### 6. Custom Response Classes Using Base
313
-
314
- ```python
315
- from solace_agent_mesh.gateway.http_sse.routers.dto.responses.base_responses import BaseTimestampResponse
316
-
317
- class CustomResponse(BaseTimestampResponse):
318
- """Custom response with automatic timestamp handling"""
319
- name: str
320
- status: str
321
- created_time: int
322
- last_accessed: int | None = None
323
-
324
- class Config:
325
- # Add field aliases if needed
326
- alias_generator = lambda field_name: ''.join(
327
- word.capitalize() if i > 0 else word
328
- for i, word in enumerate(field_name.split('_'))
329
- )
330
-
331
- # Usage
332
- custom_response = CustomResponse(
333
- name="Test Item",
334
- status="active",
335
- created_time=1640995200000,
336
- last_accessed=1640995300000
337
- )
338
-
339
- # Automatic timestamp conversion in JSON
340
- json_data = custom_response.model_dump_json()
341
- # Fields like created_time become ISO strings automatically
342
- ```
343
-
344
- This comprehensive guide shows how the `dto` directory provides a complete type-safe API contract system with automatic validation for requests and structured responses with timestamp conversion for the HTTP SSE gateway.
345
-
346
- # content_hash: 3bb29d4c46b962221fc3034560b7e0da75b5a41f7f8f4d4f25aecf26e10f83f5