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,5 +1,3 @@
1
- from logging.config import fileConfig
2
-
3
1
  from alembic import context
4
2
  from sqlalchemy import engine_from_config, pool
5
3
 
@@ -7,11 +5,6 @@ from sqlalchemy import engine_from_config, pool
7
5
  # access to the values within the .ini file in use.
8
6
  config = context.config
9
7
 
10
- # Interpret the config file for Python logging.
11
- # This line sets up loggers basically.
12
- if config.config_file_name is not None:
13
- fileConfig(config.config_file_name)
14
-
15
8
  # add your model's MetaData object here
16
9
  # for 'autogenerate' support
17
10
  from solace_agent_mesh.gateway.http_sse.repository.models.base import Base
@@ -0,0 +1,72 @@
1
+ """Add project_users table for multi-user project access
2
+
3
+ Revision ID: 20251023_add_project_users
4
+ Revises: 20251023_remove_created_by_user_id
5
+ Create Date: 2025-10-23
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision: str = 'add_project_users_001'
15
+ down_revision: Union[str, None] = 'add_projects_table_001'
16
+ branch_labels: Union[str, Sequence[str], None] = None
17
+ depends_on: Union[str, Sequence[str], None] = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ """
22
+ Create project_users table to enable multi-user access to projects.
23
+
24
+ This table tracks which users have access to which projects and their roles.
25
+ It supports future features for collaborative project management.
26
+ """
27
+ # Create project_users table
28
+ op.create_table(
29
+ 'project_users',
30
+ sa.Column('id', sa.String(), nullable=False),
31
+ sa.Column('project_id', sa.String(), nullable=False),
32
+ sa.Column('user_id', sa.String(), nullable=False),
33
+ sa.Column('role', sa.String(), nullable=False),
34
+ sa.Column('added_at', sa.BigInteger(), nullable=False),
35
+ sa.Column('added_by_user_id', sa.String(), nullable=False),
36
+ sa.PrimaryKeyConstraint('id'),
37
+ sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ondelete='CASCADE'),
38
+ sa.UniqueConstraint('project_id', 'user_id', name='uq_project_user')
39
+ )
40
+
41
+ # Create indexes for efficient queries
42
+ op.create_index(
43
+ 'ix_project_users_project_id',
44
+ 'project_users',
45
+ ['project_id']
46
+ )
47
+
48
+ op.create_index(
49
+ 'ix_project_users_user_id',
50
+ 'project_users',
51
+ ['user_id']
52
+ )
53
+
54
+ # Create composite index for common query pattern (user accessing specific project)
55
+ op.create_index(
56
+ 'ix_project_users_user_project',
57
+ 'project_users',
58
+ ['user_id', 'project_id']
59
+ )
60
+
61
+
62
+ def downgrade() -> None:
63
+ """
64
+ Remove project_users table and related indexes.
65
+ """
66
+ # Drop indexes first
67
+ op.drop_index('ix_project_users_user_project', table_name='project_users')
68
+ op.drop_index('ix_project_users_user_id', table_name='project_users')
69
+ op.drop_index('ix_project_users_project_id', table_name='project_users')
70
+
71
+ # Drop the table
72
+ op.drop_table('project_users')
@@ -0,0 +1,109 @@
1
+ """Add soft delete and search support for sessions and projects
2
+
3
+ Revision ID: add_soft_delete_search_001
4
+ Revises: remove_is_global_001
5
+ Create Date: 2025-10-23 16:20:00.000000
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ from sqlalchemy import inspect
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision: str = 'soft_del_search_001'
15
+ down_revision: Union[str, Sequence[str], None] = 'add_project_users_001'
16
+ branch_labels: Union[str, Sequence[str], None] = None
17
+ depends_on: Union[str, Sequence[str], None] = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ """Add soft delete columns and search indexes."""
22
+ bind = op.get_bind()
23
+ inspector = inspect(bind)
24
+
25
+ # Add soft delete columns to sessions table
26
+ if 'sessions' in inspector.get_table_names():
27
+ sessions_columns = [col['name'] for col in inspector.get_columns('sessions')]
28
+
29
+ if 'deleted_at' not in sessions_columns:
30
+ op.add_column('sessions', sa.Column('deleted_at', sa.BigInteger(), nullable=True))
31
+
32
+ if 'deleted_by' not in sessions_columns:
33
+ op.add_column('sessions', sa.Column('deleted_by', sa.String(), nullable=True))
34
+
35
+ # Create index on deleted_at for efficient filtering
36
+ try:
37
+ op.create_index('ix_sessions_deleted_at', 'sessions', ['deleted_at'])
38
+ except Exception:
39
+ pass # Index might already exist
40
+
41
+ # Create composite index for user queries with soft delete
42
+ try:
43
+ op.create_index('ix_sessions_user_deleted', 'sessions', ['user_id', 'deleted_at'])
44
+ except Exception:
45
+ pass
46
+
47
+ # Add soft delete columns to projects table
48
+ if 'projects' in inspector.get_table_names():
49
+ projects_columns = [col['name'] for col in inspector.get_columns('projects')]
50
+
51
+ if 'deleted_at' not in projects_columns:
52
+ op.add_column('projects', sa.Column('deleted_at', sa.BigInteger(), nullable=True))
53
+
54
+ if 'deleted_by' not in projects_columns:
55
+ op.add_column('projects', sa.Column('deleted_by', sa.String(), nullable=True))
56
+
57
+ # Create index on deleted_at for efficient filtering
58
+ try:
59
+ op.create_index('ix_projects_deleted_at', 'projects', ['deleted_at'])
60
+ except Exception:
61
+ pass
62
+
63
+ # Create composite index for user queries with soft delete
64
+ try:
65
+ op.create_index('ix_projects_user_deleted', 'projects', ['user_id', 'deleted_at'])
66
+ except Exception:
67
+ pass
68
+
69
+
70
+ def downgrade() -> None:
71
+ """Remove soft delete columns and search indexes."""
72
+ bind = op.get_bind()
73
+ inspector = inspect(bind)
74
+
75
+ # Drop soft delete indexes from sessions
76
+ if 'sessions' in inspector.get_table_names():
77
+ try:
78
+ op.drop_index('ix_sessions_user_deleted', table_name='sessions')
79
+ except Exception:
80
+ pass
81
+
82
+ try:
83
+ op.drop_index('ix_sessions_deleted_at', table_name='sessions')
84
+ except Exception:
85
+ pass
86
+
87
+ sessions_columns = [col['name'] for col in inspector.get_columns('sessions')]
88
+ if 'deleted_by' in sessions_columns:
89
+ op.drop_column('sessions', 'deleted_by')
90
+ if 'deleted_at' in sessions_columns:
91
+ op.drop_column('sessions', 'deleted_at')
92
+
93
+ # Drop indexes and columns from projects
94
+ if 'projects' in inspector.get_table_names():
95
+ try:
96
+ op.drop_index('ix_projects_user_deleted', table_name='projects')
97
+ except Exception:
98
+ pass
99
+
100
+ try:
101
+ op.drop_index('ix_projects_deleted_at', table_name='projects')
102
+ except Exception:
103
+ pass
104
+
105
+ projects_columns = [col['name'] for col in inspector.get_columns('projects')]
106
+ if 'deleted_by' in projects_columns:
107
+ op.drop_column('projects', 'deleted_by')
108
+ if 'deleted_at' in projects_columns:
109
+ op.drop_column('projects', 'deleted_at')
@@ -0,0 +1,26 @@
1
+ """add default agent to projects
2
+
3
+ Revision ID: default_agent_001
4
+ Revises: soft_del_search_001
5
+ Create Date: 2025-01-24 01:13:00.000000
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = 'default_agent_001'
14
+ down_revision = 'soft_del_search_001'
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ """Add default_agent_id column to projects table."""
21
+ op.add_column('projects', sa.Column('default_agent_id', sa.String(), nullable=True))
22
+
23
+
24
+ def downgrade():
25
+ """Remove default_agent_id column from projects table."""
26
+ op.drop_column('projects', 'default_agent_id')
@@ -0,0 +1,135 @@
1
+ """Add projects table and project_id to sessions
2
+
3
+ Revision ID: add_projects_table_001
4
+ Revises: 20251015_session_idx
5
+ Create Date: 2025-10-24 10:00:00.000000
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+ from sqlalchemy import inspect
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision: str = 'add_projects_table_001'
15
+ down_revision: Union[str, Sequence[str], None] = '20251015_session_idx'
16
+ branch_labels: Union[str, Sequence[str], None] = None
17
+ depends_on: Union[str, Sequence[str], None] = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ """Create projects table and add project_id to sessions."""
22
+ bind = op.get_bind()
23
+ inspector = inspect(bind)
24
+ existing_tables = inspector.get_table_names()
25
+ dialect_name = bind.dialect.name
26
+
27
+ # Create projects table if it doesn't exist
28
+ # Note: This table is created without is_global and created_by_user_id columns
29
+ # as those were removed in the squashed migration
30
+ if 'projects' not in existing_tables:
31
+ op.create_table('projects',
32
+ sa.Column('id', sa.String(), nullable=False),
33
+ sa.Column('name', sa.String(), nullable=False),
34
+ sa.Column('user_id', sa.String(), nullable=False),
35
+ sa.Column('description', sa.Text(), nullable=True),
36
+ sa.Column('system_prompt', sa.Text(), nullable=True),
37
+ sa.Column('created_at', sa.BigInteger(), nullable=False),
38
+ sa.Column('updated_at', sa.BigInteger(), nullable=True),
39
+ sa.PrimaryKeyConstraint('id')
40
+ )
41
+
42
+ # Add project_id column to sessions if it doesn't exist
43
+ sessions_columns = [col['name'] for col in inspector.get_columns('sessions')]
44
+ if 'project_id' not in sessions_columns:
45
+ if dialect_name == 'sqlite':
46
+ # SQLite doesn't support ALTER TABLE ADD CONSTRAINT, recreate table
47
+ op.create_table(
48
+ 'sessions_new',
49
+ sa.Column('id', sa.String(), nullable=False),
50
+ sa.Column('name', sa.String(), nullable=True),
51
+ sa.Column('user_id', sa.String(), nullable=False),
52
+ sa.Column('agent_id', sa.String(), nullable=True),
53
+ sa.Column('created_time', sa.BigInteger(), nullable=False),
54
+ sa.Column('updated_time', sa.BigInteger(), nullable=False),
55
+ sa.Column('project_id', sa.String(), nullable=True),
56
+ sa.ForeignKeyConstraint(['project_id'], ['projects.id']),
57
+ sa.PrimaryKeyConstraint('id')
58
+ )
59
+
60
+ # Copy data from old table
61
+ op.execute("""
62
+ INSERT INTO sessions_new (id, name, user_id, agent_id, created_time, updated_time)
63
+ SELECT id, name, user_id, agent_id, created_time, updated_time
64
+ FROM sessions
65
+ """)
66
+
67
+ # Drop old table
68
+ op.drop_table('sessions')
69
+
70
+ # Rename new table
71
+ op.rename_table('sessions_new', 'sessions')
72
+
73
+ # Recreate indexes
74
+ op.create_index('ix_sessions_user_id', 'sessions', ['user_id'])
75
+ op.create_index('ix_sessions_project_id', 'sessions', ['project_id'])
76
+ else:
77
+ # PostgreSQL, MySQL - standard ALTER TABLE
78
+ op.add_column('sessions', sa.Column('project_id', sa.String(), nullable=True))
79
+ op.create_index('ix_sessions_project_id', 'sessions', ['project_id'])
80
+ op.create_foreign_key(
81
+ 'fk_sessions_project_id',
82
+ 'sessions',
83
+ 'projects',
84
+ ['project_id'],
85
+ ['id']
86
+ )
87
+
88
+
89
+ def downgrade() -> None:
90
+ """Downgrade schema - removes project-related changes."""
91
+ bind = op.get_bind()
92
+ inspector = inspect(bind)
93
+ dialect_name = bind.dialect.name
94
+
95
+ # Drop project_id column from sessions if it exists
96
+ sessions_columns = [col['name'] for col in inspector.get_columns('sessions')]
97
+ if 'project_id' in sessions_columns:
98
+ if dialect_name == 'sqlite':
99
+ # SQLite doesn't support ALTER TABLE DROP CONSTRAINT, recreate table
100
+ op.create_table(
101
+ 'sessions_old',
102
+ sa.Column('id', sa.String(), nullable=False),
103
+ sa.Column('name', sa.String(), nullable=True),
104
+ sa.Column('user_id', sa.String(), nullable=False),
105
+ sa.Column('agent_id', sa.String(), nullable=True),
106
+ sa.Column('created_time', sa.BigInteger(), nullable=False),
107
+ sa.Column('updated_time', sa.BigInteger(), nullable=False),
108
+ sa.PrimaryKeyConstraint('id')
109
+ )
110
+
111
+ # Copy data from current table (excluding project_id)
112
+ op.execute("""
113
+ INSERT INTO sessions_old (id, name, user_id, agent_id, created_time, updated_time)
114
+ SELECT id, name, user_id, agent_id, created_time, updated_time
115
+ FROM sessions
116
+ """)
117
+
118
+ # Drop current table
119
+ op.drop_table('sessions')
120
+
121
+ # Rename old table back
122
+ op.rename_table('sessions_old', 'sessions')
123
+
124
+ # Recreate index on user_id
125
+ op.create_index('ix_sessions_user_id', 'sessions', ['user_id'])
126
+ else:
127
+ # PostgreSQL, MySQL - standard ALTER TABLE
128
+ op.drop_constraint('fk_sessions_project_id', 'sessions', type_='foreignkey')
129
+ op.drop_index('ix_sessions_project_id', 'sessions')
130
+ op.drop_column('sessions', 'project_id')
131
+
132
+ # Drop projects table if it exists
133
+ existing_tables = inspector.get_table_names()
134
+ if 'projects' in existing_tables:
135
+ op.drop_table('projects')
@@ -0,0 +1,154 @@
1
+ """Create prompt tables with role-based sharing support
2
+
3
+ Revision ID: 20251108_prompt_tables_complete
4
+ Revises: 20251103_merge_heads
5
+ Create Date: 2025-11-08
6
+
7
+ This is a squashed migration that combines:
8
+ - Initial prompt tables creation
9
+ - Prompt pinning feature
10
+ - Role-based sharing via prompt_group_users table
11
+ """
12
+
13
+ from collections.abc import Sequence
14
+ import sqlalchemy as sa
15
+ from alembic import op
16
+
17
+ revision: str = "20251108_prompt_tables_complete"
18
+ down_revision: str | Sequence[str] | None = "default_agent_001"
19
+ branch_labels: str | Sequence[str] | None = None
20
+ depends_on: str | Sequence[str] | None = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Create complete prompt schema with sharing support."""
25
+
26
+ # 1. Create prompts table (individual prompt versions)
27
+ op.create_table(
28
+ 'prompts',
29
+ sa.Column('id', sa.String(), nullable=False),
30
+ sa.Column('prompt_text', sa.Text(), nullable=False),
31
+ sa.Column('group_id', sa.String(), nullable=False),
32
+ sa.Column('user_id', sa.String(), nullable=False),
33
+ sa.Column('version', sa.Integer(), nullable=False, server_default='1'),
34
+ sa.Column('created_at', sa.BigInteger(), nullable=False),
35
+ sa.Column('updated_at', sa.BigInteger(), nullable=False),
36
+ sa.PrimaryKeyConstraint('id')
37
+ )
38
+
39
+ # Indexes for prompts
40
+ op.create_index('ix_prompts_group_id', 'prompts', ['group_id'], unique=False)
41
+ op.create_index('ix_prompts_user_id', 'prompts', ['user_id'], unique=False)
42
+
43
+ # 2. Create prompt_groups table (prompt collections)
44
+ op.create_table(
45
+ 'prompt_groups',
46
+ sa.Column('id', sa.String(), nullable=False),
47
+ sa.Column('name', sa.String(length=255), nullable=False),
48
+ sa.Column('description', sa.Text(), nullable=True),
49
+ sa.Column('category', sa.String(length=100), nullable=True),
50
+ sa.Column('command', sa.String(length=50), nullable=True),
51
+ sa.Column('user_id', sa.String(), nullable=False),
52
+ sa.Column('author_name', sa.String(length=255), nullable=True),
53
+ sa.Column('production_prompt_id', sa.String(), nullable=True),
54
+ sa.Column('is_shared', sa.Boolean(), nullable=False, server_default='false'),
55
+ sa.Column('is_pinned', sa.Boolean(), nullable=False, server_default='false'),
56
+ sa.Column('created_at', sa.BigInteger(), nullable=False),
57
+ sa.Column('updated_at', sa.BigInteger(), nullable=False),
58
+ sa.ForeignKeyConstraint(
59
+ ['production_prompt_id'],
60
+ ['prompts.id'],
61
+ ondelete='SET NULL'
62
+ ),
63
+ sa.PrimaryKeyConstraint('id')
64
+ )
65
+
66
+ # Indexes for prompt_groups
67
+ op.create_index('ix_prompt_groups_name', 'prompt_groups', ['name'], unique=False)
68
+ op.create_index('ix_prompt_groups_category', 'prompt_groups', ['category'], unique=False)
69
+ op.create_index('ix_prompt_groups_command', 'prompt_groups', ['command'], unique=True)
70
+ op.create_index('ix_prompt_groups_user_id', 'prompt_groups', ['user_id'], unique=False)
71
+ op.create_index('ix_prompt_groups_is_pinned', 'prompt_groups', ['is_pinned'], unique=False)
72
+
73
+ # 3. Add foreign key from prompts to prompt_groups
74
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
75
+ batch_op.create_foreign_key(
76
+ 'fk_prompts_group_id',
77
+ 'prompt_groups',
78
+ ['group_id'],
79
+ ['id'],
80
+ ondelete='CASCADE'
81
+ )
82
+
83
+ # 4. Create prompt_group_users table (role-based sharing)
84
+ op.create_table(
85
+ 'prompt_group_users',
86
+ sa.Column('id', sa.String(), nullable=False),
87
+ sa.Column('prompt_group_id', sa.String(), nullable=False),
88
+ sa.Column('user_id', sa.String(), nullable=False),
89
+ sa.Column('role', sa.String(), nullable=False, server_default='viewer'),
90
+ sa.Column('added_at', sa.BigInteger(), nullable=False),
91
+ sa.Column('added_by_user_id', sa.String(), nullable=False),
92
+ sa.PrimaryKeyConstraint('id'),
93
+ sa.ForeignKeyConstraint(
94
+ ['prompt_group_id'],
95
+ ['prompt_groups.id'],
96
+ ondelete='CASCADE'
97
+ ),
98
+ sa.UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user')
99
+ )
100
+
101
+ # Indexes for prompt_group_users (optimized for sharing queries)
102
+ op.create_index(
103
+ 'ix_prompt_group_users_prompt_group_id',
104
+ 'prompt_group_users',
105
+ ['prompt_group_id'],
106
+ unique=False
107
+ )
108
+
109
+ op.create_index(
110
+ 'ix_prompt_group_users_user_id',
111
+ 'prompt_group_users',
112
+ ['user_id'],
113
+ unique=False
114
+ )
115
+
116
+ # Composite index for fast access checks
117
+ op.create_index(
118
+ 'ix_prompt_group_users_user_prompt',
119
+ 'prompt_group_users',
120
+ ['user_id', 'prompt_group_id'],
121
+ unique=False
122
+ )
123
+
124
+ # Optional: Index for role-based queries
125
+ op.create_index(
126
+ 'ix_prompt_group_users_user_role',
127
+ 'prompt_group_users',
128
+ ['user_id', 'role'],
129
+ unique=False
130
+ )
131
+
132
+
133
+ def downgrade() -> None:
134
+ """Remove all prompt-related tables."""
135
+
136
+ # Drop prompt_group_users table and indexes
137
+ op.drop_index('ix_prompt_group_users_user_role', table_name='prompt_group_users')
138
+ op.drop_index('ix_prompt_group_users_user_prompt', table_name='prompt_group_users')
139
+ op.drop_index('ix_prompt_group_users_user_id', table_name='prompt_group_users')
140
+ op.drop_index('ix_prompt_group_users_prompt_group_id', table_name='prompt_group_users')
141
+ op.drop_table('prompt_group_users')
142
+
143
+ # Drop prompt_groups indexes and table
144
+ op.drop_index('ix_prompt_groups_is_pinned', table_name='prompt_groups')
145
+ op.drop_index('ix_prompt_groups_user_id', table_name='prompt_groups')
146
+ op.drop_index('ix_prompt_groups_command', table_name='prompt_groups')
147
+ op.drop_index('ix_prompt_groups_category', table_name='prompt_groups')
148
+ op.drop_index('ix_prompt_groups_name', table_name='prompt_groups')
149
+ op.drop_table('prompt_groups')
150
+
151
+ # Drop prompts indexes and table
152
+ op.drop_index('ix_prompts_user_id', table_name='prompts')
153
+ op.drop_index('ix_prompts_group_id', table_name='prompts')
154
+ op.drop_table('prompts')
@@ -0,0 +1,32 @@
1
+ """Add parent_task_id to tasks table
2
+
3
+ Revision ID: 20251115_add_parent_task_id
4
+ Revises: 20251108_prompt_tables_complete
5
+ Create Date: 2025-11-15
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+ import sqlalchemy as sa
11
+ from alembic import op
12
+
13
+ revision: str = "20251115_add_parent_task_id"
14
+ down_revision: str | Sequence[str] | None = "20251108_prompt_tables_complete"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Add parent_task_id column to tasks table for efficient task hierarchy queries."""
21
+ op.add_column(
22
+ "tasks", sa.Column("parent_task_id", sa.String(), nullable=True)
23
+ )
24
+ op.create_index(
25
+ "ix_tasks_parent_task_id", "tasks", ["parent_task_id"], unique=False
26
+ )
27
+
28
+
29
+ def downgrade() -> None:
30
+ """Remove parent_task_id column from tasks table."""
31
+ op.drop_index("ix_tasks_parent_task_id", table_name="tasks")
32
+ op.drop_column("tasks", "parent_task_id")
@@ -0,0 +1,47 @@
1
+ """Add background task execution fields
2
+
3
+ Revision ID: 20251126_background_tasks
4
+ Revises: 20251202_versioned_prompt_fields
5
+ Create Date: 2025-11-26 17:30:00.000000
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = '20251126_background_tasks'
14
+ down_revision = '20251202_versioned_prompt_fields'
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ """Add fields to support background task execution."""
21
+ # Add execution_mode column (foreground | background)
22
+ op.add_column('tasks', sa.Column('execution_mode', sa.String(20), nullable=True, server_default='foreground'))
23
+
24
+ # Add last_activity_time for timeout detection
25
+ op.add_column('tasks', sa.Column('last_activity_time', sa.BigInteger, nullable=True))
26
+
27
+ # Add background_execution_enabled flag
28
+ op.add_column('tasks', sa.Column('background_execution_enabled', sa.Boolean, nullable=True, server_default='false'))
29
+
30
+ # Add max_execution_time_ms for timeout configuration
31
+ op.add_column('tasks', sa.Column('max_execution_time_ms', sa.BigInteger, nullable=True))
32
+
33
+ # Create index on execution_mode for efficient queries
34
+ op.create_index('idx_tasks_execution_mode', 'tasks', ['execution_mode'])
35
+
36
+ # Create index on last_activity_time for timeout monitoring
37
+ op.create_index('idx_tasks_last_activity', 'tasks', ['last_activity_time'])
38
+
39
+
40
+ def downgrade():
41
+ """Remove background task execution fields."""
42
+ op.drop_index('idx_tasks_last_activity', table_name='tasks')
43
+ op.drop_index('idx_tasks_execution_mode', table_name='tasks')
44
+ op.drop_column('tasks', 'max_execution_time_ms')
45
+ op.drop_column('tasks', 'background_execution_enabled')
46
+ op.drop_column('tasks', 'last_activity_time')
47
+ op.drop_column('tasks', 'execution_mode')
@@ -0,0 +1,52 @@
1
+ """Add versioned metadata fields to prompts table
2
+
3
+ Revision ID: 20251202_versioned_prompt_fields
4
+ Revises: 20251115_add_parent_task_id
5
+ Create Date: 2025-12-02
6
+
7
+ This migration adds name, description, category, and command fields to the prompts table
8
+ to enable full versioning of all prompt metadata, not just the prompt_text content.
9
+ """
10
+
11
+ from collections.abc import Sequence
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+
15
+ revision: str = "20251202_versioned_prompt_fields"
16
+ down_revision: str | Sequence[str] | None = "20251115_add_parent_task_id"
17
+ branch_labels: str | Sequence[str] | None = None
18
+ depends_on: str | Sequence[str] | None = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Add versioned metadata fields to prompts table."""
23
+
24
+ # Add new columns to prompts table
25
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
26
+ batch_op.add_column(sa.Column('name', sa.String(length=255), nullable=True))
27
+ batch_op.add_column(sa.Column('description', sa.Text(), nullable=True))
28
+ batch_op.add_column(sa.Column('category', sa.String(length=100), nullable=True))
29
+ batch_op.add_column(sa.Column('command', sa.String(length=50), nullable=True))
30
+
31
+ # Migrate existing data: copy metadata from prompt_groups to prompts
32
+ # This ensures existing prompt versions have the metadata from their group
33
+ connection = op.get_bind()
34
+ connection.execute(sa.text("""
35
+ UPDATE prompts
36
+ SET name = pg.name,
37
+ description = pg.description,
38
+ category = pg.category,
39
+ command = pg.command
40
+ FROM prompt_groups pg
41
+ WHERE prompts.group_id = pg.id
42
+ """))
43
+
44
+
45
+ def downgrade() -> None:
46
+ """Remove versioned metadata fields from prompts table."""
47
+
48
+ with op.batch_alter_table('prompts', schema=None) as batch_op:
49
+ batch_op.drop_column('command')
50
+ batch_op.drop_column('category')
51
+ batch_op.drop_column('description')
52
+ batch_op.drop_column('name')