@folterung/project-memory 0.1.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 (215) hide show
  1. package/.memignore.example +11 -0
  2. package/README.md +48 -0
  3. package/docker-compose.yml +17 -0
  4. package/package.json +36 -0
  5. package/packages/cli/bin/mem.js +6 -0
  6. package/packages/cli/coverage/lcov-report/base.css +224 -0
  7. package/packages/cli/coverage/lcov-report/block-navigation.js +87 -0
  8. package/packages/cli/coverage/lcov-report/chunking/chunker.ts.html +538 -0
  9. package/packages/cli/coverage/lcov-report/chunking/hash.ts.html +148 -0
  10. package/packages/cli/coverage/lcov-report/chunking/index.html +146 -0
  11. package/packages/cli/coverage/lcov-report/chunking/types.ts.html +214 -0
  12. package/packages/cli/coverage/lcov-report/config/index.html +131 -0
  13. package/packages/cli/coverage/lcov-report/config/load.ts.html +184 -0
  14. package/packages/cli/coverage/lcov-report/config/types.ts.html +232 -0
  15. package/packages/cli/coverage/lcov-report/embedding/index.html +116 -0
  16. package/packages/cli/coverage/lcov-report/embedding/stub.ts.html +181 -0
  17. package/packages/cli/coverage/lcov-report/favicon.png +0 -0
  18. package/packages/cli/coverage/lcov-report/index.html +161 -0
  19. package/packages/cli/coverage/lcov-report/prettify.css +1 -0
  20. package/packages/cli/coverage/lcov-report/prettify.js +2 -0
  21. package/packages/cli/coverage/lcov-report/scope/allowlist.ts.html +199 -0
  22. package/packages/cli/coverage/lcov-report/scope/ignore.ts.html +343 -0
  23. package/packages/cli/coverage/lcov-report/scope/index.html +131 -0
  24. package/packages/cli/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  25. package/packages/cli/coverage/lcov-report/sorter.js +210 -0
  26. package/packages/cli/coverage/lcov.info +669 -0
  27. package/packages/cli/coverage/tmp/coverage-25917-1770055893226-0.json +1 -0
  28. package/packages/cli/coverage/tmp/coverage-25918-1770055893272-0.json +1 -0
  29. package/packages/cli/coverage/tmp/coverage-25919-1770055893273-0.json +1 -0
  30. package/packages/cli/coverage/tmp/coverage-25920-1770055893271-0.json +1 -0
  31. package/packages/cli/coverage/tmp/coverage-25921-1770055893279-0.json +1 -0
  32. package/packages/cli/coverage/tmp/coverage-25922-1770055893272-0.json +1 -0
  33. package/packages/cli/coverage/tmp/coverage-25923-1770055893275-0.json +1 -0
  34. package/packages/cli/coverage/tmp/coverage-25924-1770055893294-0.json +1 -0
  35. package/packages/cli/coverage/tmp/coverage-25925-1770055893290-0.json +1 -0
  36. package/packages/cli/dist/chunking/chunker.d.ts +2 -0
  37. package/packages/cli/dist/chunking/chunker.js +142 -0
  38. package/packages/cli/dist/chunking/chunker.js.map +1 -0
  39. package/packages/cli/dist/chunking/chunker.test.d.ts +1 -0
  40. package/packages/cli/dist/chunking/chunker.test.js +50 -0
  41. package/packages/cli/dist/chunking/chunker.test.js.map +1 -0
  42. package/packages/cli/dist/chunking/hash.d.ts +3 -0
  43. package/packages/cli/dist/chunking/hash.js +17 -0
  44. package/packages/cli/dist/chunking/hash.js.map +1 -0
  45. package/packages/cli/dist/chunking/hash.test.d.ts +1 -0
  46. package/packages/cli/dist/chunking/hash.test.js +36 -0
  47. package/packages/cli/dist/chunking/hash.test.js.map +1 -0
  48. package/packages/cli/dist/chunking/types.d.ts +19 -0
  49. package/packages/cli/dist/chunking/types.js +24 -0
  50. package/packages/cli/dist/chunking/types.js.map +1 -0
  51. package/packages/cli/dist/chunking/types.test.d.ts +1 -0
  52. package/packages/cli/dist/chunking/types.test.js +25 -0
  53. package/packages/cli/dist/chunking/types.test.js.map +1 -0
  54. package/packages/cli/dist/cli/index.d.ts +1 -0
  55. package/packages/cli/dist/cli/index.js +67 -0
  56. package/packages/cli/dist/cli/index.js.map +1 -0
  57. package/packages/cli/dist/commands/deep-index.d.ts +1 -0
  58. package/packages/cli/dist/commands/deep-index.js +17 -0
  59. package/packages/cli/dist/commands/deep-index.js.map +1 -0
  60. package/packages/cli/dist/commands/doctor.d.ts +1 -0
  61. package/packages/cli/dist/commands/doctor.js +27 -0
  62. package/packages/cli/dist/commands/doctor.js.map +1 -0
  63. package/packages/cli/dist/commands/down.d.ts +1 -0
  64. package/packages/cli/dist/commands/down.js +13 -0
  65. package/packages/cli/dist/commands/down.js.map +1 -0
  66. package/packages/cli/dist/commands/explain.d.ts +1 -0
  67. package/packages/cli/dist/commands/explain.js +23 -0
  68. package/packages/cli/dist/commands/explain.js.map +1 -0
  69. package/packages/cli/dist/commands/init.d.ts +1 -0
  70. package/packages/cli/dist/commands/init.js +35 -0
  71. package/packages/cli/dist/commands/init.js.map +1 -0
  72. package/packages/cli/dist/commands/query.d.ts +1 -0
  73. package/packages/cli/dist/commands/query.js +44 -0
  74. package/packages/cli/dist/commands/query.js.map +1 -0
  75. package/packages/cli/dist/commands/reset.d.ts +3 -0
  76. package/packages/cli/dist/commands/reset.js +28 -0
  77. package/packages/cli/dist/commands/reset.js.map +1 -0
  78. package/packages/cli/dist/commands/scaffold.d.ts +1 -0
  79. package/packages/cli/dist/commands/scaffold.js +52 -0
  80. package/packages/cli/dist/commands/scaffold.js.map +1 -0
  81. package/packages/cli/dist/commands/update.d.ts +5 -0
  82. package/packages/cli/dist/commands/update.js +23 -0
  83. package/packages/cli/dist/commands/update.js.map +1 -0
  84. package/packages/cli/dist/commands/watch.d.ts +1 -0
  85. package/packages/cli/dist/commands/watch.js +46 -0
  86. package/packages/cli/dist/commands/watch.js.map +1 -0
  87. package/packages/cli/dist/config/defaults.d.ts +2 -0
  88. package/packages/cli/dist/config/defaults.js +47 -0
  89. package/packages/cli/dist/config/defaults.js.map +1 -0
  90. package/packages/cli/dist/config/load.d.ts +4 -0
  91. package/packages/cli/dist/config/load.js +29 -0
  92. package/packages/cli/dist/config/load.js.map +1 -0
  93. package/packages/cli/dist/config/load.test.d.ts +1 -0
  94. package/packages/cli/dist/config/load.test.js +51 -0
  95. package/packages/cli/dist/config/load.test.js.map +1 -0
  96. package/packages/cli/dist/config/types.d.ts +32 -0
  97. package/packages/cli/dist/config/types.js +24 -0
  98. package/packages/cli/dist/config/types.js.map +1 -0
  99. package/packages/cli/dist/config/types.test.d.ts +1 -0
  100. package/packages/cli/dist/config/types.test.js +31 -0
  101. package/packages/cli/dist/config/types.test.js.map +1 -0
  102. package/packages/cli/dist/docker/compose.d.ts +5 -0
  103. package/packages/cli/dist/docker/compose.js +75 -0
  104. package/packages/cli/dist/docker/compose.js.map +1 -0
  105. package/packages/cli/dist/embedding/stub.d.ts +6 -0
  106. package/packages/cli/dist/embedding/stub.js +29 -0
  107. package/packages/cli/dist/embedding/stub.js.map +1 -0
  108. package/packages/cli/dist/embedding/stub.test.d.ts +1 -0
  109. package/packages/cli/dist/embedding/stub.test.js +31 -0
  110. package/packages/cli/dist/embedding/stub.test.js.map +1 -0
  111. package/packages/cli/dist/phase1/pipeline.d.ts +1 -0
  112. package/packages/cli/dist/phase1/pipeline.js +145 -0
  113. package/packages/cli/dist/phase1/pipeline.js.map +1 -0
  114. package/packages/cli/dist/phase2/deep-index.d.ts +1 -0
  115. package/packages/cli/dist/phase2/deep-index.js +105 -0
  116. package/packages/cli/dist/phase2/deep-index.js.map +1 -0
  117. package/packages/cli/dist/qdrant/upsert.d.ts +14 -0
  118. package/packages/cli/dist/qdrant/upsert.js +30 -0
  119. package/packages/cli/dist/qdrant/upsert.js.map +1 -0
  120. package/packages/cli/dist/scope/allowlist.d.ts +11 -0
  121. package/packages/cli/dist/scope/allowlist.js +36 -0
  122. package/packages/cli/dist/scope/allowlist.js.map +1 -0
  123. package/packages/cli/dist/scope/allowlist.test.d.ts +1 -0
  124. package/packages/cli/dist/scope/allowlist.test.js +23 -0
  125. package/packages/cli/dist/scope/allowlist.test.js.map +1 -0
  126. package/packages/cli/dist/scope/ignore.d.ts +2 -0
  127. package/packages/cli/dist/scope/ignore.js +80 -0
  128. package/packages/cli/dist/scope/ignore.js.map +1 -0
  129. package/packages/cli/dist/scope/ignore.test.d.ts +1 -0
  130. package/packages/cli/dist/scope/ignore.test.js +71 -0
  131. package/packages/cli/dist/scope/ignore.test.js.map +1 -0
  132. package/packages/cli/package.json +46 -0
  133. package/packages/cli/src/chunking/chunker.test.ts +54 -0
  134. package/packages/cli/src/chunking/chunker.ts +151 -0
  135. package/packages/cli/src/chunking/hash.test.ts +41 -0
  136. package/packages/cli/src/chunking/hash.ts +21 -0
  137. package/packages/cli/src/chunking/types.test.ts +28 -0
  138. package/packages/cli/src/chunking/types.ts +43 -0
  139. package/packages/cli/src/cli/index.ts +79 -0
  140. package/packages/cli/src/commands/deep-index.ts +16 -0
  141. package/packages/cli/src/commands/doctor.ts +32 -0
  142. package/packages/cli/src/commands/down.ts +12 -0
  143. package/packages/cli/src/commands/explain.ts +22 -0
  144. package/packages/cli/src/commands/init.ts +37 -0
  145. package/packages/cli/src/commands/query.ts +49 -0
  146. package/packages/cli/src/commands/reset.ts +30 -0
  147. package/packages/cli/src/commands/scaffold.ts +55 -0
  148. package/packages/cli/src/commands/update.ts +22 -0
  149. package/packages/cli/src/commands/watch.ts +47 -0
  150. package/packages/cli/src/config/defaults.ts +49 -0
  151. package/packages/cli/src/config/load.test.ts +55 -0
  152. package/packages/cli/src/config/load.ts +33 -0
  153. package/packages/cli/src/config/types.test.ts +43 -0
  154. package/packages/cli/src/config/types.ts +49 -0
  155. package/packages/cli/src/docker/compose.ts +75 -0
  156. package/packages/cli/src/embedding/stub.test.ts +35 -0
  157. package/packages/cli/src/embedding/stub.ts +32 -0
  158. package/packages/cli/src/phase1/pipeline.ts +164 -0
  159. package/packages/cli/src/phase2/deep-index.ts +120 -0
  160. package/packages/cli/src/qdrant/upsert.ts +45 -0
  161. package/packages/cli/src/scope/allowlist.test.ts +25 -0
  162. package/packages/cli/src/scope/allowlist.ts +38 -0
  163. package/packages/cli/src/scope/ignore.test.ts +71 -0
  164. package/packages/cli/src/scope/ignore.ts +86 -0
  165. package/packages/cli/tsconfig.json +16 -0
  166. package/packages/server/coverage/lcov-report/base.css +224 -0
  167. package/packages/server/coverage/lcov-report/block-navigation.js +87 -0
  168. package/packages/server/coverage/lcov-report/favicon.png +0 -0
  169. package/packages/server/coverage/lcov-report/index.html +116 -0
  170. package/packages/server/coverage/lcov-report/prettify.css +1 -0
  171. package/packages/server/coverage/lcov-report/prettify.js +2 -0
  172. package/packages/server/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  173. package/packages/server/coverage/lcov-report/sorter.js +210 -0
  174. package/packages/server/coverage/lcov-report/stub.ts.html +184 -0
  175. package/packages/server/coverage/lcov.info +57 -0
  176. package/packages/server/coverage/tmp/coverage-26012-1770055894042-0.json +1 -0
  177. package/packages/server/coverage/tmp/coverage-26013-1770055894077-0.json +1 -0
  178. package/packages/server/dist/api/explain.d.ts +6 -0
  179. package/packages/server/dist/api/explain.js +16 -0
  180. package/packages/server/dist/api/explain.js.map +1 -0
  181. package/packages/server/dist/api/health.d.ts +7 -0
  182. package/packages/server/dist/api/health.js +43 -0
  183. package/packages/server/dist/api/health.js.map +1 -0
  184. package/packages/server/dist/api/refresh.d.ts +2 -0
  185. package/packages/server/dist/api/refresh.js +8 -0
  186. package/packages/server/dist/api/refresh.js.map +1 -0
  187. package/packages/server/dist/api/search.d.ts +28 -0
  188. package/packages/server/dist/api/search.js +36 -0
  189. package/packages/server/dist/api/search.js.map +1 -0
  190. package/packages/server/dist/api/system.d.ts +6 -0
  191. package/packages/server/dist/api/system.js +17 -0
  192. package/packages/server/dist/api/system.js.map +1 -0
  193. package/packages/server/dist/embedding/stub.d.ts +7 -0
  194. package/packages/server/dist/embedding/stub.js +30 -0
  195. package/packages/server/dist/embedding/stub.js.map +1 -0
  196. package/packages/server/dist/embedding/stub.test.d.ts +1 -0
  197. package/packages/server/dist/embedding/stub.test.js +25 -0
  198. package/packages/server/dist/embedding/stub.test.js.map +1 -0
  199. package/packages/server/dist/index.d.ts +1 -0
  200. package/packages/server/dist/index.js +26 -0
  201. package/packages/server/dist/index.js.map +1 -0
  202. package/packages/server/dist/qdrant/client.d.ts +24 -0
  203. package/packages/server/dist/qdrant/client.js +55 -0
  204. package/packages/server/dist/qdrant/client.js.map +1 -0
  205. package/packages/server/package.json +37 -0
  206. package/packages/server/src/api/explain.ts +24 -0
  207. package/packages/server/src/api/health.ts +50 -0
  208. package/packages/server/src/api/refresh.ts +9 -0
  209. package/packages/server/src/api/search.ts +57 -0
  210. package/packages/server/src/api/system.ts +25 -0
  211. package/packages/server/src/embedding/stub.test.ts +28 -0
  212. package/packages/server/src/embedding/stub.ts +33 -0
  213. package/packages/server/src/index.ts +29 -0
  214. package/packages/server/src/qdrant/client.ts +92 -0
  215. package/packages/server/tsconfig.json +16 -0
@@ -0,0 +1,44 @@
1
+ import chalk from "chalk";
2
+ const DEFAULT_SERVER_URL = "http://127.0.0.1:31415";
3
+ async function search(query, limit, baseUrl) {
4
+ const res = await fetch(`${baseUrl}/search`, {
5
+ method: "POST",
6
+ headers: { "Content-Type": "application/json" },
7
+ body: JSON.stringify({ query, limit }),
8
+ });
9
+ if (!res.ok) {
10
+ console.error(chalk.red("Search failed:"), res.status, await res.text());
11
+ process.exit(1);
12
+ }
13
+ const data = (await res.json());
14
+ if (data.systemMaps?.length) {
15
+ console.log(chalk.bold("System maps"));
16
+ for (const sm of data.systemMaps.slice(0, 3)) {
17
+ console.log(chalk.dim(sm.path ?? ""), "\n", sm.text.slice(0, 200) + (sm.text.length > 200 ? "..." : ""), "\n");
18
+ }
19
+ }
20
+ if (data.moduleSummaries?.length) {
21
+ console.log(chalk.bold("Module summaries"));
22
+ for (const ms of data.moduleSummaries.slice(0, 5)) {
23
+ console.log(chalk.dim(ms.path ?? ""), "\n", ms.text.slice(0, 150) + (ms.text.length > 150 ? "..." : ""), "\n");
24
+ }
25
+ }
26
+ if (data.chunks?.length) {
27
+ console.log(chalk.bold("Chunks"));
28
+ for (const c of data.chunks.slice(0, 5)) {
29
+ console.log(chalk.dim(c.path ?? ""), c.score != null ? chalk.dim(`(${c.score})`) : "", "\n", c.text.slice(0, 200) + (c.text.length > 200 ? "..." : ""), "\n");
30
+ }
31
+ }
32
+ }
33
+ export async function runQuery(_cwd, text) {
34
+ const baseUrl = process.env.MEM_SERVER_URL ?? DEFAULT_SERVER_URL;
35
+ try {
36
+ await search(text, 15, baseUrl);
37
+ }
38
+ catch (e) {
39
+ console.error(chalk.red("Request failed:"), e.message);
40
+ console.log(chalk.dim("Ensure memory server is running (mem scaffold)."));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KACvC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;IACF,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAChK,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function runReset(cwd: string, options?: {
2
+ volumes?: boolean;
3
+ }): void;
@@ -0,0 +1,28 @@
1
+ import { rmSync, existsSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import chalk from "chalk";
4
+ import { DEEP_INDEX_STATE_FILE } from "../config/types.js";
5
+ export function runReset(cwd, options = {}) {
6
+ const stateDir = join(cwd, ".mem", "state");
7
+ const deepIndexPath = join(cwd, DEEP_INDEX_STATE_FILE);
8
+ if (existsSync(deepIndexPath)) {
9
+ rmSync(deepIndexPath, { force: true });
10
+ console.log(chalk.green("Removed"), DEEP_INDEX_STATE_FILE);
11
+ }
12
+ if (existsSync(stateDir)) {
13
+ try {
14
+ const files = readdirSync(stateDir);
15
+ for (const f of files) {
16
+ rmSync(join(stateDir, f), { force: true });
17
+ }
18
+ }
19
+ catch {
20
+ // ignore
21
+ }
22
+ }
23
+ console.log(chalk.green("Reset complete. Index state and deep-index progress cleared."));
24
+ if (options.volumes) {
25
+ console.log(chalk.dim("To wipe Qdrant volume, run: docker compose down -v"));
26
+ }
27
+ }
28
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,UAAiC,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAEvD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runScaffold(cwd: string): Promise<void>;
@@ -0,0 +1,52 @@
1
+ import { spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import chalk from "chalk";
5
+ import { configExists } from "../config/load.js";
6
+ import { dockerComposeUp, waitForQdrantHealth } from "../docker/compose.js";
7
+ import { runPhase1 } from "../phase1/pipeline.js";
8
+ const __dirname = fileURLToPath(new URL(".", import.meta.url));
9
+ export async function runScaffold(cwd) {
10
+ if (!configExists(cwd)) {
11
+ console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
12
+ process.exit(1);
13
+ }
14
+ console.log(chalk.bold("Project Memory Scaffold (Phase 1)\n"));
15
+ console.log(chalk.dim("Starting Docker Compose..."));
16
+ try {
17
+ dockerComposeUp(cwd);
18
+ }
19
+ catch (err) {
20
+ console.error(chalk.red("Docker Compose failed:"), err.message);
21
+ process.exit(1);
22
+ }
23
+ console.log(chalk.dim("Waiting for Qdrant..."));
24
+ try {
25
+ await waitForQdrantHealth();
26
+ }
27
+ catch (err) {
28
+ console.error(chalk.red("Qdrant health check failed:"), err.message);
29
+ process.exit(1);
30
+ }
31
+ console.log(chalk.green("✓"), "Qdrant ready");
32
+ console.log(chalk.dim("Phase 1: file tree, symbol index, module summaries, system maps, embedding..."));
33
+ try {
34
+ await runPhase1(cwd);
35
+ }
36
+ catch (err) {
37
+ console.error(chalk.red("Phase 1 failed:"), err.message);
38
+ process.exit(1);
39
+ }
40
+ const serverPath = join(__dirname, "..", "..", "..", "server", "dist", "index.js");
41
+ const env = { ...process.env, MEM_CWD: cwd };
42
+ try {
43
+ spawn(process.execPath, [serverPath], { env, stdio: "ignore", detached: true }).unref();
44
+ }
45
+ catch {
46
+ console.log(chalk.yellow("Could not start memory server. Run: cd packages/server && MEM_CWD=" + cwd + " npm start"));
47
+ }
48
+ console.log(chalk.green("✓"), "Memory server started (detached)");
49
+ console.log(chalk.green("\nScaffold Phase 1 complete. Cursor integration ready."));
50
+ console.log(chalk.dim("Run"), chalk.cyan("mem deep-index"), chalk.dim("to embed remaining chunks (Phase 2)."));
51
+ }
52
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,mBAAmB,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC,CAAC;IACxG,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oEAAoE,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACjH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Incremental update: re-run Phase 1 (full scope+ignore, chunk, embed Phase 1 points).
3
+ * V1: full Phase 1 re-run; true incremental (changed files only) can be added later via manifest.
4
+ */
5
+ export declare function runUpdate(cwd: string): Promise<void>;
@@ -0,0 +1,23 @@
1
+ import chalk from "chalk";
2
+ import { configExists } from "../config/load.js";
3
+ import { runPhase1 } from "../phase1/pipeline.js";
4
+ /**
5
+ * Incremental update: re-run Phase 1 (full scope+ignore, chunk, embed Phase 1 points).
6
+ * V1: full Phase 1 re-run; true incremental (changed files only) can be added later via manifest.
7
+ */
8
+ export async function runUpdate(cwd) {
9
+ if (!configExists(cwd)) {
10
+ console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
11
+ process.exit(1);
12
+ }
13
+ console.log(chalk.bold("Project Memory Update\n"));
14
+ try {
15
+ await runPhase1(cwd);
16
+ console.log(chalk.green("Update complete."));
17
+ }
18
+ catch (err) {
19
+ console.error(chalk.red("Update failed:"), err.message);
20
+ process.exit(1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runWatch(cwd: string): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import chalk from "chalk";
2
+ import { configExists, loadConfig } from "../config/load.js";
3
+ import { listInScopeFiles } from "../scope/allowlist.js";
4
+ import { createIgnoreFilter } from "../scope/ignore.js";
5
+ import { toRelativePath } from "../scope/allowlist.js";
6
+ import { runUpdate } from "./update.js";
7
+ export async function runWatch(cwd) {
8
+ if (!configExists(cwd)) {
9
+ console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
10
+ process.exit(1);
11
+ }
12
+ const config = loadConfig(cwd);
13
+ const isIgnored = createIgnoreFilter(cwd, config.indexing?.exclude ?? []);
14
+ const inScopePaths = listInScopeFiles(cwd, config);
15
+ const eligiblePaths = [];
16
+ for (const abs of inScopePaths) {
17
+ const rel = toRelativePath(cwd, abs);
18
+ if (!isIgnored(rel))
19
+ eligiblePaths.push(abs);
20
+ }
21
+ const { default: chokidar } = await import("chokidar");
22
+ let debounceMs = 2000;
23
+ let timeout = null;
24
+ const watcher = chokidar.watch(eligiblePaths, {
25
+ ignoreInitial: true,
26
+ awaitWriteFinish: { stabilityThreshold: 500 },
27
+ });
28
+ watcher.on("change", () => {
29
+ if (timeout)
30
+ clearTimeout(timeout);
31
+ timeout = setTimeout(async () => {
32
+ console.log(chalk.dim("Change detected, running update..."));
33
+ try {
34
+ await runUpdate(cwd);
35
+ }
36
+ catch (e) {
37
+ console.error(chalk.red("Update failed:"), e.message);
38
+ }
39
+ timeout = null;
40
+ }, debounceMs);
41
+ });
42
+ console.log(chalk.bold("Project Memory Watch"));
43
+ console.log(chalk.dim("Watching"), eligiblePaths.length, "files. Ctrl+C to stop.");
44
+ console.log(chalk.dim("Run mem update manually or wait for file changes."));
45
+ }
46
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,IAAI,OAAO,GAAyC,IAAI,CAAC;IAEzD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5C,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE;KAC9C,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,IAAI,OAAO;YAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getDefaultConfigYaml(): string;
2
+ export declare function getDefaultMemignore(): string;
@@ -0,0 +1,47 @@
1
+ import { DEFAULT_CONFIG } from "./types.js";
2
+ export function getDefaultConfigYaml() {
3
+ const c = {
4
+ indexing: {
5
+ include: ["src/**", "docs/**"],
6
+ exclude: [],
7
+ },
8
+ phase1: DEFAULT_CONFIG.phase1,
9
+ qdrant: DEFAULT_CONFIG.qdrant,
10
+ chunk: DEFAULT_CONFIG.chunk,
11
+ embedding: DEFAULT_CONFIG.embedding,
12
+ };
13
+ return `# Project Memory config
14
+ # indexing.include: allowlist globs (only these paths are eligible). Omit to index repo root.
15
+ indexing:
16
+ include:
17
+ - "src/**"
18
+ - "docs/**"
19
+ exclude: []
20
+
21
+ phase1:
22
+ maxEntrypointFiles: ${c.phase1.maxEntrypointFiles}
23
+ maxEntrypointChunks: ${c.phase1.maxEntrypointChunks}
24
+
25
+ qdrant:
26
+ host: ${c.qdrant.host}
27
+ port: ${c.qdrant.port}
28
+ collection: ${c.qdrant.collection}
29
+
30
+ chunk:
31
+ maxLines: ${c.chunk.maxLines}
32
+ minLines: ${c.chunk.minLines}
33
+
34
+ embedding:
35
+ provider: ${c.embedding.provider}
36
+ `;
37
+ }
38
+ export function getDefaultMemignore() {
39
+ return `# Project Memory ignore rules (gitignore-style)
40
+ # Tests
41
+ **/*.test.*
42
+ **/*.spec.*
43
+ **/__tests__/**
44
+ **/tests/**
45
+ `;
46
+ }
47
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,GAAc;QACnB,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9B,OAAO,EAAE,EAAE;SACZ;QACD,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,SAAS,EAAE,cAAc,CAAC,SAAS;KACpC,CAAC;IACF,OAAO;;;;;;;;;wBASe,CAAC,CAAC,MAAO,CAAC,kBAAkB;yBAC3B,CAAC,CAAC,MAAO,CAAC,mBAAmB;;;UAG5C,CAAC,CAAC,MAAO,CAAC,IAAI;UACd,CAAC,CAAC,MAAO,CAAC,IAAI;gBACR,CAAC,CAAC,MAAO,CAAC,UAAU;;;cAGtB,CAAC,CAAC,KAAM,CAAC,QAAQ;cACjB,CAAC,CAAC,KAAM,CAAC,QAAQ;;;cAGjB,CAAC,CAAC,SAAU,CAAC,QAAQ;CAClC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;CAMR,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MemConfig } from "./types.js";
2
+ export declare function loadConfig(cwd: string): MemConfig;
3
+ export declare function getConfigPath(cwd: string): string;
4
+ export declare function configExists(cwd: string): boolean;
@@ -0,0 +1,29 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import yaml from "js-yaml";
4
+ import { DEFAULT_CONFIG, CONFIG_FILE } from "./types.js";
5
+ function mergeConfig(loaded) {
6
+ return {
7
+ indexing: loaded.indexing ?? DEFAULT_CONFIG.indexing,
8
+ phase1: { ...DEFAULT_CONFIG.phase1, ...loaded.phase1 },
9
+ qdrant: { ...DEFAULT_CONFIG.qdrant, ...loaded.qdrant },
10
+ chunk: { ...DEFAULT_CONFIG.chunk, ...loaded.chunk },
11
+ embedding: { ...DEFAULT_CONFIG.embedding, ...loaded.embedding },
12
+ };
13
+ }
14
+ export function loadConfig(cwd) {
15
+ const path = join(cwd, CONFIG_FILE);
16
+ if (!existsSync(path)) {
17
+ return mergeConfig({});
18
+ }
19
+ const raw = readFileSync(path, "utf8");
20
+ const parsed = yaml.load(raw);
21
+ return mergeConfig(parsed ?? {});
22
+ }
23
+ export function getConfigPath(cwd) {
24
+ return join(cwd, CONFIG_FILE);
25
+ }
26
+ export function configExists(cwd) {
27
+ return existsSync(join(cwd, CONFIG_FILE));
28
+ }
29
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,SAAS,WAAW,CAAC,MAAiB;IACpC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACpD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;QACtD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;QACtD,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;QACnD,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAA0B,CAAC;IACvD,OAAO,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { mkdtempSync, writeFileSync, rmSync, mkdirSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { loadConfig, getConfigPath, configExists } from "./load.js";
7
+ describe("config load", () => {
8
+ it("loadConfig with no file returns merged defaults", () => {
9
+ const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
10
+ try {
11
+ const config = loadConfig(cwd);
12
+ assert.strictEqual(config.phase1?.maxEntrypointFiles, 50);
13
+ assert.strictEqual(config.qdrant?.port, 6333);
14
+ assert.strictEqual(config.embedding?.provider, "local");
15
+ }
16
+ finally {
17
+ rmSync(cwd, { recursive: true, force: true });
18
+ }
19
+ });
20
+ it("getConfigPath returns .mem/config.yml under cwd", () => {
21
+ const cwd = "/some/repo";
22
+ assert.ok(getConfigPath(cwd).endsWith(".mem/config.yml"));
23
+ assert.ok(getConfigPath(cwd).includes("some"));
24
+ });
25
+ it("configExists returns false when file missing", () => {
26
+ const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
27
+ try {
28
+ assert.strictEqual(configExists(cwd), false);
29
+ }
30
+ finally {
31
+ rmSync(cwd, { recursive: true, force: true });
32
+ }
33
+ });
34
+ it("loadConfig merges overrides when file exists", () => {
35
+ const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
36
+ const configPath = join(cwd, ".mem", "config.yml");
37
+ mkdirSync(join(cwd, ".mem"), { recursive: true });
38
+ writeFileSync(configPath, "phase1:\n maxEntrypointFiles: 10\nqdrant:\n port: 9999\n", "utf8");
39
+ try {
40
+ const config = loadConfig(cwd);
41
+ assert.strictEqual(config.phase1?.maxEntrypointFiles, 10);
42
+ assert.strictEqual(config.qdrant?.port, 9999);
43
+ assert.strictEqual(config.embedding?.provider, "local");
44
+ assert.strictEqual(configExists(cwd), true);
45
+ }
46
+ finally {
47
+ rmSync(cwd, { recursive: true, force: true });
48
+ }
49
+ });
50
+ });
51
+ //# sourceMappingURL=load.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.test.js","sourceRoot":"","sources":["../../src/config/load.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface MemConfig {
2
+ indexing?: {
3
+ include?: string[];
4
+ exclude?: string[];
5
+ };
6
+ phase1?: {
7
+ maxEntrypointFiles?: number;
8
+ maxEntrypointChunks?: number;
9
+ };
10
+ qdrant?: {
11
+ host?: string;
12
+ port?: number;
13
+ collection?: string;
14
+ };
15
+ chunk?: {
16
+ maxLines?: number;
17
+ minLines?: number;
18
+ };
19
+ embedding?: {
20
+ provider?: string;
21
+ };
22
+ }
23
+ export declare const DEFAULT_CONFIG: Required<Pick<MemConfig, "phase1" | "qdrant" | "chunk" | "embedding">> & {
24
+ indexing: {
25
+ include?: string[];
26
+ exclude?: string[];
27
+ };
28
+ };
29
+ export declare const CONFIG_DIR = ".mem";
30
+ export declare const CONFIG_FILE = ".mem/config.yml";
31
+ export declare const MEMIGNORE_FILE = ".memignore";
32
+ export declare const DEEP_INDEX_STATE_FILE = ".mem/state/deep-index.json";
@@ -0,0 +1,24 @@
1
+ export const DEFAULT_CONFIG = {
2
+ phase1: {
3
+ maxEntrypointFiles: 50,
4
+ maxEntrypointChunks: 300,
5
+ },
6
+ qdrant: {
7
+ host: "127.0.0.1",
8
+ port: 6333,
9
+ collection: "project_memory",
10
+ },
11
+ chunk: {
12
+ maxLines: 400,
13
+ minLines: 50,
14
+ },
15
+ embedding: {
16
+ provider: "local",
17
+ },
18
+ indexing: {},
19
+ };
20
+ export const CONFIG_DIR = ".mem";
21
+ export const CONFIG_FILE = ".mem/config.yml";
22
+ export const MEMIGNORE_FILE = ".memignore";
23
+ export const DEEP_INDEX_STATE_FILE = ".mem/state/deep-index.json";
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,cAAc,GAEoC;IAC7D,MAAM,EAAE;QACN,kBAAkB,EAAE,EAAE;QACtB,mBAAmB,EAAE,GAAG;KACzB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,gBAAgB;KAC7B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,OAAO;KAClB;IACD,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { DEFAULT_CONFIG, CONFIG_DIR, CONFIG_FILE, MEMIGNORE_FILE, DEEP_INDEX_STATE_FILE, } from "./types.js";
4
+ describe("config types", () => {
5
+ it("DEFAULT_CONFIG has phase1 caps", () => {
6
+ assert.strictEqual(DEFAULT_CONFIG.phase1.maxEntrypointFiles, 50);
7
+ assert.strictEqual(DEFAULT_CONFIG.phase1.maxEntrypointChunks, 300);
8
+ });
9
+ it("DEFAULT_CONFIG has qdrant defaults", () => {
10
+ assert.strictEqual(DEFAULT_CONFIG.qdrant.host, "127.0.0.1");
11
+ assert.strictEqual(DEFAULT_CONFIG.qdrant.port, 6333);
12
+ assert.strictEqual(DEFAULT_CONFIG.qdrant.collection, "project_memory");
13
+ });
14
+ it("DEFAULT_CONFIG has chunk defaults", () => {
15
+ assert.strictEqual(DEFAULT_CONFIG.chunk.maxLines, 400);
16
+ assert.ok((DEFAULT_CONFIG.chunk.minLines ?? 0) >= 0);
17
+ });
18
+ it("CONFIG_DIR is .mem", () => {
19
+ assert.strictEqual(CONFIG_DIR, ".mem");
20
+ });
21
+ it("CONFIG_FILE is .mem/config.yml", () => {
22
+ assert.strictEqual(CONFIG_FILE, ".mem/config.yml");
23
+ });
24
+ it("MEMIGNORE_FILE is .memignore", () => {
25
+ assert.strictEqual(MEMIGNORE_FILE, ".memignore");
26
+ });
27
+ it("DEEP_INDEX_STATE_FILE is .mem/state/deep-index.json", () => {
28
+ assert.strictEqual(DEEP_INDEX_STATE_FILE, ".mem/state/deep-index.json");
29
+ });
30
+ });
31
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/config/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,WAAW,CAAC,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function dockerComposeUp(cwd: string): void;
2
+ export declare function dockerComposeDown(cwd: string): void;
3
+ export declare function waitForQdrantHealth(timeoutMs?: number): Promise<void>;
4
+ export declare function checkDockerAvailable(cwd: string): boolean;
5
+ export declare function checkQdrantHealthy(): Promise<boolean>;
@@ -0,0 +1,75 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ const QDRANT_HEALTH_URL = "http://127.0.0.1:6333/health";
5
+ const HEALTH_POLL_MS = 1000;
6
+ const HEALTH_TIMEOUT_MS = 60_000;
7
+ function getComposeDir(cwd) {
8
+ const atRoot = join(cwd, "docker-compose.yml");
9
+ const atMem = join(cwd, ".mem", "docker-compose.yml");
10
+ if (existsSync(atRoot))
11
+ return cwd;
12
+ if (existsSync(atMem))
13
+ return join(cwd, ".mem");
14
+ return cwd;
15
+ }
16
+ function composeCmd(cwd) {
17
+ try {
18
+ execSync("docker compose version", { stdio: "pipe", cwd });
19
+ return "docker compose";
20
+ }
21
+ catch {
22
+ try {
23
+ execSync("docker-compose --version", { stdio: "pipe", cwd });
24
+ return "docker-compose";
25
+ }
26
+ catch {
27
+ throw new Error("Docker Compose not found. Install Docker and Docker Compose.");
28
+ }
29
+ }
30
+ }
31
+ export function dockerComposeUp(cwd) {
32
+ const dir = getComposeDir(cwd);
33
+ const cmd = composeCmd(dir);
34
+ execSync(`${cmd} up -d`, { stdio: "inherit", cwd: dir });
35
+ }
36
+ export function dockerComposeDown(cwd) {
37
+ const dir = getComposeDir(cwd);
38
+ const cmd = composeCmd(dir);
39
+ execSync(`${cmd} down`, { stdio: "inherit", cwd: dir });
40
+ }
41
+ export function waitForQdrantHealth(timeoutMs = HEALTH_TIMEOUT_MS) {
42
+ const start = Date.now();
43
+ return new Promise((resolve, reject) => {
44
+ function poll() {
45
+ if (Date.now() - start > timeoutMs) {
46
+ reject(new Error("Qdrant health check timed out"));
47
+ return;
48
+ }
49
+ fetch(QDRANT_HEALTH_URL)
50
+ .then((r) => {
51
+ if (r.ok)
52
+ resolve();
53
+ else
54
+ setTimeout(poll, HEALTH_POLL_MS);
55
+ })
56
+ .catch(() => setTimeout(poll, HEALTH_POLL_MS));
57
+ }
58
+ poll();
59
+ });
60
+ }
61
+ export function checkDockerAvailable(cwd) {
62
+ try {
63
+ composeCmd(getComposeDir(cwd));
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ export function checkQdrantHealthy() {
71
+ return fetch(QDRANT_HEALTH_URL)
72
+ .then((r) => r.ok)
73
+ .catch(() => false);
74
+ }
75
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAS,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AACzD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,QAAQ,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,GAAG,GAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,YAAoB,iBAAiB;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,SAAS,IAAI;YACX,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC;iBACrB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,IAAI,CAAC,CAAC,EAAE;oBAAE,OAAO,EAAE,CAAC;;oBACf,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACxC,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,KAAK,CAAC,iBAAiB,CAAC;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Stub embedder: must match server's stub (same size and logic) for vector compatibility.
3
+ */
4
+ export declare function embedText(text: string): number[];
5
+ export declare function embedBatch(texts: string[]): number[][];
6
+ export declare function getVectorSize(): number;
@@ -0,0 +1,29 @@
1
+ const VECTOR_SIZE = 384;
2
+ function simpleHash(str) {
3
+ let h = 0;
4
+ for (let i = 0; i < str.length; i++) {
5
+ h = (h * 31 + str.charCodeAt(i)) >>> 0;
6
+ }
7
+ return h;
8
+ }
9
+ /**
10
+ * Stub embedder: must match server's stub (same size and logic) for vector compatibility.
11
+ */
12
+ export function embedText(text) {
13
+ const vec = [];
14
+ const words = text.split(/\s+/).filter(Boolean);
15
+ for (let i = 0; i < VECTOR_SIZE; i++) {
16
+ const seed = words[i % words.length]
17
+ ? simpleHash(words[i % words.length]) + i * 31
18
+ : i;
19
+ vec.push(Math.sin(seed) * 0.5 + 0.5);
20
+ }
21
+ return vec;
22
+ }
23
+ export function embedBatch(texts) {
24
+ return texts.map(embedText);
25
+ }
26
+ export function getVectorSize() {
27
+ return VECTOR_SIZE;
28
+ }
29
+ //# sourceMappingURL=stub.js.map