@andre.li/memoark 0.3.1 → 0.3.2

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 (497) hide show
  1. package/README.en.md +388 -69
  2. package/README.md +674 -309
  3. package/README.zh-CN.md +816 -0
  4. package/bin/memoark.mjs +7 -2
  5. package/dist/adapters/store.d.ts.map +1 -1
  6. package/dist/adapters/store.js +6 -5
  7. package/dist/adapters/store.js.map +1 -1
  8. package/dist/cli-helpers.d.ts +12 -0
  9. package/dist/cli-helpers.d.ts.map +1 -0
  10. package/dist/cli-helpers.js +11 -0
  11. package/dist/cli-helpers.js.map +1 -0
  12. package/dist/cli.js +682 -126
  13. package/dist/cli.js.map +1 -1
  14. package/dist/collectors/feishu/chat-name-resolver.d.ts +33 -0
  15. package/dist/collectors/feishu/chat-name-resolver.d.ts.map +1 -0
  16. package/dist/collectors/feishu/chat-name-resolver.js +63 -0
  17. package/dist/collectors/feishu/chat-name-resolver.js.map +1 -0
  18. package/dist/collectors/feishu/collector.d.ts +4 -0
  19. package/dist/collectors/feishu/collector.d.ts.map +1 -1
  20. package/dist/collectors/feishu/collector.js +27 -4
  21. package/dist/collectors/feishu/collector.js.map +1 -1
  22. package/dist/collectors/feishu/docs/blocks.d.ts +25 -0
  23. package/dist/collectors/feishu/docs/blocks.d.ts.map +1 -0
  24. package/dist/collectors/feishu/docs/blocks.js +34 -0
  25. package/dist/collectors/feishu/docs/blocks.js.map +1 -0
  26. package/dist/collectors/feishu/docs/candidate.d.ts +17 -0
  27. package/dist/collectors/feishu/docs/candidate.d.ts.map +1 -0
  28. package/dist/collectors/feishu/docs/candidate.js +36 -0
  29. package/dist/collectors/feishu/docs/candidate.js.map +1 -0
  30. package/dist/collectors/feishu/docs/config.d.ts +41 -0
  31. package/dist/collectors/feishu/docs/config.d.ts.map +1 -0
  32. package/dist/collectors/feishu/docs/config.js +30 -0
  33. package/dist/collectors/feishu/docs/config.js.map +1 -0
  34. package/dist/collectors/feishu/docs/decision.d.ts +14 -0
  35. package/dist/collectors/feishu/docs/decision.d.ts.map +1 -0
  36. package/dist/collectors/feishu/docs/decision.js +43 -0
  37. package/dist/collectors/feishu/docs/decision.js.map +1 -0
  38. package/dist/collectors/feishu/docs/full-builder.d.ts +17 -0
  39. package/dist/collectors/feishu/docs/full-builder.d.ts.map +1 -0
  40. package/dist/collectors/feishu/docs/full-builder.js +136 -0
  41. package/dist/collectors/feishu/docs/full-builder.js.map +1 -0
  42. package/dist/collectors/feishu/docs/hash.d.ts +8 -0
  43. package/dist/collectors/feishu/docs/hash.d.ts.map +1 -0
  44. package/dist/collectors/feishu/docs/hash.js +15 -0
  45. package/dist/collectors/feishu/docs/hash.js.map +1 -0
  46. package/dist/collectors/feishu/docs/ingest.d.ts +54 -0
  47. package/dist/collectors/feishu/docs/ingest.d.ts.map +1 -0
  48. package/dist/collectors/feishu/docs/ingest.js +120 -0
  49. package/dist/collectors/feishu/docs/ingest.js.map +1 -0
  50. package/dist/collectors/feishu/docs/llm-json.d.ts +13 -0
  51. package/dist/collectors/feishu/docs/llm-json.d.ts.map +1 -0
  52. package/dist/collectors/feishu/docs/llm-json.js +40 -0
  53. package/dist/collectors/feishu/docs/llm-json.js.map +1 -0
  54. package/dist/collectors/feishu/docs/pointer-builder.d.ts +7 -0
  55. package/dist/collectors/feishu/docs/pointer-builder.d.ts.map +1 -0
  56. package/dist/collectors/feishu/docs/pointer-builder.js +11 -0
  57. package/dist/collectors/feishu/docs/pointer-builder.js.map +1 -0
  58. package/dist/collectors/feishu/docs/render.d.ts +8 -0
  59. package/dist/collectors/feishu/docs/render.d.ts.map +1 -0
  60. package/dist/collectors/feishu/docs/render.js +105 -0
  61. package/dist/collectors/feishu/docs/render.js.map +1 -0
  62. package/dist/collectors/feishu/docs/run.d.ts +37 -0
  63. package/dist/collectors/feishu/docs/run.d.ts.map +1 -0
  64. package/dist/collectors/feishu/docs/run.js +143 -0
  65. package/dist/collectors/feishu/docs/run.js.map +1 -0
  66. package/dist/collectors/feishu/docs/status.d.ts +16 -0
  67. package/dist/collectors/feishu/docs/status.d.ts.map +1 -0
  68. package/dist/collectors/feishu/docs/status.js +24 -0
  69. package/dist/collectors/feishu/docs/status.js.map +1 -0
  70. package/dist/collectors/feishu/docs/store-writer.d.ts +32 -0
  71. package/dist/collectors/feishu/docs/store-writer.d.ts.map +1 -0
  72. package/dist/collectors/feishu/docs/store-writer.js +71 -0
  73. package/dist/collectors/feishu/docs/store-writer.js.map +1 -0
  74. package/dist/collectors/feishu/docs/toc.d.ts +3 -0
  75. package/dist/collectors/feishu/docs/toc.d.ts.map +1 -0
  76. package/dist/collectors/feishu/docs/toc.js +19 -0
  77. package/dist/collectors/feishu/docs/toc.js.map +1 -0
  78. package/dist/collectors/feishu/docs/triggers.d.ts +7 -0
  79. package/dist/collectors/feishu/docs/triggers.d.ts.map +1 -0
  80. package/dist/collectors/feishu/docs/triggers.js +31 -0
  81. package/dist/collectors/feishu/docs/triggers.js.map +1 -0
  82. package/dist/collectors/feishu/docs/types.d.ts +109 -0
  83. package/dist/collectors/feishu/docs/types.d.ts.map +1 -0
  84. package/dist/collectors/feishu/docs/types.js +2 -0
  85. package/dist/collectors/feishu/docs/types.js.map +1 -0
  86. package/dist/collectors/feishu/docs/upgrade-queue.d.ts +19 -0
  87. package/dist/collectors/feishu/docs/upgrade-queue.d.ts.map +1 -0
  88. package/dist/collectors/feishu/docs/upgrade-queue.js +36 -0
  89. package/dist/collectors/feishu/docs/upgrade-queue.js.map +1 -0
  90. package/dist/collectors/feishu/docs/url-parser.d.ts +3 -0
  91. package/dist/collectors/feishu/docs/url-parser.d.ts.map +1 -0
  92. package/dist/collectors/feishu/docs/url-parser.js +39 -0
  93. package/dist/collectors/feishu/docs/url-parser.js.map +1 -0
  94. package/dist/collectors/feishu/docs/walkers.d.ts +24 -0
  95. package/dist/collectors/feishu/docs/walkers.d.ts.map +1 -0
  96. package/dist/collectors/feishu/docs/walkers.js +90 -0
  97. package/dist/collectors/feishu/docs/walkers.js.map +1 -0
  98. package/dist/collectors/feishu/docs/wiki-resolver.d.ts +15 -0
  99. package/dist/collectors/feishu/docs/wiki-resolver.d.ts.map +1 -0
  100. package/dist/collectors/feishu/docs/wiki-resolver.js +24 -0
  101. package/dist/collectors/feishu/docs/wiki-resolver.js.map +1 -0
  102. package/dist/collectors/feishu/lark-cli-client.d.ts +12 -0
  103. package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -1
  104. package/dist/collectors/feishu/lark-cli-client.js +37 -2
  105. package/dist/collectors/feishu/lark-cli-client.js.map +1 -1
  106. package/dist/collectors/feishu/lark-cli-identity-backend.d.ts +28 -0
  107. package/dist/collectors/feishu/lark-cli-identity-backend.d.ts.map +1 -0
  108. package/dist/collectors/feishu/lark-cli-identity-backend.js +110 -0
  109. package/dist/collectors/feishu/lark-cli-identity-backend.js.map +1 -0
  110. package/dist/collectors/feishu/self-open-id.d.ts +20 -0
  111. package/dist/collectors/feishu/self-open-id.d.ts.map +1 -0
  112. package/dist/collectors/feishu/self-open-id.js +31 -0
  113. package/dist/collectors/feishu/self-open-id.js.map +1 -0
  114. package/dist/collectors/feishu/sources/dm.d.ts.map +1 -1
  115. package/dist/collectors/feishu/sources/dm.js +4 -0
  116. package/dist/collectors/feishu/sources/dm.js.map +1 -1
  117. package/dist/collectors/feishu/sources/mail.d.ts.map +1 -1
  118. package/dist/collectors/feishu/sources/mail.js +18 -20
  119. package/dist/collectors/feishu/sources/mail.js.map +1 -1
  120. package/dist/collectors/feishu/sources/messages.d.ts +2 -0
  121. package/dist/collectors/feishu/sources/messages.d.ts.map +1 -1
  122. package/dist/collectors/feishu/sources/messages.js +28 -1
  123. package/dist/collectors/feishu/sources/messages.js.map +1 -1
  124. package/dist/collectors/feishu/types.d.ts +37 -3
  125. package/dist/collectors/feishu/types.d.ts.map +1 -1
  126. package/dist/collectors/feishu/types.js.map +1 -1
  127. package/dist/config-center/connection-checks.d.ts.map +1 -1
  128. package/dist/config-center/connection-checks.js +1 -1
  129. package/dist/config-center/connection-checks.js.map +1 -1
  130. package/dist/config-center/schema.d.ts.map +1 -1
  131. package/dist/config-center/schema.js +77 -0
  132. package/dist/config-center/schema.js.map +1 -1
  133. package/dist/consolidator/consolidator.d.ts +13 -1
  134. package/dist/consolidator/consolidator.d.ts.map +1 -1
  135. package/dist/consolidator/consolidator.js +12 -2
  136. package/dist/consolidator/consolidator.js.map +1 -1
  137. package/dist/core/canonicalize.js +5 -1
  138. package/dist/core/canonicalize.js.map +1 -1
  139. package/dist/core/config.d.ts +52 -9
  140. package/dist/core/config.d.ts.map +1 -1
  141. package/dist/core/config.js +86 -24
  142. package/dist/core/config.js.map +1 -1
  143. package/dist/core/env-validation.d.ts +9 -0
  144. package/dist/core/env-validation.d.ts.map +1 -0
  145. package/dist/core/env-validation.js +94 -0
  146. package/dist/core/env-validation.js.map +1 -0
  147. package/dist/core/identity-resolver.d.ts +24 -3
  148. package/dist/core/identity-resolver.d.ts.map +1 -1
  149. package/dist/core/identity-resolver.js +147 -2
  150. package/dist/core/identity-resolver.js.map +1 -1
  151. package/dist/core/person-identity.d.ts +124 -0
  152. package/dist/core/person-identity.d.ts.map +1 -0
  153. package/dist/core/person-identity.js +342 -0
  154. package/dist/core/person-identity.js.map +1 -0
  155. package/dist/core/person-slug.d.ts +21 -0
  156. package/dist/core/person-slug.d.ts.map +1 -0
  157. package/dist/core/person-slug.js +93 -0
  158. package/dist/core/person-slug.js.map +1 -0
  159. package/dist/core/pipeline-factory.d.ts +1 -1
  160. package/dist/core/pipeline-factory.d.ts.map +1 -1
  161. package/dist/core/pipeline-factory.js +8 -3
  162. package/dist/core/pipeline-factory.js.map +1 -1
  163. package/dist/core/pipeline.d.ts +16 -0
  164. package/dist/core/pipeline.d.ts.map +1 -1
  165. package/dist/core/pipeline.js +49 -1
  166. package/dist/core/pipeline.js.map +1 -1
  167. package/dist/core/resource-loader.d.ts +2 -0
  168. package/dist/core/resource-loader.d.ts.map +1 -0
  169. package/dist/core/resource-loader.js +12 -0
  170. package/dist/core/resource-loader.js.map +1 -0
  171. package/dist/core/schemas.d.ts +2981 -309
  172. package/dist/core/schemas.d.ts.map +1 -1
  173. package/dist/core/schemas.js +27 -0
  174. package/dist/core/schemas.js.map +1 -1
  175. package/dist/core/signal-scoring.d.ts.map +1 -1
  176. package/dist/core/signal-scoring.js +5 -1
  177. package/dist/core/signal-scoring.js.map +1 -1
  178. package/dist/core/source-ref.d.ts +4 -0
  179. package/dist/core/source-ref.d.ts.map +1 -0
  180. package/dist/core/source-ref.js +24 -0
  181. package/dist/core/source-ref.js.map +1 -0
  182. package/dist/core/state.d.ts +1 -1
  183. package/dist/core/state.d.ts.map +1 -1
  184. package/dist/core/state.js +3 -2
  185. package/dist/core/state.js.map +1 -1
  186. package/dist/core/types.d.ts +34 -6
  187. package/dist/core/types.d.ts.map +1 -1
  188. package/dist/daemon/reload-manager.d.ts +27 -0
  189. package/dist/daemon/reload-manager.d.ts.map +1 -0
  190. package/dist/daemon/reload-manager.js +67 -0
  191. package/dist/daemon/reload-manager.js.map +1 -0
  192. package/dist/daemon/scheduler.d.ts +9 -1
  193. package/dist/daemon/scheduler.d.ts.map +1 -1
  194. package/dist/daemon/scheduler.js +113 -38
  195. package/dist/daemon/scheduler.js.map +1 -1
  196. package/dist/daemon/serve-runtime.d.ts +31 -0
  197. package/dist/daemon/serve-runtime.d.ts.map +1 -0
  198. package/dist/daemon/serve-runtime.js +230 -0
  199. package/dist/daemon/serve-runtime.js.map +1 -0
  200. package/dist/embedded-assets.generated.d.ts.map +1 -1
  201. package/dist/embedded-assets.generated.js +3 -3
  202. package/dist/embedded-assets.generated.js.map +1 -1
  203. package/dist/extractors/playbook-extractor.d.ts +35 -0
  204. package/dist/extractors/playbook-extractor.d.ts.map +1 -0
  205. package/dist/extractors/playbook-extractor.js +98 -0
  206. package/dist/extractors/playbook-extractor.js.map +1 -0
  207. package/dist/extractors/prompts/examples/agent-session.md +257 -0
  208. package/dist/extractors/prompts/signal-extract.md +199 -0
  209. package/dist/extractors/prompts/system.md +45 -0
  210. package/dist/extractors/signal-extractor.d.ts +2 -1
  211. package/dist/extractors/signal-extractor.d.ts.map +1 -1
  212. package/dist/extractors/signal-extractor.js +99 -7
  213. package/dist/extractors/signal-extractor.js.map +1 -1
  214. package/dist/hooks/handlers.d.ts +21 -0
  215. package/dist/hooks/handlers.d.ts.map +1 -0
  216. package/dist/hooks/handlers.js +22 -0
  217. package/dist/hooks/handlers.js.map +1 -0
  218. package/dist/hooks/inject.d.ts +7 -0
  219. package/dist/hooks/inject.d.ts.map +1 -0
  220. package/dist/hooks/inject.js +18 -0
  221. package/dist/hooks/inject.js.map +1 -0
  222. package/dist/hooks/install.d.ts +14 -0
  223. package/dist/hooks/install.d.ts.map +1 -0
  224. package/dist/hooks/install.js +34 -0
  225. package/dist/hooks/install.js.map +1 -0
  226. package/dist/hooks/output.d.ts +19 -0
  227. package/dist/hooks/output.d.ts.map +1 -0
  228. package/dist/hooks/output.js +13 -0
  229. package/dist/hooks/output.js.map +1 -0
  230. package/dist/hooks/recall-client.d.ts +25 -0
  231. package/dist/hooks/recall-client.d.ts.map +1 -0
  232. package/dist/hooks/recall-client.js +56 -0
  233. package/dist/hooks/recall-client.js.map +1 -0
  234. package/dist/hooks/run-event.d.ts +13 -0
  235. package/dist/hooks/run-event.d.ts.map +1 -0
  236. package/dist/hooks/run-event.js +20 -0
  237. package/dist/hooks/run-event.js.map +1 -0
  238. package/dist/hooks/settings-edit.d.ts +10 -0
  239. package/dist/hooks/settings-edit.d.ts.map +1 -0
  240. package/dist/hooks/settings-edit.js +44 -0
  241. package/dist/hooks/settings-edit.js.map +1 -0
  242. package/dist/hooks/writeback.d.ts +12 -0
  243. package/dist/hooks/writeback.d.ts.map +1 -0
  244. package/dist/hooks/writeback.js +48 -0
  245. package/dist/hooks/writeback.js.map +1 -0
  246. package/dist/install/clients/claude-code.d.ts +3 -0
  247. package/dist/install/clients/claude-code.d.ts.map +1 -0
  248. package/dist/install/clients/claude-code.js +30 -0
  249. package/dist/install/clients/claude-code.js.map +1 -0
  250. package/dist/install/clients/claude-desktop.d.ts +3 -0
  251. package/dist/install/clients/claude-desktop.d.ts.map +1 -0
  252. package/dist/install/clients/claude-desktop.js +31 -0
  253. package/dist/install/clients/claude-desktop.js.map +1 -0
  254. package/dist/install/clients/codex.d.ts +3 -0
  255. package/dist/install/clients/codex.d.ts.map +1 -0
  256. package/dist/install/clients/codex.js +32 -0
  257. package/dist/install/clients/codex.js.map +1 -0
  258. package/dist/install/clients/cursor.d.ts +3 -0
  259. package/dist/install/clients/cursor.d.ts.map +1 -0
  260. package/dist/install/clients/cursor.js +35 -0
  261. package/dist/install/clients/cursor.js.map +1 -0
  262. package/dist/install/clients/hermes.d.ts +3 -0
  263. package/dist/install/clients/hermes.d.ts.map +1 -0
  264. package/dist/install/clients/hermes.js +35 -0
  265. package/dist/install/clients/hermes.js.map +1 -0
  266. package/dist/install/clients/index.d.ts +4 -0
  267. package/dist/install/clients/index.d.ts.map +1 -0
  268. package/dist/install/clients/index.js +18 -0
  269. package/dist/install/clients/index.js.map +1 -0
  270. package/dist/install/clients/windsurf.d.ts +3 -0
  271. package/dist/install/clients/windsurf.d.ts.map +1 -0
  272. package/dist/install/clients/windsurf.js +32 -0
  273. package/dist/install/clients/windsurf.js.map +1 -0
  274. package/dist/install/command.d.ts +14 -0
  275. package/dist/install/command.d.ts.map +1 -0
  276. package/dist/install/command.js +34 -0
  277. package/dist/install/command.js.map +1 -0
  278. package/dist/install/directive.d.ts +7 -0
  279. package/dist/install/directive.d.ts.map +1 -0
  280. package/dist/install/directive.js +31 -0
  281. package/dist/install/directive.js.map +1 -0
  282. package/dist/install/index.d.ts +26 -0
  283. package/dist/install/index.d.ts.map +1 -0
  284. package/dist/install/index.js +117 -0
  285. package/dist/install/index.js.map +1 -0
  286. package/dist/install/json-config.d.ts +11 -0
  287. package/dist/install/json-config.d.ts.map +1 -0
  288. package/dist/install/json-config.js +39 -0
  289. package/dist/install/json-config.js.map +1 -0
  290. package/dist/install/marked-block.d.ts +11 -0
  291. package/dist/install/marked-block.d.ts.map +1 -0
  292. package/dist/install/marked-block.js +34 -0
  293. package/dist/install/marked-block.js.map +1 -0
  294. package/dist/install/skill.d.ts +4 -0
  295. package/dist/install/skill.d.ts.map +1 -0
  296. package/dist/install/skill.js +61 -0
  297. package/dist/install/skill.js.map +1 -0
  298. package/dist/install/toml-config.d.ts +4 -0
  299. package/dist/install/toml-config.d.ts.map +1 -0
  300. package/dist/install/toml-config.js +51 -0
  301. package/dist/install/toml-config.js.map +1 -0
  302. package/dist/install/types.d.ts +37 -0
  303. package/dist/install/types.d.ts.map +1 -0
  304. package/dist/install/types.js +4 -0
  305. package/dist/install/types.js.map +1 -0
  306. package/dist/install/yaml-config.d.ts +4 -0
  307. package/dist/install/yaml-config.d.ts.map +1 -0
  308. package/dist/install/yaml-config.js +18 -0
  309. package/dist/install/yaml-config.js.map +1 -0
  310. package/dist/processors/privacy.d.ts +4 -1
  311. package/dist/processors/privacy.d.ts.map +1 -1
  312. package/dist/processors/privacy.js +5 -3
  313. package/dist/processors/privacy.js.map +1 -1
  314. package/dist/profile/accumulate.d.ts +28 -0
  315. package/dist/profile/accumulate.d.ts.map +1 -0
  316. package/dist/profile/accumulate.js +48 -0
  317. package/dist/profile/accumulate.js.map +1 -0
  318. package/dist/profile/behavior.d.ts +32 -0
  319. package/dist/profile/behavior.d.ts.map +1 -0
  320. package/dist/profile/behavior.js +122 -0
  321. package/dist/profile/behavior.js.map +1 -0
  322. package/dist/profile/four-color.d.ts +12 -0
  323. package/dist/profile/four-color.d.ts.map +1 -0
  324. package/dist/profile/four-color.js +39 -0
  325. package/dist/profile/four-color.js.map +1 -0
  326. package/dist/profile/profile-synth.d.ts +27 -0
  327. package/dist/profile/profile-synth.d.ts.map +1 -0
  328. package/dist/profile/profile-synth.js +174 -0
  329. package/dist/profile/profile-synth.js.map +1 -0
  330. package/dist/profile/types.d.ts +84 -0
  331. package/dist/profile/types.d.ts.map +1 -0
  332. package/dist/profile/types.js +11 -0
  333. package/dist/profile/types.js.map +1 -0
  334. package/dist/server/api.d.ts +8 -2
  335. package/dist/server/api.d.ts.map +1 -1
  336. package/dist/server/api.js +69 -34
  337. package/dist/server/api.js.map +1 -1
  338. package/dist/server/backfill-routes.d.ts.map +1 -1
  339. package/dist/server/backfill-routes.js +14 -1
  340. package/dist/server/backfill-routes.js.map +1 -1
  341. package/dist/server/chat-name-refresh-job.d.ts +33 -0
  342. package/dist/server/chat-name-refresh-job.d.ts.map +1 -0
  343. package/dist/server/chat-name-refresh-job.js +120 -0
  344. package/dist/server/chat-name-refresh-job.js.map +1 -0
  345. package/dist/server/chat-name-routes.d.ts +13 -0
  346. package/dist/server/chat-name-routes.d.ts.map +1 -0
  347. package/dist/server/chat-name-routes.js +81 -0
  348. package/dist/server/chat-name-routes.js.map +1 -0
  349. package/dist/server/config-routes.d.ts +2 -0
  350. package/dist/server/config-routes.d.ts.map +1 -1
  351. package/dist/server/config-routes.js +2 -1
  352. package/dist/server/config-routes.js.map +1 -1
  353. package/dist/server/mcp-http.d.ts +26 -0
  354. package/dist/server/mcp-http.d.ts.map +1 -0
  355. package/dist/server/mcp-http.js +102 -0
  356. package/dist/server/mcp-http.js.map +1 -0
  357. package/dist/server/mcp.d.ts +191 -25
  358. package/dist/server/mcp.d.ts.map +1 -1
  359. package/dist/server/mcp.js +1111 -68
  360. package/dist/server/mcp.js.map +1 -1
  361. package/dist/server/open-browser.d.ts +3 -0
  362. package/dist/server/open-browser.d.ts.map +1 -0
  363. package/dist/server/open-browser.js +12 -0
  364. package/dist/server/open-browser.js.map +1 -0
  365. package/dist/server/runtime.d.ts +13 -0
  366. package/dist/server/runtime.d.ts.map +1 -0
  367. package/dist/server/runtime.js +27 -0
  368. package/dist/server/runtime.js.map +1 -0
  369. package/dist/server/setup-server.d.ts.map +1 -1
  370. package/dist/server/setup-server.js +8 -11
  371. package/dist/server/setup-server.js.map +1 -1
  372. package/dist/setup/connection-tests.d.ts +1 -1
  373. package/dist/setup/connection-tests.d.ts.map +1 -1
  374. package/dist/setup/connection-tests.js +4 -2
  375. package/dist/setup/connection-tests.js.map +1 -1
  376. package/dist/setup/generate-config.d.ts.map +1 -1
  377. package/dist/setup/generate-config.js +31 -1
  378. package/dist/setup/generate-config.js.map +1 -1
  379. package/dist/setup/init-wizard.d.ts +1 -0
  380. package/dist/setup/init-wizard.d.ts.map +1 -1
  381. package/dist/setup/init-wizard.js +38 -21
  382. package/dist/setup/init-wizard.js.map +1 -1
  383. package/dist/setup/validate-config.d.ts +5 -1
  384. package/dist/setup/validate-config.d.ts.map +1 -1
  385. package/dist/setup/validate-config.js +18 -0
  386. package/dist/setup/validate-config.js.map +1 -1
  387. package/dist/store/data-dir-lock.d.ts +15 -0
  388. package/dist/store/data-dir-lock.d.ts.map +1 -0
  389. package/dist/store/data-dir-lock.js +96 -0
  390. package/dist/store/data-dir-lock.js.map +1 -0
  391. package/dist/store/database.d.ts +2 -0
  392. package/dist/store/database.d.ts.map +1 -1
  393. package/dist/store/database.js +23 -10
  394. package/dist/store/database.js.map +1 -1
  395. package/dist/store/graph.d.ts +22 -0
  396. package/dist/store/graph.d.ts.map +1 -1
  397. package/dist/store/graph.js +97 -7
  398. package/dist/store/graph.js.map +1 -1
  399. package/dist/store/migrations/index.d.ts.map +1 -1
  400. package/dist/store/migrations/index.js +52 -0
  401. package/dist/store/migrations/index.js.map +1 -1
  402. package/dist/store/pages.d.ts +7 -0
  403. package/dist/store/pages.d.ts.map +1 -1
  404. package/dist/store/pages.js +56 -1
  405. package/dist/store/pages.js.map +1 -1
  406. package/dist/store/person-behavior.d.ts +28 -0
  407. package/dist/store/person-behavior.d.ts.map +1 -0
  408. package/dist/store/person-behavior.js +127 -0
  409. package/dist/store/person-behavior.js.map +1 -0
  410. package/dist/store/pglite-assets.d.ts +15 -0
  411. package/dist/store/pglite-assets.d.ts.map +1 -0
  412. package/dist/store/pglite-assets.js +47 -0
  413. package/dist/store/pglite-assets.js.map +1 -0
  414. package/dist/store/query-rewrite.d.ts +28 -0
  415. package/dist/store/query-rewrite.d.ts.map +1 -0
  416. package/dist/store/query-rewrite.js +97 -0
  417. package/dist/store/query-rewrite.js.map +1 -0
  418. package/dist/store/schema.sql +107 -0
  419. package/dist/store/search.d.ts +36 -8
  420. package/dist/store/search.d.ts.map +1 -1
  421. package/dist/store/search.js +188 -76
  422. package/dist/store/search.js.map +1 -1
  423. package/dist/store/tags.d.ts.map +1 -1
  424. package/dist/store/tags.js +6 -2
  425. package/dist/store/tags.js.map +1 -1
  426. package/dist/store/timeline.d.ts +13 -1
  427. package/dist/store/timeline.d.ts.map +1 -1
  428. package/dist/store/timeline.js +134 -4
  429. package/dist/store/timeline.js.map +1 -1
  430. package/dist/store/trgm-search.d.ts +13 -0
  431. package/dist/store/trgm-search.d.ts.map +1 -0
  432. package/dist/store/trgm-search.js +53 -0
  433. package/dist/store/trgm-search.js.map +1 -0
  434. package/dist/store/wikilink.d.ts +17 -0
  435. package/dist/store/wikilink.d.ts.map +1 -0
  436. package/dist/store/wikilink.js +58 -0
  437. package/dist/store/wikilink.js.map +1 -0
  438. package/dist/sync/obsidian.d.ts.map +1 -1
  439. package/dist/sync/obsidian.js +5 -1
  440. package/dist/sync/obsidian.js.map +1 -1
  441. package/dist/synth/cache.d.ts +17 -0
  442. package/dist/synth/cache.d.ts.map +1 -0
  443. package/dist/synth/cache.js +67 -0
  444. package/dist/synth/cache.js.map +1 -0
  445. package/dist/synth/citations.d.ts +12 -0
  446. package/dist/synth/citations.d.ts.map +1 -0
  447. package/dist/synth/citations.js +28 -0
  448. package/dist/synth/citations.js.map +1 -0
  449. package/dist/synth/context.d.ts +10 -0
  450. package/dist/synth/context.d.ts.map +1 -0
  451. package/dist/synth/context.js +67 -0
  452. package/dist/synth/context.js.map +1 -0
  453. package/dist/synth/engine.d.ts +16 -0
  454. package/dist/synth/engine.d.ts.map +1 -0
  455. package/dist/synth/engine.js +111 -0
  456. package/dist/synth/engine.js.map +1 -0
  457. package/dist/synth/gaps.d.ts +17 -0
  458. package/dist/synth/gaps.d.ts.map +1 -0
  459. package/dist/synth/gaps.js +57 -0
  460. package/dist/synth/gaps.js.map +1 -0
  461. package/dist/synth/index.d.ts +6 -0
  462. package/dist/synth/index.d.ts.map +1 -0
  463. package/dist/synth/index.js +6 -0
  464. package/dist/synth/index.js.map +1 -0
  465. package/dist/synth/intent.d.ts +6 -0
  466. package/dist/synth/intent.d.ts.map +1 -0
  467. package/dist/synth/intent.js +13 -0
  468. package/dist/synth/intent.js.map +1 -0
  469. package/dist/synth/intents/daily-report.d.ts +7 -0
  470. package/dist/synth/intents/daily-report.d.ts.map +1 -0
  471. package/dist/synth/intents/daily-report.js +37 -0
  472. package/dist/synth/intents/daily-report.js.map +1 -0
  473. package/dist/synth/intents/index.d.ts +2 -0
  474. package/dist/synth/intents/index.d.ts.map +1 -0
  475. package/dist/synth/intents/index.js +12 -0
  476. package/dist/synth/intents/index.js.map +1 -0
  477. package/dist/synth/intents/person-strategy.d.ts +40 -0
  478. package/dist/synth/intents/person-strategy.d.ts.map +1 -0
  479. package/dist/synth/intents/person-strategy.js +66 -0
  480. package/dist/synth/intents/person-strategy.js.map +1 -0
  481. package/dist/synth/intents/recall.d.ts +8 -0
  482. package/dist/synth/intents/recall.d.ts.map +1 -0
  483. package/dist/synth/intents/recall.js +26 -0
  484. package/dist/synth/intents/recall.js.map +1 -0
  485. package/dist/synth/intents/troubleshoot.d.ts +11 -0
  486. package/dist/synth/intents/troubleshoot.d.ts.map +1 -0
  487. package/dist/synth/intents/troubleshoot.js +66 -0
  488. package/dist/synth/intents/troubleshoot.js.map +1 -0
  489. package/dist/synth/scope.d.ts +13 -0
  490. package/dist/synth/scope.d.ts.map +1 -0
  491. package/dist/synth/scope.js +139 -0
  492. package/dist/synth/scope.js.map +1 -0
  493. package/dist/synth/types.d.ts +117 -0
  494. package/dist/synth/types.d.ts.map +1 -0
  495. package/dist/synth/types.js +2 -0
  496. package/dist/synth/types.js.map +1 -0
  497. package/package.json +18 -6
@@ -0,0 +1,107 @@
1
+ CREATE EXTENSION IF NOT EXISTS vector;
2
+
3
+ CREATE TABLE IF NOT EXISTS pages (
4
+ id SERIAL PRIMARY KEY,
5
+ slug TEXT UNIQUE NOT NULL,
6
+ type TEXT NOT NULL,
7
+ title TEXT NOT NULL,
8
+ compiled_truth TEXT NOT NULL DEFAULT '',
9
+ frontmatter JSONB NOT NULL DEFAULT '{}',
10
+ content_hash TEXT,
11
+ search_vector TSVECTOR,
12
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
13
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
14
+ );
15
+
16
+ CREATE INDEX IF NOT EXISTS idx_pages_search_vector ON pages USING GIN (search_vector);
17
+
18
+ CREATE TABLE IF NOT EXISTS content_chunks (
19
+ id SERIAL PRIMARY KEY,
20
+ page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
21
+ chunk_index INTEGER NOT NULL,
22
+ UNIQUE(page_id, chunk_index),
23
+ chunk_text TEXT NOT NULL,
24
+ chunk_source TEXT NOT NULL DEFAULT 'compiled_truth',
25
+ token_count INTEGER,
26
+ embedding vector(1536),
27
+ model TEXT NOT NULL DEFAULT 'text-embedding-3-large',
28
+ embedded_at TIMESTAMPTZ,
29
+ search_vector TSVECTOR,
30
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
31
+ );
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_chunks_embedding ON content_chunks
34
+ USING hnsw (embedding vector_cosine_ops);
35
+ CREATE INDEX IF NOT EXISTS idx_chunks_search_vector ON content_chunks
36
+ USING GIN (search_vector);
37
+
38
+ CREATE TABLE IF NOT EXISTS links (
39
+ id SERIAL PRIMARY KEY,
40
+ from_page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
41
+ to_page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
42
+ link_type TEXT NOT NULL DEFAULT '',
43
+ context TEXT NOT NULL DEFAULT '',
44
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
45
+ UNIQUE(from_page_id, to_page_id, link_type)
46
+ );
47
+
48
+ CREATE INDEX IF NOT EXISTS idx_links_from ON links (from_page_id);
49
+ CREATE INDEX IF NOT EXISTS idx_links_to ON links (to_page_id);
50
+
51
+ CREATE TABLE IF NOT EXISTS tags (
52
+ id SERIAL PRIMARY KEY,
53
+ page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
54
+ tag TEXT NOT NULL,
55
+ UNIQUE(page_id, tag)
56
+ );
57
+
58
+ CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags (tag);
59
+
60
+ CREATE TABLE IF NOT EXISTS timeline_entries (
61
+ id SERIAL PRIMARY KEY,
62
+ page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,
63
+ date TEXT NOT NULL,
64
+ summary TEXT NOT NULL,
65
+ detail TEXT NOT NULL DEFAULT '',
66
+ source TEXT NOT NULL DEFAULT '',
67
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
68
+ UNIQUE(page_id, date, summary)
69
+ );
70
+
71
+ -- FTS Triggers
72
+ CREATE OR REPLACE FUNCTION update_page_search_vector() RETURNS trigger AS $$
73
+ BEGIN
74
+ NEW.search_vector :=
75
+ setweight(to_tsvector('simple', coalesce(NEW.title, '')), 'A') ||
76
+ setweight(to_tsvector('simple', coalesce(NEW.compiled_truth, '')), 'B');
77
+ RETURN NEW;
78
+ END;
79
+ $$ LANGUAGE plpgsql;
80
+
81
+ DO $$ BEGIN
82
+ IF NOT EXISTS (
83
+ SELECT 1 FROM pg_trigger WHERE tgname = 'trg_pages_search_vector'
84
+ ) THEN
85
+ CREATE TRIGGER trg_pages_search_vector
86
+ BEFORE INSERT OR UPDATE ON pages
87
+ FOR EACH ROW EXECUTE FUNCTION update_page_search_vector();
88
+ END IF;
89
+ END $$;
90
+
91
+ CREATE OR REPLACE FUNCTION update_chunk_search_vector() RETURNS trigger AS $$
92
+ BEGIN
93
+ NEW.search_vector :=
94
+ setweight(to_tsvector('simple', coalesce(NEW.chunk_text, '')), 'B');
95
+ RETURN NEW;
96
+ END;
97
+ $$ LANGUAGE plpgsql;
98
+
99
+ DO $$ BEGIN
100
+ IF NOT EXISTS (
101
+ SELECT 1 FROM pg_trigger WHERE tgname = 'chunk_search_vector_trigger'
102
+ ) THEN
103
+ CREATE TRIGGER chunk_search_vector_trigger
104
+ BEFORE INSERT OR UPDATE OF chunk_text ON content_chunks
105
+ FOR EACH ROW EXECUTE FUNCTION update_chunk_search_vector();
106
+ END IF;
107
+ END $$;
@@ -1,4 +1,6 @@
1
1
  import type { PGlite } from "@electric-sql/pglite";
2
+ import type { MemoryFilter, SourceRef } from "../core/types.js";
3
+ import type { LLMProvider } from "../extractors/providers/types.js";
2
4
  export interface SearchResult {
3
5
  slug: string;
4
6
  title: string;
@@ -6,17 +8,33 @@ export interface SearchResult {
6
8
  snippet: string;
7
9
  score: number;
8
10
  highlights: string[];
11
+ provenance?: SourceRef;
9
12
  }
10
- export interface SearchFilterOpts {
11
- limit?: number;
12
- type?: string[];
13
- from?: string;
14
- to?: string;
15
- platform?: string;
16
- exclude_types?: string[];
17
- }
13
+ export type SearchFilterOpts = MemoryFilter & {
14
+ /**
15
+ * best-chunk-per-page pooling (Spec 7 §七; default flipped on in Spec 10).
16
+ * When true (default): a page scores as its single strongest chunk (max RRF),
17
+ * so the best evidence surfaces and many-weak-chunk pages do not inflate via accumulation.
18
+ * When false: same-page chunks accumulate (sum) RRF scores (legacy behavior).
19
+ * If unset, falls back to the engine's config default (`search.pool_by_page`, default true).
20
+ * Only consulted by `query()`; `search()` ignores it.
21
+ */
22
+ poolByPage?: boolean;
23
+ };
18
24
  interface SearchEngineOpts {
19
25
  embedText?: (text: string) => Promise<number[]>;
26
+ /**
27
+ * Retrieval-quality config (Spec 10). When omitted, defaults to
28
+ * pool_by_page=true (best-chunk pooling on) and llm_rewrite=false.
29
+ */
30
+ search?: {
31
+ pool_by_page?: boolean;
32
+ llm_rewrite?: boolean;
33
+ /** abbreviation/synonym expansion map for rule-based query rewrite. */
34
+ synonyms?: Record<string, string[]>;
35
+ };
36
+ /** LLM provider; only used for query rewrite when search.llm_rewrite is true. */
37
+ llm?: LLMProvider;
20
38
  }
21
39
  /**
22
40
  * Compute freshness multiplier using exponential decay.
@@ -27,7 +45,17 @@ export declare function freshnessMultiplier(updatedAt: string | null): number;
27
45
  export declare class SearchEngine {
28
46
  private pg;
29
47
  private embedText?;
48
+ private poolByPageDefault;
49
+ private llmRewrite;
50
+ private synonyms?;
51
+ private llm?;
30
52
  constructor(pg: PGlite, opts?: SearchEngineOpts);
53
+ /**
54
+ * Spec 10 §5: rule-based query rewrite (synonym expansion, stopword filter,
55
+ * whitespace normalize) before retrieval; optional LLM rewrite only when
56
+ * search.llm_rewrite is true AND a provider is configured. Recall-only.
57
+ */
58
+ private rewrite;
31
59
  search(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
32
60
  query(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
33
61
  private ftsChunkSearch;
@@ -1 +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"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/store/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIpE,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;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG;IAC5C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD;;;OAGG;IACH,MAAM,CAAC,EAAE;QACP,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,uEAAuE;QACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACrC,CAAC;IACF,iFAAiF;IACjF,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAyBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMpE;AA+GD,qBAAa,YAAY;IAQrB,OAAO,CAAC,EAAE;IAPZ,OAAO,CAAC,SAAS,CAAC,CAAsC;IACxD,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAA2B;IAC5C,OAAO,CAAC,GAAG,CAAC,CAAc;gBAGhB,EAAE,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB;IAUzB;;;;OAIG;YACW,OAAO;IAUf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgDvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YA6H9D,cAAc;YAuDd,YAAY;CAiC3B"}
@@ -1,9 +1,13 @@
1
+ import { rewriteQuery } from "./query-rewrite.js";
2
+ import { buildSnippet, buildTrgmConditions, splitTerms } from "./trgm-search.js";
1
3
  const RRF_K = 60;
2
4
  const COMPILED_TRUTH_BOOST = 2.0;
3
5
  const BACKLINK_BOOST_FACTOR = 0.05;
4
6
  const FRESHNESS_HALF_LIFE_DAYS = 90;
5
7
  const FRESHNESS_BOOST_FACTOR = 0.3;
6
8
  const TIER_WEIGHTS = { hot: 1.0, warm: 0.8, cold: 0.6 };
9
+ const DEFAULT_SEARCH_LIMIT = 20;
10
+ const MAX_SEARCH_LIMIT = 50;
7
11
  /**
8
12
  * Compute freshness multiplier using exponential decay.
9
13
  * Returns 1.0 for missing timestamps (no effect).
@@ -17,81 +21,170 @@ export function freshnessMultiplier(updatedAt) {
17
21
  const ageDays = Math.max(0, (Date.now() - new Date(updatedAt).getTime()) / (1000 * 60 * 60 * 24));
18
22
  return 1 + FRESHNESS_BOOST_FACTOR * Math.exp(-ageDays / FRESHNESS_HALF_LIFE_DAYS);
19
23
  }
24
+ function clampLimit(limit, defaultLimit = DEFAULT_SEARCH_LIMIT) {
25
+ if (!Number.isFinite(limit) || (limit ?? 0) <= 0)
26
+ return defaultLimit;
27
+ return Math.min(Math.floor(limit), MAX_SEARCH_LIMIT);
28
+ }
29
+ function candidateLimit(limit) {
30
+ return Math.min(MAX_SEARCH_LIMIT, Math.max(DEFAULT_SEARCH_LIMIT, limit * 3));
31
+ }
32
+ function asArray(value) {
33
+ if (value === undefined)
34
+ return undefined;
35
+ return Array.isArray(value) ? value : [value];
36
+ }
37
+ function isDateOnly(value) {
38
+ return /^\d{4}-\d{2}-\d{2}$/.test(value);
39
+ }
40
+ function sourceField(alias, field) {
41
+ return `COALESCE(${alias}.frontmatter->'source'->>'${field}', ${alias}.frontmatter->'first_seen'->>'${field}')`;
42
+ }
43
+ function sourceJson(alias) {
44
+ return `COALESCE(${alias}.frontmatter->'source', ${alias}.frontmatter->'first_seen')`;
45
+ }
46
+ function addMemoryFilterConditions(conditions, params, opts, pageAlias = "p") {
47
+ const addArrayCondition = (field) => {
48
+ const values = asArray(opts?.[field]);
49
+ if (!values || values.length === 0)
50
+ return;
51
+ params.push(values);
52
+ conditions.push(`${sourceField(pageAlias, field)} = ANY($${params.length}::text[])`);
53
+ };
54
+ addArrayCondition("platform");
55
+ addArrayCondition("source_type");
56
+ if (opts?.channel) {
57
+ params.push(opts.channel);
58
+ conditions.push(`${sourceField(pageAlias, "channel")} = $${params.length}`);
59
+ }
60
+ if (opts?.channel_name) {
61
+ params.push(opts.channel_name);
62
+ conditions.push(`${sourceField(pageAlias, "channel_name")} = $${params.length}`);
63
+ }
64
+ if (opts?.participant) {
65
+ params.push(opts.participant);
66
+ const param = `$${params.length}`;
67
+ conditions.push(`(
68
+ EXISTS (
69
+ SELECT 1
70
+ FROM jsonb_array_elements(COALESCE(${sourceJson(pageAlias)}->'participants', '[]'::jsonb)) AS participant
71
+ WHERE participant->>'name' = ${param} OR participant->>'id' = ${param}
72
+ )
73
+ OR ${sourceJson(pageAlias)}->'author'->>'name' = ${param}
74
+ OR ${sourceJson(pageAlias)}->'author'->>'id' = ${param}
75
+ )`);
76
+ }
77
+ if (opts?.type && opts.type.length > 0) {
78
+ params.push(opts.type);
79
+ conditions.push(`${pageAlias}.type = ANY($${params.length}::text[])`);
80
+ }
81
+ if (opts?.exclude_types && opts.exclude_types.length > 0) {
82
+ params.push(opts.exclude_types);
83
+ conditions.push(`${pageAlias}.type != ALL($${params.length}::text[])`);
84
+ }
85
+ if (opts?.from) {
86
+ params.push(opts.from);
87
+ conditions.push(`COALESCE(${sourceField(pageAlias, "timestamp")}, ${pageAlias}.created_at::text)::timestamptz >= $${params.length}::timestamptz`);
88
+ }
89
+ if (opts?.to) {
90
+ params.push(opts.to);
91
+ if (isDateOnly(opts.to)) {
92
+ conditions.push(`COALESCE(${sourceField(pageAlias, "timestamp")}, ${pageAlias}.created_at::text)::timestamptz < ($${params.length}::date + interval '1 day')`);
93
+ }
94
+ else {
95
+ conditions.push(`COALESCE(${sourceField(pageAlias, "timestamp")}, ${pageAlias}.created_at::text)::timestamptz <= $${params.length}::timestamptz`);
96
+ }
97
+ }
98
+ }
99
+ function parseProvenance(value) {
100
+ if (!value)
101
+ return undefined;
102
+ if (typeof value === "string") {
103
+ try {
104
+ return JSON.parse(value);
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ return value;
111
+ }
20
112
  export class SearchEngine {
21
113
  pg;
22
114
  embedText;
115
+ poolByPageDefault;
116
+ llmRewrite;
117
+ synonyms;
118
+ llm;
23
119
  constructor(pg, opts) {
24
120
  this.pg = pg;
25
121
  this.embedText = opts?.embedText;
122
+ // Spec 10: best-chunk pooling defaults on; config can flip it back off.
123
+ this.poolByPageDefault = opts?.search?.pool_by_page ?? true;
124
+ this.llmRewrite = opts?.search?.llm_rewrite ?? false;
125
+ this.synonyms = opts?.search?.synonyms;
126
+ this.llm = opts?.llm;
127
+ }
128
+ /**
129
+ * Spec 10 §5: rule-based query rewrite (synonym expansion, stopword filter,
130
+ * whitespace normalize) before retrieval; optional LLM rewrite only when
131
+ * search.llm_rewrite is true AND a provider is configured. Recall-only.
132
+ */
133
+ async rewrite(query) {
134
+ if (this.llmRewrite && this.llm) {
135
+ return rewriteQuery(query, {
136
+ synonyms: this.synonyms,
137
+ llm: { enabled: true, provider: this.llm },
138
+ });
139
+ }
140
+ return rewriteQuery(query, { synonyms: this.synonyms });
26
141
  }
27
142
  async search(query, opts) {
28
- const limit = opts?.limit ?? 20;
29
- const tsquery = query
30
- .trim()
31
- .split(/\s+/)
32
- .filter(Boolean)
33
- .map((w) => w.replace(/[^a-zA-Z0-9一-鿿]/g, ""))
34
- .filter(Boolean)
35
- .join(" & ");
36
- if (!tsquery)
143
+ const limit = clampLimit(opts?.limit);
144
+ const terms = splitTerms(query);
145
+ if (terms.length === 0)
37
146
  return [];
38
- const conditions = ["p.search_vector @@ to_tsquery('simple', $1)"];
39
- const params = [tsquery];
40
- let paramIndex = 2;
41
- if (opts?.type && opts.type.length > 0) {
42
- conditions.push(`p.type = ANY($${paramIndex}::text[])`);
43
- params.push(opts.type);
44
- paramIndex++;
45
- }
46
- if (opts?.exclude_types && opts.exclude_types.length > 0) {
47
- conditions.push(`p.type != ALL($${paramIndex}::text[])`);
48
- params.push(opts.exclude_types);
49
- paramIndex++;
50
- }
51
- if (opts?.from) {
52
- conditions.push(`COALESCE(p.frontmatter->'source'->>'timestamp', p.frontmatter->'first_seen'->>'timestamp', p.created_at::text)::timestamptz >= $${paramIndex}::timestamptz`);
53
- params.push(opts.from);
54
- paramIndex++;
55
- }
56
- if (opts?.to) {
57
- conditions.push(`COALESCE(p.frontmatter->'source'->>'timestamp', p.frontmatter->'first_seen'->>'timestamp', p.created_at::text)::timestamptz <= ($${paramIndex}::date + interval '1 day')::timestamptz`);
58
- params.push(opts.to);
59
- paramIndex++;
60
- }
61
- if (opts?.platform) {
62
- conditions.push(`COALESCE(p.frontmatter->'source'->>'platform', p.frontmatter->'first_seen'->>'platform') = $${paramIndex}`);
63
- params.push(opts.platform);
64
- paramIndex++;
65
- }
147
+ const params = [query.trim()]; // $1: similarity() ranking input
148
+ const trgm = buildTrgmConditions(terms, ["p.title", "p.compiled_truth"], params);
149
+ if (!trgm)
150
+ return [];
151
+ const conditions = [trgm];
152
+ addMemoryFilterConditions(conditions, params, opts, "p");
66
153
  params.push(limit);
67
154
  const result = await this.pg.query(`SELECT
68
155
  p.slug,
69
156
  p.title,
70
157
  p.type,
71
- ts_rank(p.search_vector, to_tsquery('simple', $1)) AS page_rank,
72
- COALESCE(
73
- ts_headline('simple', p.compiled_truth, to_tsquery('simple', $1),
74
- 'MaxWords=30, MinWords=15, StartSel=**, StopSel=**'),
75
- ''
76
- ) AS snippet
158
+ GREATEST(similarity(p.title, $1), similarity(p.compiled_truth, $1)) AS page_rank,
159
+ p.compiled_truth AS body,
160
+ ${sourceJson("p")} AS provenance
77
161
  FROM pages p
78
162
  WHERE ${conditions.join(" AND ")}
79
- ORDER BY page_rank DESC
80
- LIMIT $${paramIndex}`, params);
81
- return result.rows.map((row) => ({
82
- slug: row.slug,
83
- title: row.title,
84
- type: row.type,
85
- snippet: row.snippet,
86
- score: Number(row.page_rank),
87
- highlights: row.snippet ? [row.snippet] : [],
88
- }));
163
+ ORDER BY page_rank DESC, p.updated_at DESC, p.slug ASC
164
+ LIMIT $${params.length}`, params);
165
+ return result.rows.map((row) => {
166
+ const snippet = buildSnippet(row.body, terms);
167
+ return {
168
+ slug: row.slug,
169
+ title: row.title,
170
+ type: row.type,
171
+ snippet,
172
+ score: Number(row.page_rank),
173
+ highlights: snippet ? [snippet] : [],
174
+ provenance: parseProvenance(row.provenance),
175
+ };
176
+ });
89
177
  }
90
178
  async query(query, opts) {
91
- const limit = opts?.limit ?? 20;
179
+ const limit = clampLimit(opts?.limit);
180
+ // Spec 10: per-call opt overrides config default (which itself defaults to true).
181
+ const poolByPage = opts?.poolByPage ?? this.poolByPageDefault;
182
+ // Spec 10 §5: rewrite for recall (rule-based; optional LLM). Falls back to the
183
+ // original query if rewriting produces nothing usable.
184
+ const effectiveQuery = (await this.rewrite(query)) || query;
92
185
  const [ftsResults, vectorResults] = await Promise.all([
93
- this.ftsChunkSearch(query),
94
- this.vectorSearch(query),
186
+ this.ftsChunkSearch(effectiveQuery, opts, candidateLimit(limit)),
187
+ this.vectorSearch(effectiveQuery, opts, candidateLimit(limit)),
95
188
  ]);
96
189
  const scoreMap = new Map();
97
190
  const addRanked = (results) => {
@@ -99,7 +192,10 @@ export class SearchEngine {
99
192
  const r = results[rank];
100
193
  const rrfScore = 1 / (RRF_K + rank + 1);
101
194
  const existing = scoreMap.get(r.slug);
102
- const newScore = (existing?.score ?? 0) + rrfScore;
195
+ // best-chunk pooling: max of strongest single chunk; default: accumulate (sum).
196
+ const newScore = poolByPage
197
+ ? Math.max(existing?.score ?? 0, rrfScore)
198
+ : (existing?.score ?? 0) + rrfScore;
103
199
  if (!existing || newScore > existing.score) {
104
200
  scoreMap.set(r.slug, {
105
201
  slug: r.slug,
@@ -109,6 +205,7 @@ export class SearchEngine {
109
205
  score: newScore,
110
206
  chunk_source: r.chunk_source,
111
207
  updated_at: r.updated_at,
208
+ provenance: parseProvenance(r.provenance),
112
209
  });
113
210
  }
114
211
  else {
@@ -165,35 +262,50 @@ export class SearchEngine {
165
262
  highlights: snippet ? [snippet] : [],
166
263
  }));
167
264
  }
168
- async ftsChunkSearch(query) {
169
- const tsquery = query
170
- .trim()
171
- .split(/\s+/)
172
- .filter(Boolean)
173
- .map((w) => w.replace(/[^a-zA-Z0-9一-鿿]/g, ""))
174
- .filter(Boolean)
175
- .join(" & ");
176
- if (!tsquery)
265
+ async ftsChunkSearch(query, opts, limit = MAX_SEARCH_LIMIT) {
266
+ const terms = splitTerms(query);
267
+ if (terms.length === 0)
268
+ return [];
269
+ const params = [query.trim()]; // $1: similarity() ranking input
270
+ const trgm = buildTrgmConditions(terms, ["cc.chunk_text"], params);
271
+ if (!trgm)
177
272
  return [];
273
+ const conditions = [trgm];
274
+ addMemoryFilterConditions(conditions, params, opts, "p");
275
+ params.push(limit);
178
276
  const result = await this.pg.query(`SELECT p.slug, p.title, p.type, cc.chunk_source, p.updated_at,
179
- ts_rank(cc.search_vector, to_tsquery('simple', $1)) AS chunk_rank,
180
- ts_headline('simple', cc.chunk_text, to_tsquery('simple', $1),
181
- 'MaxWords=30, MinWords=15, StartSel=**, StopSel=**') AS snippet
277
+ similarity(cc.chunk_text, $1) AS chunk_rank,
278
+ cc.chunk_text AS chunk_text,
279
+ ${sourceJson("p")} AS provenance
182
280
  FROM content_chunks cc JOIN pages p ON p.id = cc.page_id
183
- WHERE cc.search_vector @@ to_tsquery('simple', $1)
184
- ORDER BY chunk_rank DESC LIMIT 50`, [tsquery]);
185
- return result.rows;
281
+ WHERE ${conditions.join(" AND ")}
282
+ ORDER BY chunk_rank DESC, p.updated_at DESC NULLS LAST, p.slug ASC
283
+ LIMIT $${params.length}`, params);
284
+ return result.rows.map((r) => ({
285
+ slug: r.slug,
286
+ title: r.title,
287
+ type: r.type,
288
+ snippet: buildSnippet(r.chunk_text, terms),
289
+ chunk_source: r.chunk_source,
290
+ updated_at: r.updated_at,
291
+ provenance: r.provenance,
292
+ }));
186
293
  }
187
- async vectorSearch(query) {
294
+ async vectorSearch(query, opts, limit = MAX_SEARCH_LIMIT) {
188
295
  if (!this.embedText)
189
296
  return [];
190
297
  const queryVec = await this.embedText(query);
191
298
  const vecStr = `[${queryVec.join(",")}]`;
299
+ const conditions = ["cc.embedding IS NOT NULL"];
300
+ const params = [vecStr];
301
+ addMemoryFilterConditions(conditions, params, opts, "p");
302
+ params.push(limit);
192
303
  const result = await this.pg.query(`SELECT p.slug, p.title, p.type, cc.chunk_source, p.updated_at,
193
- cc.chunk_text AS snippet, 1 - (cc.embedding <=> $1::vector) AS cosine_sim
304
+ cc.chunk_text AS snippet, 1 - (cc.embedding <=> $1::vector) AS cosine_sim,
305
+ ${sourceJson("p")} AS provenance
194
306
  FROM content_chunks cc JOIN pages p ON p.id = cc.page_id
195
- WHERE cc.embedding IS NOT NULL
196
- ORDER BY cc.embedding <=> $1::vector LIMIT 50`, [vecStr]);
307
+ WHERE ${conditions.join(" AND ")}
308
+ ORDER BY cc.embedding <=> $1::vector LIMIT $${params.length}`, params);
197
309
  return result.rows;
198
310
  }
199
311
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/store/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/store/search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/store/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAMnD,qBAAa,QAAQ;IACP,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAY1D"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/store/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAUnD,qBAAa,QAAQ;IACP,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAY1D"}
@@ -4,9 +4,13 @@ export class TagStore {
4
4
  this.pg = pg;
5
5
  }
6
6
  async addTag(slug, tag) {
7
- await this.pg.query(`INSERT INTO tags (page_id, tag)
7
+ const result = await this.pg.query(`INSERT INTO tags (page_id, tag)
8
8
  SELECT id, $2 FROM pages WHERE slug = $1
9
- ON CONFLICT (page_id, tag) DO NOTHING`, [slug, tag]);
9
+ ON CONFLICT (page_id, tag) DO UPDATE SET tag = EXCLUDED.tag
10
+ RETURNING id`, [slug, tag]);
11
+ if (result.rows.length === 0) {
12
+ throw new Error(`Page not found: ${slug}`);
13
+ }
10
14
  }
11
15
  async removeTag(slug, tag) {
12
16
  await this.pg.query(`DELETE FROM tags WHERE page_id = (SELECT id FROM pages WHERE slug = $1) AND tag = $2`, [slug, tag]);
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/store/tags.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAElC,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,GAAW;QACpC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB;;6CAEuC,EACvC,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,GAAW;QACvC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB,sFAAsF,EACtF,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,4FAA4F,EAC5F,CAAC,IAAI,CAAC,CACP,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,0FAA0F,CAC3F,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/store/tags.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAElC,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,GAAW;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;oBAGc,EACd,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,GAAW;QACvC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB,sFAAsF,EACtF,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,4FAA4F,EAC5F,CAAC,IAAI,CAAC,CACP,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,0FAA0F,CAC3F,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { PGlite } from "@electric-sql/pglite";
2
- import type { SourceRef } from "../core/types.js";
2
+ import type { MemoryFilter, SourceRef } from "../core/types.js";
3
3
  export interface TimelineEntry {
4
4
  id: number;
5
5
  page_id: number;
@@ -10,6 +10,15 @@ export interface TimelineEntry {
10
10
  provenance?: SourceRef;
11
11
  created_at: string;
12
12
  }
13
+ export interface TimelineFeedEntry {
14
+ slug: string;
15
+ title: string;
16
+ type: string;
17
+ summary: string;
18
+ snippet: string;
19
+ time: string;
20
+ provenance?: SourceRef;
21
+ }
13
22
  export declare class TimelineStore {
14
23
  private pg;
15
24
  constructor(pg: PGlite);
@@ -21,6 +30,9 @@ export declare class TimelineStore {
21
30
  provenance?: SourceRef;
22
31
  }): Promise<void>;
23
32
  getTimeline(pageSlug: string): Promise<TimelineEntry[]>;
33
+ feed(opts?: MemoryFilter & {
34
+ query?: string;
35
+ }): Promise<TimelineFeedEntry[]>;
24
36
  getAllTimelineGrouped(): Promise<Map<string, TimelineEntry[]>>;
25
37
  }
26
38
  //# sourceMappingURL=timeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/store/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,SAAS,CAAC;KACxB,GACA,OAAO,CAAC,IAAI,CAAC;IAkBV,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAWvD,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAerE"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/store/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAgID,qBAAa,aAAa;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,SAAS,CAAC;KACxB,GACA,OAAO,CAAC,IAAI,CAAC;IAuBV,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAcvD,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAqC5E,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAerE"}