crewly 1.13.1 → 1.14.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 (424) hide show
  1. package/config/constants.ts +8 -0
  2. package/config/roles/orchestrator/prompt.md +23 -0
  3. package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
  4. package/config/skills/agent/core/reply-channel/execute.sh +14 -2
  5. package/config/skills/agent/core/slack-post/SKILL.md +126 -0
  6. package/config/skills/agent/core/slack-post/execute.sh +127 -0
  7. package/config/skills/agent/remote-browser/SKILL.md +178 -0
  8. package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
  9. package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
  10. package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
  11. package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
  12. package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
  13. package/config/slack-app-manifest.json +7 -1
  14. package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
  15. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
  16. package/dist/backend/backend/src/config/oauth.config.js +121 -19
  17. package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
  18. package/dist/backend/backend/src/constants.d.ts +60 -0
  19. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  20. package/dist/backend/backend/src/constants.js +74 -0
  21. package/dist/backend/backend/src/constants.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
  24. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
  27. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/slack/slack.controller.js +342 -0
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  31. package/dist/backend/backend/src/index.d.ts.map +1 -1
  32. package/dist/backend/backend/src/index.js +23 -7
  33. package/dist/backend/backend/src/index.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
  35. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
  37. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
  40. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
  42. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
  44. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
  46. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
  48. package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +110 -1
  56. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
  58. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
  60. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  61. package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
  62. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  64. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  67. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  68. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
  70. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  72. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  74. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
  76. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
  78. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  79. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  80. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  82. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  83. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
  84. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
  85. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
  86. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
  87. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
  88. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
  90. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  91. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  92. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  93. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
  94. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  95. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  97. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  99. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  100. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
  101. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  102. package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
  103. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
  105. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  106. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
  107. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
  109. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  110. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
  111. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
  113. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  114. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +15 -2
  115. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +33 -7
  117. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
  118. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
  119. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
  121. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  122. package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
  123. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  124. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  125. package/dist/backend/build-info.json +2 -2
  126. package/dist/backend/config/constants.d.ts +8 -0
  127. package/dist/backend/config/constants.d.ts.map +1 -1
  128. package/dist/backend/config/constants.js +8 -0
  129. package/dist/backend/config/constants.js.map +1 -1
  130. package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
  131. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
  132. package/dist/cli/backend/src/config/oauth.config.js +121 -19
  133. package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
  134. package/dist/cli/backend/src/constants.d.ts +60 -0
  135. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  136. package/dist/cli/backend/src/constants.js +74 -0
  137. package/dist/cli/backend/src/constants.js.map +1 -1
  138. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
  139. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  140. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
  141. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  142. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  143. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  144. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  145. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  146. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +57 -0
  147. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +110 -1
  149. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
  151. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +43 -0
  153. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  154. package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
  155. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  156. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  157. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  158. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  160. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  161. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  162. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  164. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  166. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  167. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  168. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  169. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  170. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
  172. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  173. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  174. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  175. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  176. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  177. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  178. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
  179. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  180. package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
  181. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  182. package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
  183. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  184. package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
  185. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  186. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  187. package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
  188. package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
  189. package/dist/cli/backend/src/utils/team.utils.js +66 -0
  190. package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
  191. package/dist/cli/cli/src/index.js +0 -0
  192. package/dist/cli/config/constants.d.ts +8 -0
  193. package/dist/cli/config/constants.d.ts.map +1 -1
  194. package/dist/cli/config/constants.js +8 -0
  195. package/dist/cli/config/constants.js.map +1 -1
  196. package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
  197. package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
  198. package/frontend/dist/index.html +2 -2
  199. package/package.json +1 -1
  200. package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
  201. package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
  202. package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
  203. package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
  204. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
  205. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
  206. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
  207. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
  208. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
  209. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
  210. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
  211. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
  212. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
  213. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
  214. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
  215. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
  216. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  217. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  218. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  219. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  220. package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
  221. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
  222. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
  223. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
  224. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
  225. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  226. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  227. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  228. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  229. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  230. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  231. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  232. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  233. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  234. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  235. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  236. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  237. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  238. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  239. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  240. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  241. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  242. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  243. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  244. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  245. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  246. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  247. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  248. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  249. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  250. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  251. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  252. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  253. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  254. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  255. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  256. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  257. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  258. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  259. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  260. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  261. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  262. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  263. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  264. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  265. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  266. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  267. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  268. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  269. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  270. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  271. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  272. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  273. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  274. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  275. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  276. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  277. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  278. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  279. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  280. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  281. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  282. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  283. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  284. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  285. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  286. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  287. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  288. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  289. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  290. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  291. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  292. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  293. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  294. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  295. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  296. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  297. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  298. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  299. package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
  300. package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  301. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  302. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  303. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
  304. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  305. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  306. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  307. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  308. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  309. package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
  310. package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
  311. package/dist/backend/backend/src/services/knowledge/index.js +0 -8
  312. package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
  313. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  314. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  315. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  316. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  317. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  318. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  319. package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
  320. package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  321. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  322. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  323. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
  324. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  325. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  326. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  327. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  328. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  329. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
  330. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  331. package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
  332. package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
  333. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
  334. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  335. package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
  336. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
  337. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  338. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  339. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  340. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  341. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  342. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  343. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  344. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  345. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  346. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  347. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  348. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  349. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
  350. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
  351. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
  352. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
  353. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
  354. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
  355. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
  356. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
  357. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  358. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  359. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  360. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  361. package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
  362. package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
  363. package/dist/backend/backend/src/types/knowledge.types.js +0 -38
  364. package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
  365. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  366. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  367. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  368. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  369. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  370. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  371. package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
  372. package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  373. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  374. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  375. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
  376. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  377. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  378. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  379. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  380. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  381. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  382. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  383. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  384. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  385. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  386. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  387. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  388. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  389. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  390. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  391. package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
  392. package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  393. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  394. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  395. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  396. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  397. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  398. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  399. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
  400. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  401. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  402. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  403. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  404. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  405. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  406. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  407. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  408. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  409. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  410. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  411. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  412. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  413. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  414. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  415. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  416. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  417. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  418. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  419. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  420. package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
  421. package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
  422. package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
  423. package/dist/cli/backend/src/types/knowledge.types.js +0 -38
  424. package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Slack Agent Post Service — an agent starting a Slack conversation itself.
3
+ *
4
+ * Everything else in the Slack layer is reactive: a message arrives, an agent
5
+ * answers. This is the other direction. An agent calls the `slack-post` skill
6
+ * and the message goes to a channel or into a DM, under the agent's own
7
+ * identity when it has one.
8
+ *
9
+ * Target syntax (one string, so the skill stays a one-liner):
10
+ *
11
+ * | Target | Meaning |
12
+ * |---|---|
13
+ * | `#general`, `general` | public/private channel by name (lower-case) |
14
+ * | `C0123ABCD` | channel by id (upper-case) |
15
+ * | `D0123ABCD` | an already-open DM channel |
16
+ * | `@sam`, `U0123ABCD` | DM that person |
17
+ *
18
+ * Identity: an agent with a Cloud-provisioned Slack app posts with its own
19
+ * bot token, so a DM is a real conversation between the person and that agent.
20
+ * Without one it falls back to the shared Crewly bot with the agent's name and
21
+ * icon — visually similar, but the DM is Crewly's, not the agent's.
22
+ *
23
+ * @module services/slack/slack-agent-post.service
24
+ */
25
+ import type { Team } from '../../types/index.js';
26
+ import type { SlackChannelInfo, SlackOutgoingMessage } from '../../types/slack.types.js';
27
+ import type { SlackAgentIdentityService } from './slack-agent-identity.service.js';
28
+ /** The slice of SlackService this service uses. */
29
+ export interface AgentPostSlackApi {
30
+ isConnected(): boolean;
31
+ sendMessage(message: SlackOutgoingMessage): Promise<string>;
32
+ findChannelByName(name: string): Promise<SlackChannelInfo | null>;
33
+ openDirectMessage(userId: string, botToken?: string): Promise<string>;
34
+ findUserByHandle(handle: string): Promise<string | null>;
35
+ }
36
+ /** The slice of the identity service this service uses. */
37
+ export type AgentPostIdentityApi = Pick<SlackAgentIdentityService, 'load' | 'getInstalled'>;
38
+ /** Storage slice — used to give a token-less agent its name and icon. */
39
+ export interface AgentPostStorageApi {
40
+ getTeams(): Promise<Team[]>;
41
+ }
42
+ /** Constructor dependencies. */
43
+ export interface SlackAgentPostServiceDeps {
44
+ slack: AgentPostSlackApi;
45
+ storage: AgentPostStorageApi;
46
+ identities?: AgentPostIdentityApi | null;
47
+ }
48
+ /** One post request. */
49
+ export interface SlackAgentPostRequest {
50
+ /** The agent asking (its session name). */
51
+ agentSession: string;
52
+ /** Channel or person — see the table in the module docs. */
53
+ target: string;
54
+ text: string;
55
+ /** Reply inside an existing Slack thread. */
56
+ threadTs?: string;
57
+ }
58
+ /** What happened. */
59
+ export interface SlackAgentPostResult {
60
+ channelId: string;
61
+ messageTs: string;
62
+ kind: 'channel' | 'dm';
63
+ /** `agent` when the agent's own bot posted, `crewly` for the shared bot. */
64
+ postedAs: 'agent' | 'crewly';
65
+ /** Display name the message carries. */
66
+ identity: string;
67
+ }
68
+ /** Reasons a post can be refused, for HTTP mapping. */
69
+ export type SlackAgentPostErrorCode = 'validation' | 'not_connected' | 'target_not_found' | 'slack_error';
70
+ /** Structured failure. */
71
+ export declare class SlackAgentPostError extends Error {
72
+ readonly code: SlackAgentPostErrorCode;
73
+ constructor(code: SlackAgentPostErrorCode, message: string);
74
+ }
75
+ /**
76
+ * Service — see module docs.
77
+ */
78
+ export declare class SlackAgentPostService {
79
+ private readonly logger;
80
+ private readonly deps;
81
+ constructor(deps: SlackAgentPostServiceDeps);
82
+ /**
83
+ * Send one agent-initiated message.
84
+ *
85
+ * @param req - Who is posting, where, and what
86
+ * @returns Where it landed and which identity carried it
87
+ * @throws {SlackAgentPostError} `validation` for bad input, `not_connected`
88
+ * when Slack is not up, `target_not_found` when the channel or person
89
+ * cannot be resolved, `slack_error` when Slack refuses the send
90
+ */
91
+ post(req: SlackAgentPostRequest): Promise<SlackAgentPostResult>;
92
+ /**
93
+ * Which identity this agent posts under: its own bot token when installed,
94
+ * otherwise the shared bot with the member's name and icon.
95
+ */
96
+ private resolveIdentity;
97
+ /** The team member behind a session, for name and avatar. */
98
+ private findMember;
99
+ /**
100
+ * Turn a target string into a Slack conversation id.
101
+ *
102
+ * @param target - See the table in the module docs
103
+ * @param botToken - Token to open the DM with, so the DM belongs to the agent
104
+ * @returns The conversation id and whether it is a channel or a DM
105
+ */
106
+ private resolveTarget;
107
+ private openDm;
108
+ private lookupHandle;
109
+ /** Turn Slack's send errors into something an agent can act on. */
110
+ private explainSendFailure;
111
+ }
112
+ /**
113
+ * Install the process-wide instance (composition root).
114
+ *
115
+ * @param service - The service or null
116
+ */
117
+ export declare function setSlackAgentPostService(service: SlackAgentPostService | null): void;
118
+ /**
119
+ * The process-wide instance, or null before wiring.
120
+ *
121
+ * @returns The service or null
122
+ */
123
+ export declare function getSlackAgentPostService(): SlackAgentPostService | null;
124
+ //# sourceMappingURL=slack-agent-post.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-agent-post.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-post.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAIzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAEnF,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,WAAW,IAAI,OAAO,CAAC;IACvB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC;AAE5F,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC7B;AAED,gCAAgC;AAChC,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAwB;AACxB,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uDAAuD;AACvD,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAE1G,0BAA0B;AAC1B,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,uBAAuB;gBAA7B,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM;CAKlB;AAUD;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;gBAErC,IAAI,EAAE,yBAAyB;IAK3C;;;;;;;;OAQG;IACG,IAAI,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+CrE;;;OAGG;YACW,eAAe;IAqB7B,6DAA6D;YAC/C,UAAU;IAexB;;;;;;OAMG;YACW,aAAa;YA8Bb,MAAM;YAeN,YAAY;IAQ1B,mEAAmE;IACnE,OAAO,CAAC,kBAAkB;CAW3B;AAYD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Slack Agent Post Service — an agent starting a Slack conversation itself.
3
+ *
4
+ * Everything else in the Slack layer is reactive: a message arrives, an agent
5
+ * answers. This is the other direction. An agent calls the `slack-post` skill
6
+ * and the message goes to a channel or into a DM, under the agent's own
7
+ * identity when it has one.
8
+ *
9
+ * Target syntax (one string, so the skill stays a one-liner):
10
+ *
11
+ * | Target | Meaning |
12
+ * |---|---|
13
+ * | `#general`, `general` | public/private channel by name (lower-case) |
14
+ * | `C0123ABCD` | channel by id (upper-case) |
15
+ * | `D0123ABCD` | an already-open DM channel |
16
+ * | `@sam`, `U0123ABCD` | DM that person |
17
+ *
18
+ * Identity: an agent with a Cloud-provisioned Slack app posts with its own
19
+ * bot token, so a DM is a real conversation between the person and that agent.
20
+ * Without one it falls back to the shared Crewly bot with the agent's name and
21
+ * icon — visually similar, but the DM is Crewly's, not the agent's.
22
+ *
23
+ * @module services/slack/slack-agent-post.service
24
+ */
25
+ import { LoggerService } from '../core/logger.service.js';
26
+ import { SLACK_AGENT_POST_CONSTANTS } from '../../constants.js';
27
+ import { slackIdentityFor } from './slack-team-channel.service.js';
28
+ /** Structured failure. */
29
+ export class SlackAgentPostError extends Error {
30
+ code;
31
+ constructor(code, message) {
32
+ super(message);
33
+ this.code = code;
34
+ this.name = 'SlackAgentPostError';
35
+ }
36
+ }
37
+ // Case is the discriminator, and it is reliable: Slack ids are uppercase,
38
+ // while Slack forces channel names to lowercase. Matching case-insensitively
39
+ // would swallow ordinary names — `general` is `G` followed by six
40
+ // alphanumerics, so it would have been read as a private-channel id.
41
+ const CHANNEL_ID_RE = /^[CG][A-Z0-9]{6,}$/;
42
+ const DM_ID_RE = /^D[A-Z0-9]{6,}$/;
43
+ const USER_ID_RE = /^[UW][A-Z0-9]{6,}$/;
44
+ /**
45
+ * Service — see module docs.
46
+ */
47
+ export class SlackAgentPostService {
48
+ logger;
49
+ deps;
50
+ constructor(deps) {
51
+ this.deps = deps;
52
+ this.logger = LoggerService.getInstance().createComponentLogger('SlackAgentPost');
53
+ }
54
+ /**
55
+ * Send one agent-initiated message.
56
+ *
57
+ * @param req - Who is posting, where, and what
58
+ * @returns Where it landed and which identity carried it
59
+ * @throws {SlackAgentPostError} `validation` for bad input, `not_connected`
60
+ * when Slack is not up, `target_not_found` when the channel or person
61
+ * cannot be resolved, `slack_error` when Slack refuses the send
62
+ */
63
+ async post(req) {
64
+ const agentSession = (req.agentSession ?? '').trim();
65
+ const target = (req.target ?? '').trim();
66
+ const text = req.text ?? '';
67
+ if (!agentSession)
68
+ throw new SlackAgentPostError('validation', 'agentSession is required');
69
+ if (!target)
70
+ throw new SlackAgentPostError('validation', 'target is required');
71
+ if (!text.trim())
72
+ throw new SlackAgentPostError('validation', 'text is required');
73
+ if (text.length > SLACK_AGENT_POST_CONSTANTS.MAX_TEXT_LENGTH) {
74
+ throw new SlackAgentPostError('validation', `text exceeds ${SLACK_AGENT_POST_CONSTANTS.MAX_TEXT_LENGTH} characters`);
75
+ }
76
+ if (!this.deps.slack.isConnected()) {
77
+ throw new SlackAgentPostError('not_connected', 'Slack is not connected');
78
+ }
79
+ const { identity, botToken, postedAs } = await this.resolveIdentity(agentSession);
80
+ const { channelId, kind } = await this.resolveTarget(target, botToken);
81
+ let messageTs;
82
+ try {
83
+ messageTs = await this.deps.slack.sendMessage({
84
+ channelId,
85
+ text,
86
+ threadTs: req.threadTs,
87
+ // The chat-v2 mirror attributes outbound Slack replies to the
88
+ // orchestrator, which would misfile an agent's own post. Team-channel
89
+ // traffic is mirrored by its own path; this one stays Slack-only.
90
+ skipChatV2Mirror: true,
91
+ ...identity,
92
+ });
93
+ }
94
+ catch (err) {
95
+ throw new SlackAgentPostError('slack_error', this.explainSendFailure(err, kind, postedAs));
96
+ }
97
+ this.logger.info('Agent posted to Slack', {
98
+ agentSession,
99
+ channelId,
100
+ kind,
101
+ postedAs,
102
+ threaded: !!req.threadTs,
103
+ chars: text.length,
104
+ });
105
+ return { channelId, messageTs, kind, postedAs, identity: identity.username ?? agentSession };
106
+ }
107
+ /**
108
+ * Which identity this agent posts under: its own bot token when installed,
109
+ * otherwise the shared bot with the member's name and icon.
110
+ */
111
+ async resolveIdentity(agentSession) {
112
+ if (this.deps.identities) {
113
+ await this.deps.identities.load();
114
+ const installed = this.deps.identities.getInstalled(agentSession);
115
+ if (installed) {
116
+ const member = await this.findMember(agentSession);
117
+ return {
118
+ identity: { botToken: installed.botToken, username: member?.name ?? agentSession },
119
+ botToken: installed.botToken,
120
+ postedAs: 'agent',
121
+ };
122
+ }
123
+ }
124
+ const member = await this.findMember(agentSession);
125
+ return { identity: slackIdentityFor(member, agentSession), postedAs: 'crewly' };
126
+ }
127
+ /** The team member behind a session, for name and avatar. */
128
+ async findMember(agentSession) {
129
+ try {
130
+ const teams = await this.deps.storage.getTeams();
131
+ for (const team of teams) {
132
+ const member = team.members?.find((m) => m.sessionName === agentSession);
133
+ if (member)
134
+ return member;
135
+ }
136
+ }
137
+ catch (err) {
138
+ this.logger.debug('Could not read teams for agent identity', {
139
+ error: err instanceof Error ? err.message : String(err),
140
+ });
141
+ }
142
+ return undefined;
143
+ }
144
+ /**
145
+ * Turn a target string into a Slack conversation id.
146
+ *
147
+ * @param target - See the table in the module docs
148
+ * @param botToken - Token to open the DM with, so the DM belongs to the agent
149
+ * @returns The conversation id and whether it is a channel or a DM
150
+ */
151
+ async resolveTarget(target, botToken) {
152
+ if (DM_ID_RE.test(target))
153
+ return { channelId: target, kind: 'dm' };
154
+ if (CHANNEL_ID_RE.test(target))
155
+ return { channelId: target, kind: 'channel' };
156
+ if (USER_ID_RE.test(target))
157
+ return { channelId: await this.openDm(target, botToken), kind: 'dm' };
158
+ if (target.startsWith('@')) {
159
+ const handle = target.slice(1);
160
+ const userId = await this.lookupHandle(handle);
161
+ if (!userId)
162
+ throw new SlackAgentPostError('target_not_found', `No Slack user matches "@${handle}"`);
163
+ return { channelId: await this.openDm(userId, botToken), kind: 'dm' };
164
+ }
165
+ const name = target.replace(/^#/, '');
166
+ let channel;
167
+ try {
168
+ channel = await this.deps.slack.findChannelByName(name);
169
+ }
170
+ catch (err) {
171
+ const text = errText(err);
172
+ // Resolving a name needs channels:read / groups:read. Say so, rather
173
+ // than handing the agent a bare Slack error code it cannot act on.
174
+ const hint = /missing_scope/.test(text)
175
+ ? ' — the app is missing channels:read; reinstall it to pick up the new scopes, or pass the channel id instead'
176
+ : '';
177
+ throw new SlackAgentPostError('slack_error', `Could not look up channel "#${name}": ${text}${hint}`);
178
+ }
179
+ if (!channel)
180
+ throw new SlackAgentPostError('target_not_found', `No Slack channel named "#${name}"`);
181
+ if (channel.isArchived)
182
+ throw new SlackAgentPostError('target_not_found', `Channel "#${name}" is archived`);
183
+ return { channelId: channel.id, kind: 'channel' };
184
+ }
185
+ async openDm(userId, botToken) {
186
+ try {
187
+ return await this.deps.slack.openDirectMessage(userId, botToken);
188
+ }
189
+ catch (err) {
190
+ const text = errText(err);
191
+ if (/missing_scope/.test(text)) {
192
+ throw new SlackAgentPostError('slack_error', 'Slack refused to open the DM: the app is missing the im:write scope — reinstall it to pick up the new scopes');
193
+ }
194
+ throw new SlackAgentPostError('slack_error', `Could not open a DM with ${userId}: ${text}`);
195
+ }
196
+ }
197
+ async lookupHandle(handle) {
198
+ try {
199
+ return await this.deps.slack.findUserByHandle(handle);
200
+ }
201
+ catch (err) {
202
+ throw new SlackAgentPostError('slack_error', `Could not look up "@${handle}": ${errText(err)}`);
203
+ }
204
+ }
205
+ /** Turn Slack's send errors into something an agent can act on. */
206
+ explainSendFailure(err, kind, postedAs) {
207
+ const text = errText(err);
208
+ if (/not_in_channel|channel_not_found/.test(text) && kind === 'channel') {
209
+ const who = postedAs === 'agent' ? "this agent's Slack bot" : 'the Crewly bot';
210
+ return `Slack refused the post (${text}): invite ${who} into the channel, or use a public channel (chat:write.public covers those)`;
211
+ }
212
+ if (/missing_scope/.test(text)) {
213
+ return `Slack refused the post (${text}): reinstall the app to pick up the new scopes`;
214
+ }
215
+ return `Slack refused the post: ${text}`;
216
+ }
217
+ }
218
+ function errText(err) {
219
+ if (err && typeof err === 'object') {
220
+ const data = err.data;
221
+ if (typeof data?.error === 'string')
222
+ return data.error;
223
+ }
224
+ return err instanceof Error ? err.message : String(err);
225
+ }
226
+ let instance = null;
227
+ /**
228
+ * Install the process-wide instance (composition root).
229
+ *
230
+ * @param service - The service or null
231
+ */
232
+ export function setSlackAgentPostService(service) {
233
+ instance = service;
234
+ }
235
+ /**
236
+ * The process-wide instance, or null before wiring.
237
+ *
238
+ * @returns The service or null
239
+ */
240
+ export function getSlackAgentPostService() {
241
+ return instance;
242
+ }
243
+ //# sourceMappingURL=slack-agent-post.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-agent-post.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-post.service.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,17 @@ export interface SlackInitOptions {
70
70
  * ```
71
71
  */
72
72
  export declare function initializeSlackIfConfigured(options?: SlackInitOptions): Promise<SlackInitResult>;
73
+ /**
74
+ * Wire and start the Slack team-channel service (one Slack channel + one
75
+ * chat-v2 huddle per team). Idempotent — safe to call from both the boot
76
+ * path and the `/connect` route. Never throws: team channels are an
77
+ * optional layer on top of the orchestrator bridge, so a failure here
78
+ * must not take the Slack connection down with it.
79
+ *
80
+ * Dependencies are imported lazily so this module stays cheap to load in
81
+ * unit tests that only exercise credential resolution.
82
+ */
83
+ export declare function startSlackTeamChannels(): Promise<void>;
73
84
  /**
74
85
  * Gracefully shutdown Slack integration
75
86
  *
@@ -1 +1 @@
1
- {"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA4B1B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
1
+ {"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqD5D;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
@@ -108,6 +108,7 @@ export async function initializeSlackIfConfigured(options) {
108
108
  bridge.setMessageQueueService(options.messageQueueService);
109
109
  }
110
110
  await bridge.initialize();
111
+ await startSlackTeamChannels();
111
112
  logger.info('Successfully connected');
112
113
  return { attempted: true, success: true };
113
114
  }
@@ -117,6 +118,61 @@ export async function initializeSlackIfConfigured(options) {
117
118
  return { attempted: true, success: false, error: errorMessage };
118
119
  }
119
120
  }
121
+ /**
122
+ * Wire and start the Slack team-channel service (one Slack channel + one
123
+ * chat-v2 huddle per team). Idempotent — safe to call from both the boot
124
+ * path and the `/connect` route. Never throws: team channels are an
125
+ * optional layer on top of the orchestrator bridge, so a failure here
126
+ * must not take the Slack connection down with it.
127
+ *
128
+ * Dependencies are imported lazily so this module stays cheap to load in
129
+ * unit tests that only exercise credential resolution.
130
+ */
131
+ export async function startSlackTeamChannels() {
132
+ try {
133
+ const [{ SlackTeamChannelService, getSlackTeamChannelService, setSlackTeamChannelService }, { SlackAgentIdentityService, getSlackAgentIdentityService, setSlackAgentIdentityService }, { SlackAgentPostService, getSlackAgentPostService, setSlackAgentPostService }, { getChatV2Service }, { getChatV2RealtimeDeps }, { StorageService }, { CloudClientService },] = await Promise.all([
134
+ import('./slack-team-channel.service.js'),
135
+ import('./slack-agent-identity.service.js'),
136
+ import('./slack-agent-post.service.js'),
137
+ import('../chat-v2/chat-v2.singleton.js'),
138
+ import('../chat-v2/chat-v2.realtime-holder.js'),
139
+ import('../core/storage.service.js'),
140
+ import('../cloud/cloud-client.service.js'),
141
+ ]);
142
+ // Real per-agent identities live behind the Cloud login; the service is
143
+ // always constructed and simply reports unavailable until then.
144
+ let identities = getSlackAgentIdentityService();
145
+ if (!identities) {
146
+ identities = new SlackAgentIdentityService({ cloud: CloudClientService.getInstance() });
147
+ setSlackAgentIdentityService(identities);
148
+ }
149
+ // Agent-initiated posts (the `slack-post` skill).
150
+ if (!getSlackAgentPostService()) {
151
+ setSlackAgentPostService(new SlackAgentPostService({
152
+ slack: getSlackService(),
153
+ storage: StorageService.getInstance(),
154
+ identities,
155
+ }));
156
+ }
157
+ let service = getSlackTeamChannelService();
158
+ if (!service) {
159
+ service = new SlackTeamChannelService({
160
+ slack: getSlackService(),
161
+ chat: getChatV2Service(),
162
+ storage: StorageService.getInstance(),
163
+ getDispatcher: () => getChatV2RealtimeDeps().dispatcher ?? null,
164
+ identities,
165
+ });
166
+ setSlackTeamChannelService(service);
167
+ }
168
+ await service.start();
169
+ }
170
+ catch (error) {
171
+ logger.warn('Slack team channels not started', {
172
+ error: error instanceof Error ? error.message : String(error),
173
+ });
174
+ }
175
+ }
120
176
  /**
121
177
  * Gracefully shutdown Slack integration
122
178
  *
@@ -1 +1 @@
1
- {"version":3,"file":"slack-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Slack mention resolver for team channels.
3
+ *
4
+ * Agents are not Slack users, so a message like `@sam 看一下这个` arrives as
5
+ * plain text. This module finds every `@name` token in a Slack message and
6
+ * maps it to a Crewly agent session, and for names that match nothing it
7
+ * offers "did you mean" suggestions (bounded Levenshtein distance) so the
8
+ * bridge can answer a typo instead of silently ignoring it.
9
+ *
10
+ * Pure functions, no I/O — the bridge supplies the candidate list from the
11
+ * team's members.
12
+ *
13
+ * @module services/slack/slack-mention-resolver
14
+ */
15
+ /** One agent the resolver may match against. */
16
+ export interface MentionCandidate {
17
+ /** Display name as configured on the team member (e.g. `Sam`). */
18
+ name: string;
19
+ /** Agent session name (e.g. `crewly-alpha-sam`). */
20
+ sessionName: string;
21
+ /**
22
+ * The agent's own Slack bot user id when it has a real identity. A native
23
+ * Slack mention arrives as `<@U…>` and is matched here first.
24
+ */
25
+ botUserId?: string;
26
+ }
27
+ /** An `@name` that matched no candidate, with close alternatives. */
28
+ export interface UnknownMention {
29
+ /** The token as typed, without the `@`. */
30
+ token: string;
31
+ /** Candidate display names within the edit-distance cutoff, best first. */
32
+ suggestions: string[];
33
+ }
34
+ /** Result of {@link resolveSlackMentions}. */
35
+ export interface ResolvedSlackMentions {
36
+ /** Session names of matched agents, in first-mention order, deduped. */
37
+ mentions: string[];
38
+ /** Tokens that matched nobody. */
39
+ unknown: UnknownMention[];
40
+ }
41
+ /** Options for {@link resolveSlackMentions}. */
42
+ export interface ResolveSlackMentionsOptions {
43
+ /** Max edit distance for a suggestion (default from constants). */
44
+ maxDistance?: number;
45
+ /** Max suggestions per unknown token (default from constants). */
46
+ maxSuggestions?: number;
47
+ }
48
+ /**
49
+ * Extract the user ids of native `<@U…>` mentions, in order, deduped.
50
+ *
51
+ * @param text - Slack message text
52
+ * @returns Slack user ids
53
+ */
54
+ export declare function extractNativeMentionIds(text: string): string[];
55
+ /**
56
+ * Levenshtein edit distance between two strings, compared case-insensitively.
57
+ *
58
+ * @param a - First string
59
+ * @param b - Second string
60
+ * @returns The minimum number of single-character edits to turn `a` into `b`
61
+ */
62
+ export declare function levenshtein(a: string, b: string): number;
63
+ /**
64
+ * The aliases a candidate answers to: its display name, the name with
65
+ * whitespace removed, its full session name, and the short session
66
+ * segment (`crewly-alpha-sam` → `sam`, matching the orchestrator bridge's
67
+ * existing `@name` rule). All lower-cased.
68
+ *
69
+ * @param candidate - The agent
70
+ * @returns Distinct lower-case aliases
71
+ */
72
+ export declare function candidateAliases(candidate: MentionCandidate): string[];
73
+ /**
74
+ * Extract the raw `@name` tokens from a message, in order, deduped
75
+ * case-insensitively, with Slack's reserved words removed.
76
+ *
77
+ * @param text - Slack message text
78
+ * @returns Tokens without the leading `@`
79
+ */
80
+ export declare function extractMentionTokens(text: string): string[];
81
+ /**
82
+ * Map every `@name` in `text` to an agent session.
83
+ *
84
+ * Exact (case-insensitive) alias matches win. A token that matches no
85
+ * alias is reported under `unknown` with up to `maxSuggestions` candidate
86
+ * display names within `maxDistance` edits, closest first.
87
+ *
88
+ * @param text - Slack message text
89
+ * @param candidates - The agents that can be mentioned (team members)
90
+ * @param options - Distance and suggestion caps
91
+ * @returns Matched sessions and unknown tokens
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * resolveSlackMentions('@sam @lee 看一下', [
96
+ * { name: 'Sam', sessionName: 'crewly-alpha-sam' },
97
+ * { name: 'Leo', sessionName: 'crewly-alpha-leo' },
98
+ * ]);
99
+ * // → { mentions: ['crewly-alpha-sam'], unknown: [{ token: 'lee', suggestions: ['Leo'] }] }
100
+ * ```
101
+ */
102
+ export declare function resolveSlackMentions(text: string, candidates: MentionCandidate[], options?: ResolveSlackMentionsOptions): ResolvedSlackMentions;
103
+ //# sourceMappingURL=slack-mention-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-mention-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-mention-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAmBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAgBtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY3D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,gBAAgB,EAAE,EAC9B,OAAO,GAAE,2BAAgC,GACxC,qBAAqB,CAqDvB"}