@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
@@ -44,10 +44,62 @@ WHERE tier = 'hot'
44
44
  AND halflife_days IS NOT NULL
45
45
  AND expires_at IS NULL;
46
46
  `;
47
+ // Migration 004: relax identity_cache.display_name to nullable.
48
+ // Semantics: display_name IS NULL AND resolved_at IS NOT NULL = permanent
49
+ // resolution failure (e.g. Lark 4013/404). Used by the chat-name resolution
50
+ // flow to distinguish "tried and failed" from "never tried".
51
+ const M004_IDENTITY_CACHE_NULLABLE = `
52
+ ALTER TABLE identity_cache ALTER COLUMN display_name DROP NOT NULL;
53
+ `;
54
+ // Migration 005: person_behavior table (Spec 8 §4.1) — the behavior layer of the
55
+ // person communication profile. Behavior metrics (response latency, message length,
56
+ // active hours, initiation, @-frequency) cannot be recomputed after extraction
57
+ // (raw messages are dropped), so they are accumulated incrementally as mergeable
58
+ // counters keyed by the OTHER person's canonical slug. hour_histogram defaults to a
59
+ // length-24 zero array so upsert can add element-wise without a null check.
60
+ const M005_PERSON_BEHAVIOR = `
61
+ CREATE TABLE IF NOT EXISTS person_behavior (
62
+ person_slug TEXT PRIMARY KEY,
63
+ msg_count INTEGER NOT NULL DEFAULT 0,
64
+ sum_msg_chars INTEGER NOT NULL DEFAULT 0,
65
+ initiated_count INTEGER NOT NULL DEFAULT 0,
66
+ reply_count INTEGER NOT NULL DEFAULT 0,
67
+ resp_latency_n INTEGER NOT NULL DEFAULT 0,
68
+ resp_latency_sum_s BIGINT NOT NULL DEFAULT 0,
69
+ hour_histogram JSONB NOT NULL DEFAULT '[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]',
70
+ at_count INTEGER NOT NULL DEFAULT 0,
71
+ window_start TIMESTAMPTZ,
72
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
73
+ );
74
+ `;
75
+ // Migration 006: Chinese FTS fix. Replace the tsvector('simple') lexical machinery with
76
+ // pg_trgm. Chinese has no whitespace, so to_tsvector('simple') collapsed each run into one
77
+ // giant lexeme and to_tsquery matched only exact whole-run strings — Chinese FTS was broken.
78
+ // pg_trgm GIN + ILIKE substring gives correct CJK recall with no re-extraction. CREATE
79
+ // EXTENSION must precede any gin_trgm_ops index.
80
+ const M006_TRGM_FTS = `
81
+ CREATE EXTENSION IF NOT EXISTS pg_trgm;
82
+
83
+ CREATE INDEX IF NOT EXISTS idx_pages_title_trgm ON pages USING gin (title gin_trgm_ops);
84
+ CREATE INDEX IF NOT EXISTS idx_pages_compiled_truth_trgm ON pages USING gin (compiled_truth gin_trgm_ops);
85
+ CREATE INDEX IF NOT EXISTS idx_chunks_chunk_text_trgm ON content_chunks USING gin (chunk_text gin_trgm_ops);
86
+
87
+ DROP TRIGGER IF EXISTS trg_pages_search_vector ON pages;
88
+ DROP TRIGGER IF EXISTS chunk_search_vector_trigger ON content_chunks;
89
+ DROP FUNCTION IF EXISTS update_page_search_vector();
90
+ DROP FUNCTION IF EXISTS update_chunk_search_vector();
91
+ DROP INDEX IF EXISTS idx_pages_search_vector;
92
+ DROP INDEX IF EXISTS idx_chunks_search_vector;
93
+ ALTER TABLE pages DROP COLUMN IF EXISTS search_vector;
94
+ ALTER TABLE content_chunks DROP COLUMN IF EXISTS search_vector;
95
+ `;
47
96
  export const MIGRATIONS = [
48
97
  { version: 1, name: "lifecycle_columns", sql: M001_LIFECYCLE_COLUMNS },
49
98
  { version: 2, name: "provenance_columns", sql: M002_PROVENANCE_COLUMNS },
50
99
  { version: 3, name: "lifecycle_tier", sql: M003_LIFECYCLE_TIER },
100
+ { version: 4, name: "identity_cache_nullable", sql: M004_IDENTITY_CACHE_NULLABLE },
101
+ { version: 5, name: "person_behavior", sql: M005_PERSON_BEHAVIOR },
102
+ { version: 6, name: "trgm_fts", sql: M006_TRGM_FTS },
51
103
  ];
52
104
  export async function runMigrations(pg) {
53
105
  await pg.exec(`
@@ -1 +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"}
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,gEAAgE;AAChE,0EAA0E;AAC1E,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,4BAA4B,GAAG;;CAEpC,CAAC;AAEF,iFAAiF;AACjF,oFAAoF;AACpF,+EAA+E;AAC/E,iFAAiF;AACjF,oFAAoF;AACpF,4EAA4E;AAC5E,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;CAc5B,CAAC;AAEF,wFAAwF;AACxF,2FAA2F;AAC3F,6FAA6F;AAC7F,uFAAuF;AACvF,iDAAiD;AACjD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;CAerB,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;IAChE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,GAAG,EAAE,4BAA4B,EAAE;IAClF,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,oBAAoB,EAAE;IAClE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE;CACrD,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"}
@@ -17,12 +17,19 @@ export interface Page {
17
17
  export interface PutPageOptions {
18
18
  halflife_days?: number | null;
19
19
  expires_at?: Date | null;
20
+ autoWikilink?: boolean;
20
21
  }
21
22
  export declare class PageStore {
22
23
  private pg;
24
+ private graph;
23
25
  constructor(pg: PGlite);
24
26
  putPage(slug: string, content: string, opts?: PutPageOptions): Promise<Page>;
27
+ private wireWikiLinks;
25
28
  getPage(slug: string): Promise<Page | null>;
29
+ /** Merge a synth cache entry into frontmatter.synth[intent] WITHOUT bumping updated_at or re-chunking. Returns false if the page does not exist. */
30
+ setSynthCache(slug: string, intent: string, entry: unknown): Promise<boolean>;
31
+ /** Merge top-level keys into a page's frontmatter WITHOUT bumping updated_at or re-chunking. Returns false if the page does not exist. */
32
+ patchFrontmatter(slug: string, patch: Record<string, unknown>): Promise<boolean>;
26
33
  deletePage(slug: string): Promise<void>;
27
34
  listPages(opts?: {
28
35
  type?: string;
@@ -1 +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"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAMnD,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;IAIzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAwCD,qBAAa,SAAS;IAGR,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,KAAK,CAAa;gBAEN,EAAE,EAAE,MAAM;IAIxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAsDpE,aAAa;IAcrB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAKjD,oJAAoJ;IAC9I,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAcnF,0IAA0I;IACpI,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhF,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"}
@@ -1,5 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { parse as parseYaml } from "yaml";
3
+ import { GraphStore } from "./graph.js";
4
+ import { parseWikiLinks } from "./wikilink.js";
3
5
  function parseMarkdownWithFrontmatter(content) {
4
6
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
5
7
  if (!fmMatch) {
@@ -14,8 +16,10 @@ function parseMarkdownWithFrontmatter(content) {
14
16
  }
15
17
  export class PageStore {
16
18
  pg;
19
+ graph;
17
20
  constructor(pg) {
18
21
  this.pg = pg;
22
+ this.graph = new GraphStore(pg);
19
23
  }
20
24
  async putPage(slug, content, opts) {
21
25
  const { title, type, compiled_truth, frontmatter } = parseMarkdownWithFrontmatter(content);
@@ -55,12 +59,63 @@ export class PageStore {
55
59
  halflifeDays,
56
60
  expiresAt,
57
61
  ]);
58
- return this.rowToPage(result.rows[0]);
62
+ const page = this.rowToPage(result.rows[0]);
63
+ // Spec 10 §4: zero-LLM auto-wiring. Scan ONLY compiled_truth for wikilinks
64
+ // and create typed edges. Missing targets are skipped (addLink no-ops when a
65
+ // slug is absent); this never throws and never breaks the write.
66
+ // Skippable (autoWikilink:false) for callers that own [[...]] semantics (Obsidian sync).
67
+ if (opts?.autoWikilink !== false) {
68
+ await this.wireWikiLinks(slug, compiled_truth);
69
+ }
70
+ return page;
71
+ }
72
+ async wireWikiLinks(fromSlug, compiledTruth) {
73
+ const links = parseWikiLinks(compiledTruth);
74
+ if (links.length === 0)
75
+ return;
76
+ const provenance = { auto: "wikilink" };
77
+ for (const link of links) {
78
+ if (link.to === fromSlug)
79
+ continue; // never self-link
80
+ try {
81
+ await this.graph.addLink(fromSlug, link.to, link.type, "", provenance);
82
+ }
83
+ catch {
84
+ // Target slug missing (or any transient edge error) -> skip, never break the write.
85
+ }
86
+ }
59
87
  }
60
88
  async getPage(slug) {
61
89
  const result = await this.pg.query("SELECT * FROM pages WHERE slug = $1", [slug]);
62
90
  return result.rows.length > 0 ? this.rowToPage(result.rows[0]) : null;
63
91
  }
92
+ /** Merge a synth cache entry into frontmatter.synth[intent] WITHOUT bumping updated_at or re-chunking. Returns false if the page does not exist. */
93
+ async setSynthCache(slug, intent, entry) {
94
+ const page = await this.getPage(slug);
95
+ if (!page)
96
+ return false;
97
+ const fm = { ...page.frontmatter };
98
+ const synth = fm.synth ?? {};
99
+ synth[intent] = entry;
100
+ fm.synth = synth;
101
+ await this.pg.query("UPDATE pages SET frontmatter = $2 WHERE slug = $1", [
102
+ slug,
103
+ JSON.stringify(fm),
104
+ ]);
105
+ return true;
106
+ }
107
+ /** Merge top-level keys into a page's frontmatter WITHOUT bumping updated_at or re-chunking. Returns false if the page does not exist. */
108
+ async patchFrontmatter(slug, patch) {
109
+ const page = await this.getPage(slug);
110
+ if (!page)
111
+ return false;
112
+ const fm = { ...page.frontmatter, ...patch };
113
+ await this.pg.query("UPDATE pages SET frontmatter = $2 WHERE slug = $1", [
114
+ slug,
115
+ JSON.stringify(fm),
116
+ ]);
117
+ return true;
118
+ }
64
119
  async deletePage(slug) {
65
120
  await this.pg.query("DELETE FROM pages WHERE slug = $1", [slug]);
66
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAkD/C,SAAS,4BAA4B,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAA4B,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAE1C,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;IAE7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,SAAS;IAGA;IAFZ,KAAK,CAAa;IAE1B,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,IAAqB;QAChE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC3F,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;QAEjD,0EAA0E;QAC1E,kCAAkC;QAClC,yCAAyC;QACzC,iFAAiF;QACjF,IAAI,SAAsB,CAAC;QAC3B,IAAI,IAAI,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,kCAAkC;QACjE,CAAC;aAAM,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;;;;;;;;mBAUa,EACb;YACE,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,cAAc;YACd,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC3B,WAAW;YACX,YAAY;YACZ,SAAS;SACV,CACF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,2EAA2E;QAC3E,6EAA6E;QAC7E,iEAAiE;QACjE,yFAAyF;QACzF,IAAI,IAAI,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,aAAqB;QACjE,MAAM,KAAK,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,UAAU,EAA0B,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ;gBAAE,SAAS,CAAC,kBAAkB;YACtD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,oFAAoF;YACtF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAU,qCAAqC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAED,oJAAoJ;IACpJ,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,MAAc,EAAE,KAAc;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,EAAE,GAAG,EAAE,GAAI,IAAI,CAAC,WAAuC,EAAE,CAAC;QAChE,MAAM,KAAK,GAAI,EAAE,CAAC,KAA6C,IAAI,EAAE,CAAC;QACtE,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACtB,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;QACjB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mDAAmD,EAAE;YACvE,IAAI;YACJ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0IAA0I;IAC1I,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,KAA8B;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,EAAE,GAAG,EAAE,GAAI,IAAI,CAAC,WAAuC,EAAE,GAAG,KAAK,EAAE,CAAC;QAC1E,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mDAAmD,EAAE;YACvE,IAAI;YACJ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAMf;QACC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,GAAG,GAAG;;;sCAG0B,WAAW;uCACV,OAAO,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,GAAG,GAAG,sBAAsB,WAAW;;;;;YAKjC,OAAO,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC9E,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;gBAC9B,CAAC,CAAC,YAAY,CAAC;YACjB,GAAG,GAAG,sBAAsB,WAAW,aAAa,OAAO,IAAI,OAAO,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,GAAG,IAAI,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAU,GAAG,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;;2BAIqB,CACtB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,IAAY,EAAE,gBAAgC;QAC7E,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB,sFAAsF,EACtF,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAC7B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,8DAA8D,EAAE;gBAClF,IAAI;gBACJ,EAAE;aACH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,yDAAyD,EACzD,CAAC,IAAI,CAAC,CACP,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,GAAY;QAC5B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,WAAW,EACT,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW;YACrF,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK;YACvB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;YAClC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI;YAChD,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * PersonBehaviorStore — persistence for the behavior layer (Spec 8 §4.1).
3
+ *
4
+ * Stores additively-mergeable counters keyed by the OTHER person's canonical
5
+ * slug. Behavior-layer metrics (response latency, message length, active hours,
6
+ * initiation, @-frequency) cannot be recomputed after extraction (raw messages
7
+ * are dropped), so they are accumulated incrementally as the pipeline processes
8
+ * DM / group blocks.
9
+ */
10
+ import type { PGlite } from "@electric-sql/pglite";
11
+ import type { BehaviorContribution, PersonBehaviorRow } from "../profile/types.js";
12
+ export declare class PersonBehaviorStore {
13
+ private pg;
14
+ constructor(pg: PGlite);
15
+ /**
16
+ * Additively merge a contribution into the row for `person_slug`.
17
+ * On INSERT, window_start is set to NOW(); on UPDATE it is left unchanged.
18
+ */
19
+ upsertContribution(c: BehaviorContribution): Promise<void>;
20
+ get(personSlug: string): Promise<PersonBehaviorRow | null>;
21
+ list(): Promise<PersonBehaviorRow[]>;
22
+ /**
23
+ * Merge the `from` person's behavior counters into `into` (additive),
24
+ * then delete the `from` row. Used by person-identity merge.
25
+ */
26
+ merge(fromSlug: string, intoSlug: string): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=person-behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person-behavior.d.ts","sourceRoot":"","sources":["../../src/store/person-behavior.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA6CnF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAE9B;;;OAGG;IACG,kBAAkB,CAAC,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD1D,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAO1D,IAAI,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK1C;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/D"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * PersonBehaviorStore — persistence for the behavior layer (Spec 8 §4.1).
3
+ *
4
+ * Stores additively-mergeable counters keyed by the OTHER person's canonical
5
+ * slug. Behavior-layer metrics (response latency, message length, active hours,
6
+ * initiation, @-frequency) cannot be recomputed after extraction (raw messages
7
+ * are dropped), so they are accumulated incrementally as the pipeline processes
8
+ * DM / group blocks.
9
+ */
10
+ function toRow(r) {
11
+ const hist = typeof r.hour_histogram === "string"
12
+ ? JSON.parse(r.hour_histogram)
13
+ : r.hour_histogram;
14
+ return {
15
+ person_slug: r.person_slug,
16
+ msg_count: Number(r.msg_count),
17
+ sum_msg_chars: Number(r.sum_msg_chars),
18
+ initiated_count: Number(r.initiated_count),
19
+ reply_count: Number(r.reply_count),
20
+ resp_latency_n: Number(r.resp_latency_n),
21
+ resp_latency_sum_s: Number(r.resp_latency_sum_s),
22
+ hour_histogram: hist,
23
+ at_count: Number(r.at_count),
24
+ window_start: r.window_start,
25
+ updated_at: r.updated_at,
26
+ };
27
+ }
28
+ /** Element-wise add two length-24 histograms. */
29
+ function addHistograms(a, b) {
30
+ const out = new Array(24).fill(0);
31
+ for (let i = 0; i < 24; i++) {
32
+ out[i] = (a[i] ?? 0) + (b[i] ?? 0);
33
+ }
34
+ return out;
35
+ }
36
+ export class PersonBehaviorStore {
37
+ pg;
38
+ constructor(pg) {
39
+ this.pg = pg;
40
+ }
41
+ /**
42
+ * Additively merge a contribution into the row for `person_slug`.
43
+ * On INSERT, window_start is set to NOW(); on UPDATE it is left unchanged.
44
+ */
45
+ async upsertContribution(c) {
46
+ const existing = await this.get(c.person_slug);
47
+ if (!existing) {
48
+ await this.pg.query(`INSERT INTO person_behavior
49
+ (person_slug, msg_count, sum_msg_chars, initiated_count, reply_count,
50
+ resp_latency_n, resp_latency_sum_s, hour_histogram, at_count, window_start, updated_at)
51
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW())`, [
52
+ c.person_slug,
53
+ c.msg_count,
54
+ c.sum_msg_chars,
55
+ c.initiated_count,
56
+ c.reply_count,
57
+ c.resp_latency_n,
58
+ c.resp_latency_sum_s,
59
+ JSON.stringify(normalizeHist(c.hour_histogram)),
60
+ c.at_count,
61
+ ]);
62
+ return;
63
+ }
64
+ const mergedHist = addHistograms(existing.hour_histogram, normalizeHist(c.hour_histogram));
65
+ await this.pg.query(`UPDATE person_behavior SET
66
+ msg_count = msg_count + $2,
67
+ sum_msg_chars = sum_msg_chars + $3,
68
+ initiated_count = initiated_count + $4,
69
+ reply_count = reply_count + $5,
70
+ resp_latency_n = resp_latency_n + $6,
71
+ resp_latency_sum_s = resp_latency_sum_s + $7,
72
+ hour_histogram = $8,
73
+ at_count = at_count + $9,
74
+ updated_at = NOW()
75
+ WHERE person_slug = $1`, [
76
+ c.person_slug,
77
+ c.msg_count,
78
+ c.sum_msg_chars,
79
+ c.initiated_count,
80
+ c.reply_count,
81
+ c.resp_latency_n,
82
+ c.resp_latency_sum_s,
83
+ JSON.stringify(mergedHist),
84
+ c.at_count,
85
+ ]);
86
+ }
87
+ async get(personSlug) {
88
+ const r = await this.pg.query("SELECT * FROM person_behavior WHERE person_slug = $1", [
89
+ personSlug,
90
+ ]);
91
+ return r.rows.length > 0 ? toRow(r.rows[0]) : null;
92
+ }
93
+ async list() {
94
+ const r = await this.pg.query("SELECT * FROM person_behavior");
95
+ return r.rows.map(toRow);
96
+ }
97
+ /**
98
+ * Merge the `from` person's behavior counters into `into` (additive),
99
+ * then delete the `from` row. Used by person-identity merge.
100
+ */
101
+ async merge(fromSlug, intoSlug) {
102
+ if (fromSlug === intoSlug)
103
+ return;
104
+ const from = await this.get(fromSlug);
105
+ if (!from)
106
+ return;
107
+ await this.upsertContribution({
108
+ person_slug: intoSlug,
109
+ msg_count: from.msg_count,
110
+ sum_msg_chars: from.sum_msg_chars,
111
+ initiated_count: from.initiated_count,
112
+ reply_count: from.reply_count,
113
+ resp_latency_n: from.resp_latency_n,
114
+ resp_latency_sum_s: from.resp_latency_sum_s,
115
+ hour_histogram: from.hour_histogram,
116
+ at_count: from.at_count,
117
+ });
118
+ await this.pg.query("DELETE FROM person_behavior WHERE person_slug = $1", [fromSlug]);
119
+ }
120
+ }
121
+ function normalizeHist(h) {
122
+ const out = new Array(24).fill(0);
123
+ for (let i = 0; i < 24; i++)
124
+ out[i] = h[i] ?? 0;
125
+ return out;
126
+ }
127
+ //# sourceMappingURL=person-behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person-behavior.js","sourceRoot":"","sources":["../../src/store/person-behavior.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,SAAS,KAAK,CAAC,CAAS;IACtB,MAAM,IAAI,GACR,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;QAClC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAc;QAC5C,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACvB,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;QACtC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;QAC1C,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACxC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAChD,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,SAAS,aAAa,CAAC,CAAW,EAAE,CAAW;IAC7C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAElC;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,CAAuB;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB;;;mEAG2D,EAC3D;gBACE,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,kBAAkB;gBACpB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC/C,CAAC,CAAC,QAAQ;aACX,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB;;;;;;;;;;8BAUwB,EACxB;YACE,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,kBAAkB;YACpB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YAC1B,CAAC,CAAC,QAAQ;SACX,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAkB;QAC1B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAS,sDAAsD,EAAE;YAC5F,UAAU;SACX,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAS,+BAA+B,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,QAAgB;QAC5C,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,CAAC,kBAAkB,CAAC;YAC5B,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oDAAoD,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,CAAC;CACF;AAED,SAAS,aAAa,CAAC,CAAW;IAChC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PGliteOptions } from "@electric-sql/pglite";
2
+ export declare function isCompiledBinary(metaUrl?: string): boolean;
3
+ export interface AssetDirInputs {
4
+ override?: string;
5
+ execDir?: string;
6
+ nodeModulesDir: string;
7
+ }
8
+ /** 纯函数:决定 PGLite 资产所在目录。override > execDir/assets > nodeModulesDir。 */
9
+ export declare function resolveAssetDir(inputs: AssetDirInputs): string;
10
+ /** compiled 模式下构造显式 blobs option;dev 模式返回 stock vector。 */
11
+ export declare function buildPGliteOptions(dataDir: string | undefined, opts?: {
12
+ compiled?: boolean;
13
+ assetsOverride?: string;
14
+ }): Promise<PGliteOptions>;
15
+ //# sourceMappingURL=pglite-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-assets.d.ts","sourceRoot":"","sources":["../../src/store/pglite-assets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAwB,GAAG,OAAO,CAE3E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI9D;AAED,2DAA2D;AAC3D,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,47 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { pg_trgm as stockPgTrgm } from "@electric-sql/pglite/contrib/pg_trgm";
4
+ import { vector as stockVector } from "@electric-sql/pglite/vector";
5
+ export function isCompiledBinary(metaUrl = import.meta.url) {
6
+ return metaUrl.includes("$bunfs");
7
+ }
8
+ /** 纯函数:决定 PGLite 资产所在目录。override > execDir/assets > nodeModulesDir。 */
9
+ export function resolveAssetDir(inputs) {
10
+ if (inputs.override)
11
+ return inputs.override;
12
+ if (inputs.execDir)
13
+ return join(inputs.execDir, "assets");
14
+ return inputs.nodeModulesDir;
15
+ }
16
+ /** compiled 模式下构造显式 blobs option;dev 模式返回 stock vector。 */
17
+ export async function buildPGliteOptions(dataDir, opts = {}) {
18
+ const compiled = opts.compiled ?? isCompiledBinary();
19
+ if (!compiled) {
20
+ return { dataDir, extensions: { vector: stockVector, pg_trgm: stockPgTrgm } };
21
+ }
22
+ const nodeModulesDir = ""; // compiled 不走这支
23
+ const execDir = dirname(process.execPath);
24
+ const assetDir = resolveAssetDir({ override: opts.assetsOverride, execDir, nodeModulesDir });
25
+ const asset = (n) => join(assetDir, n);
26
+ const pgliteWasmModule = await WebAssembly.compile(await readFile(asset("pglite.wasm")));
27
+ const initdbWasmModule = await WebAssembly.compile(await readFile(asset("initdb.wasm")));
28
+ const fsBundle = new Blob([await readFile(asset("pglite.data"))]);
29
+ const vectorBundleURL = new URL(`file://${asset("vector.tar.gz")}`);
30
+ const vector = {
31
+ name: "pgvector",
32
+ setup: async (_pg, em) => ({
33
+ emscriptenOpts: em,
34
+ bundlePath: vectorBundleURL,
35
+ }),
36
+ };
37
+ const pgTrgmBundleURL = new URL(`file://${asset("pg_trgm.tar.gz")}`);
38
+ const pg_trgm = {
39
+ name: "pg_trgm",
40
+ setup: async (_pg, em) => ({
41
+ emscriptenOpts: em,
42
+ bundlePath: pgTrgmBundleURL,
43
+ }),
44
+ };
45
+ return { dataDir, pgliteWasmModule, initdbWasmModule, fsBundle, extensions: { vector, pg_trgm } };
46
+ }
47
+ //# sourceMappingURL=pglite-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-assets.js","sourceRoot":"","sources":["../../src/store/pglite-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,UAAU,gBAAgB,CAAC,UAAkB,MAAM,CAAC,IAAI,CAAC,GAAG;IAChE,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAQD,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAC5C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,cAAc,CAAC;AAC/B,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA2B,EAC3B,OAAwD,EAAE;IAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,gBAAgB,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,gBAAgB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAW,EAAE,EAAE,CAAC,CAAC;YAC3C,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,eAAe;SAC5B,CAAC;KACH,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAW,EAAE,EAAE,CAAC,CAAC;YAC3C,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,eAAe;SAC5B,CAAC;KACH,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;AACpG,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { LLMProvider } from "../extractors/providers/types.js";
2
+ export interface QueryRewriteOpts {
3
+ /** abbreviation/synonym expansion map; key term -> extra terms appended for recall. */
4
+ synonyms?: Record<string, string[]>;
5
+ /** override the default stopword set. */
6
+ stopwords?: Iterable<string>;
7
+ /** optional LLM rewrite; only runs when enabled is true (default off). */
8
+ llm?: {
9
+ enabled: boolean;
10
+ provider: LLMProvider;
11
+ };
12
+ }
13
+ /**
14
+ * Rewrite a query before retrieval (Spec 10 §5). Affects recall only; does not
15
+ * change the public return shape.
16
+ *
17
+ * Synchronous (returns a string) for the rule-based path. When `opts.llm.enabled`
18
+ * is true it returns a Promise that additionally merges LLM-suggested keywords.
19
+ * When LLM is disabled (default), the provider is never called.
20
+ */
21
+ export declare function rewriteQuery(query: string, opts?: QueryRewriteOpts): string;
22
+ export declare function rewriteQuery(query: string, opts: QueryRewriteOpts & {
23
+ llm: {
24
+ enabled: true;
25
+ provider: LLMProvider;
26
+ };
27
+ }): Promise<string>;
28
+ //# sourceMappingURL=query-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-rewrite.d.ts","sourceRoot":"","sources":["../../src/store/query-rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAkCpE,MAAM,WAAW,gBAAgB;IAC/B,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,yCAAyC;IACzC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,0EAA0E;IAC1E,GAAG,CAAC,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,WAAW,CAAC;KACvB,CAAC;CACH;AAwCD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;AAC7E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gBAAgB,GAAG;IAAE,GAAG,EAAE;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAE,CAAA;CAAE,GACzE,OAAO,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Default English stopword set. Intentionally small and conservative — we only
3
+ * drop function words that almost never carry retrieval signal. CJK recall is
4
+ * already covered by tsvector('simple') + vectors, so no tokenizer is used here
5
+ * (Spec 10 §5: zero-dependency, rule-based; no jieba/@node-rs native bindings).
6
+ */
7
+ const DEFAULT_STOPWORDS = new Set([
8
+ "a",
9
+ "an",
10
+ "the",
11
+ "is",
12
+ "are",
13
+ "was",
14
+ "were",
15
+ "be",
16
+ "to",
17
+ "of",
18
+ "for",
19
+ "in",
20
+ "on",
21
+ "at",
22
+ "and",
23
+ "or",
24
+ "what",
25
+ "which",
26
+ "that",
27
+ "this",
28
+ "with",
29
+ "do",
30
+ "does",
31
+ ]);
32
+ const LLM_SYSTEM_PROMPT = "You expand a search query into a few extra keywords that improve recall. " +
33
+ "Return ONLY space-separated keywords, no punctuation, no explanation.";
34
+ function ruleRewrite(query, opts) {
35
+ const normalized = query.trim().replace(/\s+/g, " ");
36
+ if (!normalized)
37
+ return "";
38
+ const stopwords = opts?.stopwords ? new Set(opts.stopwords) : DEFAULT_STOPWORDS;
39
+ const synonyms = opts?.synonyms ?? {};
40
+ const tokens = normalized.split(" ");
41
+ const kept = tokens.filter((t) => !stopwords.has(t.toLowerCase()));
42
+ // If stopword filtering removed everything, fall back to the normalized query
43
+ // so retrieval still has terms to match.
44
+ const base = kept.length > 0 ? kept : tokens;
45
+ const result = [];
46
+ const seen = new Set();
47
+ const push = (term) => {
48
+ const key = term.toLowerCase();
49
+ if (!term || seen.has(key))
50
+ return;
51
+ seen.add(key);
52
+ result.push(term);
53
+ };
54
+ for (const term of base) {
55
+ push(term);
56
+ const expansions = synonyms[term.toLowerCase()];
57
+ if (expansions) {
58
+ for (const exp of expansions)
59
+ push(exp);
60
+ }
61
+ }
62
+ return result.join(" ");
63
+ }
64
+ export function rewriteQuery(query, opts) {
65
+ const ruleResult = ruleRewrite(query, opts);
66
+ if (!opts?.llm?.enabled) {
67
+ return ruleResult;
68
+ }
69
+ const provider = opts.llm.provider;
70
+ return (async () => {
71
+ let extra = "";
72
+ try {
73
+ extra = await provider.chat([
74
+ { role: "system", content: LLM_SYSTEM_PROMPT },
75
+ { role: "user", content: query },
76
+ ]);
77
+ }
78
+ catch {
79
+ // LLM failure must never break retrieval; fall back to the rule result.
80
+ return ruleResult;
81
+ }
82
+ const merged = [];
83
+ const seen = new Set();
84
+ for (const term of `${ruleResult} ${extra}`.split(/\s+/)) {
85
+ const t = term.replace(/[^\p{L}\p{N}_-]/gu, "");
86
+ if (!t)
87
+ continue;
88
+ const key = t.toLowerCase();
89
+ if (seen.has(key))
90
+ continue;
91
+ seen.add(key);
92
+ merged.push(t);
93
+ }
94
+ return merged.join(" ");
95
+ })();
96
+ }
97
+ //# sourceMappingURL=query-rewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-rewrite.js","sourceRoot":"","sources":["../../src/store/query-rewrite.ts"],"names":[],"mappings":"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"}