@nxuss/lemma 1.43.0 → 1.44.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 (322) hide show
  1. package/README.md +1 -1
  2. package/bin/brain-ingest.js +18 -0
  3. package/bin/cloud.js +228 -0
  4. package/dist/cjs/cli/hostHooks.d.ts +6 -0
  5. package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
  6. package/dist/cjs/cli/hostHooks.js +13 -3
  7. package/dist/cjs/cli/hostHooks.js.map +1 -1
  8. package/dist/cjs/cloud/CloudBrainClient.d.ts +52 -0
  9. package/dist/cjs/cloud/CloudBrainClient.d.ts.map +1 -0
  10. package/dist/cjs/cloud/CloudBrainClient.js +161 -0
  11. package/dist/cjs/cloud/CloudBrainClient.js.map +1 -0
  12. package/dist/cjs/cloud/CloudConfig.d.ts +41 -0
  13. package/dist/cjs/cloud/CloudConfig.d.ts.map +1 -0
  14. package/dist/cjs/cloud/CloudConfig.js +133 -0
  15. package/dist/cjs/cloud/CloudConfig.js.map +1 -0
  16. package/dist/cjs/cloud/CloudEntitlement.d.ts +55 -0
  17. package/dist/cjs/cloud/CloudEntitlement.d.ts.map +1 -0
  18. package/dist/cjs/cloud/CloudEntitlement.js +174 -0
  19. package/dist/cjs/cloud/CloudEntitlement.js.map +1 -0
  20. package/dist/cjs/cloud/billing/stripeApi.d.ts +43 -0
  21. package/dist/cjs/cloud/billing/stripeApi.d.ts.map +1 -0
  22. package/dist/cjs/cloud/billing/stripeApi.js +111 -0
  23. package/dist/cjs/cloud/billing/stripeApi.js.map +1 -0
  24. package/dist/cjs/cloud/billing/stripeWebhook.d.ts +35 -0
  25. package/dist/cjs/cloud/billing/stripeWebhook.d.ts.map +1 -0
  26. package/dist/cjs/cloud/billing/stripeWebhook.js +185 -0
  27. package/dist/cjs/cloud/billing/stripeWebhook.js.map +1 -0
  28. package/dist/cjs/cloud/console/ConsoleStore.d.ts +111 -0
  29. package/dist/cjs/cloud/console/ConsoleStore.d.ts.map +1 -0
  30. package/dist/cjs/cloud/console/ConsoleStore.js +172 -0
  31. package/dist/cjs/cloud/console/ConsoleStore.js.map +1 -0
  32. package/dist/cjs/cloud/console/consoleRouter.d.ts +68 -0
  33. package/dist/cjs/cloud/console/consoleRouter.d.ts.map +1 -0
  34. package/dist/cjs/cloud/console/consoleRouter.js +263 -0
  35. package/dist/cjs/cloud/console/consoleRouter.js.map +1 -0
  36. package/dist/cjs/cloud/console/mailer.d.ts +22 -0
  37. package/dist/cjs/cloud/console/mailer.d.ts.map +1 -0
  38. package/dist/cjs/cloud/console/mailer.js +35 -0
  39. package/dist/cjs/cloud/console/mailer.js.map +1 -0
  40. package/dist/cjs/cloud/identity/PlanPolicy.d.ts +16 -1
  41. package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -1
  42. package/dist/cjs/cloud/identity/PlanPolicy.js +47 -7
  43. package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -1
  44. package/dist/cjs/cloud/identity/RateLimiter.d.ts +21 -1
  45. package/dist/cjs/cloud/identity/RateLimiter.d.ts.map +1 -1
  46. package/dist/cjs/cloud/identity/RateLimiter.js +59 -2
  47. package/dist/cjs/cloud/identity/RateLimiter.js.map +1 -1
  48. package/dist/cjs/cloud/identity/TenantResolver.d.ts +4 -1
  49. package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -1
  50. package/dist/cjs/cloud/identity/TenantResolver.js +1 -1
  51. package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -1
  52. package/dist/cjs/cloud/identity/authenticateV2.d.ts.map +1 -1
  53. package/dist/cjs/cloud/identity/authenticateV2.js +7 -4
  54. package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -1
  55. package/dist/cjs/cloud/identity/identityStore.d.ts +85 -10
  56. package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -1
  57. package/dist/cjs/cloud/identity/identityStore.js +184 -2
  58. package/dist/cjs/cloud/identity/identityStore.js.map +1 -1
  59. package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts +16 -0
  60. package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
  61. package/dist/cjs/cloud/metering/PostgresLedgerStore.js +44 -0
  62. package/dist/cjs/cloud/metering/PostgresLedgerStore.js.map +1 -0
  63. package/dist/cjs/cloud/metering/UsageLedger.d.ts +37 -0
  64. package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -1
  65. package/dist/cjs/cloud/metering/UsageLedger.js +80 -17
  66. package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -1
  67. package/dist/cjs/cloud/metering/index.d.ts +1 -0
  68. package/dist/cjs/cloud/metering/index.d.ts.map +1 -1
  69. package/dist/cjs/cloud/metering/index.js +1 -0
  70. package/dist/cjs/cloud/metering/index.js.map +1 -1
  71. package/dist/cjs/cloud/store/FileBrainStore.d.ts +1 -0
  72. package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
  73. package/dist/cjs/cloud/store/FileBrainStore.js +3 -0
  74. package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
  75. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +1 -0
  76. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  77. package/dist/cjs/cloud/store/PostgresBrainStore.js +4 -0
  78. package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
  79. package/dist/cjs/cloud/v2/app.d.ts.map +1 -1
  80. package/dist/cjs/cloud/v2/app.js +6 -0
  81. package/dist/cjs/cloud/v2/app.js.map +1 -1
  82. package/dist/cjs/cloud/v2/inputGuard.d.ts +23 -0
  83. package/dist/cjs/cloud/v2/inputGuard.d.ts.map +1 -0
  84. package/dist/cjs/cloud/v2/inputGuard.js +71 -0
  85. package/dist/cjs/cloud/v2/inputGuard.js.map +1 -0
  86. package/dist/cjs/cloud/v2/routes/admin.d.ts +24 -0
  87. package/dist/cjs/cloud/v2/routes/admin.d.ts.map +1 -0
  88. package/dist/cjs/cloud/v2/routes/admin.js +329 -0
  89. package/dist/cjs/cloud/v2/routes/admin.js.map +1 -0
  90. package/dist/cjs/cloud/v2/routes/entitlement.d.ts +13 -0
  91. package/dist/cjs/cloud/v2/routes/entitlement.d.ts.map +1 -0
  92. package/dist/cjs/cloud/v2/routes/entitlement.js +24 -0
  93. package/dist/cjs/cloud/v2/routes/entitlement.js.map +1 -0
  94. package/dist/cjs/cloud/v2/routes/index.d.ts +14 -1
  95. package/dist/cjs/cloud/v2/routes/index.d.ts.map +1 -1
  96. package/dist/cjs/cloud/v2/routes/index.js +36 -0
  97. package/dist/cjs/cloud/v2/routes/index.js.map +1 -1
  98. package/dist/cjs/cloud/v2/routes/memories.d.ts +21 -2
  99. package/dist/cjs/cloud/v2/routes/memories.d.ts.map +1 -1
  100. package/dist/cjs/cloud/v2/routes/memories.js +77 -0
  101. package/dist/cjs/cloud/v2/routes/memories.js.map +1 -1
  102. package/dist/cjs/cloud/v2/routes/recall.d.ts +1 -0
  103. package/dist/cjs/cloud/v2/routes/recall.d.ts.map +1 -1
  104. package/dist/cjs/cloud/v2/routes/recall.js +4 -0
  105. package/dist/cjs/cloud/v2/routes/recall.js.map +1 -1
  106. package/dist/cjs/cloud/v2/routes/tenant.d.ts +35 -0
  107. package/dist/cjs/cloud/v2/routes/tenant.d.ts.map +1 -0
  108. package/dist/cjs/cloud/v2/routes/tenant.js +62 -0
  109. package/dist/cjs/cloud/v2/routes/tenant.js.map +1 -0
  110. package/dist/cjs/cloud/v2/routes/usage.d.ts +1 -1
  111. package/dist/cjs/cloud/v2/routes/usage.d.ts.map +1 -1
  112. package/dist/cjs/cloud/v2/routes/verify.d.ts +1 -0
  113. package/dist/cjs/cloud/v2/routes/verify.d.ts.map +1 -1
  114. package/dist/cjs/cloud/v2/routes/verify.js +4 -0
  115. package/dist/cjs/cloud/v2/routes/verify.js.map +1 -1
  116. package/dist/cjs/cloud/v2/server.d.ts +9 -3
  117. package/dist/cjs/cloud/v2/server.d.ts.map +1 -1
  118. package/dist/cjs/cloud/v2/server.js +36 -2
  119. package/dist/cjs/cloud/v2/server.js.map +1 -1
  120. package/dist/cjs/cloud/v2/usageRecorder.d.ts +19 -0
  121. package/dist/cjs/cloud/v2/usageRecorder.d.ts.map +1 -0
  122. package/dist/cjs/cloud/v2/usageRecorder.js +42 -0
  123. package/dist/cjs/cloud/v2/usageRecorder.js.map +1 -0
  124. package/dist/cjs/contracts/api-v2.types.d.ts +90 -2
  125. package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -1
  126. package/dist/cjs/contracts/store.d.ts +2 -0
  127. package/dist/cjs/contracts/store.d.ts.map +1 -1
  128. package/dist/cjs/mcp/index.js +3 -0
  129. package/dist/cjs/mcp/index.js.map +1 -1
  130. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  131. package/dist/cjs/mcp/tools/memory.js +74 -4
  132. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  133. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  134. package/dist/cjs/mcp/tools.js.map +1 -1
  135. package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
  136. package/dist/cjs/proxy/KeyManager.js +5 -0
  137. package/dist/cjs/proxy/KeyManager.js.map +1 -1
  138. package/dist/cjs/subconscious/CloudBrain.d.ts +77 -0
  139. package/dist/cjs/subconscious/CloudBrain.d.ts.map +1 -0
  140. package/dist/cjs/subconscious/CloudBrain.js +347 -0
  141. package/dist/cjs/subconscious/CloudBrain.js.map +1 -0
  142. package/dist/cjs/subconscious/ProjectIdentity.d.ts +9 -0
  143. package/dist/cjs/subconscious/ProjectIdentity.d.ts.map +1 -0
  144. package/dist/cjs/subconscious/ProjectIdentity.js +63 -0
  145. package/dist/cjs/subconscious/ProjectIdentity.js.map +1 -0
  146. package/dist/cjs/subconscious/TeamBrain.d.ts +9 -3
  147. package/dist/cjs/subconscious/TeamBrain.d.ts.map +1 -1
  148. package/dist/cjs/subconscious/TeamBrain.js +39 -5
  149. package/dist/cjs/subconscious/TeamBrain.js.map +1 -1
  150. package/dist/cjs/utils/ProLicense.d.ts.map +1 -1
  151. package/dist/cjs/utils/ProLicense.js +11 -3
  152. package/dist/cjs/utils/ProLicense.js.map +1 -1
  153. package/dist/cjs/utils/SessionCapture.d.ts +2 -0
  154. package/dist/cjs/utils/SessionCapture.d.ts.map +1 -1
  155. package/dist/cjs/utils/SessionCapture.js +5 -0
  156. package/dist/cjs/utils/SessionCapture.js.map +1 -1
  157. package/dist/cjs/utils/StopNudge.d.ts +8 -0
  158. package/dist/cjs/utils/StopNudge.d.ts.map +1 -0
  159. package/dist/cjs/utils/StopNudge.js +93 -0
  160. package/dist/cjs/utils/StopNudge.js.map +1 -0
  161. package/dist/esm/cli/hostHooks.d.ts +6 -0
  162. package/dist/esm/cli/hostHooks.d.ts.map +1 -1
  163. package/dist/esm/cli/hostHooks.js +12 -2
  164. package/dist/esm/cli/hostHooks.js.map +1 -1
  165. package/dist/esm/cloud/CloudBrainClient.d.ts +52 -0
  166. package/dist/esm/cloud/CloudBrainClient.d.ts.map +1 -0
  167. package/dist/esm/cloud/CloudBrainClient.js +153 -0
  168. package/dist/esm/cloud/CloudBrainClient.js.map +1 -0
  169. package/dist/esm/cloud/CloudConfig.d.ts +41 -0
  170. package/dist/esm/cloud/CloudConfig.d.ts.map +1 -0
  171. package/dist/esm/cloud/CloudConfig.js +118 -0
  172. package/dist/esm/cloud/CloudConfig.js.map +1 -0
  173. package/dist/esm/cloud/CloudEntitlement.d.ts +55 -0
  174. package/dist/esm/cloud/CloudEntitlement.d.ts.map +1 -0
  175. package/dist/esm/cloud/CloudEntitlement.js +159 -0
  176. package/dist/esm/cloud/CloudEntitlement.js.map +1 -0
  177. package/dist/esm/cloud/billing/stripeApi.d.ts +43 -0
  178. package/dist/esm/cloud/billing/stripeApi.d.ts.map +1 -0
  179. package/dist/esm/cloud/billing/stripeApi.js +103 -0
  180. package/dist/esm/cloud/billing/stripeApi.js.map +1 -0
  181. package/dist/esm/cloud/billing/stripeWebhook.d.ts +35 -0
  182. package/dist/esm/cloud/billing/stripeWebhook.d.ts.map +1 -0
  183. package/dist/esm/cloud/billing/stripeWebhook.js +176 -0
  184. package/dist/esm/cloud/billing/stripeWebhook.js.map +1 -0
  185. package/dist/esm/cloud/console/ConsoleStore.d.ts +111 -0
  186. package/dist/esm/cloud/console/ConsoleStore.d.ts.map +1 -0
  187. package/dist/esm/cloud/console/ConsoleStore.js +161 -0
  188. package/dist/esm/cloud/console/ConsoleStore.js.map +1 -0
  189. package/dist/esm/cloud/console/consoleRouter.d.ts +68 -0
  190. package/dist/esm/cloud/console/consoleRouter.d.ts.map +1 -0
  191. package/dist/esm/cloud/console/consoleRouter.js +252 -0
  192. package/dist/esm/cloud/console/consoleRouter.js.map +1 -0
  193. package/dist/esm/cloud/console/mailer.d.ts +22 -0
  194. package/dist/esm/cloud/console/mailer.d.ts.map +1 -0
  195. package/dist/esm/cloud/console/mailer.js +30 -0
  196. package/dist/esm/cloud/console/mailer.js.map +1 -0
  197. package/dist/esm/cloud/identity/PlanPolicy.d.ts +16 -1
  198. package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -1
  199. package/dist/esm/cloud/identity/PlanPolicy.js +46 -6
  200. package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -1
  201. package/dist/esm/cloud/identity/RateLimiter.d.ts +21 -1
  202. package/dist/esm/cloud/identity/RateLimiter.d.ts.map +1 -1
  203. package/dist/esm/cloud/identity/RateLimiter.js +57 -2
  204. package/dist/esm/cloud/identity/RateLimiter.js.map +1 -1
  205. package/dist/esm/cloud/identity/TenantResolver.d.ts +4 -1
  206. package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -1
  207. package/dist/esm/cloud/identity/TenantResolver.js +1 -1
  208. package/dist/esm/cloud/identity/TenantResolver.js.map +1 -1
  209. package/dist/esm/cloud/identity/authenticateV2.d.ts.map +1 -1
  210. package/dist/esm/cloud/identity/authenticateV2.js +7 -4
  211. package/dist/esm/cloud/identity/authenticateV2.js.map +1 -1
  212. package/dist/esm/cloud/identity/identityStore.d.ts +85 -10
  213. package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -1
  214. package/dist/esm/cloud/identity/identityStore.js +180 -1
  215. package/dist/esm/cloud/identity/identityStore.js.map +1 -1
  216. package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts +16 -0
  217. package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
  218. package/dist/esm/cloud/metering/PostgresLedgerStore.js +40 -0
  219. package/dist/esm/cloud/metering/PostgresLedgerStore.js.map +1 -0
  220. package/dist/esm/cloud/metering/UsageLedger.d.ts +37 -0
  221. package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -1
  222. package/dist/esm/cloud/metering/UsageLedger.js +78 -16
  223. package/dist/esm/cloud/metering/UsageLedger.js.map +1 -1
  224. package/dist/esm/cloud/metering/index.d.ts +1 -0
  225. package/dist/esm/cloud/metering/index.d.ts.map +1 -1
  226. package/dist/esm/cloud/metering/index.js +1 -0
  227. package/dist/esm/cloud/metering/index.js.map +1 -1
  228. package/dist/esm/cloud/store/FileBrainStore.d.ts +1 -0
  229. package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
  230. package/dist/esm/cloud/store/FileBrainStore.js +3 -0
  231. package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
  232. package/dist/esm/cloud/store/PostgresBrainStore.d.ts +1 -0
  233. package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  234. package/dist/esm/cloud/store/PostgresBrainStore.js +4 -0
  235. package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
  236. package/dist/esm/cloud/v2/app.d.ts.map +1 -1
  237. package/dist/esm/cloud/v2/app.js +6 -0
  238. package/dist/esm/cloud/v2/app.js.map +1 -1
  239. package/dist/esm/cloud/v2/inputGuard.d.ts +23 -0
  240. package/dist/esm/cloud/v2/inputGuard.d.ts.map +1 -0
  241. package/dist/esm/cloud/v2/inputGuard.js +63 -0
  242. package/dist/esm/cloud/v2/inputGuard.js.map +1 -0
  243. package/dist/esm/cloud/v2/routes/admin.d.ts +24 -0
  244. package/dist/esm/cloud/v2/routes/admin.d.ts.map +1 -0
  245. package/dist/esm/cloud/v2/routes/admin.js +322 -0
  246. package/dist/esm/cloud/v2/routes/admin.js.map +1 -0
  247. package/dist/esm/cloud/v2/routes/entitlement.d.ts +13 -0
  248. package/dist/esm/cloud/v2/routes/entitlement.d.ts.map +1 -0
  249. package/dist/esm/cloud/v2/routes/entitlement.js +21 -0
  250. package/dist/esm/cloud/v2/routes/entitlement.js.map +1 -0
  251. package/dist/esm/cloud/v2/routes/index.d.ts +14 -1
  252. package/dist/esm/cloud/v2/routes/index.d.ts.map +1 -1
  253. package/dist/esm/cloud/v2/routes/index.js +37 -1
  254. package/dist/esm/cloud/v2/routes/index.js.map +1 -1
  255. package/dist/esm/cloud/v2/routes/memories.d.ts +21 -2
  256. package/dist/esm/cloud/v2/routes/memories.d.ts.map +1 -1
  257. package/dist/esm/cloud/v2/routes/memories.js +75 -0
  258. package/dist/esm/cloud/v2/routes/memories.js.map +1 -1
  259. package/dist/esm/cloud/v2/routes/recall.d.ts +1 -0
  260. package/dist/esm/cloud/v2/routes/recall.d.ts.map +1 -1
  261. package/dist/esm/cloud/v2/routes/recall.js +5 -1
  262. package/dist/esm/cloud/v2/routes/recall.js.map +1 -1
  263. package/dist/esm/cloud/v2/routes/tenant.d.ts +35 -0
  264. package/dist/esm/cloud/v2/routes/tenant.d.ts.map +1 -0
  265. package/dist/esm/cloud/v2/routes/tenant.js +58 -0
  266. package/dist/esm/cloud/v2/routes/tenant.js.map +1 -0
  267. package/dist/esm/cloud/v2/routes/usage.d.ts +1 -1
  268. package/dist/esm/cloud/v2/routes/usage.d.ts.map +1 -1
  269. package/dist/esm/cloud/v2/routes/verify.d.ts +1 -0
  270. package/dist/esm/cloud/v2/routes/verify.d.ts.map +1 -1
  271. package/dist/esm/cloud/v2/routes/verify.js +5 -1
  272. package/dist/esm/cloud/v2/routes/verify.js.map +1 -1
  273. package/dist/esm/cloud/v2/server.d.ts +9 -3
  274. package/dist/esm/cloud/v2/server.d.ts.map +1 -1
  275. package/dist/esm/cloud/v2/server.js +36 -3
  276. package/dist/esm/cloud/v2/server.js.map +1 -1
  277. package/dist/esm/cloud/v2/usageRecorder.d.ts +19 -0
  278. package/dist/esm/cloud/v2/usageRecorder.d.ts.map +1 -0
  279. package/dist/esm/cloud/v2/usageRecorder.js +37 -0
  280. package/dist/esm/cloud/v2/usageRecorder.js.map +1 -0
  281. package/dist/esm/contracts/api-v2.types.d.ts +90 -2
  282. package/dist/esm/contracts/api-v2.types.d.ts.map +1 -1
  283. package/dist/esm/contracts/store.d.ts +2 -0
  284. package/dist/esm/contracts/store.d.ts.map +1 -1
  285. package/dist/esm/mcp/index.js +3 -0
  286. package/dist/esm/mcp/index.js.map +1 -1
  287. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  288. package/dist/esm/mcp/tools/memory.js +74 -4
  289. package/dist/esm/mcp/tools/memory.js.map +1 -1
  290. package/dist/esm/mcp/tools.d.ts.map +1 -1
  291. package/dist/esm/mcp/tools.js.map +1 -1
  292. package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
  293. package/dist/esm/proxy/KeyManager.js +5 -0
  294. package/dist/esm/proxy/KeyManager.js.map +1 -1
  295. package/dist/esm/subconscious/CloudBrain.d.ts +77 -0
  296. package/dist/esm/subconscious/CloudBrain.d.ts.map +1 -0
  297. package/dist/esm/subconscious/CloudBrain.js +330 -0
  298. package/dist/esm/subconscious/CloudBrain.js.map +1 -0
  299. package/dist/esm/subconscious/ProjectIdentity.d.ts +9 -0
  300. package/dist/esm/subconscious/ProjectIdentity.d.ts.map +1 -0
  301. package/dist/esm/subconscious/ProjectIdentity.js +56 -0
  302. package/dist/esm/subconscious/ProjectIdentity.js.map +1 -0
  303. package/dist/esm/subconscious/TeamBrain.d.ts +9 -3
  304. package/dist/esm/subconscious/TeamBrain.d.ts.map +1 -1
  305. package/dist/esm/subconscious/TeamBrain.js +39 -7
  306. package/dist/esm/subconscious/TeamBrain.js.map +1 -1
  307. package/dist/esm/utils/ProLicense.d.ts.map +1 -1
  308. package/dist/esm/utils/ProLicense.js +11 -3
  309. package/dist/esm/utils/ProLicense.js.map +1 -1
  310. package/dist/esm/utils/SessionCapture.d.ts +2 -0
  311. package/dist/esm/utils/SessionCapture.d.ts.map +1 -1
  312. package/dist/esm/utils/SessionCapture.js +5 -0
  313. package/dist/esm/utils/SessionCapture.js.map +1 -1
  314. package/dist/esm/utils/StopNudge.d.ts +8 -0
  315. package/dist/esm/utils/StopNudge.d.ts.map +1 -0
  316. package/dist/esm/utils/StopNudge.js +86 -0
  317. package/dist/esm/utils/StopNudge.js.map +1 -0
  318. package/lemma-proxy.cjs +5 -0
  319. package/package.json +2 -1
  320. package/sdks/crewai/dist/ts/src/client.d.ts +5 -1
  321. package/sdks/crewai/dist/ts/src/client.js +8 -0
  322. package/sdks/crewai/dist/ts/src/types.d.ts +32 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudBrainClient.js","sourceRoot":"","sources":["../../../src/cloud/CloudBrainClient.ts"],"names":[],"mappings":";;;AA0CA,8CAmBC;AA4BD,oCAKC;AAiFD,oDAOC;AAtLD;;;;;;;;GAQG;AACH,+CAA+C;AA6B/C,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AACpD,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,SAAgB,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAE3C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,0FAA0F;QAC1F,4EAA4E;QAC5E,MAAM,KAAK,GAAG,IAAA,4BAAc,EAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,SAAS,IAAI,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC9H,OAAO,OAAO,CAAC,MAAM;YACnB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE;YACtF,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC;IACpG,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC;IACpG,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAClG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACrF,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,MAAc,EAAE,GAAsB,EAAE,IAAkC;IAC1G,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,4DAA4D,EAAE,CAAC;IAEvI,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,sBAAsB,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,4DAA4D,EAAE,CAAC;IAC5G,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,gCAAgC,EAAE,CAAC;IAEhH,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,0BAAkB,CAAC;IACrH,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;AACjF,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAyB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC1F,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,GAAG,CAAC,qBAAqB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,GAAG,CAAC,qBAAqB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;AAC7E,CAAC;AAED,MAAa,UAAW,SAAQ,KAAK;IACnC;IACE,qEAAqE;IAC5D,MAAc,EACd,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAVD,gCAUC;AAED,MAAa,gBAAgB;IAC3B,YACmB,MAAmB,EACnB,YAA0B,KAAK;QAD/B,WAAM,GAAN,MAAM,CAAa;QACnB,cAAS,GAAT,SAAS,CAAsB;IAC/C,CAAC;IAEJ,QAAQ,CAAC,OAA4B;QACnC,OAAO,IAAI,CAAC,IAAI,CAAuB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,OAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAiB,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,OAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAiB,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,yFAAyF;IACzF,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAgB,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,4FAA4F;IAC5F,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,CAAsB,KAAK,EAAE,cAAc,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAiB,QAAQ,EAAE,aAAa,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QAChE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE;gBACrD,MAAM;gBACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC9F,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC3D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAI,GAAyB,EAAE,IAAI,KAAK,YAAY,CAAC;YAClE,kGAAkG;YAClG,MAAM,IAAI,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;QACrJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,IAAI,GAAQ,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5F,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACrG,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;CACF;AAhED,4CAgEC;AAED,8FAA8F;AAC9F,SAAgB,oBAAoB,CAAC,GAAY;IAC/C,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,mDAAmD,CAAC;QACnF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,wBAAwB,GAAG,CAAC,OAAO,GAAG,CAAC;QACtE,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,yCAAyC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface UserCloudConfig {
2
+ url: string;
3
+ key: string;
4
+ /** Share every stored memory with the team without being asked. */
5
+ autoshare: boolean;
6
+ }
7
+ export type UserConfigRead = {
8
+ found: false;
9
+ } | {
10
+ found: true;
11
+ config: UserCloudConfig;
12
+ } | {
13
+ found: true;
14
+ problem: string;
15
+ };
16
+ export declare const MARKER_FILE = ".lemma-cloud.json";
17
+ export declare function userConfigPath(env?: NodeJS.ProcessEnv): string;
18
+ export declare function readUserConfig(env?: NodeJS.ProcessEnv): UserConfigRead;
19
+ /** Atomic write, owner-only. Never leaves a half-written or world-readable credential behind. */
20
+ export declare function writeUserConfig(config: UserCloudConfig, env?: NodeJS.ProcessEnv): string;
21
+ /** True when a config existed and was removed. */
22
+ export declare function removeUserConfig(env?: NodeJS.ProcessEnv): boolean;
23
+ export interface CloudMarker {
24
+ url: string;
25
+ }
26
+ export declare function markerPath(root: string): string;
27
+ export declare function readMarker(root: string): CloudMarker | null;
28
+ /**
29
+ * The marker of the repo `start` lives in: the nearest one going up, stopping at the repo root (the
30
+ * first directory with a .git) or the filesystem root. Plain file reads, no subprocess: this runs on
31
+ * every search_memory for every user, Cloud or not, and spawning `git rev-parse` there cost ~9 ms a call.
32
+ */
33
+ export declare function findMarker(start: string): CloudMarker | null;
34
+ export declare function writeMarker(root: string, url: string): string;
35
+ /**
36
+ * The host of a marker URL, safe to print into the agent's context. The marker is repo content
37
+ * anybody can edit, so only a validated host ever reaches a tool reply: no free text, no path,
38
+ * no control characters.
39
+ */
40
+ export declare function markerHost(marker: CloudMarker): string;
41
+ //# sourceMappingURL=CloudConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudConfig.d.ts","sourceRoot":"","sources":["../../../src/cloud/CloudConfig.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,GAChB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG3E;AAED,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAsBnF;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAQrG;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAO9E;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAW3D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAW5D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MARKER_FILE = void 0;
7
+ exports.userConfigPath = userConfigPath;
8
+ exports.readUserConfig = readUserConfig;
9
+ exports.writeUserConfig = writeUserConfig;
10
+ exports.removeUserConfig = removeUserConfig;
11
+ exports.markerPath = markerPath;
12
+ exports.readMarker = readMarker;
13
+ exports.findMarker = findMarker;
14
+ exports.writeMarker = writeMarker;
15
+ exports.markerHost = markerHost;
16
+ /**
17
+ * Lemma Cloud — where a dev's connection settings live.
18
+ *
19
+ * ~/.lemma/cloud.json personal, 0600: { url, key, autoshare }. Written by `lemma cloud login`.
20
+ * <repo>/.lemma-cloud.json committed, NO secret: { url }. Written by `lemma cloud link`.
21
+ *
22
+ * The two are deliberately not interchangeable. The key in the personal file is bound to the URL
23
+ * it was issued for and is only ever sent there. The repo marker is untrusted input (anyone who
24
+ * can push to the repo controls it), so it may suggest a default for `login` and trigger a hint,
25
+ * but it never decides where a key is sent: otherwise a hostile repo would point the URL at its
26
+ * own server and collect the key of every dev who opens it.
27
+ */
28
+ const fs_1 = __importDefault(require("fs"));
29
+ const os_1 = __importDefault(require("os"));
30
+ const path_1 = __importDefault(require("path"));
31
+ exports.MARKER_FILE = '.lemma-cloud.json';
32
+ function userConfigPath(env = process.env) {
33
+ const override = env.LEMMA_CLOUD_CONFIG?.trim();
34
+ return override || path_1.default.join(os_1.default.homedir(), '.lemma', 'cloud.json');
35
+ }
36
+ function readUserConfig(env = process.env) {
37
+ const file = userConfigPath(env);
38
+ let stat;
39
+ try {
40
+ stat = fs_1.default.statSync(file);
41
+ }
42
+ catch {
43
+ return { found: false };
44
+ }
45
+ // The file holds a credential: if other users on this machine can read it, refuse to use it
46
+ // and say how to fix it, rather than quietly sending a key that is already exposed.
47
+ if (process.platform !== 'win32' && (stat.mode & 0o077) !== 0) {
48
+ return { found: true, problem: `${file} is readable by other users: run chmod 600 on it (or \`lemma cloud login\` again)` };
49
+ }
50
+ try {
51
+ const parsed = JSON.parse(fs_1.default.readFileSync(file, 'utf8'));
52
+ if (typeof parsed?.url !== 'string' || typeof parsed?.key !== 'string' || !parsed.url || !parsed.key) {
53
+ return { found: true, problem: `${file} is missing "url" or "key": run \`lemma cloud login\`` };
54
+ }
55
+ return { found: true, config: { url: parsed.url, key: parsed.key, autoshare: parsed.autoshare === true } };
56
+ }
57
+ catch {
58
+ return { found: true, problem: `${file} is not valid JSON: run \`lemma cloud login\`` };
59
+ }
60
+ }
61
+ /** Atomic write, owner-only. Never leaves a half-written or world-readable credential behind. */
62
+ function writeUserConfig(config, env = process.env) {
63
+ const file = userConfigPath(env);
64
+ fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true, mode: 0o700 });
65
+ const tmp = `${file}.${process.pid}.tmp`;
66
+ fs_1.default.writeFileSync(tmp, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
67
+ fs_1.default.chmodSync(tmp, 0o600); // the umask can only have removed bits, but be explicit
68
+ fs_1.default.renameSync(tmp, file);
69
+ return file;
70
+ }
71
+ /** True when a config existed and was removed. */
72
+ function removeUserConfig(env = process.env) {
73
+ try {
74
+ fs_1.default.unlinkSync(userConfigPath(env));
75
+ return true;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ function markerPath(root) {
82
+ return path_1.default.join(root, exports.MARKER_FILE);
83
+ }
84
+ function readMarker(root) {
85
+ try {
86
+ const parsed = JSON.parse(fs_1.default.readFileSync(markerPath(root), 'utf8'));
87
+ if (typeof parsed?.url !== 'string')
88
+ return null;
89
+ const u = new URL(parsed.url);
90
+ if (u.protocol !== 'https:' && !(u.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(u.hostname)))
91
+ return null;
92
+ if (u.username || u.password)
93
+ return null;
94
+ return { url: u.origin + u.pathname.replace(/\/+$/, '') };
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * The marker of the repo `start` lives in: the nearest one going up, stopping at the repo root (the
102
+ * first directory with a .git) or the filesystem root. Plain file reads, no subprocess: this runs on
103
+ * every search_memory for every user, Cloud or not, and spawning `git rev-parse` there cost ~9 ms a call.
104
+ */
105
+ function findMarker(start) {
106
+ let dir = path_1.default.resolve(start);
107
+ for (let depth = 0; depth < 64; depth++) {
108
+ const marker = readMarker(dir);
109
+ if (marker)
110
+ return marker;
111
+ if (fs_1.default.existsSync(path_1.default.join(dir, '.git')))
112
+ return null;
113
+ const parent = path_1.default.dirname(dir);
114
+ if (parent === dir)
115
+ return null;
116
+ dir = parent;
117
+ }
118
+ return null;
119
+ }
120
+ function writeMarker(root, url) {
121
+ const file = markerPath(root);
122
+ fs_1.default.writeFileSync(file, JSON.stringify({ url }, null, 2) + '\n', 'utf8');
123
+ return file;
124
+ }
125
+ /**
126
+ * The host of a marker URL, safe to print into the agent's context. The marker is repo content
127
+ * anybody can edit, so only a validated host ever reaches a tool reply: no free text, no path,
128
+ * no control characters.
129
+ */
130
+ function markerHost(marker) {
131
+ return new URL(marker.url).host.replace(/[^a-zA-Z0-9.:\-[\]]/g, '');
132
+ }
133
+ //# sourceMappingURL=CloudConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudConfig.js","sourceRoot":"","sources":["../../../src/cloud/CloudConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type CloudConfig } from './CloudBrainClient';
2
+ import type { EntitlementResponse } from '../contracts/api-v2.types';
3
+ /** How long the last answer keeps working when the server cannot be reached. */
4
+ export declare const GRACE_MS: number;
5
+ /** An answer older than this is asked for again. */
6
+ export declare const REFRESH_AFTER_MS: number;
7
+ export interface StoredEntitlement {
8
+ v: 1;
9
+ /** Which connection (URL + key) this answer is for. */
10
+ binding: string;
11
+ plan: string;
12
+ includesPro: boolean;
13
+ /** The server answered 401: the seat was taken away. */
14
+ revoked: boolean;
15
+ checkedAt: number;
16
+ }
17
+ export declare function entitlementPath(env?: NodeJS.ProcessEnv): string;
18
+ /** A short fingerprint of the connection. Not the server's key hash: it is salted with the URL. */
19
+ export declare function bindingFor(config: Pick<CloudConfig, 'baseUrl' | 'apiKey'>): string;
20
+ export declare function readStored(env?: NodeJS.ProcessEnv): StoredEntitlement | null;
21
+ /** For tests: forget the one-second memo of {@link cloudGrantsPro}. */
22
+ export declare function resetEntitlementMemo(): void;
23
+ /**
24
+ * Whether the connection this machine is logged in with currently carries Pro. Synchronous, no
25
+ * network, false whenever anything is missing or does not match.
26
+ */
27
+ export declare function cloudGrantsPro(env?: NodeJS.ProcessEnv, now?: number): boolean;
28
+ /** Keep the server's answer for this connection. */
29
+ export declare function recordEntitlement(config: Pick<CloudConfig, 'baseUrl' | 'apiKey'>, answer: EntitlementResponse, env?: NodeJS.ProcessEnv, now?: number): void;
30
+ /** Forget the entitlement (logout). True when there was one. */
31
+ export declare function clearEntitlement(env?: NodeJS.ProcessEnv): boolean;
32
+ export type RefreshState =
33
+ /** The server says this seat includes Pro. */
34
+ 'granted'
35
+ /** The server knows the key and the plan does not include Pro (free). */
36
+ | 'not-included'
37
+ /** The server rejected the key (401): the seat is gone, Pro from Cloud is off now. */
38
+ | 'revoked'
39
+ /** An older server without the endpoint (404): nothing is recorded or changed. */
40
+ | 'unsupported'
41
+ /** No usable answer (network, timeout, 5xx, 429, unreadable body): the last answer stands until the grace runs out. */
42
+ | 'unreachable';
43
+ export interface RefreshResult {
44
+ state: RefreshState;
45
+ plan?: string;
46
+ }
47
+ /** Ask the server and record what it says. Never throws. */
48
+ export declare function refreshEntitlement(config: CloudConfig, env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch, now?: number): Promise<RefreshResult>;
49
+ /**
50
+ * For the long-lived MCP server: refresh when the saved answer is missing or older than an hour,
51
+ * and look again every half hour. Does nothing, and costs nothing, while Cloud is not configured.
52
+ * The timer is unref'd so it never keeps a process alive. Returns a function that stops it.
53
+ */
54
+ export declare function startEntitlementRefresh(env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch): () => void;
55
+ //# sourceMappingURL=CloudEntitlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudEntitlement.d.ts","sourceRoot":"","sources":["../../../src/cloud/CloudEntitlement.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAmD,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,gFAAgF;AAChF,eAAO,MAAM,QAAQ,QAA0B,CAAC;AAChD,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,QAAiB,CAAC;AAS/C,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,CAAC,CAAC;IACL,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5E;AAED,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG,MAAM,CAElF;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,GAAG,IAAI,CAkBzF;AAYD,uEAAuE;AACvE,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAMtG;AAYD,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAEpL;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAQ9E;AAED,MAAM,MAAM,YAAY;AACtB,8CAA8C;AAC5C,SAAS;AACX,yEAAyE;GACvE,cAAc;AAChB,sFAAsF;GACpF,SAAS;AACX,kFAAkF;GAChF,aAAa;AACf,uHAAuH;GACrH,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAOD,4DAA4D;AAC5D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,CAAC,EAAE,OAAO,KAAK,EACxB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,MAAM,IAAI,CAYlH"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.REFRESH_AFTER_MS = exports.GRACE_MS = void 0;
7
+ exports.entitlementPath = entitlementPath;
8
+ exports.bindingFor = bindingFor;
9
+ exports.readStored = readStored;
10
+ exports.resetEntitlementMemo = resetEntitlementMemo;
11
+ exports.cloudGrantsPro = cloudGrantsPro;
12
+ exports.recordEntitlement = recordEntitlement;
13
+ exports.clearEntitlement = clearEntitlement;
14
+ exports.refreshEntitlement = refreshEntitlement;
15
+ exports.startEntitlementRefresh = startEntitlementRefresh;
16
+ /**
17
+ * Lemma Cloud — what a seat entitles this machine to.
18
+ *
19
+ * A seat on a paid Cloud plan also unlocks the local Pro tools. The client does not decide that: it
20
+ * asks the server (GET /v2/entitlement) and keeps the last answer in ~/.lemma/cloud-entitlement.json
21
+ * next to the connection it belongs to. The file is only a cache of the server's answer and, like
22
+ * ~/.lemma-cache/license.json, it can be edited by whoever owns the machine; what it adds is that an
23
+ * answer for one connection is never honoured for another.
24
+ *
25
+ * Three rules, each from a way this has gone wrong before:
26
+ * - Only an explicit 401 takes the entitlement away. A timeout, a 5xx, a 429 or a body we cannot
27
+ * read keeps the last answer until it is older than the grace period (a KeyManager that treated
28
+ * "anything but valid" as "cancelled" once deleted a paying user's license).
29
+ * - Reading is synchronous and touches two small files, never the network: the host hooks are
30
+ * short-lived processes with a latency budget. Only the long-lived MCP server refreshes.
31
+ * - The answer is bound to the URL and key it was fetched with, so logging in as someone else, or
32
+ * pointing at another server, starts from "no entitlement" instead of inheriting the old one.
33
+ */
34
+ const crypto_1 = __importDefault(require("crypto"));
35
+ const fs_1 = __importDefault(require("fs"));
36
+ const path_1 = __importDefault(require("path"));
37
+ const CloudBrainClient_1 = require("./CloudBrainClient");
38
+ const CloudConfig_1 = require("./CloudConfig");
39
+ /** How long the last answer keeps working when the server cannot be reached. */
40
+ exports.GRACE_MS = 7 * 24 * 60 * 60 * 1000;
41
+ /** An answer older than this is asked for again. */
42
+ exports.REFRESH_AFTER_MS = 60 * 60 * 1000;
43
+ /** The MCP checks whether a refresh is due this often. */
44
+ const TICK_MS = 30 * 60 * 1000;
45
+ /** A recorded time this far ahead of the clock is not believed. */
46
+ const FUTURE_SKEW_MS = 5 * 60 * 1000;
47
+ /** Tool gates call this on every request; re-reading two files each time buys nothing. */
48
+ const MEMO_MS = 1000;
49
+ const REFRESH_TIMEOUT_MS = 8000;
50
+ function entitlementPath(env = process.env) {
51
+ return path_1.default.join(path_1.default.dirname((0, CloudConfig_1.userConfigPath)(env)), 'cloud-entitlement.json');
52
+ }
53
+ /** A short fingerprint of the connection. Not the server's key hash: it is salted with the URL. */
54
+ function bindingFor(config) {
55
+ return crypto_1.default.createHash('sha256').update(`${config.baseUrl}\n${config.apiKey}`).digest('hex').slice(0, 16);
56
+ }
57
+ function readStored(env = process.env) {
58
+ try {
59
+ const p = JSON.parse(fs_1.default.readFileSync(entitlementPath(env), 'utf8'));
60
+ if (p?.v !== 1 ||
61
+ typeof p.binding !== 'string' ||
62
+ typeof p.plan !== 'string' ||
63
+ typeof p.includesPro !== 'boolean' ||
64
+ typeof p.revoked !== 'boolean' ||
65
+ typeof p.checkedAt !== 'number' ||
66
+ !Number.isFinite(p.checkedAt)) {
67
+ return null;
68
+ }
69
+ return p;
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ function writeStored(s, env) {
76
+ const file = entitlementPath(env);
77
+ fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true, mode: 0o700 });
78
+ const tmp = `${file}.${process.pid}.tmp`;
79
+ fs_1.default.writeFileSync(tmp, JSON.stringify(s, null, 2) + '\n', { mode: 0o600 });
80
+ fs_1.default.renameSync(tmp, file);
81
+ memo = null;
82
+ }
83
+ let memo = null;
84
+ /** For tests: forget the one-second memo of {@link cloudGrantsPro}. */
85
+ function resetEntitlementMemo() {
86
+ memo = null;
87
+ }
88
+ /**
89
+ * Whether the connection this machine is logged in with currently carries Pro. Synchronous, no
90
+ * network, false whenever anything is missing or does not match.
91
+ */
92
+ function cloudGrantsPro(env = process.env, now = Date.now()) {
93
+ const useMemo = env === process.env;
94
+ if (useMemo && memo && now - memo.at < MEMO_MS)
95
+ return memo.value;
96
+ const value = compute(env, now);
97
+ if (useMemo)
98
+ memo = { at: now, value };
99
+ return value;
100
+ }
101
+ function compute(env, now) {
102
+ const status = (0, CloudBrainClient_1.cloudConfigStatus)(env);
103
+ if (!status.config)
104
+ return false;
105
+ const s = readStored(env);
106
+ if (!s || s.revoked || !s.includesPro)
107
+ return false;
108
+ if (s.binding !== bindingFor(status.config))
109
+ return false;
110
+ if (s.checkedAt > now + FUTURE_SKEW_MS)
111
+ return false;
112
+ return now - s.checkedAt < exports.GRACE_MS;
113
+ }
114
+ /** Keep the server's answer for this connection. */
115
+ function recordEntitlement(config, answer, env = process.env, now = Date.now()) {
116
+ writeStored({ v: 1, binding: bindingFor(config), plan: answer.plan, includesPro: answer.includesPro, revoked: false, checkedAt: now }, env);
117
+ }
118
+ /** Forget the entitlement (logout). True when there was one. */
119
+ function clearEntitlement(env = process.env) {
120
+ memo = null;
121
+ try {
122
+ fs_1.default.unlinkSync(entitlementPath(env));
123
+ return true;
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ function isAnswer(x) {
130
+ const a = x;
131
+ return !!a && typeof a.plan === 'string' && typeof a.includesPro === 'boolean';
132
+ }
133
+ /** Ask the server and record what it says. Never throws. */
134
+ async function refreshEntitlement(config, env = process.env, fetchImpl, now = Date.now()) {
135
+ try {
136
+ const answer = await new CloudBrainClient_1.CloudBrainClient({ ...config, timeoutMs: Math.max(config.timeoutMs, REFRESH_TIMEOUT_MS) }, fetchImpl).entitlement();
137
+ if (!isAnswer(answer))
138
+ return { state: 'unreachable' };
139
+ recordEntitlement(config, answer, env, now);
140
+ return { state: answer.includesPro ? 'granted' : 'not-included', plan: answer.plan };
141
+ }
142
+ catch (err) {
143
+ if (err instanceof CloudBrainClient_1.CloudError) {
144
+ if (err.status === 401) {
145
+ writeStored({ v: 1, binding: bindingFor(config), plan: 'free', includesPro: false, revoked: true, checkedAt: now }, env);
146
+ return { state: 'revoked' };
147
+ }
148
+ if (err.status === 404)
149
+ return { state: 'unsupported' };
150
+ }
151
+ return { state: 'unreachable' };
152
+ }
153
+ }
154
+ /**
155
+ * For the long-lived MCP server: refresh when the saved answer is missing or older than an hour,
156
+ * and look again every half hour. Does nothing, and costs nothing, while Cloud is not configured.
157
+ * The timer is unref'd so it never keeps a process alive. Returns a function that stops it.
158
+ */
159
+ function startEntitlementRefresh(env = process.env, fetchImpl) {
160
+ const tick = () => {
161
+ const status = (0, CloudBrainClient_1.cloudConfigStatus)(env);
162
+ if (!status.config)
163
+ return;
164
+ const s = readStored(env);
165
+ if (s && s.binding === bindingFor(status.config) && Date.now() - s.checkedAt < exports.REFRESH_AFTER_MS)
166
+ return;
167
+ void refreshEntitlement(status.config, env, fetchImpl).catch(() => { });
168
+ };
169
+ tick();
170
+ const timer = setInterval(tick, TICK_MS);
171
+ timer.unref();
172
+ return () => clearInterval(timer);
173
+ }
174
+ //# sourceMappingURL=CloudEntitlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudEntitlement.js","sourceRoot":"","sources":["../../../src/cloud/CloudEntitlement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export declare const TRIAL_DAYS = 14;
2
+ export type Interval = 'month' | 'year';
3
+ export declare const SELLABLE_PLANS: readonly ["vinel", "regnum"];
4
+ export type SellablePlan = (typeof SELLABLE_PLANS)[number];
5
+ export interface StripeApiConfig {
6
+ secretKey: string;
7
+ /** Where Stripe sends the customer after paying or cancelling. */
8
+ successUrl: string;
9
+ cancelUrl: string;
10
+ /** Where the billing portal's "back" link goes. */
11
+ portalReturnUrl: string;
12
+ /** Test seam: defaults to the global fetch. */
13
+ fetchImpl?: typeof fetch;
14
+ }
15
+ export declare function stripeApiConfigFromEnv(env?: NodeJS.ProcessEnv): StripeApiConfig | null;
16
+ /** The stable lookup key the Stripe setup gave each price: `lemma_cloud_vinel_monthly`, ... */
17
+ export declare const priceLookupKey: (plan: SellablePlan, interval: Interval) => string;
18
+ export declare const founderCoupon: (plan: SellablePlan) => string;
19
+ export declare class StripeApi {
20
+ private readonly config;
21
+ private readonly fetchImpl;
22
+ constructor(config: StripeApiConfig);
23
+ private call;
24
+ /** Creates a Checkout Session for `tenantId` and returns its URL. */
25
+ createCheckout(input: {
26
+ tenantId: string;
27
+ plan: SellablePlan;
28
+ interval: Interval;
29
+ founder: boolean;
30
+ existingCustomerId: string | null;
31
+ email?: string;
32
+ }): Promise<{
33
+ url: string;
34
+ expiresAt: number;
35
+ }>;
36
+ /** Creates a customer-portal session (payment method, invoices, cancel) for an existing Stripe customer. */
37
+ createPortal(customerId: string): Promise<{
38
+ url: string;
39
+ }>;
40
+ }
41
+ /** The client for the operator routes, or undefined when STRIPE_SECRET_KEY is not set (the routes are then not mounted). */
42
+ export declare function stripeApiFromEnv(env?: NodeJS.ProcessEnv): StripeApi | undefined;
43
+ //# sourceMappingURL=stripeApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeApi.d.ts","sourceRoot":"","sources":["../../../../src/cloud/billing/stripeApi.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACxC,eAAO,MAAM,cAAc,8BAA2D,CAAC;AACvF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAID,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,GAAG,IAAI,CASnG;AAED,+FAA+F;AAC/F,eAAO,MAAM,cAAc,GAAI,MAAM,YAAY,EAAE,UAAU,QAAQ,KAAG,MAA6C,CAAC;AACtH,eAAO,MAAM,aAAa,GAAI,MAAM,YAAY,KAAG,MAAyC,CAAC;AAK7F,qBAAa,SAAS;IAER,OAAO,CAAC,QAAQ,CAAC,MAAM;IADnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBACZ,MAAM,EAAE,eAAe;YAItC,IAAI;IAmBlB,qEAAqE;IAC/D,cAAc,CAAC,KAAK,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,YAAY,CAAC;QACnB,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B/C,4GAA4G;IACtG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAKjE;AAED,4HAA4H;AAC5H,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,GAAG,SAAS,CAG5F"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StripeApi = exports.founderCoupon = exports.priceLookupKey = exports.SELLABLE_PLANS = exports.TRIAL_DAYS = void 0;
4
+ exports.stripeApiConfigFromEnv = stripeApiConfigFromEnv;
5
+ exports.stripeApiFromEnv = stripeApiFromEnv;
6
+ /**
7
+ * Lemma Cloud — the two Stripe calls an operator needs: a Checkout link for a tenant, and a billing
8
+ * portal link for a tenant that already pays. A thin client over `fetch` (the webhook already avoids
9
+ * the Stripe SDK; this keeps the dependency list unchanged and the form encoding visible in tests).
10
+ *
11
+ * What makes a checkout Cloud's rather than anyone else's in the same Stripe account:
12
+ * - `client_reference_id` = the tenant id, and `metadata.lemma_product = "cloud"` (the Pro license
13
+ * site's webhook skips sessions with either, and our webhook links the customer through the first);
14
+ * - the same tenant id on the SUBSCRIPTION metadata, so `customer.subscription.*` finds the tenant
15
+ * even when it overtakes `checkout.session.completed`.
16
+ *
17
+ * The secret key never appears in a response or a log line: Stripe errors are reduced to their message.
18
+ */
19
+ const errors_1 = require("../../contracts/errors");
20
+ exports.TRIAL_DAYS = 14;
21
+ exports.SELLABLE_PLANS = ['vinel', 'regnum'];
22
+ const DEFAULT_URL = 'https://lemma.nxus.studio/';
23
+ function stripeApiConfigFromEnv(env = process.env) {
24
+ const secretKey = env.STRIPE_SECRET_KEY;
25
+ if (!secretKey)
26
+ return null;
27
+ return {
28
+ secretKey,
29
+ successUrl: env.CLOUD_CHECKOUT_SUCCESS_URL || `${DEFAULT_URL}?cloud=success`,
30
+ cancelUrl: env.CLOUD_CHECKOUT_CANCEL_URL || `${DEFAULT_URL}?cloud=cancelled`,
31
+ portalReturnUrl: env.CLOUD_PORTAL_RETURN_URL || DEFAULT_URL,
32
+ };
33
+ }
34
+ /** The stable lookup key the Stripe setup gave each price: `lemma_cloud_vinel_monthly`, ... */
35
+ const priceLookupKey = (plan, interval) => `lemma_cloud_${plan}_${interval}ly`;
36
+ exports.priceLookupKey = priceLookupKey;
37
+ const founderCoupon = (plan) => `FOUNDER_${plan.toUpperCase()}`;
38
+ exports.founderCoupon = founderCoupon;
39
+ const upstream = (what, detail) => new errors_1.LemmaApiError({ code: 'internal', status: 502, message: `billing provider error while ${what}${detail ? `: ${detail}` : ''}` });
40
+ class StripeApi {
41
+ constructor(config) {
42
+ this.config = config;
43
+ this.fetchImpl = config.fetchImpl ?? fetch;
44
+ }
45
+ async call(method, path, form, what = 'calling Stripe') {
46
+ let res;
47
+ try {
48
+ res = await this.fetchImpl('https://api.stripe.com/v1' + path, {
49
+ method,
50
+ headers: {
51
+ Authorization: 'Basic ' + Buffer.from(this.config.secretKey + ':').toString('base64'),
52
+ ...(form ? { 'Content-Type': 'application/x-www-form-urlencoded' } : {}),
53
+ },
54
+ body: form ? new URLSearchParams(form).toString() : undefined,
55
+ });
56
+ }
57
+ catch {
58
+ throw upstream(what, 'unreachable');
59
+ }
60
+ const json = await res.json().catch(() => null);
61
+ if (!res.ok || !json || json.error)
62
+ throw upstream(what, typeof json?.error?.message === 'string' ? json.error.message : `HTTP ${res.status}`);
63
+ return json;
64
+ }
65
+ /** Creates a Checkout Session for `tenantId` and returns its URL. */
66
+ async createCheckout(input) {
67
+ const { tenantId, plan, interval } = input;
68
+ const lookup = (0, exports.priceLookupKey)(plan, interval);
69
+ const prices = await this.call('GET', `/prices?lookup_keys[]=${encodeURIComponent(lookup)}&active=true`, undefined, 'looking up the price');
70
+ const price = prices.data?.[0];
71
+ if (!price?.id)
72
+ throw upstream('looking up the price', `no active price with lookup key ${lookup}`);
73
+ const form = {
74
+ mode: 'subscription',
75
+ 'line_items[0][price]': price.id,
76
+ 'line_items[0][quantity]': '1',
77
+ client_reference_id: tenantId,
78
+ 'metadata[lemma_product]': 'cloud',
79
+ 'metadata[tenantId]': tenantId,
80
+ 'subscription_data[metadata][lemma_product]': 'cloud',
81
+ 'subscription_data[metadata][tenantId]': tenantId,
82
+ 'subscription_data[trial_period_days]': String(exports.TRIAL_DAYS),
83
+ success_url: this.config.successUrl,
84
+ cancel_url: this.config.cancelUrl,
85
+ };
86
+ if (input.founder)
87
+ form['discounts[0][coupon]'] = (0, exports.founderCoupon)(plan);
88
+ if (input.existingCustomerId)
89
+ form.customer = input.existingCustomerId;
90
+ else if (input.email)
91
+ form.customer_email = input.email;
92
+ const session = await this.call('POST', '/checkout/sessions', form, 'creating the checkout');
93
+ if (typeof session.url !== 'string')
94
+ throw upstream('creating the checkout', 'no URL returned');
95
+ return { url: session.url, expiresAt: typeof session.expires_at === 'number' ? session.expires_at * 1000 : 0 };
96
+ }
97
+ /** Creates a customer-portal session (payment method, invoices, cancel) for an existing Stripe customer. */
98
+ async createPortal(customerId) {
99
+ const session = await this.call('POST', '/billing_portal/sessions', { customer: customerId, return_url: this.config.portalReturnUrl }, 'creating the portal session');
100
+ if (typeof session.url !== 'string')
101
+ throw upstream('creating the portal session', 'no URL returned');
102
+ return { url: session.url };
103
+ }
104
+ }
105
+ exports.StripeApi = StripeApi;
106
+ /** The client for the operator routes, or undefined when STRIPE_SECRET_KEY is not set (the routes are then not mounted). */
107
+ function stripeApiFromEnv(env = process.env) {
108
+ const config = stripeApiConfigFromEnv(env);
109
+ return config ? new StripeApi(config) : undefined;
110
+ }
111
+ //# sourceMappingURL=stripeApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeApi.js","sourceRoot":"","sources":["../../../../src/cloud/billing/stripeApi.ts"],"names":[],"mappings":"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"}