crewly 1.20.302 → 1.20.304

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 (276) hide show
  1. package/config/roles/developer/prompt.md +7 -0
  2. package/config/roles/fullstack-dev/prompt.md +7 -0
  3. package/config/roles/product-manager/prompt.md +7 -0
  4. package/config/skills/orchestrator/move-team/SKILL.md +53 -0
  5. package/config/skills/orchestrator/move-team/execute.sh +42 -0
  6. package/config/skills/orchestrator/usage-categories/SKILL.md +59 -0
  7. package/config/skills/orchestrator/usage-categories/execute.sh +81 -0
  8. package/config/skills/orchestrator/usage-categories/execute.test.sh +45 -0
  9. package/config/skills/orchestrator/usage-report/SKILL.md +71 -0
  10. package/config/skills/orchestrator/usage-report/execute.sh +84 -0
  11. package/config/skills/orchestrator/usage-report/execute.test.sh +39 -0
  12. package/config/skills/team-leader/usage-report/SKILL.md +71 -0
  13. package/config/skills/team-leader/usage-report/execute.sh +84 -0
  14. package/config/skills/team-leader/usage-report/execute.test.sh +39 -0
  15. package/dist/backend/backend/src/constants.d.ts +80 -0
  16. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  17. package/dist/backend/backend/src/constants.js +80 -0
  18. package/dist/backend/backend/src/constants.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts +45 -0
  20. package/dist/backend/backend/src/controllers/team-move/team-move.controller.d.ts.map +1 -0
  21. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js +214 -0
  22. package/dist/backend/backend/src/controllers/team-move/team-move.controller.js.map +1 -0
  23. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts +36 -0
  24. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts.map +1 -0
  25. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js +158 -0
  26. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js.map +1 -0
  27. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts +15 -0
  28. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts.map +1 -0
  29. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js +26 -0
  30. package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js.map +1 -0
  31. package/dist/backend/backend/src/index.d.ts +10 -0
  32. package/dist/backend/backend/src/index.d.ts.map +1 -1
  33. package/dist/backend/backend/src/index.js +97 -20
  34. package/dist/backend/backend/src/index.js.map +1 -1
  35. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  36. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  37. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  38. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts +32 -0
  39. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/agent/follow-through.wiring.js +42 -1
  41. package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
  42. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +26 -6
  43. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/resource-mode.service.js +59 -5
  45. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  47. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  49. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  50. package/dist/backend/backend/src/services/core/storage.service.d.ts +18 -0
  51. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/core/storage.service.js +16 -0
  53. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +19 -0
  55. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/decisions/decision.service.js +46 -0
  57. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
  59. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +101 -0
  61. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  62. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts +58 -0
  63. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js +100 -0
  65. package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js.map +1 -0
  66. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +3 -0
  68. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +7 -0
  70. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +15 -0
  72. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  74. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  75. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  76. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  77. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -0
  79. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
  81. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
  83. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  84. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  85. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +41 -0
  87. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts +122 -0
  89. package/dist/backend/backend/src/services/team-move/team-move-archive.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/team-move/team-move-archive.js +202 -0
  91. package/dist/backend/backend/src/services/team-move/team-move-archive.js.map +1 -0
  92. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +59 -0
  93. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/team-move/team-move-chat.js +133 -0
  95. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -0
  96. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts +102 -0
  97. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js +217 -0
  99. package/dist/backend/backend/src/services/team-move/team-move-cloud.client.js.map +1 -0
  100. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts +102 -0
  101. package/dist/backend/backend/src/services/team-move/team-move-crypto.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/team-move/team-move-crypto.js +348 -0
  103. package/dist/backend/backend/src/services/team-move/team-move-crypto.js.map +1 -0
  104. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts +209 -0
  105. package/dist/backend/backend/src/services/team-move/team-move-driver.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js +504 -0
  107. package/dist/backend/backend/src/services/team-move/team-move-driver.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +156 -0
  109. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +462 -0
  111. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -0
  112. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts +157 -0
  113. package/dist/backend/backend/src/services/team-move/team-move-fs.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/team-move/team-move-fs.js +298 -0
  115. package/dist/backend/backend/src/services/team-move/team-move-fs.js.map +1 -0
  116. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts +69 -0
  117. package/dist/backend/backend/src/services/team-move/team-move-git.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/team-move/team-move-git.js +198 -0
  119. package/dist/backend/backend/src/services/team-move/team-move-git.js.map +1 -0
  120. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +121 -0
  121. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -0
  122. package/dist/backend/backend/src/services/team-move/team-move-importer.js +462 -0
  123. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -0
  124. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts +110 -0
  125. package/dist/backend/backend/src/services/team-move/team-move-journal.d.ts.map +1 -0
  126. package/dist/backend/backend/src/services/team-move/team-move-journal.js +198 -0
  127. package/dist/backend/backend/src/services/team-move/team-move-journal.js.map +1 -0
  128. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts +71 -0
  129. package/dist/backend/backend/src/services/team-move/team-move-preflight.d.ts.map +1 -0
  130. package/dist/backend/backend/src/services/team-move/team-move-preflight.js +102 -0
  131. package/dist/backend/backend/src/services/team-move/team-move-preflight.js.map +1 -0
  132. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts +29 -0
  133. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -0
  134. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +173 -0
  135. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -0
  136. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts +50 -0
  137. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.d.ts.map +1 -0
  138. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js +96 -0
  139. package/dist/backend/backend/src/services/team-move/team-move-secret-scan.js.map +1 -0
  140. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts +94 -0
  141. package/dist/backend/backend/src/services/team-move/team-move-select.d.ts.map +1 -0
  142. package/dist/backend/backend/src/services/team-move/team-move-select.js +124 -0
  143. package/dist/backend/backend/src/services/team-move/team-move-select.js.map +1 -0
  144. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts +46 -0
  145. package/dist/backend/backend/src/services/team-move/team-move.fixture.d.ts.map +1 -0
  146. package/dist/backend/backend/src/services/team-move/team-move.fixture.js +202 -0
  147. package/dist/backend/backend/src/services/team-move/team-move.fixture.js.map +1 -0
  148. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +269 -0
  149. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -0
  150. package/dist/backend/backend/src/services/team-move/team-move.types.js +44 -0
  151. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -0
  152. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +42 -2
  153. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  154. package/dist/backend/backend/src/services/trace/trace-context.service.js +66 -5
  155. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
  156. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/trace/trace-recorder.js +11 -0
  158. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
  159. package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts +28 -0
  160. package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/usage-ledger/categories-param.js +67 -0
  162. package/dist/backend/backend/src/services/usage-ledger/categories-param.js.map +1 -0
  163. package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts +37 -0
  164. package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/usage-ledger/excerpt.js +49 -0
  166. package/dist/backend/backend/src/services/usage-ledger/excerpt.js.map +1 -0
  167. package/dist/backend/backend/src/services/usage-ledger/index.d.ts +14 -0
  168. package/dist/backend/backend/src/services/usage-ledger/index.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/usage-ledger/index.js +14 -0
  170. package/dist/backend/backend/src/services/usage-ledger/index.js.map +1 -0
  171. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
  172. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
  174. package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
  175. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts +100 -0
  176. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js +189 -0
  178. package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js.map +1 -0
  179. package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts +41 -0
  180. package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/usage-ledger/owner-spans.js +71 -0
  182. package/dist/backend/backend/src/services/usage-ledger/owner-spans.js.map +1 -0
  183. package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts +47 -0
  184. package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/usage-ledger/team-directory.js +106 -0
  186. package/dist/backend/backend/src/services/usage-ledger/team-directory.js.map +1 -0
  187. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts +101 -0
  188. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts.map +1 -0
  189. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js +263 -0
  190. package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js.map +1 -0
  191. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts +96 -0
  192. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts.map +1 -0
  193. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js +166 -0
  194. package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js.map +1 -0
  195. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts +90 -0
  196. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts.map +1 -0
  197. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js +294 -0
  198. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js.map +1 -0
  199. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts +102 -0
  200. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts.map +1 -0
  201. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js +314 -0
  202. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js.map +1 -0
  203. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts +62 -0
  204. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts.map +1 -0
  205. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js +106 -0
  206. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js.map +1 -0
  207. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts +52 -0
  208. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts.map +1 -0
  209. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js +95 -0
  210. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js.map +1 -0
  211. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts +127 -0
  212. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts.map +1 -0
  213. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js +19 -0
  214. package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js.map +1 -0
  215. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts +124 -0
  216. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts.map +1 -0
  217. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js +372 -0
  218. package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js.map +1 -0
  219. package/dist/backend/build-info.json +2 -2
  220. package/dist/cli/backend/src/constants.d.ts +80 -0
  221. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  222. package/dist/cli/backend/src/constants.js +80 -0
  223. package/dist/cli/backend/src/constants.js.map +1 -1
  224. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +26 -6
  225. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/agent/resource-mode.service.js +59 -5
  227. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  228. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  229. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  231. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  232. package/dist/cli/backend/src/services/core/storage.service.d.ts +18 -0
  233. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  234. package/dist/cli/backend/src/services/core/storage.service.js +16 -0
  235. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  236. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +19 -0
  237. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  238. package/dist/cli/backend/src/services/decisions/decision.service.js +46 -0
  239. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  240. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
  241. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  242. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +101 -0
  243. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  244. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  245. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +3 -0
  246. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  247. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  248. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  249. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -0
  250. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  251. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
  252. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  253. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
  254. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  255. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  256. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  257. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +41 -0
  258. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  259. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +42 -2
  260. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  261. package/dist/cli/backend/src/services/trace/trace-context.service.js +66 -5
  262. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
  263. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  264. package/dist/cli/backend/src/services/trace/trace-recorder.js +11 -0
  265. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
  266. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
  267. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
  268. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
  269. package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
  270. package/dist/cli/cli/src/commands/team-move.d.ts +68 -0
  271. package/dist/cli/cli/src/commands/team-move.d.ts.map +1 -0
  272. package/dist/cli/cli/src/commands/team-move.js +155 -0
  273. package/dist/cli/cli/src/commands/team-move.js.map +1 -0
  274. package/dist/cli/cli/src/index.js +33 -0
  275. package/dist/cli/cli/src/index.js.map +1 -1
  276. package/package.json +1 -1
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Team move exporter (source machine).
3
+ *
4
+ * Collects everything Crewly owns about ONE team into a staging directory,
5
+ * writes a manifest with a hash for every file, runs the secret scan, and (in
6
+ * {@link buildEncryptedPackage}) turns the staging directory into an encrypted
7
+ * `tar.gz` stream.
8
+ *
9
+ * Package layout (POSIX paths):
10
+ *
11
+ * manifest.json
12
+ * team/** the team's folder: config, prompts, norms, SOPs,
13
+ * wiki vault, cron tasks
14
+ * agents/<session>/** agent memory, standing answers, session summaries
15
+ * handover/<file> newest handover notes per agent
16
+ * records/*.json task-pool items, decisions, chat channels and
17
+ * rooms, Slack channel mapping, scheduled messages
18
+ * projects/<id>/data/** `<project>/.crewly/**` (or the package-tree stores)
19
+ *
20
+ * Not in it: credentials, tokens, runtime logins, logs and transcripts,
21
+ * node_modules/build output and repository working trees (the repo list in
22
+ * the manifest lets the target clone them).
23
+ *
24
+ * @module services/team-move/team-move-exporter
25
+ */
26
+ import type { Project, Team } from '../../types/index.js';
27
+ import { type SecretEnvValue } from '../../utils/secret-env.js';
28
+ import { StagingArea } from './team-move-fs.js';
29
+ import { inspectRepo as defaultInspectRepo } from './team-move-git.js';
30
+ import type { CloudManifestSummary, PackageFileEntry, PackageRepo, TeamMoveManifest } from './team-move.types.js';
31
+ /** Thrown when a repository holds work that exists only on the source. */
32
+ export declare class TeamMoveBlockedError extends Error {
33
+ readonly lines: string[];
34
+ constructor(lines: string[]);
35
+ }
36
+ /** Collaborators of the exporter. */
37
+ export interface ExportDeps {
38
+ /** Crewly home of this machine. */
39
+ home?: string;
40
+ getTeams: () => Promise<Team[]>;
41
+ getProjects: () => Promise<Project[]>;
42
+ crewlyVersion: string;
43
+ source: {
44
+ instanceId: string | null;
45
+ deviceName: string | null;
46
+ };
47
+ /** Exact secret values this machine holds (env, settings). */
48
+ knownSecrets?: () => Promise<SecretEnvValue[]>;
49
+ inspectRepo?: typeof defaultInspectRepo;
50
+ now?: () => string;
51
+ }
52
+ /** Options of one export. */
53
+ export interface ExportOptions {
54
+ teamId: string;
55
+ moveId: string;
56
+ /** Directory the package is assembled in (created). */
57
+ stagingDir: string;
58
+ /** Move although a repository has uncommitted or unpushed work. */
59
+ allowDirty?: boolean;
60
+ /** Leave files with secrets out of the package instead of aborting (only free-form notes and project files). */
61
+ skipFlagged?: boolean;
62
+ }
63
+ /** What an export produced. */
64
+ export interface ExportResult {
65
+ manifest: TeamMoveManifest;
66
+ staging: StagingArea;
67
+ /** What Cloud receives with `package/init`. */
68
+ summary: CloudManifestSummary;
69
+ /** Lines describing uncommitted/unpushed work that was allowed through. */
70
+ dirtyRepos: string[];
71
+ }
72
+ /**
73
+ * Prepare a team config for another machine: nothing is running there yet.
74
+ *
75
+ * @param raw - Parsed `config.json`
76
+ * @returns Copy with runtime state cleared
77
+ */
78
+ export declare function sanitizeTeamForMove(raw: Record<string, unknown>): Record<string, unknown>;
79
+ /** The exporter. */
80
+ export declare class TeamMoveExporter {
81
+ private readonly deps;
82
+ private readonly home;
83
+ private readonly now;
84
+ private readonly inspect;
85
+ constructor(deps: ExportDeps);
86
+ /**
87
+ * Check, before anything is built, that no repository holds work only this
88
+ * machine has. Used by the REST entry point so the owner learns what to
89
+ * push before a move is even requested.
90
+ *
91
+ * @param teamId - Team to move
92
+ * @returns The repos and the lines that block the move
93
+ */
94
+ checkRepos(teamId: string): Promise<{
95
+ repos: PackageRepo[];
96
+ blocking: string[];
97
+ }>;
98
+ private requireTeam;
99
+ private teamProjects;
100
+ /**
101
+ * Collect, scan and describe the package.
102
+ *
103
+ * @param options - Team, move, staging directory, policy flags
104
+ * @returns Manifest, staging area and the Cloud summary
105
+ * @throws TeamMoveBlockedError for unpushed work; TeamMoveSecretScanError for secrets
106
+ */
107
+ export(options: ExportOptions): Promise<ExportResult>;
108
+ /** The things a move deliberately leaves out, shown to the owner. */
109
+ private notMovedList;
110
+ /** Global-store records of the team. */
111
+ private collectRecords;
112
+ /**
113
+ * Copy each project's Crewly data under the size caps.
114
+ *
115
+ * @returns Manifest entries of the projects
116
+ */
117
+ private collectProjects;
118
+ /** Tools and connectors the team's own words mention (prompts, norms, SOPs, cron tasks). */
119
+ private detectNeeds;
120
+ }
121
+ /**
122
+ * The small summary Cloud receives (kept far below its 64 KB limit).
123
+ *
124
+ * @param manifest - Full manifest
125
+ * @returns Summary without file names
126
+ */
127
+ export declare function summarize(manifest: TeamMoveManifest): CloudManifestSummary;
128
+ /** Result of {@link buildEncryptedPackage}. */
129
+ export interface EncryptedPackage {
130
+ /** Absolute path of the ciphertext file. */
131
+ file: string;
132
+ /** Ciphertext size in bytes. */
133
+ size: number;
134
+ /** Hex SHA-256 of the ciphertext. */
135
+ sha256: string;
136
+ /** Upload chunks (8 MiB each, the last shorter). */
137
+ chunks: number;
138
+ }
139
+ /**
140
+ * Tar+gzip a staging directory and encrypt it for the target.
141
+ *
142
+ * @param stagingDir - Directory built by {@link TeamMoveExporter.export}
143
+ * @param outFile - Where the ciphertext is written
144
+ * @param recipientPublicKey - Target's base64 X25519 public key
145
+ * @param moveId - Move id (bound into the encryption)
146
+ * @returns File, size, hash and chunk count of the ciphertext
147
+ */
148
+ export declare function buildEncryptedPackage(stagingDir: string, outFile: string, recipientPublicKey: string, moveId: string): Promise<EncryptedPackage>;
149
+ /**
150
+ * Package entries sorted for stable comparisons in tests.
151
+ *
152
+ * @param files - Manifest file entries
153
+ * @returns Paths
154
+ */
155
+ export declare function packagePaths(files: readonly PackageFileEntry[]): string[];
156
+ //# sourceMappingURL=team-move-exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-exporter.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,462 @@
1
+ /**
2
+ * Team move exporter (source machine).
3
+ *
4
+ * Collects everything Crewly owns about ONE team into a staging directory,
5
+ * writes a manifest with a hash for every file, runs the secret scan, and (in
6
+ * {@link buildEncryptedPackage}) turns the staging directory into an encrypted
7
+ * `tar.gz` stream.
8
+ *
9
+ * Package layout (POSIX paths):
10
+ *
11
+ * manifest.json
12
+ * team/** the team's folder: config, prompts, norms, SOPs,
13
+ * wiki vault, cron tasks
14
+ * agents/<session>/** agent memory, standing answers, session summaries
15
+ * handover/<file> newest handover notes per agent
16
+ * records/*.json task-pool items, decisions, chat channels and
17
+ * rooms, Slack channel mapping, scheduled messages
18
+ * projects/<id>/data/** `<project>/.crewly/**` (or the package-tree stores)
19
+ *
20
+ * Not in it: credentials, tokens, runtime logins, logs and transcripts,
21
+ * node_modules/build output and repository working trees (the repo list in
22
+ * the manifest lets the target clone them).
23
+ *
24
+ * @module services/team-move/team-move-exporter
25
+ */
26
+ import * as fs from 'node:fs/promises';
27
+ import * as path from 'node:path';
28
+ import { createWriteStream } from 'node:fs';
29
+ import { pipeline } from 'node:stream/promises';
30
+ import { create as tarCreate } from 'tar';
31
+ import { TEAM_MOVE_CONSTANTS } from '../../constants.js';
32
+ import { safeReadJson } from '../../utils/file-io.utils.js';
33
+ import { collectSecretEnvValues } from '../../utils/secret-env.js';
34
+ import { PACKAGE_TREE_STORES, getCrewlyHomePath, isInsidePackageTree, resolveProjectDataDir } from '../core/crewly-home.utils.js';
35
+ import { readTeamChat } from './team-move-chat.js';
36
+ import { createEncryptStream, createHashTap } from './team-move-crypto.js';
37
+ import { StagingArea, walkFiles } from './team-move-fs.js';
38
+ import { describeBlockingRepos, inspectRepo as defaultInspectRepo } from './team-move-git.js';
39
+ import { TeamMoveSecretScanError, isSkippableFinding, scanStaging } from './team-move-secret-scan.js';
40
+ import { identityOf, resetWorkItemForTarget, selectDecisions, selectPoolItems, selectScheduledMessages, } from './team-move-select.js';
41
+ const C = TEAM_MOVE_CONSTANTS;
42
+ /** First path segments of a project's `.crewly` that are Crewly state, packaged before anything else. */
43
+ const CORE_PROJECT_DIRS = new Set([
44
+ 'tickets',
45
+ 'missions',
46
+ 'requests',
47
+ 'triggers',
48
+ 'knowledge',
49
+ 'wiki',
50
+ 'goals',
51
+ 'tasks',
52
+ 'task-records',
53
+ 'escalations',
54
+ 'specs',
55
+ 'memory',
56
+ 'prompts',
57
+ 'agents-index.json',
58
+ ]);
59
+ /** Folders of a project's `.crewly` that are scratch space, never packaged. */
60
+ const PROJECT_SCRATCH_DIRS = new Set(['worktrees', 'tmp', 'cache']);
61
+ /** Connectors whose connection does not travel; found by name in the team's words. */
62
+ const CONNECTOR_HINTS = {
63
+ Google: /\bgoogle (?:drive|docs|sheets|slides|calendar)\b|\bgmail\b/,
64
+ Zoho: /\bzoho\b/,
65
+ Canva: /\bcanva\b/,
66
+ WhatsApp: /\bwhatsapp\b/,
67
+ };
68
+ /** Thrown when a repository holds work that exists only on the source. */
69
+ export class TeamMoveBlockedError extends Error {
70
+ lines;
71
+ constructor(lines) {
72
+ super(`Push this work before moving the team: ${lines.join('; ')}`);
73
+ this.lines = lines;
74
+ this.name = 'TeamMoveBlockedError';
75
+ }
76
+ }
77
+ /**
78
+ * Prepare a team config for another machine: nothing is running there yet.
79
+ *
80
+ * @param raw - Parsed `config.json`
81
+ * @returns Copy with runtime state cleared
82
+ */
83
+ export function sanitizeTeamForMove(raw) {
84
+ const team = { ...raw };
85
+ delete team['archived'];
86
+ delete team['archivedAt'];
87
+ delete team['movedTo'];
88
+ const members = Array.isArray(team['members']) ? team['members'] : [];
89
+ team['members'] = members.map((m) => {
90
+ const next = { ...m, agentStatus: 'inactive', workingStatus: 'idle' };
91
+ for (const key of ['readyAt', 'lastStartError', 'dropoutReason', 'lastActivityCheck', 'runtimeFallback'])
92
+ delete next[key];
93
+ return next;
94
+ });
95
+ return team;
96
+ }
97
+ /** Escape a string for use in a RegExp. */
98
+ function escapeRegExp(text) {
99
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
100
+ }
101
+ /** The exporter. */
102
+ export class TeamMoveExporter {
103
+ deps;
104
+ home;
105
+ now;
106
+ inspect;
107
+ constructor(deps) {
108
+ this.deps = deps;
109
+ this.home = deps.home ?? getCrewlyHomePath();
110
+ this.now = deps.now ?? (() => new Date().toISOString());
111
+ this.inspect = deps.inspectRepo ?? defaultInspectRepo;
112
+ }
113
+ /**
114
+ * Check, before anything is built, that no repository holds work only this
115
+ * machine has. Used by the REST entry point so the owner learns what to
116
+ * push before a move is even requested.
117
+ *
118
+ * @param teamId - Team to move
119
+ * @returns The repos and the lines that block the move
120
+ */
121
+ async checkRepos(teamId) {
122
+ const team = await this.requireTeam(teamId);
123
+ const projects = await this.teamProjects(team);
124
+ const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
125
+ return { repos, blocking: describeBlockingRepos(repos) };
126
+ }
127
+ async requireTeam(teamId) {
128
+ const team = (await this.deps.getTeams()).find((t) => t.id === teamId);
129
+ if (!team)
130
+ throw new Error(`team ${teamId} not found on this machine`);
131
+ if (team.members.length === 0)
132
+ throw new Error(`team ${team.name} has no members`);
133
+ return team;
134
+ }
135
+ async teamProjects(team) {
136
+ const all = await this.deps.getProjects();
137
+ return team.projectIds.map((id) => all.find((p) => p.id === id)).filter((p) => !!p);
138
+ }
139
+ /**
140
+ * Collect, scan and describe the package.
141
+ *
142
+ * @param options - Team, move, staging directory, policy flags
143
+ * @returns Manifest, staging area and the Cloud summary
144
+ * @throws TeamMoveBlockedError for unpushed work; TeamMoveSecretScanError for secrets
145
+ */
146
+ async export(options) {
147
+ const team = await this.requireTeam(options.teamId);
148
+ const projects = await this.teamProjects(team);
149
+ const id = identityOf(team);
150
+ const repos = await Promise.all(projects.map((p) => this.inspect({ id: p.id, name: p.name, path: p.path })));
151
+ const blocking = describeBlockingRepos(repos);
152
+ if (blocking.length > 0 && !options.allowDirty)
153
+ throw new TeamMoveBlockedError(blocking);
154
+ const staging = new StagingArea(path.resolve(options.stagingDir));
155
+ await staging.init();
156
+ const counts = {};
157
+ const bump = (key, n = 1) => {
158
+ counts[key] = (counts[key] ?? 0) + n;
159
+ };
160
+ // 1. The team's folder (config, prompts, norms, SOPs, wiki vault, cron tasks).
161
+ const teamDir = path.join(this.home, 'teams', team.id);
162
+ const rawConfig = await safeReadJson(path.join(teamDir, 'config.json'), null);
163
+ if (!rawConfig)
164
+ throw new Error(`team ${team.name} has no config.json`);
165
+ await staging.writeJson('team/config.json', sanitizeTeamForMove(rawConfig));
166
+ for await (const f of walkFiles(teamDir)) {
167
+ if (f.rel === 'config.json')
168
+ continue;
169
+ await staging.copyIn(f.abs, `team/${f.rel}`);
170
+ const top = f.rel.split('/')[0];
171
+ if (top === 'wiki')
172
+ bump('wikiPages');
173
+ else if (top === 'norms' || top === 'sops')
174
+ bump('normsAndSops');
175
+ else if (top === 'prompts')
176
+ bump('prompts');
177
+ else if (f.rel === 'cron-tasks.json')
178
+ bump('cronTaskFiles');
179
+ }
180
+ bump('members', team.members.length);
181
+ const cron = await safeReadJson(path.join(teamDir, 'cron-tasks.json'), {});
182
+ if (Array.isArray(cron.tasks))
183
+ counts['cronTasks'] = cron.tasks.length;
184
+ if (Array.isArray(team.triggers))
185
+ counts['teamTriggers'] = team.triggers.length;
186
+ // 2. Agent memory, standing answers and session summaries.
187
+ for (const session of id.sessions) {
188
+ for await (const f of walkFiles(path.join(this.home, 'agents', session))) {
189
+ await staging.copyIn(f.abs, `agents/${session}/${f.rel}`);
190
+ bump('agentFiles');
191
+ if (f.rel.startsWith('sessions/'))
192
+ bump('sessionSummaries');
193
+ }
194
+ }
195
+ // 3. Newest handover notes per agent.
196
+ const handoverDir = path.join(this.home, 'handover');
197
+ const handoverNames = await fs.readdir(handoverDir).catch(() => []);
198
+ for (const session of id.sessions) {
199
+ const own = new RegExp(`^${escapeRegExp(session)}-(?:\\d{4}-|restart-|runtime-)`);
200
+ const matching = [];
201
+ for (const name of handoverNames) {
202
+ if (!own.test(name) || !name.endsWith('.md'))
203
+ continue;
204
+ const st = await fs.stat(path.join(handoverDir, name)).catch(() => null);
205
+ if (st?.isFile())
206
+ matching.push({ name, mtime: st.mtimeMs });
207
+ }
208
+ matching.sort((a, b) => b.mtime - a.mtime);
209
+ for (const h of matching.slice(0, C.HANDOVERS_PER_AGENT)) {
210
+ await staging.copyIn(path.join(handoverDir, h.name), `handover/${h.name}`);
211
+ bump('handoverNotes');
212
+ }
213
+ }
214
+ // 4. Records from the global stores.
215
+ await this.collectRecords(staging, id, team, counts);
216
+ // 5. Project-local Crewly data, within the size caps.
217
+ const allTeams = await this.deps.getTeams();
218
+ const packageProjects = await this.collectProjects(staging, projects, allTeams, team.id, counts);
219
+ // 6. Required tools and runtimes.
220
+ const { tools: requiredTools, connectors: requiredConnectors } = await this.detectNeeds(staging, team);
221
+ const requiredRuntimes = [...new Set(team.members.map((m) => m.runtimeType).filter(Boolean))].sort();
222
+ // 7. Secret scan: nothing leaves the machine with a credential in it.
223
+ const known = this.deps.knownSecrets ? await this.deps.knownSecrets() : collectSecretEnvValues(process.env);
224
+ const scan = await scanStaging(staging, staging.files(), known);
225
+ let excludedFiles = 0;
226
+ if (scan.findings.length > 0) {
227
+ const removable = scan.findings.filter((f) => isSkippableFinding(f.path));
228
+ if (!options.skipFlagged || removable.length !== scan.findings.length)
229
+ throw new TeamMoveSecretScanError(scan.findings);
230
+ for (const finding of removable) {
231
+ const bytes = staging.files().find((e) => e.path === finding.path)?.bytes ?? 0;
232
+ await staging.remove(finding.path);
233
+ excludedFiles += 1;
234
+ const projectMatch = /^projects\/([^/]+)\//.exec(finding.path);
235
+ const project = projectMatch ? packageProjects.find((p) => p.id === projectMatch[1]) : undefined;
236
+ project?.skipped.push({ path: finding.path.replace(/^projects\/[^/]+\/data\//, ''), bytes, reason: 'secret_scan' });
237
+ if (project) {
238
+ project.files -= 1;
239
+ project.bytes -= bytes;
240
+ }
241
+ }
242
+ }
243
+ // 8. Manifest.
244
+ const members = team.members.map((m) => ({
245
+ id: m.id,
246
+ name: m.name,
247
+ role: m.role,
248
+ sessionName: m.sessionName,
249
+ runtimeType: m.runtimeType,
250
+ }));
251
+ counts['repos'] = repos.length;
252
+ counts['projects'] = packageProjects.length;
253
+ const files = staging.files();
254
+ const manifest = {
255
+ kind: C.PACKAGE_KIND,
256
+ schemaVersion: C.SCHEMA_VERSION,
257
+ moveId: options.moveId,
258
+ createdAt: this.now(),
259
+ crewlyVersion: this.deps.crewlyVersion,
260
+ source: { ...this.deps.source, homePath: this.home, platform: process.platform },
261
+ team: { id: team.id, name: team.name, members, projectIds: [...team.projectIds] },
262
+ counts,
263
+ projects: packageProjects,
264
+ repos,
265
+ requiredTools,
266
+ requiredRuntimes,
267
+ requiredConnectors,
268
+ files,
269
+ totalBytes: files.reduce((n, f) => n + f.bytes, 0),
270
+ noSecrets: true,
271
+ secretScan: { filesScanned: scan.filesScanned, knownValuesChecked: known.length, findings: 0, excludedFiles },
272
+ notMoved: this.notMovedList(),
273
+ };
274
+ await staging.writeJson('manifest.json', manifest);
275
+ return {
276
+ manifest,
277
+ staging,
278
+ summary: summarize(manifest),
279
+ dirtyRepos: blocking,
280
+ };
281
+ }
282
+ /** The things a move deliberately leaves out, shown to the owner. */
283
+ notMovedList() {
284
+ return [
285
+ 'Credentials, API keys, OAuth/connector grants and runtime logins (Claude, Codex, ...)',
286
+ 'Slack bot tokens (Crewly Cloud re-points the agents\' Slack apps to the target)',
287
+ 'Source code (cloned from each repository on the target)',
288
+ 'Chat message history (channels and rooms move, messages stay on the source)',
289
+ 'Running sessions, logs, transcripts, build output and node_modules',
290
+ 'Short-lived agent reminders (they are set again by the agents)',
291
+ ];
292
+ }
293
+ /** Global-store records of the team. */
294
+ async collectRecords(staging, id, team, counts) {
295
+ // Task pool: open items of the team. Claims are not moved: nothing runs on the target yet.
296
+ const pool = await safeReadJson(path.join(this.home, 'task-pool', 'pool.json'), {});
297
+ const slice = selectPoolItems(pool, id);
298
+ await staging.writeJson('records/task-pool.json', { workItems: slice.workItems.map(resetWorkItemForTarget) });
299
+ counts['taskPoolItems'] = slice.workItems.length;
300
+ // Open decisions / requests to the owner.
301
+ const decisionsFile = await safeReadJson(path.join(this.home, 'owner-decisions.json'), {});
302
+ const decisions = selectDecisions(Array.isArray(decisionsFile.decisions) ? decisionsFile.decisions : [], id);
303
+ await staging.writeJson('records/decisions.json', { decisions });
304
+ counts['openDecisions'] = decisions.length;
305
+ // Legacy owner-created scheduled messages aimed at the team.
306
+ const scheduled = await safeReadJson(path.join(this.home, 'scheduled-messages.json'), []);
307
+ const mine = selectScheduledMessages(Array.isArray(scheduled) ? scheduled : [], id);
308
+ await staging.writeJson('records/scheduled-messages.json', { messages: mine });
309
+ counts['scheduledMessages'] = mine.length;
310
+ // Chat channels, rooms and DMs with their membership.
311
+ const chat = readTeamChat(this.home, id);
312
+ await staging.writeJson('records/chat-channels.json', chat);
313
+ counts['chatChannels'] = chat.channels.length;
314
+ // The Slack channel mapping of the team, so the target reuses the same channel.
315
+ const slackFile = await safeReadJson(path.join(this.home, 'slack-team-channels.json'), {});
316
+ const mapping = (Array.isArray(slackFile.mappings) ? slackFile.mappings : []).find((m) => m['teamId'] === team.id) ?? null;
317
+ await staging.writeJson('records/slack-team-channel.json', { mapping });
318
+ if (mapping)
319
+ counts['slackChannelMappings'] = 1;
320
+ }
321
+ /**
322
+ * Copy each project's Crewly data under the size caps.
323
+ *
324
+ * @returns Manifest entries of the projects
325
+ */
326
+ async collectProjects(staging, projects, allTeams, teamId, counts) {
327
+ const out = [];
328
+ let remaining = C.PROJECT_FILES_MAX_BYTES;
329
+ for (const project of projects) {
330
+ const dataDir = resolveProjectDataDir(project.path);
331
+ const inHome = isInsidePackageTree(project.path);
332
+ const entry = {
333
+ id: project.id,
334
+ name: project.name,
335
+ sourcePath: project.path,
336
+ dataDir: inHome ? 'home' : '.crewly',
337
+ files: 0,
338
+ bytes: 0,
339
+ skipped: [],
340
+ sharedWithTeams: allTeams.filter((t) => t.id !== teamId && t.projectIds.includes(project.id)).map((t) => t.name),
341
+ };
342
+ // Candidates: every file with its package-relative path.
343
+ const candidates = [];
344
+ const roots = inHome
345
+ ? PACKAGE_TREE_STORES.map((s) => ({ dir: path.join(dataDir, s), prefix: s }))
346
+ : [{ dir: dataDir, prefix: '' }];
347
+ for (const root of roots) {
348
+ const single = await fs.stat(root.dir).catch(() => null);
349
+ if (single?.isFile()) {
350
+ candidates.push({ abs: root.dir, rel: root.prefix, size: single.size, priority: 0 });
351
+ continue;
352
+ }
353
+ for await (const f of walkFiles(root.dir, PROJECT_SCRATCH_DIRS)) {
354
+ const rel = root.prefix ? `${root.prefix}/${f.rel}` : f.rel;
355
+ candidates.push({ abs: f.abs, rel, size: f.size, priority: CORE_PROJECT_DIRS.has(rel.split('/')[0]) ? 0 : 1 });
356
+ }
357
+ }
358
+ // Core state first, then small files before big ones, so a cap loses the biggest scratch files.
359
+ candidates.sort((a, b) => a.priority - b.priority || a.size - b.size || (a.rel < b.rel ? -1 : 1));
360
+ for (const c of candidates) {
361
+ const skip = (reason) => {
362
+ entry.skipped.push({ path: c.rel, bytes: c.size, reason });
363
+ };
364
+ if (c.size > C.PROJECT_FILE_MAX_BYTES)
365
+ skip('too_large');
366
+ else if (c.size > remaining)
367
+ skip('size_cap');
368
+ else {
369
+ try {
370
+ await staging.copyIn(c.abs, `projects/${project.id}/data/${c.rel}`);
371
+ remaining -= c.size;
372
+ entry.files += 1;
373
+ entry.bytes += c.size;
374
+ }
375
+ catch {
376
+ skip('unreadable');
377
+ }
378
+ }
379
+ }
380
+ entry.skipped.sort((a, b) => b.bytes - a.bytes);
381
+ counts['projectFiles'] = (counts['projectFiles'] ?? 0) + entry.files;
382
+ const count = (prefix) => staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/${prefix}/`)).length;
383
+ counts['tickets'] = (counts['tickets'] ?? 0) + staging.files().filter((f) => f.path.startsWith(`projects/${project.id}/data/tickets/`) && f.path.endsWith('.md')).length;
384
+ counts['missionFiles'] = (counts['missionFiles'] ?? 0) + count('missions');
385
+ counts['requestFiles'] = (counts['requestFiles'] ?? 0) + count('requests');
386
+ counts['triggerFiles'] = (counts['triggerFiles'] ?? 0) + count('triggers');
387
+ out.push(entry);
388
+ }
389
+ return out;
390
+ }
391
+ /** Tools and connectors the team's own words mention (prompts, norms, SOPs, cron tasks). */
392
+ async detectNeeds(staging, team) {
393
+ let text = team.members.map((m) => m.systemPrompt ?? '').join('\n');
394
+ for (const f of staging.files()) {
395
+ if (!/^team\/(norms|sops|prompts)\//.test(f.path) && f.path !== 'team/cron-tasks.json')
396
+ continue;
397
+ if (f.bytes > C.TEXT_FILE_MAX_BYTES)
398
+ continue;
399
+ text += `\n${await fs.readFile(staging.abs(f.path), 'utf8').catch(() => '')}`;
400
+ }
401
+ const lower = text.toLowerCase();
402
+ const tools = C.KNOWN_TOOLS.filter((tool) => new RegExp(`(?:^|[^a-z0-9-])${escapeRegExp(tool)}(?:$|[^a-z0-9-])`).test(lower)).sort();
403
+ const connectors = Object.entries(CONNECTOR_HINTS)
404
+ .filter(([, re]) => re.test(lower))
405
+ .map(([name]) => name)
406
+ .sort();
407
+ return { tools, connectors };
408
+ }
409
+ }
410
+ /**
411
+ * The small summary Cloud receives (kept far below its 64 KB limit).
412
+ *
413
+ * @param manifest - Full manifest
414
+ * @returns Summary without file names
415
+ */
416
+ export function summarize(manifest) {
417
+ return {
418
+ kind: manifest.kind,
419
+ schemaVersion: manifest.schemaVersion,
420
+ crewlyVersion: manifest.crewlyVersion,
421
+ team: { id: manifest.team.id, name: manifest.team.name, members: manifest.team.members.length },
422
+ counts: manifest.counts,
423
+ repos: manifest.repos.length,
424
+ reposDirty: manifest.repos.filter((r) => r.dirty || r.unpushed > 0).length,
425
+ requiredTools: manifest.requiredTools,
426
+ requiredRuntimes: manifest.requiredRuntimes,
427
+ totalBytes: manifest.totalBytes,
428
+ uncompressedBytes: manifest.totalBytes,
429
+ noSecrets: true,
430
+ };
431
+ }
432
+ /**
433
+ * Tar+gzip a staging directory and encrypt it for the target.
434
+ *
435
+ * @param stagingDir - Directory built by {@link TeamMoveExporter.export}
436
+ * @param outFile - Where the ciphertext is written
437
+ * @param recipientPublicKey - Target's base64 X25519 public key
438
+ * @param moveId - Move id (bound into the encryption)
439
+ * @returns File, size, hash and chunk count of the ciphertext
440
+ */
441
+ export async function buildEncryptedPackage(stagingDir, outFile, recipientPublicKey, moveId) {
442
+ await fs.mkdir(path.dirname(outFile), { recursive: true });
443
+ const tap = createHashTap();
444
+ const tarStream = tarCreate({ gzip: true, cwd: stagingDir, portable: true, noMtime: true }, ['.']);
445
+ await pipeline(tarStream, createEncryptStream({ recipientPublicKey, moveId }), tap, createWriteStream(outFile, { mode: 0o600 }));
446
+ return {
447
+ file: outFile,
448
+ size: tap.bytes,
449
+ sha256: tap.digest(),
450
+ chunks: Math.max(1, Math.ceil(tap.bytes / C.TRANSFER_CHUNK_BYTES)),
451
+ };
452
+ }
453
+ /**
454
+ * Package entries sorted for stable comparisons in tests.
455
+ *
456
+ * @param files - Manifest file entries
457
+ * @returns Paths
458
+ */
459
+ export function packagePaths(files) {
460
+ return files.map((f) => f.path).sort();
461
+ }
462
+ //# sourceMappingURL=team-move-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-move-exporter.js","sourceRoot":"","sources":["../../../../../../backend/src/services/team-move/team-move-exporter.ts"],"names":[],"mappings":"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"}