crewly 1.5.8 → 1.5.10

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 (265) hide show
  1. package/config/skills/_common/lib.sh +47 -0
  2. package/config/skills/agent/browse-stealth/execute.sh +7 -7
  3. package/config/skills/agent/competitor-content-tracker/execute.sh +13 -13
  4. package/config/skills/agent/content-calendar/execute.sh +29 -29
  5. package/config/skills/agent/content-repurposer/execute.sh +8 -8
  6. package/config/skills/agent/content-writer/execute.sh +22 -22
  7. package/config/skills/agent/core/accept-task/execute.sh +6 -6
  8. package/config/skills/agent/core/block-task/execute.sh +5 -5
  9. package/config/skills/agent/core/check-quality-gates/execute.sh +5 -5
  10. package/config/skills/agent/core/complete-task/execute.sh +13 -13
  11. package/config/skills/agent/core/generate-pdf/execute.sh +4 -4
  12. package/config/skills/agent/core/get-my-context/execute.sh +5 -5
  13. package/config/skills/agent/core/get-my-tasks/execute.sh +4 -4
  14. package/config/skills/agent/core/get-sops/execute.sh +4 -4
  15. package/config/skills/agent/core/get-team-norms/execute.sh +4 -4
  16. package/config/skills/agent/core/handoff-task/execute.sh +8 -8
  17. package/config/skills/agent/core/manage-knowledge/execute.sh +14 -14
  18. package/config/skills/agent/core/marketplace-search/execute.sh +6 -6
  19. package/config/skills/agent/core/query-knowledge/execute.sh +5 -5
  20. package/config/skills/agent/core/read-task/execute.sh +2 -2
  21. package/config/skills/agent/core/recall/execute.sh +5 -5
  22. package/config/skills/agent/core/record-learning/execute.sh +7 -7
  23. package/config/skills/agent/core/register-self/execute.sh +6 -6
  24. package/config/skills/agent/core/remember/execute.sh +9 -9
  25. package/config/skills/agent/core/report-progress/execute.sh +5 -5
  26. package/config/skills/agent/core/report-status/execute.sh +14 -14
  27. package/config/skills/agent/core/save-working-state/execute.sh +5 -5
  28. package/config/skills/agent/core/schedule-check/execute.sh +9 -9
  29. package/config/skills/agent/core/send-chat-response/execute.sh +5 -5
  30. package/config/skills/agent/core/send-message/execute.sh +6 -5
  31. package/config/skills/agent/core/update-team-norm/execute.sh +9 -9
  32. package/config/skills/agent/core/update-user-profile/execute.sh +2 -2
  33. package/config/skills/agent/marketing/brand-onboarding/execute.sh +8 -8
  34. package/config/skills/agent/marketing/submit-for-approval/execute.sh +10 -10
  35. package/config/skills/agent/marketing/weekly-content-planning/execute.sh +8 -8
  36. package/config/skills/agent/marketing/weekly-marketing-report/execute.sh +5 -5
  37. package/config/skills/agent/trend-monitor/execute.sh +12 -12
  38. package/config/skills/auditor/score-task/execute.sh +4 -4
  39. package/config/skills/orchestrator/assign-task/execute.sh +1 -1
  40. package/config/skills/orchestrator/assign-team-to-project/execute.sh +2 -2
  41. package/config/skills/orchestrator/broadcast/execute.sh +2 -2
  42. package/config/skills/orchestrator/broadcast-to-org/execute.sh +3 -3
  43. package/config/skills/orchestrator/cancel-all-schedules/execute.sh +3 -3
  44. package/config/skills/orchestrator/cancel-cron/execute.sh +2 -2
  45. package/config/skills/orchestrator/cancel-schedule/execute.sh +2 -2
  46. package/config/skills/orchestrator/complete-task/execute.sh +1 -1
  47. package/config/skills/orchestrator/create-cron/execute.sh +6 -6
  48. package/config/skills/orchestrator/create-project/execute.sh +2 -2
  49. package/config/skills/orchestrator/create-team/execute.sh +2 -2
  50. package/config/skills/orchestrator/delegate-task/execute.sh +19 -19
  51. package/config/skills/orchestrator/get-agent-logs/execute.sh +3 -3
  52. package/config/skills/orchestrator/get-agent-status/execute.sh +2 -2
  53. package/config/skills/orchestrator/get-tasks/execute.sh +2 -2
  54. package/config/skills/orchestrator/handle-agent-failure/execute.sh +7 -7
  55. package/config/skills/orchestrator/list-cron/execute.sh +3 -3
  56. package/config/skills/orchestrator/list-schedules/execute.sh +2 -2
  57. package/config/skills/orchestrator/query-knowledge/execute.sh +5 -5
  58. package/config/skills/orchestrator/read-session-logs/execute.sh +3 -3
  59. package/config/skills/orchestrator/read-system-logs/execute.sh +3 -3
  60. package/config/skills/orchestrator/recall/execute.sh +2 -2
  61. package/config/skills/orchestrator/record-failure/execute.sh +2 -2
  62. package/config/skills/orchestrator/record-learning/execute.sh +2 -2
  63. package/config/skills/orchestrator/record-success/execute.sh +2 -2
  64. package/config/skills/orchestrator/register-self/execute.sh +4 -4
  65. package/config/skills/orchestrator/remember/execute.sh +3 -3
  66. package/config/skills/orchestrator/report-bug/execute.sh +5 -5
  67. package/config/skills/orchestrator/resume-session/execute.sh +2 -2
  68. package/config/skills/orchestrator/schedule-check/execute.sh +10 -10
  69. package/config/skills/orchestrator/send-key/execute.sh +6 -6
  70. package/config/skills/orchestrator/send-message/execute.sh +7 -6
  71. package/config/skills/orchestrator/set-goal/execute.sh +2 -2
  72. package/config/skills/orchestrator/start-agent/execute.sh +3 -3
  73. package/config/skills/orchestrator/start-team/execute.sh +2 -2
  74. package/config/skills/orchestrator/stop-agent/execute.sh +3 -3
  75. package/config/skills/orchestrator/stop-team/execute.sh +2 -2
  76. package/config/skills/orchestrator/subscribe-event/execute.sh +3 -3
  77. package/config/skills/orchestrator/terminate-agent/execute.sh +2 -2
  78. package/config/skills/orchestrator/unsubscribe-event/execute.sh +2 -2
  79. package/config/skills/orchestrator/update-cron/execute.sh +3 -3
  80. package/config/skills/orchestrator/update-focus/execute.sh +2 -2
  81. package/config/skills/orchestrator/update-team/execute.sh +3 -3
  82. package/config/skills/team-leader/aggregate-results/execute.sh +7 -7
  83. package/config/skills/team-leader/decompose-goal/execute.sh +5 -5
  84. package/config/skills/team-leader/delegate-task/execute.sh +13 -13
  85. package/config/skills/team-leader/handle-failure/execute.sh +10 -10
  86. package/config/skills/team-leader/schedule-check/execute.sh +9 -9
  87. package/config/skills/team-leader/start-agent/execute.sh +4 -4
  88. package/config/skills/team-leader/stop-agent/execute.sh +4 -4
  89. package/config/skills/team-leader/verify-output/execute.sh +8 -8
  90. package/config/templates/cloud-deploy.json +119 -0
  91. package/config/templates/dev-fullstack/template.json +64 -17
  92. package/config/templates/research-analysis/template.json +44 -15
  93. package/config/templates/social-media-ops/template.json +43 -15
  94. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts +31 -0
  95. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -0
  96. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +94 -0
  97. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -0
  98. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.routes.d.ts +19 -0
  99. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.routes.d.ts.map +1 -0
  100. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.routes.js +25 -0
  101. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.routes.js.map +1 -0
  102. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +11 -3
  103. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  104. package/dist/backend/backend/src/controllers/browser/browser.controller.js +56 -26
  105. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  106. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  107. package/dist/backend/backend/src/controllers/browser/browser.routes.js +3 -1
  108. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  109. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +16 -0
  110. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  111. package/dist/backend/backend/src/controllers/chat/chat.controller.js +39 -2
  112. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  113. package/dist/backend/backend/src/controllers/chat/chat.routes.d.ts.map +1 -1
  114. package/dist/backend/backend/src/controllers/chat/chat.routes.js +3 -1
  115. package/dist/backend/backend/src/controllers/chat/chat.routes.js.map +1 -1
  116. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +15 -0
  117. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  118. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +45 -0
  119. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  120. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +1 -0
  121. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
  122. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +3 -1
  123. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
  124. package/dist/backend/backend/src/controllers/index.d.ts.map +1 -1
  125. package/dist/backend/backend/src/controllers/index.js +2 -0
  126. package/dist/backend/backend/src/controllers/index.js.map +1 -1
  127. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +15 -0
  128. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
  129. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +35 -1
  130. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
  131. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  132. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +2 -1
  133. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  134. package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.d.ts.map +1 -1
  135. package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.js +7 -1
  136. package/dist/backend/backend/src/controllers/monitoring/monitoring.routes.js.map +1 -1
  137. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  138. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +29 -6
  139. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  140. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts +29 -0
  141. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts.map +1 -1
  142. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js +76 -0
  143. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js.map +1 -1
  144. package/dist/backend/backend/src/controllers/project/project.controller.d.ts +16 -0
  145. package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
  146. package/dist/backend/backend/src/controllers/project/project.controller.js +47 -0
  147. package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
  148. package/dist/backend/backend/src/controllers/project/project.routes.d.ts.map +1 -1
  149. package/dist/backend/backend/src/controllers/project/project.routes.js +3 -1
  150. package/dist/backend/backend/src/controllers/project/project.routes.js.map +1 -1
  151. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
  152. package/dist/backend/backend/src/controllers/system/scheduler.controller.js +10 -2
  153. package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
  154. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  155. package/dist/backend/backend/src/controllers/team/team.controller.js +34 -3
  156. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  157. package/dist/backend/backend/src/index.d.ts.map +1 -1
  158. package/dist/backend/backend/src/index.js +18 -4
  159. package/dist/backend/backend/src/index.js.map +1 -1
  160. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/agent/agent-registration.service.js +25 -0
  162. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +2 -0
  164. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -1
  165. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +19 -0
  166. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -1
  167. package/dist/backend/backend/src/services/agent/crewly-agent/agent-stream.service.d.ts +145 -0
  168. package/dist/backend/backend/src/services/agent/crewly-agent/agent-stream.service.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/agent/crewly-agent/agent-stream.service.js +133 -0
  170. package/dist/backend/backend/src/services/agent/crewly-agent/agent-stream.service.js.map +1 -0
  171. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
  172. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
  174. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
  175. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -1
  176. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +8 -0
  177. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -1
  178. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
  179. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
  180. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
  181. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
  182. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
  183. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
  184. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
  185. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
  186. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
  187. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
  188. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
  189. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
  190. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +44 -0
  191. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +323 -1
  193. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -1
  194. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +21 -0
  195. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +7 -0
  197. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  198. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +4 -1
  199. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +26 -11
  201. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/chat/chat-highlights.service.d.ts +100 -0
  203. package/dist/backend/backend/src/services/chat/chat-highlights.service.d.ts.map +1 -0
  204. package/dist/backend/backend/src/services/chat/chat-highlights.service.js +145 -0
  205. package/dist/backend/backend/src/services/chat/chat-highlights.service.js.map +1 -0
  206. package/dist/backend/backend/src/services/chat/chat-sanitizer.service.d.ts +76 -0
  207. package/dist/backend/backend/src/services/chat/chat-sanitizer.service.d.ts.map +1 -0
  208. package/dist/backend/backend/src/services/chat/chat-sanitizer.service.js +127 -0
  209. package/dist/backend/backend/src/services/chat/chat-sanitizer.service.js.map +1 -0
  210. package/dist/backend/backend/src/services/chat/chat.service.d.ts +8 -0
  211. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/chat/chat.service.js +27 -1
  213. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  214. package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -1
  215. package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
  216. package/dist/backend/backend/src/services/marketplace/index.js +1 -1
  217. package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
  218. package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts +11 -0
  219. package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
  220. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +31 -0
  221. package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
  222. package/dist/backend/backend/src/services/monitoring/token-estimator.service.d.ts +197 -0
  223. package/dist/backend/backend/src/services/monitoring/token-estimator.service.d.ts.map +1 -0
  224. package/dist/backend/backend/src/services/monitoring/token-estimator.service.js +408 -0
  225. package/dist/backend/backend/src/services/monitoring/token-estimator.service.js.map +1 -0
  226. package/dist/backend/backend/src/services/project/project-search.service.d.ts +62 -0
  227. package/dist/backend/backend/src/services/project/project-search.service.d.ts.map +1 -0
  228. package/dist/backend/backend/src/services/project/project-search.service.js +107 -0
  229. package/dist/backend/backend/src/services/project/project-search.service.js.map +1 -0
  230. package/dist/backend/backend/src/services/quality/quality-gate.service.d.ts +11 -0
  231. package/dist/backend/backend/src/services/quality/quality-gate.service.d.ts.map +1 -1
  232. package/dist/backend/backend/src/services/quality/quality-gate.service.js +93 -19
  233. package/dist/backend/backend/src/services/quality/quality-gate.service.js.map +1 -1
  234. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  235. package/dist/backend/backend/src/services/session/session-command-helper.js +11 -5
  236. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  237. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +8 -2
  238. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  239. package/dist/backend/backend/src/services/workflow/scheduler.service.js +30 -6
  240. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  241. package/dist/backend/backend/src/types/settings.types.d.ts +3 -0
  242. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  243. package/dist/backend/backend/src/types/settings.types.js +1 -0
  244. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  245. package/dist/cli/backend/src/types/settings.types.d.ts +3 -0
  246. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  247. package/dist/cli/backend/src/types/settings.types.js +1 -0
  248. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  249. package/dist/cli/cli/src/commands/stop.d.ts.map +1 -1
  250. package/dist/cli/cli/src/commands/stop.js +3 -0
  251. package/dist/cli/cli/src/commands/stop.js.map +1 -1
  252. package/dist/cli/cli/src/utils/license-check.d.ts +70 -0
  253. package/dist/cli/cli/src/utils/license-check.d.ts.map +1 -0
  254. package/dist/cli/cli/src/utils/license-check.js +124 -0
  255. package/dist/cli/cli/src/utils/license-check.js.map +1 -0
  256. package/dist/cli/cli/src/utils/process-cleanup.d.ts +9 -0
  257. package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -1
  258. package/dist/cli/cli/src/utils/process-cleanup.js +48 -0
  259. package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -1
  260. package/frontend/dist/assets/index-76782e9e.js +5215 -0
  261. package/frontend/dist/assets/index-b19b2478.css +33 -0
  262. package/frontend/dist/index.html +2 -2
  263. package/package.json +1 -1
  264. package/frontend/dist/assets/index-512efc8e.js +0 -4921
  265. package/frontend/dist/assets/index-dc6ac165.css +0 -33
@@ -0,0 +1,124 @@
1
+ /**
2
+ * CLI License Check Utilities
3
+ *
4
+ * Provides functions for verifying user license tier and feature entitlements
5
+ * against the Crewly backend. Used by CLI commands to gate premium features.
6
+ *
7
+ * When the backend is unreachable, defaults to free tier (basic_teams only)
8
+ * to ensure graceful degradation.
9
+ *
10
+ * @module cli/utils/license-check
11
+ */
12
+ import chalk from 'chalk';
13
+ import { WEB_CONSTANTS } from '../../../config/constants.js';
14
+ // ========================= Constants =========================
15
+ /** Backend base URL for license verification */
16
+ const BACKEND_URL = `http://localhost:${WEB_CONSTANTS.PORTS.BACKEND}`;
17
+ /** License verification endpoint */
18
+ const LICENSE_VERIFY_ENDPOINT = '/api/cloud/license/verify';
19
+ /** Request timeout in milliseconds */
20
+ const LICENSE_CHECK_TIMEOUT_MS = 5000;
21
+ /** Features available on the free tier when backend is unreachable */
22
+ const FREE_TIER_FEATURES = ['basic_teams'];
23
+ /** Free tier name */
24
+ const FREE_TIER_NAME = 'free';
25
+ // ========================= Functions =========================
26
+ /**
27
+ * Checks whether the current user's license allows access to a specific feature.
28
+ *
29
+ * Queries GET /api/cloud/license/verify on the local backend and inspects the
30
+ * returned features array. If the backend is unreachable or returns an error,
31
+ * defaults to free tier (only `basic_teams` allowed).
32
+ *
33
+ * @param requiredFeature - The feature identifier to check (e.g. 'premium_templates', 'cloud_relay')
34
+ * @returns License check result with allowed status, tier, and optional message
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const result = await checkLicense('premium_templates');
39
+ * if (!result.allowed) {
40
+ * console.log(result.message);
41
+ * }
42
+ * ```
43
+ */
44
+ export async function checkLicense(requiredFeature) {
45
+ try {
46
+ const controller = new AbortController();
47
+ const timeout = setTimeout(() => controller.abort(), LICENSE_CHECK_TIMEOUT_MS);
48
+ const response = await fetch(`${BACKEND_URL}${LICENSE_VERIFY_ENDPOINT}`, {
49
+ signal: controller.signal,
50
+ headers: { 'Accept': 'application/json' },
51
+ });
52
+ clearTimeout(timeout);
53
+ if (!response.ok) {
54
+ return buildFreeTierResult(requiredFeature);
55
+ }
56
+ const body = (await response.json());
57
+ if (!body.success || !body.data?.valid) {
58
+ return buildFreeTierResult(requiredFeature);
59
+ }
60
+ const { tier, features } = body.data;
61
+ const allowed = Array.isArray(features) && features.includes(requiredFeature);
62
+ if (allowed) {
63
+ return { allowed: true, tier };
64
+ }
65
+ return {
66
+ allowed: false,
67
+ tier,
68
+ message: `Feature "${requiredFeature}" requires a higher plan. Current tier: ${tier}. Upgrade at https://crewlyai.com/pricing`,
69
+ };
70
+ }
71
+ catch {
72
+ return buildFreeTierResult(requiredFeature);
73
+ }
74
+ }
75
+ /**
76
+ * Builds a license check result assuming free tier access.
77
+ * Used when the backend is unreachable or returns invalid data.
78
+ *
79
+ * @param requiredFeature - The feature that was requested
80
+ * @returns A LicenseCheckResult defaulting to free tier
81
+ */
82
+ function buildFreeTierResult(requiredFeature) {
83
+ const allowed = FREE_TIER_FEATURES.includes(requiredFeature);
84
+ if (allowed) {
85
+ return { allowed: true, tier: FREE_TIER_NAME };
86
+ }
87
+ return {
88
+ allowed: false,
89
+ tier: FREE_TIER_NAME,
90
+ message: `Feature "${requiredFeature}" is not available on the free tier. Connect to Crewly Cloud to unlock premium features: crewly cloud login`,
91
+ };
92
+ }
93
+ /**
94
+ * Guards a CLI command by verifying the user has access to a required feature.
95
+ *
96
+ * Calls {@link checkLicense} and, if the feature is not allowed, prints a
97
+ * user-friendly error message using chalk and exits the process with code 1.
98
+ *
99
+ * @param feature - The feature identifier required by the command
100
+ * @throws Exits the process (process.exit(1)) if the feature is not allowed
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // At the top of a premium command handler:
105
+ * await requireFeature('premium_templates');
106
+ * // If we reach here, the user has access
107
+ * ```
108
+ */
109
+ export async function requireFeature(feature) {
110
+ const result = await checkLicense(feature);
111
+ if (result.allowed) {
112
+ return;
113
+ }
114
+ console.error('');
115
+ console.error(chalk.red(' ✖ Feature not available'));
116
+ console.error('');
117
+ console.error(` ${chalk.yellow(result.message ?? `Feature "${feature}" requires a premium license.`)}`);
118
+ console.error('');
119
+ console.error(` ${chalk.gray(`Current tier: ${result.tier}`)}`);
120
+ console.error(` ${chalk.cyan('Upgrade → https://crewlyai.com/pricing')}`);
121
+ console.error('');
122
+ process.exit(1);
123
+ }
124
+ //# sourceMappingURL=license-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-check.js","sourceRoot":"","sources":["../../../../../cli/src/utils/license-check.ts"],"names":[],"mappings":"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"}
@@ -12,4 +12,13 @@
12
12
  * @param logFn - Logging function for status messages.
13
13
  */
14
14
  export declare function killZombieProcesses(port: number, logFn?: (msg: string) => void): void;
15
+ /**
16
+ * Kill orphaned vitest worker processes that survived agent session termination.
17
+ * These accumulate when exec() kills only the parent shell but leaves
18
+ * vitest's forked worker pool running.
19
+ *
20
+ * @param myPid - Current process PID to exclude from killing.
21
+ * @param logFn - Logging function for status messages.
22
+ */
23
+ export declare function killOrphanedTestProcesses(myPid?: number, logFn?: (msg: string) => void): void;
15
24
  //# sourceMappingURL=process-cleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-cleanup.d.ts","sourceRoot":"","sources":["../../../../../cli/src/utils/process-cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GAAG,IAAI,CA8DlG"}
1
+ {"version":3,"file":"process-cleanup.d.ts","sourceRoot":"","sources":["../../../../../cli/src/utils/process-cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GAAG,IAAI,CAiElG;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,GAAE,MAAoB,EAC3B,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAkB,GACxC,IAAI,CAsCN"}
@@ -72,5 +72,53 @@ export function killZombieProcesses(port, logFn = console.log) {
72
72
  catch {
73
73
  // No stale processes found
74
74
  }
75
+ // Kill orphaned vitest/test runner processes from previous agent sessions
76
+ killOrphanedTestProcesses(myPid, logFn);
77
+ }
78
+ /**
79
+ * Kill orphaned vitest worker processes that survived agent session termination.
80
+ * These accumulate when exec() kills only the parent shell but leaves
81
+ * vitest's forked worker pool running.
82
+ *
83
+ * @param myPid - Current process PID to exclude from killing.
84
+ * @param logFn - Logging function for status messages.
85
+ */
86
+ export function killOrphanedTestProcesses(myPid = process.pid, logFn = console.log) {
87
+ try {
88
+ const result = execSync('ps -eo pid,ppid,command | grep -E "node.*vitest|npx vitest" | grep -v grep', { encoding: 'utf8', timeout: 5000 }).trim();
89
+ if (!result)
90
+ return;
91
+ const pids = result
92
+ .split('\n')
93
+ .map(line => parseInt(line.trim()))
94
+ .filter(pid => !isNaN(pid) && pid !== myPid);
95
+ if (pids.length > 0) {
96
+ logFn(`Found ${pids.length} orphaned test process(es), killing...`);
97
+ for (const pid of pids) {
98
+ try {
99
+ process.kill(pid, 'SIGTERM');
100
+ }
101
+ catch {
102
+ // Already dead
103
+ }
104
+ }
105
+ // Force kill after a brief grace period
106
+ try {
107
+ execSync('sleep 1', { timeout: 3000 });
108
+ }
109
+ catch { /* ignore */ }
110
+ for (const pid of pids) {
111
+ try {
112
+ process.kill(pid, 'SIGKILL');
113
+ }
114
+ catch {
115
+ // Already dead
116
+ }
117
+ }
118
+ }
119
+ }
120
+ catch {
121
+ // No orphaned test processes found
122
+ }
75
123
  }
76
124
  //# sourceMappingURL=process-cleanup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-cleanup.js","sourceRoot":"","sources":["../../../../../cli/src/utils/process-cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAA+B,OAAO,CAAC,GAAG;IAC3F,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;IAE1B,kCAAkC;IAClC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACjF,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAE1C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,+BAA+B,IAAI,cAAc,CAAC,CAAC;YACjF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACR,eAAe;gBAChB,CAAC;YACF,CAAC;YACD,iDAAiD;YACjD,IAAI,CAAC;gBACJ,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACR,eAAe;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,+DAA+D;IAChE,CAAC;IAED,oDAAoD;IACpD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CACtB,8EAA8E,EAC9E,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CACnC,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,MAAM;iBACtB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC;YAE9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,SAAS,SAAS,CAAC,MAAM,wCAAwC,CAAC,CAAC;gBACzE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC9B,CAAC;oBAAC,MAAM,CAAC;wBACR,eAAe;oBAChB,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,2BAA2B;IAC5B,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"process-cleanup.js","sourceRoot":"","sources":["../../../../../cli/src/utils/process-cleanup.ts"],"names":[],"mappings":"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"}