crewly 1.20.133 → 1.20.134

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 (219) hide show
  1. package/dist/backend/backend/src/constants.d.ts +82 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +87 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
  6. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
  8. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
  10. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
  12. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +14 -0
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/routes/api.routes.js +4 -0
  18. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  19. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
  20. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
  21. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
  22. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
  23. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  24. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  25. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
  26. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  27. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  28. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  29. package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
  30. package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  31. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
  32. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
  33. package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
  34. package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
  35. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  36. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  37. package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
  38. package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
  39. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  40. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  41. package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
  42. package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  43. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  44. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
  46. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  47. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  48. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
  50. package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  51. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  52. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  54. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  55. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  56. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
  58. package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  59. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  60. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
  62. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  63. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
  64. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
  66. package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
  67. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  69. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  71. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
  74. package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
  77. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
  78. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  79. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  81. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  83. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +85 -0
  85. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/template/template.service.js +5 -2
  88. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/workflow/cron-task.service.js +4 -2
  91. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  92. package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
  93. package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  94. package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
  95. package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
  96. package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
  97. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  98. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  99. package/dist/backend/build-info.json +2 -2
  100. package/dist/cli/backend/src/constants.d.ts +82 -0
  101. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  102. package/dist/cli/backend/src/constants.js +87 -0
  103. package/dist/cli/backend/src/constants.js.map +1 -1
  104. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  105. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  106. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
  107. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  108. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  109. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  110. package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
  111. package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  112. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  113. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  114. package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
  115. package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
  116. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  117. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  118. package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
  119. package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  120. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  121. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  122. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
  123. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  124. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  125. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  126. package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
  127. package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  128. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  129. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  130. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  131. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  132. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  133. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  134. package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
  135. package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  136. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  137. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  138. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
  139. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  140. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
  141. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  142. package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
  143. package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
  144. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  145. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  146. package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  147. package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
  148. package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
  149. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
  150. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
  151. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
  152. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
  153. package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
  154. package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
  155. package/dist/cli/backend/src/services/messaging/index.js +20 -0
  156. package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
  157. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
  158. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
  159. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
  160. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
  161. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
  162. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
  163. package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
  164. package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
  165. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  166. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  167. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  168. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  169. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
  170. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
  172. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
  173. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
  174. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
  175. package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
  176. package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
  177. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
  178. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
  179. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
  180. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
  181. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  182. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  183. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +85 -0
  184. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  185. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
  186. package/dist/cli/backend/src/services/template/template.service.js +5 -2
  187. package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
  188. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
  189. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
  190. package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
  191. package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
  192. package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
  193. package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
  194. package/dist/cli/backend/src/types/cron-task.types.js +10 -0
  195. package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
  196. package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
  197. package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  198. package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
  199. package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
  200. package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
  201. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  202. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  203. package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
  204. package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
  205. package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
  206. package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
  207. package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
  208. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  209. package/dist/cli/cli/src/commands/onboard.js +80 -3
  210. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  211. package/dist/cli/cli/src/constants.d.ts +5 -0
  212. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  213. package/dist/cli/cli/src/constants.js +5 -0
  214. package/dist/cli/cli/src/constants.js.map +1 -1
  215. package/dist/cli/cli/src/index.js +15 -0
  216. package/dist/cli/cli/src/index.js.map +1 -1
  217. package/frontend/dist/assets/{index-e6c403b6.js → index-97bb17d4.js} +274 -274
  218. package/frontend/dist/index.html +1 -1
  219. package/package.json +1 -1
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Marketplace Installer Service
3
+ *
4
+ * Handles downloading, installing, uninstalling, and updating
5
+ * marketplace items. Manages asset downloads with checksum verification,
6
+ * tar.gz extraction, and updates the local installed-items manifest.
7
+ *
8
+ * For skill items, also ensures the shared _common/lib.sh files are
9
+ * present in the marketplace directory so installed skills can source them.
10
+ *
11
+ * @module services/marketplace/marketplace-installer.service
12
+ */
13
+ import path from 'path';
14
+ import { homedir } from 'os';
15
+ import { mkdir, rm, copyFile, readFile, writeFile, rename } from 'fs/promises';
16
+ import { existsSync } from 'fs';
17
+ import { createHash } from 'crypto';
18
+ import { Readable } from 'stream';
19
+ import { pipeline } from 'stream/promises';
20
+ import * as tar from 'tar';
21
+ import { loadManifest, saveManifest, getInstallPath, } from './marketplace.service.js';
22
+ import { findPackageRoot } from '../../utils/package-root.js';
23
+ import { getSkillService } from '../skill/skill.service.js';
24
+ import { SkillCatalogService } from '../skill/skill-catalog.service.js';
25
+ import { MARKETPLACE_CONSTANTS } from '../../constants.js';
26
+ /**
27
+ * Downloads an asset (archive or raw file), verifies its checksum,
28
+ * and extracts/writes it into the given install directory.
29
+ *
30
+ * Shared helper used by both `installItem` and `installToPath` to
31
+ * eliminate duplicated download/verify/extract logic.
32
+ *
33
+ * @param item - The marketplace item whose asset is being downloaded
34
+ * @param installPath - Local directory to write/extract the asset into
35
+ * @param assetPath - Relative path to the asset (archive or model file)
36
+ * @returns Operation result indicating success or failure with a message
37
+ */
38
+ async function downloadAndExtractAsset(item, installPath, assetPath) {
39
+ const localAssetsDir = path.join(homedir(), '.crewly', MARKETPLACE_CONSTANTS.DIR_NAME, 'assets');
40
+ const localAssetPath = path.join(localAssetsDir, assetPath);
41
+ let data;
42
+ if (existsSync(localAssetPath)) {
43
+ data = await readFile(localAssetPath);
44
+ }
45
+ else {
46
+ // Fall back to remote download (premium CDN)
47
+ const url = `${MARKETPLACE_CONSTANTS.PREMIUM_BASE_URL}${MARKETPLACE_CONSTANTS.ASSETS_ENDPOINT}/${assetPath}`;
48
+ const res = await fetch(url, { signal: AbortSignal.timeout(MARKETPLACE_CONSTANTS.DOWNLOAD_TIMEOUT) });
49
+ if (!res.ok) {
50
+ return { success: false, message: `Download failed: ${res.status} ${res.statusText}` };
51
+ }
52
+ data = Buffer.from(await res.arrayBuffer());
53
+ }
54
+ // Verify checksum if provided
55
+ if (item.assets.checksum) {
56
+ const colonIdx = item.assets.checksum.indexOf(':');
57
+ if (colonIdx === -1) {
58
+ return { success: false, message: `Invalid checksum format (expected "algo:hash"): ${item.assets.checksum}` };
59
+ }
60
+ const algo = item.assets.checksum.slice(0, colonIdx);
61
+ const expected = item.assets.checksum.slice(colonIdx + 1);
62
+ if (algo !== 'sha256') {
63
+ return { success: false, message: `Unsupported checksum algorithm "${algo}". Only sha256 is supported.` };
64
+ }
65
+ const actual = createHash('sha256').update(data).digest('hex');
66
+ if (actual !== expected) {
67
+ return {
68
+ success: false,
69
+ message: `Checksum mismatch: expected ${expected}, got ${actual}`,
70
+ };
71
+ }
72
+ }
73
+ // Write to install path
74
+ await mkdir(installPath, { recursive: true });
75
+ if (item.assets.archive && assetPath.endsWith('.tar.gz')) {
76
+ // Extract tar.gz archive contents into install directory
77
+ const readable = Readable.from(data);
78
+ await pipeline(readable, tar.x({ cwd: installPath, strip: 1 }));
79
+ }
80
+ else {
81
+ // Non-archive asset (e.g., model file) — write raw
82
+ const filename = path.basename(assetPath);
83
+ await writeFile(path.join(installPath, filename), data);
84
+ }
85
+ return { success: true, message: `Installed ${item.name} v${item.version}` };
86
+ }
87
+ /**
88
+ * Downloads and installs a marketplace item.
89
+ *
90
+ * Performs the following steps:
91
+ * 1. Resolves the downloadable asset (archive or model)
92
+ * 2. Determines the source type (GitHub directory or CDN archive)
93
+ * 3. Delegates to `installFromGitHub` or `downloadAndExtractAsset`
94
+ * 4. Calls `finalizeInstall` to update manifest and refresh registrations
95
+ * 5. Cleans up partial install on failure
96
+ *
97
+ * @param item - The marketplace item to install
98
+ * @returns Operation result indicating success or failure with a message
99
+ */
100
+ export async function installItem(item) {
101
+ const installPath = getInstallPath(item.type, item.id);
102
+ try {
103
+ const assetPath = item.assets.archive || item.assets.model;
104
+ if (!assetPath) {
105
+ return { success: false, message: `No downloadable asset for ${item.id}` };
106
+ }
107
+ // Determine if this is a GitHub-sourced skill (directory path, not a .tar.gz)
108
+ const isGitHubSource = assetPath.startsWith('config/skills/') && !assetPath.endsWith('.tar.gz');
109
+ if (isGitHubSource) {
110
+ // Download individual skill files from GitHub raw content
111
+ return await installFromGitHub(item, installPath, assetPath);
112
+ }
113
+ // Archive-based install (local assets or premium CDN)
114
+ const downloadResult = await downloadAndExtractAsset(item, installPath, assetPath);
115
+ if (!downloadResult.success) {
116
+ return downloadResult;
117
+ }
118
+ // Post-install: update manifest, ensure common libs, refresh registrations
119
+ return await finalizeInstall(item, installPath);
120
+ }
121
+ catch (error) {
122
+ // Clean up partial install on failure
123
+ await rm(installPath, { recursive: true, force: true }).catch(() => { });
124
+ const msg = error instanceof Error ? error.message : String(error);
125
+ return { success: false, message: `Installation failed: ${msg}` };
126
+ }
127
+ }
128
+ /**
129
+ * Installs a skill by downloading individual files from GitHub raw content
130
+ * in parallel.
131
+ *
132
+ * Public skills in the crewly repo are stored as directories (not archives).
133
+ * This function downloads the essential skill files (SKILL.md, execute.sh)
134
+ * concurrently from GitHub. SKILL.md and execute.sh are required.
135
+ *
136
+ * @param item - The marketplace item to install
137
+ * @param installPath - Local directory to install to
138
+ * @param sourcePath - Relative path in the GitHub repo (e.g. config/skills/agent/code-review)
139
+ * @returns Operation result
140
+ */
141
+ async function installFromGitHub(item, installPath, sourcePath) {
142
+ const baseUrl = MARKETPLACE_CONSTANTS.PUBLIC_CDN_BASE;
143
+ // Use custom file list from metadata if available, otherwise default files
144
+ const metadataFiles = item.metadata?.files;
145
+ const filesToDownload = metadataFiles && Array.isArray(metadataFiles) && metadataFiles.length > 0
146
+ ? metadataFiles
147
+ : ['SKILL.md', 'execute.sh'];
148
+ await mkdir(installPath, { recursive: true });
149
+ // Download all files in parallel
150
+ const results = await Promise.allSettled(filesToDownload.map(async (file) => {
151
+ const url = `${baseUrl}/${sourcePath}/${file}`;
152
+ const res = await fetch(url, { signal: AbortSignal.timeout(MARKETPLACE_CONSTANTS.GITHUB_FILE_TIMEOUT) });
153
+ if (!res.ok) {
154
+ return { file, ok: false, status: res.status, statusText: res.statusText };
155
+ }
156
+ const content = Buffer.from(await res.arrayBuffer());
157
+ return { file, ok: true, content };
158
+ }));
159
+ // Process results: SKILL.md and execute.sh are required by default.
160
+ // When metadata.files is provided (MCP skills), only SKILL.md is mandatory.
161
+ for (let i = 0; i < filesToDownload.length; i++) {
162
+ const file = filesToDownload[i];
163
+ const result = results[i];
164
+ const isOptional = metadataFiles
165
+ ? file !== 'SKILL.md' && file !== 'skill.json'
166
+ : file !== 'SKILL.md' && file !== 'execute.sh';
167
+ if (result.status === 'rejected') {
168
+ if (!isOptional) {
169
+ return { success: false, message: `Failed to download ${file}: ${result.reason}` };
170
+ }
171
+ continue;
172
+ }
173
+ const value = result.value;
174
+ if (!value.ok) {
175
+ if (!isOptional) {
176
+ return { success: false, message: `Failed to download ${file}: ${value.status} ${value.statusText}` };
177
+ }
178
+ continue;
179
+ }
180
+ await writeFile(path.join(installPath, file), value.content);
181
+ }
182
+ // Post-install: update manifest, ensure common libs, refresh registrations
183
+ return await finalizeInstall(item, installPath);
184
+ }
185
+ /**
186
+ * Shared post-install steps: update the installed-items manifest,
187
+ * ensure _common/lib.sh files exist for skills, and refresh
188
+ * skill registrations so the item is immediately discoverable.
189
+ *
190
+ * @param item - The marketplace item that was just installed
191
+ * @param installPath - Local directory where the item was installed
192
+ * @returns Operation result indicating success
193
+ */
194
+ async function finalizeInstall(item, installPath) {
195
+ if (item.type === 'skill') {
196
+ await ensureCommonLibs();
197
+ }
198
+ const record = {
199
+ id: item.id,
200
+ type: item.type,
201
+ name: item.name,
202
+ version: item.version,
203
+ installedAt: new Date().toISOString(),
204
+ installPath,
205
+ checksum: item.assets.checksum,
206
+ };
207
+ const manifest = await loadManifest();
208
+ manifest.items = manifest.items.filter((r) => r.id !== item.id);
209
+ manifest.items.push(record);
210
+ await saveManifest(manifest);
211
+ if (item.type === 'skill') {
212
+ await refreshSkillRegistrations();
213
+ }
214
+ return { success: true, message: `Installed ${item.name} v${item.version}`, item: record };
215
+ }
216
+ /**
217
+ * Internal uninstall with options. Used by updateItem to skip redundant refreshes.
218
+ *
219
+ * @param id - The ID of the marketplace item to uninstall
220
+ * @param options - Optional flags (skipRefresh: skip skill registration refresh)
221
+ * @returns Operation result indicating success or failure with a message
222
+ */
223
+ async function uninstallItemInternal(id, options) {
224
+ try {
225
+ const manifest = await loadManifest();
226
+ const record = manifest.items.find((r) => r.id === id);
227
+ if (!record) {
228
+ return { success: false, message: `Item ${id} is not installed` };
229
+ }
230
+ // Remove directory
231
+ await rm(record.installPath, { recursive: true, force: true });
232
+ // Update manifest
233
+ manifest.items = manifest.items.filter((r) => r.id !== id);
234
+ await saveManifest(manifest);
235
+ // Refresh skill service and catalog after removal (unless skipped)
236
+ if (record.type === 'skill' && !options?.skipRefresh) {
237
+ await refreshSkillRegistrations();
238
+ }
239
+ return { success: true, message: `Uninstalled ${record.name}` };
240
+ }
241
+ catch (error) {
242
+ const msg = error instanceof Error ? error.message : String(error);
243
+ return { success: false, message: `Uninstall failed: ${msg}` };
244
+ }
245
+ }
246
+ /**
247
+ * Uninstalls a marketplace item by removing its directory and manifest entry.
248
+ *
249
+ * Performs the following steps:
250
+ * 1. Looks up the item in the local manifest
251
+ * 2. Removes the item's install directory from disk
252
+ * 3. Removes the item's entry from the manifest
253
+ *
254
+ * @param id - The ID of the marketplace item to uninstall
255
+ * @returns Operation result indicating success or failure with a message
256
+ */
257
+ export async function uninstallItem(id) {
258
+ return uninstallItemInternal(id);
259
+ }
260
+ /**
261
+ * Updates a marketplace item to the latest version using a safe
262
+ * install-to-temp-then-swap strategy.
263
+ *
264
+ * Performs the following steps:
265
+ * 1. Installs the new version to a temporary path (suffixed with -update-tmp)
266
+ * 2. On success: uninstalls the old version, renames temp to final path
267
+ * 3. On failure: cleans up the temp path without touching the old version
268
+ *
269
+ * @param item - The marketplace item with the latest version info
270
+ * @returns Operation result indicating success or failure with a message
271
+ */
272
+ export async function updateItem(item) {
273
+ const finalPath = getInstallPath(item.type, item.id);
274
+ const tempPath = finalPath + '-update-tmp';
275
+ // Install new version to temp path by temporarily overriding getInstallPath behavior
276
+ // We create the temp item that installFromTemp will use
277
+ try {
278
+ // Manually perform the install steps to the temp path
279
+ const assetPath = item.assets.archive || item.assets.model;
280
+ if (!assetPath) {
281
+ return { success: false, message: `No downloadable asset for ${item.id}` };
282
+ }
283
+ const isGitHubSource = assetPath.startsWith('config/skills/') && !assetPath.endsWith('.tar.gz');
284
+ let installResult;
285
+ if (isGitHubSource) {
286
+ installResult = await installFromGitHub(item, tempPath, assetPath);
287
+ }
288
+ else {
289
+ installResult = await downloadAndExtractAsset(item, tempPath, assetPath);
290
+ }
291
+ if (!installResult.success) {
292
+ // Clean up temp path on failure
293
+ await rm(tempPath, { recursive: true, force: true }).catch(() => { });
294
+ return { success: false, message: `Update failed during install: ${installResult.message}` };
295
+ }
296
+ // New version installed successfully to temp path
297
+ // Now uninstall the old version (removes old dir + manifest entry)
298
+ const uninstallResult = await uninstallItemInternal(item.id, { skipRefresh: true });
299
+ if (!uninstallResult.success) {
300
+ // If uninstall fails because item wasn't installed, that's OK for an update
301
+ if (!uninstallResult.message.includes('not installed')) {
302
+ await rm(tempPath, { recursive: true, force: true }).catch(() => { });
303
+ return { success: false, message: `Update failed during uninstall: ${uninstallResult.message}` };
304
+ }
305
+ }
306
+ // Rename temp to final path
307
+ // Remove any existing final path first (in case uninstall didn't fully clean up)
308
+ await rm(finalPath, { recursive: true, force: true }).catch(() => { });
309
+ await rename(tempPath, finalPath);
310
+ // Finalize: update manifest and refresh registrations
311
+ return await finalizeInstall(item, finalPath);
312
+ }
313
+ catch (error) {
314
+ await rm(tempPath, { recursive: true, force: true }).catch(() => { });
315
+ const msg = error instanceof Error ? error.message : String(error);
316
+ return { success: false, message: `Update failed: ${msg}` };
317
+ }
318
+ }
319
+ /**
320
+ * Ensures the shared _common/lib.sh files exist in the marketplace directory.
321
+ *
322
+ * Marketplace-installed skills source _common/lib.sh relative to their directory.
323
+ * This function copies both the agent-level and root-level _common/lib.sh from
324
+ * the bundled package into the marketplace directory structure:
325
+ *
326
+ * ```
327
+ * ~/.crewly/marketplace/
328
+ * ├── skills/
329
+ * │ └── _common/
330
+ * │ └── lib.sh ← agent _common (delegates to root _common)
331
+ * └── _common/
332
+ * └── lib.sh ← root shared library
333
+ * ```
334
+ *
335
+ * Safe to call multiple times — only copies if source files exist.
336
+ */
337
+ export async function ensureCommonLibs() {
338
+ let packageRoot;
339
+ try {
340
+ packageRoot = findPackageRoot(__dirname);
341
+ }
342
+ catch {
343
+ // In compiled mode, __dirname may not resolve — try from cwd
344
+ packageRoot = findPackageRoot(process.cwd());
345
+ }
346
+ const mpBase = path.join(homedir(), '.crewly', MARKETPLACE_CONSTANTS.DIR_NAME);
347
+ // Copy agent _common/lib.sh
348
+ const agentCommonSrc = path.join(packageRoot, 'config', 'skills', 'agent', '_common', 'lib.sh');
349
+ const agentCommonDest = path.join(mpBase, 'skills', '_common');
350
+ if (existsSync(agentCommonSrc)) {
351
+ await mkdir(agentCommonDest, { recursive: true });
352
+ await copyFile(agentCommonSrc, path.join(agentCommonDest, 'lib.sh'));
353
+ }
354
+ // Copy root _common/lib.sh
355
+ const rootCommonSrc = path.join(packageRoot, 'config', 'skills', '_common', 'lib.sh');
356
+ const rootCommonDest = path.join(mpBase, '_common');
357
+ if (existsSync(rootCommonSrc)) {
358
+ await mkdir(rootCommonDest, { recursive: true });
359
+ await copyFile(rootCommonSrc, path.join(rootCommonDest, 'lib.sh'));
360
+ }
361
+ }
362
+ /**
363
+ * Refreshes the SkillService cache and regenerates the agent skill catalog
364
+ * after a marketplace install or uninstall operation.
365
+ *
366
+ * This ensures newly installed skills are immediately available to agents
367
+ * without requiring a server restart.
368
+ */
369
+ async function refreshSkillRegistrations() {
370
+ try {
371
+ const skillService = getSkillService();
372
+ await skillService.refresh();
373
+ }
374
+ catch (error) {
375
+ // Skill service may not be initialized yet (e.g., during CLI usage)
376
+ const msg = error instanceof Error ? error.message : String(error);
377
+ console.debug(`[marketplace] Failed to refresh skill service: ${msg}`);
378
+ }
379
+ try {
380
+ const catalogService = SkillCatalogService.getInstance();
381
+ await catalogService.generateAgentCatalog();
382
+ }
383
+ catch (error) {
384
+ // Catalog service may not be available in all contexts
385
+ const msg = error instanceof Error ? error.message : String(error);
386
+ console.debug(`[marketplace] Failed to regenerate agent catalog: ${msg}`);
387
+ }
388
+ }
389
+ //# sourceMappingURL=marketplace-installer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-installer.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/marketplace/marketplace-installer.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Messaging Services Barrel Export
3
+ *
4
+ * @module services/messaging
5
+ */
6
+ export { MessageQueueService } from './message-queue.service.js';
7
+ export { QueueProcessorService } from './queue-processor.service.js';
8
+ export { ResponseRouterService } from './response-router.service.js';
9
+ export { ThreadStatusQueueService } from './thread-status-queue.service.js';
10
+ import type { MessageQueueService } from './message-queue.service.js';
11
+ /** Store the message queue instance for use by other services (e.g. MessageRouterService). */
12
+ export declare function setMessageQueueInstance(instance: MessageQueueService): void;
13
+ /** Get the stored message queue instance, or null if not set. */
14
+ export declare function getMessageQueueInstance(): MessageQueueService | null;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,8FAA8F;AAC9F,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAE3E;AAED,iEAAiE;AACjE,wBAAgB,uBAAuB,IAAI,mBAAmB,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Messaging Services Barrel Export
3
+ *
4
+ * @module services/messaging
5
+ */
6
+ export { MessageQueueService } from './message-queue.service.js';
7
+ export { QueueProcessorService } from './queue-processor.service.js';
8
+ export { ResponseRouterService } from './response-router.service.js';
9
+ export { ThreadStatusQueueService } from './thread-status-queue.service.js';
10
+ /** Module-level reference to the message queue instance (set by CrewlyServer on startup). */
11
+ let _mqInstance = null;
12
+ /** Store the message queue instance for use by other services (e.g. MessageRouterService). */
13
+ export function setMessageQueueInstance(instance) {
14
+ _mqInstance = instance;
15
+ }
16
+ /** Get the stored message queue instance, or null if not set. */
17
+ export function getMessageQueueInstance() {
18
+ return _mqInstance;
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,6FAA6F;AAC7F,IAAI,WAAW,GAA+B,IAAI,CAAC;AAEnD,8FAA8F;AAC9F,MAAM,UAAU,uBAAuB,CAAC,QAA6B;IACnE,WAAW,GAAG,QAAQ,CAAC;AACzB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,uBAAuB;IACrC,OAAO,WAAW,CAAC;AACrB,CAAC"}