@raviolelabs/engram-mcp 0.2.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 (662) hide show
  1. package/CLAUDE.md +232 -0
  2. package/LICENSE +21 -0
  3. package/README.md +222 -0
  4. package/SKILL.md +299 -0
  5. package/dist/cloud/auth.d.ts +29 -0
  6. package/dist/cloud/auth.d.ts.map +1 -0
  7. package/dist/cloud/auth.js +132 -0
  8. package/dist/cloud/auth.js.map +1 -0
  9. package/dist/cloud/bridge-client.d.ts +10 -0
  10. package/dist/cloud/bridge-client.d.ts.map +1 -0
  11. package/dist/cloud/bridge-client.js +167 -0
  12. package/dist/cloud/bridge-client.js.map +1 -0
  13. package/dist/cloud/crypto.d.ts +42 -0
  14. package/dist/cloud/crypto.d.ts.map +1 -0
  15. package/dist/cloud/crypto.js +146 -0
  16. package/dist/cloud/crypto.js.map +1 -0
  17. package/dist/cloud/endpoints.d.ts +26 -0
  18. package/dist/cloud/endpoints.d.ts.map +1 -0
  19. package/dist/cloud/endpoints.js +26 -0
  20. package/dist/cloud/endpoints.js.map +1 -0
  21. package/dist/cloud/pairing.d.ts +30 -0
  22. package/dist/cloud/pairing.d.ts.map +1 -0
  23. package/dist/cloud/pairing.js +157 -0
  24. package/dist/cloud/pairing.js.map +1 -0
  25. package/dist/cloud/transit-poller.d.ts +35 -0
  26. package/dist/cloud/transit-poller.d.ts.map +1 -0
  27. package/dist/cloud/transit-poller.js +281 -0
  28. package/dist/cloud/transit-poller.js.map +1 -0
  29. package/dist/config/index.d.ts +3 -0
  30. package/dist/config/index.d.ts.map +1 -0
  31. package/dist/config/index.js +24 -0
  32. package/dist/config/index.js.map +1 -0
  33. package/dist/config/schema.d.ts +466 -0
  34. package/dist/config/schema.d.ts.map +1 -0
  35. package/dist/config/schema.js +171 -0
  36. package/dist/config/schema.js.map +1 -0
  37. package/dist/core/db/index.d.ts +7 -0
  38. package/dist/core/db/index.d.ts.map +1 -0
  39. package/dist/core/db/index.js +273 -0
  40. package/dist/core/db/index.js.map +1 -0
  41. package/dist/core/logger.d.ts +19 -0
  42. package/dist/core/logger.d.ts.map +1 -0
  43. package/dist/core/logger.js +223 -0
  44. package/dist/core/logger.js.map +1 -0
  45. package/dist/core/server/http.d.ts +15 -0
  46. package/dist/core/server/http.d.ts.map +1 -0
  47. package/dist/core/server/http.js +76 -0
  48. package/dist/core/server/http.js.map +1 -0
  49. package/dist/core/server/instructions.d.ts +2 -0
  50. package/dist/core/server/instructions.d.ts.map +1 -0
  51. package/dist/core/server/instructions.js +36 -0
  52. package/dist/core/server/instructions.js.map +1 -0
  53. package/dist/core/server/mcp-handler.d.ts +39 -0
  54. package/dist/core/server/mcp-handler.d.ts.map +1 -0
  55. package/dist/core/server/mcp-handler.js +204 -0
  56. package/dist/core/server/mcp-handler.js.map +1 -0
  57. package/dist/core/server/mcp-http.d.ts +4 -0
  58. package/dist/core/server/mcp-http.d.ts.map +1 -0
  59. package/dist/core/server/mcp-http.js +56 -0
  60. package/dist/core/server/mcp-http.js.map +1 -0
  61. package/dist/core/server/tool-router.d.ts +9 -0
  62. package/dist/core/server/tool-router.d.ts.map +1 -0
  63. package/dist/core/server/tool-router.js +25 -0
  64. package/dist/core/server/tool-router.js.map +1 -0
  65. package/dist/core/server/websocket.d.ts +4 -0
  66. package/dist/core/server/websocket.d.ts.map +1 -0
  67. package/dist/core/server/websocket.js +25 -0
  68. package/dist/core/server/websocket.js.map +1 -0
  69. package/dist/db/index.d.ts +2 -0
  70. package/dist/db/index.d.ts.map +1 -0
  71. package/dist/db/index.js +3 -0
  72. package/dist/db/index.js.map +1 -0
  73. package/dist/embeddings/index.d.ts +24 -0
  74. package/dist/embeddings/index.d.ts.map +1 -0
  75. package/dist/embeddings/index.js +86 -0
  76. package/dist/embeddings/index.js.map +1 -0
  77. package/dist/embeddings/providers/engram.d.ts +7 -0
  78. package/dist/embeddings/providers/engram.d.ts.map +1 -0
  79. package/dist/embeddings/providers/engram.js +67 -0
  80. package/dist/embeddings/providers/engram.js.map +1 -0
  81. package/dist/embeddings/providers/ollama.d.ts +3 -0
  82. package/dist/embeddings/providers/ollama.d.ts.map +1 -0
  83. package/dist/embeddings/providers/ollama.js +9 -0
  84. package/dist/embeddings/providers/ollama.js.map +1 -0
  85. package/dist/embeddings/providers/openai-compat.d.ts +7 -0
  86. package/dist/embeddings/providers/openai-compat.d.ts.map +1 -0
  87. package/dist/embeddings/providers/openai-compat.js +27 -0
  88. package/dist/embeddings/providers/openai-compat.js.map +1 -0
  89. package/dist/embeddings/providers/openai.d.ts +3 -0
  90. package/dist/embeddings/providers/openai.d.ts.map +1 -0
  91. package/dist/embeddings/providers/openai.js +12 -0
  92. package/dist/embeddings/providers/openai.js.map +1 -0
  93. package/dist/embeddings/providers/voyage.d.ts +3 -0
  94. package/dist/embeddings/providers/voyage.d.ts.map +1 -0
  95. package/dist/embeddings/providers/voyage.js +12 -0
  96. package/dist/embeddings/providers/voyage.js.map +1 -0
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +3 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/ingest/jobs.d.ts +29 -0
  102. package/dist/ingest/jobs.d.ts.map +1 -0
  103. package/dist/ingest/jobs.js +131 -0
  104. package/dist/ingest/jobs.js.map +1 -0
  105. package/dist/logger.d.ts +2 -0
  106. package/dist/logger.d.ts.map +1 -0
  107. package/dist/logger.js +3 -0
  108. package/dist/logger.js.map +1 -0
  109. package/dist/mcp-server/server.d.ts +2 -0
  110. package/dist/mcp-server/server.d.ts.map +1 -0
  111. package/dist/mcp-server/server.js +3 -0
  112. package/dist/mcp-server/server.js.map +1 -0
  113. package/dist/mcp-server/tests/mcp-e2e.test.d.ts +2 -0
  114. package/dist/mcp-server/tests/mcp-e2e.test.d.ts.map +1 -0
  115. package/dist/mcp-server/tests/mcp-e2e.test.js +157 -0
  116. package/dist/mcp-server/tests/mcp-e2e.test.js.map +1 -0
  117. package/dist/mcp-server/tool-router.d.ts +2 -0
  118. package/dist/mcp-server/tool-router.d.ts.map +1 -0
  119. package/dist/mcp-server/tool-router.js +3 -0
  120. package/dist/mcp-server/tool-router.js.map +1 -0
  121. package/dist/memory/admin/tools.d.ts +6 -0
  122. package/dist/memory/admin/tools.d.ts.map +1 -0
  123. package/dist/memory/admin/tools.js +134 -0
  124. package/dist/memory/admin/tools.js.map +1 -0
  125. package/dist/memory/core/chunker.d.ts +6 -0
  126. package/dist/memory/core/chunker.d.ts.map +1 -0
  127. package/dist/memory/core/chunker.js +49 -0
  128. package/dist/memory/core/chunker.js.map +1 -0
  129. package/dist/memory/core/module-interface.d.ts +23 -0
  130. package/dist/memory/core/module-interface.d.ts.map +1 -0
  131. package/dist/memory/core/module-interface.js +2 -0
  132. package/dist/memory/core/module-interface.js.map +1 -0
  133. package/dist/memory/core/module-registry.d.ts +14 -0
  134. package/dist/memory/core/module-registry.d.ts.map +1 -0
  135. package/dist/memory/core/module-registry.js +45 -0
  136. package/dist/memory/core/module-registry.js.map +1 -0
  137. package/dist/memory/core/property-extractor.d.ts +6 -0
  138. package/dist/memory/core/property-extractor.d.ts.map +1 -0
  139. package/dist/memory/core/property-extractor.js +90 -0
  140. package/dist/memory/core/property-extractor.js.map +1 -0
  141. package/dist/memory/core/reindex.d.ts +11 -0
  142. package/dist/memory/core/reindex.d.ts.map +1 -0
  143. package/dist/memory/core/reindex.js +55 -0
  144. package/dist/memory/core/reindex.js.map +1 -0
  145. package/dist/memory/core/source-registry.d.ts +42 -0
  146. package/dist/memory/core/source-registry.d.ts.map +1 -0
  147. package/dist/memory/core/source-registry.js +86 -0
  148. package/dist/memory/core/source-registry.js.map +1 -0
  149. package/dist/memory/core/store.d.ts +40 -0
  150. package/dist/memory/core/store.d.ts.map +1 -0
  151. package/dist/memory/core/store.js +257 -0
  152. package/dist/memory/core/store.js.map +1 -0
  153. package/dist/memory/core/wikilinks.d.ts +13 -0
  154. package/dist/memory/core/wikilinks.d.ts.map +1 -0
  155. package/dist/memory/core/wikilinks.js +25 -0
  156. package/dist/memory/core/wikilinks.js.map +1 -0
  157. package/dist/memory/modules/_custom/generic-module.d.ts +7 -0
  158. package/dist/memory/modules/_custom/generic-module.d.ts.map +1 -0
  159. package/dist/memory/modules/_custom/generic-module.js +108 -0
  160. package/dist/memory/modules/_custom/generic-module.js.map +1 -0
  161. package/dist/memory/modules/_custom/persistence.d.ts +15 -0
  162. package/dist/memory/modules/_custom/persistence.d.ts.map +1 -0
  163. package/dist/memory/modules/_custom/persistence.js +47 -0
  164. package/dist/memory/modules/_custom/persistence.js.map +1 -0
  165. package/dist/memory/modules/_custom/tests/custom-types.test.d.ts +2 -0
  166. package/dist/memory/modules/_custom/tests/custom-types.test.d.ts.map +1 -0
  167. package/dist/memory/modules/_custom/tests/custom-types.test.js +89 -0
  168. package/dist/memory/modules/_custom/tests/custom-types.test.js.map +1 -0
  169. package/dist/memory/modules/_custom/tools.d.ts +7 -0
  170. package/dist/memory/modules/_custom/tools.d.ts.map +1 -0
  171. package/dist/memory/modules/_custom/tools.js +72 -0
  172. package/dist/memory/modules/_custom/tools.js.map +1 -0
  173. package/dist/memory/modules/audio/ingest.d.ts +9 -0
  174. package/dist/memory/modules/audio/ingest.d.ts.map +1 -0
  175. package/dist/memory/modules/audio/ingest.js +32 -0
  176. package/dist/memory/modules/audio/ingest.js.map +1 -0
  177. package/dist/memory/modules/audio/module.d.ts +6 -0
  178. package/dist/memory/modules/audio/module.d.ts.map +1 -0
  179. package/dist/memory/modules/audio/module.js +18 -0
  180. package/dist/memory/modules/audio/module.js.map +1 -0
  181. package/dist/memory/modules/audio/tests/audio.test.d.ts +2 -0
  182. package/dist/memory/modules/audio/tests/audio.test.d.ts.map +1 -0
  183. package/dist/memory/modules/audio/tests/audio.test.js +57 -0
  184. package/dist/memory/modules/audio/tests/audio.test.js.map +1 -0
  185. package/dist/memory/modules/audio/tests/transcriber.test.d.ts +2 -0
  186. package/dist/memory/modules/audio/tests/transcriber.test.d.ts.map +1 -0
  187. package/dist/memory/modules/audio/tests/transcriber.test.js +27 -0
  188. package/dist/memory/modules/audio/tests/transcriber.test.js.map +1 -0
  189. package/dist/memory/modules/audio/tools.d.ts +5 -0
  190. package/dist/memory/modules/audio/tools.d.ts.map +1 -0
  191. package/dist/memory/modules/audio/tools.js +60 -0
  192. package/dist/memory/modules/audio/tools.js.map +1 -0
  193. package/dist/memory/modules/audio/transcriber.d.ts +15 -0
  194. package/dist/memory/modules/audio/transcriber.d.ts.map +1 -0
  195. package/dist/memory/modules/audio/transcriber.js +177 -0
  196. package/dist/memory/modules/audio/transcriber.js.map +1 -0
  197. package/dist/memory/modules/conversations/ingest.d.ts +10 -0
  198. package/dist/memory/modules/conversations/ingest.d.ts.map +1 -0
  199. package/dist/memory/modules/conversations/ingest.js +38 -0
  200. package/dist/memory/modules/conversations/ingest.js.map +1 -0
  201. package/dist/memory/modules/conversations/module.d.ts +6 -0
  202. package/dist/memory/modules/conversations/module.d.ts.map +1 -0
  203. package/dist/memory/modules/conversations/module.js +43 -0
  204. package/dist/memory/modules/conversations/module.js.map +1 -0
  205. package/dist/memory/modules/conversations/tests/conversations.test.d.ts +2 -0
  206. package/dist/memory/modules/conversations/tests/conversations.test.d.ts.map +1 -0
  207. package/dist/memory/modules/conversations/tests/conversations.test.js +70 -0
  208. package/dist/memory/modules/conversations/tests/conversations.test.js.map +1 -0
  209. package/dist/memory/modules/conversations/tools.d.ts +5 -0
  210. package/dist/memory/modules/conversations/tools.d.ts.map +1 -0
  211. package/dist/memory/modules/conversations/tools.js +75 -0
  212. package/dist/memory/modules/conversations/tools.js.map +1 -0
  213. package/dist/memory/modules/drive/connector.d.ts +19 -0
  214. package/dist/memory/modules/drive/connector.d.ts.map +1 -0
  215. package/dist/memory/modules/drive/connector.js +52 -0
  216. package/dist/memory/modules/drive/connector.js.map +1 -0
  217. package/dist/memory/modules/drive/ingest.d.ts +9 -0
  218. package/dist/memory/modules/drive/ingest.d.ts.map +1 -0
  219. package/dist/memory/modules/drive/ingest.js +27 -0
  220. package/dist/memory/modules/drive/ingest.js.map +1 -0
  221. package/dist/memory/modules/drive/module.d.ts +6 -0
  222. package/dist/memory/modules/drive/module.d.ts.map +1 -0
  223. package/dist/memory/modules/drive/module.js +31 -0
  224. package/dist/memory/modules/drive/module.js.map +1 -0
  225. package/dist/memory/modules/drive/oauth.d.ts +14 -0
  226. package/dist/memory/modules/drive/oauth.d.ts.map +1 -0
  227. package/dist/memory/modules/drive/oauth.js +130 -0
  228. package/dist/memory/modules/drive/oauth.js.map +1 -0
  229. package/dist/memory/modules/drive/tests/drive.test.d.ts +2 -0
  230. package/dist/memory/modules/drive/tests/drive.test.d.ts.map +1 -0
  231. package/dist/memory/modules/drive/tests/drive.test.js +66 -0
  232. package/dist/memory/modules/drive/tests/drive.test.js.map +1 -0
  233. package/dist/memory/modules/drive/tools.d.ts +5 -0
  234. package/dist/memory/modules/drive/tools.d.ts.map +1 -0
  235. package/dist/memory/modules/drive/tools.js +131 -0
  236. package/dist/memory/modules/drive/tools.js.map +1 -0
  237. package/dist/memory/modules/drive/watcher.d.ts +5 -0
  238. package/dist/memory/modules/drive/watcher.d.ts.map +1 -0
  239. package/dist/memory/modules/drive/watcher.js +46 -0
  240. package/dist/memory/modules/drive/watcher.js.map +1 -0
  241. package/dist/memory/modules/notes/ingest.d.ts +3 -0
  242. package/dist/memory/modules/notes/ingest.d.ts.map +1 -0
  243. package/dist/memory/modules/notes/ingest.js +30 -0
  244. package/dist/memory/modules/notes/ingest.js.map +1 -0
  245. package/dist/memory/modules/notes/module.d.ts +5 -0
  246. package/dist/memory/modules/notes/module.d.ts.map +1 -0
  247. package/dist/memory/modules/notes/module.js +28 -0
  248. package/dist/memory/modules/notes/module.js.map +1 -0
  249. package/dist/memory/modules/notes/tests/notes.test.d.ts +2 -0
  250. package/dist/memory/modules/notes/tests/notes.test.d.ts.map +1 -0
  251. package/dist/memory/modules/notes/tests/notes.test.js +59 -0
  252. package/dist/memory/modules/notes/tests/notes.test.js.map +1 -0
  253. package/dist/memory/modules/notes/tools.d.ts +5 -0
  254. package/dist/memory/modules/notes/tools.d.ts.map +1 -0
  255. package/dist/memory/modules/notes/tools.js +69 -0
  256. package/dist/memory/modules/notes/tools.js.map +1 -0
  257. package/dist/memory/modules/notion/connector.d.ts +10 -0
  258. package/dist/memory/modules/notion/connector.d.ts.map +1 -0
  259. package/dist/memory/modules/notion/connector.js +112 -0
  260. package/dist/memory/modules/notion/connector.js.map +1 -0
  261. package/dist/memory/modules/notion/ingest.d.ts +9 -0
  262. package/dist/memory/modules/notion/ingest.d.ts.map +1 -0
  263. package/dist/memory/modules/notion/ingest.js +24 -0
  264. package/dist/memory/modules/notion/ingest.js.map +1 -0
  265. package/dist/memory/modules/notion/module.d.ts +6 -0
  266. package/dist/memory/modules/notion/module.d.ts.map +1 -0
  267. package/dist/memory/modules/notion/module.js +31 -0
  268. package/dist/memory/modules/notion/module.js.map +1 -0
  269. package/dist/memory/modules/notion/oauth.d.ts +19 -0
  270. package/dist/memory/modules/notion/oauth.d.ts.map +1 -0
  271. package/dist/memory/modules/notion/oauth.js +117 -0
  272. package/dist/memory/modules/notion/oauth.js.map +1 -0
  273. package/dist/memory/modules/notion/tests/notion.test.d.ts +2 -0
  274. package/dist/memory/modules/notion/tests/notion.test.d.ts.map +1 -0
  275. package/dist/memory/modules/notion/tests/notion.test.js +53 -0
  276. package/dist/memory/modules/notion/tests/notion.test.js.map +1 -0
  277. package/dist/memory/modules/notion/tools.d.ts +5 -0
  278. package/dist/memory/modules/notion/tools.d.ts.map +1 -0
  279. package/dist/memory/modules/notion/tools.js +116 -0
  280. package/dist/memory/modules/notion/tools.js.map +1 -0
  281. package/dist/memory/modules/notion/watcher.d.ts +5 -0
  282. package/dist/memory/modules/notion/watcher.d.ts.map +1 -0
  283. package/dist/memory/modules/notion/watcher.js +41 -0
  284. package/dist/memory/modules/notion/watcher.js.map +1 -0
  285. package/dist/memory/modules/obsidian/ingest.d.ts +9 -0
  286. package/dist/memory/modules/obsidian/ingest.d.ts.map +1 -0
  287. package/dist/memory/modules/obsidian/ingest.js +80 -0
  288. package/dist/memory/modules/obsidian/ingest.js.map +1 -0
  289. package/dist/memory/modules/obsidian/module.d.ts +6 -0
  290. package/dist/memory/modules/obsidian/module.d.ts.map +1 -0
  291. package/dist/memory/modules/obsidian/module.js +31 -0
  292. package/dist/memory/modules/obsidian/module.js.map +1 -0
  293. package/dist/memory/modules/obsidian/tests/obsidian.test.d.ts +2 -0
  294. package/dist/memory/modules/obsidian/tests/obsidian.test.d.ts.map +1 -0
  295. package/dist/memory/modules/obsidian/tests/obsidian.test.js +65 -0
  296. package/dist/memory/modules/obsidian/tests/obsidian.test.js.map +1 -0
  297. package/dist/memory/modules/obsidian/tests/vault-reader.test.d.ts +2 -0
  298. package/dist/memory/modules/obsidian/tests/vault-reader.test.d.ts.map +1 -0
  299. package/dist/memory/modules/obsidian/tests/vault-reader.test.js +37 -0
  300. package/dist/memory/modules/obsidian/tests/vault-reader.test.js.map +1 -0
  301. package/dist/memory/modules/obsidian/tools.d.ts +5 -0
  302. package/dist/memory/modules/obsidian/tools.d.ts.map +1 -0
  303. package/dist/memory/modules/obsidian/tools.js +101 -0
  304. package/dist/memory/modules/obsidian/tools.js.map +1 -0
  305. package/dist/memory/modules/obsidian/vault-reader.d.ts +8 -0
  306. package/dist/memory/modules/obsidian/vault-reader.d.ts.map +1 -0
  307. package/dist/memory/modules/obsidian/vault-reader.js +82 -0
  308. package/dist/memory/modules/obsidian/vault-reader.js.map +1 -0
  309. package/dist/memory/modules/obsidian/watcher.d.ts +5 -0
  310. package/dist/memory/modules/obsidian/watcher.d.ts.map +1 -0
  311. package/dist/memory/modules/obsidian/watcher.js +83 -0
  312. package/dist/memory/modules/obsidian/watcher.js.map +1 -0
  313. package/dist/memory/modules/youtube/ingest.d.ts +20 -0
  314. package/dist/memory/modules/youtube/ingest.d.ts.map +1 -0
  315. package/dist/memory/modules/youtube/ingest.js +49 -0
  316. package/dist/memory/modules/youtube/ingest.js.map +1 -0
  317. package/dist/memory/modules/youtube/module.d.ts +11 -0
  318. package/dist/memory/modules/youtube/module.d.ts.map +1 -0
  319. package/dist/memory/modules/youtube/module.js +26 -0
  320. package/dist/memory/modules/youtube/module.js.map +1 -0
  321. package/dist/memory/modules/youtube/tests/channel.test.d.ts +2 -0
  322. package/dist/memory/modules/youtube/tests/channel.test.d.ts.map +1 -0
  323. package/dist/memory/modules/youtube/tests/channel.test.js +61 -0
  324. package/dist/memory/modules/youtube/tests/channel.test.js.map +1 -0
  325. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.d.ts +2 -0
  326. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.d.ts.map +1 -0
  327. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.js +23 -0
  328. package/dist/memory/modules/youtube/tests/transcript-fetcher.test.js.map +1 -0
  329. package/dist/memory/modules/youtube/tests/youtube.test.d.ts +2 -0
  330. package/dist/memory/modules/youtube/tests/youtube.test.d.ts.map +1 -0
  331. package/dist/memory/modules/youtube/tests/youtube.test.js +52 -0
  332. package/dist/memory/modules/youtube/tests/youtube.test.js.map +1 -0
  333. package/dist/memory/modules/youtube/tools.d.ts +5 -0
  334. package/dist/memory/modules/youtube/tools.d.ts.map +1 -0
  335. package/dist/memory/modules/youtube/tools.js +182 -0
  336. package/dist/memory/modules/youtube/tools.js.map +1 -0
  337. package/dist/memory/modules/youtube/transcript-fetcher.d.ts +17 -0
  338. package/dist/memory/modules/youtube/transcript-fetcher.d.ts.map +1 -0
  339. package/dist/memory/modules/youtube/transcript-fetcher.js +178 -0
  340. package/dist/memory/modules/youtube/transcript-fetcher.js.map +1 -0
  341. package/dist/memory/modules/youtube/watcher.d.ts +30 -0
  342. package/dist/memory/modules/youtube/watcher.d.ts.map +1 -0
  343. package/dist/memory/modules/youtube/watcher.js +198 -0
  344. package/dist/memory/modules/youtube/watcher.js.map +1 -0
  345. package/dist/memory/public/tools.d.ts +5 -0
  346. package/dist/memory/public/tools.d.ts.map +1 -0
  347. package/dist/memory/public/tools.js +1761 -0
  348. package/dist/memory/public/tools.js.map +1 -0
  349. package/dist/private/algorithms/chunker-semantic.d.ts +3 -0
  350. package/dist/private/algorithms/chunker-semantic.d.ts.map +1 -0
  351. package/dist/private/algorithms/chunker-semantic.js +70 -0
  352. package/dist/private/algorithms/chunker-semantic.js.map +1 -0
  353. package/dist/private/algorithms/find-related-smart.d.ts +4 -0
  354. package/dist/private/algorithms/find-related-smart.d.ts.map +1 -0
  355. package/dist/private/algorithms/find-related-smart.js +52 -0
  356. package/dist/private/algorithms/find-related-smart.js.map +1 -0
  357. package/dist/private/algorithms/graph-semantic-edges.d.ts +4 -0
  358. package/dist/private/algorithms/graph-semantic-edges.d.ts.map +1 -0
  359. package/dist/private/algorithms/graph-semantic-edges.js +38 -0
  360. package/dist/private/algorithms/graph-semantic-edges.js.map +1 -0
  361. package/dist/private/algorithms/search-all-smart.d.ts +9 -0
  362. package/dist/private/algorithms/search-all-smart.d.ts.map +1 -0
  363. package/dist/private/algorithms/search-all-smart.js +62 -0
  364. package/dist/private/algorithms/search-all-smart.js.map +1 -0
  365. package/dist/private/index.d.ts +7 -0
  366. package/dist/private/index.d.ts.map +1 -0
  367. package/dist/private/index.js +39 -0
  368. package/dist/private/index.js.map +1 -0
  369. package/dist/private/prompts/extraction-system.d.ts +2 -0
  370. package/dist/private/prompts/extraction-system.d.ts.map +1 -0
  371. package/dist/private/prompts/extraction-system.js +15 -0
  372. package/dist/private/prompts/extraction-system.js.map +1 -0
  373. package/dist/private/prompts/suggest-properties.d.ts +2 -0
  374. package/dist/private/prompts/suggest-properties.d.ts.map +1 -0
  375. package/dist/private/prompts/suggest-properties.js +18 -0
  376. package/dist/private/prompts/suggest-properties.js.map +1 -0
  377. package/dist/private/tests/find-related-smart.test.d.ts +2 -0
  378. package/dist/private/tests/find-related-smart.test.d.ts.map +1 -0
  379. package/dist/private/tests/find-related-smart.test.js +86 -0
  380. package/dist/private/tests/find-related-smart.test.js.map +1 -0
  381. package/dist/private/tests/property-extractor-smart.test.d.ts +2 -0
  382. package/dist/private/tests/property-extractor-smart.test.d.ts.map +1 -0
  383. package/dist/private/tests/property-extractor-smart.test.js +26 -0
  384. package/dist/private/tests/property-extractor-smart.test.js.map +1 -0
  385. package/dist/scripts/install-ollama.d.ts +3 -0
  386. package/dist/scripts/install-ollama.d.ts.map +1 -0
  387. package/dist/scripts/install-ollama.js +78 -0
  388. package/dist/scripts/install-ollama.js.map +1 -0
  389. package/dist/scripts/install.d.ts +3 -0
  390. package/dist/scripts/install.d.ts.map +1 -0
  391. package/dist/scripts/install.js +191 -0
  392. package/dist/scripts/install.js.map +1 -0
  393. package/dist/scripts/pair.d.ts +3 -0
  394. package/dist/scripts/pair.d.ts.map +1 -0
  395. package/dist/scripts/pair.js +78 -0
  396. package/dist/scripts/pair.js.map +1 -0
  397. package/dist/scripts/rebuild.d.ts +20 -0
  398. package/dist/scripts/rebuild.d.ts.map +1 -0
  399. package/dist/scripts/rebuild.js +171 -0
  400. package/dist/scripts/rebuild.js.map +1 -0
  401. package/dist/scripts/reindex.d.ts +3 -0
  402. package/dist/scripts/reindex.d.ts.map +1 -0
  403. package/dist/scripts/reindex.js +23 -0
  404. package/dist/scripts/reindex.js.map +1 -0
  405. package/dist/scripts/serve.d.ts +3 -0
  406. package/dist/scripts/serve.d.ts.map +1 -0
  407. package/dist/scripts/serve.js +57 -0
  408. package/dist/scripts/serve.js.map +1 -0
  409. package/dist/scripts/service.d.ts +19 -0
  410. package/dist/scripts/service.d.ts.map +1 -0
  411. package/dist/scripts/service.js +257 -0
  412. package/dist/scripts/service.js.map +1 -0
  413. package/dist/server/api/daily.d.ts +3 -0
  414. package/dist/server/api/daily.d.ts.map +1 -0
  415. package/dist/server/api/daily.js +44 -0
  416. package/dist/server/api/daily.js.map +1 -0
  417. package/dist/server/api/graph.d.ts +26 -0
  418. package/dist/server/api/graph.d.ts.map +1 -0
  419. package/dist/server/api/graph.js +80 -0
  420. package/dist/server/api/graph.js.map +1 -0
  421. package/dist/server/api/integrations.d.ts +4 -0
  422. package/dist/server/api/integrations.d.ts.map +1 -0
  423. package/dist/server/api/integrations.js +228 -0
  424. package/dist/server/api/integrations.js.map +1 -0
  425. package/dist/server/api/memories.d.ts +4 -0
  426. package/dist/server/api/memories.d.ts.map +1 -0
  427. package/dist/server/api/memories.js +267 -0
  428. package/dist/server/api/memories.js.map +1 -0
  429. package/dist/server/api/reindex.d.ts +3 -0
  430. package/dist/server/api/reindex.d.ts.map +1 -0
  431. package/dist/server/api/reindex.js +18 -0
  432. package/dist/server/api/reindex.js.map +1 -0
  433. package/dist/server/api/settings.d.ts +3 -0
  434. package/dist/server/api/settings.d.ts.map +1 -0
  435. package/dist/server/api/settings.js +24 -0
  436. package/dist/server/api/settings.js.map +1 -0
  437. package/dist/server/api/sources.d.ts +4 -0
  438. package/dist/server/api/sources.d.ts.map +1 -0
  439. package/dist/server/api/sources.js +45 -0
  440. package/dist/server/api/sources.js.map +1 -0
  441. package/dist/server/api/sync-status.d.ts +3 -0
  442. package/dist/server/api/sync-status.d.ts.map +1 -0
  443. package/dist/server/api/sync-status.js +43 -0
  444. package/dist/server/api/sync-status.js.map +1 -0
  445. package/dist/server/api/types.d.ts +3 -0
  446. package/dist/server/api/types.d.ts.map +1 -0
  447. package/dist/server/api/types.js +20 -0
  448. package/dist/server/api/types.js.map +1 -0
  449. package/dist/server/api/views.d.ts +25 -0
  450. package/dist/server/api/views.d.ts.map +1 -0
  451. package/dist/server/api/views.js +54 -0
  452. package/dist/server/api/views.js.map +1 -0
  453. package/dist/server/index.d.ts +2 -0
  454. package/dist/server/index.d.ts.map +1 -0
  455. package/dist/server/index.js +3 -0
  456. package/dist/server/index.js.map +1 -0
  457. package/dist/sync/apply.d.ts +55 -0
  458. package/dist/sync/apply.d.ts.map +1 -0
  459. package/dist/sync/apply.js +277 -0
  460. package/dist/sync/apply.js.map +1 -0
  461. package/dist/sync/channel-client.d.ts +27 -0
  462. package/dist/sync/channel-client.d.ts.map +1 -0
  463. package/dist/sync/channel-client.js +154 -0
  464. package/dist/sync/channel-client.js.map +1 -0
  465. package/dist/sync/cloud-saves.d.ts +49 -0
  466. package/dist/sync/cloud-saves.d.ts.map +1 -0
  467. package/dist/sync/cloud-saves.js +182 -0
  468. package/dist/sync/cloud-saves.js.map +1 -0
  469. package/dist/sync/ed25519.d.ts +54 -0
  470. package/dist/sync/ed25519.d.ts.map +1 -0
  471. package/dist/sync/ed25519.js +136 -0
  472. package/dist/sync/ed25519.js.map +1 -0
  473. package/dist/sync/ops-log.d.ts +43 -0
  474. package/dist/sync/ops-log.d.ts.map +1 -0
  475. package/dist/sync/ops-log.js +153 -0
  476. package/dist/sync/ops-log.js.map +1 -0
  477. package/dist/sync/recovery-setup.d.ts +26 -0
  478. package/dist/sync/recovery-setup.d.ts.map +1 -0
  479. package/dist/sync/recovery-setup.js +113 -0
  480. package/dist/sync/recovery-setup.js.map +1 -0
  481. package/dist/sync/replay.d.ts +19 -0
  482. package/dist/sync/replay.d.ts.map +1 -0
  483. package/dist/sync/replay.js +59 -0
  484. package/dist/sync/replay.js.map +1 -0
  485. package/dist/sync/shamir.d.ts +22 -0
  486. package/dist/sync/shamir.d.ts.map +1 -0
  487. package/dist/sync/shamir.js +109 -0
  488. package/dist/sync/shamir.js.map +1 -0
  489. package/dist/sync/tests/apply.test.d.ts +4 -0
  490. package/dist/sync/tests/apply.test.d.ts.map +1 -0
  491. package/dist/sync/tests/apply.test.js +119 -0
  492. package/dist/sync/tests/apply.test.js.map +1 -0
  493. package/dist/sync/tests/ops-log.test.d.ts +2 -0
  494. package/dist/sync/tests/ops-log.test.d.ts.map +1 -0
  495. package/dist/sync/tests/ops-log.test.js +105 -0
  496. package/dist/sync/tests/ops-log.test.js.map +1 -0
  497. package/dist/sync/tests/two-device-sync.test.d.ts +2 -0
  498. package/dist/sync/tests/two-device-sync.test.d.ts.map +1 -0
  499. package/dist/sync/tests/two-device-sync.test.js +250 -0
  500. package/dist/sync/tests/two-device-sync.test.js.map +1 -0
  501. package/dist/sync/types.d.ts +87 -0
  502. package/dist/sync/types.d.ts.map +1 -0
  503. package/dist/sync/types.js +37 -0
  504. package/dist/sync/types.js.map +1 -0
  505. package/dist/tests/chunker.test.d.ts +2 -0
  506. package/dist/tests/chunker.test.d.ts.map +1 -0
  507. package/dist/tests/chunker.test.js +24 -0
  508. package/dist/tests/chunker.test.js.map +1 -0
  509. package/dist/tests/cloud-auth.test.d.ts +2 -0
  510. package/dist/tests/cloud-auth.test.d.ts.map +1 -0
  511. package/dist/tests/cloud-auth.test.js +75 -0
  512. package/dist/tests/cloud-auth.test.js.map +1 -0
  513. package/dist/tests/cloud-crypto.test.d.ts +2 -0
  514. package/dist/tests/cloud-crypto.test.d.ts.map +1 -0
  515. package/dist/tests/cloud-crypto.test.js +58 -0
  516. package/dist/tests/cloud-crypto.test.js.map +1 -0
  517. package/dist/tests/cloud-integration.test.d.ts +2 -0
  518. package/dist/tests/cloud-integration.test.d.ts.map +1 -0
  519. package/dist/tests/cloud-integration.test.js +193 -0
  520. package/dist/tests/cloud-integration.test.js.map +1 -0
  521. package/dist/tests/cloud-pairing.test.d.ts +2 -0
  522. package/dist/tests/cloud-pairing.test.d.ts.map +1 -0
  523. package/dist/tests/cloud-pairing.test.js +86 -0
  524. package/dist/tests/cloud-pairing.test.js.map +1 -0
  525. package/dist/tests/cloud-saves-integration.test.d.ts +2 -0
  526. package/dist/tests/cloud-saves-integration.test.d.ts.map +1 -0
  527. package/dist/tests/cloud-saves-integration.test.js +92 -0
  528. package/dist/tests/cloud-saves-integration.test.js.map +1 -0
  529. package/dist/tests/cloud-transit.test.d.ts +2 -0
  530. package/dist/tests/cloud-transit.test.d.ts.map +1 -0
  531. package/dist/tests/cloud-transit.test.js +263 -0
  532. package/dist/tests/cloud-transit.test.js.map +1 -0
  533. package/dist/tests/config.test.d.ts +2 -0
  534. package/dist/tests/config.test.d.ts.map +1 -0
  535. package/dist/tests/config.test.js +25 -0
  536. package/dist/tests/config.test.js.map +1 -0
  537. package/dist/tests/db.test.d.ts +2 -0
  538. package/dist/tests/db.test.d.ts.map +1 -0
  539. package/dist/tests/db.test.js +75 -0
  540. package/dist/tests/db.test.js.map +1 -0
  541. package/dist/tests/embeddings-providers.test.d.ts +2 -0
  542. package/dist/tests/embeddings-providers.test.d.ts.map +1 -0
  543. package/dist/tests/embeddings-providers.test.js +62 -0
  544. package/dist/tests/embeddings-providers.test.js.map +1 -0
  545. package/dist/tests/embeddings.test.d.ts +2 -0
  546. package/dist/tests/embeddings.test.d.ts.map +1 -0
  547. package/dist/tests/embeddings.test.js +22 -0
  548. package/dist/tests/embeddings.test.js.map +1 -0
  549. package/dist/tests/integrations-api.test.d.ts +2 -0
  550. package/dist/tests/integrations-api.test.d.ts.map +1 -0
  551. package/dist/tests/integrations-api.test.js +129 -0
  552. package/dist/tests/integrations-api.test.js.map +1 -0
  553. package/dist/tests/memory-store.test.d.ts +2 -0
  554. package/dist/tests/memory-store.test.d.ts.map +1 -0
  555. package/dist/tests/memory-store.test.js +129 -0
  556. package/dist/tests/memory-store.test.js.map +1 -0
  557. package/dist/tests/module-registry.test.d.ts +2 -0
  558. package/dist/tests/module-registry.test.d.ts.map +1 -0
  559. package/dist/tests/module-registry.test.js +44 -0
  560. package/dist/tests/module-registry.test.js.map +1 -0
  561. package/dist/tests/property-extractor.test.d.ts +2 -0
  562. package/dist/tests/property-extractor.test.d.ts.map +1 -0
  563. package/dist/tests/property-extractor.test.js +24 -0
  564. package/dist/tests/property-extractor.test.js.map +1 -0
  565. package/dist/tests/public-tools.test.d.ts +2 -0
  566. package/dist/tests/public-tools.test.d.ts.map +1 -0
  567. package/dist/tests/public-tools.test.js +270 -0
  568. package/dist/tests/public-tools.test.js.map +1 -0
  569. package/dist/tests/reindex.test.d.ts +2 -0
  570. package/dist/tests/reindex.test.d.ts.map +1 -0
  571. package/dist/tests/reindex.test.js +58 -0
  572. package/dist/tests/reindex.test.js.map +1 -0
  573. package/dist/tests/shamir.test.d.ts +2 -0
  574. package/dist/tests/shamir.test.d.ts.map +1 -0
  575. package/dist/tests/shamir.test.js +57 -0
  576. package/dist/tests/shamir.test.js.map +1 -0
  577. package/dist/tests/source-registry.test.d.ts +2 -0
  578. package/dist/tests/source-registry.test.d.ts.map +1 -0
  579. package/dist/tests/source-registry.test.js +58 -0
  580. package/dist/tests/source-registry.test.js.map +1 -0
  581. package/dist/tests/types.test.d.ts +2 -0
  582. package/dist/tests/types.test.d.ts.map +1 -0
  583. package/dist/tests/types.test.js +26 -0
  584. package/dist/tests/types.test.js.map +1 -0
  585. package/dist/tests/vector.test.d.ts +2 -0
  586. package/dist/tests/vector.test.d.ts.map +1 -0
  587. package/dist/tests/vector.test.js +61 -0
  588. package/dist/tests/vector.test.js.map +1 -0
  589. package/dist/tests/wikilinks.test.d.ts +2 -0
  590. package/dist/tests/wikilinks.test.d.ts.map +1 -0
  591. package/dist/tests/wikilinks.test.js +20 -0
  592. package/dist/tests/wikilinks.test.js.map +1 -0
  593. package/dist/tools/index.d.ts +22 -0
  594. package/dist/tools/index.d.ts.map +1 -0
  595. package/dist/tools/index.js +38 -0
  596. package/dist/tools/index.js.map +1 -0
  597. package/dist/types.d.ts +134 -0
  598. package/dist/types.d.ts.map +1 -0
  599. package/dist/types.js +25 -0
  600. package/dist/types.js.map +1 -0
  601. package/dist/vector/store.d.ts +28 -0
  602. package/dist/vector/store.d.ts.map +1 -0
  603. package/dist/vector/store.js +132 -0
  604. package/dist/vector/store.js.map +1 -0
  605. package/dist/webapp/api/daily.d.ts +3 -0
  606. package/dist/webapp/api/daily.d.ts.map +1 -0
  607. package/dist/webapp/api/daily.js +44 -0
  608. package/dist/webapp/api/daily.js.map +1 -0
  609. package/dist/webapp/api/graph.d.ts +26 -0
  610. package/dist/webapp/api/graph.d.ts.map +1 -0
  611. package/dist/webapp/api/graph.js +80 -0
  612. package/dist/webapp/api/graph.js.map +1 -0
  613. package/dist/webapp/api/memories.d.ts +4 -0
  614. package/dist/webapp/api/memories.d.ts.map +1 -0
  615. package/dist/webapp/api/memories.js +70 -0
  616. package/dist/webapp/api/memories.js.map +1 -0
  617. package/dist/webapp/api/reindex.d.ts +3 -0
  618. package/dist/webapp/api/reindex.d.ts.map +1 -0
  619. package/dist/webapp/api/reindex.js +18 -0
  620. package/dist/webapp/api/reindex.js.map +1 -0
  621. package/dist/webapp/api/settings.d.ts +3 -0
  622. package/dist/webapp/api/settings.d.ts.map +1 -0
  623. package/dist/webapp/api/settings.js +24 -0
  624. package/dist/webapp/api/settings.js.map +1 -0
  625. package/dist/webapp/api/sources.d.ts +4 -0
  626. package/dist/webapp/api/sources.d.ts.map +1 -0
  627. package/dist/webapp/api/sources.js +45 -0
  628. package/dist/webapp/api/sources.js.map +1 -0
  629. package/dist/webapp/api/sync-status.d.ts +3 -0
  630. package/dist/webapp/api/sync-status.d.ts.map +1 -0
  631. package/dist/webapp/api/sync-status.js +43 -0
  632. package/dist/webapp/api/sync-status.js.map +1 -0
  633. package/dist/webapp/api/types.d.ts +3 -0
  634. package/dist/webapp/api/types.d.ts.map +1 -0
  635. package/dist/webapp/api/types.js +20 -0
  636. package/dist/webapp/api/types.js.map +1 -0
  637. package/dist/webapp/api/views.d.ts +25 -0
  638. package/dist/webapp/api/views.d.ts.map +1 -0
  639. package/dist/webapp/api/views.js +54 -0
  640. package/dist/webapp/api/views.js.map +1 -0
  641. package/dist/webapp/mcp-http.d.ts +2 -0
  642. package/dist/webapp/mcp-http.d.ts.map +1 -0
  643. package/dist/webapp/mcp-http.js +3 -0
  644. package/dist/webapp/mcp-http.js.map +1 -0
  645. package/dist/webapp/server.d.ts +2 -0
  646. package/dist/webapp/server.d.ts.map +1 -0
  647. package/dist/webapp/server.js +3 -0
  648. package/dist/webapp/server.js.map +1 -0
  649. package/dist/webapp/tests/api.test.d.ts +2 -0
  650. package/dist/webapp/tests/api.test.d.ts.map +1 -0
  651. package/dist/webapp/tests/api.test.js +125 -0
  652. package/dist/webapp/tests/api.test.js.map +1 -0
  653. package/dist/webapp/tests/mcp-http.test.d.ts +2 -0
  654. package/dist/webapp/tests/mcp-http.test.d.ts.map +1 -0
  655. package/dist/webapp/tests/mcp-http.test.js +47 -0
  656. package/dist/webapp/tests/mcp-http.test.js.map +1 -0
  657. package/dist/webapp/websocket.d.ts +2 -0
  658. package/dist/webapp/websocket.d.ts.map +1 -0
  659. package/dist/webapp/websocket.js +3 -0
  660. package/dist/webapp/websocket.js.map +1 -0
  661. package/package.json +128 -0
  662. package/src/private/README.md +49 -0
@@ -0,0 +1,42 @@
1
+ export interface MasterKeyMaterial {
2
+ /** 32-byte derived key (XSalsa20-Poly1305 secret key) */
3
+ key: Uint8Array;
4
+ /** hex-encoded 32-byte salt — persisted in config.engramAccount.masterKeySalt */
5
+ saltHex: string;
6
+ }
7
+ /**
8
+ * Generate a fresh random salt (call at first pairing).
9
+ * The salt must be stored in config so it survives restarts.
10
+ */
11
+ export declare function generateMasterKeySalt(): Promise<string>;
12
+ /**
13
+ * Derive the 32-byte master key from passphrase + salt using scrypt.
14
+ * scrypt is memory-hard (equivalent security properties to Argon2id).
15
+ * The derived key is held in process memory only — never written to disk.
16
+ */
17
+ export declare function deriveMasterKey(passphrase: string, saltHex: string): Promise<Uint8Array>;
18
+ /**
19
+ * Encrypt a plaintext blob.
20
+ * Returns: nonce (24 bytes) || ciphertext — ready to upload to R2.
21
+ */
22
+ export declare function encryptBlob(plaintext: Uint8Array, masterKey: Uint8Array): Promise<Uint8Array>;
23
+ /**
24
+ * Decrypt a blob downloaded from R2.
25
+ * Input: nonce (24 bytes) || ciphertext (as produced by encryptBlob).
26
+ * Throws if authentication fails (tampered or wrong key).
27
+ */
28
+ export declare function decryptBlob(wire: Uint8Array, masterKey: Uint8Array): Promise<Uint8Array>;
29
+ /**
30
+ * Generate an ephemeral X25519 keypair for the Noise handshake.
31
+ * The PC uses this for each new bridge session.
32
+ */
33
+ export declare function generateEphemeralKeypair(): Promise<{
34
+ publicKey: Uint8Array;
35
+ privateKey: Uint8Array;
36
+ }>;
37
+ /**
38
+ * Derive a shared session key from the PC's private key and the relay's
39
+ * ephemeral public key (X25519 DH).
40
+ */
41
+ export declare function deriveSessionKey(myPrivateKey: Uint8Array, theirPublicKey: Uint8Array): Promise<Uint8Array>;
42
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/cloud/crypto.ts"],"names":[],"mappings":"AAsEA,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,GAAG,EAAE,UAAU,CAAC;IAChB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG7D;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAcrB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC,CAkBrB;AAMD;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC;IACxD,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC,CAID;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,UAAU,EACxB,cAAc,EAAE,UAAU,GACzB,OAAO,CAAC,UAAU,CAAC,CAGrB"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * src/cloud/crypto.ts
3
+ *
4
+ * Cryptographic helpers for the cloud transit E2E layer.
5
+ *
6
+ * Master key: scrypt from user passphrase + random 32-byte salt.
7
+ * - Salt is stored in config.engramAccount.masterKeySalt (hex).
8
+ * - Passphrase is NEVER stored — prompted at startup or pairing time.
9
+ * - Derived key is held in memory only for the process lifetime.
10
+ *
11
+ * Note: The plan spec calls for Argon2id (libsodium crypto_pwhash), which
12
+ * requires libsodium-wrappers-sumo (the "full" build). The base
13
+ * libsodium-wrappers package omits pwhash. We use Node.js built-in
14
+ * crypto.scrypt instead — it is also memory-hard (Colin Percival's scrypt,
15
+ * the predecessor to Argon2id) and available everywhere Node ≥ 10 runs.
16
+ * When libsodium-wrappers-sumo becomes available, swap deriveMasterKey's
17
+ * implementation to crypto_pwhash with no other changes needed.
18
+ *
19
+ * Blob encryption (Plan J mobile side + PC side both use this scheme):
20
+ * secretbox: XSalsa20-Poly1305 (libsodium crypto_secretbox_easy).
21
+ * Nonce: random 24 bytes, prepended to ciphertext.
22
+ * Wire format: nonce (24 bytes) || ciphertext.
23
+ */
24
+ import sodium from 'libsodium-wrappers';
25
+ import { randomBytes } from 'crypto';
26
+ import { scrypt as scryptCallback } from 'crypto';
27
+ import { createLogger } from '../logger.js';
28
+ const log = createLogger('cloud:crypto');
29
+ /** Promise wrapper for crypto.scrypt with options */
30
+ function scryptAsync(password, salt, keylen, options) {
31
+ return new Promise((resolve, reject) => {
32
+ scryptCallback(password, salt, keylen, options, (err, derivedKey) => {
33
+ if (err)
34
+ reject(err);
35
+ else
36
+ resolve(derivedKey);
37
+ });
38
+ });
39
+ }
40
+ let _sodiumReady = false;
41
+ async function ensureSodium() {
42
+ if (!_sodiumReady) {
43
+ await sodium.ready;
44
+ _sodiumReady = true;
45
+ }
46
+ }
47
+ // scrypt parameters — memory-hard equivalent to Argon2id-interactive.
48
+ // N=2^14 (16 MiB total with r=8), r=8, p=1.
49
+ // OpenSSL default maxmem is 32 MiB; 128*N*r = 128*16384*8 = 16 MiB — fits comfortably.
50
+ // Override via env for stronger hardening: ENGRAM_SCRYPT_N (power of 2, max 32768).
51
+ const SCRYPT_N = process.env.ENGRAM_SCRYPT_N
52
+ ? parseInt(process.env.ENGRAM_SCRYPT_N, 10)
53
+ : 1 << 14; // 16384 → 16 MiB
54
+ const SCRYPT_R = 8;
55
+ const SCRYPT_P = 1;
56
+ const SALT_BYTES = 32;
57
+ const KEY_BYTES = 32; // 256-bit key for XSalsa20
58
+ /**
59
+ * Generate a fresh random salt (call at first pairing).
60
+ * The salt must be stored in config so it survives restarts.
61
+ */
62
+ export async function generateMasterKeySalt() {
63
+ const salt = randomBytes(SALT_BYTES);
64
+ return salt.toString('hex');
65
+ }
66
+ /**
67
+ * Derive the 32-byte master key from passphrase + salt using scrypt.
68
+ * scrypt is memory-hard (equivalent security properties to Argon2id).
69
+ * The derived key is held in process memory only — never written to disk.
70
+ */
71
+ export async function deriveMasterKey(passphrase, saltHex) {
72
+ const salt = Buffer.from(saltHex, 'hex');
73
+ if (salt.length !== SALT_BYTES) {
74
+ throw new Error(`Invalid salt length: expected ${SALT_BYTES}, got ${salt.length}`);
75
+ }
76
+ const keyBuf = (await scryptAsync(passphrase, salt, KEY_BYTES, {
77
+ N: SCRYPT_N,
78
+ r: SCRYPT_R,
79
+ p: SCRYPT_P,
80
+ }));
81
+ log.debug('Master key derived (scrypt)');
82
+ return new Uint8Array(keyBuf);
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Blob encryption / decryption (libsodium XSalsa20-Poly1305)
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * Encrypt a plaintext blob.
89
+ * Returns: nonce (24 bytes) || ciphertext — ready to upload to R2.
90
+ */
91
+ export async function encryptBlob(plaintext, masterKey) {
92
+ await ensureSodium();
93
+ const NONCE_BYTES = sodium.crypto_secretbox_NONCEBYTES; // 24
94
+ const nonce = sodium.randombytes_buf(NONCE_BYTES);
95
+ const ciphertext = sodium.crypto_secretbox_easy(plaintext, nonce, masterKey);
96
+ const wire = new Uint8Array(nonce.length + ciphertext.length);
97
+ wire.set(nonce, 0);
98
+ wire.set(ciphertext, nonce.length);
99
+ return wire;
100
+ }
101
+ /**
102
+ * Decrypt a blob downloaded from R2.
103
+ * Input: nonce (24 bytes) || ciphertext (as produced by encryptBlob).
104
+ * Throws if authentication fails (tampered or wrong key).
105
+ */
106
+ export async function decryptBlob(wire, masterKey) {
107
+ await ensureSodium();
108
+ const NONCE_BYTES = sodium.crypto_secretbox_NONCEBYTES; // 24
109
+ if (wire.length <= NONCE_BYTES) {
110
+ throw new Error('Ciphertext too short to contain a nonce');
111
+ }
112
+ const nonce = wire.slice(0, NONCE_BYTES);
113
+ const ciphertext = wire.slice(NONCE_BYTES);
114
+ let plaintext;
115
+ try {
116
+ plaintext = sodium.crypto_secretbox_open_easy(ciphertext, nonce, masterKey);
117
+ }
118
+ catch {
119
+ throw new Error('Decryption failed — wrong key or tampered ciphertext');
120
+ }
121
+ if (!plaintext) {
122
+ throw new Error('Decryption failed — wrong key or tampered ciphertext');
123
+ }
124
+ return plaintext;
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Noise-inspired handshake helpers for Bridge Relay (Plan J Noise protocol)
128
+ // ---------------------------------------------------------------------------
129
+ /**
130
+ * Generate an ephemeral X25519 keypair for the Noise handshake.
131
+ * The PC uses this for each new bridge session.
132
+ */
133
+ export async function generateEphemeralKeypair() {
134
+ await ensureSodium();
135
+ const kp = sodium.crypto_box_keypair();
136
+ return { publicKey: kp.publicKey, privateKey: kp.privateKey };
137
+ }
138
+ /**
139
+ * Derive a shared session key from the PC's private key and the relay's
140
+ * ephemeral public key (X25519 DH).
141
+ */
142
+ export async function deriveSessionKey(myPrivateKey, theirPublicKey) {
143
+ await ensureSodium();
144
+ return sodium.crypto_scalarmult(myPrivateKey, theirPublicKey);
145
+ }
146
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/cloud/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * src/cloud/endpoints.ts
3
+ *
4
+ * HARDCODED cloud endpoints. NOT configurable from ~/.engram/config.json
5
+ * or any env var. Forks attempting to redirect engram-mcp to a self-hosted
6
+ * cloud must modify and recompile from source — this is intentional.
7
+ *
8
+ * Why hardcoded:
9
+ * - Pair flow, billing, sync — all require our backend to validate
10
+ * subscriptions and route relays. Allowing override would let bad actors
11
+ * stand up clone clouds and bypass payments.
12
+ * - The cloud client logic itself lives in src/private/ (gitignored,
13
+ * closed-source). Modifying these URLs in source without the private
14
+ * client implementation produces a non-functional binary.
15
+ *
16
+ * Local-only usage (Free tier, no cloud at all) is fully supported via the
17
+ * core MemoryStore — these endpoints are only touched when the user pairs
18
+ * their account.
19
+ */
20
+ /** Cloud API base — bridge relay, auth, billing, embeddings, whisper, memories endpoints */
21
+ export declare const ENGRAM_API_BASE = "https://api.engram-mcp.com";
22
+ /** Web app base — pair page, dashboard, marketing */
23
+ export declare const ENGRAM_APP_BASE = "https://engram-mcp.com";
24
+ /** Installer worker — `installer.engram-mcp.com/mcp` exposes install tools for agents */
25
+ export declare const ENGRAM_INSTALLER_BASE = "https://installer.engram-mcp.com";
26
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/cloud/endpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,4FAA4F;AAC5F,eAAO,MAAM,eAAe,+BAA+B,CAAC;AAE5D,qDAAqD;AACrD,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,qCAAqC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * src/cloud/endpoints.ts
3
+ *
4
+ * HARDCODED cloud endpoints. NOT configurable from ~/.engram/config.json
5
+ * or any env var. Forks attempting to redirect engram-mcp to a self-hosted
6
+ * cloud must modify and recompile from source — this is intentional.
7
+ *
8
+ * Why hardcoded:
9
+ * - Pair flow, billing, sync — all require our backend to validate
10
+ * subscriptions and route relays. Allowing override would let bad actors
11
+ * stand up clone clouds and bypass payments.
12
+ * - The cloud client logic itself lives in src/private/ (gitignored,
13
+ * closed-source). Modifying these URLs in source without the private
14
+ * client implementation produces a non-functional binary.
15
+ *
16
+ * Local-only usage (Free tier, no cloud at all) is fully supported via the
17
+ * core MemoryStore — these endpoints are only touched when the user pairs
18
+ * their account.
19
+ */
20
+ /** Cloud API base — bridge relay, auth, billing, embeddings, whisper, memories endpoints */
21
+ export const ENGRAM_API_BASE = 'https://api.engram-mcp.com';
22
+ /** Web app base — pair page, dashboard, marketing */
23
+ export const ENGRAM_APP_BASE = 'https://engram-mcp.com';
24
+ /** Installer worker — `installer.engram-mcp.com/mcp` exposes install tools for agents */
25
+ export const ENGRAM_INSTALLER_BASE = 'https://installer.engram-mcp.com';
26
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/cloud/endpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,4FAA4F;AAC5F,MAAM,CAAC,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAE5D,qDAAqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAExD,yFAAyF;AACzF,MAAM,CAAC,MAAM,qBAAqB,GAAG,kCAAkC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * src/cloud/pairing.ts
3
+ *
4
+ * Pairing flow: open browser → engram-mcp.com/pair/<token> → user logs in →
5
+ * app redirects to localhost callback → JWT + API key received → saved.
6
+ *
7
+ * The localhost callback server uses the built-in Node.js `http` module
8
+ * (no extra deps). It binds to 127.0.0.1 only.
9
+ */
10
+ export interface PairingResult {
11
+ jwt: string;
12
+ refreshToken: string;
13
+ apiKey: string;
14
+ expiresAt: number;
15
+ }
16
+ export interface StartPairingOptions {
17
+ /** Plan J / I base URL (default prod) */
18
+ baseUrl?: string;
19
+ }
20
+ /**
21
+ * Full pairing flow:
22
+ * 1. Generate token
23
+ * 2. Start callback server
24
+ * 3. Open browser
25
+ * 4. Wait for callback
26
+ * 5. Save tokens
27
+ * Returns the received tokens.
28
+ */
29
+ export declare function startPairing(opts?: StartPairingOptions): Promise<PairingResult>;
30
+ //# sourceMappingURL=pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../src/cloud/pairing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAqHD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BzF"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * src/cloud/pairing.ts
3
+ *
4
+ * Pairing flow: open browser → engram-mcp.com/pair/<token> → user logs in →
5
+ * app redirects to localhost callback → JWT + API key received → saved.
6
+ *
7
+ * The localhost callback server uses the built-in Node.js `http` module
8
+ * (no extra deps). It binds to 127.0.0.1 only.
9
+ */
10
+ import { ENGRAM_APP_BASE } from './endpoints.js';
11
+ import http from 'http';
12
+ import { randomBytes } from 'crypto';
13
+ import { execSync } from 'child_process';
14
+ import { URL } from 'url';
15
+ import { createLogger } from '../logger.js';
16
+ import { saveTokens, parseJwtExpiry } from './auth.js';
17
+ const log = createLogger('cloud:pairing');
18
+ const CALLBACK_PORT = 7778;
19
+ const PAIRING_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
20
+ /**
21
+ * Generate a URL-safe base64 pairing token (32 random bytes = 43 chars).
22
+ */
23
+ function generatePairingToken() {
24
+ return randomBytes(32).toString('base64url');
25
+ }
26
+ /**
27
+ * Open a URL in the default system browser (cross-platform).
28
+ */
29
+ function openBrowser(url) {
30
+ const platform = process.platform;
31
+ try {
32
+ if (platform === 'darwin') {
33
+ execSync(`open "${url}"`);
34
+ }
35
+ else if (platform === 'win32') {
36
+ execSync(`start "" "${url}"`);
37
+ }
38
+ else {
39
+ execSync(`xdg-open "${url}"`);
40
+ }
41
+ log.info(`Browser opened to ${url}`);
42
+ }
43
+ catch (e) {
44
+ // Don't throw — user can copy-paste the URL
45
+ log.warn(`Could not auto-open browser: ${e instanceof Error ? e.message : String(e)}`);
46
+ // eslint-disable-next-line no-console
47
+ console.log(`\nOpen this URL manually:\n ${url}\n`);
48
+ }
49
+ }
50
+ /**
51
+ * Start the localhost callback HTTP server.
52
+ * Returns a promise that resolves when the callback arrives (with tokens)
53
+ * or rejects on timeout / error.
54
+ */
55
+ function startCallbackServer() {
56
+ return new Promise((resolve, reject) => {
57
+ const server = http.createServer((req, res) => {
58
+ if (!req.url?.startsWith('/callback')) {
59
+ res.writeHead(404);
60
+ res.end('Not found');
61
+ return;
62
+ }
63
+ const parsed = new URL(req.url, `http://localhost:${CALLBACK_PORT}`);
64
+ const jwt = parsed.searchParams.get('jwt') ?? '';
65
+ const refreshToken = parsed.searchParams.get('refreshToken') ?? '';
66
+ const apiKey = parsed.searchParams.get('apiKey') ?? '';
67
+ if (!jwt || !refreshToken || !apiKey) {
68
+ res.writeHead(400, { 'Content-Type': 'text/html' });
69
+ res.end('<p>Pairing failed — missing parameters. Close this tab and try again.</p>');
70
+ reject(new Error('Callback missing jwt, refreshToken, or apiKey'));
71
+ server.close();
72
+ return;
73
+ }
74
+ let expiresAt;
75
+ try {
76
+ expiresAt = parseJwtExpiry(jwt);
77
+ }
78
+ catch {
79
+ expiresAt = Date.now() + 3600_000; // fallback: 1h
80
+ }
81
+ res.writeHead(200, { 'Content-Type': 'text/html' });
82
+ res.end(`<!DOCTYPE html>
83
+ <html>
84
+ <head>
85
+ <title>EngramMCP Paired</title>
86
+ <meta charset="utf-8">
87
+ <style>
88
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
89
+ background: #09090b; color: #f4f4f5; display: flex; align-items: center;
90
+ justify-content: center; height: 100vh; margin: 0; }
91
+ .card { text-align: center; padding: 48px 40px; border-radius: 16px;
92
+ background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1);
93
+ backdrop-filter: blur(12px); max-width: 360px; }
94
+ .check { font-size: 3rem; margin-bottom: 16px; }
95
+ h2 { margin: 0 0 8px; font-size: 1.4rem; font-weight: 600; }
96
+ p { margin: 0; color: #a1a1aa; font-size: 0.9rem; }
97
+ .countdown { font-size: 0.75rem; color: #52525b; margin-top: 16px; }
98
+ </style>
99
+ </head>
100
+ <body>
101
+ <div class="card">
102
+ <div class="check">✓</div>
103
+ <h2>Paired successfully!</h2>
104
+ <p>Your PC is now connected to your Engram account.</p>
105
+ <p class="countdown">This tab will close automatically…</p>
106
+ </div>
107
+ <script>setTimeout(() => { try { window.close(); } catch(e) {} }, 2000);</script>
108
+ </body>
109
+ </html>`);
110
+ server.close();
111
+ resolve({ jwt, refreshToken, apiKey, expiresAt });
112
+ });
113
+ server.listen(CALLBACK_PORT, '127.0.0.1', () => {
114
+ log.info(`Pairing callback server listening on http://127.0.0.1:${CALLBACK_PORT}`);
115
+ });
116
+ server.on('error', (err) => {
117
+ reject(new Error(`Pairing callback server error: ${err.message}`));
118
+ });
119
+ // Timeout guard
120
+ setTimeout(() => {
121
+ server.close();
122
+ reject(new Error(`Pairing timed out after ${PAIRING_TIMEOUT_MS / 60_000} minutes`));
123
+ }, PAIRING_TIMEOUT_MS);
124
+ });
125
+ }
126
+ /**
127
+ * Full pairing flow:
128
+ * 1. Generate token
129
+ * 2. Start callback server
130
+ * 3. Open browser
131
+ * 4. Wait for callback
132
+ * 5. Save tokens
133
+ * Returns the received tokens.
134
+ */
135
+ export async function startPairing(opts = {}) {
136
+ const baseUrl = opts.baseUrl ?? ENGRAM_APP_BASE;
137
+ const pairingToken = generatePairingToken();
138
+ const callbackUrl = encodeURIComponent(`http://localhost:${CALLBACK_PORT}/callback`);
139
+ const pairingUrl = `${baseUrl}/pair/${pairingToken}?callback=${callbackUrl}`;
140
+ /* eslint-disable no-console */
141
+ console.log('\n Linking your account to engram-mcp.com…\n');
142
+ /* eslint-enable no-console */
143
+ const callbackPromise = startCallbackServer();
144
+ /* eslint-disable no-console */
145
+ console.log(` Opening browser to: ${pairingUrl}\n`);
146
+ /* eslint-enable no-console */
147
+ openBrowser(pairingUrl);
148
+ /* eslint-disable no-console */
149
+ console.log(' Waiting for authorization in your browser…');
150
+ console.log(' (You have 5 minutes. Press Ctrl+C to cancel.)\n');
151
+ /* eslint-enable no-console */
152
+ const result = await callbackPromise;
153
+ saveTokens(result);
154
+ log.info('Pairing complete — tokens saved to oauth_tokens');
155
+ return result;
156
+ }
157
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/cloud/pairing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { MemoryStore } from '../memory/core/store.js';
2
+ import type { EngramConfig } from '../config/schema.js';
3
+ export interface TransitItem {
4
+ id: string;
5
+ type: 'voice' | 'doc' | 'text';
6
+ /** Signed R2 URL to download encrypted blob */
7
+ downloadUrl: string;
8
+ /** ISO timestamp of when the item was uploaded */
9
+ createdAt: string;
10
+ /** Blob MIME type hint (e.g., 'audio/webm', 'application/pdf', 'text/plain') */
11
+ mimeType: string;
12
+ /** Original filename if any */
13
+ filename?: string;
14
+ /** Byte size of encrypted blob */
15
+ sizeBytes: number;
16
+ }
17
+ export interface TransitPollerOptions {
18
+ store: MemoryStore;
19
+ config: EngramConfig;
20
+ /** In-process master key (Uint8Array, 32 bytes). Held in memory, never stored. */
21
+ masterKey: Uint8Array;
22
+ }
23
+ export declare function pollOnce(opts: TransitPollerOptions): Promise<{
24
+ processed: number;
25
+ errors: number;
26
+ }>;
27
+ /**
28
+ * Start the transit poller cron job.
29
+ * Returns a stop function to cancel the cron.
30
+ * Safe to call multiple times — only starts if engramAccount is configured.
31
+ */
32
+ export declare function startTransitPoller(opts: TransitPollerOptions): {
33
+ stop: () => void;
34
+ };
35
+ //# sourceMappingURL=transit-poller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transit-poller.d.ts","sourceRoot":"","sources":["../../src/cloud/transit-poller.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAoCxD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAmLD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,kFAAkF;IAClF,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkEhD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAkBnF"}