crewly 1.2.3 → 1.2.4

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 (610) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/config/constants.ts +44 -1
  4. package/config/index.ts +4 -0
  5. package/config/roles/orchestrator/prompt.md +30 -2
  6. package/config/roles/team-leader/prompt.md +169 -0
  7. package/config/roles/team-leader/role.json +13 -0
  8. package/config/roles/team-leader/tl-addon.md +142 -0
  9. package/config/runtime_scripts/runtime-config.json +7 -0
  10. package/config/skills/_common/lib.sh +37 -0
  11. package/config/skills/agent/computer-use/execute.sh +228 -0
  12. package/config/skills/agent/computer-use/instructions.md +103 -0
  13. package/config/skills/agent/computer-use/lib/accessibility.sh +292 -0
  14. package/config/skills/agent/computer-use/lib/applescript.sh +117 -0
  15. package/config/skills/agent/computer-use/lib/discover.sh +122 -0
  16. package/config/skills/agent/computer-use/lib/playwright.sh +153 -0
  17. package/config/skills/agent/computer-use/lib/screenshot.sh +61 -0
  18. package/config/skills/agent/computer-use/skill.json +29 -0
  19. package/config/skills/agent/core/accept-task/execute.sh +7 -1
  20. package/config/skills/agent/core/complete-task/execute.sh +38 -1
  21. package/config/skills/agent/core/report-status/execute.sh +51 -2
  22. package/config/skills/agent/desktop-app-control/execute.sh +561 -0
  23. package/config/skills/agent/desktop-app-control/instructions.md +102 -0
  24. package/config/skills/agent/desktop-app-control/skill.json +33 -0
  25. package/config/skills/orchestrator/broadcast-to-org/execute.sh +88 -0
  26. package/config/skills/orchestrator/broadcast-to-org/instructions.md +51 -0
  27. package/config/skills/orchestrator/broadcast-to-org/skill.json +20 -0
  28. package/config/skills/orchestrator/delegate-task/execute.sh +75 -10
  29. package/config/skills/orchestrator/delegate-task/instructions.md +11 -1
  30. package/config/skills/orchestrator/handle-agent-failure/execute.sh +45 -0
  31. package/config/skills/orchestrator/handle-agent-failure/instructions.md +29 -0
  32. package/config/skills/orchestrator/handle-agent-failure/skill.json +20 -0
  33. package/config/skills/orchestrator/restart-crewly/instructions.md +9 -2
  34. package/config/skills/team-leader/_common/lib.sh +4 -0
  35. package/config/skills/team-leader/aggregate-results/execute.sh +168 -0
  36. package/config/skills/team-leader/aggregate-results/instructions.md +89 -0
  37. package/config/skills/team-leader/aggregate-results/skill.json +20 -0
  38. package/config/skills/team-leader/decompose-goal/execute.sh +86 -0
  39. package/config/skills/team-leader/decompose-goal/instructions.md +84 -0
  40. package/config/skills/team-leader/decompose-goal/skill.json +20 -0
  41. package/config/skills/team-leader/delegate-task/execute.sh +142 -0
  42. package/config/skills/team-leader/delegate-task/instructions.md +55 -0
  43. package/config/skills/team-leader/delegate-task/skill.json +20 -0
  44. package/config/skills/team-leader/handle-failure/execute.sh +119 -0
  45. package/config/skills/team-leader/handle-failure/instructions.md +93 -0
  46. package/config/skills/team-leader/handle-failure/skill.json +20 -0
  47. package/config/skills/team-leader/schedule-check/execute.sh +65 -0
  48. package/config/skills/team-leader/schedule-check/execute.test.sh +247 -0
  49. package/config/skills/team-leader/schedule-check/instructions.md +49 -0
  50. package/config/skills/team-leader/schedule-check/skill.json +20 -0
  51. package/config/skills/team-leader/start-agent/execute.sh +39 -0
  52. package/config/skills/team-leader/start-agent/instructions.md +48 -0
  53. package/config/skills/team-leader/start-agent/skill.json +20 -0
  54. package/config/skills/team-leader/stop-agent/execute.sh +39 -0
  55. package/config/skills/team-leader/stop-agent/instructions.md +49 -0
  56. package/config/skills/team-leader/stop-agent/skill.json +20 -0
  57. package/config/skills/team-leader/verify-output/execute.sh +296 -0
  58. package/config/skills/team-leader/verify-output/instructions.md +122 -0
  59. package/config/skills/team-leader/verify-output/skill.json +20 -0
  60. package/config/templates/core-team/demo-script.md +41 -0
  61. package/config/templates/core-team/goals.md +20 -0
  62. package/config/templates/core-team/team.json +22 -0
  63. package/config/templates/dev-fullstack/template.json +115 -0
  64. package/config/templates/education-smb/README.md +27 -0
  65. package/config/templates/education-smb/goals.md +16 -0
  66. package/config/templates/education-smb/knowledge/docs/content-standards.md +24 -0
  67. package/config/templates/education-smb/knowledge/docs/education-industry-context.md +13 -0
  68. package/config/templates/education-smb/knowledge/index.json +24 -0
  69. package/config/templates/education-smb/learned-patterns.json +16 -0
  70. package/config/templates/education-smb/quality-gates.yaml +66 -0
  71. package/config/templates/education-smb/roles/analytics-specialist.md +6 -0
  72. package/config/templates/education-smb/roles/content-creator.md +6 -0
  73. package/config/templates/education-smb/roles/curriculum-designer.md +6 -0
  74. package/config/templates/education-smb/roles/engagement-manager.md +6 -0
  75. package/config/templates/education-smb/team.json +40 -0
  76. package/config/templates/education-smb/template.json +26 -0
  77. package/config/templates/education-smb/workflows/course-content-generation.yaml +44 -0
  78. package/config/templates/education-smb/workflows/reporting.yaml +31 -0
  79. package/config/templates/education-smb/workflows/student-communication.yaml +44 -0
  80. package/config/templates/education-smb/workflows.yaml +40 -0
  81. package/config/templates/insurance-smb/README.md +28 -0
  82. package/config/templates/insurance-smb/goals.md +21 -0
  83. package/config/templates/insurance-smb/knowledge/docs/compliance-checklist.md +28 -0
  84. package/config/templates/insurance-smb/knowledge/docs/insurance-industry-context.md +23 -0
  85. package/config/templates/insurance-smb/knowledge/index.json +24 -0
  86. package/config/templates/insurance-smb/learned-patterns.json +16 -0
  87. package/config/templates/insurance-smb/quality-gates.yaml +54 -0
  88. package/config/templates/insurance-smb/roles/claims-processor.md +6 -0
  89. package/config/templates/insurance-smb/roles/client-manager.md +6 -0
  90. package/config/templates/insurance-smb/roles/compliance-officer.md +6 -0
  91. package/config/templates/insurance-smb/roles/marketing-specialist.md +6 -0
  92. package/config/templates/insurance-smb/roles/policy-analyst.md +6 -0
  93. package/config/templates/insurance-smb/team.json +48 -0
  94. package/config/templates/insurance-smb/template.json +26 -0
  95. package/config/templates/insurance-smb/workflows/claims-processing.yaml +48 -0
  96. package/config/templates/insurance-smb/workflows.yaml +43 -0
  97. package/config/templates/research-analysis/template.json +88 -0
  98. package/config/templates/social-media-ops/template.json +85 -0
  99. package/config/templates/video-production/template.json +123 -0
  100. package/dist/backend/backend/src/constants.d.ts +303 -15
  101. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  102. package/dist/backend/backend/src/constants.js +296 -15
  103. package/dist/backend/backend/src/constants.js.map +1 -1
  104. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  105. package/dist/backend/backend/src/controllers/chat/chat.controller.js +69 -48
  106. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  107. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts +81 -0
  108. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts.map +1 -0
  109. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js +234 -0
  110. package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js.map +1 -0
  111. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +25 -0
  112. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts.map +1 -0
  113. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +38 -0
  114. package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -0
  115. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts +69 -0
  116. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts.map +1 -0
  117. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js +165 -0
  118. package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js.map +1 -0
  119. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts +23 -0
  120. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts.map +1 -0
  121. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js +32 -0
  122. package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js.map +1 -0
  123. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +52 -0
  124. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -0
  125. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +122 -0
  126. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -0
  127. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +21 -0
  128. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -0
  129. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +32 -0
  130. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -0
  131. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts +42 -0
  132. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts.map +1 -0
  133. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js +138 -0
  134. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js.map +1 -0
  135. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts +23 -0
  136. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts.map +1 -0
  137. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js +34 -0
  138. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js.map +1 -0
  139. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts +43 -0
  140. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts.map +1 -0
  141. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js +9 -0
  142. package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js.map +1 -0
  143. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts +7 -0
  144. package/dist/backend/backend/src/controllers/cloud/files/index.d.ts.map +1 -0
  145. package/dist/backend/backend/src/controllers/cloud/files/index.js +7 -0
  146. package/dist/backend/backend/src/controllers/cloud/files/index.js.map +1 -0
  147. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts +47 -0
  148. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts.map +1 -0
  149. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js +131 -0
  150. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js.map +1 -0
  151. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts +23 -0
  152. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts.map +1 -0
  153. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js +30 -0
  154. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js.map +1 -0
  155. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts +81 -0
  156. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts.map +1 -0
  157. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js +85 -0
  158. package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js.map +1 -0
  159. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts +7 -0
  160. package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts.map +1 -0
  161. package/dist/backend/backend/src/controllers/cloud/h5/index.js +7 -0
  162. package/dist/backend/backend/src/controllers/cloud/h5/index.js.map +1 -0
  163. package/dist/backend/backend/src/controllers/cloud/index.d.ts +14 -0
  164. package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
  165. package/dist/backend/backend/src/controllers/cloud/index.js +14 -0
  166. package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -0
  167. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts +7 -0
  168. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts.map +1 -0
  169. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js +7 -0
  170. package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js.map +1 -0
  171. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts +45 -0
  172. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts.map +1 -0
  173. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js +155 -0
  174. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js.map +1 -0
  175. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts +25 -0
  176. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts.map +1 -0
  177. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js +32 -0
  178. package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js.map +1 -0
  179. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +101 -0
  180. package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -0
  181. package/dist/backend/backend/src/controllers/cloud/relay.controller.js +343 -0
  182. package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -0
  183. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +29 -0
  184. package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -0
  185. package/dist/backend/backend/src/controllers/cloud/relay.routes.js +44 -0
  186. package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -0
  187. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts +49 -0
  188. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts.map +1 -0
  189. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js +152 -0
  190. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js.map +1 -0
  191. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts +24 -0
  192. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts.map +1 -0
  193. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js +34 -0
  194. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js.map +1 -0
  195. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts +90 -0
  196. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts.map +1 -0
  197. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js +48 -0
  198. package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js.map +1 -0
  199. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +7 -0
  200. package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -0
  201. package/dist/backend/backend/src/controllers/cloud/tasks/index.js +7 -0
  202. package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -0
  203. package/dist/backend/backend/src/controllers/marketplace/index.d.ts +2 -0
  204. package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
  205. package/dist/backend/backend/src/controllers/marketplace/index.js +3 -0
  206. package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
  207. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +12 -12
  208. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
  209. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -18
  210. package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
  211. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
  212. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +3 -0
  213. package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
  214. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts +111 -0
  215. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts.map +1 -0
  216. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js +220 -0
  217. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js.map +1 -0
  218. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +33 -0
  219. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -0
  220. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +50 -0
  221. package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -0
  222. package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
  223. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +4 -1
  224. package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
  225. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  226. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -2
  227. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  228. package/dist/backend/backend/src/controllers/payment/index.d.ts +7 -0
  229. package/dist/backend/backend/src/controllers/payment/index.d.ts.map +1 -0
  230. package/dist/backend/backend/src/controllers/payment/index.js +7 -0
  231. package/dist/backend/backend/src/controllers/payment/index.js.map +1 -0
  232. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +57 -0
  233. package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -0
  234. package/dist/backend/backend/src/controllers/payment/payment.controller.js +136 -0
  235. package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -0
  236. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +27 -0
  237. package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -0
  238. package/dist/backend/backend/src/controllers/payment/payment.routes.js +38 -0
  239. package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -0
  240. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +109 -0
  241. package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -0
  242. package/dist/backend/backend/src/controllers/payment/payment.types.js +54 -0
  243. package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -0
  244. package/dist/backend/backend/src/controllers/request-types.d.ts +34 -5
  245. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  246. package/dist/backend/backend/src/controllers/session/session.controller.d.ts +14 -0
  247. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  248. package/dist/backend/backend/src/controllers/session/session.controller.js +48 -0
  249. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  250. package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -1
  251. package/dist/backend/backend/src/controllers/session/session.routes.js +3 -1
  252. package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -1
  253. package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
  254. package/dist/backend/backend/src/controllers/system/scheduler.controller.js +4 -3
  255. package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
  256. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  257. package/dist/backend/backend/src/controllers/system/system.controller.js +13 -15
  258. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  259. package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
  260. package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
  261. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  262. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +40 -4
  263. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  264. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  265. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  266. package/dist/backend/backend/src/controllers/team/team.controller.js +259 -13
  267. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  268. package/dist/backend/backend/src/controllers/template/index.d.ts +8 -0
  269. package/dist/backend/backend/src/controllers/template/index.d.ts.map +1 -0
  270. package/dist/backend/backend/src/controllers/template/index.js +8 -0
  271. package/dist/backend/backend/src/controllers/template/index.js.map +1 -0
  272. package/dist/backend/backend/src/controllers/template/template.controller.d.ts +63 -0
  273. package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -0
  274. package/dist/backend/backend/src/controllers/template/template.controller.js +112 -0
  275. package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -0
  276. package/dist/backend/backend/src/controllers/template/template.routes.d.ts +24 -0
  277. package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -0
  278. package/dist/backend/backend/src/controllers/template/template.routes.js +33 -0
  279. package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -0
  280. package/dist/backend/backend/src/index.d.ts.map +1 -1
  281. package/dist/backend/backend/src/index.js +105 -13
  282. package/dist/backend/backend/src/index.js.map +1 -1
  283. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +3 -3
  284. package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
  285. package/dist/backend/backend/src/models/Team.d.ts +5 -0
  286. package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
  287. package/dist/backend/backend/src/models/Team.js +24 -0
  288. package/dist/backend/backend/src/models/Team.js.map +1 -1
  289. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  290. package/dist/backend/backend/src/routes/api.routes.js +21 -0
  291. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  292. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +1 -6
  293. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  294. package/dist/backend/backend/src/services/agent/agent-registration.service.js +211 -287
  295. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  296. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -1
  297. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  298. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +11 -2
  299. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  300. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +1 -0
  301. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +30 -43
  303. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  304. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
  305. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
  306. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +496 -0
  307. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
  308. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts +70 -0
  309. package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts.map +1 -0
  310. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js +131 -0
  311. package/dist/backend/backend/src/services/agent/openhands-runtime.service.js.map +1 -0
  312. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +21 -1
  313. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +32 -1
  315. package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
  316. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +77 -3
  317. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  318. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +281 -30
  319. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  320. package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  321. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
  322. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  323. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +49 -2
  324. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  325. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +124 -2
  326. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  327. package/dist/backend/backend/src/services/chat/chat.service.d.ts +10 -2
  328. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  329. package/dist/backend/backend/src/services/chat/chat.service.js +49 -8
  330. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  331. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts +174 -0
  332. package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts.map +1 -0
  333. package/dist/backend/backend/src/services/cloud/auth/auth.service.js +402 -0
  334. package/dist/backend/backend/src/services/cloud/auth/auth.service.js.map +1 -0
  335. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts +110 -0
  336. package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts.map +1 -0
  337. package/dist/backend/backend/src/services/cloud/auth/auth.types.js +54 -0
  338. package/dist/backend/backend/src/services/cloud/auth/auth.types.js.map +1 -0
  339. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts +36 -0
  340. package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts.map +1 -0
  341. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js +31 -0
  342. package/dist/backend/backend/src/services/cloud/auth/auth.utils.js.map +1 -0
  343. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts +47 -0
  344. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts.map +1 -0
  345. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js +116 -0
  346. package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js.map +1 -0
  347. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts +61 -0
  348. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts.map +1 -0
  349. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js +203 -0
  350. package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js.map +1 -0
  351. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts +46 -0
  352. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts.map +1 -0
  353. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +95 -0
  354. package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -0
  355. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts +136 -0
  356. package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts.map +1 -0
  357. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js +204 -0
  358. package/dist/backend/backend/src/services/cloud/cloud-auth.service.js.map +1 -0
  359. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +179 -0
  360. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
  361. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +237 -0
  362. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -0
  363. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts +97 -0
  364. package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts.map +1 -0
  365. package/dist/backend/backend/src/services/cloud/cloud-file.service.js +184 -0
  366. package/dist/backend/backend/src/services/cloud/cloud-file.service.js.map +1 -0
  367. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts +114 -0
  368. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts.map +1 -0
  369. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js +196 -0
  370. package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js.map +1 -0
  371. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +118 -0
  372. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -0
  373. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +322 -0
  374. package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -0
  375. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts +115 -0
  376. package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts.map +1 -0
  377. package/dist/backend/backend/src/services/cloud/cloud-task.service.js +265 -0
  378. package/dist/backend/backend/src/services/cloud/cloud-task.service.js.map +1 -0
  379. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts +175 -0
  380. package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -0
  381. package/dist/backend/backend/src/services/cloud/relay-client.service.js +392 -0
  382. package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -0
  383. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts +87 -0
  384. package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts.map +1 -0
  385. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js +140 -0
  386. package/dist/backend/backend/src/services/cloud/relay-crypto.service.js.map +1 -0
  387. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +183 -0
  388. package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -0
  389. package/dist/backend/backend/src/services/cloud/relay-server.service.js +523 -0
  390. package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -0
  391. package/dist/backend/backend/src/services/cloud/relay.types.d.ts +170 -0
  392. package/dist/backend/backend/src/services/cloud/relay.types.d.ts.map +1 -0
  393. package/dist/backend/backend/src/services/cloud/relay.types.js +69 -0
  394. package/dist/backend/backend/src/services/cloud/relay.types.js.map +1 -0
  395. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +9 -1
  396. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -1
  397. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +18 -4
  398. package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -1
  399. package/dist/backend/backend/src/services/core/env.config.d.ts +147 -0
  400. package/dist/backend/backend/src/services/core/env.config.d.ts.map +1 -0
  401. package/dist/backend/backend/src/services/core/env.config.js +226 -0
  402. package/dist/backend/backend/src/services/core/env.config.js.map +1 -0
  403. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  404. package/dist/backend/backend/src/services/core/storage.service.js +5 -0
  405. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  406. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +20 -0
  407. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +35 -0
  409. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  410. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts +160 -0
  411. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts.map +1 -0
  412. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js +261 -0
  413. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js.map +1 -0
  414. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts +161 -0
  415. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts.map +1 -0
  416. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js +276 -0
  417. package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js.map +1 -0
  418. package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
  419. package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
  420. package/dist/backend/backend/src/services/marketplace/index.js +2 -0
  421. package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
  422. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +2 -2
  423. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts +149 -0
  424. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts.map +1 -0
  425. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js +500 -0
  426. package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js.map +1 -0
  427. package/dist/backend/backend/src/services/mcp-server.js +1 -1
  428. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  429. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +90 -0
  430. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -0
  431. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +233 -0
  432. package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -0
  433. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +1 -1
  434. package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
  435. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +1 -1
  436. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  437. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  438. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -3
  439. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  440. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  441. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +29 -5
  442. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  443. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts +69 -0
  444. package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts.map +1 -0
  445. package/dist/backend/backend/src/services/payment/magic-moment.service.js +158 -0
  446. package/dist/backend/backend/src/services/payment/magic-moment.service.js.map +1 -0
  447. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts +95 -0
  448. package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts.map +1 -0
  449. package/dist/backend/backend/src/services/payment/magic-moment.types.js +91 -0
  450. package/dist/backend/backend/src/services/payment/magic-moment.types.js.map +1 -0
  451. package/dist/backend/backend/src/services/payment/stripe.service.d.ts +122 -0
  452. package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -0
  453. package/dist/backend/backend/src/services/payment/stripe.service.js +403 -0
  454. package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -0
  455. package/dist/backend/backend/src/services/plugin/index.d.ts +9 -0
  456. package/dist/backend/backend/src/services/plugin/index.d.ts.map +1 -0
  457. package/dist/backend/backend/src/services/plugin/index.js +8 -0
  458. package/dist/backend/backend/src/services/plugin/index.js.map +1 -0
  459. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts +102 -0
  460. package/dist/backend/backend/src/services/plugin/plugin.service.d.ts.map +1 -0
  461. package/dist/backend/backend/src/services/plugin/plugin.service.js +179 -0
  462. package/dist/backend/backend/src/services/plugin/plugin.service.js.map +1 -0
  463. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts +88 -0
  464. package/dist/backend/backend/src/services/plugin/plugin.types.d.ts.map +1 -0
  465. package/dist/backend/backend/src/services/plugin/plugin.types.js +17 -0
  466. package/dist/backend/backend/src/services/plugin/plugin.types.js.map +1 -0
  467. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +17 -0
  468. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
  469. package/dist/backend/backend/src/services/project/task-tracking.service.js +63 -0
  470. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
  471. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +14 -0
  472. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  473. package/dist/backend/backend/src/services/session/session-command-helper.js +54 -0
  474. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  475. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  476. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  477. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  478. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  479. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +15 -5
  480. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  481. package/dist/backend/backend/src/services/template/template.service.d.ts +153 -0
  482. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -0
  483. package/dist/backend/backend/src/services/template/template.service.js +372 -0
  484. package/dist/backend/backend/src/services/template/template.service.js.map +1 -0
  485. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +51 -0
  486. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  487. package/dist/backend/backend/src/services/workflow/scheduler.service.js +118 -2
  488. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  489. package/dist/backend/backend/src/types/chat.types.d.ts +39 -1
  490. package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
  491. package/dist/backend/backend/src/types/chat.types.js +45 -2
  492. package/dist/backend/backend/src/types/chat.types.js.map +1 -1
  493. package/dist/backend/backend/src/types/event-bus.types.d.ts +14 -2
  494. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  495. package/dist/backend/backend/src/types/event-bus.types.js +15 -0
  496. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  497. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts +101 -0
  498. package/dist/backend/backend/src/types/hierarchy-message.types.d.ts.map +1 -0
  499. package/dist/backend/backend/src/types/hierarchy-message.types.js +15 -0
  500. package/dist/backend/backend/src/types/hierarchy-message.types.js.map +1 -0
  501. package/dist/backend/backend/src/types/index.d.ts +54 -4
  502. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  503. package/dist/backend/backend/src/types/index.js.map +1 -1
  504. package/dist/backend/backend/src/types/marketplace.types.d.ts +99 -0
  505. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  506. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  507. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  508. package/dist/backend/backend/src/types/settings.types.js +4 -0
  509. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  510. package/dist/backend/backend/src/types/task-tracking.types.d.ts +79 -1
  511. package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
  512. package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
  513. package/dist/backend/backend/src/types/team-template.types.d.ts +166 -0
  514. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -0
  515. package/dist/backend/backend/src/types/team-template.types.js +139 -0
  516. package/dist/backend/backend/src/types/team-template.types.js.map +1 -0
  517. package/dist/backend/backend/src/utils/async-handler.d.ts +20 -0
  518. package/dist/backend/backend/src/utils/async-handler.d.ts.map +1 -0
  519. package/dist/backend/backend/src/utils/async-handler.js +29 -0
  520. package/dist/backend/backend/src/utils/async-handler.js.map +1 -0
  521. package/dist/backend/backend/src/utils/defaultPrompts.d.ts +4 -4
  522. package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
  523. package/dist/backend/backend/src/utils/defaultPrompts.js +16 -0
  524. package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
  525. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  526. package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  527. package/dist/backend/backend/src/utils/gemini-trusted-folders.js +94 -0
  528. package/dist/backend/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  529. package/dist/backend/backend/src/utils/message-serializer.d.ts +74 -0
  530. package/dist/backend/backend/src/utils/message-serializer.d.ts.map +1 -0
  531. package/dist/backend/backend/src/utils/message-serializer.js +380 -0
  532. package/dist/backend/backend/src/utils/message-serializer.js.map +1 -0
  533. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  534. package/dist/backend/backend/src/utils/terminal-string-ops.js +20 -11
  535. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  536. package/dist/backend/config/constants.d.ts +40 -1
  537. package/dist/backend/config/constants.d.ts.map +1 -1
  538. package/dist/backend/config/constants.js +41 -1
  539. package/dist/backend/config/constants.js.map +1 -1
  540. package/dist/backend/config/index.d.ts +2 -2
  541. package/dist/backend/config/index.d.ts.map +1 -1
  542. package/dist/backend/config/index.js +2 -2
  543. package/dist/backend/config/index.js.map +1 -1
  544. package/dist/cli/backend/src/constants.d.ts +303 -15
  545. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  546. package/dist/cli/backend/src/constants.js +296 -15
  547. package/dist/cli/backend/src/constants.js.map +1 -1
  548. package/dist/cli/backend/src/models/Team.d.ts +5 -0
  549. package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
  550. package/dist/cli/backend/src/models/Team.js +24 -0
  551. package/dist/cli/backend/src/models/Team.js.map +1 -1
  552. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  553. package/dist/cli/backend/src/services/core/storage.service.js +5 -0
  554. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  555. package/dist/cli/backend/src/services/mcp-server.js +1 -1
  556. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  557. package/dist/cli/backend/src/types/chat.types.d.ts +39 -1
  558. package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
  559. package/dist/cli/backend/src/types/chat.types.js +45 -2
  560. package/dist/cli/backend/src/types/chat.types.js.map +1 -1
  561. package/dist/cli/backend/src/types/index.d.ts +54 -4
  562. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  563. package/dist/cli/backend/src/types/index.js.map +1 -1
  564. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  565. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  566. package/dist/cli/backend/src/types/settings.types.js +4 -0
  567. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  568. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
  569. package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
  570. package/dist/cli/backend/src/utils/gemini-trusted-folders.js +94 -0
  571. package/dist/cli/backend/src/utils/gemini-trusted-folders.js.map +1 -0
  572. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  573. package/dist/cli/backend/src/utils/terminal-string-ops.js +20 -11
  574. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  575. package/dist/cli/cli/src/commands/onboard.d.ts +2 -1
  576. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  577. package/dist/cli/cli/src/commands/onboard.js +21 -8
  578. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  579. package/dist/cli/cli/src/commands/start.d.ts +1 -0
  580. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  581. package/dist/cli/cli/src/commands/start.js +71 -23
  582. package/dist/cli/cli/src/commands/start.js.map +1 -1
  583. package/dist/cli/cli/src/constants.d.ts +1 -1
  584. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  585. package/dist/cli/cli/src/constants.js +1 -1
  586. package/dist/cli/cli/src/constants.js.map +1 -1
  587. package/dist/cli/cli/src/index.js +1 -0
  588. package/dist/cli/cli/src/index.js.map +1 -1
  589. package/dist/cli/cli/src/utils/project-scaffold.d.ts +109 -0
  590. package/dist/cli/cli/src/utils/project-scaffold.d.ts.map +1 -0
  591. package/dist/cli/cli/src/utils/project-scaffold.js +346 -0
  592. package/dist/cli/cli/src/utils/project-scaffold.js.map +1 -0
  593. package/dist/cli/cli/src/utils/templates.d.ts +7 -2
  594. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
  595. package/dist/cli/cli/src/utils/templates.js +76 -7
  596. package/dist/cli/cli/src/utils/templates.js.map +1 -1
  597. package/dist/cli/config/constants.d.ts +40 -1
  598. package/dist/cli/config/constants.d.ts.map +1 -1
  599. package/dist/cli/config/constants.js +41 -1
  600. package/dist/cli/config/constants.js.map +1 -1
  601. package/dist/cli/config/index.d.ts +2 -2
  602. package/dist/cli/config/index.d.ts.map +1 -1
  603. package/dist/cli/config/index.js +2 -2
  604. package/dist/cli/config/index.js.map +1 -1
  605. package/frontend/dist/assets/index-510ab719.css +33 -0
  606. package/frontend/dist/assets/index-935cd846.js +4961 -0
  607. package/frontend/dist/index.html +2 -2
  608. package/package.json +9 -4
  609. package/frontend/dist/assets/index-a23214ae.js +0 -4919
  610. package/frontend/dist/assets/index-c407fe13.css +0 -33
@@ -197,11 +197,18 @@ export class OrchestratorHeartbeatMonitorService {
197
197
  }
198
198
  const activityTracker = PtyActivityTrackerService.getInstance();
199
199
  const idleTimeMs = activityTracker.getIdleTimeMs(ORCHESTRATOR_SESSION_NAME);
200
- // If recent activity detected, clear any pending heartbeat request
201
- if (idleTimeMs < ORCHESTRATOR_HEARTBEAT_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS) {
200
+ // Use API-specific idle time for heartbeat response detection.
201
+ // PTY activity alone is unreliable because heartbeat messages written
202
+ // to the PTY echo back and reset the general activity timer.
203
+ const apiIdleTimeMs = activityTracker.getApiIdleTimeMs(ORCHESTRATOR_SESSION_NAME);
204
+ // If recent API activity detected, clear any pending heartbeat request.
205
+ // Only API calls count as proof that the orchestrator is responsive —
206
+ // PTY output alone may just be echoed heartbeat messages.
207
+ if (apiIdleTimeMs < ORCHESTRATOR_HEARTBEAT_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS) {
202
208
  if (this.heartbeatRequestSentAt !== null) {
203
- this.logger.info('Orchestrator responded to heartbeat request, clearing pending state');
209
+ this.logger.info('Orchestrator responded to heartbeat request (API activity detected), clearing pending state');
204
210
  this.heartbeatRequestSentAt = null;
211
+ this.heartbeatRequestCount = 0;
205
212
  }
206
213
  // Track continuous in_progress duration. Spinner animation counts as
207
214
  // "activity" so idleTime stays low, but the orchestrator may be stuck
@@ -230,14 +237,29 @@ export class OrchestratorHeartbeatMonitorService {
230
237
  this.logger.warn('Orchestrator did not respond to heartbeat request, triggering auto-restart', {
231
238
  timeSinceRequestMs: timeSinceRequest,
232
239
  idleTimeMs,
240
+ apiIdleTimeMs,
233
241
  heartbeatRequestCount: this.heartbeatRequestCount,
234
242
  });
235
243
  this.heartbeatRequestSentAt = null;
244
+ this.heartbeatRequestCount = 0;
236
245
  await this.triggerAutoRestart();
237
246
  }
238
247
  return;
239
248
  }
240
- // No activity for HEARTBEAT_REQUEST_THRESHOLD_MS. If there's no queued
249
+ // Cap consecutive heartbeat requests to prevent spam when the
250
+ // orchestrator is stuck (e.g., ENOSPC). After MAX attempts without
251
+ // a real API response, trigger auto-restart instead.
252
+ const MAX_HEARTBEAT_REQUESTS = 3;
253
+ if (this.heartbeatRequestCount >= MAX_HEARTBEAT_REQUESTS) {
254
+ this.logger.warn('Max heartbeat requests reached without API response, triggering auto-restart', {
255
+ heartbeatRequestCount: this.heartbeatRequestCount,
256
+ apiIdleTimeMs,
257
+ });
258
+ this.heartbeatRequestCount = 0;
259
+ await this.triggerAutoRestart();
260
+ return;
261
+ }
262
+ // No API activity for HEARTBEAT_REQUEST_THRESHOLD_MS. If there's no queued
241
263
  // work, skip synthetic heartbeat pings to avoid idle token burn.
242
264
  const pendingWork = this.hasPendingWork ? this.hasPendingWork() : true;
243
265
  if (!pendingWork) {
@@ -245,8 +267,10 @@ export class OrchestratorHeartbeatMonitorService {
245
267
  return;
246
268
  }
247
269
  // Otherwise, send a heartbeat request.
248
- this.logger.info('Orchestrator idle, sending heartbeat request', {
270
+ this.logger.info('Orchestrator idle (no API activity), sending heartbeat request', {
249
271
  idleTimeMs,
272
+ apiIdleTimeMs,
273
+ heartbeatRequestCount: this.heartbeatRequestCount,
250
274
  });
251
275
  await this.sendHeartbeatRequest();
252
276
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator-heartbeat-monitor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator-heartbeat-monitor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EACN,yBAAyB,EACzB,gCAAgC,EAChC,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAqB/E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,mCAAmC;IACvC,MAAM,CAAC,QAAQ,GAA+C,IAAI,CAAC;IACnE,MAAM,CAAkB;IAEhC,4BAA4B;IACpB,UAAU,GAA0C,IAAI,CAAC;IAEjE,kEAAkE;IAC1D,sBAAsB,GAAkB,IAAI,CAAC;IAErD,0CAA0C;IAClC,qBAAqB,GAAG,CAAC,CAAC;IAElC,0CAA0C;IAClC,gBAAgB,GAAG,CAAC,CAAC;IAE7B,8BAA8B;IACtB,SAAS,GAAkB,IAAI,CAAC;IAExC;;sEAEkE;IAC1D,eAAe,GAAkB,IAAI,CAAC;IAE9C,sDAAsD;IAC9C,cAAc,GAA2B,IAAI,CAAC;IACtD,kFAAkF;IAC1E,cAAc,GAA2B,IAAI,CAAC;IAEtD;QACC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IACjG,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,mCAAmC,CAAC,QAAQ,EAAE,CAAC;YACnD,mCAAmC,CAAC,QAAQ,GAAG,IAAI,mCAAmC,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO,mCAAmC,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QACnB,IAAI,mCAAmC,CAAC,QAAQ,EAAE,CAAC;YAClD,mCAAmC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,mCAAmC,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,cAA+B,EAAE,cAA8B;QAC9E,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK;QACJ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACtD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;YAC3D,eAAe,EAAE,gCAAgC,CAAC,iBAAiB;YACnE,2BAA2B,EAAE,gCAAgC,CAAC,8BAA8B;YAC5F,kBAAkB,EAAE,gCAAgC,CAAC,oBAAoB;YACzE,oBAAoB,EAAE,gCAAgC,CAAC,uBAAuB;SAC9E,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;oBAC3C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACvD,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,EAAE,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,IAAI;QACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,SAAS;QACR,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACP,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;SACrC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,YAAY;QACjB,8BAA8B;QAC9B,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,gCAAgC,CAAC,uBAAuB,EAAE,CAAC;YAChH,OAAO;QACR,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO;QACR,CAAC;QAED,8DAA8D;QAC9D,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,OAAO;QACR,CAAC;QAED,oEAAoE;QACpE,mEAAmE;QACnE,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;YACnF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,EAAE;oBACpF,WAAW,EAAE,yBAAyB;iBACtC,CAAC,CAAC;gBACH,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBACnC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAChC,OAAO;YACR,CAAC;QACF,CAAC;QAED,MAAM,eAAe,GAAG,yBAAyB,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;QAC5E,+DAA+D;QAC/D,sEAAsE;QACtE,6DAA6D;QAC7D,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;QAElF,wEAAwE;QACxE,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI,aAAa,GAAG,gCAAgC,CAAC,8BAA8B,EAAE,CAAC;YACrF,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;gBAChH,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAChC,CAAC;YAED,qEAAqE;YACrE,sEAAsE;YACtE,qDAAqD;YACrD,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,CAAC;iBAAM,IACN,gCAAgC,CAAC,sBAAsB;gBACvD,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,gCAAgC,CAAC,sBAAsB,EAC1F,CAAC;gBACF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uEAAuE,EAAE;oBACzF,eAAe;oBACf,WAAW,EAAE,gCAAgC,CAAC,sBAAsB;iBACpE,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACnC,CAAC;YAED,OAAO;QACR,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,wEAAwE;QACxE,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC;YAElE,IAAI,gBAAgB,IAAI,gCAAgC,CAAC,oBAAoB,EAAE,CAAC;gBAC/E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4EAA4E,EAAE;oBAC9F,kBAAkB,EAAE,gBAAgB;oBACpC,UAAU;oBACV,aAAa;oBACb,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;iBACjD,CAAC,CAAC;gBAEH,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;gBAC/B,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACjC,CAAC;YACD,OAAO;QACR,CAAC;QAED,8DAA8D;QAC9D,mEAAmE;QACnE,qDAAqD;QACrD,MAAM,sBAAsB,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,qBAAqB,IAAI,sBAAsB,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8EAA8E,EAAE;gBAChG,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;gBACjD,aAAa;aACb,CAAC,CAAC;YACH,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,OAAO;QACR,CAAC;QAED,2EAA2E;QAC3E,iEAAiE;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC9E,OAAO;QACR,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;YAClF,UAAU;YACV,aAAa;YACb,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;SACjD,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,oBAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO;QACR,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;YAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBAClF,OAAO;YACR,CAAC;YAED,kEAAkE;YAClE,6CAA6C;YAC7C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAE7B,kEAAkE;YAClE,oDAAoD;YACpD,MAAM,OAAO,GAAG,gCAAgC,CAAC,yBAAyB,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,yEAAyE;YACzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAC1B,sBAAsB,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,EACrE,IAAI,CACJ,CAAC;YACF,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;gBAC9D,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;aACjD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,6EAA6E;YAC7E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE;gBACrE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACvD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC/B,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,0BAA0B,CAAC,WAAW,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YAEtD,IAAI,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;oBACpE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;iBACvC,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YAChG,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;gBAChE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACvD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Magic Moment Service
3
+ *
4
+ * Tracks anonymous free trial usage for the "Magic Moment" feature.
5
+ * Allows up to 3 free task submissions per device fingerprint without
6
+ * requiring authentication, giving users a taste of the AI employee
7
+ * before they sign up.
8
+ *
9
+ * Uses file-based persistence matching the cloud task service pattern.
10
+ *
11
+ * @module services/payment/magic-moment.service
12
+ */
13
+ import { type TrialRecord, type TrialAvailability } from './magic-moment.types.js';
14
+ /**
15
+ * Singleton service for anonymous trial tracking.
16
+ *
17
+ * Manages the trial quota per device fingerprint and persists
18
+ * usage to disk so limits survive server restarts.
19
+ */
20
+ export declare class MagicMomentService {
21
+ private static instance;
22
+ private readonly logger;
23
+ private readonly storageDir;
24
+ private readonly trialsFilePath;
25
+ private trials;
26
+ private initialized;
27
+ private constructor();
28
+ /**
29
+ * Get or create the singleton instance.
30
+ *
31
+ * @returns MagicMomentService singleton
32
+ */
33
+ static getInstance(): MagicMomentService;
34
+ /**
35
+ * Reset the singleton (for testing).
36
+ */
37
+ static resetInstance(): void;
38
+ /**
39
+ * Initialize the service — load persisted trials from disk.
40
+ * Idempotent: safe to call multiple times.
41
+ */
42
+ initialize(): Promise<void>;
43
+ /**
44
+ * Check whether a device fingerprint has remaining free trials.
45
+ *
46
+ * @param fingerprint - Client device fingerprint hash
47
+ * @returns Trial availability info
48
+ */
49
+ checkTrialAvailability(fingerprint: string): Promise<TrialAvailability>;
50
+ /**
51
+ * Consume one free trial for a device fingerprint.
52
+ *
53
+ * @param fingerprint - Client device fingerprint hash
54
+ * @returns Updated trial availability, or null if no trials remain
55
+ */
56
+ consumeTrial(fingerprint: string): Promise<TrialAvailability | null>;
57
+ /**
58
+ * Get the trial record for a fingerprint, or null if none exists.
59
+ *
60
+ * @param fingerprint - Client device fingerprint hash
61
+ * @returns Trial record or null
62
+ */
63
+ getTrialRecord(fingerprint: string): Promise<TrialRecord | null>;
64
+ /**
65
+ * Persist trial records to disk.
66
+ */
67
+ private persist;
68
+ }
69
+ //# sourceMappingURL=magic-moment.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-moment.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,MAAM,yBAAyB,CAAC;AAMjC;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAMP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAQ5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;;;;OAKG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe7E;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgC1E;;;;;OAKG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAStE;;OAEG;YACW,OAAO;CAQrB"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Magic Moment Service
3
+ *
4
+ * Tracks anonymous free trial usage for the "Magic Moment" feature.
5
+ * Allows up to 3 free task submissions per device fingerprint without
6
+ * requiring authentication, giving users a taste of the AI employee
7
+ * before they sign up.
8
+ *
9
+ * Uses file-based persistence matching the cloud task service pattern.
10
+ *
11
+ * @module services/payment/magic-moment.service
12
+ */
13
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
14
+ import { join } from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ import { MAGIC_MOMENT_CONSTANTS, } from './magic-moment.types.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Service
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Singleton service for anonymous trial tracking.
23
+ *
24
+ * Manages the trial quota per device fingerprint and persists
25
+ * usage to disk so limits survive server restarts.
26
+ */
27
+ export class MagicMomentService {
28
+ static instance = null;
29
+ logger;
30
+ storageDir;
31
+ trialsFilePath;
32
+ trials = new Map();
33
+ initialized = false;
34
+ constructor() {
35
+ this.logger = LoggerService.getInstance().createComponentLogger('MagicMomentService');
36
+ this.storageDir = join(homedir(), '.crewly', MAGIC_MOMENT_CONSTANTS.STORAGE_DIR);
37
+ this.trialsFilePath = join(this.storageDir, MAGIC_MOMENT_CONSTANTS.TRIALS_FILE);
38
+ }
39
+ /**
40
+ * Get or create the singleton instance.
41
+ *
42
+ * @returns MagicMomentService singleton
43
+ */
44
+ static getInstance() {
45
+ if (!MagicMomentService.instance) {
46
+ MagicMomentService.instance = new MagicMomentService();
47
+ }
48
+ return MagicMomentService.instance;
49
+ }
50
+ /**
51
+ * Reset the singleton (for testing).
52
+ */
53
+ static resetInstance() {
54
+ MagicMomentService.instance = null;
55
+ }
56
+ // -----------------------------------------------------------------------
57
+ // Initialization
58
+ // -----------------------------------------------------------------------
59
+ /**
60
+ * Initialize the service — load persisted trials from disk.
61
+ * Idempotent: safe to call multiple times.
62
+ */
63
+ async initialize() {
64
+ if (this.initialized)
65
+ return;
66
+ try {
67
+ await mkdir(this.storageDir, { recursive: true });
68
+ const raw = await readFile(this.trialsFilePath, 'utf-8').catch(() => '[]');
69
+ const parsed = JSON.parse(raw);
70
+ for (const trial of parsed) {
71
+ this.trials.set(trial.fingerprint, trial);
72
+ }
73
+ this.logger.info(`Loaded ${this.trials.size} trial records from disk`);
74
+ }
75
+ catch {
76
+ this.trials = new Map();
77
+ }
78
+ this.initialized = true;
79
+ }
80
+ // -----------------------------------------------------------------------
81
+ // Trial Management
82
+ // -----------------------------------------------------------------------
83
+ /**
84
+ * Check whether a device fingerprint has remaining free trials.
85
+ *
86
+ * @param fingerprint - Client device fingerprint hash
87
+ * @returns Trial availability info
88
+ */
89
+ async checkTrialAvailability(fingerprint) {
90
+ await this.initialize();
91
+ const record = this.trials.get(fingerprint);
92
+ const used = record?.trialsUsed ?? 0;
93
+ const remaining = Math.max(0, MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS - used);
94
+ return {
95
+ available: remaining > 0,
96
+ remaining,
97
+ used,
98
+ max: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
99
+ };
100
+ }
101
+ /**
102
+ * Consume one free trial for a device fingerprint.
103
+ *
104
+ * @param fingerprint - Client device fingerprint hash
105
+ * @returns Updated trial availability, or null if no trials remain
106
+ */
107
+ async consumeTrial(fingerprint) {
108
+ await this.initialize();
109
+ const availability = await this.checkTrialAvailability(fingerprint);
110
+ if (!availability.available) {
111
+ return null;
112
+ }
113
+ const now = new Date().toISOString();
114
+ const existing = this.trials.get(fingerprint);
115
+ const record = {
116
+ fingerprint,
117
+ trialsUsed: (existing?.trialsUsed ?? 0) + 1,
118
+ trialTimestamps: [...(existing?.trialTimestamps ?? []), now],
119
+ firstTrialAt: existing?.firstTrialAt ?? now,
120
+ lastTrialAt: now,
121
+ };
122
+ this.trials.set(fingerprint, record);
123
+ await this.persist();
124
+ this.logger.info(`Trial consumed: fingerprint=${fingerprint.slice(0, 8)}... used=${record.trialsUsed}/${MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS}`);
125
+ return {
126
+ available: record.trialsUsed < MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
127
+ remaining: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS - record.trialsUsed,
128
+ used: record.trialsUsed,
129
+ max: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
130
+ };
131
+ }
132
+ /**
133
+ * Get the trial record for a fingerprint, or null if none exists.
134
+ *
135
+ * @param fingerprint - Client device fingerprint hash
136
+ * @returns Trial record or null
137
+ */
138
+ async getTrialRecord(fingerprint) {
139
+ await this.initialize();
140
+ return this.trials.get(fingerprint) ?? null;
141
+ }
142
+ // -----------------------------------------------------------------------
143
+ // Helpers
144
+ // -----------------------------------------------------------------------
145
+ /**
146
+ * Persist trial records to disk.
147
+ */
148
+ async persist() {
149
+ try {
150
+ const data = JSON.stringify(Array.from(this.trials.values()), null, 2);
151
+ await writeFile(this.trialsFilePath, data, 'utf-8');
152
+ }
153
+ catch (err) {
154
+ this.logger.error('Failed to persist trial records', { error: String(err) });
155
+ }
156
+ }
157
+ }
158
+ //# sourceMappingURL=magic-moment.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-moment.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Magic Moment Type Definitions
3
+ *
4
+ * Types for the anonymous trial system that allows up to 3 free
5
+ * task submissions without authentication. Trials are tracked by
6
+ * a client-provided device fingerprint.
7
+ *
8
+ * @module services/payment/magic-moment.types
9
+ */
10
+ /** Magic Moment service configuration. */
11
+ export declare const MAGIC_MOMENT_CONSTANTS: {
12
+ /** Maximum free trials per device fingerprint */
13
+ readonly MAX_FREE_TRIALS: 3;
14
+ /** Storage directory under ~/.crewly/ */
15
+ readonly STORAGE_DIR: "cloud/magic-moment";
16
+ /** Trial data file */
17
+ readonly TRIALS_FILE: "trials.json";
18
+ /** Minimum fingerprint length */
19
+ readonly MIN_FINGERPRINT_LENGTH: 8;
20
+ /** Maximum fingerprint length */
21
+ readonly MAX_FINGERPRINT_LENGTH: 128;
22
+ };
23
+ /** A single anonymous trial record. */
24
+ export interface TrialRecord {
25
+ /** Device fingerprint hash */
26
+ fingerprint: string;
27
+ /** Number of trials used */
28
+ trialsUsed: number;
29
+ /** ISO timestamps of each trial */
30
+ trialTimestamps: string[];
31
+ /** ISO timestamp of first trial */
32
+ firstTrialAt: string;
33
+ /** ISO timestamp of most recent trial */
34
+ lastTrialAt: string;
35
+ }
36
+ /** Trial availability check result. */
37
+ export interface TrialAvailability {
38
+ /** Whether the device can still submit free trials */
39
+ available: boolean;
40
+ /** Number of remaining free trials */
41
+ remaining: number;
42
+ /** Total trials used */
43
+ used: number;
44
+ /** Maximum trials allowed */
45
+ max: number;
46
+ }
47
+ /** POST /api/magic/submit request body. */
48
+ export interface MagicSubmitBody {
49
+ /** Client-provided device fingerprint hash */
50
+ fingerprint: string;
51
+ /** User's text prompt / instruction */
52
+ prompt?: string;
53
+ /** Base64-encoded file data (optional) */
54
+ fileData?: string;
55
+ /** Original filename (required if fileData provided) */
56
+ fileName?: string;
57
+ /** MIME type of the file (required if fileData provided) */
58
+ fileMimeType?: string;
59
+ }
60
+ /** Successful magic submit response. */
61
+ export interface MagicSubmitResponse {
62
+ success: true;
63
+ data: {
64
+ taskId: string;
65
+ message: string;
66
+ trialsRemaining: number;
67
+ };
68
+ }
69
+ /** Magic status response. */
70
+ export interface MagicStatusResponse {
71
+ success: true;
72
+ data: TrialAvailability;
73
+ }
74
+ /**
75
+ * Checks whether a MIME type is allowed for magic moment uploads.
76
+ *
77
+ * @param mimeType - MIME type to check
78
+ * @returns True if allowed
79
+ */
80
+ export declare function isAllowedMagicMimeType(mimeType: string): boolean;
81
+ /**
82
+ * Validates a device fingerprint string.
83
+ *
84
+ * @param fingerprint - Value to validate
85
+ * @returns Error message or null if valid
86
+ */
87
+ export declare function validateFingerprint(fingerprint: unknown): string | null;
88
+ /**
89
+ * Validates a magic moment submit request body.
90
+ *
91
+ * @param body - Request body to validate
92
+ * @returns Error message or null if valid
93
+ */
94
+ export declare function validateMagicSubmitBody(body: MagicSubmitBody): string | null;
95
+ //# sourceMappingURL=magic-moment.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-moment.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB;IAClC,iDAAiD;;IAEjD,yCAAyC;;IAEzC,sBAAsB;;IAEtB,iCAAiC;;IAEjC,iCAAiC;;CAExB,CAAC;AAMX,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IACjC,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;CACZ;AAMD,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC/B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC;CACF;AAED,6BAA6B;AAC7B,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;CACxB;AAcD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAwB5E"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Magic Moment Type Definitions
3
+ *
4
+ * Types for the anonymous trial system that allows up to 3 free
5
+ * task submissions without authentication. Trials are tracked by
6
+ * a client-provided device fingerprint.
7
+ *
8
+ * @module services/payment/magic-moment.types
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Constants
12
+ // ---------------------------------------------------------------------------
13
+ /** Magic Moment service configuration. */
14
+ export const MAGIC_MOMENT_CONSTANTS = {
15
+ /** Maximum free trials per device fingerprint */
16
+ MAX_FREE_TRIALS: 3,
17
+ /** Storage directory under ~/.crewly/ */
18
+ STORAGE_DIR: 'cloud/magic-moment',
19
+ /** Trial data file */
20
+ TRIALS_FILE: 'trials.json',
21
+ /** Minimum fingerprint length */
22
+ MIN_FINGERPRINT_LENGTH: 8,
23
+ /** Maximum fingerprint length */
24
+ MAX_FINGERPRINT_LENGTH: 128,
25
+ };
26
+ // ---------------------------------------------------------------------------
27
+ // Type Guards
28
+ // ---------------------------------------------------------------------------
29
+ /** Allowed MIME types for magic moment uploads (matches H5). */
30
+ const ALLOWED_MAGIC_MIME_TYPES = [
31
+ 'image/png',
32
+ 'image/jpeg',
33
+ 'image/gif',
34
+ 'image/webp',
35
+ ];
36
+ /**
37
+ * Checks whether a MIME type is allowed for magic moment uploads.
38
+ *
39
+ * @param mimeType - MIME type to check
40
+ * @returns True if allowed
41
+ */
42
+ export function isAllowedMagicMimeType(mimeType) {
43
+ return ALLOWED_MAGIC_MIME_TYPES.includes(mimeType);
44
+ }
45
+ /**
46
+ * Validates a device fingerprint string.
47
+ *
48
+ * @param fingerprint - Value to validate
49
+ * @returns Error message or null if valid
50
+ */
51
+ export function validateFingerprint(fingerprint) {
52
+ if (!fingerprint || typeof fingerprint !== 'string') {
53
+ return 'fingerprint is required';
54
+ }
55
+ if (fingerprint.length < MAGIC_MOMENT_CONSTANTS.MIN_FINGERPRINT_LENGTH) {
56
+ return `fingerprint must be at least ${MAGIC_MOMENT_CONSTANTS.MIN_FINGERPRINT_LENGTH} characters`;
57
+ }
58
+ if (fingerprint.length > MAGIC_MOMENT_CONSTANTS.MAX_FINGERPRINT_LENGTH) {
59
+ return `fingerprint must be at most ${MAGIC_MOMENT_CONSTANTS.MAX_FINGERPRINT_LENGTH} characters`;
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Validates a magic moment submit request body.
65
+ *
66
+ * @param body - Request body to validate
67
+ * @returns Error message or null if valid
68
+ */
69
+ export function validateMagicSubmitBody(body) {
70
+ const fpError = validateFingerprint(body.fingerprint);
71
+ if (fpError)
72
+ return fpError;
73
+ const hasPrompt = body.prompt && typeof body.prompt === 'string' && body.prompt.trim().length > 0;
74
+ const hasFile = body.fileData && typeof body.fileData === 'string' && body.fileData.length > 0;
75
+ if (!hasPrompt && !hasFile) {
76
+ return 'At least one of prompt or file is required';
77
+ }
78
+ if (hasFile) {
79
+ if (!body.fileName || typeof body.fileName !== 'string' || body.fileName.trim().length === 0) {
80
+ return 'fileName is required when uploading a file';
81
+ }
82
+ if (!body.fileMimeType || typeof body.fileMimeType !== 'string') {
83
+ return 'fileMimeType is required when uploading a file';
84
+ }
85
+ if (!isAllowedMagicMimeType(body.fileMimeType)) {
86
+ return `Unsupported file type: ${body.fileMimeType}. Only images are allowed for free trials.`;
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+ //# sourceMappingURL=magic-moment.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-moment.types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,0CAA0C;AAC1C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,iDAAiD;IACjD,eAAe,EAAE,CAAC;IAClB,yCAAyC;IACzC,WAAW,EAAE,oBAAoB;IACjC,sBAAsB;IACtB,WAAW,EAAE,aAAa;IAC1B,iCAAiC;IACjC,sBAAsB,EAAE,CAAC;IACzB,iCAAiC;IACjC,sBAAsB,EAAE,GAAG;CAClB,CAAC;AAkEX,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,gEAAgE;AAChE,MAAM,wBAAwB,GAAG;IAChC,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;CACH,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACtD,OAAQ,wBAA8C,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB;IACvD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,yBAAyB,CAAC;IAClC,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,EAAE,CAAC;QACxE,OAAO,gCAAgC,sBAAsB,CAAC,sBAAsB,aAAa,CAAC;IACnG,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,EAAE,CAAC;QACxE,OAAO,+BAA+B,sBAAsB,CAAC,sBAAsB,aAAa,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAqB;IAC5D,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/F,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,4CAA4C,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9F,OAAO,4CAA4C,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,gDAAgD,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAChD,OAAO,0BAA0B,IAAI,CAAC,YAAY,4CAA4C,CAAC;QAChG,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Stripe Payment Service
3
+ *
4
+ * Wraps the Stripe SDK for checkout session creation, subscription
5
+ * management, customer portal, and webhook event processing.
6
+ *
7
+ * Conditionally initialises — if STRIPE_SECRET_KEY is not set, all
8
+ * methods return graceful errors instead of crashing, allowing the
9
+ * rest of the backend to run without Stripe credentials.
10
+ *
11
+ * Subscription state is persisted locally via a file-based store so
12
+ * that GET /subscription queries do not require a Stripe API call.
13
+ *
14
+ * @module services/payment/stripe.service
15
+ */
16
+ import type { PlanId, BillingInterval, SubscriptionInfo, CreateCheckoutResponse, CreatePortalResponse, WebhookEventPayload, PaymentOperationResult } from '../../controllers/payment/payment.types.js';
17
+ /** Persisted subscription record keyed by Supabase userId. */
18
+ export interface StoredSubscription {
19
+ /** Supabase user ID */
20
+ userId: string;
21
+ /** Stripe customer ID */
22
+ customerId: string;
23
+ /** Stripe subscription ID */
24
+ subscriptionId: string;
25
+ /** Plan the user is on */
26
+ planId: PlanId;
27
+ /** Subscription status */
28
+ status: SubscriptionInfo['status'];
29
+ /** ISO timestamp of billing period end */
30
+ currentPeriodEnd: string | null;
31
+ /** Whether subscription cancels at period end */
32
+ cancelAtPeriodEnd: boolean;
33
+ /** ISO timestamp of last update */
34
+ updatedAt: string;
35
+ }
36
+ /**
37
+ * Singleton service for Stripe payment operations.
38
+ *
39
+ * All methods check `isConfigured()` first and return a descriptive
40
+ * error when Stripe is not available rather than throwing.
41
+ */
42
+ export declare class StripeService {
43
+ private static instance;
44
+ private readonly logger;
45
+ private readonly secretKey;
46
+ private readonly webhookSecret;
47
+ private stripe;
48
+ private subscriptions;
49
+ private subscriptionsLoaded;
50
+ private constructor();
51
+ /**
52
+ * Get or create the singleton instance.
53
+ *
54
+ * @returns StripeService singleton
55
+ */
56
+ static getInstance(): StripeService;
57
+ /**
58
+ * Reset the singleton (for testing).
59
+ */
60
+ static resetInstance(): void;
61
+ /**
62
+ * Whether Stripe is configured and ready to use.
63
+ *
64
+ * @returns true if the secret key is set
65
+ */
66
+ isConfigured(): boolean;
67
+ /**
68
+ * Load subscription state from disk. Idempotent.
69
+ */
70
+ private loadSubscriptions;
71
+ /**
72
+ * Persist subscription state to disk.
73
+ */
74
+ private persistSubscriptions;
75
+ /**
76
+ * Update or create a subscription record from a webhook event.
77
+ *
78
+ * @param payload - Processed webhook payload
79
+ */
80
+ upsertSubscriptionFromWebhook(payload: WebhookEventPayload): Promise<void>;
81
+ /**
82
+ * Create a Stripe Checkout Session for a subscription.
83
+ *
84
+ * @param userId - Supabase user ID (stored in session metadata)
85
+ * @param planId - Plan to subscribe to
86
+ * @param interval - Billing interval
87
+ * @param successUrl - Redirect URL after successful payment
88
+ * @param cancelUrl - Redirect URL if user cancels
89
+ * @returns Result containing the checkout URL and session ID
90
+ */
91
+ createCheckoutSession(userId: string, planId: PlanId, interval: BillingInterval, successUrl: string, cancelUrl: string): Promise<PaymentOperationResult<CreateCheckoutResponse>>;
92
+ /**
93
+ * Get the current subscription for a user.
94
+ *
95
+ * First checks local subscription store (populated by webhooks),
96
+ * then falls back to Stripe customer search if configured.
97
+ *
98
+ * @param userId - Supabase user ID
99
+ * @returns Subscription info
100
+ */
101
+ getSubscription(userId: string): Promise<PaymentOperationResult<SubscriptionInfo>>;
102
+ /**
103
+ * Create a Stripe Customer Portal session for subscription management.
104
+ *
105
+ * @param userId - Supabase user ID
106
+ * @param returnUrl - URL to redirect to when the user is done
107
+ * @returns Portal URL
108
+ */
109
+ createPortalSession(userId: string, returnUrl: string): Promise<PaymentOperationResult<CreatePortalResponse>>;
110
+ /**
111
+ * Verify and process a Stripe webhook event.
112
+ *
113
+ * Uses Stripe SDK signature verification when configured,
114
+ * then extracts relevant data from the event payload.
115
+ *
116
+ * @param rawBody - Raw request body (Buffer)
117
+ * @param signature - Stripe-Signature header value
118
+ * @returns Processed webhook event payload
119
+ */
120
+ handleWebhookEvent(rawBody: Buffer, signature: string): Promise<PaymentOperationResult<WebhookEventPayload>>;
121
+ }
122
+ //# sourceMappingURL=stripe.service.d.ts.map