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,229 +0,0 @@
1
- // Design Ref: §3.2 — 감쇠 엔진 (DB 연동)
2
- // Plan SC: SC-01, SC-02, SC-04
3
-
4
- import type { Database } from 'better-sqlite3';
5
- import type { DecayState, AccessEvent, DecayReport } from './types.js';
6
- import {
7
- computeRetrievability,
8
- updateStability,
9
- estimateInitialStability,
10
- elapsedDays,
11
- FSRS_PARAMS,
12
- } from './fsrs.js';
13
-
14
- export class DecayEngine {
15
- constructor(private db: Database) {
16
- this.ensureTables();
17
- }
18
-
19
- private ensureTables() {
20
- this.db.exec(`
21
- CREATE TABLE IF NOT EXISTS access_log (
22
- id INTEGER PRIMARY KEY AUTOINCREMENT,
23
- document_id TEXT NOT NULL,
24
- access_type TEXT NOT NULL,
25
- accessed_at TEXT NOT NULL
26
- );
27
- CREATE INDEX IF NOT EXISTS idx_access_log_doc ON access_log(document_id);
28
- CREATE INDEX IF NOT EXISTS idx_access_log_time ON access_log(accessed_at);
29
-
30
- CREATE TABLE IF NOT EXISTS decay_state (
31
- document_id TEXT PRIMARY KEY,
32
- stability REAL NOT NULL DEFAULT 7.0,
33
- difficulty REAL NOT NULL DEFAULT 5.0,
34
- last_access TEXT NOT NULL,
35
- retrievability REAL NOT NULL DEFAULT 1.0,
36
- updated_at TEXT NOT NULL
37
- );
38
- `);
39
- }
40
-
41
- /**
42
- * Record an access event and update decay state.
43
- */
44
- async recordAccess(event: AccessEvent): Promise<void> {
45
- const now = event.timestamp || new Date().toISOString();
46
-
47
- // Log the event
48
- this.db.prepare(
49
- 'INSERT INTO access_log (document_id, access_type, accessed_at) VALUES (?, ?, ?)'
50
- ).run(event.documentId, event.type, now);
51
-
52
- // Get or create decay state
53
- const existing = this.db.prepare(
54
- 'SELECT * FROM decay_state WHERE document_id = ?'
55
- ).get(event.documentId) as any;
56
-
57
- if (existing) {
58
- const elapsed = elapsedDays(existing.last_access, now);
59
- const currentR = computeRetrievability(existing.stability, elapsed);
60
- const newS = updateStability(existing.stability, existing.difficulty, currentR);
61
-
62
- this.db.prepare(`
63
- UPDATE decay_state SET stability = ?, last_access = ?, retrievability = 1.0, updated_at = ?
64
- WHERE document_id = ?
65
- `).run(newS, now, now, event.documentId);
66
- } else {
67
- // New document — estimate initial stability
68
- const doc = this.db.prepare('SELECT content FROM documents WHERE id = ?').get(event.documentId) as any;
69
- const contentLen = doc?.content?.length ?? 500;
70
- const connCount = (this.db.prepare(
71
- 'SELECT COUNT(*) as c FROM chunks WHERE document_id = ?'
72
- ).get(event.documentId) as any)?.c ?? 1;
73
- const initS = estimateInitialStability(contentLen, connCount);
74
-
75
- this.db.prepare(`
76
- INSERT INTO decay_state (document_id, stability, difficulty, last_access, retrievability, updated_at)
77
- VALUES (?, ?, ?, ?, 1.0, ?)
78
- `).run(event.documentId, initS, FSRS_PARAMS.difficulty, now, now);
79
- }
80
- }
81
-
82
- /**
83
- * Batch compute retrievability for all documents.
84
- */
85
- async computeAll(): Promise<DecayReport> {
86
- const now = new Date().toISOString();
87
-
88
- // Initialize documents that don't have decay state yet
89
- await this.initializeNewDocuments();
90
-
91
- // Compute R for all
92
- const states = this.db.prepare('SELECT * FROM decay_state').all() as any[];
93
- const docs = this.db.prepare('SELECT id, title FROM documents').all() as any[];
94
- const titleMap = new Map(docs.map((d: any) => [d.id, d.title]));
95
-
96
- const updated: DecayState[] = [];
97
- const updateStmt = this.db.prepare(
98
- 'UPDATE decay_state SET retrievability = ?, updated_at = ? WHERE document_id = ?'
99
- );
100
-
101
- const tx = this.db.transaction(() => {
102
- for (const s of states) {
103
- const elapsed = elapsedDays(s.last_access, now);
104
- const r = computeRetrievability(s.stability, elapsed);
105
- updateStmt.run(r, now, s.document_id);
106
- updated.push({
107
- documentId: s.document_id,
108
- stability: s.stability,
109
- difficulty: s.difficulty,
110
- lastAccess: s.last_access,
111
- retrievability: r,
112
- });
113
- }
114
- });
115
- tx();
116
-
117
- // Build report
118
- const decaying = updated.filter(s => s.retrievability < 0.5);
119
- const critical = updated.filter(s => s.retrievability < 0.3);
120
- const avgR = updated.length > 0
121
- ? updated.reduce((sum, s) => sum + s.retrievability, 0) / updated.length
122
- : 1.0;
123
-
124
- // Top decaying (sorted by R ascending)
125
- const topDecaying = [...decaying]
126
- .sort((a, b) => a.retrievability - b.retrievability)
127
- .slice(0, 20)
128
- .map(s => ({
129
- ...s,
130
- title: titleMap.get(s.documentId) ?? s.documentId,
131
- daysSinceAccess: Math.round(elapsedDays(s.lastAccess, now)),
132
- }));
133
-
134
- // Cluster health
135
- const clusterData = this.db.prepare(`
136
- SELECT ds.document_id, ds.retrievability
137
- FROM decay_state ds
138
- JOIN documents d ON d.id = ds.document_id
139
- `).all() as any[];
140
-
141
- // Get cluster info from graph data cache (simplified: group by first folder)
142
- const clusterHealth = this.computeClusterHealth(clusterData);
143
-
144
- return {
145
- totalDocuments: updated.length,
146
- decayingCount: decaying.length,
147
- criticalCount: critical.length,
148
- averageR: Math.round(avgR * 100) / 100,
149
- topDecaying,
150
- clusterHealth,
151
- };
152
- }
153
-
154
- private computeClusterHealth(data: any[]): DecayReport['clusterHealth'] {
155
- // Group by document's top-level folder as proxy for cluster
156
- const groups = new Map<string, number[]>();
157
- for (const row of data) {
158
- const doc = this.db.prepare('SELECT file_path FROM documents WHERE id = ?').get(row.document_id) as any;
159
- const folder = doc?.file_path?.split('/')[0] ?? 'unknown';
160
- if (!groups.has(folder)) groups.set(folder, []);
161
- groups.get(folder)!.push(row.retrievability);
162
- }
163
-
164
- return [...groups.entries()]
165
- .map(([label, rs]) => ({
166
- label,
167
- avgR: Math.round((rs.reduce((a, b) => a + b, 0) / rs.length) * 100) / 100,
168
- count: rs.length,
169
- }))
170
- .sort((a, b) => a.avgR - b.avgR);
171
- }
172
-
173
- /**
174
- * Get documents below decay threshold.
175
- */
176
- async getDecaying(threshold = 0.5, limit = 20): Promise<Array<DecayState & { title: string }>> {
177
- await this.computeAll(); // refresh R values
178
-
179
- const rows = this.db.prepare(`
180
- SELECT ds.*, d.title FROM decay_state ds
181
- JOIN documents d ON d.id = ds.document_id
182
- WHERE ds.retrievability < ?
183
- ORDER BY ds.retrievability ASC
184
- LIMIT ?
185
- `).all(threshold, limit) as any[];
186
-
187
- return rows.map(r => ({
188
- documentId: r.document_id,
189
- stability: r.stability,
190
- difficulty: r.difficulty,
191
- lastAccess: r.last_access,
192
- retrievability: r.retrievability,
193
- title: r.title,
194
- }));
195
- }
196
-
197
- /**
198
- * Initialize decay state for documents that don't have one yet.
199
- */
200
- async initializeNewDocuments(): Promise<number> {
201
- const missing = this.db.prepare(`
202
- SELECT d.id, d.content, d.last_modified
203
- FROM documents d
204
- LEFT JOIN decay_state ds ON d.id = ds.document_id
205
- WHERE ds.document_id IS NULL
206
- `).all() as any[];
207
-
208
- if (missing.length === 0) return 0;
209
-
210
- const insert = this.db.prepare(`
211
- INSERT OR IGNORE INTO decay_state (document_id, stability, difficulty, last_access, retrievability, updated_at)
212
- VALUES (?, ?, ?, ?, ?, ?)
213
- `);
214
-
215
- const tx = this.db.transaction(() => {
216
- for (const doc of missing) {
217
- const contentLen = doc.content?.length ?? 500;
218
- const initS = estimateInitialStability(contentLen, 1);
219
- const lastAccess = doc.last_modified || new Date().toISOString();
220
- const elapsed = elapsedDays(lastAccess);
221
- const r = computeRetrievability(initS, elapsed);
222
- insert.run(doc.id, initS, FSRS_PARAMS.difficulty, lastAccess, r, new Date().toISOString());
223
- }
224
- });
225
- tx();
226
-
227
- return missing.length;
228
- }
229
- }
@@ -1,71 +0,0 @@
1
- // Design Ref: 중복/유사 노트 탐지
2
- // 기존 벡터 임베딩의 cosine similarity 활용
3
-
4
- import type { VectorStore } from '../store/types.js';
5
-
6
- export interface DuplicatePair {
7
- docA: { id: string; title: string; filePath: string };
8
- docB: { id: string; title: string; filePath: string };
9
- similarity: number;
10
- }
11
-
12
- /**
13
- * 벡터 유사도 기반 중복 노트 탐지.
14
- * 문서별 평균 임베딩을 비교하여 threshold 이상인 쌍을 반환.
15
- */
16
- export async function detectDuplicates(
17
- store: VectorStore,
18
- threshold = 0.88,
19
- limit = 20,
20
- ): Promise<DuplicatePair[]> {
21
- const docs = await store.getAllDocuments();
22
- const embeddings = await store.getDocumentEmbeddings();
23
-
24
- if (docs.length < 2) return [];
25
-
26
- // 문서별 평균 임베딩 계산
27
- const docVecs = new Map<string, { vec: number[]; title: string; filePath: string }>();
28
- for (const doc of docs) {
29
- const vec = embeddings.get(doc.id);
30
- if (!vec || vec.length === 0) continue;
31
- docVecs.set(doc.id, { vec: Array.from(vec), title: doc.title, filePath: doc.filePath });
32
- }
33
-
34
- const ids = [...docVecs.keys()];
35
- const pairs: DuplicatePair[] = [];
36
-
37
- // O(n²) — 1,200 문서면 ~720K 비교, 수 초 이내
38
- for (let i = 0; i < ids.length; i++) {
39
- for (let j = i + 1; j < ids.length; j++) {
40
- const a = docVecs.get(ids[i])!;
41
- const b = docVecs.get(ids[j])!;
42
- const sim = cosineSimilarity(a.vec, b.vec);
43
-
44
- if (sim >= threshold) {
45
- pairs.push({
46
- docA: { id: ids[i], title: a.title, filePath: a.filePath },
47
- docB: { id: ids[j], title: b.title, filePath: b.filePath },
48
- similarity: Math.round(sim * 1000) / 1000,
49
- });
50
- }
51
- }
52
-
53
- if (pairs.length >= limit * 2) break; // 충분히 찾으면 중단
54
- }
55
-
56
- return pairs
57
- .sort((a, b) => b.similarity - a.similarity)
58
- .slice(0, limit);
59
- }
60
-
61
- function cosineSimilarity(a: number[], b: number[]): number {
62
- if (a.length !== b.length) return 0;
63
- let dot = 0, normA = 0, normB = 0;
64
- for (let i = 0; i < a.length; i++) {
65
- dot += a[i] * b[i];
66
- normA += a[i] * a[i];
67
- normB += b[i] * b[i];
68
- }
69
- const denom = Math.sqrt(normA) * Math.sqrt(normB);
70
- return denom === 0 ? 0 : dot / denom;
71
- }
@@ -1,79 +0,0 @@
1
- // Design Ref: §1 — FSRS-6 알고리즘 (순수 함수)
2
- // Plan SC: SC-01 (R값 계산), SC-02 (stability 업데이트)
3
-
4
- /**
5
- * FSRS parameters tuned for knowledge notes (not flashcards).
6
- * Knowledge notes have longer natural retention than flashcards.
7
- */
8
- export const FSRS_PARAMS = {
9
- initialStability: 7.0, // 7 days for new notes
10
- difficulty: 5.0, // default difficulty (1~10)
11
- // Stability growth factors
12
- a: 0.4,
13
- b: 0.6,
14
- c: 0.2,
15
- d: 1.0,
16
- // Stability bonus for large/connected notes
17
- sizeFactor: 0.5, // additional days per 1000 chars
18
- connectionFactor: 1.0, // additional days per connection
19
- } as const;
20
-
21
- /**
22
- * Compute retrievability R(t) using FSRS power forgetting curve.
23
- * R(t) = (1 + t / (9 * S))^(-1)
24
- *
25
- * @param stabilityDays - Stability S (days until R drops to ~0.9)
26
- * @param elapsedDays - Days since last access
27
- * @returns Retrievability 0~1
28
- */
29
- export function computeRetrievability(stabilityDays: number, elapsedDays: number): number {
30
- if (elapsedDays <= 0) return 1.0;
31
- if (stabilityDays <= 0) return 0.0;
32
- return Math.pow(1 + elapsedDays / (9 * stabilityDays), -1);
33
- }
34
-
35
- /**
36
- * Update stability after an access event (successful recall).
37
- * S' = S * (1 + a * D^(-b) * S^(-c) * (e^(d*(1-R)) - 1))
38
- *
39
- * @param currentS - Current stability
40
- * @param difficulty - Note difficulty (1~10)
41
- * @param currentR - Retrievability at access time
42
- * @returns New stability (always >= currentS)
43
- */
44
- export function updateStability(
45
- currentS: number,
46
- difficulty: number,
47
- currentR: number,
48
- ): number {
49
- const { a, b, c, d } = FSRS_PARAMS;
50
- const growth = a
51
- * Math.pow(difficulty, -b)
52
- * Math.pow(currentS, -c)
53
- * (Math.exp(d * (1 - currentR)) - 1);
54
- const newS = currentS * (1 + Math.max(0, growth));
55
- // Cap at 365 days (1 year max stability)
56
- return Math.min(newS, 365);
57
- }
58
-
59
- /**
60
- * Estimate initial stability based on note characteristics.
61
- * Longer notes and more connected notes are more stable.
62
- */
63
- export function estimateInitialStability(
64
- contentLength: number,
65
- connectionCount: number,
66
- ): number {
67
- const base = FSRS_PARAMS.initialStability;
68
- const sizeBonus = Math.min(contentLength / 1000, 10) * FSRS_PARAMS.sizeFactor;
69
- const connBonus = Math.min(connectionCount, 10) * FSRS_PARAMS.connectionFactor;
70
- return base + sizeBonus + connBonus;
71
- }
72
-
73
- /**
74
- * Compute elapsed days between two ISO timestamps.
75
- */
76
- export function elapsedDays(from: string, to: string = new Date().toISOString()): number {
77
- const msPerDay = 86400000;
78
- return Math.max(0, (new Date(to).getTime() - new Date(from).getTime()) / msPerDay);
79
- }
@@ -1,109 +0,0 @@
1
- // Design Ref: F01 — 지식 갭 탐지기
2
- // 클러스터 간 브릿지 노드 부족 영역 식별
3
-
4
- import type { VectorStore } from '../store/types.js';
5
-
6
- export interface KnowledgeGap {
7
- clusterA: string;
8
- clusterB: string;
9
- bridgeCount: number; // 연결 노드 수 (적을수록 갭)
10
- suggestedTopic: string; // 학습 추천 주제
11
- severity: 'high' | 'medium' | 'low';
12
- }
13
-
14
- export interface GapReport {
15
- totalClusters: number;
16
- totalGaps: number;
17
- gaps: KnowledgeGap[];
18
- isolatedNodes: Array<{ id: string; title: string; connections: number }>;
19
- }
20
-
21
- /**
22
- * 그래프 데이터에서 지식 갭을 탐지.
23
- * - 클러스터 간 연결이 약한 영역
24
- * - 고립된 노드 (연결 0~1개)
25
- */
26
- export async function detectKnowledgeGaps(
27
- store: VectorStore,
28
- graphData?: any, // buildGraphData 결과 (없으면 직접 계산)
29
- ): Promise<GapReport> {
30
- const docs = await store.getAllDocuments();
31
- const embeddings = await store.getDocumentEmbeddings();
32
-
33
- // 그래프 데이터가 없으면 간단히 계산
34
- if (!graphData) {
35
- const { buildGraphData } = await import('../api/graph-data.js');
36
- graphData = await buildGraphData(store);
37
- }
38
-
39
- const { nodes, edges, clusters } = graphData;
40
-
41
- // 1. 클러스터 간 연결 수 매트릭스
42
- const clusterEdges = new Map<string, number>();
43
- for (const edge of edges) {
44
- const nodeA = nodes.find((n: any) => n.id === edge.source);
45
- const nodeB = nodes.find((n: any) => n.id === edge.target);
46
- if (!nodeA || !nodeB || nodeA.clusterId === nodeB.clusterId) continue;
47
-
48
- const key = [
49
- Math.min(nodeA.clusterId, nodeB.clusterId),
50
- Math.max(nodeA.clusterId, nodeB.clusterId),
51
- ].join('-');
52
- clusterEdges.set(key, (clusterEdges.get(key) ?? 0) + 1);
53
- }
54
-
55
- // 2. 갭 식별 (클러스터 쌍 중 연결이 적은 것)
56
- const gaps: KnowledgeGap[] = [];
57
- const clusterLabels = new Map<number, string>(clusters.map((c: any) => [c.id, c.label as string]));
58
-
59
- for (let i = 0; i < clusters.length; i++) {
60
- for (let j = i + 1; j < clusters.length; j++) {
61
- const key = `${Math.min(clusters[i].id, clusters[j].id)}-${Math.max(clusters[i].id, clusters[j].id)}`;
62
- const bridgeCount = clusterEdges.get(key) ?? 0;
63
-
64
- // 연결이 3개 미만이면 갭
65
- if (bridgeCount < 3) {
66
- const labelA = clusterLabels.get(clusters[i].id) ?? `Cluster ${clusters[i].id}`;
67
- const labelB = clusterLabels.get(clusters[j].id) ?? `Cluster ${clusters[j].id}`;
68
-
69
- // 제안 주제: 두 클러스터 이름에서 추출
70
- const nameA = labelA.replace(/\s*\(\d+\)$/, '');
71
- const nameB = labelB.replace(/\s*\(\d+\)$/, '');
72
-
73
- gaps.push({
74
- clusterA: labelA,
75
- clusterB: labelB,
76
- bridgeCount,
77
- suggestedTopic: `${nameA} + ${nameB} 연결 지식`,
78
- severity: bridgeCount === 0 ? 'high' : bridgeCount < 2 ? 'medium' : 'low',
79
- });
80
- }
81
- }
82
- }
83
-
84
- // 3. 고립 노드 (연결 1개 이하)
85
- const connectionCounts = new Map<string, number>();
86
- for (const edge of edges) {
87
- connectionCounts.set(edge.source, (connectionCounts.get(edge.source) ?? 0) + 1);
88
- connectionCounts.set(edge.target, (connectionCounts.get(edge.target) ?? 0) + 1);
89
- }
90
-
91
- const isolatedNodes = nodes
92
- .filter((n: any) => (connectionCounts.get(n.id) ?? 0) <= 1)
93
- .map((n: any) => ({
94
- id: n.id,
95
- title: n.label,
96
- connections: connectionCounts.get(n.id) ?? 0,
97
- }))
98
- .slice(0, 20);
99
-
100
- return {
101
- totalClusters: clusters.length,
102
- totalGaps: gaps.filter(g => g.severity !== 'low').length,
103
- gaps: gaps.sort((a, b) => {
104
- const sev = { high: 0, medium: 1, low: 2 };
105
- return sev[a.severity] - sev[b.severity];
106
- }).slice(0, 15),
107
- isolatedNodes,
108
- };
109
- }
@@ -1,86 +0,0 @@
1
- // AI Learning Path Generator (F-A11)
2
- // Analyzes decay + gaps + relationships to recommend what to review/learn next
3
-
4
- import type { DecayReport, DecayState } from './types.js';
5
-
6
- export interface LearningItem {
7
- documentId: string;
8
- title: string;
9
- reason: string;
10
- priority: 'critical' | 'important' | 'suggested';
11
- score: number; // 0-100, higher = more urgent
12
- category: 'review' | 'explore' | 'bridge';
13
- }
14
-
15
- export interface LearningPath {
16
- items: LearningItem[];
17
- summary: {
18
- reviewCount: number;
19
- exploreCount: number;
20
- bridgeCount: number;
21
- estimatedMinutes: number;
22
- };
23
- generatedAt: string;
24
- }
25
-
26
- export interface LearningPathInput {
27
- decayReport: DecayReport;
28
- gaps?: Array<{ clusterA: string; clusterB: string; severity: string; suggestedTopic: string }>;
29
- recentSearches?: string[];
30
- }
31
-
32
- export function generateLearningPath(input: LearningPathInput, limit = 15): LearningPath {
33
- const items: LearningItem[] = [];
34
-
35
- // 1. Review: decaying notes (highest priority)
36
- if (input.decayReport.topDecaying) {
37
- for (const d of input.decayReport.topDecaying) {
38
- const r = d.retrievability ?? 0;
39
- const urgency = (1 - r) * 100;
40
- items.push({
41
- documentId: d.documentId,
42
- title: d.title,
43
- reason: r < 0.3
44
- ? `Critical: ${Math.round(r * 100)}% retrievability, ${d.daysSinceAccess}d since last access`
45
- : `Fading: ${Math.round(r * 100)}% retrievability, review to strengthen memory`,
46
- priority: r < 0.3 ? 'critical' : r < 0.5 ? 'important' : 'suggested',
47
- score: Math.round(urgency),
48
- category: 'review',
49
- });
50
- }
51
- }
52
-
53
- // 2. Bridge: knowledge gaps
54
- if (input.gaps) {
55
- for (const gap of input.gaps) {
56
- const severityScore = gap.severity === 'high' ? 80 : gap.severity === 'medium' ? 60 : 40;
57
- items.push({
58
- documentId: '',
59
- title: gap.suggestedTopic || `${gap.clusterA} × ${gap.clusterB}`,
60
- reason: `Gap between "${gap.clusterA}" and "${gap.clusterB}" — creating a bridge note strengthens your knowledge network`,
61
- priority: gap.severity === 'high' ? 'important' : 'suggested',
62
- score: severityScore,
63
- category: 'bridge',
64
- });
65
- }
66
- }
67
-
68
- // Sort by score descending
69
- items.sort((a, b) => b.score - a.score);
70
-
71
- const selected = items.slice(0, limit);
72
- const reviewCount = selected.filter(i => i.category === 'review').length;
73
- const exploreCount = selected.filter(i => i.category === 'explore').length;
74
- const bridgeCount = selected.filter(i => i.category === 'bridge').length;
75
-
76
- return {
77
- items: selected,
78
- summary: {
79
- reviewCount,
80
- exploreCount,
81
- bridgeCount,
82
- estimatedMinutes: reviewCount * 3 + exploreCount * 5 + bridgeCount * 8,
83
- },
84
- generatedAt: new Date().toISOString(),
85
- };
86
- }
@@ -1,106 +0,0 @@
1
- // Notification Center (F-A05)
2
- // Configurable alerts for decay thresholds, gap detection, weekly digest
3
-
4
- import type { DecayReport } from './types.js';
5
-
6
- export interface NotificationConfig {
7
- decay: {
8
- enabled: boolean;
9
- criticalThreshold: number; // R value (0-1), default 0.3
10
- warningThreshold: number; // default 0.5
11
- };
12
- gaps: {
13
- enabled: boolean;
14
- minSeverity: 'low' | 'medium' | 'high'; // default 'medium'
15
- };
16
- digest: {
17
- enabled: boolean;
18
- frequency: 'daily' | 'weekly' | 'off'; // default 'weekly'
19
- };
20
- }
21
-
22
- export interface Notification {
23
- id: string;
24
- type: 'decay_critical' | 'decay_warning' | 'gap_detected' | 'digest';
25
- title: string;
26
- message: string;
27
- timestamp: string;
28
- priority: 'high' | 'medium' | 'low';
29
- data?: Record<string, unknown>;
30
- }
31
-
32
- const DEFAULT_CONFIG: NotificationConfig = {
33
- decay: { enabled: true, criticalThreshold: 0.3, warningThreshold: 0.5 },
34
- gaps: { enabled: true, minSeverity: 'medium' },
35
- digest: { enabled: true, frequency: 'weekly' },
36
- };
37
-
38
- export function checkNotifications(
39
- decayReport: DecayReport,
40
- gaps: Array<{ severity: string; clusterA: string; clusterB: string }>,
41
- config: Partial<NotificationConfig> = {},
42
- ): Notification[] {
43
- const cfg = {
44
- decay: { ...DEFAULT_CONFIG.decay, ...config.decay },
45
- gaps: { ...DEFAULT_CONFIG.gaps, ...config.gaps },
46
- digest: { ...DEFAULT_CONFIG.digest, ...config.digest },
47
- };
48
- const notifications: Notification[] = [];
49
- const now = new Date().toISOString();
50
-
51
- // Decay alerts
52
- if (cfg.decay.enabled && decayReport.topDecaying) {
53
- const criticals = decayReport.topDecaying.filter(d => d.retrievability < cfg.decay.criticalThreshold);
54
- const warnings = decayReport.topDecaying.filter(d =>
55
- d.retrievability >= cfg.decay.criticalThreshold && d.retrievability < cfg.decay.warningThreshold
56
- );
57
-
58
- if (criticals.length > 0) {
59
- notifications.push({
60
- id: `decay-critical-${Date.now()}`,
61
- type: 'decay_critical',
62
- title: `${criticals.length} notes critically fading`,
63
- message: criticals.slice(0, 3).map(d => `"${d.title}" (${Math.round(d.retrievability * 100)}%)`).join(', '),
64
- timestamp: now,
65
- priority: 'high',
66
- data: { count: criticals.length, notes: criticals.slice(0, 5).map(d => d.title) },
67
- });
68
- }
69
-
70
- if (warnings.length > 0) {
71
- notifications.push({
72
- id: `decay-warning-${Date.now()}`,
73
- type: 'decay_warning',
74
- title: `${warnings.length} notes starting to fade`,
75
- message: `Average retrievability: ${Math.round(decayReport.averageR * 100)}%`,
76
- timestamp: now,
77
- priority: 'medium',
78
- data: { count: warnings.length },
79
- });
80
- }
81
- }
82
-
83
- // Gap alerts
84
- if (cfg.gaps.enabled) {
85
- const severityOrder = { high: 3, medium: 2, low: 1 };
86
- const minLevel = severityOrder[cfg.gaps.minSeverity] ?? 2;
87
- const significantGaps = gaps.filter(g => (severityOrder[g.severity as keyof typeof severityOrder] ?? 0) >= minLevel);
88
-
89
- if (significantGaps.length > 0) {
90
- notifications.push({
91
- id: `gap-${Date.now()}`,
92
- type: 'gap_detected',
93
- title: `${significantGaps.length} knowledge gaps detected`,
94
- message: significantGaps.slice(0, 2).map(g => `${g.clusterA} ↔ ${g.clusterB}`).join(', '),
95
- timestamp: now,
96
- priority: significantGaps.some(g => g.severity === 'high') ? 'high' : 'medium',
97
- data: { count: significantGaps.length },
98
- });
99
- }
100
- }
101
-
102
- return notifications.sort((a, b) => {
103
- const p = { high: 3, medium: 2, low: 1 };
104
- return (p[b.priority] ?? 0) - (p[a.priority] ?? 0);
105
- });
106
- }