@nxuss/lemma 1.17.0 → 1.18.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 (466) hide show
  1. package/bin/init.js +97 -11
  2. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  3. package/dist/cjs/cli/lemma-proxy.js +19 -11
  4. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  5. package/dist/cjs/cloud/TenantCache.d.ts.map +1 -1
  6. package/dist/cjs/cloud/TenantCache.js +0 -4
  7. package/dist/cjs/cloud/TenantCache.js.map +1 -1
  8. package/dist/cjs/cloud/identity/ApiKey.d.ts +32 -0
  9. package/dist/cjs/cloud/identity/ApiKey.d.ts.map +1 -0
  10. package/dist/cjs/cloud/identity/ApiKey.js +59 -0
  11. package/dist/cjs/cloud/identity/ApiKey.js.map +1 -0
  12. package/dist/cjs/cloud/identity/PlanPolicy.d.ts +79 -0
  13. package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -0
  14. package/dist/cjs/cloud/identity/PlanPolicy.js +135 -0
  15. package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -0
  16. package/dist/cjs/cloud/identity/RateLimiter.d.ts +49 -0
  17. package/dist/cjs/cloud/identity/RateLimiter.d.ts.map +1 -0
  18. package/dist/cjs/cloud/identity/RateLimiter.js +75 -0
  19. package/dist/cjs/cloud/identity/RateLimiter.js.map +1 -0
  20. package/dist/cjs/cloud/identity/TenantResolver.d.ts +19 -0
  21. package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -0
  22. package/dist/cjs/cloud/identity/TenantResolver.js +40 -0
  23. package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -0
  24. package/dist/cjs/cloud/identity/authenticateV2.d.ts +48 -0
  25. package/dist/cjs/cloud/identity/authenticateV2.d.ts.map +1 -0
  26. package/dist/cjs/cloud/identity/authenticateV2.js +66 -0
  27. package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -0
  28. package/dist/cjs/cloud/identity/identityStore.d.ts +56 -0
  29. package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -0
  30. package/dist/cjs/cloud/identity/identityStore.js +99 -0
  31. package/dist/cjs/cloud/identity/identityStore.js.map +1 -0
  32. package/dist/cjs/cloud/identity/index.d.ts +14 -0
  33. package/dist/cjs/cloud/identity/index.d.ts.map +1 -0
  34. package/dist/cjs/cloud/identity/index.js +30 -0
  35. package/dist/cjs/cloud/identity/index.js.map +1 -0
  36. package/dist/cjs/cloud/metering/TokenCounter.d.ts +26 -0
  37. package/dist/cjs/cloud/metering/TokenCounter.d.ts.map +1 -0
  38. package/dist/cjs/cloud/metering/TokenCounter.js +80 -0
  39. package/dist/cjs/cloud/metering/TokenCounter.js.map +1 -0
  40. package/dist/cjs/cloud/metering/UsageLedger.d.ts +68 -0
  41. package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -0
  42. package/dist/cjs/cloud/metering/UsageLedger.js +106 -0
  43. package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -0
  44. package/dist/cjs/cloud/metering/index.d.ts +12 -0
  45. package/dist/cjs/cloud/metering/index.d.ts.map +1 -0
  46. package/dist/cjs/cloud/metering/index.js +28 -0
  47. package/dist/cjs/cloud/metering/index.js.map +1 -0
  48. package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts +53 -0
  49. package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts.map +1 -0
  50. package/dist/cjs/cloud/scrub/StatelessScrubber.js +203 -0
  51. package/dist/cjs/cloud/scrub/StatelessScrubber.js.map +1 -0
  52. package/dist/cjs/cloud/scrub/index.d.ts +5 -0
  53. package/dist/cjs/cloud/scrub/index.d.ts.map +1 -0
  54. package/dist/cjs/cloud/scrub/index.js +21 -0
  55. package/dist/cjs/cloud/scrub/index.js.map +1 -0
  56. package/dist/cjs/cloud/store/FileBrainStore.d.ts +26 -0
  57. package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -0
  58. package/dist/cjs/cloud/store/FileBrainStore.js +219 -0
  59. package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -0
  60. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +50 -0
  61. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -0
  62. package/dist/cjs/cloud/store/PostgresBrainStore.js +181 -0
  63. package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -0
  64. package/dist/cjs/cloud/store/index.d.ts +6 -0
  65. package/dist/cjs/cloud/store/index.d.ts.map +1 -0
  66. package/dist/cjs/cloud/store/index.js +22 -0
  67. package/dist/cjs/cloud/store/index.js.map +1 -0
  68. package/dist/cjs/cloud/types.d.ts +0 -4
  69. package/dist/cjs/cloud/types.d.ts.map +1 -1
  70. package/dist/cjs/cloud/types.js +1 -3
  71. package/dist/cjs/cloud/types.js.map +1 -1
  72. package/dist/cjs/cloud/v2/app.d.ts +15 -0
  73. package/dist/cjs/cloud/v2/app.d.ts.map +1 -0
  74. package/dist/cjs/cloud/v2/app.js +63 -0
  75. package/dist/cjs/cloud/v2/app.js.map +1 -0
  76. package/dist/cjs/cloud/v2/routes/index.d.ts +24 -0
  77. package/dist/cjs/cloud/v2/routes/index.d.ts.map +1 -0
  78. package/dist/cjs/cloud/v2/routes/index.js +35 -0
  79. package/dist/cjs/cloud/v2/routes/index.js.map +1 -0
  80. package/dist/cjs/cloud/v2/routes/memories.d.ts +83 -0
  81. package/dist/cjs/cloud/v2/routes/memories.d.ts.map +1 -0
  82. package/dist/cjs/cloud/v2/routes/memories.js +249 -0
  83. package/dist/cjs/cloud/v2/routes/memories.js.map +1 -0
  84. package/dist/cjs/cloud/v2/routes/recall.d.ts +33 -0
  85. package/dist/cjs/cloud/v2/routes/recall.d.ts.map +1 -0
  86. package/dist/cjs/cloud/v2/routes/recall.js +51 -0
  87. package/dist/cjs/cloud/v2/routes/recall.js.map +1 -0
  88. package/dist/cjs/cloud/v2/routes/scrub.d.ts +13 -0
  89. package/dist/cjs/cloud/v2/routes/scrub.d.ts.map +1 -0
  90. package/dist/cjs/cloud/v2/routes/scrub.js +82 -0
  91. package/dist/cjs/cloud/v2/routes/scrub.js.map +1 -0
  92. package/dist/cjs/cloud/v2/routes/usage.d.ts +18 -0
  93. package/dist/cjs/cloud/v2/routes/usage.d.ts.map +1 -0
  94. package/dist/cjs/cloud/v2/routes/usage.js +18 -0
  95. package/dist/cjs/cloud/v2/routes/usage.js.map +1 -0
  96. package/dist/cjs/cloud/v2/routes/verify.d.ts +35 -0
  97. package/dist/cjs/cloud/v2/routes/verify.d.ts.map +1 -0
  98. package/dist/cjs/cloud/v2/routes/verify.js +43 -0
  99. package/dist/cjs/cloud/v2/routes/verify.js.map +1 -0
  100. package/dist/cjs/cloud/v2/server.d.ts +27 -0
  101. package/dist/cjs/cloud/v2/server.d.ts.map +1 -0
  102. package/dist/cjs/cloud/v2/server.js +47 -0
  103. package/dist/cjs/cloud/v2/server.js.map +1 -0
  104. package/dist/cjs/contracts/api-v2.types.d.ts +103 -0
  105. package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -0
  106. package/dist/cjs/contracts/api-v2.types.js +3 -0
  107. package/dist/cjs/contracts/api-v2.types.js.map +1 -0
  108. package/dist/cjs/contracts/errors.d.ts +40 -0
  109. package/dist/cjs/contracts/errors.d.ts.map +1 -0
  110. package/dist/cjs/contracts/errors.js +50 -0
  111. package/dist/cjs/contracts/errors.js.map +1 -0
  112. package/dist/cjs/contracts/evidence.d.ts +49 -0
  113. package/dist/cjs/contracts/evidence.d.ts.map +1 -0
  114. package/dist/cjs/contracts/evidence.js +12 -0
  115. package/dist/cjs/contracts/evidence.js.map +1 -0
  116. package/dist/cjs/contracts/index.d.ts +10 -0
  117. package/dist/cjs/contracts/index.d.ts.map +1 -0
  118. package/dist/cjs/contracts/index.js +26 -0
  119. package/dist/cjs/contracts/index.js.map +1 -0
  120. package/dist/cjs/contracts/store.d.ts +30 -0
  121. package/dist/cjs/contracts/store.d.ts.map +1 -0
  122. package/dist/cjs/contracts/store.js +3 -0
  123. package/dist/cjs/contracts/store.js.map +1 -0
  124. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  125. package/dist/cjs/mcp/tool-profiles.js +46 -1
  126. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  127. package/dist/cjs/mcp/tools.d.ts +2 -0
  128. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  129. package/dist/cjs/mcp/tools.js +40 -21
  130. package/dist/cjs/mcp/tools.js.map +1 -1
  131. package/dist/cjs/subconscious/TheBrainV2.d.ts +43 -7
  132. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  133. package/dist/cjs/subconscious/TheBrainV2.js +86 -57
  134. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  135. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts +16 -0
  136. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -0
  137. package/dist/cjs/subconscious/freshness/LocalFsResolver.js +74 -0
  138. package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -0
  139. package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.d.ts +23 -0
  140. package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.d.ts.map +1 -0
  141. package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.js +24 -0
  142. package/dist/cjs/subconscious/freshness/SuppliedEvidenceResolver.js.map +1 -0
  143. package/dist/cjs/subconscious/freshness/index.d.ts +10 -0
  144. package/dist/cjs/subconscious/freshness/index.d.ts.map +1 -0
  145. package/dist/cjs/subconscious/freshness/index.js +26 -0
  146. package/dist/cjs/subconscious/freshness/index.js.map +1 -0
  147. package/dist/cjs/utils/ProjectIdentity.d.ts +12 -0
  148. package/dist/cjs/utils/ProjectIdentity.d.ts.map +1 -0
  149. package/dist/cjs/utils/ProjectIdentity.js +44 -0
  150. package/dist/cjs/utils/ProjectIdentity.js.map +1 -0
  151. package/dist/cjs/utils/PromptPatternCache.d.ts.map +1 -1
  152. package/dist/cjs/utils/PromptPatternCache.js +12 -2
  153. package/dist/cjs/utils/PromptPatternCache.js.map +1 -1
  154. package/dist/cjs/utils/RepeatGuard.d.ts.map +1 -1
  155. package/dist/cjs/utils/RepeatGuard.js +10 -2
  156. package/dist/cjs/utils/RepeatGuard.js.map +1 -1
  157. package/dist/cjs/utils/StateHashCache.d.ts +5 -0
  158. package/dist/cjs/utils/StateHashCache.d.ts.map +1 -1
  159. package/dist/cjs/utils/StateHashCache.js +40 -16
  160. package/dist/cjs/utils/StateHashCache.js.map +1 -1
  161. package/dist/esm/api/dashboardRoutes.d.ts +3 -3
  162. package/dist/esm/api/dashboardRoutes.js +1 -1
  163. package/dist/esm/api/server.d.ts +4 -4
  164. package/dist/esm/api/server.js +3 -3
  165. package/dist/esm/autopilot/AutopilotWatcher.js +3 -3
  166. package/dist/esm/autopilot/Notifier.d.ts +1 -1
  167. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  168. package/dist/esm/cli/lemma-proxy.js +33 -25
  169. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  170. package/dist/esm/cli/stack.d.ts +4 -4
  171. package/dist/esm/cli/stack.js +5 -5
  172. package/dist/esm/cloud/KeyManager.d.ts +1 -1
  173. package/dist/esm/cloud/KeyManager.js +1 -1
  174. package/dist/esm/cloud/TenantCache.d.ts +1 -1
  175. package/dist/esm/cloud/TenantCache.d.ts.map +1 -1
  176. package/dist/esm/cloud/TenantCache.js +0 -4
  177. package/dist/esm/cloud/TenantCache.js.map +1 -1
  178. package/dist/esm/cloud/identity/ApiKey.d.ts +32 -0
  179. package/dist/esm/cloud/identity/ApiKey.d.ts.map +1 -0
  180. package/dist/esm/cloud/identity/ApiKey.js +49 -0
  181. package/dist/esm/cloud/identity/ApiKey.js.map +1 -0
  182. package/dist/esm/cloud/identity/PlanPolicy.d.ts +79 -0
  183. package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -0
  184. package/dist/esm/cloud/identity/PlanPolicy.js +129 -0
  185. package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -0
  186. package/dist/esm/cloud/identity/RateLimiter.d.ts +49 -0
  187. package/dist/esm/cloud/identity/RateLimiter.d.ts.map +1 -0
  188. package/dist/esm/cloud/identity/RateLimiter.js +69 -0
  189. package/dist/esm/cloud/identity/RateLimiter.js.map +1 -0
  190. package/dist/esm/cloud/identity/TenantResolver.d.ts +19 -0
  191. package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -0
  192. package/dist/esm/cloud/identity/TenantResolver.js +36 -0
  193. package/dist/esm/cloud/identity/TenantResolver.js.map +1 -0
  194. package/dist/esm/cloud/identity/authenticateV2.d.ts +48 -0
  195. package/dist/esm/cloud/identity/authenticateV2.d.ts.map +1 -0
  196. package/dist/esm/cloud/identity/authenticateV2.js +62 -0
  197. package/dist/esm/cloud/identity/authenticateV2.js.map +1 -0
  198. package/dist/esm/cloud/identity/identityStore.d.ts +56 -0
  199. package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -0
  200. package/dist/esm/cloud/identity/identityStore.js +94 -0
  201. package/dist/esm/cloud/identity/identityStore.js.map +1 -0
  202. package/dist/esm/cloud/identity/index.d.ts +14 -0
  203. package/dist/esm/cloud/identity/index.d.ts.map +1 -0
  204. package/dist/esm/cloud/identity/index.js +14 -0
  205. package/dist/esm/cloud/identity/index.js.map +1 -0
  206. package/dist/esm/cloud/index.d.ts +3 -3
  207. package/dist/esm/cloud/index.js +3 -3
  208. package/dist/esm/cloud/metering/TokenCounter.d.ts +26 -0
  209. package/dist/esm/cloud/metering/TokenCounter.d.ts.map +1 -0
  210. package/dist/esm/cloud/metering/TokenCounter.js +76 -0
  211. package/dist/esm/cloud/metering/TokenCounter.js.map +1 -0
  212. package/dist/esm/cloud/metering/UsageLedger.d.ts +68 -0
  213. package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -0
  214. package/dist/esm/cloud/metering/UsageLedger.js +98 -0
  215. package/dist/esm/cloud/metering/UsageLedger.js.map +1 -0
  216. package/dist/esm/cloud/metering/index.d.ts +12 -0
  217. package/dist/esm/cloud/metering/index.d.ts.map +1 -0
  218. package/dist/esm/cloud/metering/index.js +12 -0
  219. package/dist/esm/cloud/metering/index.js.map +1 -0
  220. package/dist/esm/cloud/scrub/StatelessScrubber.d.ts +53 -0
  221. package/dist/esm/cloud/scrub/StatelessScrubber.d.ts.map +1 -0
  222. package/dist/esm/cloud/scrub/StatelessScrubber.js +199 -0
  223. package/dist/esm/cloud/scrub/StatelessScrubber.js.map +1 -0
  224. package/dist/esm/cloud/scrub/index.d.ts +5 -0
  225. package/dist/esm/cloud/scrub/index.d.ts.map +1 -0
  226. package/dist/esm/cloud/scrub/index.js +5 -0
  227. package/dist/esm/cloud/scrub/index.js.map +1 -0
  228. package/dist/esm/cloud/server.d.ts +3 -3
  229. package/dist/esm/cloud/server.js +5 -5
  230. package/dist/esm/cloud/store/FileBrainStore.d.ts +26 -0
  231. package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -0
  232. package/dist/esm/cloud/store/FileBrainStore.js +212 -0
  233. package/dist/esm/cloud/store/FileBrainStore.js.map +1 -0
  234. package/dist/esm/cloud/store/PostgresBrainStore.d.ts +50 -0
  235. package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -0
  236. package/dist/esm/cloud/store/PostgresBrainStore.js +176 -0
  237. package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -0
  238. package/dist/esm/cloud/store/index.d.ts +6 -0
  239. package/dist/esm/cloud/store/index.d.ts.map +1 -0
  240. package/dist/esm/cloud/store/index.js +6 -0
  241. package/dist/esm/cloud/store/index.js.map +1 -0
  242. package/dist/esm/cloud/types.d.ts +0 -4
  243. package/dist/esm/cloud/types.d.ts.map +1 -1
  244. package/dist/esm/cloud/types.js +0 -2
  245. package/dist/esm/cloud/types.js.map +1 -1
  246. package/dist/esm/cloud/v2/app.d.ts +15 -0
  247. package/dist/esm/cloud/v2/app.d.ts.map +1 -0
  248. package/dist/esm/cloud/v2/app.js +57 -0
  249. package/dist/esm/cloud/v2/app.js.map +1 -0
  250. package/dist/esm/cloud/v2/routes/index.d.ts +24 -0
  251. package/dist/esm/cloud/v2/routes/index.d.ts.map +1 -0
  252. package/dist/esm/cloud/v2/routes/index.js +32 -0
  253. package/dist/esm/cloud/v2/routes/index.js.map +1 -0
  254. package/dist/esm/cloud/v2/routes/memories.d.ts +83 -0
  255. package/dist/esm/cloud/v2/routes/memories.d.ts.map +1 -0
  256. package/dist/esm/cloud/v2/routes/memories.js +238 -0
  257. package/dist/esm/cloud/v2/routes/memories.js.map +1 -0
  258. package/dist/esm/cloud/v2/routes/recall.d.ts +33 -0
  259. package/dist/esm/cloud/v2/routes/recall.d.ts.map +1 -0
  260. package/dist/esm/cloud/v2/routes/recall.js +47 -0
  261. package/dist/esm/cloud/v2/routes/recall.js.map +1 -0
  262. package/dist/esm/cloud/v2/routes/scrub.d.ts +13 -0
  263. package/dist/esm/cloud/v2/routes/scrub.d.ts.map +1 -0
  264. package/dist/esm/cloud/v2/routes/scrub.js +79 -0
  265. package/dist/esm/cloud/v2/routes/scrub.js.map +1 -0
  266. package/dist/esm/cloud/v2/routes/usage.d.ts +18 -0
  267. package/dist/esm/cloud/v2/routes/usage.d.ts.map +1 -0
  268. package/dist/esm/cloud/v2/routes/usage.js +15 -0
  269. package/dist/esm/cloud/v2/routes/usage.js.map +1 -0
  270. package/dist/esm/cloud/v2/routes/verify.d.ts +35 -0
  271. package/dist/esm/cloud/v2/routes/verify.d.ts.map +1 -0
  272. package/dist/esm/cloud/v2/routes/verify.js +39 -0
  273. package/dist/esm/cloud/v2/routes/verify.js.map +1 -0
  274. package/dist/esm/cloud/v2/server.d.ts +27 -0
  275. package/dist/esm/cloud/v2/server.d.ts.map +1 -0
  276. package/dist/esm/cloud/v2/server.js +44 -0
  277. package/dist/esm/cloud/v2/server.js.map +1 -0
  278. package/dist/esm/config/index.d.ts +1 -1
  279. package/dist/esm/config/index.js +1 -1
  280. package/dist/esm/consensus/index.d.ts +2 -2
  281. package/dist/esm/consensus/index.js +2 -2
  282. package/dist/esm/contracts/api-v2.types.d.ts +103 -0
  283. package/dist/esm/contracts/api-v2.types.d.ts.map +1 -0
  284. package/dist/esm/contracts/api-v2.types.js +2 -0
  285. package/dist/esm/contracts/api-v2.types.js.map +1 -0
  286. package/dist/esm/contracts/errors.d.ts +40 -0
  287. package/dist/esm/contracts/errors.d.ts.map +1 -0
  288. package/dist/esm/contracts/errors.js +45 -0
  289. package/dist/esm/contracts/errors.js.map +1 -0
  290. package/dist/esm/contracts/evidence.d.ts +49 -0
  291. package/dist/esm/contracts/evidence.d.ts.map +1 -0
  292. package/dist/esm/contracts/evidence.js +11 -0
  293. package/dist/esm/contracts/evidence.js.map +1 -0
  294. package/dist/esm/contracts/index.d.ts +10 -0
  295. package/dist/esm/contracts/index.d.ts.map +1 -0
  296. package/dist/esm/contracts/index.js +10 -0
  297. package/dist/esm/contracts/index.js.map +1 -0
  298. package/dist/esm/contracts/store.d.ts +30 -0
  299. package/dist/esm/contracts/store.d.ts.map +1 -0
  300. package/dist/esm/contracts/store.js +2 -0
  301. package/dist/esm/contracts/store.js.map +1 -0
  302. package/dist/esm/core/AgentRegistry.d.ts +1 -1
  303. package/dist/esm/core/AgentRegistry.js +1 -1
  304. package/dist/esm/core/DashboardBroadcaster.d.ts +3 -3
  305. package/dist/esm/core/DashboardBroadcaster.js +2 -2
  306. package/dist/esm/core/DashboardWebSocketServer.d.ts +1 -1
  307. package/dist/esm/core/DashboardWebSocketServer.js +1 -1
  308. package/dist/esm/core/GhostAlchemist.js +1 -1
  309. package/dist/esm/core/GhostListener.js +2 -2
  310. package/dist/esm/core/OrchestrationEngine.d.ts +3 -3
  311. package/dist/esm/core/OrchestrationEngine.js +2 -2
  312. package/dist/esm/core/SubconsciousEngine.d.ts +1 -1
  313. package/dist/esm/core/SubconsciousEngine.js +2 -2
  314. package/dist/esm/core/WebSocketServer.d.ts +2 -2
  315. package/dist/esm/core/WebSocketServer.js +1 -1
  316. package/dist/esm/core/index.d.ts +6 -6
  317. package/dist/esm/core/index.js +6 -6
  318. package/dist/esm/core/router.d.ts +3 -3
  319. package/dist/esm/core/router.js +1 -1
  320. package/dist/esm/db/database.js +1 -1
  321. package/dist/esm/embed.d.ts +2 -2
  322. package/dist/esm/embed.js +2 -2
  323. package/dist/esm/examples/basic-usage.js +1 -1
  324. package/dist/esm/index.d.ts +14 -14
  325. package/dist/esm/index.js +14 -14
  326. package/dist/esm/infra/analyzers/DriftDetector.d.ts +1 -1
  327. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +1 -1
  328. package/dist/esm/infra/analyzers/MonolithAnalyzer.d.ts +1 -1
  329. package/dist/esm/infra/analyzers/index.d.ts +3 -3
  330. package/dist/esm/infra/analyzers/index.js +3 -3
  331. package/dist/esm/infra/cli.js +2 -2
  332. package/dist/esm/infra/config.d.ts +1 -1
  333. package/dist/esm/infra/index.d.ts +5 -5
  334. package/dist/esm/infra/index.js +5 -5
  335. package/dist/esm/infra/mcp-tools.js +5 -5
  336. package/dist/esm/infra/providers/InfraProvider.d.ts +1 -1
  337. package/dist/esm/infra/providers/JenkinsProvider.d.ts +2 -2
  338. package/dist/esm/infra/providers/OKDProvider.d.ts +2 -2
  339. package/dist/esm/infra/providers/TerraformProvider.d.ts +2 -2
  340. package/dist/esm/infra/providers/index.d.ts +5 -5
  341. package/dist/esm/infra/providers/index.js +3 -3
  342. package/dist/esm/mcp/index.js +5 -5
  343. package/dist/esm/mcp/prompts.js +1 -1
  344. package/dist/esm/mcp/resources.js +2 -2
  345. package/dist/esm/mcp/tasks.js +1 -1
  346. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  347. package/dist/esm/mcp/tool-profiles.js +47 -2
  348. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  349. package/dist/esm/mcp/tools.d.ts +2 -0
  350. package/dist/esm/mcp/tools.d.ts.map +1 -1
  351. package/dist/esm/mcp/tools.js +87 -69
  352. package/dist/esm/mcp/tools.js.map +1 -1
  353. package/dist/esm/observability/IdeContextSync.d.ts +1 -1
  354. package/dist/esm/observability/IdeContextSync.js +5 -5
  355. package/dist/esm/pr-review/PRReviewEngine.d.ts +1 -1
  356. package/dist/esm/pr-review/PRReviewEngine.js +4 -4
  357. package/dist/esm/pr-review/ReviewStore.d.ts +1 -1
  358. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +2 -2
  359. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +1 -1
  360. package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +2 -2
  361. package/dist/esm/pr-review/adapters/GitHubAdapter.js +1 -1
  362. package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +2 -2
  363. package/dist/esm/pr-review/adapters/GitLabAdapter.js +1 -1
  364. package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +1 -1
  365. package/dist/esm/pr-review/adapters/index.d.ts +4 -4
  366. package/dist/esm/pr-review/adapters/index.js +3 -3
  367. package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +1 -1
  368. package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +1 -1
  369. package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +1 -1
  370. package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +1 -1
  371. package/dist/esm/pr-review/analyzers/index.d.ts +8 -8
  372. package/dist/esm/pr-review/analyzers/index.js +4 -4
  373. package/dist/esm/pr-review/bridge/BrainBridge.d.ts +1 -1
  374. package/dist/esm/pr-review/bridge/BrainBridge.js +1 -1
  375. package/dist/esm/pr-review/bridge/index.d.ts +1 -1
  376. package/dist/esm/pr-review/bridge/index.js +1 -1
  377. package/dist/esm/pr-review/index.d.ts +4 -4
  378. package/dist/esm/pr-review/index.js +2 -2
  379. package/dist/esm/pr-review/reviewRunner.d.ts +2 -2
  380. package/dist/esm/pr-review/reviewRunner.js +6 -6
  381. package/dist/esm/pr-review/webhook/WebhookServer.js +1 -1
  382. package/dist/esm/pr-review/webhook/index.d.ts +1 -1
  383. package/dist/esm/pr-review/webhook/index.js +1 -1
  384. package/dist/esm/protocol/flows.d.ts +1 -1
  385. package/dist/esm/protocol/flows.js +1 -1
  386. package/dist/esm/protocol/index.d.ts +4 -4
  387. package/dist/esm/protocol/index.js +4 -4
  388. package/dist/esm/protocol/utils.d.ts +1 -1
  389. package/dist/esm/protocol/utils.js +2 -2
  390. package/dist/esm/protocol/validators.d.ts +1 -1
  391. package/dist/esm/protocol/validators.js +1 -1
  392. package/dist/esm/proxy/ContextInjector.d.ts +1 -1
  393. package/dist/esm/proxy/Gatekeeper.d.ts +1 -1
  394. package/dist/esm/security/SecurityMiddleware.d.ts +1 -1
  395. package/dist/esm/security/SecurityMiddleware.js +3 -3
  396. package/dist/esm/security/index.d.ts +4 -4
  397. package/dist/esm/security/index.js +4 -4
  398. package/dist/esm/speculative/SpeculativeCache.d.ts +2 -2
  399. package/dist/esm/speculative/SpeculativeEngine.d.ts +2 -2
  400. package/dist/esm/speculative/SpeculativeEngine.js +3 -3
  401. package/dist/esm/speculative/WorkerPool.d.ts +1 -1
  402. package/dist/esm/speculative/index.d.ts +4 -4
  403. package/dist/esm/speculative/index.js +4 -4
  404. package/dist/esm/subconscious/GitIngest.d.ts +1 -1
  405. package/dist/esm/subconscious/GitIngest.js +1 -1
  406. package/dist/esm/subconscious/SemanticCache.d.ts +2 -2
  407. package/dist/esm/subconscious/SemanticCache.js +2 -2
  408. package/dist/esm/subconscious/SubconsciousEngine.d.ts +1 -1
  409. package/dist/esm/subconscious/SubconsciousEngine.js +3 -3
  410. package/dist/esm/subconscious/TheBrainV2.d.ts +43 -7
  411. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  412. package/dist/esm/subconscious/TheBrainV2.js +87 -58
  413. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  414. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts +16 -0
  415. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -0
  416. package/dist/esm/subconscious/freshness/LocalFsResolver.js +67 -0
  417. package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -0
  418. package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.d.ts +23 -0
  419. package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.d.ts.map +1 -0
  420. package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.js +20 -0
  421. package/dist/esm/subconscious/freshness/SuppliedEvidenceResolver.js.map +1 -0
  422. package/dist/esm/subconscious/freshness/index.d.ts +10 -0
  423. package/dist/esm/subconscious/freshness/index.d.ts.map +1 -0
  424. package/dist/esm/subconscious/freshness/index.js +10 -0
  425. package/dist/esm/subconscious/freshness/index.js.map +1 -0
  426. package/dist/esm/subconscious/index.d.ts +4 -4
  427. package/dist/esm/subconscious/index.js +4 -4
  428. package/dist/esm/utils/AffectedTests.js +1 -1
  429. package/dist/esm/utils/AutoContextBundle.d.ts +1 -1
  430. package/dist/esm/utils/AutoContextBundle.js +4 -4
  431. package/dist/esm/utils/BulkFileDigest.js +2 -2
  432. package/dist/esm/utils/ClipboardWatcher.js +2 -2
  433. package/dist/esm/utils/ContextCollapser.js +1 -1
  434. package/dist/esm/utils/ConversationCheckpoint.js +1 -1
  435. package/dist/esm/utils/ExecutiveReport.js +1 -1
  436. package/dist/esm/utils/OutputLedger.js +2 -2
  437. package/dist/esm/utils/ProjectIdentity.d.ts +12 -0
  438. package/dist/esm/utils/ProjectIdentity.d.ts.map +1 -0
  439. package/dist/esm/utils/ProjectIdentity.js +37 -0
  440. package/dist/esm/utils/ProjectIdentity.js.map +1 -0
  441. package/dist/esm/utils/PromptPatternCache.d.ts.map +1 -1
  442. package/dist/esm/utils/PromptPatternCache.js +12 -2
  443. package/dist/esm/utils/PromptPatternCache.js.map +1 -1
  444. package/dist/esm/utils/ReadWorkspaceCache.js +1 -1
  445. package/dist/esm/utils/RepeatGuard.d.ts.map +1 -1
  446. package/dist/esm/utils/RepeatGuard.js +10 -2
  447. package/dist/esm/utils/RepeatGuard.js.map +1 -1
  448. package/dist/esm/utils/SpeculativeWarmer.d.ts +1 -1
  449. package/dist/esm/utils/SpeculativeWarmer.js +2 -2
  450. package/dist/esm/utils/StateHashCache.d.ts +5 -0
  451. package/dist/esm/utils/StateHashCache.d.ts.map +1 -1
  452. package/dist/esm/utils/StateHashCache.js +40 -16
  453. package/dist/esm/utils/StateHashCache.js.map +1 -1
  454. package/dist/esm/utils/StructuralSearch.d.ts +1 -1
  455. package/dist/esm/utils/SurgicalASTInsert.js +1 -1
  456. package/dist/esm/utils/SymbolSurgicalContext.js +1 -1
  457. package/dist/esm/utils/TestAutofixInterceptor.js +1 -1
  458. package/dist/esm/utils/WorkspaceSearch.js +0 -0
  459. package/dist/esm/utils/logger.js +1 -1
  460. package/dist/esm/utils/reportSavings.js +1 -1
  461. package/package.json +1 -1
  462. package/sdks/crewai/README.md +25 -0
  463. package/dist/cjs/package.json +0 -3
  464. package/dist/esm/package.json +0 -3
  465. package/sdks/crewai/dist/index.d.ts +0 -130
  466. package/sdks/crewai/dist/index.js +0 -308
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Lemma API v2 — StatelessScrubber (Lane F)
3
+ *
4
+ * Stateless privacy firewall over raw text and serialized agent tool-call JSON.
5
+ *
6
+ * Contract (src/contracts/api-v2.types.ts):
7
+ * scrubText(text, mode) -> { text, findings } text input
8
+ * scrubToolCallJson(raw, mode) -> { toolCallJson, findings }
9
+ *
10
+ * Invariants:
11
+ * - DETECTED VALUES ARE NEVER RETURNED. The response carries only the masked
12
+ * text and an inventory of `{ type, offset, length }` findings. Nothing the
13
+ * caller passed in is echoed back except by design.
14
+ * - STATELESS: the constructor does NO I/O (unlike SemanticScrubber, whose
15
+ * constructor reads lemma.config.json from cwd). Fresh RegExps are compiled
16
+ * per call so `lastIndex` never leaks across concurrent requests. Nothing is
17
+ * persisted.
18
+ * - No `console.*` logging of the payload.
19
+ *
20
+ * This is the lane's adapted "wrap" of SemanticScrubber (which we cannot reuse
21
+ * verbatim: it exposes no per-finding offsets, has no DSN coverage, and loads
22
+ * config from cwd at construct time). See lane-notes/F.md ## decisions.
23
+ *
24
+ * Ownership: Lane F.
25
+ */
26
+ import type { ScrubFinding } from "../../contracts/api-v2.types";
27
+ export type ScrubMode = "mask" | "detect";
28
+ export declare class StatelessScrubber {
29
+ readonly lane = "F";
30
+ /** Scrub a raw text string. Offsets in findings are relative to `text`. */
31
+ scrubText(text: string, mode?: ScrubMode): {
32
+ text: string;
33
+ findings: ScrubFinding[];
34
+ };
35
+ /**
36
+ * Scrub a serialized agent tool-call JSON string. The JSON structure is
37
+ * preserved (always valid JSON on output). Each string leaf's text content is
38
+ * scrubbed in-place; findings offsets are relative to the ORIGINAL `raw`
39
+ * string the client sent. In detect mode the original string is returned
40
+ * byte-for-byte untouched (findings only).
41
+ */
42
+ scrubToolCallJson(raw: string, mode?: ScrubMode): {
43
+ toolCallJson: string;
44
+ findings: ScrubFinding[];
45
+ };
46
+ /** Backwards-compatible alias: scrubText. */
47
+ scrub(text: string, mode?: ScrubMode): {
48
+ text: string;
49
+ findings: ScrubFinding[];
50
+ };
51
+ }
52
+ export default StatelessScrubber;
53
+ //# sourceMappingURL=StatelessScrubber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatelessScrubber.d.ts","sourceRoot":"","sources":["../../../../src/cloud/scrub/StatelessScrubber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAwJ1C,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,OAAO;IAEpB,2EAA2E;IAC3E,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAAkB,GACvB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE;IAc7C;;;;;;OAMG;IACH,iBAAiB,CACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,SAAkB,GACvB;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE;IAqCrD,6CAA6C;IAC7C,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAAkB,GACvB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE;CAG9C;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Pattern table. Mirrors SemanticScrubber's built-in defaults (so behavior is
3
+ * consistent with the rest of the product) plus a connection-DSN pattern that
4
+ * SemanticScrubber lacks — DSN coverage is a hard acceptance criterion for this
5
+ * lane. Compiled fresh per call for statelessness.
6
+ */
7
+ const PATTERNS = [
8
+ {
9
+ name: "OPENAI_ANTHROPIC_KEY",
10
+ whole: true,
11
+ source: String.raw `\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}\b`,
12
+ flags: "g",
13
+ },
14
+ {
15
+ name: "STRIPE_KEY",
16
+ whole: true,
17
+ source: String.raw `\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{10,}\b|\bwhsec_[A-Za-z0-9]{20,}\b`,
18
+ flags: "g",
19
+ },
20
+ {
21
+ name: "AWS_ACCESS_KEY",
22
+ whole: true,
23
+ source: String.raw `\bAKIA[0-9A-Z]{16}\b`,
24
+ flags: "g",
25
+ },
26
+ {
27
+ name: "GITHUB_TOKEN",
28
+ whole: true,
29
+ source: String.raw `\bgh[pousr]_[A-Za-z0-9]{36,}\b|\bgithub_pat_[A-Za-z0-9_]{20,}\b`,
30
+ flags: "g",
31
+ },
32
+ {
33
+ name: "GOOGLE_API_KEY",
34
+ whole: true,
35
+ source: String.raw `\bAIza[0-9A-Za-z_-]{35}\b`,
36
+ flags: "g",
37
+ },
38
+ {
39
+ name: "SLACK_TOKEN",
40
+ whole: true,
41
+ source: String.raw `\bxox[baprs]-[A-Za-z0-9-]{10,}\b`,
42
+ flags: "g",
43
+ },
44
+ {
45
+ name: "JWT",
46
+ whole: true,
47
+ source: String.raw `\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b`,
48
+ flags: "g",
49
+ },
50
+ {
51
+ name: "PRIVATE_KEY_BLOCK",
52
+ whole: true,
53
+ source: String.raw `-----BEGIN[ A-Z]*PRIVATE KEY-----[\s\S]+?-----END[ A-Z]*PRIVATE KEY-----`,
54
+ flags: "g",
55
+ },
56
+ {
57
+ name: "BEARER_TOKEN",
58
+ whole: true,
59
+ source: String.raw `Bearer\s+[a-zA-Z0-9\-._~+/]+=*`,
60
+ flags: "gi",
61
+ },
62
+ // Connection DSN: masks the credentials (up to & including '@') and nothing else.
63
+ {
64
+ name: "CONNECTION_DSN",
65
+ whole: false,
66
+ source: String.raw `\b(?:postgres(?:ql)?|mysql|redis|rediss|mongodb(?:\+srv)?|amqp|ldaps?|mssql|oracle)://(?<secret>[A-Za-z0-9._~%+\-:]*@)`,
67
+ flags: "gi",
68
+ },
69
+ {
70
+ name: "ENV_SECRET",
71
+ whole: false,
72
+ // Mirrors SemanticScrubber's env-style catch-all. Named group `secret` is
73
+ // the value only, so findings point at the secret (never the name) and
74
+ // masking redacts only the value while keeping `VAR_NAME=` readable.
75
+ source: String.raw `[A-Z0-9_]*(?:SECRET|TOKEN|PASSWORD|PASSWD|PRIVATE_?KEY|API_?KEY|CREDENTIALS?|SALT|WEBHOOK|ACCESS_?KEY|CLIENT_?SECRET)[A-Z0-9_]*\s*[:=]\s*(?<secret>['"]?[^\s'"#]{4,}['"]?)`,
76
+ flags: "gm",
77
+ },
78
+ {
79
+ name: "EMAIL",
80
+ whole: true,
81
+ source: String.raw `[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+`,
82
+ flags: "g",
83
+ },
84
+ ];
85
+ /** Mask a raw string by replacing each accepted span with a [TYPE_n] token. */
86
+ function maskSpans(input, spans) {
87
+ let masked = input;
88
+ for (let i = spans.length - 1; i >= 0; i--) {
89
+ const s = spans[i];
90
+ const n = spans.slice(0, i + 1).filter((x) => x.type === s.type).length;
91
+ masked =
92
+ masked.slice(0, s.start) + `[${s.type}_${n}]` + masked.slice(s.end);
93
+ }
94
+ return masked;
95
+ }
96
+ /**
97
+ * Scan the input for all non-overlapping secret spans, left to right.
98
+ * Offsets/lengths are relative to `input`.
99
+ */
100
+ function scanSecrets(input) {
101
+ const hits = [];
102
+ for (const p of PATTERNS) {
103
+ const re = new RegExp(p.source, p.flags);
104
+ let m;
105
+ while ((m = re.exec(input)) !== null) {
106
+ const full = m[0];
107
+ let start = m.index;
108
+ let end = m.index + full.length;
109
+ if (!p.whole &&
110
+ m.groups &&
111
+ typeof m.groups.secret === "string" &&
112
+ m.groups.secret.length > 0) {
113
+ start = m.index + full.indexOf(m.groups.secret);
114
+ end = start + m.groups.secret.length;
115
+ }
116
+ hits.push({ type: p.name, start, end });
117
+ if (full.length === 0)
118
+ re.lastIndex++; // guard against zero-length loops
119
+ if (start >= input.length)
120
+ break;
121
+ }
122
+ }
123
+ hits.sort((a, b) => a.start - b.start || b.end - a.end);
124
+ const merged = [];
125
+ for (const h of hits) {
126
+ const last = merged[merged.length - 1];
127
+ if (last && h.start < last.end)
128
+ continue; // overlapping earlier span wins
129
+ merged.push(h);
130
+ }
131
+ return merged;
132
+ }
133
+ export class StatelessScrubber {
134
+ constructor() {
135
+ this.lane = "F";
136
+ }
137
+ /** Scrub a raw text string. Offsets in findings are relative to `text`. */
138
+ scrubText(text, mode = "mask") {
139
+ const spans = scanSecrets(text);
140
+ const findings = spans.map((s) => ({
141
+ type: s.type,
142
+ offset: s.start,
143
+ length: s.end - s.start,
144
+ }));
145
+ if (spans.length === 0 || mode === "detect") {
146
+ return { text, findings };
147
+ }
148
+ return { text: maskSpans(text, spans), findings };
149
+ }
150
+ /**
151
+ * Scrub a serialized agent tool-call JSON string. The JSON structure is
152
+ * preserved (always valid JSON on output). Each string leaf's text content is
153
+ * scrubbed in-place; findings offsets are relative to the ORIGINAL `raw`
154
+ * string the client sent. In detect mode the original string is returned
155
+ * byte-for-byte untouched (findings only).
156
+ */
157
+ scrubToolCallJson(raw, mode = "mask") {
158
+ const spans = scanSecrets(raw);
159
+ const findings = spans.map((s) => ({
160
+ type: s.type,
161
+ offset: s.start,
162
+ length: s.end - s.start,
163
+ }));
164
+ if (mode === "detect") {
165
+ return { toolCallJson: raw, findings };
166
+ }
167
+ // Re-serialize with every string leaf's text masked, so the JSON stays valid.
168
+ let parsed;
169
+ try {
170
+ parsed = JSON.parse(raw);
171
+ }
172
+ catch {
173
+ throw new TypeError("toolCallJson must be valid JSON");
174
+ }
175
+ const walk = (node) => {
176
+ if (typeof node === "string") {
177
+ return this.scrubText(node, "mask").text;
178
+ }
179
+ if (Array.isArray(node))
180
+ return node.map(walk);
181
+ if (node !== null && typeof node === "object") {
182
+ const out = {};
183
+ for (const k of Object.keys(node)) {
184
+ out[k] = walk(node[k]);
185
+ }
186
+ return out;
187
+ }
188
+ return node;
189
+ };
190
+ const masked = JSON.stringify(walk(parsed));
191
+ return { toolCallJson: masked, findings };
192
+ }
193
+ /** Backwards-compatible alias: scrubText. */
194
+ scrub(text, mode = "mask") {
195
+ return this.scrubText(text, mode);
196
+ }
197
+ }
198
+ export default StatelessScrubber;
199
+ //# sourceMappingURL=StatelessScrubber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatelessScrubber.js","sourceRoot":"","sources":["../../../../src/cloud/scrub/StatelessScrubber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Lemma API v2 — stateless scrub (Lane F)
3
+ */
4
+ export * from "./StatelessScrubber";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cloud/scrub/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Lemma API v2 — stateless scrub (Lane F)
3
+ */
4
+ export * from "./StatelessScrubber";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cloud/scrub/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,qBAAqB,CAAC"}
@@ -8,9 +8,9 @@
8
8
  * Start: node dist/cloud/server.js
9
9
  * Or: npm run cloud:start
10
10
  */
11
- import { KeyManager } from './KeyManager.js';
12
- import { TenantCache } from './TenantCache.js';
13
- import { PostgresQuotaLimiter } from './PostgresQuotaLimiter.js';
11
+ import { KeyManager } from './KeyManager';
12
+ import { TenantCache } from './TenantCache';
13
+ import { PostgresQuotaLimiter } from './PostgresQuotaLimiter';
14
14
  declare const app: import("express-serve-static-core").Express;
15
15
  declare const keyManager: KeyManager;
16
16
  declare const tenantCaches: Map<string, TenantCache>;
@@ -10,12 +10,12 @@
10
10
  */
11
11
  import express from 'express';
12
12
  import crypto from 'crypto';
13
- import { KeyManager } from './KeyManager.js';
14
- import { TenantCache } from './TenantCache.js';
15
- import { PLAN_LIMITS } from './types.js';
16
- import { BurstRateLimiter } from './BurstRateLimiter.js';
13
+ import { KeyManager } from './KeyManager';
14
+ import { TenantCache } from './TenantCache';
15
+ import { PLAN_LIMITS } from './types';
16
+ import { BurstRateLimiter } from './BurstRateLimiter';
17
17
  import { Pool } from 'pg';
18
- import { PostgresQuotaLimiter } from './PostgresQuotaLimiter.js';
18
+ import { PostgresQuotaLimiter } from './PostgresQuotaLimiter';
19
19
  const app = express();
20
20
  // ─── Bind config ─────────────────────────────────────────────────────────────
21
21
  const BIND_HOST = process.env.LEMMA_BIND_HOST || '127.0.0.1';
@@ -0,0 +1,26 @@
1
+ import { BrainStore, Candidate } from '../../contracts/store';
2
+ export interface FileBrainStoreOptions {
3
+ dir?: string;
4
+ filename?: string;
5
+ }
6
+ export declare class FileBrainStore implements BrainStore {
7
+ private options;
8
+ readonly lane = "B";
9
+ private readonly file;
10
+ private cache;
11
+ constructor(options?: FileBrainStoreOptions);
12
+ private load;
13
+ /** Reescribe el archivo entero, fusionando lo que quedó en disco con lo nuevo
14
+ * (mismo merge-before-write que usa el Brain para no clobberear un peer).
15
+ * `terms` se omite al serializar (igual que el Brain) pero se conserva en el
16
+ * registro en memoria para que la búsqueda funcione sin re-leer el archivo. */
17
+ private save;
18
+ private inTenant;
19
+ put(tenantId: string, memory: unknown): Promise<string>;
20
+ get(tenantId: string, id: string): Promise<unknown | null>;
21
+ searchCandidates(tenantId: string, query: string, limit: number): Promise<Candidate[]>;
22
+ listByIds(tenantId: string, ids: string[]): Promise<Map<string, unknown>>;
23
+ delete(tenantId: string, id: string): Promise<boolean>;
24
+ }
25
+ export default FileBrainStore;
26
+ //# sourceMappingURL=FileBrainStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileBrainStore.d.ts","sourceRoot":"","sources":["../../../../src/cloud/store/FileBrainStore.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAW9D,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,qBAAa,cAAe,YAAW,UAAU;IAMnC,OAAO,CAAC,OAAO;IAL3B,QAAQ,CAAC,IAAI,OAAO;IAEpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAoG;gBAE7F,OAAO,GAAE,qBAA0B;IAKvD,OAAO,CAAC,IAAI;IAoBZ;;;mFAG+E;IAC/E,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,QAAQ;IAIV,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCvD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAS1D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmDtF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAczE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAU7D;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * FileBrainStore — adaptador del contrato BrainStore sobre el NDJSON local del
3
+ * Brain (entries.ndjson). Mantiene funcionando el modo local / MCP a través del
4
+ * mismo contrato que usa PostgresBrainStore en la nube.
5
+ *
6
+ * Formato de disco: una línea JSON por memoria (el mismo `entries.ndjson` que
7
+ * TheBrainV2 ya escribe y lee). Igual que el Brain, `terms` NO se persiste —
8
+ * load() lo reconstruye desde el termFreq — y cada línea puede llevar un campo
9
+ * extra `tenant_id` que el Brain ignora al leer, así que un archivo escrito por
10
+ * este store sigue siendo legible por TheBrainV2 y viceversa.
11
+ *
12
+ * Aislamiento por tenant: una línea sin `tenant_id` pertenece al tenant
13
+ * `default` (escritas antes de que exista la tenancy). Eso es fail-closed — el
14
+ * tenant `default` es el único que puede leerlas; un tenant B con otro id jamás
15
+ * ve una línea que no lleva su tenant_id.
16
+ */
17
+ import fs from 'fs';
18
+ import os from 'os';
19
+ import path from 'path';
20
+ import crypto from 'crypto';
21
+ import { tokenize, termFrequencies, bm25Score, jaccardSimilarity, } from '../../subconscious/TheBrainV2';
22
+ const DEFAULT_TENANT = 'default';
23
+ function isRecord(v) {
24
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
25
+ }
26
+ function generateId(query) {
27
+ const queryKey = query.trim().toLowerCase().substring(0, 200);
28
+ return crypto
29
+ .createHash('sha1')
30
+ .update(queryKey + Date.now() + crypto.randomBytes(8).toString('hex'))
31
+ .digest('hex')
32
+ .substring(0, 12);
33
+ }
34
+ /** Lee el NDJSON tal cual lo lee TheBrainV2 (readEntriesFile), reconstruyendo
35
+ * `terms` desde termFreq para las líneas que no lo persistieron. */
36
+ function parseNdjson(raw) {
37
+ const out = [];
38
+ for (const line of raw.split('\n')) {
39
+ if (!line)
40
+ continue;
41
+ try {
42
+ const rec = JSON.parse(line);
43
+ if (!rec || typeof rec.id !== 'string')
44
+ continue;
45
+ if (!Array.isArray(rec.terms))
46
+ rec.terms = Object.keys(rec.termFreq || {});
47
+ out.push(rec);
48
+ }
49
+ catch {
50
+ // Líneas corruptas: se conservan byte a byte al reescribir (no se pierde nada).
51
+ out.push({ __raw__: line });
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ export class FileBrainStore {
57
+ constructor(options = {}) {
58
+ this.options = options;
59
+ this.lane = 'B';
60
+ this.cache = null;
61
+ const dir = options.dir || process.env.LEMMA_BRAIN_DIR || path.join(os.homedir(), '.lemma-cache', 'brain');
62
+ this.file = path.join(dir, options.filename || 'entries.ndjson');
63
+ }
64
+ load() {
65
+ let stat;
66
+ try {
67
+ stat = fs.statSync(this.file);
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ if (this.cache &&
73
+ this.cache.mtimeMs === stat.mtimeMs &&
74
+ this.cache.size === stat.size) {
75
+ return this.cache.records;
76
+ }
77
+ const raw = fs.readFileSync(this.file, 'utf8');
78
+ const records = parseNdjson(raw);
79
+ this.cache = { mtimeMs: stat.mtimeMs, size: stat.size, records };
80
+ return records;
81
+ }
82
+ /** Reescribe el archivo entero, fusionando lo que quedó en disco con lo nuevo
83
+ * (mismo merge-before-write que usa el Brain para no clobberear un peer).
84
+ * `terms` se omite al serializar (igual que el Brain) pero se conserva en el
85
+ * registro en memoria para que la búsqueda funcione sin re-leer el archivo. */
86
+ save(records) {
87
+ fs.mkdirSync(path.dirname(this.file), { recursive: true });
88
+ const tmp = `${this.file}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;
89
+ const lines = records.map((r) => {
90
+ if ('__raw__' in r && r.__raw__ !== undefined)
91
+ return r.__raw__;
92
+ const { terms: _persistedOnDiskOnly, ...rest } = r;
93
+ return JSON.stringify(rest);
94
+ }).filter((l) => l.length > 0);
95
+ fs.writeFileSync(tmp, lines.join('\n') + '\n', 'utf8');
96
+ fs.renameSync(tmp, this.file);
97
+ const stat = fs.statSync(this.file);
98
+ this.cache = { mtimeMs: stat.mtimeMs, size: stat.size, records };
99
+ }
100
+ inTenant(r, tenantId) {
101
+ return (r.tenant_id ?? DEFAULT_TENANT) === tenantId;
102
+ }
103
+ async put(tenantId, memory) {
104
+ const m = isRecord(memory) ? memory : {};
105
+ const query = typeof m.query === 'string' ? m.query : '';
106
+ const response = typeof m.response === 'string' ? m.response : '';
107
+ const id = typeof m.id === 'string' && m.id.length > 0 ? m.id : generateId(query || response);
108
+ const terms = Array.isArray(m.terms) && m.terms.length > 0
109
+ ? [...new Set(m.terms.filter((t) => typeof t === 'string'))]
110
+ : tokenize([query, response].join(' '));
111
+ const termFreq = isRecord(m.termFreq) ? m.termFreq : termFrequencies(terms);
112
+ // El Brain no persiste `terms` pero sí termFreq; save() lo omite al serializar
113
+ // y el registro en memoria lo conserva para la búsqueda. `hits`, `demerits` y
114
+ // las demás señales que el Brain espera en la búsqueda (Math.log2(hits+1), etc.)
115
+ // se fijan a sus defaults si la memoria no las trae, para que un archivo escrito
116
+ // por este store sea leído e indexado sin NaN por TheBrainV2.
117
+ const line = {
118
+ ...(isRecord(memory) ? memory : {}),
119
+ id,
120
+ query,
121
+ response,
122
+ terms,
123
+ termFreq,
124
+ hits: typeof (isRecord(memory) ? memory : {}).hits === 'number' ? memory.hits : 0,
125
+ demerits: typeof (isRecord(memory) ? memory : {}).demerits === 'number' ? memory.demerits : 0,
126
+ tenant_id: tenantId,
127
+ };
128
+ const records = this.load();
129
+ const idx = records.findIndex((r) => !('__raw__' in r) && r.id === id && this.inTenant(r, tenantId));
130
+ if (idx >= 0)
131
+ records[idx] = line;
132
+ else
133
+ records.push(line);
134
+ this.save(records);
135
+ return id;
136
+ }
137
+ async get(tenantId, id) {
138
+ const rec = this.load().find((r) => !('__raw__' in r) && r.id === id && this.inTenant(r, tenantId));
139
+ if (!rec)
140
+ return null;
141
+ const { tenant_id: _t, ...memory } = rec;
142
+ return memory;
143
+ }
144
+ async searchCandidates(tenantId, query, limit) {
145
+ const queryTerms = tokenize(query);
146
+ if (queryTerms.length === 0)
147
+ return [];
148
+ const docs = this.load()
149
+ .filter((r) => !('__raw__' in r) && this.inTenant(r, tenantId))
150
+ .filter((r) => Array.isArray(r.terms));
151
+ if (docs.length === 0)
152
+ return [];
153
+ const N = docs.length;
154
+ const idf = {};
155
+ for (const term of queryTerms) {
156
+ const df = docs.filter((d) => d.terms.includes(term)).length;
157
+ idf[term] = df > 0 ? Math.log((N - df + 0.5) / (df + 0.5) + 1) : 0;
158
+ }
159
+ const queryTermSet = new Set(queryTerms);
160
+ const avgDocLength = docs.reduce((acc, d) => acc + d.terms.length, 0) / Math.max(N, 1);
161
+ const scored = [];
162
+ for (const doc of docs) {
163
+ const terms = doc.terms;
164
+ if (!terms.some((t) => queryTermSet.has(t)))
165
+ continue;
166
+ const bm25 = bm25Score(queryTerms, (doc.termFreq || termFrequencies(terms)), terms.length, avgDocLength || 10, idf);
167
+ const jaccard = jaccardSimilarity(queryTermSet, new Set(terms));
168
+ scored.push({ id: doc.id, bm25, jaccard, hits: doc.hits, outcome: doc.outcome, demerits: doc.demerits });
169
+ }
170
+ if (scored.length === 0)
171
+ return [];
172
+ const maxBm25 = Math.max(...scored.map((s) => s.bm25), 1);
173
+ const ranked = scored
174
+ .map((s) => {
175
+ let similarity = (s.bm25 / maxBm25) * 0.7 + s.jaccard * 0.3;
176
+ similarity += Math.min(Math.log2((s.hits || 0) + 1) * 0.02, 0.08);
177
+ if (s.outcome === 'failed')
178
+ similarity -= 0.15;
179
+ if (s.demerits)
180
+ similarity -= Math.min(s.demerits * 0.06, 0.25);
181
+ return { id: s.id, score: Math.max(similarity, 0) };
182
+ })
183
+ .sort((a, b) => b.score - a.score)
184
+ .slice(0, Math.max(1, limit));
185
+ return ranked;
186
+ }
187
+ async listByIds(tenantId, ids) {
188
+ const want = new Set(ids);
189
+ const out = new Map();
190
+ for (const r of this.load()) {
191
+ if ('__raw__' in r)
192
+ continue;
193
+ const rec = r;
194
+ if (rec.id && want.has(rec.id) && this.inTenant(rec, tenantId)) {
195
+ const { tenant_id: _t, ...memory } = rec;
196
+ out.set(rec.id, memory);
197
+ }
198
+ }
199
+ return out;
200
+ }
201
+ async delete(tenantId, id) {
202
+ const records = this.load();
203
+ const before = records.length;
204
+ const kept = records.filter((r) => '__raw__' in r || !(r.id === id && this.inTenant(r, tenantId)));
205
+ if (kept.length === before)
206
+ return false;
207
+ this.save(kept);
208
+ return true;
209
+ }
210
+ }
211
+ export default FileBrainStore;
212
+ //# sourceMappingURL=FileBrainStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileBrainStore.js","sourceRoot":"","sources":["../../../../src/cloud/store/FileBrainStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PostgresBrainStore — implementación multi-tenant del contrato BrainStore
3
+ * (src/contracts/store.ts) sobre PostgreSQL.
4
+ *
5
+ * Tablas (ver db/migrations/001_memories.sql): `memories`, `claims`,
6
+ * `evidence_hashes`, `memory_edges` (derivedFrom).
7
+ *
8
+ * SECURITY — regla de oro del lane: TODA consulta sobre tablas protegidas lleva
9
+ * `tenant_id` en el WHERE. Ninguna fila de un tenant puede ser leída, verificada
10
+ * ni borrada sin que el tenant llamante forme parte del filtro. El static-grep
11
+ * test (tests/unit/lane-b-static-grep.test.ts) revienta si aparece un SELECT
12
+ * sobre estas tablas sin filtro de tenant.
13
+ *
14
+ * Búsqueda: BM25 (Okapi, K1=1.5, B=0.75 — los mismos constantes que TheBrainV2)
15
+ * + re-rank de Jaccard, calculados en SQL sobre el conjunto candidato que arroja
16
+ * el índice GIN de `terms` (memories.terms && <query terms>), nunca sobre el
17
+ * corpus entero.
18
+ */
19
+ import { Pool } from 'pg';
20
+ import { BrainStore, Candidate } from '../../contracts/store';
21
+ export type EvidenceKind = 'file' | 'symbol' | 'symbol_normalized';
22
+ export interface NormalizedMemory {
23
+ id: string;
24
+ query: string;
25
+ response: string;
26
+ projectId: string | null;
27
+ terms: string[];
28
+ termFreq: Record<string, number>;
29
+ payload: unknown;
30
+ }
31
+ /** Normaliza una memoria arbitraria a la forma persistible, enriqueciéndola con
32
+ * termes/termFreq si no venía de un Brain que ya las computara. */
33
+ export declare function normalizeMemory(memory: unknown): NormalizedMemory;
34
+ export interface PostgresBrainStoreOptions {
35
+ /** Máx. candidatos que la búsqueda considera antes de rankear (cota de seguridad). */
36
+ maxCandidates?: number;
37
+ }
38
+ export declare class PostgresBrainStore implements BrainStore {
39
+ private pool;
40
+ private opts;
41
+ readonly lane = "B";
42
+ constructor(pool: Pool, opts?: PostgresBrainStoreOptions);
43
+ put(tenantId: string, memory: unknown): Promise<string>;
44
+ get(tenantId: string, id: string): Promise<unknown | null>;
45
+ searchCandidates(tenantId: string, query: string, limit: number): Promise<Candidate[]>;
46
+ listByIds(tenantId: string, ids: string[]): Promise<Map<string, unknown>>;
47
+ delete(tenantId: string, id: string): Promise<boolean>;
48
+ }
49
+ export default PostgresBrainStore;
50
+ //# sourceMappingURL=PostgresBrainStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresBrainStore.d.ts","sourceRoot":"","sources":["../../../../src/cloud/store/PostgresBrainStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB;AAwCD;mEACmE;AACnE,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAwBjE;AAED,MAAM,WAAW,yBAAyB;IACxC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAsCD,qBAAa,kBAAmB,YAAW,UAAU;IAGvC,OAAO,CAAC,IAAI;IAAQ,OAAO,CAAC,IAAI;IAF5C,QAAQ,CAAC,IAAI,OAAO;gBAEA,IAAI,EAAE,IAAI,EAAU,IAAI,GAAE,yBAA8B;IAEtE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDvD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAM1D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQtF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQzE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiB7D;AAED,eAAe,kBAAkB,CAAC"}