@baruk/core 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/auth/password-reset.d.ts.map +1 -1
  3. package/dist/auth/password-reset.js +2 -4
  4. package/dist/auth/password-reset.js.map +1 -1
  5. package/dist/auth/password.d.ts +2 -18
  6. package/dist/auth/password.d.ts.map +1 -1
  7. package/dist/auth/password.js +12 -51
  8. package/dist/auth/password.js.map +1 -1
  9. package/dist/auth/service.d.ts +0 -12
  10. package/dist/auth/service.d.ts.map +1 -1
  11. package/dist/auth/service.js +3 -36
  12. package/dist/auth/service.js.map +1 -1
  13. package/dist/auth/session-token.d.ts +5 -2
  14. package/dist/auth/session-token.d.ts.map +1 -1
  15. package/dist/auth/session-token.js +7 -12
  16. package/dist/auth/session-token.js.map +1 -1
  17. package/dist/billing/dunning.d.ts +33 -0
  18. package/dist/billing/dunning.d.ts.map +1 -0
  19. package/dist/billing/dunning.js +49 -0
  20. package/dist/billing/dunning.js.map +1 -0
  21. package/dist/billing/provider/asaas.d.ts +15 -0
  22. package/dist/billing/provider/asaas.d.ts.map +1 -0
  23. package/dist/billing/provider/asaas.js +121 -0
  24. package/dist/billing/provider/asaas.js.map +1 -0
  25. package/dist/billing/provider/manual.d.ts +14 -0
  26. package/dist/billing/provider/manual.d.ts.map +1 -0
  27. package/dist/billing/provider/manual.js +24 -0
  28. package/dist/billing/provider/manual.js.map +1 -0
  29. package/dist/billing/provider/registry.d.ts +12 -0
  30. package/dist/billing/provider/registry.d.ts.map +1 -0
  31. package/dist/billing/provider/registry.js +22 -0
  32. package/dist/billing/provider/registry.js.map +1 -0
  33. package/dist/billing/provider/types.d.ts +76 -0
  34. package/dist/billing/provider/types.d.ts.map +1 -0
  35. package/dist/billing/provider/types.js +9 -0
  36. package/dist/billing/provider/types.js.map +1 -0
  37. package/dist/billing/receivable.d.ts +108 -0
  38. package/dist/billing/receivable.d.ts.map +1 -0
  39. package/dist/billing/receivable.js +2 -0
  40. package/dist/billing/receivable.js.map +1 -0
  41. package/dist/billing/repository.d.ts +97 -0
  42. package/dist/billing/repository.d.ts.map +1 -0
  43. package/dist/billing/repository.js +167 -0
  44. package/dist/billing/repository.js.map +1 -0
  45. package/dist/cjs/audit/audit.js +31 -0
  46. package/dist/cjs/audit/audit.js.map +1 -0
  47. package/dist/cjs/audit/repository.js +32 -0
  48. package/dist/cjs/audit/repository.js.map +1 -0
  49. package/dist/cjs/auth/password-reset.js +58 -0
  50. package/dist/cjs/auth/password-reset.js.map +1 -0
  51. package/dist/cjs/auth/password.js +32 -0
  52. package/dist/cjs/auth/password.js.map +1 -0
  53. package/dist/cjs/auth/service.js +191 -0
  54. package/dist/cjs/auth/service.js.map +1 -0
  55. package/dist/cjs/auth/session-token.js +18 -0
  56. package/dist/cjs/auth/session-token.js.map +1 -0
  57. package/dist/cjs/billing/dunning.js +54 -0
  58. package/dist/cjs/billing/dunning.js.map +1 -0
  59. package/dist/cjs/billing/provider/asaas.js +125 -0
  60. package/dist/cjs/billing/provider/asaas.js.map +1 -0
  61. package/dist/cjs/billing/provider/manual.js +28 -0
  62. package/dist/cjs/billing/provider/manual.js.map +1 -0
  63. package/dist/cjs/billing/provider/registry.js +27 -0
  64. package/dist/cjs/billing/provider/registry.js.map +1 -0
  65. package/dist/cjs/billing/provider/types.js +10 -0
  66. package/dist/cjs/billing/provider/types.js.map +1 -0
  67. package/dist/cjs/billing/receivable.js +3 -0
  68. package/dist/cjs/billing/receivable.js.map +1 -0
  69. package/dist/cjs/billing/repository.js +180 -0
  70. package/dist/cjs/billing/repository.js.map +1 -0
  71. package/dist/cjs/clients/repository.js +123 -0
  72. package/dist/cjs/clients/repository.js.map +1 -0
  73. package/dist/cjs/commercial-catalog/catalog.js +108 -0
  74. package/dist/cjs/commercial-catalog/catalog.js.map +1 -0
  75. package/dist/cjs/commercial-catalog/consumption-contracts.js +10 -0
  76. package/dist/cjs/commercial-catalog/consumption-contracts.js.map +1 -0
  77. package/dist/cjs/commercial-catalog/coupon.js +63 -0
  78. package/dist/cjs/commercial-catalog/coupon.js.map +1 -0
  79. package/dist/cjs/commercial-catalog/index.js +16 -0
  80. package/dist/cjs/commercial-catalog/index.js.map +1 -0
  81. package/dist/cjs/commercial-catalog/offer-application.js +53 -0
  82. package/dist/cjs/commercial-catalog/offer-application.js.map +1 -0
  83. package/dist/cjs/commercial-catalog/types.js +26 -0
  84. package/dist/cjs/commercial-catalog/types.js.map +1 -0
  85. package/dist/cjs/crm/repository.js +195 -0
  86. package/dist/cjs/crm/repository.js.map +1 -0
  87. package/dist/cjs/dashboard/repository.js +39 -0
  88. package/dist/cjs/dashboard/repository.js.map +1 -0
  89. package/dist/cjs/db/client.js +27 -0
  90. package/dist/cjs/db/client.js.map +1 -0
  91. package/dist/cjs/db/context.js +43 -0
  92. package/dist/cjs/db/context.js.map +1 -0
  93. package/dist/cjs/db/load-env.js +47 -0
  94. package/dist/cjs/db/load-env.js.map +1 -0
  95. package/dist/cjs/db/seed.js +69 -0
  96. package/dist/cjs/db/seed.js.map +1 -0
  97. package/dist/cjs/entitlements/decision.js +203 -0
  98. package/dist/cjs/entitlements/decision.js.map +1 -0
  99. package/dist/cjs/entitlements/derive.js +46 -0
  100. package/dist/cjs/entitlements/derive.js.map +1 -0
  101. package/dist/cjs/entitlements/index.js +23 -0
  102. package/dist/cjs/entitlements/index.js.map +1 -0
  103. package/dist/cjs/entitlements/sources.js +60 -0
  104. package/dist/cjs/entitlements/sources.js.map +1 -0
  105. package/dist/cjs/entitlements/standing.js +42 -0
  106. package/dist/cjs/entitlements/standing.js.map +1 -0
  107. package/dist/cjs/entitlements/types.js +16 -0
  108. package/dist/cjs/entitlements/types.js.map +1 -0
  109. package/dist/cjs/import/clients-import.js +147 -0
  110. package/dist/cjs/import/clients-import.js.map +1 -0
  111. package/dist/cjs/index.js +335 -0
  112. package/dist/cjs/index.js.map +1 -0
  113. package/dist/cjs/mail/dedup-store.js +56 -0
  114. package/dist/cjs/mail/dedup-store.js.map +1 -0
  115. package/dist/cjs/mail/index.js +24 -0
  116. package/dist/cjs/mail/index.js.map +1 -0
  117. package/dist/cjs/mail/provider.js +251 -0
  118. package/dist/cjs/mail/provider.js.map +1 -0
  119. package/dist/cjs/mail/resend-client.js +103 -0
  120. package/dist/cjs/mail/resend-client.js.map +1 -0
  121. package/dist/cjs/mail/resend.js +21 -0
  122. package/dist/cjs/mail/resend.js.map +1 -0
  123. package/dist/cjs/mail/sanitize.js +56 -0
  124. package/dist/cjs/mail/sanitize.js.map +1 -0
  125. package/dist/cjs/mail/sender-resolver.js +15 -0
  126. package/dist/cjs/mail/sender-resolver.js.map +1 -0
  127. package/dist/cjs/mail/template-renderer.js +21 -0
  128. package/dist/cjs/mail/template-renderer.js.map +1 -0
  129. package/dist/cjs/mail/types.js +38 -0
  130. package/dist/cjs/mail/types.js.map +1 -0
  131. package/dist/cjs/notifications/repository.js +49 -0
  132. package/dist/cjs/notifications/repository.js.map +1 -0
  133. package/dist/cjs/onboarding/domain.js +370 -0
  134. package/dist/cjs/onboarding/domain.js.map +1 -0
  135. package/dist/cjs/onboarding/interaction-review.js +425 -0
  136. package/dist/cjs/onboarding/interaction-review.js.map +1 -0
  137. package/dist/cjs/onboarding/persistence.js +444 -0
  138. package/dist/cjs/onboarding/persistence.js.map +1 -0
  139. package/dist/cjs/onboarding/portal-actions.js +157 -0
  140. package/dist/cjs/onboarding/portal-actions.js.map +1 -0
  141. package/dist/cjs/onboarding/portal.js +177 -0
  142. package/dist/cjs/onboarding/portal.js.map +1 -0
  143. package/dist/cjs/package.json +3 -0
  144. package/dist/cjs/portal/repository.js +37 -0
  145. package/dist/cjs/portal/repository.js.map +1 -0
  146. package/dist/cjs/pricing-engine/bundle.js +49 -0
  147. package/dist/cjs/pricing-engine/bundle.js.map +1 -0
  148. package/dist/cjs/pricing-engine/errors.js +48 -0
  149. package/dist/cjs/pricing-engine/errors.js.map +1 -0
  150. package/dist/cjs/pricing-engine/index.js +30 -0
  151. package/dist/cjs/pricing-engine/index.js.map +1 -0
  152. package/dist/cjs/pricing-engine/money.js +69 -0
  153. package/dist/cjs/pricing-engine/money.js.map +1 -0
  154. package/dist/cjs/pricing-engine/pipeline.js +330 -0
  155. package/dist/cjs/pricing-engine/pipeline.js.map +1 -0
  156. package/dist/cjs/pricing-engine/proration.js +53 -0
  157. package/dist/cjs/pricing-engine/proration.js.map +1 -0
  158. package/dist/cjs/pricing-engine/shadow.js +58 -0
  159. package/dist/cjs/pricing-engine/shadow.js.map +1 -0
  160. package/dist/cjs/pricing-engine/types.js +34 -0
  161. package/dist/cjs/pricing-engine/types.js.map +1 -0
  162. package/dist/cjs/products/catalog.js +10 -0
  163. package/dist/cjs/products/catalog.js.map +1 -0
  164. package/dist/cjs/products/repository.js +61 -0
  165. package/dist/cjs/products/repository.js.map +1 -0
  166. package/dist/cjs/rbac/authorize.js +36 -0
  167. package/dist/cjs/rbac/authorize.js.map +1 -0
  168. package/dist/cjs/rbac/catalog.js +455 -0
  169. package/dist/cjs/rbac/catalog.js.map +1 -0
  170. package/dist/cjs/requests/repository.js +114 -0
  171. package/dist/cjs/requests/repository.js.map +1 -0
  172. package/dist/cjs/subscription-billing/dunning.js +26 -0
  173. package/dist/cjs/subscription-billing/dunning.js.map +1 -0
  174. package/dist/cjs/subscription-billing/events.js +45 -0
  175. package/dist/cjs/subscription-billing/events.js.map +1 -0
  176. package/dist/cjs/subscription-billing/index.js +62 -0
  177. package/dist/cjs/subscription-billing/index.js.map +1 -0
  178. package/dist/cjs/subscription-billing/plans.js +88 -0
  179. package/dist/cjs/subscription-billing/plans.js.map +1 -0
  180. package/dist/cjs/subscription-billing/product-config.js +54 -0
  181. package/dist/cjs/subscription-billing/product-config.js.map +1 -0
  182. package/dist/cjs/subscription-billing/provider/asaas.js +233 -0
  183. package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -0
  184. package/dist/cjs/subscription-billing/provider/disabled.js +46 -0
  185. package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -0
  186. package/dist/cjs/subscription-billing/provider/registry.js +29 -0
  187. package/dist/cjs/subscription-billing/provider/registry.js.map +1 -0
  188. package/dist/cjs/subscription-billing/reconcile.js +198 -0
  189. package/dist/cjs/subscription-billing/reconcile.js.map +1 -0
  190. package/dist/cjs/subscription-billing/repository.js +359 -0
  191. package/dist/cjs/subscription-billing/repository.js.map +1 -0
  192. package/dist/cjs/subscription-billing/service.js +838 -0
  193. package/dist/cjs/subscription-billing/service.js.map +1 -0
  194. package/dist/cjs/subscription-billing/types.js +28 -0
  195. package/dist/cjs/subscription-billing/types.js.map +1 -0
  196. package/dist/cjs/tenancy/provisioning.js +126 -0
  197. package/dist/cjs/tenancy/provisioning.js.map +1 -0
  198. package/dist/cjs/users/repository.js +83 -0
  199. package/dist/cjs/users/repository.js.map +1 -0
  200. package/dist/cjs/vault/crypto.js +94 -0
  201. package/dist/cjs/vault/crypto.js.map +1 -0
  202. package/dist/cjs/vault/repository.js +120 -0
  203. package/dist/cjs/vault/repository.js.map +1 -0
  204. package/dist/commercial-catalog/catalog.d.ts +27 -0
  205. package/dist/commercial-catalog/catalog.d.ts.map +1 -0
  206. package/dist/commercial-catalog/catalog.js +104 -0
  207. package/dist/commercial-catalog/catalog.js.map +1 -0
  208. package/dist/commercial-catalog/consumption-contracts.d.ts +33 -0
  209. package/dist/commercial-catalog/consumption-contracts.d.ts.map +1 -0
  210. package/dist/commercial-catalog/consumption-contracts.js +9 -0
  211. package/dist/commercial-catalog/consumption-contracts.js.map +1 -0
  212. package/dist/commercial-catalog/coupon.d.ts +43 -0
  213. package/dist/commercial-catalog/coupon.d.ts.map +1 -0
  214. package/dist/commercial-catalog/coupon.js +57 -0
  215. package/dist/commercial-catalog/coupon.js.map +1 -0
  216. package/dist/commercial-catalog/index.d.ts +10 -0
  217. package/dist/commercial-catalog/index.d.ts.map +1 -0
  218. package/dist/commercial-catalog/index.js +5 -0
  219. package/dist/commercial-catalog/index.js.map +1 -0
  220. package/dist/commercial-catalog/offer-application.d.ts +39 -0
  221. package/dist/commercial-catalog/offer-application.d.ts.map +1 -0
  222. package/dist/commercial-catalog/offer-application.js +50 -0
  223. package/dist/commercial-catalog/offer-application.js.map +1 -0
  224. package/dist/commercial-catalog/types.d.ts +175 -0
  225. package/dist/commercial-catalog/types.d.ts.map +1 -0
  226. package/dist/commercial-catalog/types.js +23 -0
  227. package/dist/commercial-catalog/types.js.map +1 -0
  228. package/dist/crm/repository.d.ts +109 -0
  229. package/dist/crm/repository.d.ts.map +1 -0
  230. package/dist/crm/repository.js +181 -0
  231. package/dist/crm/repository.js.map +1 -0
  232. package/dist/db/context.d.ts +2 -0
  233. package/dist/db/context.d.ts.map +1 -1
  234. package/dist/db/context.js +3 -0
  235. package/dist/db/context.js.map +1 -1
  236. package/dist/db/migrate.js +7 -2
  237. package/dist/db/migrate.js.map +1 -1
  238. package/dist/db/seed.js +4 -1
  239. package/dist/db/seed.js.map +1 -1
  240. package/dist/entitlements/decision.d.ts +86 -0
  241. package/dist/entitlements/decision.d.ts.map +1 -0
  242. package/dist/entitlements/decision.js +196 -0
  243. package/dist/entitlements/decision.js.map +1 -0
  244. package/dist/entitlements/derive.d.ts +30 -0
  245. package/dist/entitlements/derive.d.ts.map +1 -0
  246. package/dist/entitlements/derive.js +42 -0
  247. package/dist/entitlements/derive.js.map +1 -0
  248. package/dist/entitlements/index.d.ts +10 -0
  249. package/dist/entitlements/index.d.ts.map +1 -0
  250. package/dist/entitlements/index.js +7 -0
  251. package/dist/entitlements/index.js.map +1 -0
  252. package/dist/entitlements/sources.d.ts +30 -0
  253. package/dist/entitlements/sources.d.ts.map +1 -0
  254. package/dist/entitlements/sources.js +55 -0
  255. package/dist/entitlements/sources.js.map +1 -0
  256. package/dist/entitlements/standing.d.ts +22 -0
  257. package/dist/entitlements/standing.d.ts.map +1 -0
  258. package/dist/entitlements/standing.js +38 -0
  259. package/dist/entitlements/standing.js.map +1 -0
  260. package/dist/entitlements/types.d.ts +26 -0
  261. package/dist/entitlements/types.d.ts.map +1 -0
  262. package/dist/entitlements/types.js +15 -0
  263. package/dist/entitlements/types.js.map +1 -0
  264. package/dist/index.d.ts +74 -3
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +51 -4
  267. package/dist/index.js.map +1 -1
  268. package/dist/mail/dedup-store.d.ts +25 -0
  269. package/dist/mail/dedup-store.d.ts.map +1 -0
  270. package/dist/mail/dedup-store.js +51 -0
  271. package/dist/mail/dedup-store.js.map +1 -0
  272. package/dist/mail/index.d.ts +10 -0
  273. package/dist/mail/index.d.ts.map +1 -0
  274. package/dist/mail/index.js +9 -0
  275. package/dist/mail/index.js.map +1 -0
  276. package/dist/mail/provider.d.ts +31 -0
  277. package/dist/mail/provider.d.ts.map +1 -0
  278. package/dist/mail/provider.js +248 -0
  279. package/dist/mail/provider.js.map +1 -0
  280. package/dist/mail/resend-client.d.ts +16 -0
  281. package/dist/mail/resend-client.d.ts.map +1 -0
  282. package/dist/mail/resend-client.js +100 -0
  283. package/dist/mail/resend-client.js.map +1 -0
  284. package/dist/mail/resend.d.ts.map +1 -1
  285. package/dist/mail/resend.js +2 -0
  286. package/dist/mail/resend.js.map +1 -1
  287. package/dist/mail/sanitize.d.ts +17 -0
  288. package/dist/mail/sanitize.d.ts.map +1 -0
  289. package/dist/mail/sanitize.js +51 -0
  290. package/dist/mail/sanitize.js.map +1 -0
  291. package/dist/mail/sender-resolver.d.ts +8 -0
  292. package/dist/mail/sender-resolver.d.ts.map +1 -0
  293. package/dist/mail/sender-resolver.js +11 -0
  294. package/dist/mail/sender-resolver.js.map +1 -0
  295. package/dist/mail/template-renderer.d.ts +10 -0
  296. package/dist/mail/template-renderer.d.ts.map +1 -0
  297. package/dist/mail/template-renderer.js +17 -0
  298. package/dist/mail/template-renderer.js.map +1 -0
  299. package/dist/mail/types.d.ts +143 -0
  300. package/dist/mail/types.d.ts.map +1 -0
  301. package/dist/mail/types.js +34 -0
  302. package/dist/mail/types.js.map +1 -0
  303. package/dist/onboarding/domain.d.ts +146 -0
  304. package/dist/onboarding/domain.d.ts.map +1 -0
  305. package/dist/onboarding/domain.js +348 -0
  306. package/dist/onboarding/domain.js.map +1 -0
  307. package/dist/onboarding/interaction-review.d.ts +123 -0
  308. package/dist/onboarding/interaction-review.d.ts.map +1 -0
  309. package/dist/onboarding/interaction-review.js +413 -0
  310. package/dist/onboarding/interaction-review.js.map +1 -0
  311. package/dist/onboarding/persistence.d.ts +106 -0
  312. package/dist/onboarding/persistence.d.ts.map +1 -0
  313. package/dist/onboarding/persistence.js +430 -0
  314. package/dist/onboarding/persistence.js.map +1 -0
  315. package/dist/onboarding/portal-actions.d.ts +48 -0
  316. package/dist/onboarding/portal-actions.d.ts.map +1 -0
  317. package/dist/onboarding/portal-actions.js +153 -0
  318. package/dist/onboarding/portal-actions.js.map +1 -0
  319. package/dist/onboarding/portal.d.ts +58 -0
  320. package/dist/onboarding/portal.d.ts.map +1 -0
  321. package/dist/onboarding/portal.js +170 -0
  322. package/dist/onboarding/portal.js.map +1 -0
  323. package/dist/pricing-engine/bundle.d.ts +22 -0
  324. package/dist/pricing-engine/bundle.d.ts.map +1 -0
  325. package/dist/pricing-engine/bundle.js +44 -0
  326. package/dist/pricing-engine/bundle.js.map +1 -0
  327. package/dist/pricing-engine/errors.d.ts +32 -0
  328. package/dist/pricing-engine/errors.d.ts.map +1 -0
  329. package/dist/pricing-engine/errors.js +44 -0
  330. package/dist/pricing-engine/errors.js.map +1 -0
  331. package/dist/pricing-engine/index.d.ts +12 -0
  332. package/dist/pricing-engine/index.d.ts.map +1 -0
  333. package/dist/pricing-engine/index.js +8 -0
  334. package/dist/pricing-engine/index.js.map +1 -0
  335. package/dist/pricing-engine/money.d.ts +32 -0
  336. package/dist/pricing-engine/money.d.ts.map +1 -0
  337. package/dist/pricing-engine/money.js +58 -0
  338. package/dist/pricing-engine/money.js.map +1 -0
  339. package/dist/pricing-engine/pipeline.d.ts +3 -0
  340. package/dist/pricing-engine/pipeline.d.ts.map +1 -0
  341. package/dist/pricing-engine/pipeline.js +327 -0
  342. package/dist/pricing-engine/pipeline.js.map +1 -0
  343. package/dist/pricing-engine/proration.d.ts +3 -0
  344. package/dist/pricing-engine/proration.d.ts.map +1 -0
  345. package/dist/pricing-engine/proration.js +50 -0
  346. package/dist/pricing-engine/proration.js.map +1 -0
  347. package/dist/pricing-engine/shadow.d.ts +51 -0
  348. package/dist/pricing-engine/shadow.d.ts.map +1 -0
  349. package/dist/pricing-engine/shadow.js +54 -0
  350. package/dist/pricing-engine/shadow.js.map +1 -0
  351. package/dist/pricing-engine/types.d.ts +184 -0
  352. package/dist/pricing-engine/types.d.ts.map +1 -0
  353. package/dist/pricing-engine/types.js +31 -0
  354. package/dist/pricing-engine/types.js.map +1 -0
  355. package/dist/rbac/authorize.d.ts +3 -6
  356. package/dist/rbac/authorize.d.ts.map +1 -1
  357. package/dist/rbac/authorize.js +4 -8
  358. package/dist/rbac/authorize.js.map +1 -1
  359. package/dist/rbac/catalog.d.ts.map +1 -1
  360. package/dist/rbac/catalog.js +414 -21
  361. package/dist/rbac/catalog.js.map +1 -1
  362. package/dist/subscription-billing/dunning.d.ts +18 -0
  363. package/dist/subscription-billing/dunning.d.ts.map +1 -0
  364. package/dist/subscription-billing/dunning.js +28 -0
  365. package/dist/subscription-billing/dunning.js.map +1 -0
  366. package/dist/subscription-billing/events.d.ts +58 -0
  367. package/dist/subscription-billing/events.d.ts.map +1 -0
  368. package/dist/subscription-billing/events.js +38 -0
  369. package/dist/subscription-billing/events.js.map +1 -0
  370. package/dist/subscription-billing/index.d.ts +18 -0
  371. package/dist/subscription-billing/index.d.ts.map +1 -0
  372. package/dist/subscription-billing/index.js +16 -0
  373. package/dist/subscription-billing/index.js.map +1 -0
  374. package/dist/subscription-billing/plans.d.ts +34 -0
  375. package/dist/subscription-billing/plans.d.ts.map +1 -0
  376. package/dist/subscription-billing/plans.js +85 -0
  377. package/dist/subscription-billing/plans.js.map +1 -0
  378. package/dist/subscription-billing/product-config.d.ts +61 -0
  379. package/dist/subscription-billing/product-config.d.ts.map +1 -0
  380. package/dist/subscription-billing/product-config.js +50 -0
  381. package/dist/subscription-billing/product-config.js.map +1 -0
  382. package/dist/subscription-billing/provider/asaas.d.ts +26 -0
  383. package/dist/subscription-billing/provider/asaas.d.ts.map +1 -0
  384. package/dist/subscription-billing/provider/asaas.js +229 -0
  385. package/dist/subscription-billing/provider/asaas.js.map +1 -0
  386. package/dist/subscription-billing/provider/disabled.d.ts +30 -0
  387. package/dist/subscription-billing/provider/disabled.d.ts.map +1 -0
  388. package/dist/subscription-billing/provider/disabled.js +42 -0
  389. package/dist/subscription-billing/provider/disabled.js.map +1 -0
  390. package/dist/subscription-billing/provider/registry.d.ts +10 -0
  391. package/dist/subscription-billing/provider/registry.d.ts.map +1 -0
  392. package/dist/subscription-billing/provider/registry.js +26 -0
  393. package/dist/subscription-billing/provider/registry.js.map +1 -0
  394. package/dist/subscription-billing/reconcile.d.ts +45 -0
  395. package/dist/subscription-billing/reconcile.d.ts.map +1 -0
  396. package/dist/subscription-billing/reconcile.js +192 -0
  397. package/dist/subscription-billing/reconcile.js.map +1 -0
  398. package/dist/subscription-billing/repository.d.ts +168 -0
  399. package/dist/subscription-billing/repository.d.ts.map +1 -0
  400. package/dist/subscription-billing/repository.js +336 -0
  401. package/dist/subscription-billing/repository.js.map +1 -0
  402. package/dist/subscription-billing/service.d.ts +175 -0
  403. package/dist/subscription-billing/service.d.ts.map +1 -0
  404. package/dist/subscription-billing/service.js +818 -0
  405. package/dist/subscription-billing/service.js.map +1 -0
  406. package/dist/subscription-billing/types.d.ts +161 -0
  407. package/dist/subscription-billing/types.d.ts.map +1 -0
  408. package/dist/subscription-billing/types.js +24 -0
  409. package/dist/subscription-billing/types.js.map +1 -0
  410. package/dist/vault/crypto.d.ts +22 -0
  411. package/dist/vault/crypto.d.ts.map +1 -0
  412. package/dist/vault/crypto.js +88 -0
  413. package/dist/vault/crypto.js.map +1 -0
  414. package/dist/vault/repository.d.ts +45 -0
  415. package/dist/vault/repository.d.ts.map +1 -0
  416. package/dist/vault/repository.js +111 -0
  417. package/dist/vault/repository.js.map +1 -0
  418. package/package.json +23 -13
  419. package/src/db/migrations/0012_vault.sql +51 -0
  420. package/src/db/migrations/0013_crm.sql +67 -0
  421. package/src/db/migrations/0014_billing.sql +146 -0
  422. package/src/db/migrations/0015_merchant_billing_ar.sql +201 -0
  423. package/src/db/migrations/0016_office_onboarding.sql +162 -0
  424. package/src/db/migrations/0017_office_onboarding_api.sql +21 -0
  425. package/src/db/migrations/0018_office_onboarding_portal_actions.sql +60 -0
  426. package/src/db/migrations/0019_office_onboarding_interaction_review.sql +134 -0
  427. package/src/db/migrations/0020_saas_billing.sql +157 -0
  428. package/src/db/migrations/0021_saas_billing_indexes.sql +23 -0
  429. package/src/db/migrations/0022_saas_billing_multi_product.sql +75 -0
@@ -0,0 +1,196 @@
1
+ import { normalizeEntitlementSource, sourcePrecedence } from './sources.js';
2
+ import { isStandingOk } from './standing.js';
3
+ /**
4
+ * Decision API canônica (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md
5
+ * §8-§10, §14). EXTENSÃO/facade sobre `deriveEntitlements`/`hasActiveEntitlement`
6
+ * (`derive.ts`, intactas) — pura, determinística, sem DB/rede/NestJS/mvb. Todos
7
+ * os fatos externos (standing, limites, uso, flag operacional) são injetados
8
+ * pelo consumidor via `EntitlementContext` — nunca resolvidos aqui.
9
+ */
10
+ export const ENTITLEMENTS_CONTRACT_VERSION = '1.0.0';
11
+ /** `moduleCode` normalizado para comparação (trim + lowercase) — §4. Não reescreve os dados persistidos. */
12
+ function normalizeModuleCodeKey(moduleCode) {
13
+ return moduleCode.trim().toLowerCase();
14
+ }
15
+ function isValidModuleCode(moduleCode) {
16
+ return /^[a-z][a-z0-9_-]{1,63}$/i.test(moduleCode.trim());
17
+ }
18
+ function isRecordActiveNow(e, now) {
19
+ if (!e.active)
20
+ return false;
21
+ if (e.expiresAt != null && e.expiresAt < now)
22
+ return false;
23
+ return true;
24
+ }
25
+ function isExplicitDeny(e) {
26
+ // BETA é alias legado de MANUAL (§5). O deny explícito deve ser alias-invariante:
27
+ // avaliar a fonte NORMALIZADA (canonical), nunca o valor bruto persistido — do
28
+ // contrário um grant BETA + `metadata.deny` escaparia do deny e concederia acesso.
29
+ return normalizeEntitlementSource(e.source).canonical === 'MANUAL' && e.metadata?.deny === true;
30
+ }
31
+ /** Entitlements ativos do subject, isolados por tenant (nunca vaza entre tenants) — §7/§11. */
32
+ export function getEffectiveEntitlements(subject, ctx) {
33
+ if (!subject.tenantId)
34
+ return [];
35
+ return ctx.entitlements.filter((e) => e.tenantId === subject.tenantId && isRecordActiveNow(e, ctx.now));
36
+ }
37
+ /** Composição pura de limite declarado + uso injetado — sem medir, sem enforcement (§14). */
38
+ export function getLimits(subject, moduleCode, ctx) {
39
+ if (!subject.tenantId || !ctx.grantedLimits?.length)
40
+ return [];
41
+ const key = normalizeModuleCodeKey(moduleCode);
42
+ return ctx.grantedLimits
43
+ .filter((g) => normalizeModuleCodeKey(g.moduleCode) === key)
44
+ .map((definition) => {
45
+ const usage = ctx.usage?.find((u) => normalizeModuleCodeKey(u.moduleCode) === key && u.limitKey === definition.limitKey);
46
+ if (definition.value == null) {
47
+ return { definition, usage, remaining: null };
48
+ }
49
+ if (!usage) {
50
+ return { definition, usage: undefined, remaining: undefined };
51
+ }
52
+ return { definition, usage, remaining: definition.value - usage.consumed };
53
+ });
54
+ }
55
+ /**
56
+ * Decisão completa e explicável (formaliza `AccessDecision{allowed,reason}` do
57
+ * mvb, adicionando `reasonCode` estável). Ordem de avaliação (§7/§10/§11):
58
+ * tenant context → deny explícito → entitlement (ativo/expirado/ausente) →
59
+ * standing → limite consumível esgotado → flag operacional → allow.
60
+ */
61
+ export function explainDecision(subject, moduleCode, ctx) {
62
+ const base = {
63
+ moduleCode,
64
+ tenantId: subject.tenantId,
65
+ standing: ctx.standing,
66
+ policyVersion: ENTITLEMENTS_CONTRACT_VERSION,
67
+ evaluatedAt: ctx.now,
68
+ };
69
+ if (!subject.tenantId || !subject.tenantId.trim()) {
70
+ return {
71
+ ...base,
72
+ allowed: false,
73
+ reasonCode: 'TENANT_CONTEXT_MISSING',
74
+ reason: 'tenantId ausente ou vazio — decisão fina nunca cruza tenants',
75
+ sources: [],
76
+ effectiveUntil: null,
77
+ };
78
+ }
79
+ if (!isValidModuleCode(moduleCode)) {
80
+ return {
81
+ ...base,
82
+ allowed: false,
83
+ reasonCode: 'ENTITLEMENT_MISSING',
84
+ reason: `moduleCode inválido: "${moduleCode}"`,
85
+ sources: [],
86
+ effectiveUntil: null,
87
+ };
88
+ }
89
+ // Tenant isolation: só registros do próprio tenant influenciam a decisão (§11).
90
+ const key = normalizeModuleCodeKey(moduleCode);
91
+ const tenantRecords = ctx.entitlements.filter((e) => e.tenantId === subject.tenantId);
92
+ const matching = tenantRecords.filter((e) => normalizeModuleCodeKey(e.moduleCode) === key);
93
+ const deny = matching.find((e) => isExplicitDeny(e) && isRecordActiveNow(e, ctx.now));
94
+ if (deny) {
95
+ return {
96
+ ...base,
97
+ allowed: false,
98
+ reasonCode: 'EXPLICIT_DENY',
99
+ reason: 'override MANUAL nega explicitamente este módulo',
100
+ sources: ['MANUAL'],
101
+ effectiveUntil: deny.expiresAt,
102
+ };
103
+ }
104
+ // FAIL_OPEN_PRIVILEGED: fato explícito injetado (nunca inferido) — ainda assim
105
+ // respeita um deny explícito (checado acima), mas ignora ausência/expiração.
106
+ if (ctx.failOpenPrivileged) {
107
+ return {
108
+ ...base,
109
+ allowed: true,
110
+ reasonCode: 'FAIL_OPEN_PRIVILEGED',
111
+ reason: 'fail-open: subject privilegiado (fato injetado pelo consumidor)',
112
+ sources: [],
113
+ effectiveUntil: null,
114
+ };
115
+ }
116
+ const active = matching.filter((e) => isRecordActiveNow(e, ctx.now));
117
+ if (active.length === 0) {
118
+ const hadAnyRecord = matching.length > 0;
119
+ return {
120
+ ...base,
121
+ allowed: false,
122
+ reasonCode: hadAnyRecord ? 'ENTITLEMENT_EXPIRED' : 'ENTITLEMENT_MISSING',
123
+ reason: hadAnyRecord
124
+ ? 'entitlement encontrado mas expirado/inativo'
125
+ : 'nenhum entitlement para este módulo',
126
+ sources: [],
127
+ effectiveUntil: null,
128
+ };
129
+ }
130
+ const normalizedSources = active.map((e) => normalizeEntitlementSource(e.source));
131
+ const winner = normalizedSources.reduce((best, cur) => sourcePrecedence(cur) < sourcePrecedence(best) ? cur : best);
132
+ const canonicalSources = Array.from(new Set(normalizedSources
133
+ .filter((s) => s.canonical != null)
134
+ .map((s) => s.canonical)));
135
+ const hasUnboundedGrant = active.some((e) => e.expiresAt == null);
136
+ const effectiveUntil = hasUnboundedGrant
137
+ ? null
138
+ : active.reduce((min, e) => (min == null || e.expiresAt < min ? e.expiresAt : min), null);
139
+ if (!isStandingOk(ctx.standing)) {
140
+ return {
141
+ ...base,
142
+ allowed: false,
143
+ reasonCode: 'SUBSCRIPTION_BLOCKED',
144
+ reason: ctx.standing.reasonCode === 'SUBSCRIPTION_RESTRICTED'
145
+ ? 'standing restrito'
146
+ : 'standing bloqueado',
147
+ sources: canonicalSources,
148
+ effectiveUntil,
149
+ };
150
+ }
151
+ if (ctx.standing.accessLevel === 'RESTRICTED') {
152
+ return {
153
+ ...base,
154
+ allowed: false,
155
+ reasonCode: 'SUBSCRIPTION_RESTRICTED',
156
+ reason: 'standing restrito: módulo bloqueado para read/core-only',
157
+ sources: canonicalSources,
158
+ effectiveUntil,
159
+ };
160
+ }
161
+ const limits = getLimits(subject, moduleCode, ctx);
162
+ const exhausted = limits.find((l) => l.definition.value != null && l.remaining != null && l.remaining <= 0);
163
+ if (exhausted) {
164
+ return {
165
+ ...base,
166
+ allowed: false,
167
+ reasonCode: 'LIMIT_REACHED',
168
+ reason: `limite "${exhausted.definition.limitKey}" esgotado`,
169
+ sources: canonicalSources,
170
+ effectiveUntil,
171
+ };
172
+ }
173
+ if (ctx.operationalFlag === false) {
174
+ return {
175
+ ...base,
176
+ allowed: false,
177
+ reasonCode: 'FEATURE_DISABLED_OPERATIONALLY',
178
+ reason: 'kill-switch operacional desabilitado para este módulo',
179
+ sources: canonicalSources,
180
+ effectiveUntil,
181
+ };
182
+ }
183
+ return {
184
+ ...base,
185
+ allowed: true,
186
+ reasonCode: 'ENTITLEMENT_ACTIVE',
187
+ reason: `allowed via ${winner.canonical ?? 'unknown source'}`,
188
+ sources: canonicalSources,
189
+ effectiveUntil,
190
+ };
191
+ }
192
+ /** Facade booleana — composição de `explainDecision` (§8). */
193
+ export function can(subject, moduleCode, ctx) {
194
+ return explainDecision(subject, moduleCode, ctx).allowed;
195
+ }
196
+ //# sourceMappingURL=decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/entitlements/decision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { EntitlementRecord, EntitlementSource } from './types.js';
2
+ /**
3
+ * Derivação PURA de entitlements a partir do conjunto-alvo de módulos de uma
4
+ * Offer aceita. Espelha a disciplina do subscription-billing: idempotente
5
+ * (reaplicar o mesmo alvo é no-op de conteúdo), nunca apaga (downgrade
6
+ * desativa — `active: false` —, não remove o registro).
7
+ */
8
+ export interface TargetModuleGrant {
9
+ moduleCode: string;
10
+ source: EntitlementSource;
11
+ /** null = concessão sem expiração (ex.: módulo do plano, enquanto a assinatura estiver ativa). */
12
+ expiresAt: string | null;
13
+ }
14
+ export interface DeriveEntitlementsInput {
15
+ tenantId: string;
16
+ subscriptionId: string | null;
17
+ /** O conjunto de módulos que DEVEM estar ativos agora (da Offer aceita + concessões de cupom/campanha). */
18
+ targetGrants: TargetModuleGrant[];
19
+ current: EntitlementRecord[];
20
+ now: string;
21
+ }
22
+ /**
23
+ * Resolve o próximo estado de entitlements: ativa o que está no alvo (preserva
24
+ * `grantedAt` original se já existia), desativa (soft-disable) o que não está
25
+ * mais no alvo. Concessões expiradas (`expiresAt < now`) nunca entram ativas.
26
+ */
27
+ export declare function deriveEntitlements(input: DeriveEntitlementsInput): EntitlementRecord[];
28
+ /** True se o tenant tem o módulo ativo agora (lookup rápido, mesmo padrão do `manga-verde-bi/access`). */
29
+ export declare function hasActiveEntitlement(entitlements: EntitlementRecord[], moduleCode: string, now: string): boolean;
30
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/entitlements/derive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,kGAAkG;IAClG,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2GAA2G;IAC3G,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,iBAAiB,EAAE,CA8BtF;AAED,0GAA0G;AAC1G,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,iBAAiB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAKT"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resolve o próximo estado de entitlements: ativa o que está no alvo (preserva
3
+ * `grantedAt` original se já existia), desativa (soft-disable) o que não está
4
+ * mais no alvo. Concessões expiradas (`expiresAt < now`) nunca entram ativas.
5
+ */
6
+ export function deriveEntitlements(input) {
7
+ const { tenantId, subscriptionId, targetGrants, current, now } = input;
8
+ const currentByModule = new Map(current.map((e) => [e.moduleCode, e]));
9
+ const targetCodes = new Set(targetGrants.map((g) => g.moduleCode));
10
+ const next = [];
11
+ for (const grant of targetGrants) {
12
+ const isExpired = grant.expiresAt != null && grant.expiresAt < now;
13
+ const existing = currentByModule.get(grant.moduleCode);
14
+ next.push({
15
+ tenantId,
16
+ subscriptionId,
17
+ moduleCode: grant.moduleCode,
18
+ source: grant.source,
19
+ active: !isExpired,
20
+ expiresAt: grant.expiresAt,
21
+ grantedAt: existing?.grantedAt ?? now,
22
+ metadata: existing?.metadata,
23
+ });
24
+ }
25
+ // Módulos que o tenant tinha e não estão mais no alvo → soft-disable (nunca remove o registro).
26
+ for (const existing of current) {
27
+ if (!targetCodes.has(existing.moduleCode)) {
28
+ next.push({ ...existing, active: false });
29
+ }
30
+ }
31
+ return next;
32
+ }
33
+ /** True se o tenant tem o módulo ativo agora (lookup rápido, mesmo padrão do `manga-verde-bi/access`). */
34
+ export function hasActiveEntitlement(entitlements, moduleCode, now) {
35
+ const e = entitlements.find((x) => x.moduleCode === moduleCode);
36
+ if (!e || !e.active)
37
+ return false;
38
+ if (e.expiresAt != null && e.expiresAt < now)
39
+ return false;
40
+ return true;
41
+ }
42
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/entitlements/derive.ts"],"names":[],"mappings":"AAyBA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAwB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;QACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC;YACR,QAAQ;YACR,cAAc;YACd,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,CAAC,SAAS;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,oBAAoB,CAClC,YAAiC,EACjC,UAAkB,EAClB,GAAW;IAEX,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type { EntitlementSource, EntitlementRecord } from './types.js';
2
+ export type { TargetModuleGrant, DeriveEntitlementsInput } from './derive.js';
3
+ export { deriveEntitlements, hasActiveEntitlement } from './derive.js';
4
+ export { CANONICAL_ENTITLEMENT_SOURCES, LEGACY_SOURCE_ALIAS, normalizeEntitlementSource, sourcePrecedence, } from './sources.js';
5
+ export type { NormalizedSource } from './sources.js';
6
+ export { normalizeSubscriptionStanding, isStandingOk } from './standing.js';
7
+ export type { AccessLevel, SubscriptionStanding } from './standing.js';
8
+ export { ENTITLEMENTS_CONTRACT_VERSION, can, explainDecision, getEffectiveEntitlements, getLimits, } from './decision.js';
9
+ export type { ReasonCode, EntitlementSubject, EntitlementContext, DecisionResult, LimitDefinition, GrantedLimit, UsageSnapshot, LimitView, } from './decision.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entitlements/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAIvE,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACL,6BAA6B,EAC7B,GAAG,EACH,eAAe,EACf,wBAAwB,EACxB,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { deriveEntitlements, hasActiveEntitlement } from './derive.js';
2
+ // Contrato canônico 1.0.0 (P2 — Core Contract Alignment, ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md).
3
+ // Extensão aditiva: deriveEntitlements/hasActiveEntitlement acima permanecem intactas.
4
+ export { CANONICAL_ENTITLEMENT_SOURCES, LEGACY_SOURCE_ALIAS, normalizeEntitlementSource, sourcePrecedence, } from './sources.js';
5
+ export { normalizeSubscriptionStanding, isStandingOk } from './standing.js';
6
+ export { ENTITLEMENTS_CONTRACT_VERSION, can, explainDecision, getEffectiveEntitlements, getLimits, } from './decision.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entitlements/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvE,oGAAoG;AACpG,uFAAuF;AACvF,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EACL,6BAA6B,EAC7B,GAAG,EACH,eAAe,EACf,wBAAwB,EACxB,SAAS,GACV,MAAM,eAAe,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { EntitlementSource } from './types.js';
2
+ /**
3
+ * Fontes canônicas (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md §5).
4
+ * Superset das 6 já existentes em `types.ts` — nenhuma removida, nenhuma renomeada.
5
+ */
6
+ export declare const CANONICAL_ENTITLEMENT_SOURCES: readonly EntitlementSource[];
7
+ /** Alias legado (mvb `Entitlement.source = 'BETA'`) — nunca reescrito em massa. */
8
+ export declare const LEGACY_SOURCE_ALIAS = "BETA";
9
+ export interface NormalizedSource {
10
+ /** Valor bruto como persistido (ex.: `"BETA"`, `"PLAN"`, ou algo desconhecido). */
11
+ raw: string;
12
+ /** Fonte canônica após aplicar o alias `BETA → MANUAL`; `null` se `raw` for desconhecido. */
13
+ canonical: EntitlementSource | null;
14
+ /** true se `raw` não é canônico nem o alias legado — honrado, mas com precedência mínima. */
15
+ isUnknown: boolean;
16
+ /** Preservado apenas quando `raw` era o alias legado (`legacySource: "BETA"`). */
17
+ legacySource?: string;
18
+ }
19
+ /**
20
+ * Normaliza uma fonte bruta (persistida) para o conjunto canônico.
21
+ * - `BETA` → `MANUAL` + `legacySource: "BETA"` (compat, sem migração destrutiva).
22
+ * - Valor canônico → passthrough.
23
+ * - Valor desconhecido (forward-compat) → `canonical: null`, `isUnknown: true`; o
24
+ * grant continua sendo honrado se `active`, mas nunca finge ser uma fonte
25
+ * canônica — evita ganhar autoridade por acidente (§5/§10 da Contract Spec).
26
+ */
27
+ export declare function normalizeEntitlementSource(raw: string): NormalizedSource;
28
+ /** Precedência de uma fonte normalizada — menor valor = mais forte; desconhecida = mínima. */
29
+ export declare function sourcePrecedence(source: NormalizedSource): number;
30
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/entitlements/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,iBAAiB,EAOrE,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAoB1C,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,6FAA6F;IAC7F,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,6FAA6F;IAC7F,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAQxE;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAMjE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Fontes canônicas (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md §5).
3
+ * Superset das 6 já existentes em `types.ts` — nenhuma removida, nenhuma renomeada.
4
+ */
5
+ export const CANONICAL_ENTITLEMENT_SOURCES = [
6
+ 'PLAN',
7
+ 'ADDON',
8
+ 'COUPON',
9
+ 'CAMPAIGN',
10
+ 'MANUAL',
11
+ 'FEATURE_FLAG',
12
+ ];
13
+ /** Alias legado (mvb `Entitlement.source = 'BETA'`) — nunca reescrito em massa. */
14
+ export const LEGACY_SOURCE_ALIAS = 'BETA';
15
+ /**
16
+ * Ordem de precedência canônica, maior→menor (§10): `MANUAL > FEATURE_FLAG >
17
+ * ADDON > CAMPAIGN/COUPON > PLAN`. `CAMPAIGN` e `COUPON` são o mesmo nível
18
+ * (grupo "CAMPAIGN/COUPON" no contrato) — nunca uma prevalece sobre a outra
19
+ * por precedência; ambas concedem, ambas aparecem em `sources`. Índice menor
20
+ * = mais forte.
21
+ */
22
+ const PRECEDENCE_TIERS = [
23
+ ['MANUAL'],
24
+ ['FEATURE_FLAG'],
25
+ ['ADDON'],
26
+ ['CAMPAIGN', 'COUPON'],
27
+ ['PLAN'],
28
+ ];
29
+ /** Fonte desconhecida (forward-compat) recebe esta precedência — mínima, abaixo de PLAN. */
30
+ const UNKNOWN_SOURCE_PRECEDENCE = PRECEDENCE_TIERS.length;
31
+ /**
32
+ * Normaliza uma fonte bruta (persistida) para o conjunto canônico.
33
+ * - `BETA` → `MANUAL` + `legacySource: "BETA"` (compat, sem migração destrutiva).
34
+ * - Valor canônico → passthrough.
35
+ * - Valor desconhecido (forward-compat) → `canonical: null`, `isUnknown: true`; o
36
+ * grant continua sendo honrado se `active`, mas nunca finge ser uma fonte
37
+ * canônica — evita ganhar autoridade por acidente (§5/§10 da Contract Spec).
38
+ */
39
+ export function normalizeEntitlementSource(raw) {
40
+ if (raw === LEGACY_SOURCE_ALIAS) {
41
+ return { raw, canonical: 'MANUAL', isUnknown: false, legacySource: LEGACY_SOURCE_ALIAS };
42
+ }
43
+ if (CANONICAL_ENTITLEMENT_SOURCES.includes(raw)) {
44
+ return { raw, canonical: raw, isUnknown: false };
45
+ }
46
+ return { raw, canonical: null, isUnknown: true };
47
+ }
48
+ /** Precedência de uma fonte normalizada — menor valor = mais forte; desconhecida = mínima. */
49
+ export function sourcePrecedence(source) {
50
+ if (source.isUnknown || source.canonical == null)
51
+ return UNKNOWN_SOURCE_PRECEDENCE;
52
+ const tierIdx = PRECEDENCE_TIERS.findIndex((tier) => tier.includes(source.canonical));
53
+ return tierIdx === -1 ? UNKNOWN_SOURCE_PRECEDENCE : tierIdx;
54
+ }
55
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/entitlements/sources.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAiC;IACzE,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA8C;IAClE,CAAC,QAAQ,CAAC;IACV,CAAC,cAAc,CAAC;IAChB,CAAC,OAAO,CAAC;IACT,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,MAAM,CAAC;CACT,CAAC;AAEF,4FAA4F;AAC5F,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAa1D;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;IAC3F,CAAC;IACD,IAAK,6BAAmD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI;QAAE,OAAO,yBAAyB,CAAC;IACnF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CACjD,IAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAmB,CAAC,CACjE,CAAC;IACF,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ReasonCode } from './decision.js';
2
+ /**
3
+ * Standing canônico (contrato 1.0.0 — ENTITLEMENTS_CONTRACT_SPEC_2026-07-27.md §6).
4
+ * Entitlements NÃO possui o lifecycle de assinatura — apenas consome esta
5
+ * projeção (`accessLevel`), injetada pelo consumidor via `ctx.standing`.
6
+ */
7
+ export type AccessLevel = 'FULL' | 'RESTRICTED' | 'BLOCKED';
8
+ export interface SubscriptionStanding {
9
+ accessLevel: AccessLevel;
10
+ /** Status normalizado, tal como recebido do consumidor (mvb ou core), para explicabilidade. */
11
+ statusCanonical: string;
12
+ reasonCode: ReasonCode;
13
+ }
14
+ /**
15
+ * Normaliza um status de assinatura (mvb ou core) para o `SubscriptionStanding`
16
+ * canônico. Puro — nenhuma máquina de estados, nenhum I/O. Status desconhecido
17
+ * (incluindo ausente/vazio) → BLOCKED (fail-closed, §6 da Contract Spec).
18
+ */
19
+ export declare function normalizeSubscriptionStanding(status: string | null | undefined): SubscriptionStanding;
20
+ /** `standingOk` — mesma regra já usada pelo mvb (`accessLevel !== 'BLOCKED'`), ratificada no contrato. */
21
+ export declare function isStandingOk(standing: SubscriptionStanding): boolean;
22
+ //# sourceMappingURL=standing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../../src/entitlements/standing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,+FAA+F;IAC/F,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;CACxB;AAuBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,oBAAoB,CAOtB;AAED,0GAA0G;AAC1G,wBAAgB,YAAY,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAEpE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Mapeamento status → accessLevel (mvb 7 valores + core 5 valores).
3
+ * Desconhecido → BLOCKED (fail-closed — regra de segurança, nunca afrouxa por omissão).
4
+ */
5
+ const STATUS_TO_STANDING = {
6
+ // mvb (SubscriptionStatus do Prisma) + core (subscription-billing) — case-sensitive, ambos os vocabulários.
7
+ TRIALING: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
8
+ trialing: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
9
+ ACTIVE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
10
+ active: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
11
+ PAST_DUE: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
12
+ past_due: { accessLevel: 'FULL', reasonCode: 'ENTITLEMENT_ACTIVE' },
13
+ RESTRICTED: { accessLevel: 'RESTRICTED', reasonCode: 'SUBSCRIPTION_RESTRICTED' },
14
+ SUSPENDED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
15
+ CANCELED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
16
+ canceled: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
17
+ EXPIRED: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
18
+ paused: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
19
+ NONE: { accessLevel: 'BLOCKED', reasonCode: 'SUBSCRIPTION_BLOCKED' },
20
+ };
21
+ /**
22
+ * Normaliza um status de assinatura (mvb ou core) para o `SubscriptionStanding`
23
+ * canônico. Puro — nenhuma máquina de estados, nenhum I/O. Status desconhecido
24
+ * (incluindo ausente/vazio) → BLOCKED (fail-closed, §6 da Contract Spec).
25
+ */
26
+ export function normalizeSubscriptionStanding(status) {
27
+ const key = status ?? 'NONE';
28
+ const mapped = STATUS_TO_STANDING[key];
29
+ if (!mapped) {
30
+ return { accessLevel: 'BLOCKED', statusCanonical: key, reasonCode: 'SUBSCRIPTION_BLOCKED' };
31
+ }
32
+ return { accessLevel: mapped.accessLevel, statusCanonical: key, reasonCode: mapped.reasonCode };
33
+ }
34
+ /** `standingOk` — mesma regra já usada pelo mvb (`accessLevel !== 'BLOCKED'`), ratificada no contrato. */
35
+ export function isStandingOk(standing) {
36
+ return standing.accessLevel !== 'BLOCKED';
37
+ }
38
+ //# sourceMappingURL=standing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing.js","sourceRoot":"","sources":["../../src/entitlements/standing.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,MAAM,kBAAkB,GAAyE;IAC/F,4GAA4G;IAC5G,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACjE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,QAAQ,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE;IACnE,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,yBAAyB,EAAE;IAChF,SAAS,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACzE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACxE,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACvE,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;IACtE,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE;CACrE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAiC;IAEjC,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAClG,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,YAAY,CAAC,QAA8B;IACzD,OAAO,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Entitlements (finos) — contrato canônico (Track A1, RFC-CAPABILITY-
3
+ * COMMERCIAL-CATALOG-001 §6). Domínio PURO — sem DB, sem `Date.now()` interno.
4
+ *
5
+ * Distinção dura (nunca confundir — achado Reality-First, §25 do modelo):
6
+ * - Entitlement FINO (este módulo) = "o tenant contratou o módulo X" — deriva
7
+ * da Offer/Subscription, é o que este pacote resolve.
8
+ * - Entitlement GROSSO (`product`/`tenant_product`, já em produção no
9
+ * `baruk-platform`, migração `0010_product_entitlements.sql`) = "o tenant
10
+ * pode abrir este PRODUTO" (IAM). É uma camada DIFERENTE, anterior a esta —
11
+ * o Hub bloqueia o produto pelo grosso; DENTRO do produto, o fino decide
12
+ * quais módulos/capacidades aparecem. Este módulo nunca substitui aquele.
13
+ */
14
+ export type EntitlementSource = 'PLAN' | 'ADDON' | 'COUPON' | 'CAMPAIGN' | 'MANUAL' | 'FEATURE_FLAG';
15
+ export interface EntitlementRecord {
16
+ tenantId: string;
17
+ subscriptionId: string | null;
18
+ moduleCode: string;
19
+ source: EntitlementSource;
20
+ active: boolean;
21
+ /** Concessões temporárias (ex.: cupom free_module_period) expiram; PLAN normalmente não. */
22
+ expiresAt: string | null;
23
+ grantedAt: string;
24
+ metadata?: Record<string, unknown>;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/entitlements/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,iBAAiB,GAC3B,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,4FAA4F;IAC5F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Entitlements (finos) — contrato canônico (Track A1, RFC-CAPABILITY-
3
+ * COMMERCIAL-CATALOG-001 §6). Domínio PURO — sem DB, sem `Date.now()` interno.
4
+ *
5
+ * Distinção dura (nunca confundir — achado Reality-First, §25 do modelo):
6
+ * - Entitlement FINO (este módulo) = "o tenant contratou o módulo X" — deriva
7
+ * da Offer/Subscription, é o que este pacote resolve.
8
+ * - Entitlement GROSSO (`product`/`tenant_product`, já em produção no
9
+ * `baruk-platform`, migração `0010_product_entitlements.sql`) = "o tenant
10
+ * pode abrir este PRODUTO" (IAM). É uma camada DIFERENTE, anterior a esta —
11
+ * o Hub bloqueia o produto pelo grosso; DENTRO do produto, o fino decide
12
+ * quais módulos/capacidades aparecem. Este módulo nunca substitui aquele.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/entitlements/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}