stellavault 0.2.0 → 0.2.1

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 (390) 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 +647 -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/contradiction-detector.d.ts +20 -0
  55. package/packages/core/dist/intelligence/contradiction-detector.js +115 -0
  56. package/packages/core/dist/intelligence/decay-engine.d.ts +27 -0
  57. package/packages/core/dist/intelligence/decay-engine.js +190 -0
  58. package/packages/core/dist/intelligence/duplicate-detector.d.ts +20 -0
  59. package/packages/core/dist/intelligence/duplicate-detector.js +55 -0
  60. package/packages/core/dist/intelligence/fsrs.d.ts +43 -0
  61. package/packages/core/dist/intelligence/fsrs.js +70 -0
  62. package/packages/core/dist/intelligence/gap-detector.d.ts +25 -0
  63. package/packages/core/dist/intelligence/gap-detector.js +78 -0
  64. package/packages/core/dist/intelligence/learning-path.d.ts +31 -0
  65. package/packages/core/dist/intelligence/learning-path.js +53 -0
  66. package/packages/core/dist/intelligence/notifications.d.ts +31 -0
  67. package/packages/core/dist/intelligence/notifications.js +65 -0
  68. package/packages/core/dist/intelligence/predictive-gaps.d.ts +14 -0
  69. package/packages/core/dist/intelligence/predictive-gaps.js +74 -0
  70. package/packages/core/dist/intelligence/semantic-versioning.d.ts +37 -0
  71. package/packages/core/dist/intelligence/semantic-versioning.js +68 -0
  72. package/packages/core/dist/intelligence/types.d.ts +28 -0
  73. package/packages/core/dist/intelligence/types.js +3 -0
  74. package/packages/core/dist/mcp/custom-tools.d.ts +29 -0
  75. package/packages/core/dist/mcp/custom-tools.js +70 -0
  76. package/packages/core/{src/mcp/index.ts → dist/mcp/index.d.ts} +1 -0
  77. package/packages/core/dist/mcp/index.js +2 -0
  78. package/packages/core/dist/mcp/server.d.ts +49 -0
  79. package/packages/core/dist/mcp/server.js +133 -0
  80. package/packages/core/dist/mcp/tools/agentic-graph.d.ts +87 -0
  81. package/packages/core/dist/mcp/tools/agentic-graph.js +88 -0
  82. package/packages/core/dist/mcp/tools/brief.d.ts +31 -0
  83. package/packages/core/dist/mcp/tools/brief.js +39 -0
  84. package/packages/core/dist/mcp/tools/decay.d.ts +33 -0
  85. package/packages/core/dist/mcp/tools/decay.js +32 -0
  86. package/packages/core/dist/mcp/tools/decision-journal.d.ts +78 -0
  87. package/packages/core/dist/mcp/tools/decision-journal.js +79 -0
  88. package/packages/core/dist/mcp/tools/export.d.ts +29 -0
  89. package/packages/core/dist/mcp/tools/export.js +60 -0
  90. package/packages/core/dist/mcp/tools/federated-search.d.ts +29 -0
  91. package/packages/core/dist/mcp/tools/federated-search.js +36 -0
  92. package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +35 -0
  93. package/packages/core/dist/mcp/tools/generate-claude-md.js +107 -0
  94. package/packages/core/dist/mcp/tools/get-document.d.ts +35 -0
  95. package/packages/core/dist/mcp/tools/get-document.js +25 -0
  96. package/packages/core/dist/mcp/tools/get-related.d.ts +32 -0
  97. package/packages/core/dist/mcp/tools/get-related.js +33 -0
  98. package/packages/core/dist/mcp/tools/learning-path.d.ts +23 -0
  99. package/packages/core/dist/mcp/tools/learning-path.js +45 -0
  100. package/packages/core/dist/mcp/tools/list-topics.d.ts +15 -0
  101. package/packages/core/dist/mcp/tools/list-topics.js +18 -0
  102. package/packages/core/dist/mcp/tools/search.d.ts +39 -0
  103. package/packages/core/dist/mcp/tools/search.js +29 -0
  104. package/packages/core/dist/mcp/tools/snapshot.d.ts +47 -0
  105. package/packages/core/dist/mcp/tools/snapshot.js +84 -0
  106. package/packages/core/dist/multi-vault/index.d.ts +26 -0
  107. package/packages/core/dist/multi-vault/index.js +80 -0
  108. package/packages/core/dist/pack/creator.d.ts +21 -0
  109. package/packages/core/dist/pack/creator.js +105 -0
  110. package/packages/core/dist/pack/exporter.d.ts +4 -0
  111. package/packages/core/dist/pack/exporter.js +18 -0
  112. package/packages/core/dist/pack/importer.d.ts +10 -0
  113. package/packages/core/dist/pack/importer.js +55 -0
  114. package/packages/core/{src/pack/index.ts → dist/pack/index.d.ts} +1 -0
  115. package/packages/core/dist/pack/index.js +5 -0
  116. package/packages/core/dist/pack/marketplace.d.ts +14 -0
  117. package/packages/core/dist/pack/marketplace.js +90 -0
  118. package/packages/core/dist/pack/pii-masker.d.ts +7 -0
  119. package/packages/core/dist/pack/pii-masker.js +29 -0
  120. package/packages/core/dist/pack/types.d.ts +36 -0
  121. package/packages/core/dist/pack/types.js +3 -0
  122. package/packages/core/dist/plugins/index.d.ts +35 -0
  123. package/packages/core/dist/plugins/index.js +57 -0
  124. package/packages/core/dist/plugins/webhooks.d.ts +30 -0
  125. package/packages/core/dist/plugins/webhooks.js +79 -0
  126. package/packages/core/dist/search/bm25.d.ts +4 -0
  127. package/packages/core/dist/search/bm25.js +10 -0
  128. package/packages/core/dist/search/index.d.ts +13 -0
  129. package/packages/core/dist/search/index.js +63 -0
  130. package/packages/core/dist/search/rrf.d.ts +7 -0
  131. package/packages/core/dist/search/rrf.js +21 -0
  132. package/packages/core/dist/search/semantic.d.ts +5 -0
  133. package/packages/core/dist/search/semantic.js +6 -0
  134. package/packages/core/{src/store/index.ts → dist/store/index.d.ts} +1 -0
  135. package/packages/core/dist/store/index.js +2 -0
  136. package/packages/core/dist/store/sqlite-vec.d.ts +6 -0
  137. package/packages/core/dist/store/sqlite-vec.js +251 -0
  138. package/packages/core/dist/store/types.d.ts +20 -0
  139. package/packages/core/dist/store/types.js +3 -0
  140. package/packages/core/dist/team/index.d.ts +25 -0
  141. package/packages/core/dist/team/index.js +97 -0
  142. package/packages/core/dist/types/chunk.d.ts +23 -0
  143. package/packages/core/dist/types/chunk.js +3 -0
  144. package/packages/core/dist/types/document.d.ts +23 -0
  145. package/packages/core/dist/types/document.js +3 -0
  146. package/packages/core/dist/types/graph.d.ts +39 -0
  147. package/packages/core/dist/types/graph.js +3 -0
  148. package/packages/core/dist/types/index.d.ts +5 -0
  149. package/packages/core/dist/types/index.js +2 -0
  150. package/packages/core/dist/types/search.d.ts +39 -0
  151. package/packages/core/dist/types/search.js +3 -0
  152. package/packages/core/dist/utils/retry.d.ts +25 -0
  153. package/packages/core/dist/utils/retry.js +59 -0
  154. package/.github/workflows/pages.yml +0 -37
  155. package/memory/MEMORY.md +0 -25
  156. package/packages/cli/dist/commands/brief-cmd.d.ts.map +0 -1
  157. package/packages/cli/dist/commands/brief-cmd.js.map +0 -1
  158. package/packages/cli/dist/commands/capture-cmd.d.ts.map +0 -1
  159. package/packages/cli/dist/commands/capture-cmd.js.map +0 -1
  160. package/packages/cli/dist/commands/card-cmd.d.ts.map +0 -1
  161. package/packages/cli/dist/commands/card-cmd.js.map +0 -1
  162. package/packages/cli/dist/commands/clip-cmd.d.ts.map +0 -1
  163. package/packages/cli/dist/commands/clip-cmd.js.map +0 -1
  164. package/packages/cli/dist/commands/cloud-cmd.d.ts.map +0 -1
  165. package/packages/cli/dist/commands/cloud-cmd.js.map +0 -1
  166. package/packages/cli/dist/commands/contradictions-cmd.d.ts.map +0 -1
  167. package/packages/cli/dist/commands/contradictions-cmd.js.map +0 -1
  168. package/packages/cli/dist/commands/decay-cmd.d.ts.map +0 -1
  169. package/packages/cli/dist/commands/decay-cmd.js.map +0 -1
  170. package/packages/cli/dist/commands/digest-cmd.d.ts.map +0 -1
  171. package/packages/cli/dist/commands/digest-cmd.js.map +0 -1
  172. package/packages/cli/dist/commands/duplicates-cmd.d.ts.map +0 -1
  173. package/packages/cli/dist/commands/duplicates-cmd.js.map +0 -1
  174. package/packages/cli/dist/commands/federate-cmd.d.ts.map +0 -1
  175. package/packages/cli/dist/commands/federate-cmd.js.map +0 -1
  176. package/packages/cli/dist/commands/gaps-cmd.d.ts.map +0 -1
  177. package/packages/cli/dist/commands/gaps-cmd.js.map +0 -1
  178. package/packages/cli/dist/commands/graph-cmd.d.ts.map +0 -1
  179. package/packages/cli/dist/commands/graph-cmd.js.map +0 -1
  180. package/packages/cli/dist/commands/index-cmd.d.ts.map +0 -1
  181. package/packages/cli/dist/commands/index-cmd.js.map +0 -1
  182. package/packages/cli/dist/commands/init-cmd.d.ts.map +0 -1
  183. package/packages/cli/dist/commands/init-cmd.js.map +0 -1
  184. package/packages/cli/dist/commands/learn-cmd.d.ts.map +0 -1
  185. package/packages/cli/dist/commands/learn-cmd.js.map +0 -1
  186. package/packages/cli/dist/commands/pack-cmd.d.ts.map +0 -1
  187. package/packages/cli/dist/commands/pack-cmd.js.map +0 -1
  188. package/packages/cli/dist/commands/review-cmd.d.ts.map +0 -1
  189. package/packages/cli/dist/commands/review-cmd.js.map +0 -1
  190. package/packages/cli/dist/commands/search-cmd.d.ts.map +0 -1
  191. package/packages/cli/dist/commands/search-cmd.js.map +0 -1
  192. package/packages/cli/dist/commands/serve-cmd.d.ts.map +0 -1
  193. package/packages/cli/dist/commands/serve-cmd.js.map +0 -1
  194. package/packages/cli/dist/commands/status-cmd.d.ts.map +0 -1
  195. package/packages/cli/dist/commands/status-cmd.js.map +0 -1
  196. package/packages/cli/dist/commands/sync-cmd.d.ts.map +0 -1
  197. package/packages/cli/dist/commands/sync-cmd.js.map +0 -1
  198. package/packages/cli/dist/commands/vault-cmd.d.ts.map +0 -1
  199. package/packages/cli/dist/commands/vault-cmd.js.map +0 -1
  200. package/packages/cli/dist/index.d.ts.map +0 -1
  201. package/packages/cli/dist/index.js.map +0 -1
  202. package/packages/cli/src/commands/brief-cmd.ts +0 -87
  203. package/packages/cli/src/commands/capture-cmd.ts +0 -34
  204. package/packages/cli/src/commands/card-cmd.ts +0 -29
  205. package/packages/cli/src/commands/clip-cmd.ts +0 -172
  206. package/packages/cli/src/commands/cloud-cmd.ts +0 -75
  207. package/packages/cli/src/commands/contradictions-cmd.ts +0 -41
  208. package/packages/cli/src/commands/decay-cmd.ts +0 -57
  209. package/packages/cli/src/commands/digest-cmd.ts +0 -89
  210. package/packages/cli/src/commands/duplicates-cmd.ts +0 -38
  211. package/packages/cli/src/commands/federate-cmd.ts +0 -256
  212. package/packages/cli/src/commands/gaps-cmd.ts +0 -40
  213. package/packages/cli/src/commands/graph-cmd.ts +0 -88
  214. package/packages/cli/src/commands/index-cmd.ts +0 -65
  215. package/packages/cli/src/commands/init-cmd.ts +0 -145
  216. package/packages/cli/src/commands/learn-cmd.ts +0 -56
  217. package/packages/cli/src/commands/pack-cmd.ts +0 -121
  218. package/packages/cli/src/commands/review-cmd.ts +0 -125
  219. package/packages/cli/src/commands/search-cmd.ts +0 -45
  220. package/packages/cli/src/commands/serve-cmd.ts +0 -17
  221. package/packages/cli/src/commands/status-cmd.ts +0 -37
  222. package/packages/cli/src/commands/sync-cmd.ts +0 -68
  223. package/packages/cli/src/commands/vault-cmd.ts +0 -64
  224. package/packages/cli/src/index.ts +0 -187
  225. package/packages/core/src/api/graph-data.ts +0 -286
  226. package/packages/core/src/api/server.ts +0 -660
  227. package/packages/core/src/capture/voice.ts +0 -168
  228. package/packages/core/src/cloud/sync.ts +0 -167
  229. package/packages/core/src/config.ts +0 -82
  230. package/packages/core/src/federation/credits.ts +0 -80
  231. package/packages/core/src/federation/hyperswarm.d.ts +0 -19
  232. package/packages/core/src/federation/identity.ts +0 -90
  233. package/packages/core/src/federation/node.ts +0 -235
  234. package/packages/core/src/federation/privacy.ts +0 -52
  235. package/packages/core/src/federation/reputation.ts +0 -202
  236. package/packages/core/src/federation/search.ts +0 -129
  237. package/packages/core/src/federation/sharing.ts +0 -315
  238. package/packages/core/src/federation/trust.ts +0 -76
  239. package/packages/core/src/federation/types.ts +0 -25
  240. package/packages/core/src/i18n/index.ts +0 -85
  241. package/packages/core/src/indexer/chunker.ts +0 -180
  242. package/packages/core/src/indexer/embedder.ts +0 -9
  243. package/packages/core/src/indexer/index.ts +0 -113
  244. package/packages/core/src/indexer/local-embedder.ts +0 -35
  245. package/packages/core/src/indexer/scanner.ts +0 -142
  246. package/packages/core/src/indexer/watcher.ts +0 -62
  247. package/packages/core/src/intelligence/contradiction-detector.ts +0 -134
  248. package/packages/core/src/intelligence/decay-engine.ts +0 -229
  249. package/packages/core/src/intelligence/duplicate-detector.ts +0 -71
  250. package/packages/core/src/intelligence/fsrs.ts +0 -79
  251. package/packages/core/src/intelligence/gap-detector.ts +0 -109
  252. package/packages/core/src/intelligence/learning-path.ts +0 -86
  253. package/packages/core/src/intelligence/notifications.ts +0 -106
  254. package/packages/core/src/intelligence/predictive-gaps.ts +0 -94
  255. package/packages/core/src/intelligence/semantic-versioning.ts +0 -97
  256. package/packages/core/src/intelligence/types.ts +0 -28
  257. package/packages/core/src/mcp/custom-tools.ts +0 -97
  258. package/packages/core/src/mcp/server.ts +0 -142
  259. package/packages/core/src/mcp/tools/agentic-graph.ts +0 -96
  260. package/packages/core/src/mcp/tools/brief.ts +0 -49
  261. package/packages/core/src/mcp/tools/decay.ts +0 -40
  262. package/packages/core/src/mcp/tools/decision-journal.ts +0 -95
  263. package/packages/core/src/mcp/tools/export.ts +0 -72
  264. package/packages/core/src/mcp/tools/federated-search.ts +0 -43
  265. package/packages/core/src/mcp/tools/generate-claude-md.ts +0 -130
  266. package/packages/core/src/mcp/tools/get-document.ts +0 -26
  267. package/packages/core/src/mcp/tools/get-related.ts +0 -41
  268. package/packages/core/src/mcp/tools/learning-path.ts +0 -52
  269. package/packages/core/src/mcp/tools/list-topics.ts +0 -20
  270. package/packages/core/src/mcp/tools/search.ts +0 -35
  271. package/packages/core/src/mcp/tools/snapshot.ts +0 -98
  272. package/packages/core/src/multi-vault/index.ts +0 -118
  273. package/packages/core/src/pack/creator.ts +0 -127
  274. package/packages/core/src/pack/exporter.ts +0 -21
  275. package/packages/core/src/pack/importer.ts +0 -82
  276. package/packages/core/src/pack/marketplace.ts +0 -103
  277. package/packages/core/src/pack/pii-masker.ts +0 -38
  278. package/packages/core/src/pack/types.ts +0 -39
  279. package/packages/core/src/plugins/index.ts +0 -100
  280. package/packages/core/src/plugins/webhooks.ts +0 -110
  281. package/packages/core/src/search/bm25.ts +0 -16
  282. package/packages/core/src/search/index.ts +0 -83
  283. package/packages/core/src/search/rrf.ts +0 -31
  284. package/packages/core/src/search/semantic.ts +0 -15
  285. package/packages/core/src/store/sqlite-vec.ts +0 -290
  286. package/packages/core/src/store/types.ts +0 -22
  287. package/packages/core/src/team/index.ts +0 -126
  288. package/packages/core/src/types/chunk.ts +0 -25
  289. package/packages/core/src/types/document.ts +0 -24
  290. package/packages/core/src/types/graph.ts +0 -44
  291. package/packages/core/src/types/index.ts +0 -15
  292. package/packages/core/src/types/search.ts +0 -38
  293. package/packages/core/src/utils/retry.ts +0 -85
  294. package/packages/core/tests/api-card.test.ts +0 -60
  295. package/packages/core/tests/api-routes.test.ts +0 -98
  296. package/packages/core/tests/bm25.test.ts +0 -87
  297. package/packages/core/tests/chunker.test.ts +0 -48
  298. package/packages/core/tests/cluster.test.ts +0 -75
  299. package/packages/core/tests/constellation.test.ts +0 -77
  300. package/packages/core/tests/export-utils.test.ts +0 -97
  301. package/packages/core/tests/fsrs.test.ts +0 -96
  302. package/packages/core/tests/gesture-detector.test.ts +0 -45
  303. package/packages/core/tests/graph-data.test.ts +0 -87
  304. package/packages/core/tests/layout.test.ts +0 -83
  305. package/packages/core/tests/mcp.test.ts +0 -148
  306. package/packages/core/tests/pack.test.ts +0 -127
  307. package/packages/core/tests/pii-masker.test.ts +0 -42
  308. package/packages/core/tests/profile-card.test.ts +0 -62
  309. package/packages/core/tests/rrf.test.ts +0 -29
  310. package/packages/core/tests/search-integration.test.ts +0 -139
  311. package/packages/core/tests/store.test.ts +0 -80
  312. package/packages/graph/click-result.png +0 -0
  313. package/packages/graph/dist/assets/camera_utils-BMxqtvoZ.js +0 -1
  314. package/packages/graph/dist/assets/hands-DXA01_mx.js +0 -18
  315. package/packages/graph/dist/assets/index-DMEe2diW.js +0 -4192
  316. package/packages/graph/dist/assets/layout.worker-DbKCEFTz.js +0 -1
  317. package/packages/graph/dist/index.html +0 -17
  318. package/packages/graph/index.html +0 -17
  319. package/packages/graph/package.json +0 -32
  320. package/packages/graph/src/App.tsx +0 -7
  321. package/packages/graph/src/api/client.ts +0 -39
  322. package/packages/graph/src/components/ClusterFilter.tsx +0 -73
  323. package/packages/graph/src/components/ConstellationView.tsx +0 -232
  324. package/packages/graph/src/components/ExportPanel.tsx +0 -177
  325. package/packages/graph/src/components/Graph3D.tsx +0 -230
  326. package/packages/graph/src/components/GraphEdges.tsx +0 -100
  327. package/packages/graph/src/components/GraphNodes.tsx +0 -386
  328. package/packages/graph/src/components/HealthDashboard.tsx +0 -173
  329. package/packages/graph/src/components/Layout.tsx +0 -214
  330. package/packages/graph/src/components/MotionOverlay.tsx +0 -81
  331. package/packages/graph/src/components/MotionToggle.tsx +0 -33
  332. package/packages/graph/src/components/MultiverseView.tsx +0 -286
  333. package/packages/graph/src/components/NodeDetail.tsx +0 -232
  334. package/packages/graph/src/components/PulseParticle.tsx +0 -232
  335. package/packages/graph/src/components/SearchBar.tsx +0 -107
  336. package/packages/graph/src/components/StarField.tsx +0 -197
  337. package/packages/graph/src/components/StatusBar.tsx +0 -53
  338. package/packages/graph/src/components/Timeline.tsx +0 -148
  339. package/packages/graph/src/components/ToolsPanel.tsx +0 -512
  340. package/packages/graph/src/components/Tooltip.tsx +0 -100
  341. package/packages/graph/src/components/TypeFilter.tsx +0 -131
  342. package/packages/graph/src/embed/EmbedGraph.tsx +0 -144
  343. package/packages/graph/src/hooks/useConstellationLOD.ts +0 -76
  344. package/packages/graph/src/hooks/useDecay.ts +0 -37
  345. package/packages/graph/src/hooks/useExport.ts +0 -165
  346. package/packages/graph/src/hooks/useGraph.ts +0 -69
  347. package/packages/graph/src/hooks/useKeyboardNav.ts +0 -122
  348. package/packages/graph/src/hooks/useLayout.ts +0 -45
  349. package/packages/graph/src/hooks/useMotion.ts +0 -120
  350. package/packages/graph/src/hooks/usePulse.ts +0 -58
  351. package/packages/graph/src/hooks/useSearch.ts +0 -71
  352. package/packages/graph/src/lib/constellation.ts +0 -107
  353. package/packages/graph/src/lib/export-utils.ts +0 -48
  354. package/packages/graph/src/lib/gesture-detector.ts +0 -123
  355. package/packages/graph/src/lib/layout.worker.ts +0 -153
  356. package/packages/graph/src/lib/motion-controller.ts +0 -83
  357. package/packages/graph/src/lib/profile-card.ts +0 -122
  358. package/packages/graph/src/main.tsx +0 -4
  359. package/packages/graph/src/stores/graph-store.ts +0 -155
  360. package/packages/graph/success.png +0 -0
  361. package/packages/graph/test-click.mjs +0 -49
  362. package/packages/graph/test-explore.mjs +0 -102
  363. package/packages/graph/test-final.mjs +0 -61
  364. package/packages/graph/test-graph.mjs +0 -139
  365. package/packages/graph/test-hover.mjs +0 -48
  366. package/packages/graph/test-pulse.mjs +0 -68
  367. package/packages/graph/test-screenshot.mjs +0 -56
  368. package/packages/graph/test-v2.mjs +0 -97
  369. package/packages/graph/tsconfig.tsbuildinfo +0 -1
  370. package/packages/graph/vite.config.ts +0 -15
  371. package/packages/sync/.env.example +0 -11
  372. package/packages/sync/.sync-state.json +0 -317
  373. package/packages/sync/.upload-state.json +0 -1009
  374. package/packages/sync/create-stella-network-notion.mjs +0 -151
  375. package/packages/sync/create-stellavault-project-notion.mjs +0 -322
  376. package/packages/sync/logs/sync-2026-03-28.log +0 -6
  377. package/packages/sync/logs/sync-2026-03-29.log +0 -12
  378. package/packages/sync/logs/sync-2026-03-30.log +0 -6
  379. package/packages/sync/logs/sync-2026-03-31.log +0 -6
  380. package/packages/sync/logs/sync-2026-04-01.log +0 -6
  381. package/packages/sync/logs/sync-2026-04-02.log +0 -6
  382. package/packages/sync/package-lock.json +0 -373
  383. package/packages/sync/package.json +0 -16
  384. package/packages/sync/run-sync.bat +0 -18
  385. package/packages/sync/run-sync.mjs +0 -46
  386. package/packages/sync/setup-scheduler.mjs +0 -119
  387. package/packages/sync/structured-sync.mjs +0 -187
  388. package/packages/sync/sync-to-obsidian.mjs +0 -264
  389. package/packages/sync/upload-pdca-to-notion.mjs +0 -495
  390. 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
- });