stellavault 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/api/dashboard.d.ts +3 -0
  3. package/packages/core/{src/api/dashboard.ts → dist/api/dashboard.js} +8 -11
  4. package/packages/core/dist/api/graph-data.d.ts +11 -0
  5. package/packages/core/dist/api/graph-data.js +255 -0
  6. package/packages/core/dist/api/pwa.d.ts +3 -0
  7. package/packages/core/{src/api/pwa.ts → dist/api/pwa.js} +27 -32
  8. package/packages/core/dist/api/server.d.ts +16 -0
  9. package/packages/core/dist/api/server.js +718 -0
  10. package/packages/core/dist/capture/voice.d.ts +24 -0
  11. package/packages/core/dist/capture/voice.js +135 -0
  12. package/packages/core/{src/cloud/index.ts → dist/cloud/index.d.ts} +1 -0
  13. package/packages/core/dist/cloud/index.js +2 -0
  14. package/packages/core/dist/cloud/sync.d.ts +29 -0
  15. package/packages/core/dist/cloud/sync.js +137 -0
  16. package/packages/core/dist/config.d.ts +27 -0
  17. package/packages/core/dist/config.js +55 -0
  18. package/packages/core/dist/federation/credits.d.ts +26 -0
  19. package/packages/core/dist/federation/credits.js +56 -0
  20. package/packages/core/dist/federation/identity.d.ts +14 -0
  21. package/packages/core/dist/federation/identity.js +74 -0
  22. package/packages/core/{src/federation/index.ts → dist/federation/index.d.ts} +1 -2
  23. package/packages/core/dist/federation/index.js +5 -0
  24. package/packages/core/dist/federation/node.d.ts +31 -0
  25. package/packages/core/dist/federation/node.js +216 -0
  26. package/packages/core/dist/federation/privacy.d.ts +8 -0
  27. package/packages/core/dist/federation/privacy.js +40 -0
  28. package/packages/core/dist/federation/reputation.d.ts +37 -0
  29. package/packages/core/dist/federation/reputation.js +139 -0
  30. package/packages/core/dist/federation/search.d.ts +19 -0
  31. package/packages/core/dist/federation/search.js +101 -0
  32. package/packages/core/dist/federation/sharing.d.ts +72 -0
  33. package/packages/core/dist/federation/sharing.js +246 -0
  34. package/packages/core/dist/federation/trust.d.ts +15 -0
  35. package/packages/core/dist/federation/trust.js +60 -0
  36. package/packages/core/dist/federation/types.d.ts +40 -0
  37. package/packages/core/dist/federation/types.js +3 -0
  38. package/packages/core/dist/i18n/index.d.ts +6 -0
  39. package/packages/core/dist/i18n/index.js +81 -0
  40. package/packages/core/{src/index.ts → dist/index.d.ts} +46 -65
  41. package/packages/core/dist/index.js +69 -0
  42. package/packages/core/dist/indexer/chunker.d.ts +14 -0
  43. package/packages/core/dist/indexer/chunker.js +148 -0
  44. package/packages/core/dist/indexer/embedder.d.ts +8 -0
  45. package/packages/core/dist/indexer/embedder.js +3 -0
  46. package/packages/core/dist/indexer/index.d.ts +28 -0
  47. package/packages/core/dist/indexer/index.js +74 -0
  48. package/packages/core/dist/indexer/local-embedder.d.ts +3 -0
  49. package/packages/core/dist/indexer/local-embedder.js +29 -0
  50. package/packages/core/dist/indexer/scanner.d.ts +11 -0
  51. package/packages/core/dist/indexer/scanner.js +137 -0
  52. package/packages/core/dist/indexer/watcher.d.ts +19 -0
  53. package/packages/core/dist/indexer/watcher.js +49 -0
  54. package/packages/core/dist/intelligence/code-linker.d.ts +20 -0
  55. package/packages/core/dist/intelligence/code-linker.js +88 -0
  56. package/packages/core/dist/intelligence/contradiction-detector.d.ts +20 -0
  57. package/packages/core/dist/intelligence/contradiction-detector.js +115 -0
  58. package/packages/core/dist/intelligence/decay-engine.d.ts +27 -0
  59. package/packages/core/dist/intelligence/decay-engine.js +190 -0
  60. package/packages/core/dist/intelligence/duplicate-detector.d.ts +20 -0
  61. package/packages/core/dist/intelligence/duplicate-detector.js +55 -0
  62. package/packages/core/dist/intelligence/fsrs.d.ts +43 -0
  63. package/packages/core/dist/intelligence/fsrs.js +70 -0
  64. package/packages/core/dist/intelligence/gap-detector.d.ts +25 -0
  65. package/packages/core/dist/intelligence/gap-detector.js +78 -0
  66. package/packages/core/dist/intelligence/learning-path.d.ts +31 -0
  67. package/packages/core/dist/intelligence/learning-path.js +53 -0
  68. package/packages/core/dist/intelligence/notifications.d.ts +31 -0
  69. package/packages/core/dist/intelligence/notifications.js +65 -0
  70. package/packages/core/dist/intelligence/predictive-gaps.d.ts +14 -0
  71. package/packages/core/dist/intelligence/predictive-gaps.js +74 -0
  72. package/packages/core/dist/intelligence/semantic-versioning.d.ts +37 -0
  73. package/packages/core/dist/intelligence/semantic-versioning.js +68 -0
  74. package/packages/core/dist/intelligence/types.d.ts +28 -0
  75. package/packages/core/dist/intelligence/types.js +3 -0
  76. package/packages/core/dist/mcp/custom-tools.d.ts +29 -0
  77. package/packages/core/dist/mcp/custom-tools.js +70 -0
  78. package/packages/core/{src/mcp/index.ts → dist/mcp/index.d.ts} +1 -0
  79. package/packages/core/dist/mcp/index.js +2 -0
  80. package/packages/core/dist/mcp/server.d.ts +49 -0
  81. package/packages/core/dist/mcp/server.js +151 -0
  82. package/packages/core/dist/mcp/tools/agentic-graph.d.ts +87 -0
  83. package/packages/core/dist/mcp/tools/agentic-graph.js +88 -0
  84. package/packages/core/dist/mcp/tools/brief.d.ts +31 -0
  85. package/packages/core/dist/mcp/tools/brief.js +39 -0
  86. package/packages/core/dist/mcp/tools/decay.d.ts +33 -0
  87. package/packages/core/dist/mcp/tools/decay.js +32 -0
  88. package/packages/core/dist/mcp/tools/decision-journal.d.ts +78 -0
  89. package/packages/core/dist/mcp/tools/decision-journal.js +79 -0
  90. package/packages/core/dist/mcp/tools/detect-gaps.d.ts +24 -0
  91. package/packages/core/dist/mcp/tools/detect-gaps.js +47 -0
  92. package/packages/core/dist/mcp/tools/export.d.ts +29 -0
  93. package/packages/core/dist/mcp/tools/export.js +60 -0
  94. package/packages/core/dist/mcp/tools/federated-search.d.ts +29 -0
  95. package/packages/core/dist/mcp/tools/federated-search.js +36 -0
  96. package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +35 -0
  97. package/packages/core/dist/mcp/tools/generate-claude-md.js +107 -0
  98. package/packages/core/dist/mcp/tools/get-document.d.ts +35 -0
  99. package/packages/core/dist/mcp/tools/get-document.js +25 -0
  100. package/packages/core/dist/mcp/tools/get-evolution.d.ts +28 -0
  101. package/packages/core/dist/mcp/tools/get-evolution.js +70 -0
  102. package/packages/core/dist/mcp/tools/get-related.d.ts +32 -0
  103. package/packages/core/dist/mcp/tools/get-related.js +33 -0
  104. package/packages/core/dist/mcp/tools/learning-path.d.ts +23 -0
  105. package/packages/core/dist/mcp/tools/learning-path.js +45 -0
  106. package/packages/core/dist/mcp/tools/link-code.d.ts +34 -0
  107. package/packages/core/dist/mcp/tools/link-code.js +44 -0
  108. package/packages/core/dist/mcp/tools/list-topics.d.ts +15 -0
  109. package/packages/core/dist/mcp/tools/list-topics.js +18 -0
  110. package/packages/core/dist/mcp/tools/search.d.ts +39 -0
  111. package/packages/core/dist/mcp/tools/search.js +29 -0
  112. package/packages/core/dist/mcp/tools/snapshot.d.ts +47 -0
  113. package/packages/core/dist/mcp/tools/snapshot.js +84 -0
  114. package/packages/core/dist/multi-vault/index.d.ts +26 -0
  115. package/packages/core/dist/multi-vault/index.js +80 -0
  116. package/packages/core/dist/pack/creator.d.ts +21 -0
  117. package/packages/core/dist/pack/creator.js +105 -0
  118. package/packages/core/dist/pack/exporter.d.ts +4 -0
  119. package/packages/core/dist/pack/exporter.js +18 -0
  120. package/packages/core/dist/pack/importer.d.ts +10 -0
  121. package/packages/core/dist/pack/importer.js +55 -0
  122. package/packages/core/{src/pack/index.ts → dist/pack/index.d.ts} +1 -0
  123. package/packages/core/dist/pack/index.js +5 -0
  124. package/packages/core/dist/pack/marketplace.d.ts +14 -0
  125. package/packages/core/dist/pack/marketplace.js +90 -0
  126. package/packages/core/dist/pack/pii-masker.d.ts +7 -0
  127. package/packages/core/dist/pack/pii-masker.js +29 -0
  128. package/packages/core/dist/pack/types.d.ts +36 -0
  129. package/packages/core/dist/pack/types.js +3 -0
  130. package/packages/core/dist/plugins/index.d.ts +35 -0
  131. package/packages/core/dist/plugins/index.js +57 -0
  132. package/packages/core/dist/plugins/webhooks.d.ts +30 -0
  133. package/packages/core/dist/plugins/webhooks.js +79 -0
  134. package/packages/core/dist/search/adaptive.d.ts +16 -0
  135. package/packages/core/dist/search/adaptive.js +67 -0
  136. package/packages/core/dist/search/bm25.d.ts +4 -0
  137. package/packages/core/dist/search/bm25.js +10 -0
  138. package/packages/core/dist/search/index.d.ts +15 -0
  139. package/packages/core/dist/search/index.js +64 -0
  140. package/packages/core/dist/search/rrf.d.ts +7 -0
  141. package/packages/core/dist/search/rrf.js +21 -0
  142. package/packages/core/dist/search/semantic.d.ts +5 -0
  143. package/packages/core/dist/search/semantic.js +6 -0
  144. package/packages/core/{src/store/index.ts → dist/store/index.d.ts} +1 -0
  145. package/packages/core/dist/store/index.js +2 -0
  146. package/packages/core/dist/store/sqlite-vec.d.ts +6 -0
  147. package/packages/core/dist/store/sqlite-vec.js +251 -0
  148. package/packages/core/dist/store/types.d.ts +20 -0
  149. package/packages/core/dist/store/types.js +3 -0
  150. package/packages/core/dist/team/index.d.ts +25 -0
  151. package/packages/core/dist/team/index.js +97 -0
  152. package/packages/core/dist/types/chunk.d.ts +23 -0
  153. package/packages/core/dist/types/chunk.js +3 -0
  154. package/packages/core/dist/types/document.d.ts +23 -0
  155. package/packages/core/dist/types/document.js +3 -0
  156. package/packages/core/dist/types/graph.d.ts +39 -0
  157. package/packages/core/dist/types/graph.js +3 -0
  158. package/packages/core/dist/types/index.d.ts +5 -0
  159. package/packages/core/dist/types/index.js +2 -0
  160. package/packages/core/dist/types/search.d.ts +39 -0
  161. package/packages/core/dist/types/search.js +3 -0
  162. package/packages/core/dist/utils/retry.d.ts +25 -0
  163. package/packages/core/dist/utils/retry.js +59 -0
  164. package/.github/workflows/pages.yml +0 -37
  165. package/memory/MEMORY.md +0 -25
  166. package/packages/cli/dist/commands/brief-cmd.d.ts.map +0 -1
  167. package/packages/cli/dist/commands/brief-cmd.js.map +0 -1
  168. package/packages/cli/dist/commands/capture-cmd.d.ts.map +0 -1
  169. package/packages/cli/dist/commands/capture-cmd.js.map +0 -1
  170. package/packages/cli/dist/commands/card-cmd.d.ts.map +0 -1
  171. package/packages/cli/dist/commands/card-cmd.js.map +0 -1
  172. package/packages/cli/dist/commands/clip-cmd.d.ts.map +0 -1
  173. package/packages/cli/dist/commands/clip-cmd.js.map +0 -1
  174. package/packages/cli/dist/commands/cloud-cmd.d.ts.map +0 -1
  175. package/packages/cli/dist/commands/cloud-cmd.js.map +0 -1
  176. package/packages/cli/dist/commands/contradictions-cmd.d.ts.map +0 -1
  177. package/packages/cli/dist/commands/contradictions-cmd.js.map +0 -1
  178. package/packages/cli/dist/commands/decay-cmd.d.ts.map +0 -1
  179. package/packages/cli/dist/commands/decay-cmd.js.map +0 -1
  180. package/packages/cli/dist/commands/digest-cmd.d.ts.map +0 -1
  181. package/packages/cli/dist/commands/digest-cmd.js.map +0 -1
  182. package/packages/cli/dist/commands/duplicates-cmd.d.ts.map +0 -1
  183. package/packages/cli/dist/commands/duplicates-cmd.js.map +0 -1
  184. package/packages/cli/dist/commands/federate-cmd.d.ts.map +0 -1
  185. package/packages/cli/dist/commands/federate-cmd.js.map +0 -1
  186. package/packages/cli/dist/commands/gaps-cmd.d.ts.map +0 -1
  187. package/packages/cli/dist/commands/gaps-cmd.js.map +0 -1
  188. package/packages/cli/dist/commands/graph-cmd.d.ts.map +0 -1
  189. package/packages/cli/dist/commands/graph-cmd.js.map +0 -1
  190. package/packages/cli/dist/commands/index-cmd.d.ts.map +0 -1
  191. package/packages/cli/dist/commands/index-cmd.js.map +0 -1
  192. package/packages/cli/dist/commands/init-cmd.d.ts.map +0 -1
  193. package/packages/cli/dist/commands/init-cmd.js.map +0 -1
  194. package/packages/cli/dist/commands/learn-cmd.d.ts.map +0 -1
  195. package/packages/cli/dist/commands/learn-cmd.js.map +0 -1
  196. package/packages/cli/dist/commands/pack-cmd.d.ts.map +0 -1
  197. package/packages/cli/dist/commands/pack-cmd.js.map +0 -1
  198. package/packages/cli/dist/commands/review-cmd.d.ts.map +0 -1
  199. package/packages/cli/dist/commands/review-cmd.js.map +0 -1
  200. package/packages/cli/dist/commands/search-cmd.d.ts.map +0 -1
  201. package/packages/cli/dist/commands/search-cmd.js.map +0 -1
  202. package/packages/cli/dist/commands/serve-cmd.d.ts.map +0 -1
  203. package/packages/cli/dist/commands/serve-cmd.js.map +0 -1
  204. package/packages/cli/dist/commands/status-cmd.d.ts.map +0 -1
  205. package/packages/cli/dist/commands/status-cmd.js.map +0 -1
  206. package/packages/cli/dist/commands/sync-cmd.d.ts.map +0 -1
  207. package/packages/cli/dist/commands/sync-cmd.js.map +0 -1
  208. package/packages/cli/dist/commands/vault-cmd.d.ts.map +0 -1
  209. package/packages/cli/dist/commands/vault-cmd.js.map +0 -1
  210. package/packages/cli/dist/index.d.ts.map +0 -1
  211. package/packages/cli/dist/index.js.map +0 -1
  212. package/packages/cli/src/commands/brief-cmd.ts +0 -87
  213. package/packages/cli/src/commands/capture-cmd.ts +0 -34
  214. package/packages/cli/src/commands/card-cmd.ts +0 -29
  215. package/packages/cli/src/commands/clip-cmd.ts +0 -172
  216. package/packages/cli/src/commands/cloud-cmd.ts +0 -75
  217. package/packages/cli/src/commands/contradictions-cmd.ts +0 -41
  218. package/packages/cli/src/commands/decay-cmd.ts +0 -57
  219. package/packages/cli/src/commands/digest-cmd.ts +0 -89
  220. package/packages/cli/src/commands/duplicates-cmd.ts +0 -38
  221. package/packages/cli/src/commands/federate-cmd.ts +0 -256
  222. package/packages/cli/src/commands/gaps-cmd.ts +0 -40
  223. package/packages/cli/src/commands/graph-cmd.ts +0 -88
  224. package/packages/cli/src/commands/index-cmd.ts +0 -65
  225. package/packages/cli/src/commands/init-cmd.ts +0 -145
  226. package/packages/cli/src/commands/learn-cmd.ts +0 -56
  227. package/packages/cli/src/commands/pack-cmd.ts +0 -121
  228. package/packages/cli/src/commands/review-cmd.ts +0 -125
  229. package/packages/cli/src/commands/search-cmd.ts +0 -45
  230. package/packages/cli/src/commands/serve-cmd.ts +0 -17
  231. package/packages/cli/src/commands/status-cmd.ts +0 -37
  232. package/packages/cli/src/commands/sync-cmd.ts +0 -68
  233. package/packages/cli/src/commands/vault-cmd.ts +0 -64
  234. package/packages/cli/src/index.ts +0 -187
  235. package/packages/core/src/api/graph-data.ts +0 -286
  236. package/packages/core/src/api/server.ts +0 -660
  237. package/packages/core/src/capture/voice.ts +0 -168
  238. package/packages/core/src/cloud/sync.ts +0 -167
  239. package/packages/core/src/config.ts +0 -82
  240. package/packages/core/src/federation/credits.ts +0 -80
  241. package/packages/core/src/federation/hyperswarm.d.ts +0 -19
  242. package/packages/core/src/federation/identity.ts +0 -90
  243. package/packages/core/src/federation/node.ts +0 -235
  244. package/packages/core/src/federation/privacy.ts +0 -52
  245. package/packages/core/src/federation/reputation.ts +0 -202
  246. package/packages/core/src/federation/search.ts +0 -129
  247. package/packages/core/src/federation/sharing.ts +0 -315
  248. package/packages/core/src/federation/trust.ts +0 -76
  249. package/packages/core/src/federation/types.ts +0 -25
  250. package/packages/core/src/i18n/index.ts +0 -85
  251. package/packages/core/src/indexer/chunker.ts +0 -180
  252. package/packages/core/src/indexer/embedder.ts +0 -9
  253. package/packages/core/src/indexer/index.ts +0 -113
  254. package/packages/core/src/indexer/local-embedder.ts +0 -35
  255. package/packages/core/src/indexer/scanner.ts +0 -142
  256. package/packages/core/src/indexer/watcher.ts +0 -62
  257. package/packages/core/src/intelligence/contradiction-detector.ts +0 -134
  258. package/packages/core/src/intelligence/decay-engine.ts +0 -229
  259. package/packages/core/src/intelligence/duplicate-detector.ts +0 -71
  260. package/packages/core/src/intelligence/fsrs.ts +0 -79
  261. package/packages/core/src/intelligence/gap-detector.ts +0 -109
  262. package/packages/core/src/intelligence/learning-path.ts +0 -86
  263. package/packages/core/src/intelligence/notifications.ts +0 -106
  264. package/packages/core/src/intelligence/predictive-gaps.ts +0 -94
  265. package/packages/core/src/intelligence/semantic-versioning.ts +0 -97
  266. package/packages/core/src/intelligence/types.ts +0 -28
  267. package/packages/core/src/mcp/custom-tools.ts +0 -97
  268. package/packages/core/src/mcp/server.ts +0 -142
  269. package/packages/core/src/mcp/tools/agentic-graph.ts +0 -96
  270. package/packages/core/src/mcp/tools/brief.ts +0 -49
  271. package/packages/core/src/mcp/tools/decay.ts +0 -40
  272. package/packages/core/src/mcp/tools/decision-journal.ts +0 -95
  273. package/packages/core/src/mcp/tools/export.ts +0 -72
  274. package/packages/core/src/mcp/tools/federated-search.ts +0 -43
  275. package/packages/core/src/mcp/tools/generate-claude-md.ts +0 -130
  276. package/packages/core/src/mcp/tools/get-document.ts +0 -26
  277. package/packages/core/src/mcp/tools/get-related.ts +0 -41
  278. package/packages/core/src/mcp/tools/learning-path.ts +0 -52
  279. package/packages/core/src/mcp/tools/list-topics.ts +0 -20
  280. package/packages/core/src/mcp/tools/search.ts +0 -35
  281. package/packages/core/src/mcp/tools/snapshot.ts +0 -98
  282. package/packages/core/src/multi-vault/index.ts +0 -118
  283. package/packages/core/src/pack/creator.ts +0 -127
  284. package/packages/core/src/pack/exporter.ts +0 -21
  285. package/packages/core/src/pack/importer.ts +0 -82
  286. package/packages/core/src/pack/marketplace.ts +0 -103
  287. package/packages/core/src/pack/pii-masker.ts +0 -38
  288. package/packages/core/src/pack/types.ts +0 -39
  289. package/packages/core/src/plugins/index.ts +0 -100
  290. package/packages/core/src/plugins/webhooks.ts +0 -110
  291. package/packages/core/src/search/bm25.ts +0 -16
  292. package/packages/core/src/search/index.ts +0 -83
  293. package/packages/core/src/search/rrf.ts +0 -31
  294. package/packages/core/src/search/semantic.ts +0 -15
  295. package/packages/core/src/store/sqlite-vec.ts +0 -290
  296. package/packages/core/src/store/types.ts +0 -22
  297. package/packages/core/src/team/index.ts +0 -126
  298. package/packages/core/src/types/chunk.ts +0 -25
  299. package/packages/core/src/types/document.ts +0 -24
  300. package/packages/core/src/types/graph.ts +0 -44
  301. package/packages/core/src/types/index.ts +0 -15
  302. package/packages/core/src/types/search.ts +0 -38
  303. package/packages/core/src/utils/retry.ts +0 -85
  304. package/packages/core/tests/api-card.test.ts +0 -60
  305. package/packages/core/tests/api-routes.test.ts +0 -98
  306. package/packages/core/tests/bm25.test.ts +0 -87
  307. package/packages/core/tests/chunker.test.ts +0 -48
  308. package/packages/core/tests/cluster.test.ts +0 -75
  309. package/packages/core/tests/constellation.test.ts +0 -77
  310. package/packages/core/tests/export-utils.test.ts +0 -97
  311. package/packages/core/tests/fsrs.test.ts +0 -96
  312. package/packages/core/tests/gesture-detector.test.ts +0 -45
  313. package/packages/core/tests/graph-data.test.ts +0 -87
  314. package/packages/core/tests/layout.test.ts +0 -83
  315. package/packages/core/tests/mcp.test.ts +0 -148
  316. package/packages/core/tests/pack.test.ts +0 -127
  317. package/packages/core/tests/pii-masker.test.ts +0 -42
  318. package/packages/core/tests/profile-card.test.ts +0 -62
  319. package/packages/core/tests/rrf.test.ts +0 -29
  320. package/packages/core/tests/search-integration.test.ts +0 -139
  321. package/packages/core/tests/store.test.ts +0 -80
  322. package/packages/graph/click-result.png +0 -0
  323. package/packages/graph/dist/assets/camera_utils-BMxqtvoZ.js +0 -1
  324. package/packages/graph/dist/assets/hands-DXA01_mx.js +0 -18
  325. package/packages/graph/dist/assets/index-DMEe2diW.js +0 -4192
  326. package/packages/graph/dist/assets/layout.worker-DbKCEFTz.js +0 -1
  327. package/packages/graph/dist/index.html +0 -17
  328. package/packages/graph/index.html +0 -17
  329. package/packages/graph/package.json +0 -32
  330. package/packages/graph/src/App.tsx +0 -7
  331. package/packages/graph/src/api/client.ts +0 -39
  332. package/packages/graph/src/components/ClusterFilter.tsx +0 -73
  333. package/packages/graph/src/components/ConstellationView.tsx +0 -232
  334. package/packages/graph/src/components/ExportPanel.tsx +0 -177
  335. package/packages/graph/src/components/Graph3D.tsx +0 -230
  336. package/packages/graph/src/components/GraphEdges.tsx +0 -100
  337. package/packages/graph/src/components/GraphNodes.tsx +0 -386
  338. package/packages/graph/src/components/HealthDashboard.tsx +0 -173
  339. package/packages/graph/src/components/Layout.tsx +0 -214
  340. package/packages/graph/src/components/MotionOverlay.tsx +0 -81
  341. package/packages/graph/src/components/MotionToggle.tsx +0 -33
  342. package/packages/graph/src/components/MultiverseView.tsx +0 -286
  343. package/packages/graph/src/components/NodeDetail.tsx +0 -232
  344. package/packages/graph/src/components/PulseParticle.tsx +0 -232
  345. package/packages/graph/src/components/SearchBar.tsx +0 -107
  346. package/packages/graph/src/components/StarField.tsx +0 -197
  347. package/packages/graph/src/components/StatusBar.tsx +0 -53
  348. package/packages/graph/src/components/Timeline.tsx +0 -148
  349. package/packages/graph/src/components/ToolsPanel.tsx +0 -512
  350. package/packages/graph/src/components/Tooltip.tsx +0 -100
  351. package/packages/graph/src/components/TypeFilter.tsx +0 -131
  352. package/packages/graph/src/embed/EmbedGraph.tsx +0 -144
  353. package/packages/graph/src/hooks/useConstellationLOD.ts +0 -76
  354. package/packages/graph/src/hooks/useDecay.ts +0 -37
  355. package/packages/graph/src/hooks/useExport.ts +0 -165
  356. package/packages/graph/src/hooks/useGraph.ts +0 -69
  357. package/packages/graph/src/hooks/useKeyboardNav.ts +0 -122
  358. package/packages/graph/src/hooks/useLayout.ts +0 -45
  359. package/packages/graph/src/hooks/useMotion.ts +0 -120
  360. package/packages/graph/src/hooks/usePulse.ts +0 -58
  361. package/packages/graph/src/hooks/useSearch.ts +0 -71
  362. package/packages/graph/src/lib/constellation.ts +0 -107
  363. package/packages/graph/src/lib/export-utils.ts +0 -48
  364. package/packages/graph/src/lib/gesture-detector.ts +0 -123
  365. package/packages/graph/src/lib/layout.worker.ts +0 -153
  366. package/packages/graph/src/lib/motion-controller.ts +0 -83
  367. package/packages/graph/src/lib/profile-card.ts +0 -122
  368. package/packages/graph/src/main.tsx +0 -4
  369. package/packages/graph/src/stores/graph-store.ts +0 -155
  370. package/packages/graph/success.png +0 -0
  371. package/packages/graph/test-click.mjs +0 -49
  372. package/packages/graph/test-explore.mjs +0 -102
  373. package/packages/graph/test-final.mjs +0 -61
  374. package/packages/graph/test-graph.mjs +0 -139
  375. package/packages/graph/test-hover.mjs +0 -48
  376. package/packages/graph/test-pulse.mjs +0 -68
  377. package/packages/graph/test-screenshot.mjs +0 -56
  378. package/packages/graph/test-v2.mjs +0 -97
  379. package/packages/graph/tsconfig.tsbuildinfo +0 -1
  380. package/packages/graph/vite.config.ts +0 -15
  381. package/packages/sync/.env.example +0 -11
  382. package/packages/sync/.sync-state.json +0 -317
  383. package/packages/sync/.upload-state.json +0 -1009
  384. package/packages/sync/create-stella-network-notion.mjs +0 -151
  385. package/packages/sync/create-stellavault-project-notion.mjs +0 -322
  386. package/packages/sync/logs/sync-2026-03-28.log +0 -6
  387. package/packages/sync/logs/sync-2026-03-29.log +0 -12
  388. package/packages/sync/logs/sync-2026-03-30.log +0 -6
  389. package/packages/sync/logs/sync-2026-03-31.log +0 -6
  390. package/packages/sync/logs/sync-2026-04-01.log +0 -6
  391. package/packages/sync/logs/sync-2026-04-02.log +0 -6
  392. package/packages/sync/package-lock.json +0 -373
  393. package/packages/sync/package.json +0 -16
  394. package/packages/sync/run-sync.bat +0 -18
  395. package/packages/sync/run-sync.mjs +0 -46
  396. package/packages/sync/setup-scheduler.mjs +0 -119
  397. package/packages/sync/structured-sync.mjs +0 -187
  398. package/packages/sync/sync-to-obsidian.mjs +0 -264
  399. package/packages/sync/upload-pdca-to-notion.mjs +0 -495
  400. package/tsconfig.base.json +0 -18
@@ -1,97 +0,0 @@
1
- // Phase 4a: export-utils 순수 함수 테스트
2
-
3
- import { describe, it, expect } from 'vitest';
4
-
5
- // export-utils는 graph 패키지에 있지만 순수 함수만 테스트
6
- // DOM 의존 함수는 통합 테스트로 분리
7
-
8
- describe('export-utils filename generation', () => {
9
- it('generates screenshot filename with timestamp', () => {
10
- // 파일명 패턴 검증: stellavault-screenshot-YYYY-MM-DDTHH-MM-SS.png
11
- const pattern = /^stellavault-screenshot-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.png$/;
12
- const now = new Date();
13
- const ts = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
14
- const filename = `stellavault-screenshot-${ts}.png`;
15
- expect(filename).toMatch(pattern);
16
- });
17
-
18
- it('generates recording filename with webm extension', () => {
19
- const pattern = /^stellavault-recording-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.webm$/;
20
- const now = new Date();
21
- const ts = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
22
- const filename = `stellavault-recording-${ts}.webm`;
23
- expect(filename).toMatch(pattern);
24
- });
25
- });
26
-
27
- describe('LOD thresholds', () => {
28
- const UNIVERSE_MIN = 800;
29
- const NOTE_MAX = 300;
30
-
31
- it('returns universe level for distance > 800', () => {
32
- const dist = 900;
33
- const level = dist > UNIVERSE_MIN ? 'universe' : dist < NOTE_MAX ? 'note' : 'constellation';
34
- expect(level).toBe('universe');
35
- });
36
-
37
- it('returns note level for distance < 300', () => {
38
- const dist = 200;
39
- const level = dist > UNIVERSE_MIN ? 'universe' : dist < NOTE_MAX ? 'note' : 'constellation';
40
- expect(level).toBe('note');
41
- });
42
-
43
- it('returns constellation level for distance 300-800', () => {
44
- for (const dist of [300, 500, 799]) {
45
- const level = dist > UNIVERSE_MIN ? 'universe' : dist < NOTE_MAX ? 'note' : 'constellation';
46
- expect(level).toBe('constellation');
47
- }
48
- });
49
-
50
- it('interpolates constellation opacity correctly', () => {
51
- const dist = 550; // middle of 300~800 range
52
- const t = (dist - NOTE_MAX) / (UNIVERSE_MIN - NOTE_MAX);
53
- expect(t).toBeCloseTo(0.5, 1);
54
-
55
- // At distance 300, t = 0 (no constellation lines)
56
- const t300 = (300 - NOTE_MAX) / (UNIVERSE_MIN - NOTE_MAX);
57
- expect(t300).toBeCloseTo(0, 1);
58
-
59
- // At distance 800, t = 1 (full constellation lines)
60
- const t800 = (800 - NOTE_MAX) / (UNIVERSE_MIN - NOTE_MAX);
61
- expect(t800).toBeCloseTo(1, 1);
62
- });
63
-
64
- it('node scale ranges from 1 (far) to 3 (close)', () => {
65
- const tFar = (800 - NOTE_MAX) / (UNIVERSE_MIN - NOTE_MAX);
66
- const scaleFar = 1 + (1 - tFar) * 2;
67
- expect(scaleFar).toBeCloseTo(1, 1);
68
-
69
- const tClose = (300 - NOTE_MAX) / (UNIVERSE_MIN - NOTE_MAX);
70
- const scaleClose = 1 + (1 - tClose) * 2;
71
- expect(scaleClose).toBeCloseTo(3, 1);
72
- });
73
- });
74
-
75
- describe('graph-store export state', () => {
76
- it('lodLevel accepts valid values', () => {
77
- const validLevels = ['universe', 'constellation', 'note'] as const;
78
- for (const level of validLevels) {
79
- expect(typeof level).toBe('string');
80
- expect(validLevels).toContain(level);
81
- }
82
- });
83
-
84
- it('LOD nodeScale mapping matches design', () => {
85
- // Design Ref: §8 — LOD node scale factors
86
- const lodScaleMap = { universe: 0.6, constellation: 1.0, note: 1.2 };
87
- expect(lodScaleMap.universe).toBeLessThan(lodScaleMap.constellation);
88
- expect(lodScaleMap.constellation).toBeLessThan(lodScaleMap.note);
89
- });
90
-
91
- it('screenshot resolution capped at 4096', () => {
92
- const cap = (v: number) => Math.min(v, 4096);
93
- expect(cap(2048)).toBe(2048);
94
- expect(cap(8192)).toBe(4096);
95
- expect(cap(1024)).toBe(1024);
96
- });
97
- });
@@ -1,96 +0,0 @@
1
- // Phase 4b: FSRS 알고리즘 단위 테스트
2
-
3
- import { describe, it, expect } from 'vitest';
4
- import {
5
- computeRetrievability,
6
- updateStability,
7
- estimateInitialStability,
8
- elapsedDays,
9
- FSRS_PARAMS,
10
- } from '../src/intelligence/fsrs.js';
11
-
12
- describe('FSRS computeRetrievability', () => {
13
- it('returns 1.0 for 0 elapsed days', () => {
14
- expect(computeRetrievability(7, 0)).toBe(1.0);
15
- });
16
-
17
- it('returns ~0.9 after stability days', () => {
18
- // R(S) = (1 + S/(9*S))^(-1) = (1 + 1/9)^(-1) = 0.9
19
- const r = computeRetrievability(7, 7);
20
- expect(r).toBeCloseTo(0.9, 1);
21
- });
22
-
23
- it('decays over time', () => {
24
- const r7 = computeRetrievability(7, 7);
25
- const r30 = computeRetrievability(7, 30);
26
- const r90 = computeRetrievability(7, 90);
27
- expect(r7).toBeGreaterThan(r30);
28
- expect(r30).toBeGreaterThan(r90);
29
- });
30
-
31
- it('higher stability = slower decay', () => {
32
- const rLow = computeRetrievability(3, 30);
33
- const rHigh = computeRetrievability(30, 30);
34
- expect(rHigh).toBeGreaterThan(rLow);
35
- });
36
-
37
- it('returns 0 for 0 stability', () => {
38
- expect(computeRetrievability(0, 10)).toBe(0.0);
39
- });
40
-
41
- it('60 days with default stability gives R < 0.5', () => {
42
- // Plan SC-01: 장기 미접근 노트는 감쇠
43
- // R(60, S=7) ≈ 0.51, R(90, S=7) ≈ 0.41
44
- const r90 = computeRetrievability(FSRS_PARAMS.initialStability, 90);
45
- expect(r90).toBeLessThan(0.5);
46
- });
47
- });
48
-
49
- describe('FSRS updateStability', () => {
50
- it('increases stability on access', () => {
51
- const newS = updateStability(7, 5, 0.5);
52
- expect(newS).toBeGreaterThan(7);
53
- });
54
-
55
- it('increases more when R is low (forgotten but recalled)', () => {
56
- const sHighR = updateStability(7, 5, 0.9);
57
- const sLowR = updateStability(7, 5, 0.3);
58
- expect(sLowR).toBeGreaterThan(sHighR);
59
- });
60
-
61
- it('caps at 365 days', () => {
62
- const s = updateStability(300, 1, 0.1);
63
- expect(s).toBeLessThanOrEqual(365);
64
- });
65
- });
66
-
67
- describe('FSRS estimateInitialStability', () => {
68
- it('base stability for short notes', () => {
69
- const s = estimateInitialStability(100, 0);
70
- expect(s).toBeCloseTo(FSRS_PARAMS.initialStability, 0);
71
- });
72
-
73
- it('longer notes get higher stability', () => {
74
- const sShort = estimateInitialStability(100, 0);
75
- const sLong = estimateInitialStability(5000, 0);
76
- expect(sLong).toBeGreaterThan(sShort);
77
- });
78
-
79
- it('more connections increase stability', () => {
80
- const s0 = estimateInitialStability(1000, 0);
81
- const s5 = estimateInitialStability(1000, 5);
82
- expect(s5).toBeGreaterThan(s0);
83
- });
84
- });
85
-
86
- describe('elapsedDays', () => {
87
- it('computes correct days', () => {
88
- const d = elapsedDays('2026-03-01T00:00:00Z', '2026-03-31T00:00:00Z');
89
- expect(d).toBeCloseTo(30, 0);
90
- });
91
-
92
- it('returns 0 for same timestamp', () => {
93
- const now = new Date().toISOString();
94
- expect(elapsedDays(now, now)).toBe(0);
95
- });
96
- });
@@ -1,45 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
-
3
- // gesture-detector는 graph 패키지에 있으므로 로직만 단위 테스트
4
- // 핵심 알고리즘: 손가락 수 카운팅 + 핀치 거리 + 흔들기 감지
5
-
6
- describe('Gesture Detection Logic', () => {
7
- it('5개 손가락 펼침 = rotate', () => {
8
- // extended >= 4 → rotate
9
- const extended = 5;
10
- expect(extended >= 4).toBe(true);
11
- });
12
-
13
- it('0개 손가락 = pan', () => {
14
- const extended = 0;
15
- expect(extended === 0).toBe(true);
16
- });
17
-
18
- it('핀치 거리 < 0.06 = zoom', () => {
19
- const pinchDistance = 0.04;
20
- expect(pinchDistance < 0.06).toBe(true);
21
- });
22
-
23
- it('핀치 거리 >= 0.06 = not zoom', () => {
24
- const pinchDistance = 0.08;
25
- expect(pinchDistance < 0.06).toBe(false);
26
- });
27
-
28
- it('1개 손가락 (검지) = select', () => {
29
- const extended = 1;
30
- const isIndexExtended = true;
31
- expect(extended === 1 && isIndexExtended).toBe(true);
32
- });
33
-
34
- it('흔들기 감지: 3회 이상 방향 전환', () => {
35
- // x 좌표 시퀀스: 좌 → 우 → 좌 → 우
36
- const history = [0.3, 0.35, 0.4, 0.35, 0.3, 0.35, 0.4, 0.35, 0.3, 0.35];
37
- let dirChanges = 0;
38
- for (let i = 2; i < history.length; i++) {
39
- const prev = history[i - 1] - history[i - 2];
40
- const curr = history[i] - history[i - 1];
41
- if (prev * curr < 0 && Math.abs(curr) > 0.005) dirChanges++;
42
- }
43
- expect(dirChanges).toBeGreaterThanOrEqual(3);
44
- });
45
- });
@@ -1,87 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { createSqliteVecStore } from '../src/store/sqlite-vec.js';
3
- import type { VectorStore } from '../src/store/types.js';
4
- import { buildGraphData } from '../src/api/graph-data.js';
5
-
6
- const DIMS = 4;
7
- let store: VectorStore;
8
-
9
- beforeEach(async () => {
10
- store = createSqliteVecStore(':memory:', DIMS);
11
- await store.initialize();
12
-
13
- // 3개 문서 삽입
14
- for (let i = 0; i < 3; i++) {
15
- await store.upsertDocument({
16
- id: `doc${i}`, filePath: `folder${i}/test.md`, title: `Doc ${i}`,
17
- content: `Content ${i}`, frontmatter: {}, tags: ['test'],
18
- lastModified: '2026-01-01', contentHash: `hash${i}`,
19
- });
20
- await store.upsertChunks([{
21
- id: `doc${i}#0`, documentId: `doc${i}`, content: `Content ${i}`,
22
- heading: `Doc ${i}`, startLine: 1, endLine: 1, tokenCount: 2,
23
- embedding: [i === 0 ? 1 : 0, i === 1 ? 1 : 0, i === 2 ? 1 : 0, 0.5],
24
- }]);
25
- }
26
- });
27
-
28
- afterEach(async () => { await store.close(); });
29
-
30
- describe('buildGraphData', () => {
31
- it('semantic 모드: 노드 수 = 문서 수', async () => {
32
- const data = await buildGraphData(store, { mode: 'semantic' });
33
- expect(data.nodes.length).toBe(3);
34
- expect(data.stats.nodeCount).toBe(3);
35
- });
36
-
37
- it('노드에 필수 필드 존재', async () => {
38
- const data = await buildGraphData(store);
39
- const node = data.nodes[0];
40
- expect(node.id).toBeDefined();
41
- expect(node.label).toBeDefined();
42
- expect(node.filePath).toBeDefined();
43
- expect(node.clusterId).toBeTypeOf('number');
44
- expect(node.size).toBeGreaterThan(0);
45
- });
46
-
47
- it('엣지 threshold 이상만 생성', async () => {
48
- const data = await buildGraphData(store, { edgeThreshold: 0.99 });
49
- // 직교 벡터라 유사도 < 0.99 → 엣지 없음
50
- expect(data.edges.length).toBe(0);
51
- });
52
-
53
- it('엣지 threshold 낮으면 연결 생성', async () => {
54
- const data = await buildGraphData(store, { edgeThreshold: 0.0 });
55
- expect(data.edges.length).toBeGreaterThan(0);
56
- for (const edge of data.edges) {
57
- expect(edge.source).toBeDefined();
58
- expect(edge.target).toBeDefined();
59
- expect(edge.weight).toBeGreaterThanOrEqual(0);
60
- }
61
- });
62
-
63
- it('folder 모드: 폴더별 클러스터', async () => {
64
- const data = await buildGraphData(store, { mode: 'folder' });
65
- expect(data.clusters.length).toBe(3); // folder0, folder1, folder2
66
- for (const c of data.clusters) {
67
- expect(c.label).toBeDefined();
68
- expect(c.nodeCount).toBeGreaterThan(0);
69
- expect(c.color).toMatch(/^#/);
70
- }
71
- });
72
-
73
- it('클러스터에 컬러와 라벨 존재', async () => {
74
- const data = await buildGraphData(store);
75
- for (const c of data.clusters) {
76
- expect(c.color).toMatch(/^#/);
77
- expect(c.label.length).toBeGreaterThan(0);
78
- }
79
- });
80
-
81
- it('stats 정확', async () => {
82
- const data = await buildGraphData(store);
83
- expect(data.stats.nodeCount).toBe(data.nodes.length);
84
- expect(data.stats.edgeCount).toBe(data.edges.length);
85
- expect(data.stats.clusterCount).toBe(data.clusters.length);
86
- });
87
- });
@@ -1,83 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
-
3
- // layout.worker는 브라우저 Web Worker이므로 직접 테스트 불가
4
- // graph-data의 buildGraphData로 노드 위치/엣지 생성을 간접 검증
5
-
6
- import { buildGraphData } from '../src/api/graph-data.js';
7
- import { createSqliteVecStore } from '../src/store/sqlite-vec.js';
8
- import type { VectorStore } from '../src/store/types.js';
9
-
10
- const DIMS = 4;
11
-
12
- async function setup(n: number): Promise<VectorStore> {
13
- const store = createSqliteVecStore(':memory:', DIMS);
14
- await store.initialize();
15
- for (let i = 0; i < n; i++) {
16
- const vec = [Math.random(), Math.random(), Math.random(), Math.random()];
17
- await store.upsertDocument({
18
- id: `d${i}`, filePath: `test/d${i}.md`, title: `Doc ${i}`,
19
- content: `Content ${i}`, frontmatter: {}, tags: [],
20
- lastModified: '2026-01-01', contentHash: `h${i}`,
21
- });
22
- await store.upsertChunks([{
23
- id: `d${i}#0`, documentId: `d${i}`, content: `Content ${i}`,
24
- heading: `Doc ${i}`, startLine: 1, endLine: 1, tokenCount: 2,
25
- embedding: vec,
26
- }]);
27
- }
28
- return store;
29
- }
30
-
31
- describe('Graph Layout Data Generation', () => {
32
- it('노드 수 = 문서 수', async () => {
33
- const store = await setup(10);
34
- const data = await buildGraphData(store);
35
- expect(data.nodes.length).toBe(10);
36
- await store.close();
37
- });
38
-
39
- it('엣지 source/target이 유효한 노드 ID', async () => {
40
- const store = await setup(10);
41
- const data = await buildGraphData(store, { edgeThreshold: 0 });
42
- const nodeIds = new Set(data.nodes.map(n => n.id));
43
- for (const edge of data.edges) {
44
- expect(nodeIds.has(edge.source)).toBe(true);
45
- expect(nodeIds.has(edge.target)).toBe(true);
46
- }
47
- await store.close();
48
- });
49
-
50
- it('maxEdgesPerNode 제한 동작', async () => {
51
- const store = await setup(10);
52
- const data = await buildGraphData(store, { edgeThreshold: 0, maxEdgesPerNode: 2 });
53
- // 각 노드의 엣지 수가 maxEdgesPerNode 이하
54
- const edgeCounts = new Map<string, number>();
55
- for (const e of data.edges) {
56
- edgeCounts.set(e.source, (edgeCounts.get(e.source) ?? 0) + 1);
57
- edgeCounts.set(e.target, (edgeCounts.get(e.target) ?? 0) + 1);
58
- }
59
- // 중복 엣지 방지로 실제 카운트는 다를 수 있지만, 합리적 범위
60
- for (const count of edgeCounts.values()) {
61
- expect(count).toBeLessThanOrEqual(20); // 넉넉한 상한
62
- }
63
- await store.close();
64
- });
65
-
66
- it('노드 size가 양수', async () => {
67
- const store = await setup(5);
68
- const data = await buildGraphData(store);
69
- for (const n of data.nodes) {
70
- expect(n.size).toBeGreaterThan(0);
71
- }
72
- await store.close();
73
- });
74
-
75
- it('빈 store → 빈 그래프', async () => {
76
- const store = createSqliteVecStore(':memory:', DIMS);
77
- await store.initialize();
78
- const data = await buildGraphData(store);
79
- expect(data.nodes.length).toBe(0);
80
- expect(data.edges.length).toBe(0);
81
- await store.close();
82
- });
83
- });
@@ -1,148 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { handleSearch, searchToolDef } from '../src/mcp/tools/search.js';
3
- import { handleGetDocument, getDocumentToolDef } from '../src/mcp/tools/get-document.js';
4
- import { handleListTopics, listTopicsToolDef } from '../src/mcp/tools/list-topics.js';
5
- import { handleGetRelated, getRelatedToolDef } from '../src/mcp/tools/get-related.js';
6
- import type { VectorStore } from '../src/store/types.js';
7
- import type { SearchEngine } from '../src/search/index.js';
8
- import type { Document } from '../src/types/document.js';
9
-
10
- // Mock data
11
- const mockDoc: Document = {
12
- id: 'doc1', filePath: 'test.md', title: 'Test Document',
13
- content: 'Test content about React patterns',
14
- frontmatter: { category: 'tech' }, tags: ['react', 'test'],
15
- lastModified: '2026-01-01', contentHash: 'abc123',
16
- };
17
-
18
- function createMockStore(): VectorStore {
19
- return {
20
- getDocument: async (id: string) => id === 'doc1' ? mockDoc : null,
21
- getChunk: async () => null,
22
- getTopics: async () => [
23
- { topic: 'react', count: 5, recentDocuments: [{ id: 'doc1', title: 'Test' }] },
24
- { topic: 'security', count: 3, recentDocuments: [] },
25
- ],
26
- getStats: async () => ({
27
- documentCount: 10, chunkCount: 50, dbSizeBytes: 1024, lastIndexed: '2026-01-01',
28
- }),
29
- initialize: async () => {},
30
- close: async () => {},
31
- upsertDocument: async () => {},
32
- upsertChunks: async () => {},
33
- deleteByDocumentId: async () => {},
34
- searchSemantic: async () => [],
35
- searchKeyword: async () => [],
36
- getAllDocumentHashes: async () => new Map(),
37
- } as VectorStore;
38
- }
39
-
40
- function createMockSearchEngine(): SearchEngine {
41
- return {
42
- search: async ({ query, limit }) => [{
43
- chunk: {
44
- id: 'doc1#0', documentId: 'doc1', content: 'React patterns content',
45
- heading: 'Patterns', startLine: 1, endLine: 3, tokenCount: 5,
46
- },
47
- document: mockDoc,
48
- score: 0.85,
49
- highlights: ['React patterns content'],
50
- }].slice(0, limit ?? 5),
51
- };
52
- }
53
-
54
- describe('MCP Tool Definitions', () => {
55
- it('search tool schema 유효', () => {
56
- expect(searchToolDef.name).toBe('search');
57
- expect(searchToolDef.inputSchema.required).toContain('query');
58
- expect(searchToolDef.inputSchema.properties.query).toBeDefined();
59
- expect(searchToolDef.inputSchema.properties.limit).toBeDefined();
60
- expect(searchToolDef.inputSchema.properties.tags).toBeDefined();
61
- });
62
-
63
- it('get-document tool schema 유효', () => {
64
- expect(getDocumentToolDef.name).toBe('get-document');
65
- expect(getDocumentToolDef.inputSchema.required).toContain('id');
66
- });
67
-
68
- it('list-topics tool schema 유효', () => {
69
- expect(listTopicsToolDef.name).toBe('list-topics');
70
- expect(listTopicsToolDef.inputSchema.properties).toBeDefined();
71
- });
72
-
73
- it('get-related tool schema 유효', () => {
74
- expect(getRelatedToolDef.name).toBe('get-related');
75
- expect(getRelatedToolDef.inputSchema.required).toContain('id');
76
- });
77
- });
78
-
79
- describe('handleSearch', () => {
80
- it('검색 결과를 올바른 형식으로 반환', async () => {
81
- const engine = createMockSearchEngine();
82
- const results = await handleSearch(engine, { query: 'React' });
83
-
84
- expect(results.length).toBeGreaterThan(0);
85
- const r = results[0];
86
- expect(r.title).toBe('Test Document');
87
- expect(r.filePath).toBe('test.md');
88
- expect(r.heading).toBe('Patterns');
89
- expect(r.content).toBe('React patterns content');
90
- expect(r.score).toBe(0.85);
91
- expect(r.tags).toEqual(['react', 'test']);
92
- });
93
-
94
- it('limit 전달', async () => {
95
- const engine = createMockSearchEngine();
96
- const results = await handleSearch(engine, { query: 'React', limit: 1 });
97
- expect(results.length).toBeLessThanOrEqual(1);
98
- });
99
- });
100
-
101
- describe('handleGetDocument', () => {
102
- it('존재하는 문서 반환', async () => {
103
- const store = createMockStore();
104
- const result = await handleGetDocument(store, { id: 'doc1' });
105
-
106
- expect(result).not.toHaveProperty('error');
107
- expect((result as any).title).toBe('Test Document');
108
- expect((result as any).filePath).toBe('test.md');
109
- expect((result as any).content).toBe('Test content about React patterns');
110
- expect((result as any).tags).toEqual(['react', 'test']);
111
- });
112
-
113
- it('존재하지 않는 문서는 error 반환', async () => {
114
- const store = createMockStore();
115
- const result = await handleGetDocument(store, { id: 'nonexistent' });
116
- expect(result).toHaveProperty('error');
117
- });
118
- });
119
-
120
- describe('handleListTopics', () => {
121
- it('토픽 목록과 통계 반환', async () => {
122
- const store = createMockStore();
123
- const result = await handleListTopics(store);
124
-
125
- expect(result.topics).toHaveLength(2);
126
- expect(result.topics[0].topic).toBe('react');
127
- expect(result.totalDocuments).toBe(10);
128
- expect(result.totalChunks).toBe(50);
129
- });
130
- });
131
-
132
- describe('handleGetRelated', () => {
133
- it('관련 문서 반환 (자기 자신 제외)', async () => {
134
- const store = createMockStore();
135
- const engine = createMockSearchEngine();
136
- const results = await handleGetRelated(store, engine, { id: 'doc1' });
137
-
138
- // doc1 자체는 필터링되므로 빈 결과 가능
139
- expect(Array.isArray(results)).toBe(true);
140
- });
141
-
142
- it('존재하지 않는 문서 ID는 error 반환', async () => {
143
- const store = createMockStore();
144
- const engine = createMockSearchEngine();
145
- const result = await handleGetRelated(store, engine, { id: 'nonexistent' });
146
- expect(result).toHaveProperty('error');
147
- });
148
- });
@@ -1,127 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { createSqliteVecStore } from '../src/store/sqlite-vec.js';
3
- import { createSearchEngine } from '../src/search/index.js';
4
- import { createPack, exportPack, importPack } from '../src/pack/index.js';
5
- import type { VectorStore } from '../src/store/types.js';
6
- import type { Embedder } from '../src/indexer/embedder.js';
7
- import { join } from 'node:path';
8
- import { tmpdir } from 'node:os';
9
- import { existsSync, unlinkSync } from 'node:fs';
10
-
11
- const DIMS = 4;
12
- let store: VectorStore;
13
- let embedder: Embedder;
14
-
15
- function mockEmbedder(): Embedder {
16
- return {
17
- dimensions: DIMS, modelName: 'test-model',
18
- initialize: async () => {},
19
- embed: async (text) => {
20
- const h = text.length;
21
- return [h % 3 / 3, h % 5 / 5, h % 7 / 7, h % 11 / 11];
22
- },
23
- embedBatch: async (texts) => texts.map(t => {
24
- const h = t.length;
25
- return [h % 3 / 3, h % 5 / 5, h % 7 / 7, h % 11 / 11];
26
- }),
27
- };
28
- }
29
-
30
- beforeEach(async () => {
31
- store = createSqliteVecStore(':memory:', DIMS);
32
- await store.initialize();
33
- embedder = mockEmbedder();
34
-
35
- await store.upsertDocument({
36
- id: 'doc1', filePath: '08_Patterns/auth.md', title: 'Auth Pattern',
37
- content: 'OAuth patterns for authentication. Contact admin@test.com',
38
- frontmatter: {}, tags: ['auth'], lastModified: '2026-01-01', contentHash: 'h1',
39
- });
40
- await store.upsertChunks([{
41
- id: 'doc1#0', documentId: 'doc1',
42
- content: 'OAuth patterns for authentication. Contact admin@test.com',
43
- heading: 'Auth Pattern', startLine: 1, endLine: 1, tokenCount: 8,
44
- embedding: [0.5, 0.5, 0.5, 0.5],
45
- }]);
46
- });
47
-
48
- afterEach(async () => { await store.close(); });
49
-
50
- describe('Knowledge Pack', () => {
51
- it('검색 기반 팩 생성', async () => {
52
- const searchEngine = createSearchEngine({ store, embedder });
53
- const { pack, piiReport } = await createPack(store, searchEngine, embedder, {
54
- name: 'auth-patterns',
55
- fromSearch: 'OAuth',
56
- });
57
-
58
- expect(pack.name).toBe('auth-patterns');
59
- expect(pack.chunks.length).toBeGreaterThan(0);
60
- expect(pack.embeddingModel).toBe('test-model');
61
- expect(pack.schemaVersion).toBe('1.0');
62
- });
63
-
64
- it('PII 자동 마스킹', async () => {
65
- const searchEngine = createSearchEngine({ store, embedder });
66
- const { pack, piiReport } = await createPack(store, searchEngine, embedder, {
67
- name: 'test-pii',
68
- fromSearch: 'OAuth',
69
- });
70
-
71
- // 이메일이 마스킹되어야 함
72
- for (const chunk of pack.chunks) {
73
- expect(chunk.content).not.toContain('admin@test.com');
74
- }
75
- expect(piiReport.redactedCount).toBeGreaterThan(0);
76
- });
77
-
78
- it('내보내기 + 가져오기 라운드트립', async () => {
79
- const searchEngine = createSearchEngine({ store, embedder });
80
- const { pack } = await createPack(store, searchEngine, embedder, {
81
- name: 'roundtrip-test',
82
- fromSearch: 'OAuth',
83
- });
84
-
85
- const tmpPath = join(tmpdir(), 'test-roundtrip.sv-pack');
86
- exportPack(pack, tmpPath);
87
- expect(existsSync(tmpPath)).toBe(true);
88
-
89
- // 새 store에 import
90
- const store2 = createSqliteVecStore(':memory:', DIMS);
91
- await store2.initialize();
92
-
93
- const result = await importPack(store2, embedder, tmpPath);
94
- expect(result.imported).toBeGreaterThan(0);
95
- expect(result.modelMismatch).toBe(false);
96
-
97
- // import된 청크 검색 가능
98
- const stats = await store2.getStats();
99
- expect(stats.chunkCount).toBeGreaterThan(0);
100
-
101
- await store2.close();
102
- try { unlinkSync(tmpPath); } catch {}
103
- });
104
-
105
- it('모델 불일치 시 재임베딩', async () => {
106
- const searchEngine = createSearchEngine({ store, embedder });
107
- const { pack } = await createPack(store, searchEngine, embedder, {
108
- name: 'mismatch-test',
109
- fromSearch: 'OAuth',
110
- });
111
-
112
- const tmpPath = join(tmpdir(), 'test-mismatch.sv-pack');
113
- exportPack(pack, tmpPath);
114
-
115
- // 다른 모델명의 embedder로 import
116
- const otherEmbedder = { ...mockEmbedder(), modelName: 'other-model' };
117
- const store2 = createSqliteVecStore(':memory:', DIMS);
118
- await store2.initialize();
119
-
120
- const result = await importPack(store2, otherEmbedder, tmpPath);
121
- expect(result.modelMismatch).toBe(true);
122
- expect(result.reEmbedded).toBeGreaterThan(0);
123
-
124
- await store2.close();
125
- try { unlinkSync(tmpPath); } catch {}
126
- });
127
- });