@andre.li/memoark 0.3.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 (441) hide show
  1. package/LICENSE +191 -0
  2. package/README.en.md +606 -0
  3. package/README.md +560 -0
  4. package/bin/memoark.mjs +36 -0
  5. package/dist/adapters/file.d.ts +19 -0
  6. package/dist/adapters/file.d.ts.map +1 -0
  7. package/dist/adapters/file.js +61 -0
  8. package/dist/adapters/file.js.map +1 -0
  9. package/dist/adapters/gbrain.d.ts +29 -0
  10. package/dist/adapters/gbrain.d.ts.map +1 -0
  11. package/dist/adapters/gbrain.js +622 -0
  12. package/dist/adapters/gbrain.js.map +1 -0
  13. package/dist/adapters/index.d.ts +6 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +5 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/registry.d.ts +18 -0
  18. package/dist/adapters/registry.d.ts.map +1 -0
  19. package/dist/adapters/registry.js +18 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/stdout.d.ts +12 -0
  22. package/dist/adapters/stdout.d.ts.map +1 -0
  23. package/dist/adapters/stdout.js +29 -0
  24. package/dist/adapters/stdout.js.map +1 -0
  25. package/dist/adapters/store.d.ts +47 -0
  26. package/dist/adapters/store.d.ts.map +1 -0
  27. package/dist/adapters/store.js +641 -0
  28. package/dist/adapters/store.js.map +1 -0
  29. package/dist/cli.d.ts +2 -0
  30. package/dist/cli.d.ts.map +1 -0
  31. package/dist/cli.js +694 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/collectors/agent/claude-code.d.ts +12 -0
  34. package/dist/collectors/agent/claude-code.d.ts.map +1 -0
  35. package/dist/collectors/agent/claude-code.js +94 -0
  36. package/dist/collectors/agent/claude-code.js.map +1 -0
  37. package/dist/collectors/agent/codex.d.ts +16 -0
  38. package/dist/collectors/agent/codex.d.ts.map +1 -0
  39. package/dist/collectors/agent/codex.js +149 -0
  40. package/dist/collectors/agent/codex.js.map +1 -0
  41. package/dist/collectors/agent/collector.d.ts +20 -0
  42. package/dist/collectors/agent/collector.d.ts.map +1 -0
  43. package/dist/collectors/agent/collector.js +108 -0
  44. package/dist/collectors/agent/collector.js.map +1 -0
  45. package/dist/collectors/agent/hermes.d.ts +13 -0
  46. package/dist/collectors/agent/hermes.d.ts.map +1 -0
  47. package/dist/collectors/agent/hermes.js +90 -0
  48. package/dist/collectors/agent/hermes.js.map +1 -0
  49. package/dist/collectors/agent/index.d.ts +6 -0
  50. package/dist/collectors/agent/index.d.ts.map +1 -0
  51. package/dist/collectors/agent/index.js +5 -0
  52. package/dist/collectors/agent/index.js.map +1 -0
  53. package/dist/collectors/agent/types.d.ts +61 -0
  54. package/dist/collectors/agent/types.d.ts.map +1 -0
  55. package/dist/collectors/agent/types.js +6 -0
  56. package/dist/collectors/agent/types.js.map +1 -0
  57. package/dist/collectors/feishu/auth.d.ts +13 -0
  58. package/dist/collectors/feishu/auth.d.ts.map +1 -0
  59. package/dist/collectors/feishu/auth.js +72 -0
  60. package/dist/collectors/feishu/auth.js.map +1 -0
  61. package/dist/collectors/feishu/collector.d.ts +23 -0
  62. package/dist/collectors/feishu/collector.d.ts.map +1 -0
  63. package/dist/collectors/feishu/collector.js +113 -0
  64. package/dist/collectors/feishu/collector.js.map +1 -0
  65. package/dist/collectors/feishu/cursor-staging.d.ts +11 -0
  66. package/dist/collectors/feishu/cursor-staging.d.ts.map +1 -0
  67. package/dist/collectors/feishu/cursor-staging.js +37 -0
  68. package/dist/collectors/feishu/cursor-staging.js.map +1 -0
  69. package/dist/collectors/feishu/http-client.d.ts +26 -0
  70. package/dist/collectors/feishu/http-client.d.ts.map +1 -0
  71. package/dist/collectors/feishu/http-client.js +94 -0
  72. package/dist/collectors/feishu/http-client.js.map +1 -0
  73. package/dist/collectors/feishu/index.d.ts +3 -0
  74. package/dist/collectors/feishu/index.d.ts.map +1 -0
  75. package/dist/collectors/feishu/index.js +2 -0
  76. package/dist/collectors/feishu/index.js.map +1 -0
  77. package/dist/collectors/feishu/lark-cli-client.d.ts +16 -0
  78. package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -0
  79. package/dist/collectors/feishu/lark-cli-client.js +69 -0
  80. package/dist/collectors/feishu/lark-cli-client.js.map +1 -0
  81. package/dist/collectors/feishu/rate-limiter.d.ts +10 -0
  82. package/dist/collectors/feishu/rate-limiter.d.ts.map +1 -0
  83. package/dist/collectors/feishu/rate-limiter.js +33 -0
  84. package/dist/collectors/feishu/rate-limiter.js.map +1 -0
  85. package/dist/collectors/feishu/sources/base.d.ts +9 -0
  86. package/dist/collectors/feishu/sources/base.d.ts.map +1 -0
  87. package/dist/collectors/feishu/sources/base.js +2 -0
  88. package/dist/collectors/feishu/sources/base.js.map +1 -0
  89. package/dist/collectors/feishu/sources/calendar.d.ts +16 -0
  90. package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -0
  91. package/dist/collectors/feishu/sources/calendar.js +93 -0
  92. package/dist/collectors/feishu/sources/calendar.js.map +1 -0
  93. package/dist/collectors/feishu/sources/dm.d.ts +28 -0
  94. package/dist/collectors/feishu/sources/dm.d.ts.map +1 -0
  95. package/dist/collectors/feishu/sources/dm.js +152 -0
  96. package/dist/collectors/feishu/sources/dm.js.map +1 -0
  97. package/dist/collectors/feishu/sources/docs.d.ts +23 -0
  98. package/dist/collectors/feishu/sources/docs.d.ts.map +1 -0
  99. package/dist/collectors/feishu/sources/docs.js +154 -0
  100. package/dist/collectors/feishu/sources/docs.js.map +1 -0
  101. package/dist/collectors/feishu/sources/mail.d.ts +27 -0
  102. package/dist/collectors/feishu/sources/mail.d.ts.map +1 -0
  103. package/dist/collectors/feishu/sources/mail.js +136 -0
  104. package/dist/collectors/feishu/sources/mail.js.map +1 -0
  105. package/dist/collectors/feishu/sources/message-search.d.ts +37 -0
  106. package/dist/collectors/feishu/sources/message-search.d.ts.map +1 -0
  107. package/dist/collectors/feishu/sources/message-search.js +140 -0
  108. package/dist/collectors/feishu/sources/message-search.js.map +1 -0
  109. package/dist/collectors/feishu/sources/messages.d.ts +26 -0
  110. package/dist/collectors/feishu/sources/messages.d.ts.map +1 -0
  111. package/dist/collectors/feishu/sources/messages.js +148 -0
  112. package/dist/collectors/feishu/sources/messages.js.map +1 -0
  113. package/dist/collectors/feishu/sources/tasks.d.ts +15 -0
  114. package/dist/collectors/feishu/sources/tasks.d.ts.map +1 -0
  115. package/dist/collectors/feishu/sources/tasks.js +74 -0
  116. package/dist/collectors/feishu/sources/tasks.js.map +1 -0
  117. package/dist/collectors/feishu/types.d.ts +224 -0
  118. package/dist/collectors/feishu/types.d.ts.map +1 -0
  119. package/dist/collectors/feishu/types.js +17 -0
  120. package/dist/collectors/feishu/types.js.map +1 -0
  121. package/dist/collectors/index.d.ts +10 -0
  122. package/dist/collectors/index.d.ts.map +1 -0
  123. package/dist/collectors/index.js +18 -0
  124. package/dist/collectors/index.js.map +1 -0
  125. package/dist/config-center/connection-checks.d.ts +28 -0
  126. package/dist/config-center/connection-checks.d.ts.map +1 -0
  127. package/dist/config-center/connection-checks.js +114 -0
  128. package/dist/config-center/connection-checks.js.map +1 -0
  129. package/dist/config-center/document.d.ts +21 -0
  130. package/dist/config-center/document.d.ts.map +1 -0
  131. package/dist/config-center/document.js +93 -0
  132. package/dist/config-center/document.js.map +1 -0
  133. package/dist/config-center/index.d.ts +9 -0
  134. package/dist/config-center/index.d.ts.map +1 -0
  135. package/dist/config-center/index.js +29 -0
  136. package/dist/config-center/index.js.map +1 -0
  137. package/dist/config-center/recommendations.d.ts +16 -0
  138. package/dist/config-center/recommendations.d.ts.map +1 -0
  139. package/dist/config-center/recommendations.js +50 -0
  140. package/dist/config-center/recommendations.js.map +1 -0
  141. package/dist/config-center/reducer.d.ts +57 -0
  142. package/dist/config-center/reducer.d.ts.map +1 -0
  143. package/dist/config-center/reducer.js +192 -0
  144. package/dist/config-center/reducer.js.map +1 -0
  145. package/dist/config-center/schema.d.ts +31 -0
  146. package/dist/config-center/schema.d.ts.map +1 -0
  147. package/dist/config-center/schema.js +365 -0
  148. package/dist/config-center/schema.js.map +1 -0
  149. package/dist/config-center/secrets.d.ts +4 -0
  150. package/dist/config-center/secrets.d.ts.map +1 -0
  151. package/dist/config-center/secrets.js +27 -0
  152. package/dist/config-center/secrets.js.map +1 -0
  153. package/dist/config-center/source-dirs.d.ts +16 -0
  154. package/dist/config-center/source-dirs.d.ts.map +1 -0
  155. package/dist/config-center/source-dirs.js +81 -0
  156. package/dist/config-center/source-dirs.js.map +1 -0
  157. package/dist/config-center/tui/app.d.ts +22 -0
  158. package/dist/config-center/tui/app.d.ts.map +1 -0
  159. package/dist/config-center/tui/app.js +142 -0
  160. package/dist/config-center/tui/app.js.map +1 -0
  161. package/dist/config-center/tui/render.d.ts +20 -0
  162. package/dist/config-center/tui/render.d.ts.map +1 -0
  163. package/dist/config-center/tui/render.js +166 -0
  164. package/dist/config-center/tui/render.js.map +1 -0
  165. package/dist/config-center/validation.d.ts +9 -0
  166. package/dist/config-center/validation.d.ts.map +1 -0
  167. package/dist/config-center/validation.js +59 -0
  168. package/dist/config-center/validation.js.map +1 -0
  169. package/dist/consolidator/consolidator.d.ts +31 -0
  170. package/dist/consolidator/consolidator.d.ts.map +1 -0
  171. package/dist/consolidator/consolidator.js +57 -0
  172. package/dist/consolidator/consolidator.js.map +1 -0
  173. package/dist/consolidator/dead-link.d.ts +7 -0
  174. package/dist/consolidator/dead-link.d.ts.map +1 -0
  175. package/dist/consolidator/dead-link.js +57 -0
  176. package/dist/consolidator/dead-link.js.map +1 -0
  177. package/dist/consolidator/hot-warm.d.ts +9 -0
  178. package/dist/consolidator/hot-warm.d.ts.map +1 -0
  179. package/dist/consolidator/hot-warm.js +88 -0
  180. package/dist/consolidator/hot-warm.js.map +1 -0
  181. package/dist/consolidator/infer-preferences.d.ts +14 -0
  182. package/dist/consolidator/infer-preferences.d.ts.map +1 -0
  183. package/dist/consolidator/infer-preferences.js +73 -0
  184. package/dist/consolidator/infer-preferences.js.map +1 -0
  185. package/dist/consolidator/rules.d.ts +5 -0
  186. package/dist/consolidator/rules.d.ts.map +1 -0
  187. package/dist/consolidator/rules.js +53 -0
  188. package/dist/consolidator/rules.js.map +1 -0
  189. package/dist/consolidator/warm-cold.d.ts +13 -0
  190. package/dist/consolidator/warm-cold.d.ts.map +1 -0
  191. package/dist/consolidator/warm-cold.js +91 -0
  192. package/dist/consolidator/warm-cold.js.map +1 -0
  193. package/dist/core/block-builder.d.ts +15 -0
  194. package/dist/core/block-builder.d.ts.map +1 -0
  195. package/dist/core/block-builder.js +185 -0
  196. package/dist/core/block-builder.js.map +1 -0
  197. package/dist/core/canonicalize.d.ts +3 -0
  198. package/dist/core/canonicalize.d.ts.map +1 -0
  199. package/dist/core/canonicalize.js +137 -0
  200. package/dist/core/canonicalize.js.map +1 -0
  201. package/dist/core/concurrency.d.ts +2 -0
  202. package/dist/core/concurrency.d.ts.map +1 -0
  203. package/dist/core/concurrency.js +14 -0
  204. package/dist/core/concurrency.js.map +1 -0
  205. package/dist/core/config.d.ts +184 -0
  206. package/dist/core/config.d.ts.map +1 -0
  207. package/dist/core/config.js +136 -0
  208. package/dist/core/config.js.map +1 -0
  209. package/dist/core/cursors.d.ts +36 -0
  210. package/dist/core/cursors.d.ts.map +1 -0
  211. package/dist/core/cursors.js +90 -0
  212. package/dist/core/cursors.js.map +1 -0
  213. package/dist/core/dedup.d.ts +45 -0
  214. package/dist/core/dedup.d.ts.map +1 -0
  215. package/dist/core/dedup.js +111 -0
  216. package/dist/core/dedup.js.map +1 -0
  217. package/dist/core/entity-extract.d.ts +3 -0
  218. package/dist/core/entity-extract.d.ts.map +1 -0
  219. package/dist/core/entity-extract.js +54 -0
  220. package/dist/core/entity-extract.js.map +1 -0
  221. package/dist/core/helpers.d.ts +3 -0
  222. package/dist/core/helpers.d.ts.map +1 -0
  223. package/dist/core/helpers.js +10 -0
  224. package/dist/core/helpers.js.map +1 -0
  225. package/dist/core/identity-resolver.d.ts +21 -0
  226. package/dist/core/identity-resolver.d.ts.map +1 -0
  227. package/dist/core/identity-resolver.js +62 -0
  228. package/dist/core/identity-resolver.js.map +1 -0
  229. package/dist/core/pipeline-factory.d.ts +13 -0
  230. package/dist/core/pipeline-factory.d.ts.map +1 -0
  231. package/dist/core/pipeline-factory.js +32 -0
  232. package/dist/core/pipeline-factory.js.map +1 -0
  233. package/dist/core/pipeline.d.ts +61 -0
  234. package/dist/core/pipeline.d.ts.map +1 -0
  235. package/dist/core/pipeline.js +261 -0
  236. package/dist/core/pipeline.js.map +1 -0
  237. package/dist/core/schemas.d.ts +2470 -0
  238. package/dist/core/schemas.d.ts.map +1 -0
  239. package/dist/core/schemas.js +229 -0
  240. package/dist/core/schemas.js.map +1 -0
  241. package/dist/core/signal-scoring.d.ts +3 -0
  242. package/dist/core/signal-scoring.d.ts.map +1 -0
  243. package/dist/core/signal-scoring.js +124 -0
  244. package/dist/core/signal-scoring.js.map +1 -0
  245. package/dist/core/state.d.ts +22 -0
  246. package/dist/core/state.d.ts.map +1 -0
  247. package/dist/core/state.js +32 -0
  248. package/dist/core/state.js.map +1 -0
  249. package/dist/core/types.d.ts +231 -0
  250. package/dist/core/types.d.ts.map +1 -0
  251. package/dist/core/types.js +6 -0
  252. package/dist/core/types.js.map +1 -0
  253. package/dist/daemon/alerts.d.ts +12 -0
  254. package/dist/daemon/alerts.d.ts.map +1 -0
  255. package/dist/daemon/alerts.js +34 -0
  256. package/dist/daemon/alerts.js.map +1 -0
  257. package/dist/daemon/index.d.ts +6 -0
  258. package/dist/daemon/index.d.ts.map +1 -0
  259. package/dist/daemon/index.js +6 -0
  260. package/dist/daemon/index.js.map +1 -0
  261. package/dist/daemon/logger.d.ts +8 -0
  262. package/dist/daemon/logger.d.ts.map +1 -0
  263. package/dist/daemon/logger.js +35 -0
  264. package/dist/daemon/logger.js.map +1 -0
  265. package/dist/daemon/run-history.d.ts +29 -0
  266. package/dist/daemon/run-history.d.ts.map +1 -0
  267. package/dist/daemon/run-history.js +54 -0
  268. package/dist/daemon/run-history.js.map +1 -0
  269. package/dist/daemon/scheduler.d.ts +37 -0
  270. package/dist/daemon/scheduler.d.ts.map +1 -0
  271. package/dist/daemon/scheduler.js +142 -0
  272. package/dist/daemon/scheduler.js.map +1 -0
  273. package/dist/daemon/source-schedule.d.ts +25 -0
  274. package/dist/daemon/source-schedule.d.ts.map +1 -0
  275. package/dist/daemon/source-schedule.js +87 -0
  276. package/dist/daemon/source-schedule.js.map +1 -0
  277. package/dist/embedded-assets.generated.d.ts +4 -0
  278. package/dist/embedded-assets.generated.d.ts.map +1 -0
  279. package/dist/embedded-assets.generated.js +12 -0
  280. package/dist/embedded-assets.generated.js.map +1 -0
  281. package/dist/extractors/noise-filter.d.ts +30 -0
  282. package/dist/extractors/noise-filter.d.ts.map +1 -0
  283. package/dist/extractors/noise-filter.js +185 -0
  284. package/dist/extractors/noise-filter.js.map +1 -0
  285. package/dist/extractors/providers/anthropic.d.ts +13 -0
  286. package/dist/extractors/providers/anthropic.d.ts.map +1 -0
  287. package/dist/extractors/providers/anthropic.js +67 -0
  288. package/dist/extractors/providers/anthropic.js.map +1 -0
  289. package/dist/extractors/providers/index.d.ts +12 -0
  290. package/dist/extractors/providers/index.d.ts.map +1 -0
  291. package/dist/extractors/providers/index.js +41 -0
  292. package/dist/extractors/providers/index.js.map +1 -0
  293. package/dist/extractors/providers/mock.d.ts +14 -0
  294. package/dist/extractors/providers/mock.d.ts.map +1 -0
  295. package/dist/extractors/providers/mock.js +37 -0
  296. package/dist/extractors/providers/mock.js.map +1 -0
  297. package/dist/extractors/providers/openai.d.ts +15 -0
  298. package/dist/extractors/providers/openai.d.ts.map +1 -0
  299. package/dist/extractors/providers/openai.js +109 -0
  300. package/dist/extractors/providers/openai.js.map +1 -0
  301. package/dist/extractors/providers/types.d.ts +27 -0
  302. package/dist/extractors/providers/types.d.ts.map +1 -0
  303. package/dist/extractors/providers/types.js +6 -0
  304. package/dist/extractors/providers/types.js.map +1 -0
  305. package/dist/extractors/signal-extractor.d.ts +29 -0
  306. package/dist/extractors/signal-extractor.d.ts.map +1 -0
  307. package/dist/extractors/signal-extractor.js +279 -0
  308. package/dist/extractors/signal-extractor.js.map +1 -0
  309. package/dist/formatters/index.d.ts +3 -0
  310. package/dist/formatters/index.d.ts.map +1 -0
  311. package/dist/formatters/index.js +3 -0
  312. package/dist/formatters/index.js.map +1 -0
  313. package/dist/formatters/json.d.ts +6 -0
  314. package/dist/formatters/json.d.ts.map +1 -0
  315. package/dist/formatters/json.js +16 -0
  316. package/dist/formatters/json.js.map +1 -0
  317. package/dist/formatters/markdown.d.ts +6 -0
  318. package/dist/formatters/markdown.d.ts.map +1 -0
  319. package/dist/formatters/markdown.js +198 -0
  320. package/dist/formatters/markdown.js.map +1 -0
  321. package/dist/processors/privacy.d.ts +98 -0
  322. package/dist/processors/privacy.d.ts.map +1 -0
  323. package/dist/processors/privacy.js +271 -0
  324. package/dist/processors/privacy.js.map +1 -0
  325. package/dist/server/api.d.ts +35 -0
  326. package/dist/server/api.d.ts.map +1 -0
  327. package/dist/server/api.js +453 -0
  328. package/dist/server/api.js.map +1 -0
  329. package/dist/server/backfill-job.d.ts +36 -0
  330. package/dist/server/backfill-job.d.ts.map +1 -0
  331. package/dist/server/backfill-job.js +88 -0
  332. package/dist/server/backfill-job.js.map +1 -0
  333. package/dist/server/backfill-routes.d.ts +7 -0
  334. package/dist/server/backfill-routes.d.ts.map +1 -0
  335. package/dist/server/backfill-routes.js +123 -0
  336. package/dist/server/backfill-routes.js.map +1 -0
  337. package/dist/server/config-routes.d.ts +8 -0
  338. package/dist/server/config-routes.d.ts.map +1 -0
  339. package/dist/server/config-routes.js +114 -0
  340. package/dist/server/config-routes.js.map +1 -0
  341. package/dist/server/context.d.ts +13 -0
  342. package/dist/server/context.d.ts.map +1 -0
  343. package/dist/server/context.js +47 -0
  344. package/dist/server/context.js.map +1 -0
  345. package/dist/server/entity.d.ts +25 -0
  346. package/dist/server/entity.d.ts.map +1 -0
  347. package/dist/server/entity.js +34 -0
  348. package/dist/server/entity.js.map +1 -0
  349. package/dist/server/event-bus.d.ts +35 -0
  350. package/dist/server/event-bus.d.ts.map +1 -0
  351. package/dist/server/event-bus.js +4 -0
  352. package/dist/server/event-bus.js.map +1 -0
  353. package/dist/server/mcp.d.ts +126 -0
  354. package/dist/server/mcp.d.ts.map +1 -0
  355. package/dist/server/mcp.js +103 -0
  356. package/dist/server/mcp.js.map +1 -0
  357. package/dist/server/setup-server.d.ts +7 -0
  358. package/dist/server/setup-server.d.ts.map +1 -0
  359. package/dist/server/setup-server.js +52 -0
  360. package/dist/server/setup-server.js.map +1 -0
  361. package/dist/setup/assess-hardware.d.ts +34 -0
  362. package/dist/setup/assess-hardware.d.ts.map +1 -0
  363. package/dist/setup/assess-hardware.js +179 -0
  364. package/dist/setup/assess-hardware.js.map +1 -0
  365. package/dist/setup/connection-tests.d.ts +17 -0
  366. package/dist/setup/connection-tests.d.ts.map +1 -0
  367. package/dist/setup/connection-tests.js +67 -0
  368. package/dist/setup/connection-tests.js.map +1 -0
  369. package/dist/setup/detect-api-keys.d.ts +13 -0
  370. package/dist/setup/detect-api-keys.d.ts.map +1 -0
  371. package/dist/setup/detect-api-keys.js +41 -0
  372. package/dist/setup/detect-api-keys.js.map +1 -0
  373. package/dist/setup/detect-runtime.d.ts +14 -0
  374. package/dist/setup/detect-runtime.d.ts.map +1 -0
  375. package/dist/setup/detect-runtime.js +43 -0
  376. package/dist/setup/detect-runtime.js.map +1 -0
  377. package/dist/setup/detect-sources.d.ts +14 -0
  378. package/dist/setup/detect-sources.d.ts.map +1 -0
  379. package/dist/setup/detect-sources.js +75 -0
  380. package/dist/setup/detect-sources.js.map +1 -0
  381. package/dist/setup/generate-config.d.ts +5 -0
  382. package/dist/setup/generate-config.d.ts.map +1 -0
  383. package/dist/setup/generate-config.js +103 -0
  384. package/dist/setup/generate-config.js.map +1 -0
  385. package/dist/setup/index.d.ts +9 -0
  386. package/dist/setup/index.d.ts.map +1 -0
  387. package/dist/setup/index.js +9 -0
  388. package/dist/setup/index.js.map +1 -0
  389. package/dist/setup/init-wizard.d.ts +19 -0
  390. package/dist/setup/init-wizard.d.ts.map +1 -0
  391. package/dist/setup/init-wizard.js +501 -0
  392. package/dist/setup/init-wizard.js.map +1 -0
  393. package/dist/setup/terminal.d.ts +28 -0
  394. package/dist/setup/terminal.d.ts.map +1 -0
  395. package/dist/setup/terminal.js +258 -0
  396. package/dist/setup/terminal.js.map +1 -0
  397. package/dist/setup/validate-config.d.ts +26 -0
  398. package/dist/setup/validate-config.d.ts.map +1 -0
  399. package/dist/setup/validate-config.js +27 -0
  400. package/dist/setup/validate-config.js.map +1 -0
  401. package/dist/store/chunks.d.ts +19 -0
  402. package/dist/store/chunks.d.ts.map +1 -0
  403. package/dist/store/chunks.js +70 -0
  404. package/dist/store/chunks.js.map +1 -0
  405. package/dist/store/database.d.ts +24 -0
  406. package/dist/store/database.d.ts.map +1 -0
  407. package/dist/store/database.js +62 -0
  408. package/dist/store/database.js.map +1 -0
  409. package/dist/store/embedding.d.ts +23 -0
  410. package/dist/store/embedding.d.ts.map +1 -0
  411. package/dist/store/embedding.js +62 -0
  412. package/dist/store/embedding.js.map +1 -0
  413. package/dist/store/graph.d.ts +53 -0
  414. package/dist/store/graph.d.ts.map +1 -0
  415. package/dist/store/graph.js +186 -0
  416. package/dist/store/graph.js.map +1 -0
  417. package/dist/store/migrations/index.d.ts +9 -0
  418. package/dist/store/migrations/index.d.ts.map +1 -0
  419. package/dist/store/migrations/index.js +68 -0
  420. package/dist/store/migrations/index.js.map +1 -0
  421. package/dist/store/pages.d.ts +39 -0
  422. package/dist/store/pages.d.ts.map +1 -0
  423. package/dist/store/pages.js +150 -0
  424. package/dist/store/pages.js.map +1 -0
  425. package/dist/store/search.d.ts +37 -0
  426. package/dist/store/search.d.ts.map +1 -0
  427. package/dist/store/search.js +200 -0
  428. package/dist/store/search.js.map +1 -0
  429. package/dist/store/tags.d.ts +10 -0
  430. package/dist/store/tags.d.ts.map +1 -0
  431. package/dist/store/tags.js +31 -0
  432. package/dist/store/tags.js.map +1 -0
  433. package/dist/store/timeline.d.ts +26 -0
  434. package/dist/store/timeline.d.ts.map +1 -0
  435. package/dist/store/timeline.js +43 -0
  436. package/dist/store/timeline.js.map +1 -0
  437. package/dist/sync/obsidian.d.ts +136 -0
  438. package/dist/sync/obsidian.d.ts.map +1 -0
  439. package/dist/sync/obsidian.js +539 -0
  440. package/dist/sync/obsidian.js.map +1 -0
  441. package/package.json +84 -0
@@ -0,0 +1,53 @@
1
+ import type { PGlite } from "@electric-sql/pglite";
2
+ import type { SourceRef } from "../core/types.js";
3
+ export interface LinkRow {
4
+ from_slug: string;
5
+ to_slug: string;
6
+ link_type: string;
7
+ context: string;
8
+ provenance?: SourceRef;
9
+ }
10
+ export interface EnrichedLinkRow extends LinkRow {
11
+ page: {
12
+ title: string;
13
+ type: string;
14
+ frontmatter: Record<string, unknown>;
15
+ };
16
+ }
17
+ export interface GraphNode {
18
+ slug: string;
19
+ title: string;
20
+ type: string;
21
+ depth: number;
22
+ }
23
+ export interface GraphEdge {
24
+ from_slug: string;
25
+ to_slug: string;
26
+ link_type: string;
27
+ }
28
+ export interface TraverseResult {
29
+ focus: {
30
+ slug: string;
31
+ title: string;
32
+ type: string;
33
+ };
34
+ nodes: GraphNode[];
35
+ edges: GraphEdge[];
36
+ }
37
+ export declare class GraphStore {
38
+ private pg;
39
+ constructor(pg: PGlite);
40
+ addLink(fromSlug: string, toSlug: string, type: string, context?: string, provenance?: SourceRef, sourceHash?: string): Promise<void>;
41
+ removeLink(fromSlug: string, toSlug: string): Promise<void>;
42
+ getLinks(slug: string): Promise<LinkRow[]>;
43
+ getAllLinksGrouped(): Promise<Map<string, LinkRow[]>>;
44
+ getBacklinks(slug: string): Promise<LinkRow[]>;
45
+ getLinksEnriched(slug: string): Promise<EnrichedLinkRow[]>;
46
+ getLinksForSlugs(slugs: string[]): Promise<Map<string, LinkRow[]>>;
47
+ getBacklinksEnriched(slug: string): Promise<EnrichedLinkRow[]>;
48
+ traverse(slug: string, opts?: {
49
+ depth?: number;
50
+ direction?: "in" | "out" | "both";
51
+ }): Promise<TraverseResult>;
52
+ }
53
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/store/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC7E;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAwBD,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,SAAS,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAkBV,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY1C,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAiBrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B1D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAmBlE,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B9D,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAA;KAAE,GAC3D,OAAO,CAAC,cAAc,CAAC;CAsF3B"}
@@ -0,0 +1,186 @@
1
+ export class GraphStore {
2
+ pg;
3
+ constructor(pg) {
4
+ this.pg = pg;
5
+ }
6
+ async addLink(fromSlug, toSlug, type, context, provenance, sourceHash) {
7
+ await this.pg.query(`INSERT INTO links (from_page_id, to_page_id, link_type, context, provenance, source_hash)
8
+ SELECT f.id, t.id, $3, $4, $5, $6
9
+ FROM pages f, pages t
10
+ WHERE f.slug = $1 AND t.slug = $2
11
+ ON CONFLICT (from_page_id, to_page_id, link_type) DO UPDATE SET context = EXCLUDED.context`, [
12
+ fromSlug,
13
+ toSlug,
14
+ type,
15
+ context ?? "",
16
+ provenance ? JSON.stringify(provenance) : null,
17
+ sourceHash ?? null,
18
+ ]);
19
+ }
20
+ async removeLink(fromSlug, toSlug) {
21
+ await this.pg.query(`DELETE FROM links
22
+ WHERE from_page_id = (SELECT id FROM pages WHERE slug = $1)
23
+ AND to_page_id = (SELECT id FROM pages WHERE slug = $2)`, [fromSlug, toSlug]);
24
+ }
25
+ async getLinks(slug) {
26
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
27
+ FROM links l
28
+ JOIN pages pf ON pf.id = l.from_page_id
29
+ JOIN pages pt ON pt.id = l.to_page_id
30
+ WHERE pf.slug = $1`, [slug]);
31
+ return result.rows;
32
+ }
33
+ async getAllLinksGrouped() {
34
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
35
+ FROM links l
36
+ JOIN pages pf ON pf.id = l.from_page_id
37
+ JOIN pages pt ON pt.id = l.to_page_id
38
+ ORDER BY pf.slug, pt.slug`);
39
+ const grouped = new Map();
40
+ for (const row of result.rows) {
41
+ const list = grouped.get(row.from_slug);
42
+ if (list)
43
+ list.push(row);
44
+ else
45
+ grouped.set(row.from_slug, [row]);
46
+ }
47
+ return grouped;
48
+ }
49
+ async getBacklinks(slug) {
50
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
51
+ FROM links l
52
+ JOIN pages pf ON pf.id = l.from_page_id
53
+ JOIN pages pt ON pt.id = l.to_page_id
54
+ WHERE pt.slug = $1`, [slug]);
55
+ return result.rows;
56
+ }
57
+ async getLinksEnriched(slug) {
58
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance,
59
+ pt.title AS page_title, pt.type AS page_type, pt.frontmatter AS page_frontmatter
60
+ FROM links l
61
+ JOIN pages pf ON pf.id = l.from_page_id
62
+ JOIN pages pt ON pt.id = l.to_page_id
63
+ WHERE pf.slug = $1`, [slug]);
64
+ return result.rows.map((r) => {
65
+ const frontmatter = typeof r.page_frontmatter === "string"
66
+ ? JSON.parse(r.page_frontmatter)
67
+ : r.page_frontmatter;
68
+ return {
69
+ from_slug: r.from_slug,
70
+ to_slug: r.to_slug,
71
+ link_type: r.link_type,
72
+ context: r.context,
73
+ provenance: r.provenance ? JSON.parse(r.provenance) : undefined,
74
+ page: {
75
+ title: r.page_title,
76
+ type: r.page_type,
77
+ frontmatter: frontmatter ?? {},
78
+ },
79
+ };
80
+ });
81
+ }
82
+ async getLinksForSlugs(slugs) {
83
+ if (slugs.length === 0)
84
+ return new Map();
85
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
86
+ FROM links l
87
+ JOIN pages pf ON pf.id = l.from_page_id
88
+ JOIN pages pt ON pt.id = l.to_page_id
89
+ WHERE pf.slug = ANY($1::text[])`, [slugs]);
90
+ const map = new Map();
91
+ for (const row of result.rows) {
92
+ const existing = map.get(row.from_slug) ?? [];
93
+ existing.push(row);
94
+ map.set(row.from_slug, existing);
95
+ }
96
+ return map;
97
+ }
98
+ async getBacklinksEnriched(slug) {
99
+ const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance,
100
+ pf.title AS page_title, pf.type AS page_type, pf.frontmatter AS page_frontmatter
101
+ FROM links l
102
+ JOIN pages pf ON pf.id = l.from_page_id
103
+ JOIN pages pt ON pt.id = l.to_page_id
104
+ WHERE pt.slug = $1`, [slug]);
105
+ return result.rows.map((r) => {
106
+ const frontmatter = typeof r.page_frontmatter === "string"
107
+ ? JSON.parse(r.page_frontmatter)
108
+ : r.page_frontmatter;
109
+ return {
110
+ from_slug: r.from_slug,
111
+ to_slug: r.to_slug,
112
+ link_type: r.link_type,
113
+ context: r.context,
114
+ provenance: r.provenance ? JSON.parse(r.provenance) : undefined,
115
+ page: {
116
+ title: r.page_title,
117
+ type: r.page_type,
118
+ frontmatter: frontmatter ?? {},
119
+ },
120
+ };
121
+ });
122
+ }
123
+ async traverse(slug, opts) {
124
+ const maxDepth = Math.min(opts?.depth ?? 5, 10);
125
+ const direction = opts?.direction ?? "out";
126
+ // Query focus node
127
+ const focusQuery = await this.pg.query("SELECT slug, title, type FROM pages WHERE slug = $1", [slug]);
128
+ if (focusQuery.rows.length === 0) {
129
+ return {
130
+ focus: { slug, title: slug, type: "unknown" },
131
+ nodes: [],
132
+ edges: [],
133
+ };
134
+ }
135
+ const focus = focusQuery.rows[0];
136
+ const visited = new Set();
137
+ const nodes = [];
138
+ const edges = [];
139
+ let frontier = [slug];
140
+ visited.add(slug);
141
+ for (let d = 1; d <= maxDepth && frontier.length > 0; d++) {
142
+ const nextFrontier = [];
143
+ for (const current of frontier) {
144
+ const neighbors = [];
145
+ if (direction === "out" || direction === "both") {
146
+ const out = await this.pg.query(`SELECT pt.slug, l.link_type FROM links l JOIN pages pt ON pt.id = l.to_page_id
147
+ WHERE l.from_page_id = (SELECT id FROM pages WHERE slug = $1)`, [current]);
148
+ neighbors.push(...out.rows.map((r) => ({ slug: r.slug, link_type: r.link_type })));
149
+ edges.push(...out.rows.map((r) => ({
150
+ from_slug: current,
151
+ to_slug: r.slug,
152
+ link_type: r.link_type,
153
+ })));
154
+ }
155
+ if (direction === "in" || direction === "both") {
156
+ const inc = await this.pg.query(`SELECT pf.slug, l.link_type FROM links l JOIN pages pf ON pf.id = l.from_page_id
157
+ WHERE l.to_page_id = (SELECT id FROM pages WHERE slug = $1)`, [current]);
158
+ neighbors.push(...inc.rows.map((r) => ({ slug: r.slug, link_type: r.link_type })));
159
+ edges.push(...inc.rows.map((r) => ({
160
+ from_slug: r.slug,
161
+ to_slug: current,
162
+ link_type: r.link_type,
163
+ })));
164
+ }
165
+ for (const n of neighbors) {
166
+ if (!visited.has(n.slug)) {
167
+ visited.add(n.slug);
168
+ nextFrontier.push(n.slug);
169
+ const page = await this.pg.query("SELECT slug, title, type FROM pages WHERE slug = $1", [n.slug]);
170
+ if (page.rows.length > 0) {
171
+ const p = page.rows[0];
172
+ nodes.push({ slug: p.slug, title: p.title, type: p.type, depth: d });
173
+ }
174
+ }
175
+ }
176
+ }
177
+ frontier = nextFrontier;
178
+ }
179
+ return {
180
+ focus: { slug: focus.slug, title: focus.title, type: focus.type },
181
+ nodes,
182
+ edges,
183
+ };
184
+ }
185
+ }
186
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/store/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PGlite } from "@electric-sql/pglite";
2
+ export interface Migration {
3
+ version: number;
4
+ name: string;
5
+ sql: string;
6
+ }
7
+ export declare const MIGRATIONS: Migration[];
8
+ export declare function runMigrations(pg: PGlite): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/store/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAoDD,eAAO,MAAM,UAAU,EAAE,SAAS,EAIjC,CAAC;AAEF,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D"}
@@ -0,0 +1,68 @@
1
+ // Migrations are inlined as string constants (not read from .sql files at runtime) so
2
+ // they survive bundling: the tsc-built dist/, the `bun build --compile` single-file binary,
3
+ // and `bun src/cli.ts` all behave identically with no filesystem asset to ship. Applied
4
+ // migrations are immutable by definition, so there is no source-of-truth drift risk.
5
+ //
6
+ // Add new migrations here, in ascending version order. Never edit an already-released one.
7
+ // Migration 001: lifecycle metadata + preference type promotion.
8
+ // Adds halflife_days to pages (drives hot/warm/cold rotation), promotes the legacy
9
+ // discovery-preference subtype to a first-class `preference` type, then backfills
10
+ // halflife_days for existing signal pages by type.
11
+ const M001_LIFECYCLE_COLUMNS = `
12
+ ALTER TABLE pages ADD COLUMN IF NOT EXISTS halflife_days INTEGER;
13
+
14
+ UPDATE pages SET type = 'preference' WHERE type = 'discovery-preference';
15
+
16
+ UPDATE pages SET halflife_days = 90
17
+ WHERE type IN ('decision', 'task', 'preference') OR type LIKE 'discovery-%';
18
+ UPDATE pages SET halflife_days = 365
19
+ WHERE type = 'knowledge';
20
+ `;
21
+ // Migration 002: backfill provenance/source_hash columns (signal fidelity) for databases
22
+ // that ran migration 001 before schema.sql included them.
23
+ const M002_PROVENANCE_COLUMNS = `
24
+ ALTER TABLE links ADD COLUMN IF NOT EXISTS provenance JSONB;
25
+ ALTER TABLE links ADD COLUMN IF NOT EXISTS source_hash TEXT;
26
+ ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS provenance JSONB;
27
+ `;
28
+ // Migration 003: lifecycle tier columns + indexes for pages and timeline_entries, and a
29
+ // backfill of expires_at for existing hot pages that have a halflife.
30
+ const M003_LIFECYCLE_TIER = `
31
+ ALTER TABLE pages ADD COLUMN IF NOT EXISTS tier TEXT NOT NULL DEFAULT 'hot';
32
+ ALTER TABLE pages ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ;
33
+ ALTER TABLE pages ADD COLUMN IF NOT EXISTS consolidated_into INTEGER REFERENCES pages(id);
34
+
35
+ CREATE INDEX IF NOT EXISTS idx_pages_tier ON pages (tier);
36
+ CREATE INDEX IF NOT EXISTS idx_pages_expires_at ON pages (expires_at) WHERE expires_at IS NOT NULL;
37
+
38
+ ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS tier TEXT NOT NULL DEFAULT 'hot';
39
+ ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ;
40
+
41
+ UPDATE pages
42
+ SET expires_at = created_at + (halflife_days * INTERVAL '1 day')
43
+ WHERE tier = 'hot'
44
+ AND halflife_days IS NOT NULL
45
+ AND expires_at IS NULL;
46
+ `;
47
+ export const MIGRATIONS = [
48
+ { version: 1, name: "lifecycle_columns", sql: M001_LIFECYCLE_COLUMNS },
49
+ { version: 2, name: "provenance_columns", sql: M002_PROVENANCE_COLUMNS },
50
+ { version: 3, name: "lifecycle_tier", sql: M003_LIFECYCLE_TIER },
51
+ ];
52
+ export async function runMigrations(pg) {
53
+ await pg.exec(`
54
+ CREATE TABLE IF NOT EXISTS schema_migrations (
55
+ version INTEGER PRIMARY KEY,
56
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
57
+ )
58
+ `);
59
+ const applied = await pg.query("SELECT version FROM schema_migrations");
60
+ const appliedVersions = new Set(applied.rows.map((r) => r.version));
61
+ for (const migration of MIGRATIONS) {
62
+ if (appliedVersions.has(migration.version))
63
+ continue;
64
+ await pg.exec(migration.sql);
65
+ await pg.query("INSERT INTO schema_migrations (version) VALUES ($1)", [migration.version]);
66
+ }
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/store/migrations/index.ts"],"names":[],"mappings":"AAQA,sFAAsF;AACtF,4FAA4F;AAC5F,wFAAwF;AACxF,qFAAqF;AACrF,EAAE;AACF,2FAA2F;AAE3F,iEAAiE;AACjE,mFAAmF;AACnF,kFAAkF;AAClF,mDAAmD;AACnD,MAAM,sBAAsB,GAAG;;;;;;;;;CAS9B,CAAC;AAEF,yFAAyF;AACzF,0DAA0D;AAC1D,MAAM,uBAAuB,GAAG;;;;CAI/B,CAAC;AAEF,wFAAwF;AACxF,sEAAsE;AACtE,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;CAgB3B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,sBAAsB,EAAE;IACtE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,uBAAuB,EAAE;IACxE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,EAAE;CACjE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,EAAE,CAAC,IAAI,CAAC;;;;;GAKb,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAsB,uCAAuC,CAAC,CAAC;IAC7F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QACrD,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,EAAE,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { PGlite } from "@electric-sql/pglite";
2
+ export interface Page {
3
+ id: number;
4
+ slug: string;
5
+ type: string;
6
+ title: string;
7
+ compiled_truth: string;
8
+ frontmatter: Record<string, unknown>;
9
+ content_hash: string;
10
+ halflife_days: number | null;
11
+ tier: string;
12
+ expires_at: string | null;
13
+ consolidated_into: number | null;
14
+ created_at: string;
15
+ updated_at: string;
16
+ }
17
+ export interface PutPageOptions {
18
+ halflife_days?: number | null;
19
+ expires_at?: Date | null;
20
+ }
21
+ export declare class PageStore {
22
+ private pg;
23
+ constructor(pg: PGlite);
24
+ putPage(slug: string, content: string, opts?: PutPageOptions): Promise<Page>;
25
+ getPage(slug: string): Promise<Page | null>;
26
+ deletePage(slug: string): Promise<void>;
27
+ listPages(opts?: {
28
+ type?: string;
29
+ exclude_types?: string[];
30
+ limit?: number;
31
+ sort?: string;
32
+ order?: string;
33
+ }): Promise<Page[]>;
34
+ listExpiredHot(): Promise<Page[]>;
35
+ updatePageTier(id: number, tier: string, consolidatedInto?: number | null): Promise<void>;
36
+ listPagesByTier(tier: string): Promise<Page[]>;
37
+ private rowToPage;
38
+ }
39
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAwCD,qBAAa,SAAS;IACR,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C5E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK3C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,SAAS,CAAC,IAAI,CAAC,EAAE;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA8Cb,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAWjC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAczF,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQpD,OAAO,CAAC,SAAS;CAkBlB"}
@@ -0,0 +1,150 @@
1
+ import { createHash } from "node:crypto";
2
+ import { parse as parseYaml } from "yaml";
3
+ function parseMarkdownWithFrontmatter(content) {
4
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
5
+ if (!fmMatch) {
6
+ return { title: "", type: "unknown", compiled_truth: content.trim(), frontmatter: {} };
7
+ }
8
+ const fm = parseYaml(fmMatch[1]);
9
+ const body = fmMatch[2].trim();
10
+ const title = String(fm.title ?? "");
11
+ const type = String(fm.type ?? "unknown");
12
+ const { title: _t, type: _ty, ...rest } = fm;
13
+ return { title, type, compiled_truth: body, frontmatter: rest };
14
+ }
15
+ export class PageStore {
16
+ pg;
17
+ constructor(pg) {
18
+ this.pg = pg;
19
+ }
20
+ async putPage(slug, content, opts) {
21
+ const { title, type, compiled_truth, frontmatter } = parseMarkdownWithFrontmatter(content);
22
+ const contentHash = createHash("sha256").update(content).digest("hex");
23
+ const halflifeDays = opts?.halflife_days ?? null;
24
+ // Compute expires_at in TS to correctly handle the three-way distinction:
25
+ // - explicit Date: use that value
26
+ // - explicit null: store NULL (clear it)
27
+ // - undefined: auto-compute from halflife_days, or NULL if halflife_days is null
28
+ let expiresAt;
29
+ if (opts?.expires_at !== undefined) {
30
+ expiresAt = opts.expires_at; // Date or null, both stored as-is
31
+ }
32
+ else if (halflifeDays !== null) {
33
+ expiresAt = new Date(Date.now() + halflifeDays * 86_400_000);
34
+ }
35
+ else {
36
+ expiresAt = null;
37
+ }
38
+ const result = await this.pg.query(`INSERT INTO pages (slug, type, title, compiled_truth, frontmatter, content_hash, halflife_days, expires_at)
39
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8::timestamptz)
40
+ ON CONFLICT (slug) DO UPDATE SET
41
+ type = EXCLUDED.type,
42
+ title = EXCLUDED.title,
43
+ compiled_truth = EXCLUDED.compiled_truth,
44
+ frontmatter = EXCLUDED.frontmatter,
45
+ content_hash = EXCLUDED.content_hash,
46
+ halflife_days = EXCLUDED.halflife_days,
47
+ updated_at = NOW()
48
+ RETURNING *`, [
49
+ slug,
50
+ type,
51
+ title,
52
+ compiled_truth,
53
+ JSON.stringify(frontmatter),
54
+ contentHash,
55
+ halflifeDays,
56
+ expiresAt,
57
+ ]);
58
+ return this.rowToPage(result.rows[0]);
59
+ }
60
+ async getPage(slug) {
61
+ const result = await this.pg.query("SELECT * FROM pages WHERE slug = $1", [slug]);
62
+ return result.rows.length > 0 ? this.rowToPage(result.rows[0]) : null;
63
+ }
64
+ async deletePage(slug) {
65
+ await this.pg.query("DELETE FROM pages WHERE slug = $1", [slug]);
66
+ }
67
+ async listPages(opts) {
68
+ const params = [];
69
+ const conditions = [];
70
+ if (opts?.type) {
71
+ conditions.push(`type = $${params.length + 1}`);
72
+ params.push(opts.type);
73
+ }
74
+ if (opts?.exclude_types && opts.exclude_types.length > 0) {
75
+ conditions.push(`type != ALL($${params.length + 1}::text[])`);
76
+ params.push(opts.exclude_types);
77
+ }
78
+ const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "";
79
+ const sortDir = opts?.order === "asc" ? "ASC" : "DESC";
80
+ let sql;
81
+ if (opts?.sort === "backlinks") {
82
+ sql = `SELECT p.* FROM pages p
83
+ LEFT JOIN (
84
+ SELECT to_page_id, COUNT(*) AS cnt FROM links GROUP BY to_page_id
85
+ ) lc ON lc.to_page_id = p.id${whereClause}
86
+ ORDER BY COALESCE(lc.cnt, 0) ${sortDir}`;
87
+ }
88
+ else if (opts?.sort === "signal_time") {
89
+ sql = `SELECT * FROM pages${whereClause}
90
+ ORDER BY COALESCE(
91
+ frontmatter->'source'->>'timestamp',
92
+ frontmatter->'first_seen'->>'timestamp',
93
+ created_at::text
94
+ ) ${sortDir}`;
95
+ }
96
+ else {
97
+ const sortCol = ["updated_at", "created_at", "title"].includes(opts?.sort ?? "")
98
+ ? (opts?.sort ?? "updated_at")
99
+ : "updated_at";
100
+ sql = `SELECT * FROM pages${whereClause} ORDER BY ${sortCol} ${sortDir}`;
101
+ }
102
+ if (opts?.limit) {
103
+ sql += ` LIMIT $${params.length + 1}`;
104
+ params.push(opts.limit);
105
+ }
106
+ const result = await this.pg.query(sql, params);
107
+ return result.rows.map((r) => this.rowToPage(r));
108
+ }
109
+ async listExpiredHot() {
110
+ const result = await this.pg.query(`SELECT * FROM pages
111
+ WHERE tier = 'hot'
112
+ AND expires_at IS NOT NULL
113
+ AND expires_at < NOW()
114
+ ORDER BY expires_at`);
115
+ return result.rows.map((r) => this.rowToPage(r));
116
+ }
117
+ async updatePageTier(id, tier, consolidatedInto) {
118
+ if (consolidatedInto !== undefined) {
119
+ await this.pg.query(`UPDATE pages SET tier = $1, consolidated_into = $2, updated_at = NOW() WHERE id = $3`, [tier, consolidatedInto, id]);
120
+ }
121
+ else {
122
+ await this.pg.query(`UPDATE pages SET tier = $1, updated_at = NOW() WHERE id = $2`, [
123
+ tier,
124
+ id,
125
+ ]);
126
+ }
127
+ }
128
+ async listPagesByTier(tier) {
129
+ const result = await this.pg.query(`SELECT * FROM pages WHERE tier = $1 ORDER BY created_at`, [tier]);
130
+ return result.rows.map((r) => this.rowToPage(r));
131
+ }
132
+ rowToPage(row) {
133
+ return {
134
+ id: row.id,
135
+ slug: row.slug,
136
+ type: row.type,
137
+ title: row.title,
138
+ compiled_truth: row.compiled_truth,
139
+ frontmatter: typeof row.frontmatter === "string" ? JSON.parse(row.frontmatter) : row.frontmatter,
140
+ content_hash: row.content_hash,
141
+ halflife_days: row.halflife_days,
142
+ tier: row.tier ?? "hot",
143
+ expires_at: row.expires_at ?? null,
144
+ consolidated_into: row.consolidated_into ?? null,
145
+ created_at: row.created_at,
146
+ updated_at: row.updated_at,
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { PGlite } from "@electric-sql/pglite";
2
+ export interface SearchResult {
3
+ slug: string;
4
+ title: string;
5
+ type: string;
6
+ snippet: string;
7
+ score: number;
8
+ highlights: string[];
9
+ }
10
+ export interface SearchFilterOpts {
11
+ limit?: number;
12
+ type?: string[];
13
+ from?: string;
14
+ to?: string;
15
+ platform?: string;
16
+ exclude_types?: string[];
17
+ }
18
+ interface SearchEngineOpts {
19
+ embedText?: (text: string) => Promise<number[]>;
20
+ }
21
+ /**
22
+ * Compute freshness multiplier using exponential decay.
23
+ * Returns 1.0 for missing timestamps (no effect).
24
+ * Exported for unit testing.
25
+ */
26
+ export declare function freshnessMultiplier(updatedAt: string | null): number;
27
+ export declare class SearchEngine {
28
+ private pg;
29
+ private embedText?;
30
+ constructor(pg: PGlite, opts?: SearchEngineOpts);
31
+ search(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
32
+ query(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
33
+ private ftsChunkSearch;
34
+ private vectorSearch;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/store/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACjD;AA8BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMpE;AAED,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IAHZ,OAAO,CAAC,SAAS,CAAC,CAAsC;gBAG9C,EAAE,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB;IAKnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmFvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAkH9D,cAAc;YAiCd,YAAY;CAuB3B"}