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,209 @@
1
+ /**
2
+ * Slack Agent Identity Service — one real Slack bot user per agent.
3
+ *
4
+ * Crewly Cloud (`/api/cloud/slack/*`) creates one Slack app per agent with
5
+ * the owner's app configuration token, hands back an install link, and after
6
+ * the owner's one consent click holds the agent's bot token. This service is
7
+ * the OSS half:
8
+ *
9
+ * - talks to Cloud with the OSS install's Cloud access token;
10
+ * - caches identities (bot user id, bot token) in
11
+ * `~/.crewly/slack-agent-identities.json` (mode 0600) so posting works
12
+ * without a Cloud round-trip;
13
+ * - polls Cloud while any install is pending so a click on the link shows
14
+ * up here within ~30 s;
15
+ * - remembers where each install link was announced and which channels the
16
+ * bot has been invited into, so the team-channel service does each once.
17
+ *
18
+ * Team channels use it to post replies as the agent (its own token) and to
19
+ * resolve native `<@U…>` mentions. Everything degrades gracefully: with no
20
+ * Cloud login or no identity, replies fall back to the cosmetic
21
+ * username/icon override.
22
+ *
23
+ * @module services/slack/slack-agent-identity.service
24
+ */
25
+ import type { SlackAgentIdentityRecord, SlackAgentIdentitiesFile } from '../../types/slack.types.js';
26
+ /** The slice of CloudClientService this service needs. */
27
+ export interface IdentityCloudClient {
28
+ isConnected(): boolean;
29
+ getToken(): string | null;
30
+ getCloudUrl(): string | null;
31
+ }
32
+ /** Constructor dependencies. */
33
+ export interface SlackAgentIdentityServiceDeps {
34
+ cloud: IdentityCloudClient;
35
+ storePath?: string;
36
+ fetchImpl?: typeof fetch;
37
+ now?: () => number;
38
+ /** Timer override for tests. */
39
+ setInterval?: typeof setInterval;
40
+ clearInterval?: typeof clearInterval;
41
+ }
42
+ /** Cloud's config-token status. */
43
+ export interface CloudConfigTokenStatus {
44
+ configured: boolean;
45
+ status?: 'ok' | 'invalid';
46
+ expiresAt?: string;
47
+ lastError?: string;
48
+ }
49
+ /** Cloud's `/slack/status` payload. */
50
+ export interface CloudSlackStatus {
51
+ enabled: boolean;
52
+ configToken: CloudConfigTokenStatus;
53
+ agents: {
54
+ total: number;
55
+ installed: number;
56
+ pending: number;
57
+ };
58
+ }
59
+ /** Error from Cloud with the stable code it returned. */
60
+ export declare class SlackIdentityCloudError extends Error {
61
+ readonly status: number;
62
+ readonly code: string;
63
+ constructor(status: number, code: string, message: string);
64
+ }
65
+ /**
66
+ * Service — see module docs.
67
+ */
68
+ export declare class SlackAgentIdentityService {
69
+ private readonly logger;
70
+ private readonly deps;
71
+ private readonly storePath;
72
+ private readonly fetchImpl;
73
+ private store;
74
+ private loading;
75
+ private pollTimer;
76
+ private pollingSince;
77
+ private readonly listeners;
78
+ constructor(deps: SlackAgentIdentityServiceDeps);
79
+ /**
80
+ * Whether Cloud can be reached (logged in with a token).
81
+ *
82
+ * @returns True when the OSS install is connected to Crewly Cloud
83
+ */
84
+ isAvailable(): boolean;
85
+ /**
86
+ * Register a callback for the moment an identity becomes installed
87
+ * (bot user id + token known). The team-channel service uses it to invite
88
+ * the new bot into its channels.
89
+ *
90
+ * @param listener - Called with the installed record
91
+ * @returns Unsubscribe
92
+ */
93
+ onInstalled(listener: (record: SlackAgentIdentityRecord) => void): () => void;
94
+ /**
95
+ * Cloud-side status: whether the feature is enabled there, whether this
96
+ * account has a config token, and agent counts.
97
+ *
98
+ * @returns The status
99
+ * @throws {SlackIdentityCloudError} on a Cloud failure
100
+ */
101
+ getCloudStatus(): Promise<CloudSlackStatus>;
102
+ /**
103
+ * Store the owner's Slack app configuration token on Cloud (validated
104
+ * there by rotating it once).
105
+ *
106
+ * @param token - Config access token (may be empty/expired)
107
+ * @param refreshToken - Config refresh token (required)
108
+ * @returns The stored token's status
109
+ */
110
+ setConfigToken(token: string, refreshToken: string): Promise<CloudConfigTokenStatus>;
111
+ /**
112
+ * Remove the config token on Cloud.
113
+ *
114
+ * @returns True when one existed
115
+ */
116
+ deleteConfigToken(): Promise<boolean>;
117
+ /**
118
+ * Ask Cloud for an identity for an agent (idempotent). Returns the cached
119
+ * record updated with Cloud's answer, including `installUrl` while the
120
+ * install is pending.
121
+ *
122
+ * @param agentSession - Stable agent id
123
+ * @param displayName - Name the bot will carry in Slack
124
+ * @param description - Optional app description
125
+ * @returns The record
126
+ */
127
+ provision(agentSession: string, displayName: string, description?: string): Promise<SlackAgentIdentityRecord>;
128
+ /**
129
+ * Pull every identity (with tokens) from Cloud into the local cache.
130
+ * Newly installed ones fire {@link onInstalled}.
131
+ *
132
+ * @returns All records after the merge
133
+ */
134
+ refreshFromCloud(): Promise<SlackAgentIdentityRecord[]>;
135
+ /**
136
+ * Delete an agent's Slack app on Cloud and forget it locally.
137
+ *
138
+ * @param agentSession - The agent
139
+ * @returns True when a record existed on Cloud
140
+ */
141
+ remove(agentSession: string): Promise<boolean>;
142
+ /**
143
+ * All cached identities (tokens included — callers must not log them).
144
+ *
145
+ * @returns Copies
146
+ */
147
+ list(): Promise<SlackAgentIdentityRecord[]>;
148
+ /**
149
+ * Cached identity for an agent, if any. Synchronous read of the loaded
150
+ * cache (call {@link list} or any Cloud method first to load it).
151
+ *
152
+ * @param agentSession - The agent
153
+ * @returns The record or null
154
+ */
155
+ get(agentSession: string): SlackAgentIdentityRecord | null;
156
+ /**
157
+ * Installed identity (bot user + token) for an agent, or null.
158
+ *
159
+ * @param agentSession - The agent
160
+ * @returns `{ botUserId, botToken }` when installed
161
+ */
162
+ getInstalled(agentSession: string): {
163
+ botUserId: string;
164
+ botToken: string;
165
+ } | null;
166
+ /**
167
+ * Agent session for a Slack bot user id (native mention resolution).
168
+ *
169
+ * @param botUserId - Slack user id
170
+ * @returns The agent session or null
171
+ */
172
+ findByBotUserId(botUserId: string): string | null;
173
+ /**
174
+ * Mark that an install link was announced in a channel / the bot was
175
+ * invited into a channel, so it is not repeated.
176
+ *
177
+ * @param agentSession - The agent
178
+ * @param patch - Channel ids to add to either list
179
+ */
180
+ markChannel(agentSession: string, patch: {
181
+ announcedIn?: string;
182
+ invitedTo?: string;
183
+ }): Promise<void>;
184
+ /** Load the cache once. */
185
+ load(): Promise<SlackAgentIdentitiesFile>;
186
+ /** Stop timers (shutdown / tests). */
187
+ stop(): void;
188
+ private mergeView;
189
+ private save;
190
+ private ensurePolling;
191
+ private stopPolling;
192
+ /** One poll: refresh from Cloud; give up after the max age. */
193
+ pollTick(): Promise<void>;
194
+ private now;
195
+ private cloudRequest;
196
+ }
197
+ /**
198
+ * Install the process-wide instance (composition root).
199
+ *
200
+ * @param service - The service or null
201
+ */
202
+ export declare function setSlackAgentIdentityService(service: SlackAgentIdentityService | null): void;
203
+ /**
204
+ * The process-wide instance, or null before wiring.
205
+ *
206
+ * @returns The service or null
207
+ */
208
+ export declare function getSlackAgentIdentityService(): SlackAgentIdentityService | null;
209
+ //# sourceMappingURL=slack-agent-identity.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-agent-identity.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-identity.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Slack Agent Identity Service — one real Slack bot user per agent.
3
+ *
4
+ * Crewly Cloud (`/api/cloud/slack/*`) creates one Slack app per agent with
5
+ * the owner's app configuration token, hands back an install link, and after
6
+ * the owner's one consent click holds the agent's bot token. This service is
7
+ * the OSS half:
8
+ *
9
+ * - talks to Cloud with the OSS install's Cloud access token;
10
+ * - caches identities (bot user id, bot token) in
11
+ * `~/.crewly/slack-agent-identities.json` (mode 0600) so posting works
12
+ * without a Cloud round-trip;
13
+ * - polls Cloud while any install is pending so a click on the link shows
14
+ * up here within ~30 s;
15
+ * - remembers where each install link was announced and which channels the
16
+ * bot has been invited into, so the team-channel service does each once.
17
+ *
18
+ * Team channels use it to post replies as the agent (its own token) and to
19
+ * resolve native `<@U…>` mentions. Everything degrades gracefully: with no
20
+ * Cloud login or no identity, replies fall back to the cosmetic
21
+ * username/icon override.
22
+ *
23
+ * @module services/slack/slack-agent-identity.service
24
+ */
25
+ import * as path from 'path';
26
+ import { promises as fs } from 'fs';
27
+ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
28
+ import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
29
+ import { LoggerService } from '../core/logger.service.js';
30
+ import { SLACK_AGENT_IDENTITY_CONSTANTS } from '../../constants.js';
31
+ /** Error from Cloud with the stable code it returned. */
32
+ export class SlackIdentityCloudError extends Error {
33
+ status;
34
+ code;
35
+ constructor(status, code, message) {
36
+ super(message);
37
+ this.status = status;
38
+ this.code = code;
39
+ this.name = 'SlackIdentityCloudError';
40
+ }
41
+ }
42
+ const EMPTY = { version: 1, identities: [] };
43
+ /**
44
+ * Service — see module docs.
45
+ */
46
+ export class SlackAgentIdentityService {
47
+ logger;
48
+ deps;
49
+ storePath;
50
+ fetchImpl;
51
+ store = null;
52
+ loading = null;
53
+ pollTimer = null;
54
+ pollingSince = 0;
55
+ listeners = new Set();
56
+ constructor(deps) {
57
+ this.deps = deps;
58
+ this.storePath =
59
+ deps.storePath ?? path.join(getCrewlyHomePath(), SLACK_AGENT_IDENTITY_CONSTANTS.STORE_FILENAME);
60
+ this.fetchImpl = deps.fetchImpl ?? fetch;
61
+ this.logger = LoggerService.getInstance().createComponentLogger('SlackAgentIdentity');
62
+ }
63
+ // -------------------------------------------------------------------------
64
+ // Availability
65
+ // -------------------------------------------------------------------------
66
+ /**
67
+ * Whether Cloud can be reached (logged in with a token).
68
+ *
69
+ * @returns True when the OSS install is connected to Crewly Cloud
70
+ */
71
+ isAvailable() {
72
+ return this.deps.cloud.isConnected() && !!this.deps.cloud.getToken() && !!this.deps.cloud.getCloudUrl();
73
+ }
74
+ /**
75
+ * Register a callback for the moment an identity becomes installed
76
+ * (bot user id + token known). The team-channel service uses it to invite
77
+ * the new bot into its channels.
78
+ *
79
+ * @param listener - Called with the installed record
80
+ * @returns Unsubscribe
81
+ */
82
+ onInstalled(listener) {
83
+ this.listeners.add(listener);
84
+ return () => this.listeners.delete(listener);
85
+ }
86
+ // -------------------------------------------------------------------------
87
+ // Cloud calls
88
+ // -------------------------------------------------------------------------
89
+ /**
90
+ * Cloud-side status: whether the feature is enabled there, whether this
91
+ * account has a config token, and agent counts.
92
+ *
93
+ * @returns The status
94
+ * @throws {SlackIdentityCloudError} on a Cloud failure
95
+ */
96
+ async getCloudStatus() {
97
+ return this.cloudRequest('GET', '/status');
98
+ }
99
+ /**
100
+ * Store the owner's Slack app configuration token on Cloud (validated
101
+ * there by rotating it once).
102
+ *
103
+ * @param token - Config access token (may be empty/expired)
104
+ * @param refreshToken - Config refresh token (required)
105
+ * @returns The stored token's status
106
+ */
107
+ async setConfigToken(token, refreshToken) {
108
+ return this.cloudRequest('PUT', '/config-token', { token, refreshToken });
109
+ }
110
+ /**
111
+ * Remove the config token on Cloud.
112
+ *
113
+ * @returns True when one existed
114
+ */
115
+ async deleteConfigToken() {
116
+ const res = await this.cloudRequest('DELETE', '/config-token');
117
+ return res.removed;
118
+ }
119
+ /**
120
+ * Ask Cloud for an identity for an agent (idempotent). Returns the cached
121
+ * record updated with Cloud's answer, including `installUrl` while the
122
+ * install is pending.
123
+ *
124
+ * @param agentSession - Stable agent id
125
+ * @param displayName - Name the bot will carry in Slack
126
+ * @param description - Optional app description
127
+ * @returns The record
128
+ */
129
+ async provision(agentSession, displayName, description) {
130
+ const view = await this.cloudRequest('POST', '/agents', { agentSession, displayName, description });
131
+ const record = await this.mergeView(view);
132
+ if (record.status === 'pending_install')
133
+ this.ensurePolling();
134
+ return record;
135
+ }
136
+ /**
137
+ * Pull every identity (with tokens) from Cloud into the local cache.
138
+ * Newly installed ones fire {@link onInstalled}.
139
+ *
140
+ * @returns All records after the merge
141
+ */
142
+ async refreshFromCloud() {
143
+ const views = await this.cloudRequest('GET', '/agents?includeTokens=1');
144
+ for (const view of views)
145
+ await this.mergeView(view);
146
+ const store = await this.load();
147
+ if (!store.identities.some((r) => r.status === 'pending_install'))
148
+ this.stopPolling();
149
+ return store.identities.map((r) => ({ ...r }));
150
+ }
151
+ /**
152
+ * Delete an agent's Slack app on Cloud and forget it locally.
153
+ *
154
+ * @param agentSession - The agent
155
+ * @returns True when a record existed on Cloud
156
+ */
157
+ async remove(agentSession) {
158
+ let removed = false;
159
+ try {
160
+ const res = await this.cloudRequest('DELETE', `/agents/${encodeURIComponent(agentSession)}`);
161
+ removed = res.removed;
162
+ }
163
+ catch (err) {
164
+ if (!(err instanceof SlackIdentityCloudError && err.status === 404))
165
+ throw err;
166
+ }
167
+ const store = await this.load();
168
+ store.identities = store.identities.filter((r) => r.agentSession !== agentSession);
169
+ await this.save();
170
+ return removed;
171
+ }
172
+ // -------------------------------------------------------------------------
173
+ // Local cache
174
+ // -------------------------------------------------------------------------
175
+ /**
176
+ * All cached identities (tokens included — callers must not log them).
177
+ *
178
+ * @returns Copies
179
+ */
180
+ async list() {
181
+ const store = await this.load();
182
+ return store.identities.map((r) => ({ ...r }));
183
+ }
184
+ /**
185
+ * Cached identity for an agent, if any. Synchronous read of the loaded
186
+ * cache (call {@link list} or any Cloud method first to load it).
187
+ *
188
+ * @param agentSession - The agent
189
+ * @returns The record or null
190
+ */
191
+ get(agentSession) {
192
+ return this.store?.identities.find((r) => r.agentSession === agentSession) ?? null;
193
+ }
194
+ /**
195
+ * Installed identity (bot user + token) for an agent, or null.
196
+ *
197
+ * @param agentSession - The agent
198
+ * @returns `{ botUserId, botToken }` when installed
199
+ */
200
+ getInstalled(agentSession) {
201
+ const r = this.get(agentSession);
202
+ if (r && r.status === 'installed' && r.botUserId && r.botToken) {
203
+ return { botUserId: r.botUserId, botToken: r.botToken };
204
+ }
205
+ return null;
206
+ }
207
+ /**
208
+ * Agent session for a Slack bot user id (native mention resolution).
209
+ *
210
+ * @param botUserId - Slack user id
211
+ * @returns The agent session or null
212
+ */
213
+ findByBotUserId(botUserId) {
214
+ return this.store?.identities.find((r) => r.botUserId === botUserId)?.agentSession ?? null;
215
+ }
216
+ /**
217
+ * Mark that an install link was announced in a channel / the bot was
218
+ * invited into a channel, so it is not repeated.
219
+ *
220
+ * @param agentSession - The agent
221
+ * @param patch - Channel ids to add to either list
222
+ */
223
+ async markChannel(agentSession, patch) {
224
+ const store = await this.load();
225
+ const r = store.identities.find((x) => x.agentSession === agentSession);
226
+ if (!r)
227
+ return;
228
+ if (patch.announcedIn && !r.announcedIn.includes(patch.announcedIn))
229
+ r.announcedIn.push(patch.announcedIn);
230
+ if (patch.invitedTo && !r.invitedTo.includes(patch.invitedTo))
231
+ r.invitedTo.push(patch.invitedTo);
232
+ r.updatedAt = new Date(this.now()).toISOString();
233
+ await this.save();
234
+ }
235
+ /** Load the cache once. */
236
+ async load() {
237
+ if (this.store)
238
+ return this.store;
239
+ if (!this.loading) {
240
+ this.loading = safeReadJson(this.storePath, EMPTY).then((raw) => {
241
+ const identities = Array.isArray(raw?.identities) ? raw.identities.filter(isRecord) : [];
242
+ this.store = { version: 1, identities };
243
+ if (identities.some((r) => r.status === 'pending_install'))
244
+ this.ensurePolling();
245
+ return this.store;
246
+ });
247
+ }
248
+ return this.loading;
249
+ }
250
+ /** Stop timers (shutdown / tests). */
251
+ stop() {
252
+ this.stopPolling();
253
+ }
254
+ // -------------------------------------------------------------------------
255
+ // Internals
256
+ // -------------------------------------------------------------------------
257
+ async mergeView(view) {
258
+ const store = await this.load();
259
+ const nowIso = new Date(this.now()).toISOString();
260
+ let record = store.identities.find((r) => r.agentSession === view.agentSession);
261
+ const wasInstalled = record?.status === 'installed';
262
+ if (!record) {
263
+ record = {
264
+ agentSession: view.agentSession,
265
+ displayName: view.displayName,
266
+ appId: view.appId,
267
+ status: view.status,
268
+ announcedIn: [],
269
+ invitedTo: [],
270
+ updatedAt: nowIso,
271
+ };
272
+ store.identities.push(record);
273
+ }
274
+ record.displayName = view.displayName;
275
+ record.appId = view.appId;
276
+ record.status = view.status;
277
+ record.updatedAt = nowIso;
278
+ if (view.botUserId)
279
+ record.botUserId = view.botUserId;
280
+ if (view.teamId)
281
+ record.teamId = view.teamId;
282
+ if (view.botToken)
283
+ record.botToken = view.botToken;
284
+ if (view.installUrl)
285
+ record.installUrl = view.installUrl;
286
+ else if (view.status === 'installed')
287
+ delete record.installUrl;
288
+ if (view.error)
289
+ record.error = view.error;
290
+ else
291
+ delete record.error;
292
+ await this.save();
293
+ if (!wasInstalled && record.status === 'installed' && record.botToken) {
294
+ this.logger.info('Slack agent identity installed', {
295
+ agentSession: record.agentSession,
296
+ botUserId: record.botUserId,
297
+ });
298
+ for (const l of this.listeners) {
299
+ try {
300
+ l({ ...record });
301
+ }
302
+ catch (err) {
303
+ this.logger.warn('onInstalled listener threw', { error: err instanceof Error ? err.message : String(err) });
304
+ }
305
+ }
306
+ }
307
+ return { ...record };
308
+ }
309
+ async save() {
310
+ const store = await this.load();
311
+ await fs.mkdir(path.dirname(this.storePath), { recursive: true });
312
+ await atomicWriteJson(this.storePath, store);
313
+ await fs.chmod(this.storePath, 0o600).catch(() => undefined);
314
+ }
315
+ ensurePolling() {
316
+ if (this.pollTimer)
317
+ return;
318
+ this.pollingSince = this.now();
319
+ const setI = this.deps.setInterval ?? setInterval;
320
+ this.pollTimer = setI(() => {
321
+ void this.pollTick();
322
+ }, SLACK_AGENT_IDENTITY_CONSTANTS.PENDING_POLL_INTERVAL_MS);
323
+ // Never keep the process alive just for this.
324
+ this.pollTimer.unref?.();
325
+ }
326
+ stopPolling() {
327
+ if (!this.pollTimer)
328
+ return;
329
+ const clearI = this.deps.clearInterval ?? clearInterval;
330
+ clearI(this.pollTimer);
331
+ this.pollTimer = null;
332
+ }
333
+ /** One poll: refresh from Cloud; give up after the max age. */
334
+ async pollTick() {
335
+ if (this.now() - this.pollingSince > SLACK_AGENT_IDENTITY_CONSTANTS.PENDING_POLL_MAX_AGE_MS) {
336
+ this.logger.info('Stopped polling for pending Slack installs (max age reached)');
337
+ this.stopPolling();
338
+ return;
339
+ }
340
+ if (!this.isAvailable())
341
+ return;
342
+ try {
343
+ await this.refreshFromCloud();
344
+ }
345
+ catch (err) {
346
+ this.logger.debug('Pending-install poll failed', { error: err instanceof Error ? err.message : String(err) });
347
+ }
348
+ }
349
+ now() {
350
+ return this.deps.now?.() ?? Date.now();
351
+ }
352
+ async cloudRequest(method, suffix, body) {
353
+ const token = this.deps.cloud.getToken();
354
+ const base = this.deps.cloud.getCloudUrl();
355
+ if (!token || !base) {
356
+ throw new SlackIdentityCloudError(401, 'not_logged_in', 'Not logged in to Crewly Cloud');
357
+ }
358
+ const url = `${base.replace(/\/$/, '')}${SLACK_AGENT_IDENTITY_CONSTANTS.CLOUD_PATH}${suffix}`;
359
+ const controller = new AbortController();
360
+ const timer = setTimeout(() => controller.abort(), SLACK_AGENT_IDENTITY_CONSTANTS.REQUEST_TIMEOUT_MS);
361
+ try {
362
+ const res = await this.fetchImpl(url, {
363
+ method,
364
+ headers: {
365
+ Authorization: `Bearer ${token}`,
366
+ ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
367
+ },
368
+ body: body !== undefined ? JSON.stringify(body) : undefined,
369
+ signal: controller.signal,
370
+ });
371
+ const text = await res.text();
372
+ let parsed = {};
373
+ try {
374
+ parsed = JSON.parse(text);
375
+ }
376
+ catch {
377
+ parsed = {};
378
+ }
379
+ if (!res.ok || parsed.success !== true) {
380
+ throw new SlackIdentityCloudError(res.status, parsed.code ?? `http_${res.status}`, parsed.error ?? `Cloud request failed (${res.status})`);
381
+ }
382
+ return parsed.data;
383
+ }
384
+ catch (err) {
385
+ if (err instanceof SlackIdentityCloudError)
386
+ throw err;
387
+ const message = err instanceof Error ? err.message : String(err);
388
+ throw new SlackIdentityCloudError(502, 'network', `Cloud unreachable: ${message}`);
389
+ }
390
+ finally {
391
+ clearTimeout(timer);
392
+ }
393
+ }
394
+ }
395
+ function isRecord(value) {
396
+ const v = value;
397
+ return !!v && typeof v.agentSession === 'string' && typeof v.appId === 'string' && typeof v.status === 'string';
398
+ }
399
+ let instance = null;
400
+ /**
401
+ * Install the process-wide instance (composition root).
402
+ *
403
+ * @param service - The service or null
404
+ */
405
+ export function setSlackAgentIdentityService(service) {
406
+ instance = service;
407
+ }
408
+ /**
409
+ * The process-wide instance, or null before wiring.
410
+ *
411
+ * @returns The service or null
412
+ */
413
+ export function getSlackAgentIdentityService() {
414
+ return instance;
415
+ }
416
+ //# sourceMappingURL=slack-agent-identity.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-agent-identity.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-agent-identity.service.ts"],"names":[],"mappings":"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"}