devchain-cli 0.11.5 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +8 -4
  2. package/dist/drizzle/0050_teams.sql +26 -0
  3. package/dist/drizzle/0051_teams_optional_lead.sql +17 -0
  4. package/dist/drizzle/0054_provider_config_description.sql +1 -0
  5. package/dist/drizzle/0055_team_profiles.sql +10 -0
  6. package/dist/drizzle/0056_team_profile_configs.sql +11 -0
  7. package/dist/drizzle/0057_white_lester.sql +2 -0
  8. package/dist/drizzle/0058_fluffy_wolverine.sql +1 -0
  9. package/dist/drizzle/0059_loving_daimon_hellstrom.sql +1 -0
  10. package/dist/drizzle/meta/0050_snapshot.json +4929 -0
  11. package/dist/drizzle/meta/0051_snapshot.json +4929 -0
  12. package/dist/drizzle/meta/0053_snapshot.json +4944 -0
  13. package/dist/drizzle/meta/0054_snapshot.json +4951 -0
  14. package/dist/drizzle/meta/0055_snapshot.json +5025 -0
  15. package/dist/drizzle/meta/0056_snapshot.json +5109 -0
  16. package/dist/drizzle/meta/0057_snapshot.json +5125 -0
  17. package/dist/drizzle/meta/0058_snapshot.json +5133 -0
  18. package/dist/drizzle/meta/0059_snapshot.json +5140 -0
  19. package/dist/drizzle/meta/_journal.json +60 -4
  20. package/dist/node_modules/@devchain/codebase-overview/index.d.ts +2 -0
  21. package/dist/node_modules/@devchain/codebase-overview/index.d.ts.map +1 -0
  22. package/dist/node_modules/@devchain/codebase-overview/index.js +2 -0
  23. package/dist/node_modules/@devchain/codebase-overview/index.js.map +1 -0
  24. package/dist/node_modules/@devchain/codebase-overview/package.json +8 -0
  25. package/dist/node_modules/@devchain/codebase-overview/tsconfig.tsbuildinfo +1 -0
  26. package/dist/node_modules/@devchain/codebase-overview/types.d.ts +232 -0
  27. package/dist/node_modules/@devchain/codebase-overview/types.d.ts.map +1 -0
  28. package/dist/node_modules/@devchain/codebase-overview/types.js +2 -0
  29. package/dist/node_modules/@devchain/codebase-overview/types.js.map +1 -0
  30. package/dist/node_modules/@devchain/shared/index.d.ts +1 -1
  31. package/dist/node_modules/@devchain/shared/index.d.ts.map +1 -1
  32. package/dist/node_modules/@devchain/shared/index.js +1 -1
  33. package/dist/node_modules/@devchain/shared/index.js.map +1 -1
  34. package/dist/node_modules/@devchain/shared/schemas/env-vars.d.ts +3 -0
  35. package/dist/node_modules/@devchain/shared/schemas/env-vars.d.ts.map +1 -0
  36. package/dist/node_modules/@devchain/shared/schemas/env-vars.js +14 -0
  37. package/dist/node_modules/@devchain/shared/schemas/env-vars.js.map +1 -0
  38. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts +99 -13
  39. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts.map +1 -1
  40. package/dist/node_modules/@devchain/shared/schemas/export-schema.js +25 -1
  41. package/dist/node_modules/@devchain/shared/schemas/export-schema.js.map +1 -1
  42. package/dist/node_modules/@devchain/shared/schemas/index.d.ts +1 -0
  43. package/dist/node_modules/@devchain/shared/schemas/index.d.ts.map +1 -1
  44. package/dist/node_modules/@devchain/shared/schemas/index.js +1 -0
  45. package/dist/node_modules/@devchain/shared/schemas/index.js.map +1 -1
  46. package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
  47. package/dist/server/app.main.module.js +4 -0
  48. package/dist/server/app.main.module.js.map +1 -1
  49. package/dist/server/app.normal.module.js +4 -0
  50. package/dist/server/app.normal.module.js.map +1 -1
  51. package/dist/server/common/config/feature-flags.d.ts +0 -2
  52. package/dist/server/common/config/feature-flags.js +1 -4
  53. package/dist/server/common/config/feature-flags.js.map +1 -1
  54. package/dist/server/common/errors/error-types.d.ts +3 -0
  55. package/dist/server/common/errors/error-types.js +10 -1
  56. package/dist/server/common/errors/error-types.js.map +1 -1
  57. package/dist/server/common/template/agent-recipient-context.d.ts +10 -0
  58. package/dist/server/common/template/agent-recipient-context.js +13 -0
  59. package/dist/server/common/template/agent-recipient-context.js.map +1 -0
  60. package/dist/server/common/template/handlebars-renderer.d.ts +1 -0
  61. package/dist/server/common/template/handlebars-renderer.js +26 -0
  62. package/dist/server/common/template/handlebars-renderer.js.map +1 -0
  63. package/dist/server/modules/agents/agents.module.js +2 -1
  64. package/dist/server/modules/agents/agents.module.js.map +1 -1
  65. package/dist/server/modules/agents/controllers/agents.controller.d.ts +3 -1
  66. package/dist/server/modules/agents/controllers/agents.controller.js +36 -3
  67. package/dist/server/modules/agents/controllers/agents.controller.js.map +1 -1
  68. package/dist/server/modules/codebase-overview-analyzer/codebase-overview-analyzer.module.d.ts +2 -0
  69. package/dist/server/modules/codebase-overview-analyzer/codebase-overview-analyzer.module.js +51 -0
  70. package/dist/server/modules/codebase-overview-analyzer/codebase-overview-analyzer.module.js.map +1 -0
  71. package/dist/server/modules/codebase-overview-analyzer/controllers/codebase-overview.controller.d.ts +30 -0
  72. package/dist/server/modules/codebase-overview-analyzer/controllers/codebase-overview.controller.js +225 -0
  73. package/dist/server/modules/codebase-overview-analyzer/controllers/codebase-overview.controller.js.map +1 -0
  74. package/dist/server/modules/codebase-overview-analyzer/repositories/overview-scope.repository.d.ts +24 -0
  75. package/dist/server/modules/codebase-overview-analyzer/repositories/overview-scope.repository.js +188 -0
  76. package/dist/server/modules/codebase-overview-analyzer/repositories/overview-scope.repository.js.map +1 -0
  77. package/dist/server/modules/codebase-overview-analyzer/services/codebase-overview-analyzer.service.d.ts +71 -0
  78. package/dist/server/modules/codebase-overview-analyzer/services/codebase-overview-analyzer.service.js +1128 -0
  79. package/dist/server/modules/codebase-overview-analyzer/services/codebase-overview-analyzer.service.js.map +1 -0
  80. package/dist/server/modules/codebase-overview-analyzer/services/dependency-aggregation.service.d.ts +14 -0
  81. package/dist/server/modules/codebase-overview-analyzer/services/dependency-aggregation.service.js +114 -0
  82. package/dist/server/modules/codebase-overview-analyzer/services/dependency-aggregation.service.js.map +1 -0
  83. package/dist/server/modules/codebase-overview-analyzer/services/district-splitting.service.d.ts +8 -0
  84. package/dist/server/modules/codebase-overview-analyzer/services/district-splitting.service.js +200 -0
  85. package/dist/server/modules/codebase-overview-analyzer/services/district-splitting.service.js.map +1 -0
  86. package/dist/server/modules/codebase-overview-analyzer/services/evidence-query.service.d.ts +11 -0
  87. package/dist/server/modules/codebase-overview-analyzer/services/evidence-query.service.js +164 -0
  88. package/dist/server/modules/codebase-overview-analyzer/services/evidence-query.service.js.map +1 -0
  89. package/dist/server/modules/codebase-overview-analyzer/services/go-adapter.d.ts +2 -0
  90. package/dist/server/modules/codebase-overview-analyzer/services/go-adapter.js +166 -0
  91. package/dist/server/modules/codebase-overview-analyzer/services/go-adapter.js.map +1 -0
  92. package/dist/server/modules/codebase-overview-analyzer/services/hotspot-scoring.service.d.ts +21 -0
  93. package/dist/server/modules/codebase-overview-analyzer/services/hotspot-scoring.service.js +252 -0
  94. package/dist/server/modules/codebase-overview-analyzer/services/hotspot-scoring.service.js.map +1 -0
  95. package/dist/server/modules/codebase-overview-analyzer/services/identity-resolver.service.d.ts +24 -0
  96. package/dist/server/modules/codebase-overview-analyzer/services/identity-resolver.service.js +98 -0
  97. package/dist/server/modules/codebase-overview-analyzer/services/identity-resolver.service.js.map +1 -0
  98. package/dist/server/modules/codebase-overview-analyzer/services/java-adapter.d.ts +2 -0
  99. package/dist/server/modules/codebase-overview-analyzer/services/java-adapter.js +155 -0
  100. package/dist/server/modules/codebase-overview-analyzer/services/java-adapter.js.map +1 -0
  101. package/dist/server/modules/codebase-overview-analyzer/services/language-adapter-registry.service.d.ts +19 -0
  102. package/dist/server/modules/codebase-overview-analyzer/services/language-adapter-registry.service.js +87 -0
  103. package/dist/server/modules/codebase-overview-analyzer/services/language-adapter-registry.service.js.map +1 -0
  104. package/dist/server/modules/codebase-overview-analyzer/services/php-adapter.d.ts +2 -0
  105. package/dist/server/modules/codebase-overview-analyzer/services/php-adapter.js +173 -0
  106. package/dist/server/modules/codebase-overview-analyzer/services/php-adapter.js.map +1 -0
  107. package/dist/server/modules/codebase-overview-analyzer/services/python-adapter.d.ts +2 -0
  108. package/dist/server/modules/codebase-overview-analyzer/services/python-adapter.js +171 -0
  109. package/dist/server/modules/codebase-overview-analyzer/services/python-adapter.js.map +1 -0
  110. package/dist/server/modules/codebase-overview-analyzer/services/ruby-adapter.d.ts +2 -0
  111. package/dist/server/modules/codebase-overview-analyzer/services/ruby-adapter.js +158 -0
  112. package/dist/server/modules/codebase-overview-analyzer/services/ruby-adapter.js.map +1 -0
  113. package/dist/server/modules/codebase-overview-analyzer/services/rust-adapter.d.ts +2 -0
  114. package/dist/server/modules/codebase-overview-analyzer/services/rust-adapter.js +222 -0
  115. package/dist/server/modules/codebase-overview-analyzer/services/rust-adapter.js.map +1 -0
  116. package/dist/server/modules/codebase-overview-analyzer/services/scope-auto-detector.service.d.ts +4 -0
  117. package/dist/server/modules/codebase-overview-analyzer/services/scope-auto-detector.service.js +72 -0
  118. package/dist/server/modules/codebase-overview-analyzer/services/scope-auto-detector.service.js.map +1 -0
  119. package/dist/server/modules/codebase-overview-analyzer/services/scope-resolver.service.d.ts +6 -0
  120. package/dist/server/modules/codebase-overview-analyzer/services/scope-resolver.service.js +37 -0
  121. package/dist/server/modules/codebase-overview-analyzer/services/scope-resolver.service.js.map +1 -0
  122. package/dist/server/modules/codebase-overview-analyzer/services/typescript-adapter.d.ts +2 -0
  123. package/dist/server/modules/codebase-overview-analyzer/services/typescript-adapter.js +108 -0
  124. package/dist/server/modules/codebase-overview-analyzer/services/typescript-adapter.js.map +1 -0
  125. package/dist/server/modules/codebase-overview-analyzer/types/index.d.ts +2 -0
  126. package/dist/server/modules/codebase-overview-analyzer/types/index.js +6 -0
  127. package/dist/server/modules/codebase-overview-analyzer/types/index.js.map +1 -0
  128. package/dist/server/modules/codebase-overview-analyzer/types/scope-defaults.d.ts +2 -0
  129. package/dist/server/modules/codebase-overview-analyzer/types/scope-defaults.js +13 -0
  130. package/dist/server/modules/codebase-overview-analyzer/types/scope-defaults.js.map +1 -0
  131. package/dist/server/modules/codebase-overview-analyzer/types/scope.schema.d.ts +54 -0
  132. package/dist/server/modules/codebase-overview-analyzer/types/scope.schema.js +27 -0
  133. package/dist/server/modules/codebase-overview-analyzer/types/scope.schema.js.map +1 -0
  134. package/dist/server/modules/codebase-overview-analyzer/types/scope.types.d.ts +12 -0
  135. package/dist/server/modules/codebase-overview-analyzer/types/scope.types.js +3 -0
  136. package/dist/server/modules/codebase-overview-analyzer/types/scope.types.js.map +1 -0
  137. package/dist/server/modules/codebase-overview-analyzer/utils/constants.d.ts +1 -0
  138. package/dist/server/modules/codebase-overview-analyzer/utils/constants.js +5 -0
  139. package/dist/server/modules/codebase-overview-analyzer/utils/constants.js.map +1 -0
  140. package/dist/server/modules/codebase-overview-analyzer/utils/path-matcher.d.ts +2 -0
  141. package/dist/server/modules/codebase-overview-analyzer/utils/path-matcher.js +17 -0
  142. package/dist/server/modules/codebase-overview-analyzer/utils/path-matcher.js.map +1 -0
  143. package/dist/server/modules/core/controllers/preflight.controller.d.ts +1 -1
  144. package/dist/server/modules/core/controllers/preflight.controller.js +6 -4
  145. package/dist/server/modules/core/controllers/preflight.controller.js.map +1 -1
  146. package/dist/server/modules/core/services/preflight.service.d.ts +7 -1
  147. package/dist/server/modules/core/services/preflight.service.js +127 -10
  148. package/dist/server/modules/core/services/preflight.service.js.map +1 -1
  149. package/dist/server/modules/events/catalog/agent.created.d.ts +42 -0
  150. package/dist/server/modules/events/catalog/agent.created.js +23 -0
  151. package/dist/server/modules/events/catalog/agent.created.js.map +1 -0
  152. package/dist/server/modules/events/catalog/agent.deleted.d.ts +42 -0
  153. package/dist/server/modules/events/catalog/agent.deleted.js +22 -0
  154. package/dist/server/modules/events/catalog/agent.deleted.js.map +1 -0
  155. package/dist/server/modules/events/catalog/index.d.ts +180 -0
  156. package/dist/server/modules/events/catalog/index.js +10 -0
  157. package/dist/server/modules/events/catalog/index.js.map +1 -1
  158. package/dist/server/modules/events/catalog/team.config.updated.d.ts +67 -0
  159. package/dist/server/modules/events/catalog/team.config.updated.js +21 -0
  160. package/dist/server/modules/events/catalog/team.config.updated.js.map +1 -0
  161. package/dist/server/modules/events/catalog/team.member.added.d.ts +27 -0
  162. package/dist/server/modules/events/catalog/team.member.added.js +16 -0
  163. package/dist/server/modules/events/catalog/team.member.added.js.map +1 -0
  164. package/dist/server/modules/events/catalog/team.member.removed.d.ts +27 -0
  165. package/dist/server/modules/events/catalog/team.member.removed.js +16 -0
  166. package/dist/server/modules/events/catalog/team.member.removed.js.map +1 -0
  167. package/dist/server/modules/events/controllers/event-log.controller.d.ts +1 -1
  168. package/dist/server/modules/events/controllers/event-log.controller.js +11 -9
  169. package/dist/server/modules/events/controllers/event-log.controller.js.map +1 -1
  170. package/dist/server/modules/events/dtos/event-log.dto.d.ts +1 -0
  171. package/dist/server/modules/events/services/event-log.service.js +3 -0
  172. package/dist/server/modules/events/services/event-log.service.js.map +1 -1
  173. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.d.ts +2 -1
  174. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js +30 -10
  175. package/dist/server/modules/events/subscribers/epic-assignment-notifier.subscriber.js.map +1 -1
  176. package/dist/server/modules/events/subscribers/index.js +8 -0
  177. package/dist/server/modules/events/subscribers/index.js.map +1 -1
  178. package/dist/server/modules/events/subscribers/project-state-broadcaster.subscriber.d.ts +16 -0
  179. package/dist/server/modules/events/subscribers/project-state-broadcaster.subscriber.js +101 -0
  180. package/dist/server/modules/events/subscribers/project-state-broadcaster.subscriber.js.map +1 -0
  181. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.d.ts +2 -1
  182. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js +30 -8
  183. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js.map +1 -1
  184. package/dist/server/modules/events/subscribers/sub-epic-created-notifier.subscriber.d.ts +18 -0
  185. package/dist/server/modules/events/subscribers/sub-epic-created-notifier.subscriber.js +154 -0
  186. package/dist/server/modules/events/subscribers/sub-epic-created-notifier.subscriber.js.map +1 -0
  187. package/dist/server/modules/events/subscribers/team-config-updated-notifier.subscriber.d.ts +18 -0
  188. package/dist/server/modules/events/subscribers/team-config-updated-notifier.subscriber.js +138 -0
  189. package/dist/server/modules/events/subscribers/team-config-updated-notifier.subscriber.js.map +1 -0
  190. package/dist/server/modules/events/subscribers/team-membership-changed-notifier.subscriber.d.ts +18 -0
  191. package/dist/server/modules/events/subscribers/team-membership-changed-notifier.subscriber.js +129 -0
  192. package/dist/server/modules/events/subscribers/team-membership-changed-notifier.subscriber.js.map +1 -0
  193. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +172 -0
  194. package/dist/server/modules/mcp/dtos/mcp.dto.js +69 -6
  195. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  196. package/dist/server/modules/mcp/dtos/schema-registry.js +6 -0
  197. package/dist/server/modules/mcp/dtos/schema-registry.js.map +1 -1
  198. package/dist/server/modules/mcp/mcp.module.js +2 -0
  199. package/dist/server/modules/mcp/mcp.module.js.map +1 -1
  200. package/dist/server/modules/mcp/services/handlers/chat-tools.js +117 -3
  201. package/dist/server/modules/mcp/services/handlers/chat-tools.js.map +1 -1
  202. package/dist/server/modules/mcp/services/handlers/epic-tools.js +16 -3
  203. package/dist/server/modules/mcp/services/handlers/epic-tools.js.map +1 -1
  204. package/dist/server/modules/mcp/services/handlers/prompt-tools.js +33 -1
  205. package/dist/server/modules/mcp/services/handlers/prompt-tools.js.map +1 -1
  206. package/dist/server/modules/mcp/services/handlers/teams-tools.d.ts +8 -0
  207. package/dist/server/modules/mcp/services/handlers/teams-tools.js +457 -0
  208. package/dist/server/modules/mcp/services/handlers/teams-tools.js.map +1 -0
  209. package/dist/server/modules/mcp/services/handlers/types.d.ts +2 -0
  210. package/dist/server/modules/mcp/services/instructions-resolver.d.ts +7 -3
  211. package/dist/server/modules/mcp/services/instructions-resolver.js +50 -26
  212. package/dist/server/modules/mcp/services/instructions-resolver.js.map +1 -1
  213. package/dist/server/modules/mcp/services/mcp.service.d.ts +3 -1
  214. package/dist/server/modules/mcp/services/mcp.service.js +15 -3
  215. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  216. package/dist/server/modules/mcp/tool-definitions.d.ts +501 -0
  217. package/dist/server/modules/mcp/tool-definitions.js +137 -3
  218. package/dist/server/modules/mcp/tool-definitions.js.map +1 -1
  219. package/dist/server/modules/profiles/controllers/profiles.controller.js +1 -0
  220. package/dist/server/modules/profiles/controllers/profiles.controller.js.map +1 -1
  221. package/dist/server/modules/profiles/controllers/provider-configs.controller.js +3 -0
  222. package/dist/server/modules/profiles/controllers/provider-configs.controller.js.map +1 -1
  223. package/dist/server/modules/profiles/dto.d.ts +19 -6
  224. package/dist/server/modules/profiles/dto.js +13 -15
  225. package/dist/server/modules/profiles/dto.js.map +1 -1
  226. package/dist/server/modules/projects/controllers/projects.controller.d.ts +34 -0
  227. package/dist/server/modules/projects/controllers/projects.controller.js +52 -1
  228. package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
  229. package/dist/server/modules/projects/helpers/project-export.d.ts +47 -0
  230. package/dist/server/modules/projects/helpers/project-export.js +116 -40
  231. package/dist/server/modules/projects/helpers/project-export.js.map +1 -1
  232. package/dist/server/modules/projects/helpers/project-import.d.ts +62 -0
  233. package/dist/server/modules/projects/helpers/project-import.js +191 -1
  234. package/dist/server/modules/projects/helpers/project-import.js.map +1 -1
  235. package/dist/server/modules/projects/helpers/template-loader.d.ts +13 -0
  236. package/dist/server/modules/projects/helpers/template-loader.js +60 -1
  237. package/dist/server/modules/projects/helpers/template-loader.js.map +1 -1
  238. package/dist/server/modules/projects/projects.module.js +2 -1
  239. package/dist/server/modules/projects/projects.module.js.map +1 -1
  240. package/dist/server/modules/projects/services/projects.service.d.ts +41 -1
  241. package/dist/server/modules/projects/services/projects.service.js +9 -2
  242. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  243. package/dist/server/modules/providers/adapters/gemini.adapter.js +2 -2
  244. package/dist/server/modules/providers/adapters/gemini.adapter.js.map +1 -1
  245. package/dist/server/modules/providers/controllers/providers.controller.js +7 -0
  246. package/dist/server/modules/providers/controllers/providers.controller.js.map +1 -1
  247. package/dist/server/modules/providers/services/provider-project-sync.service.js +5 -3
  248. package/dist/server/modules/providers/services/provider-project-sync.service.js.map +1 -1
  249. package/dist/server/modules/registry/controllers/templates.controller.d.ts +153 -0
  250. package/dist/server/modules/registry/controllers/templates.controller.js +56 -0
  251. package/dist/server/modules/registry/controllers/templates.controller.js.map +1 -1
  252. package/dist/server/modules/seeders/seeders/0007_seed_claude_no_flicker_env.d.ts +3 -0
  253. package/dist/server/modules/seeders/seeders/0007_seed_claude_no_flicker_env.js +28 -0
  254. package/dist/server/modules/seeders/seeders/0007_seed_claude_no_flicker_env.js.map +1 -0
  255. package/dist/server/modules/seeders/services/data-seeder.service.js +2 -0
  256. package/dist/server/modules/seeders/services/data-seeder.service.js.map +1 -1
  257. package/dist/server/modules/session-reader/data/pricing.json +137 -8
  258. package/dist/server/modules/sessions/services/sessions.service.d.ts +1 -0
  259. package/dist/server/modules/sessions/services/sessions.service.js +26 -5
  260. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  261. package/dist/server/modules/sessions/utils/template-renderer.d.ts +6 -0
  262. package/dist/server/modules/sessions/utils/template-renderer.js +15 -10
  263. package/dist/server/modules/sessions/utils/template-renderer.js.map +1 -1
  264. package/dist/server/modules/storage/db/schema.d.ts +440 -0
  265. package/dist/server/modules/storage/db/schema.js +65 -1
  266. package/dist/server/modules/storage/db/schema.js.map +1 -1
  267. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +1 -0
  268. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  269. package/dist/server/modules/storage/local/delegates/agent.delegate.js +40 -15
  270. package/dist/server/modules/storage/local/delegates/agent.delegate.js.map +1 -1
  271. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.d.ts +1 -0
  272. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.js +28 -11
  273. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.js.map +1 -1
  274. package/dist/server/modules/storage/local/delegates/project.delegate.js +10 -0
  275. package/dist/server/modules/storage/local/delegates/project.delegate.js.map +1 -1
  276. package/dist/server/modules/storage/local/delegates/provider.delegate.js +38 -10
  277. package/dist/server/modules/storage/local/delegates/provider.delegate.js.map +1 -1
  278. package/dist/server/modules/storage/local/helpers/storage-helpers.d.ts +2 -0
  279. package/dist/server/modules/storage/local/helpers/storage-helpers.js +36 -0
  280. package/dist/server/modules/storage/local/helpers/storage-helpers.js.map +1 -1
  281. package/dist/server/modules/storage/models/domain.models.d.ts +62 -0
  282. package/dist/server/modules/subscribers/services/subscriber-executor.service.d.ts +6 -2
  283. package/dist/server/modules/subscribers/services/subscriber-executor.service.js +52 -5
  284. package/dist/server/modules/subscribers/services/subscriber-executor.service.js.map +1 -1
  285. package/dist/server/modules/teams/controllers/teams.controller.d.ts +39 -0
  286. package/dist/server/modules/teams/controllers/teams.controller.js +214 -0
  287. package/dist/server/modules/teams/controllers/teams.controller.js.map +1 -0
  288. package/dist/server/modules/teams/services/teams.service.d.ts +106 -0
  289. package/dist/server/modules/teams/services/teams.service.js +748 -0
  290. package/dist/server/modules/teams/services/teams.service.js.map +1 -0
  291. package/dist/server/modules/teams/storage/teams.store.d.ts +58 -0
  292. package/dist/server/modules/teams/storage/teams.store.js +468 -0
  293. package/dist/server/modules/teams/storage/teams.store.js.map +1 -0
  294. package/dist/server/modules/teams/teams.module.d.ts +2 -0
  295. package/dist/server/modules/teams/teams.module.js +27 -0
  296. package/dist/server/modules/teams/teams.module.js.map +1 -0
  297. package/dist/server/templates/3-agents-dev.json +74 -41
  298. package/dist/server/templates/5-agents-dev.json +212 -151
  299. package/dist/server/templates/teams-dev.json +1096 -0
  300. package/dist/server/tsconfig.tsbuildinfo +1 -1
  301. package/dist/server/ui/assets/{ReviewDetailPage-lzvMi5Ex.js → ReviewDetailPage-CEMxN6RQ.js} +1 -1
  302. package/dist/server/ui/assets/{ReviewsPage-_tz-XI0o.js → ReviewsPage-BzMksnGd.js} +1 -1
  303. package/dist/server/ui/assets/index-ChJ1IUMI.css +32 -0
  304. package/dist/server/ui/assets/index-Csagg3g2.js +1027 -0
  305. package/dist/server/ui/assets/{useReviewSubscription-C3UHhiQv.js → useReviewSubscription-B2ejeWE4.js} +1 -1
  306. package/dist/server/ui/index.html +2 -2
  307. package/dist/templates/3-agents-dev.json +74 -41
  308. package/dist/templates/5-agents-dev.json +212 -151
  309. package/dist/templates/teams-dev.json +1096 -0
  310. package/package.json +28 -2
  311. package/dist/server/ui/assets/index-C99ggRaD.css +0 -32
  312. package/dist/server/ui/assets/index-CTOev9rG.js +0 -1012
  313. /package/dist/drizzle/{0050_providers_one_million_context.sql → 0052_providers_one_million_context.sql} +0 -0
  314. /package/dist/drizzle/{0051_providers_auto_compact_threshold_1m.sql → 0053_providers_auto_compact_threshold_1m.sql} +0 -0
@@ -0,0 +1,748 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.TeamsService = void 0;
49
+ const common_1 = require("@nestjs/common");
50
+ const core_1 = require("@nestjs/core");
51
+ const error_types_1 = require("../../../common/errors/error-types");
52
+ const sessions_service_1 = require("../../sessions/services/sessions.service");
53
+ const storage_interface_1 = require("../../storage/interfaces/storage.interface");
54
+ const teams_store_1 = require("../storage/teams.store");
55
+ const events_service_1 = require("../../events/services/events.service");
56
+ const logger_1 = require("../../../common/logging/logger");
57
+ const logger = (0, logger_1.createLogger)('TeamsService');
58
+ let TeamsService = class TeamsService {
59
+ constructor(teamsStore, storage, moduleRef, eventsService) {
60
+ this.teamsStore = teamsStore;
61
+ this.storage = storage;
62
+ this.moduleRef = moduleRef;
63
+ this.eventsService = eventsService;
64
+ }
65
+ getSessionsService() {
66
+ if (!this.sessionsServiceRef) {
67
+ this.sessionsServiceRef = this.moduleRef.get(sessions_service_1.SessionsService, { strict: false });
68
+ }
69
+ return this.sessionsServiceRef;
70
+ }
71
+ async createTeam(data) {
72
+ const uniqueMembers = [...new Set(data.memberAgentIds)];
73
+ const uniqueProfileIds = data.profileIds ? [...new Set(data.profileIds)] : undefined;
74
+ const teamLeadAgentId = data.teamLeadAgentId ?? null;
75
+ if (uniqueMembers.length < 1) {
76
+ throw new error_types_1.ValidationError('A team must have at least 1 member');
77
+ }
78
+ if (teamLeadAgentId !== null && !uniqueMembers.includes(teamLeadAgentId)) {
79
+ throw new error_types_1.ValidationError('Team lead must be included in the members list');
80
+ }
81
+ await this.validateAgentsInProject(data.projectId, uniqueMembers);
82
+ if (uniqueProfileIds && uniqueProfileIds.length > 0) {
83
+ await this.validateProfilesInProject(data.projectId, uniqueProfileIds);
84
+ }
85
+ const dedupedSelections = this.dedupeProfileConfigSelections(data.profileConfigSelections);
86
+ if (dedupedSelections && dedupedSelections.length > 0) {
87
+ const effectiveProfileIds = uniqueProfileIds ?? [];
88
+ this.validateSelectionsAgainstProfiles(dedupedSelections, effectiveProfileIds);
89
+ await this.validateConfigProfileConsistency(dedupedSelections);
90
+ }
91
+ const filteredSelections = dedupedSelections?.filter((s) => s.configIds.length > 0);
92
+ const effectiveMaxMembers = data.maxMembers ?? 5;
93
+ const effectiveMaxConcurrentTasks = data.maxConcurrentTasks ?? effectiveMaxMembers;
94
+ if (effectiveMaxConcurrentTasks > effectiveMaxMembers) {
95
+ throw new error_types_1.ValidationError('maxConcurrentTasks cannot exceed maxMembers');
96
+ }
97
+ const nonLeadCount = uniqueMembers.filter((id) => id !== teamLeadAgentId).length;
98
+ if (nonLeadCount > effectiveMaxMembers) {
99
+ throw new error_types_1.ValidationError('Initial team exceeds maxMembers');
100
+ }
101
+ return this.teamsStore.createTeam({
102
+ ...data,
103
+ teamLeadAgentId,
104
+ maxMembers: effectiveMaxMembers,
105
+ maxConcurrentTasks: effectiveMaxConcurrentTasks,
106
+ memberAgentIds: uniqueMembers,
107
+ profileIds: uniqueProfileIds,
108
+ profileConfigSelections: filteredSelections,
109
+ });
110
+ }
111
+ async getTeam(id) {
112
+ return this.teamsStore.getTeam(id);
113
+ }
114
+ async listTeams(projectId, options) {
115
+ const result = await this.teamsStore.listTeams(projectId, options);
116
+ const agentsResult = await this.storage.listAgents(projectId, {
117
+ limit: 1000,
118
+ });
119
+ const agentNameMap = new Map(agentsResult.items.map((a) => [a.id, a.name]));
120
+ return {
121
+ ...result,
122
+ items: result.items.map((team) => ({
123
+ ...team,
124
+ teamLeadAgentName: team.teamLeadAgentId
125
+ ? (agentNameMap.get(team.teamLeadAgentId) ?? null)
126
+ : null,
127
+ })),
128
+ };
129
+ }
130
+ async findTeamByExactName(projectId, name) {
131
+ return this.teamsStore.findTeamByExactName(projectId, name.trim());
132
+ }
133
+ async updateTeam(id, data) {
134
+ const current = await this.teamsStore.getTeam(id);
135
+ if (!current) {
136
+ const { NotFoundError } = await Promise.resolve().then(() => __importStar(require('../../../common/errors/error-types')));
137
+ throw new NotFoundError('Team', id);
138
+ }
139
+ const dedupedMembers = data.memberAgentIds ? [...new Set(data.memberAgentIds)] : undefined;
140
+ const dedupedProfileIds = data.profileIds ? [...new Set(data.profileIds)] : undefined;
141
+ const effectiveMembers = dedupedMembers ?? current.members.map((m) => m.agentId);
142
+ const effectiveLead = data.teamLeadAgentId !== undefined ? data.teamLeadAgentId : current.teamLeadAgentId;
143
+ if (dedupedMembers !== undefined && effectiveMembers.length < 1) {
144
+ throw new error_types_1.ValidationError('A team must have at least 1 member');
145
+ }
146
+ if (effectiveLead !== null && !effectiveMembers.includes(effectiveLead)) {
147
+ throw new error_types_1.ValidationError('Team lead must be included in the members list');
148
+ }
149
+ if (dedupedMembers !== undefined) {
150
+ await this.validateAgentsInProject(current.projectId, effectiveMembers);
151
+ }
152
+ else if (data.teamLeadAgentId !== undefined && effectiveLead !== null) {
153
+ await this.validateAgentsInProject(current.projectId, [effectiveLead]);
154
+ }
155
+ if (dedupedProfileIds !== undefined && dedupedProfileIds.length > 0) {
156
+ await this.validateProfilesInProject(current.projectId, dedupedProfileIds);
157
+ }
158
+ const dedupedSelections = this.dedupeProfileConfigSelections(data.profileConfigSelections);
159
+ if (dedupedSelections && dedupedSelections.length > 0) {
160
+ const effectiveProfileIds = dedupedProfileIds ?? current.profileIds;
161
+ this.validateSelectionsAgainstProfiles(dedupedSelections, effectiveProfileIds);
162
+ await this.validateConfigProfileConsistency(dedupedSelections);
163
+ }
164
+ const filteredSelections = dedupedSelections !== undefined
165
+ ? dedupedSelections.filter((s) => s.configIds.length > 0)
166
+ : undefined;
167
+ const eMM = data.maxMembers ?? current.maxMembers;
168
+ const eMCT = data.maxConcurrentTasks ?? current.maxConcurrentTasks;
169
+ if (eMCT > eMM) {
170
+ throw new error_types_1.ValidationError('maxConcurrentTasks cannot exceed maxMembers');
171
+ }
172
+ if (dedupedMembers !== undefined ||
173
+ data.teamLeadAgentId !== undefined ||
174
+ data.maxMembers !== undefined) {
175
+ const finalNonLeadCount = effectiveMembers.filter((mid) => mid !== effectiveLead).length;
176
+ if (finalNonLeadCount > eMM) {
177
+ throw new error_types_1.ValidationError('Team member count exceeds maxMembers');
178
+ }
179
+ }
180
+ const storeData = dedupedMembers !== undefined
181
+ ? {
182
+ ...data,
183
+ memberAgentIds: dedupedMembers,
184
+ profileIds: dedupedProfileIds,
185
+ profileConfigSelections: filteredSelections,
186
+ }
187
+ : { ...data, profileIds: dedupedProfileIds, profileConfigSelections: filteredSelections };
188
+ const previousMaxMembers = current.maxMembers;
189
+ const previousMaxConcurrentTasks = current.maxConcurrentTasks;
190
+ const previousAllowTeamLeadCreateAgents = current.allowTeamLeadCreateAgents;
191
+ const result = await this.teamsStore.updateTeam(id, storeData);
192
+ if (result.maxMembers !== previousMaxMembers ||
193
+ result.maxConcurrentTasks !== previousMaxConcurrentTasks ||
194
+ result.allowTeamLeadCreateAgents !== previousAllowTeamLeadCreateAgents) {
195
+ try {
196
+ await this.eventsService?.publish('team.config.updated', {
197
+ teamId: id,
198
+ projectId: current.projectId,
199
+ teamLeadAgentId: result.teamLeadAgentId,
200
+ teamName: result.name,
201
+ previous: {
202
+ maxMembers: previousMaxMembers,
203
+ maxConcurrentTasks: previousMaxConcurrentTasks,
204
+ allowTeamLeadCreateAgents: previousAllowTeamLeadCreateAgents,
205
+ },
206
+ current: {
207
+ maxMembers: result.maxMembers,
208
+ maxConcurrentTasks: result.maxConcurrentTasks,
209
+ allowTeamLeadCreateAgents: result.allowTeamLeadCreateAgents,
210
+ },
211
+ });
212
+ }
213
+ catch {
214
+ }
215
+ }
216
+ if (dedupedMembers !== undefined) {
217
+ const previousMemberIds = new Set(current.members.map((m) => m.agentId));
218
+ const nextMemberIds = new Set(dedupedMembers);
219
+ const addedAgentIds = [...nextMemberIds].filter((aid) => !previousMemberIds.has(aid));
220
+ const removedAgentIds = [...previousMemberIds].filter((aid) => !nextMemberIds.has(aid));
221
+ for (const agentId of addedAgentIds) {
222
+ try {
223
+ const agent = await this.storage.getAgent(agentId).catch(() => null);
224
+ await this.eventsService?.publish('team.member.added', {
225
+ teamId: id,
226
+ projectId: current.projectId,
227
+ teamLeadAgentId: result.teamLeadAgentId,
228
+ teamName: result.name,
229
+ addedAgentId: agentId,
230
+ addedAgentName: agent?.name ?? null,
231
+ });
232
+ }
233
+ catch {
234
+ }
235
+ }
236
+ for (const agentId of removedAgentIds) {
237
+ try {
238
+ const agent = await this.storage.getAgent(agentId).catch(() => null);
239
+ await this.eventsService?.publish('team.member.removed', {
240
+ teamId: id,
241
+ projectId: current.projectId,
242
+ teamLeadAgentId: result.teamLeadAgentId,
243
+ teamName: result.name,
244
+ removedAgentId: agentId,
245
+ removedAgentName: agent?.name ?? null,
246
+ });
247
+ }
248
+ catch {
249
+ }
250
+ }
251
+ }
252
+ return result;
253
+ }
254
+ async disbandTeam(id) {
255
+ return this.teamsStore.deleteTeam(id);
256
+ }
257
+ async deleteTeamsByProject(projectId) {
258
+ return this.teamsStore.deleteTeamsByProject(projectId);
259
+ }
260
+ async deleteTeamsByIds(ids) {
261
+ if (!ids || ids.length === 0)
262
+ return;
263
+ return this.teamsStore.deleteTeamsByIds(ids);
264
+ }
265
+ async listTeamsByAgent(agentId) {
266
+ return this.teamsStore.listTeamsByAgent(agentId);
267
+ }
268
+ async countBusyTeamMembers(teamId, teamLeadAgentId) {
269
+ return this.teamsStore.countBusyTeamMembers(teamId, teamLeadAgentId);
270
+ }
271
+ async canDeleteAgent(agentId) {
272
+ const leadTeams = await this.teamsStore.getTeamLeadTeams(agentId);
273
+ return {
274
+ canDelete: true,
275
+ blockingTeams: leadTeams.map((t) => t.name),
276
+ };
277
+ }
278
+ async listConfigsVisibleToLead(leadAgentId, projectId) {
279
+ const ledTeams = await this.teamsStore.getTeamLeadTeams(leadAgentId);
280
+ const projectTeams = ledTeams.filter((t) => t.projectId === projectId);
281
+ if (projectTeams.length === 0) {
282
+ return {
283
+ error: {
284
+ code: 'FORBIDDEN_NOT_TEAM_LEAD',
285
+ message: 'You do not lead any teams in this project',
286
+ },
287
+ };
288
+ }
289
+ const seen = new Set();
290
+ const configs = [];
291
+ for (const team of projectTeams) {
292
+ const teamConfigs = await this.teamsStore.listConfigsForTeam(team.id);
293
+ for (const config of teamConfigs) {
294
+ const profile = await this.storage.getAgentProfile(config.profileId);
295
+ const key = `${config.name.trim().toLowerCase()}|${profile.name.trim().toLowerCase()}|${team.name.trim().toLowerCase()}`;
296
+ if (!seen.has(key)) {
297
+ seen.add(key);
298
+ configs.push({
299
+ configName: config.name,
300
+ description: config.description,
301
+ profileName: profile.name,
302
+ teamName: team.name,
303
+ });
304
+ }
305
+ }
306
+ }
307
+ return configs;
308
+ }
309
+ async resolveLedTeam(leadAgentId, projectId, teamName) {
310
+ const ledTeams = await this.teamsStore.getTeamLeadTeams(leadAgentId);
311
+ const projectTeams = ledTeams.filter((t) => t.projectId === projectId);
312
+ if (projectTeams.length === 0) {
313
+ return {
314
+ error: {
315
+ code: 'FORBIDDEN_NOT_TEAM_LEAD',
316
+ message: 'You do not lead any teams in this project',
317
+ },
318
+ };
319
+ }
320
+ if (teamName) {
321
+ const trimmedName = teamName.trim().toLowerCase();
322
+ const matches = projectTeams.filter((t) => t.name.trim().toLowerCase() === trimmedName);
323
+ if (matches.length === 0) {
324
+ return {
325
+ error: {
326
+ code: 'TEAM_NOT_FOUND_OR_NOT_LED',
327
+ message: `No team named "${teamName}" found among teams you lead`,
328
+ },
329
+ };
330
+ }
331
+ return { team: matches[0] };
332
+ }
333
+ if (projectTeams.length === 1) {
334
+ return { team: projectTeams[0] };
335
+ }
336
+ return {
337
+ error: {
338
+ code: 'AMBIGUOUS_TEAM_LEAD',
339
+ message: 'You lead multiple teams. Specify teamName to disambiguate.',
340
+ data: { candidates: projectTeams.map((t) => ({ teamName: t.name })) },
341
+ },
342
+ };
343
+ }
344
+ async createTeamAgent(input) {
345
+ const teamResult = await this.resolveLedTeam(input.leadAgentId, input.projectId, input.teamName);
346
+ if ('error' in teamResult)
347
+ return teamResult;
348
+ const { team } = teamResult;
349
+ if (!team.allowTeamLeadCreateAgents) {
350
+ return {
351
+ error: {
352
+ code: 'TEAM_LEAD_CREATION_DISABLED',
353
+ message: 'Team does not allow lead-initiated agent creation',
354
+ data: { teamId: team.id, teamName: team.name },
355
+ },
356
+ };
357
+ }
358
+ const teamConfigs = await this.teamsStore.listConfigsForTeam(team.id);
359
+ const configsWithProfiles = [];
360
+ for (const config of teamConfigs) {
361
+ const profile = await this.storage.getAgentProfile(config.profileId);
362
+ configsWithProfiles.push({
363
+ id: config.id,
364
+ profileId: config.profileId,
365
+ name: config.name,
366
+ description: config.description,
367
+ profileName: profile.name,
368
+ });
369
+ }
370
+ const trimmedConfigName = input.configName.trim().toLowerCase();
371
+ let candidates = configsWithProfiles.filter((c) => c.name.trim().toLowerCase() === trimmedConfigName);
372
+ if (input.profileName) {
373
+ const trimmedProfileName = input.profileName.trim().toLowerCase();
374
+ candidates = candidates.filter((c) => c.profileName.trim().toLowerCase() === trimmedProfileName);
375
+ }
376
+ if (candidates.length === 0) {
377
+ return {
378
+ error: {
379
+ code: 'CONFIG_NOT_FOUND',
380
+ message: `No provider configuration named "${input.configName}" found for this team`,
381
+ },
382
+ };
383
+ }
384
+ if (candidates.length > 1) {
385
+ return {
386
+ error: {
387
+ code: 'AMBIGUOUS_CONFIG_NAME',
388
+ message: `Multiple configurations named "${input.configName}" found. Specify profileName to disambiguate.`,
389
+ data: {
390
+ candidates: candidates.map((c) => ({
391
+ configName: c.name,
392
+ profileName: c.profileName,
393
+ })),
394
+ },
395
+ },
396
+ };
397
+ }
398
+ const resolved = candidates[0];
399
+ const { items: existingAgents } = await this.storage.listAgents(input.projectId, {
400
+ limit: 10000,
401
+ });
402
+ const trimmedAgentName = input.name.trim().toLowerCase();
403
+ if (existingAgents.some((a) => a.name.trim().toLowerCase() === trimmedAgentName)) {
404
+ return {
405
+ error: {
406
+ code: 'AGENT_NAME_EXISTS',
407
+ message: `An agent named "${input.name}" already exists in this project`,
408
+ },
409
+ };
410
+ }
411
+ const effectiveDescription = input.description?.trim() || resolved.description?.trim() || '';
412
+ let agent;
413
+ try {
414
+ agent = await this.teamsStore.createTeamAgentAtomicCapped({
415
+ teamId: team.id,
416
+ maxMembers: team.maxMembers,
417
+ teamLeadAgentId: team.teamLeadAgentId,
418
+ createAgentFn: () => this.storage.createAgent({
419
+ projectId: input.projectId,
420
+ profileId: resolved.profileId,
421
+ providerConfigId: resolved.id,
422
+ name: input.name,
423
+ description: effectiveDescription,
424
+ }),
425
+ });
426
+ }
427
+ catch (error) {
428
+ if (error instanceof error_types_1.TeamMemberCapReachedError) {
429
+ return {
430
+ error: {
431
+ code: 'TEAM_MEMBER_CAP_REACHED',
432
+ message: error.message,
433
+ data: error.details,
434
+ },
435
+ };
436
+ }
437
+ throw error;
438
+ }
439
+ try {
440
+ await this.eventsService?.publish('agent.created', {
441
+ agentId: agent.id,
442
+ agentName: agent.name,
443
+ projectId: input.projectId,
444
+ profileId: resolved.profileId,
445
+ providerConfigId: resolved.id,
446
+ actor: { type: 'agent', id: input.leadAgentId },
447
+ });
448
+ }
449
+ catch (error) {
450
+ logger.error({ agentId: agent.id, projectId: input.projectId, error }, 'Failed to publish agent.created event');
451
+ }
452
+ try {
453
+ await this.eventsService?.publish('team.member.added', {
454
+ teamId: team.id,
455
+ projectId: input.projectId,
456
+ teamLeadAgentId: team.teamLeadAgentId,
457
+ teamName: team.name,
458
+ addedAgentId: agent.id,
459
+ addedAgentName: agent.name,
460
+ });
461
+ }
462
+ catch (error) {
463
+ logger.error({ agentId: agent.id, projectId: input.projectId, teamId: team.id, error }, 'Failed to publish team.member.added event');
464
+ }
465
+ return {
466
+ agent: {
467
+ id: agent.id,
468
+ name: agent.name,
469
+ description: agent.description,
470
+ profileName: resolved.profileName,
471
+ configName: resolved.name,
472
+ },
473
+ teamName: team.name,
474
+ };
475
+ }
476
+ async createTeamAgentForRest(input) {
477
+ const team = await this.teamsStore.getTeam(input.teamId);
478
+ if (!team || team.projectId !== input.projectId) {
479
+ throw new error_types_1.NotFoundError('Team');
480
+ }
481
+ if (team.teamLeadAgentId === null) {
482
+ throw new error_types_1.ValidationError('Team has no lead');
483
+ }
484
+ if (input.actorLeadAgentId !== team.teamLeadAgentId) {
485
+ throw new error_types_1.ValidationError('Not team lead');
486
+ }
487
+ const config = await this.storage.getProfileProviderConfig(input.providerConfigId);
488
+ const profile = await this.storage.getAgentProfile(config.profileId);
489
+ if (profile.projectId !== team.projectId) {
490
+ throw new error_types_1.NotFoundError('Provider config');
491
+ }
492
+ const teamProfileIds = await this.teamsStore.listProfilesForTeam(input.teamId);
493
+ if (!teamProfileIds.includes(config.profileId)) {
494
+ throw new error_types_1.ValidationError('Profile not linked to team');
495
+ }
496
+ const { items: existingAgents } = await this.storage.listAgents(input.projectId, {
497
+ limit: 10000,
498
+ });
499
+ const trimmedName = input.name.trim().toLowerCase();
500
+ if (existingAgents.some((a) => a.name.trim().toLowerCase() === trimmedName)) {
501
+ throw new error_types_1.ConflictError(`An agent named "${input.name}" already exists in this project`);
502
+ }
503
+ const effectiveDescription = input.description?.trim() || config.description?.trim() || '';
504
+ let agent;
505
+ try {
506
+ agent = await this.teamsStore.createTeamAgentAtomicCapped({
507
+ teamId: input.teamId,
508
+ maxMembers: team.maxMembers,
509
+ teamLeadAgentId: team.teamLeadAgentId,
510
+ createAgentFn: () => this.storage.createAgent({
511
+ projectId: input.projectId,
512
+ profileId: config.profileId,
513
+ providerConfigId: input.providerConfigId,
514
+ name: input.name,
515
+ description: effectiveDescription,
516
+ }),
517
+ });
518
+ }
519
+ catch (error) {
520
+ if (error instanceof error_types_1.TeamMemberCapReachedError) {
521
+ throw new error_types_1.ConflictError('Team is at member cap');
522
+ }
523
+ throw error;
524
+ }
525
+ try {
526
+ await this.eventsService?.publish('agent.created', {
527
+ agentId: agent.id,
528
+ agentName: agent.name,
529
+ projectId: input.projectId,
530
+ profileId: config.profileId,
531
+ providerConfigId: input.providerConfigId,
532
+ actor: { type: 'agent', id: input.actorLeadAgentId },
533
+ });
534
+ }
535
+ catch (error) {
536
+ logger.error({ agentId: agent.id, projectId: input.projectId, error }, 'Failed to publish agent.created event');
537
+ }
538
+ try {
539
+ await this.eventsService?.publish('team.member.added', {
540
+ teamId: input.teamId,
541
+ projectId: input.projectId,
542
+ teamLeadAgentId: team.teamLeadAgentId,
543
+ teamName: team.name,
544
+ addedAgentId: agent.id,
545
+ addedAgentName: agent.name,
546
+ });
547
+ }
548
+ catch {
549
+ }
550
+ return agent;
551
+ }
552
+ async deleteTeamAgent(input) {
553
+ const teamResult = await this.resolveLedTeam(input.leadAgentId, input.projectId, input.teamName);
554
+ if ('error' in teamResult)
555
+ return teamResult;
556
+ const { team } = teamResult;
557
+ const teamDetail = await this.teamsStore.getTeam(team.id);
558
+ if (!teamDetail) {
559
+ return { error: { code: 'TEAM_NOT_FOUND_OR_NOT_LED', message: 'Team no longer exists' } };
560
+ }
561
+ const memberAgentIds = teamDetail.members.map((m) => m.agentId);
562
+ const { items: projectAgents } = await this.storage.listAgents(input.projectId, {
563
+ limit: 10000,
564
+ });
565
+ const memberAgents = projectAgents.filter((a) => memberAgentIds.includes(a.id));
566
+ const trimmedName = input.name.trim().toLowerCase();
567
+ const nameMatches = memberAgents.filter((a) => a.name.trim().toLowerCase() === trimmedName);
568
+ if (nameMatches.length === 0) {
569
+ return {
570
+ error: {
571
+ code: 'AGENT_NOT_FOUND_IN_TEAM',
572
+ message: `No agent named "${input.name}" found in team "${team.name}"`,
573
+ },
574
+ };
575
+ }
576
+ if (nameMatches.length > 1) {
577
+ return {
578
+ error: {
579
+ code: 'AMBIGUOUS_AGENT_NAME',
580
+ message: `Multiple agents named "${input.name}" found in team "${team.name}". Cannot disambiguate.`,
581
+ },
582
+ };
583
+ }
584
+ const targetAgent = nameMatches[0];
585
+ if (targetAgent.id === team.teamLeadAgentId) {
586
+ return {
587
+ error: {
588
+ code: 'CANNOT_DELETE_TEAM_LEAD',
589
+ message: `Cannot delete "${targetAgent.name}" — they are the team lead of "${team.name}"`,
590
+ },
591
+ };
592
+ }
593
+ const agentTeams = await this.teamsStore.listTeamsByAgent(targetAgent.id);
594
+ for (const agentTeam of agentTeams) {
595
+ if (agentTeam.id === team.id)
596
+ continue;
597
+ if (agentTeam.teamLeadAgentId === targetAgent.id) {
598
+ return {
599
+ error: {
600
+ code: 'TARGET_LEADS_OTHER_TEAM',
601
+ message: `Cannot delete "${targetAgent.name}" — they lead team "${agentTeam.name}"`,
602
+ },
603
+ };
604
+ }
605
+ return {
606
+ error: {
607
+ code: 'TARGET_BELONGS_TO_OTHER_TEAM',
608
+ message: `Cannot delete "${targetAgent.name}" — they also belong to team "${agentTeam.name}". Remove them from that team first.`,
609
+ },
610
+ };
611
+ }
612
+ try {
613
+ const sessionsService = this.getSessionsService();
614
+ const activeSessions = await sessionsService.listActiveSessions(input.projectId, new Set([targetAgent.id]));
615
+ for (const session of activeSessions) {
616
+ try {
617
+ await sessionsService.terminateSession(session.id);
618
+ }
619
+ catch (error) {
620
+ logger.error({ sessionId: session.id, agentId: targetAgent.id, error }, 'Failed to terminate session before agent deletion');
621
+ }
622
+ }
623
+ }
624
+ catch (error) {
625
+ logger.error({ agentId: targetAgent.id, error }, 'Failed to list active sessions before agent deletion');
626
+ }
627
+ const preDeleteData = {
628
+ teamId: team.id,
629
+ teamName: team.name,
630
+ teamLeadAgentId: team.teamLeadAgentId,
631
+ removedAgentId: targetAgent.id,
632
+ removedAgentName: targetAgent.name,
633
+ };
634
+ try {
635
+ await this.storage.deleteAgent(targetAgent.id);
636
+ }
637
+ catch (error) {
638
+ if (error instanceof error_types_1.ConflictError) {
639
+ return {
640
+ error: { code: 'AGENT_HAS_RUNNING_SESSIONS', message: error.message },
641
+ };
642
+ }
643
+ throw error;
644
+ }
645
+ try {
646
+ await this.eventsService?.publish('team.member.removed', {
647
+ teamId: preDeleteData.teamId,
648
+ projectId: input.projectId,
649
+ teamLeadAgentId: preDeleteData.teamLeadAgentId,
650
+ teamName: preDeleteData.teamName,
651
+ removedAgentId: preDeleteData.removedAgentId,
652
+ removedAgentName: preDeleteData.removedAgentName,
653
+ });
654
+ }
655
+ catch (error) {
656
+ logger.error({ agentId: targetAgent.id, teamId: team.id, error }, 'Failed to publish team.member.removed event');
657
+ }
658
+ try {
659
+ await this.eventsService?.publish('agent.deleted', {
660
+ agentId: targetAgent.id,
661
+ agentName: targetAgent.name,
662
+ projectId: input.projectId,
663
+ actor: { type: 'agent', id: input.leadAgentId },
664
+ teamId: team.id,
665
+ teamName: team.name,
666
+ });
667
+ }
668
+ catch (error) {
669
+ logger.error({ agentId: targetAgent.id, projectId: input.projectId, error }, 'Failed to publish agent.deleted event');
670
+ }
671
+ return {
672
+ result: {
673
+ deletedAgentId: targetAgent.id,
674
+ deletedAgentName: targetAgent.name,
675
+ teamName: team.name,
676
+ },
677
+ };
678
+ }
679
+ async validateAgentsInProject(projectId, agentIds) {
680
+ for (const agentId of agentIds) {
681
+ const agent = await this.storage.getAgent(agentId);
682
+ if (agent.projectId !== projectId) {
683
+ throw new error_types_1.ValidationError(`Agent "${agent.name}" belongs to a different project`, {
684
+ agentId,
685
+ expectedProjectId: projectId,
686
+ actualProjectId: agent.projectId,
687
+ });
688
+ }
689
+ }
690
+ }
691
+ async validateProfilesInProject(projectId, profileIds) {
692
+ const uniqueIds = [...new Set(profileIds)];
693
+ for (const profileId of uniqueIds) {
694
+ const profile = await this.storage.getAgentProfile(profileId);
695
+ if (profile.projectId !== projectId) {
696
+ throw new error_types_1.ValidationError(`Profile "${profile.name}" belongs to a different project`, {
697
+ profileId,
698
+ expectedProjectId: projectId,
699
+ actualProjectId: profile.projectId,
700
+ });
701
+ }
702
+ }
703
+ }
704
+ dedupeProfileConfigSelections(selections) {
705
+ if (!selections)
706
+ return undefined;
707
+ const seen = new Set();
708
+ const result = [];
709
+ for (const sel of selections) {
710
+ if (seen.has(sel.profileId))
711
+ continue;
712
+ seen.add(sel.profileId);
713
+ result.push({ profileId: sel.profileId, configIds: [...new Set(sel.configIds)] });
714
+ }
715
+ return result;
716
+ }
717
+ validateSelectionsAgainstProfiles(selections, effectiveProfileIds) {
718
+ const profileIdSet = new Set(effectiveProfileIds);
719
+ for (const sel of selections) {
720
+ if (!profileIdSet.has(sel.profileId)) {
721
+ throw new error_types_1.ValidationError(`Config selection references profile "${sel.profileId}" which is not linked to this team`, { profileId: sel.profileId });
722
+ }
723
+ }
724
+ }
725
+ async validateConfigProfileConsistency(selections) {
726
+ for (const sel of selections) {
727
+ for (const configId of sel.configIds) {
728
+ const config = await this.storage.getProfileProviderConfig(configId);
729
+ if (config.profileId !== sel.profileId) {
730
+ throw new error_types_1.ValidationError(`Config "${configId}" belongs to profile "${config.profileId}", not "${sel.profileId}"`, {
731
+ configId,
732
+ expectedProfileId: sel.profileId,
733
+ actualProfileId: config.profileId,
734
+ });
735
+ }
736
+ }
737
+ }
738
+ }
739
+ };
740
+ exports.TeamsService = TeamsService;
741
+ exports.TeamsService = TeamsService = __decorate([
742
+ (0, common_1.Injectable)(),
743
+ __param(1, (0, common_1.Inject)(storage_interface_1.STORAGE_SERVICE)),
744
+ __param(3, (0, common_1.Optional)()),
745
+ __metadata("design:paramtypes", [teams_store_1.TeamsStore, Object, core_1.ModuleRef,
746
+ events_service_1.EventsService])
747
+ ], TeamsService);
748
+ //# sourceMappingURL=teams.service.js.map