@andre.li/memoark 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/LICENSE +191 -0
  2. package/README.en.md +606 -0
  3. package/README.md +560 -0
  4. package/bin/memoark.mjs +36 -0
  5. package/dist/adapters/file.d.ts +19 -0
  6. package/dist/adapters/file.d.ts.map +1 -0
  7. package/dist/adapters/file.js +61 -0
  8. package/dist/adapters/file.js.map +1 -0
  9. package/dist/adapters/gbrain.d.ts +29 -0
  10. package/dist/adapters/gbrain.d.ts.map +1 -0
  11. package/dist/adapters/gbrain.js +622 -0
  12. package/dist/adapters/gbrain.js.map +1 -0
  13. package/dist/adapters/index.d.ts +6 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +5 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/registry.d.ts +18 -0
  18. package/dist/adapters/registry.d.ts.map +1 -0
  19. package/dist/adapters/registry.js +18 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/stdout.d.ts +12 -0
  22. package/dist/adapters/stdout.d.ts.map +1 -0
  23. package/dist/adapters/stdout.js +29 -0
  24. package/dist/adapters/stdout.js.map +1 -0
  25. package/dist/adapters/store.d.ts +47 -0
  26. package/dist/adapters/store.d.ts.map +1 -0
  27. package/dist/adapters/store.js +641 -0
  28. package/dist/adapters/store.js.map +1 -0
  29. package/dist/cli.d.ts +2 -0
  30. package/dist/cli.d.ts.map +1 -0
  31. package/dist/cli.js +694 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/collectors/agent/claude-code.d.ts +12 -0
  34. package/dist/collectors/agent/claude-code.d.ts.map +1 -0
  35. package/dist/collectors/agent/claude-code.js +94 -0
  36. package/dist/collectors/agent/claude-code.js.map +1 -0
  37. package/dist/collectors/agent/codex.d.ts +16 -0
  38. package/dist/collectors/agent/codex.d.ts.map +1 -0
  39. package/dist/collectors/agent/codex.js +149 -0
  40. package/dist/collectors/agent/codex.js.map +1 -0
  41. package/dist/collectors/agent/collector.d.ts +20 -0
  42. package/dist/collectors/agent/collector.d.ts.map +1 -0
  43. package/dist/collectors/agent/collector.js +108 -0
  44. package/dist/collectors/agent/collector.js.map +1 -0
  45. package/dist/collectors/agent/hermes.d.ts +13 -0
  46. package/dist/collectors/agent/hermes.d.ts.map +1 -0
  47. package/dist/collectors/agent/hermes.js +90 -0
  48. package/dist/collectors/agent/hermes.js.map +1 -0
  49. package/dist/collectors/agent/index.d.ts +6 -0
  50. package/dist/collectors/agent/index.d.ts.map +1 -0
  51. package/dist/collectors/agent/index.js +5 -0
  52. package/dist/collectors/agent/index.js.map +1 -0
  53. package/dist/collectors/agent/types.d.ts +61 -0
  54. package/dist/collectors/agent/types.d.ts.map +1 -0
  55. package/dist/collectors/agent/types.js +6 -0
  56. package/dist/collectors/agent/types.js.map +1 -0
  57. package/dist/collectors/feishu/auth.d.ts +13 -0
  58. package/dist/collectors/feishu/auth.d.ts.map +1 -0
  59. package/dist/collectors/feishu/auth.js +72 -0
  60. package/dist/collectors/feishu/auth.js.map +1 -0
  61. package/dist/collectors/feishu/collector.d.ts +23 -0
  62. package/dist/collectors/feishu/collector.d.ts.map +1 -0
  63. package/dist/collectors/feishu/collector.js +113 -0
  64. package/dist/collectors/feishu/collector.js.map +1 -0
  65. package/dist/collectors/feishu/cursor-staging.d.ts +11 -0
  66. package/dist/collectors/feishu/cursor-staging.d.ts.map +1 -0
  67. package/dist/collectors/feishu/cursor-staging.js +37 -0
  68. package/dist/collectors/feishu/cursor-staging.js.map +1 -0
  69. package/dist/collectors/feishu/http-client.d.ts +26 -0
  70. package/dist/collectors/feishu/http-client.d.ts.map +1 -0
  71. package/dist/collectors/feishu/http-client.js +94 -0
  72. package/dist/collectors/feishu/http-client.js.map +1 -0
  73. package/dist/collectors/feishu/index.d.ts +3 -0
  74. package/dist/collectors/feishu/index.d.ts.map +1 -0
  75. package/dist/collectors/feishu/index.js +2 -0
  76. package/dist/collectors/feishu/index.js.map +1 -0
  77. package/dist/collectors/feishu/lark-cli-client.d.ts +16 -0
  78. package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -0
  79. package/dist/collectors/feishu/lark-cli-client.js +69 -0
  80. package/dist/collectors/feishu/lark-cli-client.js.map +1 -0
  81. package/dist/collectors/feishu/rate-limiter.d.ts +10 -0
  82. package/dist/collectors/feishu/rate-limiter.d.ts.map +1 -0
  83. package/dist/collectors/feishu/rate-limiter.js +33 -0
  84. package/dist/collectors/feishu/rate-limiter.js.map +1 -0
  85. package/dist/collectors/feishu/sources/base.d.ts +9 -0
  86. package/dist/collectors/feishu/sources/base.d.ts.map +1 -0
  87. package/dist/collectors/feishu/sources/base.js +2 -0
  88. package/dist/collectors/feishu/sources/base.js.map +1 -0
  89. package/dist/collectors/feishu/sources/calendar.d.ts +16 -0
  90. package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -0
  91. package/dist/collectors/feishu/sources/calendar.js +93 -0
  92. package/dist/collectors/feishu/sources/calendar.js.map +1 -0
  93. package/dist/collectors/feishu/sources/dm.d.ts +28 -0
  94. package/dist/collectors/feishu/sources/dm.d.ts.map +1 -0
  95. package/dist/collectors/feishu/sources/dm.js +152 -0
  96. package/dist/collectors/feishu/sources/dm.js.map +1 -0
  97. package/dist/collectors/feishu/sources/docs.d.ts +23 -0
  98. package/dist/collectors/feishu/sources/docs.d.ts.map +1 -0
  99. package/dist/collectors/feishu/sources/docs.js +154 -0
  100. package/dist/collectors/feishu/sources/docs.js.map +1 -0
  101. package/dist/collectors/feishu/sources/mail.d.ts +27 -0
  102. package/dist/collectors/feishu/sources/mail.d.ts.map +1 -0
  103. package/dist/collectors/feishu/sources/mail.js +136 -0
  104. package/dist/collectors/feishu/sources/mail.js.map +1 -0
  105. package/dist/collectors/feishu/sources/message-search.d.ts +37 -0
  106. package/dist/collectors/feishu/sources/message-search.d.ts.map +1 -0
  107. package/dist/collectors/feishu/sources/message-search.js +140 -0
  108. package/dist/collectors/feishu/sources/message-search.js.map +1 -0
  109. package/dist/collectors/feishu/sources/messages.d.ts +26 -0
  110. package/dist/collectors/feishu/sources/messages.d.ts.map +1 -0
  111. package/dist/collectors/feishu/sources/messages.js +148 -0
  112. package/dist/collectors/feishu/sources/messages.js.map +1 -0
  113. package/dist/collectors/feishu/sources/tasks.d.ts +15 -0
  114. package/dist/collectors/feishu/sources/tasks.d.ts.map +1 -0
  115. package/dist/collectors/feishu/sources/tasks.js +74 -0
  116. package/dist/collectors/feishu/sources/tasks.js.map +1 -0
  117. package/dist/collectors/feishu/types.d.ts +224 -0
  118. package/dist/collectors/feishu/types.d.ts.map +1 -0
  119. package/dist/collectors/feishu/types.js +17 -0
  120. package/dist/collectors/feishu/types.js.map +1 -0
  121. package/dist/collectors/index.d.ts +10 -0
  122. package/dist/collectors/index.d.ts.map +1 -0
  123. package/dist/collectors/index.js +18 -0
  124. package/dist/collectors/index.js.map +1 -0
  125. package/dist/config-center/connection-checks.d.ts +28 -0
  126. package/dist/config-center/connection-checks.d.ts.map +1 -0
  127. package/dist/config-center/connection-checks.js +114 -0
  128. package/dist/config-center/connection-checks.js.map +1 -0
  129. package/dist/config-center/document.d.ts +21 -0
  130. package/dist/config-center/document.d.ts.map +1 -0
  131. package/dist/config-center/document.js +93 -0
  132. package/dist/config-center/document.js.map +1 -0
  133. package/dist/config-center/index.d.ts +9 -0
  134. package/dist/config-center/index.d.ts.map +1 -0
  135. package/dist/config-center/index.js +29 -0
  136. package/dist/config-center/index.js.map +1 -0
  137. package/dist/config-center/recommendations.d.ts +16 -0
  138. package/dist/config-center/recommendations.d.ts.map +1 -0
  139. package/dist/config-center/recommendations.js +50 -0
  140. package/dist/config-center/recommendations.js.map +1 -0
  141. package/dist/config-center/reducer.d.ts +57 -0
  142. package/dist/config-center/reducer.d.ts.map +1 -0
  143. package/dist/config-center/reducer.js +192 -0
  144. package/dist/config-center/reducer.js.map +1 -0
  145. package/dist/config-center/schema.d.ts +31 -0
  146. package/dist/config-center/schema.d.ts.map +1 -0
  147. package/dist/config-center/schema.js +365 -0
  148. package/dist/config-center/schema.js.map +1 -0
  149. package/dist/config-center/secrets.d.ts +4 -0
  150. package/dist/config-center/secrets.d.ts.map +1 -0
  151. package/dist/config-center/secrets.js +27 -0
  152. package/dist/config-center/secrets.js.map +1 -0
  153. package/dist/config-center/source-dirs.d.ts +16 -0
  154. package/dist/config-center/source-dirs.d.ts.map +1 -0
  155. package/dist/config-center/source-dirs.js +81 -0
  156. package/dist/config-center/source-dirs.js.map +1 -0
  157. package/dist/config-center/tui/app.d.ts +22 -0
  158. package/dist/config-center/tui/app.d.ts.map +1 -0
  159. package/dist/config-center/tui/app.js +142 -0
  160. package/dist/config-center/tui/app.js.map +1 -0
  161. package/dist/config-center/tui/render.d.ts +20 -0
  162. package/dist/config-center/tui/render.d.ts.map +1 -0
  163. package/dist/config-center/tui/render.js +166 -0
  164. package/dist/config-center/tui/render.js.map +1 -0
  165. package/dist/config-center/validation.d.ts +9 -0
  166. package/dist/config-center/validation.d.ts.map +1 -0
  167. package/dist/config-center/validation.js +59 -0
  168. package/dist/config-center/validation.js.map +1 -0
  169. package/dist/consolidator/consolidator.d.ts +31 -0
  170. package/dist/consolidator/consolidator.d.ts.map +1 -0
  171. package/dist/consolidator/consolidator.js +57 -0
  172. package/dist/consolidator/consolidator.js.map +1 -0
  173. package/dist/consolidator/dead-link.d.ts +7 -0
  174. package/dist/consolidator/dead-link.d.ts.map +1 -0
  175. package/dist/consolidator/dead-link.js +57 -0
  176. package/dist/consolidator/dead-link.js.map +1 -0
  177. package/dist/consolidator/hot-warm.d.ts +9 -0
  178. package/dist/consolidator/hot-warm.d.ts.map +1 -0
  179. package/dist/consolidator/hot-warm.js +88 -0
  180. package/dist/consolidator/hot-warm.js.map +1 -0
  181. package/dist/consolidator/infer-preferences.d.ts +14 -0
  182. package/dist/consolidator/infer-preferences.d.ts.map +1 -0
  183. package/dist/consolidator/infer-preferences.js +73 -0
  184. package/dist/consolidator/infer-preferences.js.map +1 -0
  185. package/dist/consolidator/rules.d.ts +5 -0
  186. package/dist/consolidator/rules.d.ts.map +1 -0
  187. package/dist/consolidator/rules.js +53 -0
  188. package/dist/consolidator/rules.js.map +1 -0
  189. package/dist/consolidator/warm-cold.d.ts +13 -0
  190. package/dist/consolidator/warm-cold.d.ts.map +1 -0
  191. package/dist/consolidator/warm-cold.js +91 -0
  192. package/dist/consolidator/warm-cold.js.map +1 -0
  193. package/dist/core/block-builder.d.ts +15 -0
  194. package/dist/core/block-builder.d.ts.map +1 -0
  195. package/dist/core/block-builder.js +185 -0
  196. package/dist/core/block-builder.js.map +1 -0
  197. package/dist/core/canonicalize.d.ts +3 -0
  198. package/dist/core/canonicalize.d.ts.map +1 -0
  199. package/dist/core/canonicalize.js +137 -0
  200. package/dist/core/canonicalize.js.map +1 -0
  201. package/dist/core/concurrency.d.ts +2 -0
  202. package/dist/core/concurrency.d.ts.map +1 -0
  203. package/dist/core/concurrency.js +14 -0
  204. package/dist/core/concurrency.js.map +1 -0
  205. package/dist/core/config.d.ts +184 -0
  206. package/dist/core/config.d.ts.map +1 -0
  207. package/dist/core/config.js +136 -0
  208. package/dist/core/config.js.map +1 -0
  209. package/dist/core/cursors.d.ts +36 -0
  210. package/dist/core/cursors.d.ts.map +1 -0
  211. package/dist/core/cursors.js +90 -0
  212. package/dist/core/cursors.js.map +1 -0
  213. package/dist/core/dedup.d.ts +45 -0
  214. package/dist/core/dedup.d.ts.map +1 -0
  215. package/dist/core/dedup.js +111 -0
  216. package/dist/core/dedup.js.map +1 -0
  217. package/dist/core/entity-extract.d.ts +3 -0
  218. package/dist/core/entity-extract.d.ts.map +1 -0
  219. package/dist/core/entity-extract.js +54 -0
  220. package/dist/core/entity-extract.js.map +1 -0
  221. package/dist/core/helpers.d.ts +3 -0
  222. package/dist/core/helpers.d.ts.map +1 -0
  223. package/dist/core/helpers.js +10 -0
  224. package/dist/core/helpers.js.map +1 -0
  225. package/dist/core/identity-resolver.d.ts +21 -0
  226. package/dist/core/identity-resolver.d.ts.map +1 -0
  227. package/dist/core/identity-resolver.js +62 -0
  228. package/dist/core/identity-resolver.js.map +1 -0
  229. package/dist/core/pipeline-factory.d.ts +13 -0
  230. package/dist/core/pipeline-factory.d.ts.map +1 -0
  231. package/dist/core/pipeline-factory.js +32 -0
  232. package/dist/core/pipeline-factory.js.map +1 -0
  233. package/dist/core/pipeline.d.ts +61 -0
  234. package/dist/core/pipeline.d.ts.map +1 -0
  235. package/dist/core/pipeline.js +261 -0
  236. package/dist/core/pipeline.js.map +1 -0
  237. package/dist/core/schemas.d.ts +2470 -0
  238. package/dist/core/schemas.d.ts.map +1 -0
  239. package/dist/core/schemas.js +229 -0
  240. package/dist/core/schemas.js.map +1 -0
  241. package/dist/core/signal-scoring.d.ts +3 -0
  242. package/dist/core/signal-scoring.d.ts.map +1 -0
  243. package/dist/core/signal-scoring.js +124 -0
  244. package/dist/core/signal-scoring.js.map +1 -0
  245. package/dist/core/state.d.ts +22 -0
  246. package/dist/core/state.d.ts.map +1 -0
  247. package/dist/core/state.js +32 -0
  248. package/dist/core/state.js.map +1 -0
  249. package/dist/core/types.d.ts +231 -0
  250. package/dist/core/types.d.ts.map +1 -0
  251. package/dist/core/types.js +6 -0
  252. package/dist/core/types.js.map +1 -0
  253. package/dist/daemon/alerts.d.ts +12 -0
  254. package/dist/daemon/alerts.d.ts.map +1 -0
  255. package/dist/daemon/alerts.js +34 -0
  256. package/dist/daemon/alerts.js.map +1 -0
  257. package/dist/daemon/index.d.ts +6 -0
  258. package/dist/daemon/index.d.ts.map +1 -0
  259. package/dist/daemon/index.js +6 -0
  260. package/dist/daemon/index.js.map +1 -0
  261. package/dist/daemon/logger.d.ts +8 -0
  262. package/dist/daemon/logger.d.ts.map +1 -0
  263. package/dist/daemon/logger.js +35 -0
  264. package/dist/daemon/logger.js.map +1 -0
  265. package/dist/daemon/run-history.d.ts +29 -0
  266. package/dist/daemon/run-history.d.ts.map +1 -0
  267. package/dist/daemon/run-history.js +54 -0
  268. package/dist/daemon/run-history.js.map +1 -0
  269. package/dist/daemon/scheduler.d.ts +37 -0
  270. package/dist/daemon/scheduler.d.ts.map +1 -0
  271. package/dist/daemon/scheduler.js +142 -0
  272. package/dist/daemon/scheduler.js.map +1 -0
  273. package/dist/daemon/source-schedule.d.ts +25 -0
  274. package/dist/daemon/source-schedule.d.ts.map +1 -0
  275. package/dist/daemon/source-schedule.js +87 -0
  276. package/dist/daemon/source-schedule.js.map +1 -0
  277. package/dist/embedded-assets.generated.d.ts +4 -0
  278. package/dist/embedded-assets.generated.d.ts.map +1 -0
  279. package/dist/embedded-assets.generated.js +12 -0
  280. package/dist/embedded-assets.generated.js.map +1 -0
  281. package/dist/extractors/noise-filter.d.ts +30 -0
  282. package/dist/extractors/noise-filter.d.ts.map +1 -0
  283. package/dist/extractors/noise-filter.js +185 -0
  284. package/dist/extractors/noise-filter.js.map +1 -0
  285. package/dist/extractors/providers/anthropic.d.ts +13 -0
  286. package/dist/extractors/providers/anthropic.d.ts.map +1 -0
  287. package/dist/extractors/providers/anthropic.js +67 -0
  288. package/dist/extractors/providers/anthropic.js.map +1 -0
  289. package/dist/extractors/providers/index.d.ts +12 -0
  290. package/dist/extractors/providers/index.d.ts.map +1 -0
  291. package/dist/extractors/providers/index.js +41 -0
  292. package/dist/extractors/providers/index.js.map +1 -0
  293. package/dist/extractors/providers/mock.d.ts +14 -0
  294. package/dist/extractors/providers/mock.d.ts.map +1 -0
  295. package/dist/extractors/providers/mock.js +37 -0
  296. package/dist/extractors/providers/mock.js.map +1 -0
  297. package/dist/extractors/providers/openai.d.ts +15 -0
  298. package/dist/extractors/providers/openai.d.ts.map +1 -0
  299. package/dist/extractors/providers/openai.js +109 -0
  300. package/dist/extractors/providers/openai.js.map +1 -0
  301. package/dist/extractors/providers/types.d.ts +27 -0
  302. package/dist/extractors/providers/types.d.ts.map +1 -0
  303. package/dist/extractors/providers/types.js +6 -0
  304. package/dist/extractors/providers/types.js.map +1 -0
  305. package/dist/extractors/signal-extractor.d.ts +29 -0
  306. package/dist/extractors/signal-extractor.d.ts.map +1 -0
  307. package/dist/extractors/signal-extractor.js +279 -0
  308. package/dist/extractors/signal-extractor.js.map +1 -0
  309. package/dist/formatters/index.d.ts +3 -0
  310. package/dist/formatters/index.d.ts.map +1 -0
  311. package/dist/formatters/index.js +3 -0
  312. package/dist/formatters/index.js.map +1 -0
  313. package/dist/formatters/json.d.ts +6 -0
  314. package/dist/formatters/json.d.ts.map +1 -0
  315. package/dist/formatters/json.js +16 -0
  316. package/dist/formatters/json.js.map +1 -0
  317. package/dist/formatters/markdown.d.ts +6 -0
  318. package/dist/formatters/markdown.d.ts.map +1 -0
  319. package/dist/formatters/markdown.js +198 -0
  320. package/dist/formatters/markdown.js.map +1 -0
  321. package/dist/processors/privacy.d.ts +98 -0
  322. package/dist/processors/privacy.d.ts.map +1 -0
  323. package/dist/processors/privacy.js +271 -0
  324. package/dist/processors/privacy.js.map +1 -0
  325. package/dist/server/api.d.ts +35 -0
  326. package/dist/server/api.d.ts.map +1 -0
  327. package/dist/server/api.js +453 -0
  328. package/dist/server/api.js.map +1 -0
  329. package/dist/server/backfill-job.d.ts +36 -0
  330. package/dist/server/backfill-job.d.ts.map +1 -0
  331. package/dist/server/backfill-job.js +88 -0
  332. package/dist/server/backfill-job.js.map +1 -0
  333. package/dist/server/backfill-routes.d.ts +7 -0
  334. package/dist/server/backfill-routes.d.ts.map +1 -0
  335. package/dist/server/backfill-routes.js +123 -0
  336. package/dist/server/backfill-routes.js.map +1 -0
  337. package/dist/server/config-routes.d.ts +8 -0
  338. package/dist/server/config-routes.d.ts.map +1 -0
  339. package/dist/server/config-routes.js +114 -0
  340. package/dist/server/config-routes.js.map +1 -0
  341. package/dist/server/context.d.ts +13 -0
  342. package/dist/server/context.d.ts.map +1 -0
  343. package/dist/server/context.js +47 -0
  344. package/dist/server/context.js.map +1 -0
  345. package/dist/server/entity.d.ts +25 -0
  346. package/dist/server/entity.d.ts.map +1 -0
  347. package/dist/server/entity.js +34 -0
  348. package/dist/server/entity.js.map +1 -0
  349. package/dist/server/event-bus.d.ts +35 -0
  350. package/dist/server/event-bus.d.ts.map +1 -0
  351. package/dist/server/event-bus.js +4 -0
  352. package/dist/server/event-bus.js.map +1 -0
  353. package/dist/server/mcp.d.ts +126 -0
  354. package/dist/server/mcp.d.ts.map +1 -0
  355. package/dist/server/mcp.js +103 -0
  356. package/dist/server/mcp.js.map +1 -0
  357. package/dist/server/setup-server.d.ts +7 -0
  358. package/dist/server/setup-server.d.ts.map +1 -0
  359. package/dist/server/setup-server.js +52 -0
  360. package/dist/server/setup-server.js.map +1 -0
  361. package/dist/setup/assess-hardware.d.ts +34 -0
  362. package/dist/setup/assess-hardware.d.ts.map +1 -0
  363. package/dist/setup/assess-hardware.js +179 -0
  364. package/dist/setup/assess-hardware.js.map +1 -0
  365. package/dist/setup/connection-tests.d.ts +17 -0
  366. package/dist/setup/connection-tests.d.ts.map +1 -0
  367. package/dist/setup/connection-tests.js +67 -0
  368. package/dist/setup/connection-tests.js.map +1 -0
  369. package/dist/setup/detect-api-keys.d.ts +13 -0
  370. package/dist/setup/detect-api-keys.d.ts.map +1 -0
  371. package/dist/setup/detect-api-keys.js +41 -0
  372. package/dist/setup/detect-api-keys.js.map +1 -0
  373. package/dist/setup/detect-runtime.d.ts +14 -0
  374. package/dist/setup/detect-runtime.d.ts.map +1 -0
  375. package/dist/setup/detect-runtime.js +43 -0
  376. package/dist/setup/detect-runtime.js.map +1 -0
  377. package/dist/setup/detect-sources.d.ts +14 -0
  378. package/dist/setup/detect-sources.d.ts.map +1 -0
  379. package/dist/setup/detect-sources.js +75 -0
  380. package/dist/setup/detect-sources.js.map +1 -0
  381. package/dist/setup/generate-config.d.ts +5 -0
  382. package/dist/setup/generate-config.d.ts.map +1 -0
  383. package/dist/setup/generate-config.js +103 -0
  384. package/dist/setup/generate-config.js.map +1 -0
  385. package/dist/setup/index.d.ts +9 -0
  386. package/dist/setup/index.d.ts.map +1 -0
  387. package/dist/setup/index.js +9 -0
  388. package/dist/setup/index.js.map +1 -0
  389. package/dist/setup/init-wizard.d.ts +19 -0
  390. package/dist/setup/init-wizard.d.ts.map +1 -0
  391. package/dist/setup/init-wizard.js +501 -0
  392. package/dist/setup/init-wizard.js.map +1 -0
  393. package/dist/setup/terminal.d.ts +28 -0
  394. package/dist/setup/terminal.d.ts.map +1 -0
  395. package/dist/setup/terminal.js +258 -0
  396. package/dist/setup/terminal.js.map +1 -0
  397. package/dist/setup/validate-config.d.ts +26 -0
  398. package/dist/setup/validate-config.d.ts.map +1 -0
  399. package/dist/setup/validate-config.js +27 -0
  400. package/dist/setup/validate-config.js.map +1 -0
  401. package/dist/store/chunks.d.ts +19 -0
  402. package/dist/store/chunks.d.ts.map +1 -0
  403. package/dist/store/chunks.js +70 -0
  404. package/dist/store/chunks.js.map +1 -0
  405. package/dist/store/database.d.ts +24 -0
  406. package/dist/store/database.d.ts.map +1 -0
  407. package/dist/store/database.js +62 -0
  408. package/dist/store/database.js.map +1 -0
  409. package/dist/store/embedding.d.ts +23 -0
  410. package/dist/store/embedding.d.ts.map +1 -0
  411. package/dist/store/embedding.js +62 -0
  412. package/dist/store/embedding.js.map +1 -0
  413. package/dist/store/graph.d.ts +53 -0
  414. package/dist/store/graph.d.ts.map +1 -0
  415. package/dist/store/graph.js +186 -0
  416. package/dist/store/graph.js.map +1 -0
  417. package/dist/store/migrations/index.d.ts +9 -0
  418. package/dist/store/migrations/index.d.ts.map +1 -0
  419. package/dist/store/migrations/index.js +68 -0
  420. package/dist/store/migrations/index.js.map +1 -0
  421. package/dist/store/pages.d.ts +39 -0
  422. package/dist/store/pages.d.ts.map +1 -0
  423. package/dist/store/pages.js +150 -0
  424. package/dist/store/pages.js.map +1 -0
  425. package/dist/store/search.d.ts +37 -0
  426. package/dist/store/search.d.ts.map +1 -0
  427. package/dist/store/search.js +200 -0
  428. package/dist/store/search.js.map +1 -0
  429. package/dist/store/tags.d.ts +10 -0
  430. package/dist/store/tags.d.ts.map +1 -0
  431. package/dist/store/tags.js +31 -0
  432. package/dist/store/tags.js.map +1 -0
  433. package/dist/store/timeline.d.ts +26 -0
  434. package/dist/store/timeline.d.ts.map +1 -0
  435. package/dist/store/timeline.js +43 -0
  436. package/dist/store/timeline.js.map +1 -0
  437. package/dist/sync/obsidian.d.ts +136 -0
  438. package/dist/sync/obsidian.d.ts.map +1 -0
  439. package/dist/sync/obsidian.js +539 -0
  440. package/dist/sync/obsidian.js.map +1 -0
  441. package/package.json +84 -0
@@ -0,0 +1,641 @@
1
+ import { createHash } from "node:crypto";
2
+ import { stringify as yamlStringify } from "yaml";
3
+ // Per-type lifecycle defaults (Spec 1 §4.3). NULL = never auto-expires.
4
+ // Spec 2's Consolidator reads halflife_days to decide hot→warm timing.
5
+ const HALFLIFE_DAYS = {
6
+ decision: 90,
7
+ task: 90,
8
+ discovery: 90,
9
+ knowledge: 365,
10
+ preference: 90,
11
+ reference: null,
12
+ entity: null,
13
+ };
14
+ export class StoreAdapter {
15
+ id = "store";
16
+ name = "Memoark Store Adapter";
17
+ description = "Writes extraction results directly to PGLite stores";
18
+ stores;
19
+ onPageWritten;
20
+ constructor(stores, opts) {
21
+ this.stores = stores;
22
+ this.onPageWritten = opts?.onPageWritten;
23
+ }
24
+ notifyPageWritten(page) {
25
+ if (!this.onPageWritten)
26
+ return;
27
+ this.onPageWritten({
28
+ slug: page.slug,
29
+ type: page.type,
30
+ title: page.title,
31
+ summary: page.compiled_truth.slice(0, 100),
32
+ });
33
+ }
34
+ async healthCheck() {
35
+ try {
36
+ // Simple check - try to list pages
37
+ await this.stores.pages.listPages({ limit: 1 });
38
+ return { ok: true, message: "Store adapter is ready" };
39
+ }
40
+ catch (error) {
41
+ return {
42
+ ok: false,
43
+ message: `Store adapter health check failed: ${error instanceof Error ? error.message : String(error)}`,
44
+ };
45
+ }
46
+ }
47
+ async push(results) {
48
+ const pushResult = {
49
+ written: 0,
50
+ skipped: 0,
51
+ errors: [],
52
+ };
53
+ for (const result of results) {
54
+ // Process Entities
55
+ for (const entity of result.entities) {
56
+ const writeResult = await this.writeEntity(entity, result.source.raw_hash, result.source, result.personAliases);
57
+ pushResult.written += writeResult.written;
58
+ pushResult.skipped += writeResult.skipped;
59
+ pushResult.errors.push(...writeResult.errors);
60
+ }
61
+ // Process Decisions
62
+ for (const decision of result.decisions) {
63
+ const writeResult = await this.writeDecision(decision);
64
+ pushResult.written += writeResult.written;
65
+ pushResult.skipped += writeResult.skipped;
66
+ pushResult.errors.push(...writeResult.errors);
67
+ }
68
+ // Process Tasks
69
+ for (const task of result.tasks) {
70
+ const writeResult = await this.writeTask(task);
71
+ pushResult.written += writeResult.written;
72
+ pushResult.skipped += writeResult.skipped;
73
+ pushResult.errors.push(...writeResult.errors);
74
+ }
75
+ // Process Discoveries
76
+ for (const discovery of result.discoveries) {
77
+ const writeResult = await this.writeDiscovery(discovery);
78
+ pushResult.written += writeResult.written;
79
+ pushResult.skipped += writeResult.skipped;
80
+ pushResult.errors.push(...writeResult.errors);
81
+ }
82
+ // Process Knowledge
83
+ for (const knowledge of result.knowledge) {
84
+ const writeResult = await this.writeKnowledge(knowledge);
85
+ pushResult.written += writeResult.written;
86
+ pushResult.skipped += writeResult.skipped;
87
+ pushResult.errors.push(...writeResult.errors);
88
+ }
89
+ // Process Preferences
90
+ for (const preference of result.preferences) {
91
+ const writeResult = await this.writePreference(preference);
92
+ pushResult.written += writeResult.written;
93
+ pushResult.skipped += writeResult.skipped;
94
+ pushResult.errors.push(...writeResult.errors);
95
+ }
96
+ // Process References
97
+ for (const reference of result.references) {
98
+ const writeResult = await this.writeReference(reference);
99
+ pushResult.written += writeResult.written;
100
+ pushResult.skipped += writeResult.skipped;
101
+ pushResult.errors.push(...writeResult.errors);
102
+ }
103
+ // Process Timeline Entries
104
+ for (const entry of result.timeline) {
105
+ const writeResult = await this.appendTimelineEntry(entry);
106
+ pushResult.written += writeResult.written;
107
+ pushResult.skipped += writeResult.skipped;
108
+ pushResult.errors.push(...writeResult.errors);
109
+ }
110
+ // Process Links
111
+ for (const link of result.links) {
112
+ const writeResult = await this.appendLink(link);
113
+ pushResult.written += writeResult.written;
114
+ pushResult.skipped += writeResult.skipped;
115
+ pushResult.errors.push(...writeResult.errors);
116
+ }
117
+ }
118
+ return pushResult;
119
+ }
120
+ async writeEntity(entity, sourceHash, source, personAliases) {
121
+ const result = { written: 0, skipped: 0, errors: [] };
122
+ try {
123
+ const existingPage = await this.stores.pages.getPage(entity.slug);
124
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
125
+ result.skipped += 1;
126
+ return result;
127
+ }
128
+ // H4: respect user edits made via Obsidian sync
129
+ if (existingPage?.frontmatter.user_edited === true) {
130
+ result.skipped += 1;
131
+ return result;
132
+ }
133
+ const frontmatter = {
134
+ title: entity.name,
135
+ type: entity.type,
136
+ confidence: entity.confidence,
137
+ source_hash: sourceHash,
138
+ created_at: existingPage?.frontmatter.created_at ?? new Date().toISOString(),
139
+ updated_at: new Date().toISOString(),
140
+ };
141
+ if (source) {
142
+ if (!existingPage?.frontmatter.first_seen) {
143
+ frontmatter.first_seen = source;
144
+ }
145
+ else {
146
+ frontmatter.first_seen = existingPage.frontmatter.first_seen;
147
+ }
148
+ }
149
+ // Handle person aliases
150
+ if (entity.type === "person" && personAliases?.[entity.slug]) {
151
+ const newAliases = personAliases[entity.slug];
152
+ const existingAliases = existingPage?.frontmatter.aliases ?? [];
153
+ // Merge and deduplicate aliases
154
+ const mergedAliases = Array.from(new Set([...existingAliases, ...newAliases]));
155
+ frontmatter.aliases = mergedAliases;
156
+ }
157
+ const bodyParts = [`## Context\n\n${entity.context}`];
158
+ // Add aliases section to body for person entities
159
+ if (entity.type === "person" && frontmatter.aliases) {
160
+ const aliasesList = frontmatter.aliases
161
+ .map((alias) => `- ${alias}`)
162
+ .join("\n");
163
+ bodyParts.unshift(`## Aliases\n\n${aliasesList}`);
164
+ }
165
+ const content = `---
166
+ ${yamlStringify(frontmatter).trimEnd()}
167
+ ---
168
+
169
+ ${bodyParts.join("\n\n")}
170
+ `;
171
+ // Write page
172
+ const page = await this.stores.pages.putPage(entity.slug, content, {
173
+ halflife_days: HALFLIFE_DAYS.entity,
174
+ });
175
+ // Notify callback
176
+ this.notifyPageWritten(page);
177
+ // Rechunk
178
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
179
+ // Add entity tag
180
+ await this.stores.tags.addTag(entity.slug, "entity");
181
+ result.written += 1;
182
+ }
183
+ catch (error) {
184
+ result.errors.push({
185
+ signal: `entity:${entity.slug}`,
186
+ reason: error instanceof Error ? error.message : String(error),
187
+ });
188
+ }
189
+ return result;
190
+ }
191
+ async writeDecision(decision) {
192
+ const result = { written: 0, skipped: 0, errors: [] };
193
+ try {
194
+ const slug = `decisions/${this.kebabCase(decision.summary)}`;
195
+ const sourceHash = decision.source.raw_hash;
196
+ // Check for duplicate
197
+ const existingPage = await this.stores.pages.getPage(slug);
198
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
199
+ result.skipped += 1;
200
+ return result;
201
+ }
202
+ // H4: respect user edits made via Obsidian sync
203
+ if (existingPage?.frontmatter.user_edited === true) {
204
+ result.skipped += 1;
205
+ return result;
206
+ }
207
+ // Build markdown with frontmatter
208
+ const frontmatter = {
209
+ title: decision.summary,
210
+ type: "decision",
211
+ date: decision.date,
212
+ entities: decision.entities,
213
+ confidence: decision.confidence,
214
+ source_hash: sourceHash,
215
+ source: decision.source,
216
+ created_at: new Date().toISOString(),
217
+ };
218
+ const parts = [];
219
+ parts.push(`# ${decision.summary}`);
220
+ parts.push("");
221
+ if (decision.reasoning) {
222
+ parts.push("## Reasoning");
223
+ parts.push("");
224
+ parts.push(decision.reasoning);
225
+ parts.push("");
226
+ }
227
+ if (decision.alternatives && decision.alternatives.length > 0) {
228
+ parts.push("## Alternatives");
229
+ parts.push("");
230
+ for (const alt of decision.alternatives) {
231
+ parts.push(`- ${alt}`);
232
+ }
233
+ parts.push("");
234
+ }
235
+ const content = `---
236
+ ${yamlStringify(frontmatter).trimEnd()}
237
+ ---
238
+
239
+ ${parts.join("\n")}`;
240
+ // Write page
241
+ const page = await this.stores.pages.putPage(slug, content, {
242
+ halflife_days: HALFLIFE_DAYS.decision,
243
+ });
244
+ // Notify callback
245
+ this.notifyPageWritten(page);
246
+ // Rechunk
247
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
248
+ // Add tags
249
+ await this.stores.tags.addTag(slug, "decision");
250
+ // Create links to entities
251
+ for (const entitySlug of decision.entities) {
252
+ await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in decision", decision.source, sourceHash);
253
+ }
254
+ for (const entitySlug of decision.entities) {
255
+ try {
256
+ await this.stores.timeline.addEntry(entitySlug, {
257
+ date: decision.date,
258
+ summary: `Decision: ${decision.summary}`,
259
+ detail: decision.reasoning ?? "",
260
+ source: decision.source.platform,
261
+ provenance: decision.source,
262
+ });
263
+ }
264
+ catch {
265
+ // Entity page might not exist yet, skip
266
+ }
267
+ }
268
+ result.written += 1;
269
+ }
270
+ catch (error) {
271
+ result.errors.push({
272
+ signal: `decision:${decision.summary}`,
273
+ reason: error instanceof Error ? error.message : String(error),
274
+ });
275
+ }
276
+ return result;
277
+ }
278
+ async writeTask(task) {
279
+ const result = { written: 0, skipped: 0, errors: [] };
280
+ try {
281
+ const slug = `tasks/${this.kebabCase(task.title)}`;
282
+ const sourceHash = task.source.raw_hash;
283
+ // Check for duplicate
284
+ const existingPage = await this.stores.pages.getPage(slug);
285
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
286
+ result.skipped += 1;
287
+ return result;
288
+ }
289
+ // H4: respect user edits made via Obsidian sync
290
+ if (existingPage?.frontmatter.user_edited === true) {
291
+ result.skipped += 1;
292
+ return result;
293
+ }
294
+ // Build markdown with frontmatter
295
+ const frontmatter = {
296
+ title: task.title,
297
+ type: "task",
298
+ status: task.status,
299
+ confidence: task.confidence,
300
+ source_hash: sourceHash,
301
+ source: task.source,
302
+ created_at: new Date().toISOString(),
303
+ };
304
+ if (task.owner)
305
+ frontmatter.owner = task.owner;
306
+ if (task.project)
307
+ frontmatter.project = task.project;
308
+ if (task.due_date)
309
+ frontmatter.due_date = task.due_date;
310
+ const content = `---
311
+ ${yamlStringify(frontmatter).trimEnd()}
312
+ ---
313
+
314
+ # ${task.title}
315
+ `;
316
+ // Write page
317
+ const page = await this.stores.pages.putPage(slug, content, {
318
+ halflife_days: HALFLIFE_DAYS.task,
319
+ expires_at: task.status === "done" ? new Date() : undefined,
320
+ });
321
+ // Notify callback
322
+ this.notifyPageWritten(page);
323
+ // Rechunk
324
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
325
+ // Add tags
326
+ await this.stores.tags.addTag(slug, "task");
327
+ result.written += 1;
328
+ }
329
+ catch (error) {
330
+ result.errors.push({
331
+ signal: `task:${task.title}`,
332
+ reason: error instanceof Error ? error.message : String(error),
333
+ });
334
+ }
335
+ return result;
336
+ }
337
+ async writeDiscovery(discovery) {
338
+ const result = { written: 0, skipped: 0, errors: [] };
339
+ try {
340
+ const slug = `discoveries/${this.kebabCase(discovery.summary)}`;
341
+ const sourceHash = discovery.source.raw_hash;
342
+ // Check for duplicate
343
+ const existingPage = await this.stores.pages.getPage(slug);
344
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
345
+ result.skipped += 1;
346
+ return result;
347
+ }
348
+ // H4: respect user edits made via Obsidian sync
349
+ if (existingPage?.frontmatter.user_edited === true) {
350
+ result.skipped += 1;
351
+ return result;
352
+ }
353
+ // Build markdown with frontmatter
354
+ const frontmatter = {
355
+ title: discovery.summary,
356
+ type: `discovery-${discovery.type}`,
357
+ entities: discovery.entities,
358
+ confidence: discovery.confidence,
359
+ source_hash: sourceHash,
360
+ source: discovery.source,
361
+ created_at: new Date().toISOString(),
362
+ };
363
+ const parts = [];
364
+ parts.push(`# ${discovery.summary}`);
365
+ parts.push("");
366
+ if (discovery.detail) {
367
+ parts.push("## Detail");
368
+ parts.push("");
369
+ parts.push(discovery.detail);
370
+ parts.push("");
371
+ }
372
+ const content = `---
373
+ ${yamlStringify(frontmatter).trimEnd()}
374
+ ---
375
+
376
+ ${parts.join("\n")}`;
377
+ // Write page
378
+ const page = await this.stores.pages.putPage(slug, content, {
379
+ halflife_days: HALFLIFE_DAYS.discovery,
380
+ });
381
+ // Notify callback
382
+ this.notifyPageWritten(page);
383
+ // Rechunk
384
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
385
+ // Add tags
386
+ await this.stores.tags.addTag(slug, "discovery");
387
+ await this.stores.tags.addTag(slug, discovery.type);
388
+ // Create links to entities
389
+ for (const entitySlug of discovery.entities) {
390
+ await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in discovery", discovery.source, sourceHash);
391
+ }
392
+ result.written += 1;
393
+ }
394
+ catch (error) {
395
+ result.errors.push({
396
+ signal: `discovery:${discovery.summary}`,
397
+ reason: error instanceof Error ? error.message : String(error),
398
+ });
399
+ }
400
+ return result;
401
+ }
402
+ async writePreference(preference) {
403
+ const result = { written: 0, skipped: 0, errors: [] };
404
+ try {
405
+ const slug = `preferences/${this.kebabCase(preference.summary)}`;
406
+ const sourceHash = preference.source.raw_hash;
407
+ const existingPage = await this.stores.pages.getPage(slug);
408
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
409
+ result.skipped += 1;
410
+ return result;
411
+ }
412
+ const frontmatter = {
413
+ title: preference.summary,
414
+ type: "preference",
415
+ category: preference.category,
416
+ entities: preference.entities,
417
+ confidence: preference.confidence,
418
+ source_hash: sourceHash,
419
+ source: preference.source,
420
+ created_at: new Date().toISOString(),
421
+ };
422
+ const parts = [`# ${preference.summary}`, ""];
423
+ if (preference.detail) {
424
+ parts.push("## Detail", "", preference.detail, "");
425
+ }
426
+ const content = `---
427
+ ${yamlStringify(frontmatter).trimEnd()}
428
+ ---
429
+
430
+ ${parts.join("\n")}`;
431
+ const page = await this.stores.pages.putPage(slug, content, {
432
+ halflife_days: HALFLIFE_DAYS.preference,
433
+ });
434
+ this.notifyPageWritten(page);
435
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
436
+ await this.stores.tags.addTag(slug, "preference");
437
+ await this.stores.tags.addTag(slug, preference.category);
438
+ for (const entitySlug of preference.entities) {
439
+ await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in preference", preference.source, sourceHash);
440
+ }
441
+ result.written += 1;
442
+ }
443
+ catch (error) {
444
+ result.errors.push({
445
+ signal: `preference:${preference.summary}`,
446
+ reason: error instanceof Error ? error.message : String(error),
447
+ });
448
+ }
449
+ return result;
450
+ }
451
+ async writeReference(reference) {
452
+ const result = { written: 0, skipped: 0, errors: [] };
453
+ try {
454
+ const slug = `references/${this.kebabCase(reference.title)}`;
455
+ const sourceHash = reference.source.raw_hash;
456
+ const existingPage = await this.stores.pages.getPage(slug);
457
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
458
+ result.skipped += 1;
459
+ return result;
460
+ }
461
+ const frontmatter = {
462
+ title: reference.title,
463
+ type: "reference",
464
+ url: reference.url,
465
+ entities: reference.entities,
466
+ confidence: reference.confidence,
467
+ source_hash: sourceHash,
468
+ source: reference.source,
469
+ created_at: new Date().toISOString(),
470
+ };
471
+ if (reference.trigger)
472
+ frontmatter.trigger = reference.trigger;
473
+ const parts = [
474
+ `# ${reference.title}`,
475
+ "",
476
+ `URL: ${reference.url}`,
477
+ "",
478
+ "## Summary",
479
+ "",
480
+ reference.summary,
481
+ "",
482
+ ];
483
+ const content = `---
484
+ ${yamlStringify(frontmatter).trimEnd()}
485
+ ---
486
+
487
+ ${parts.join("\n")}`;
488
+ const page = await this.stores.pages.putPage(slug, content, {
489
+ halflife_days: HALFLIFE_DAYS.reference,
490
+ });
491
+ this.notifyPageWritten(page);
492
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
493
+ await this.stores.tags.addTag(slug, "reference");
494
+ for (const entitySlug of reference.entities) {
495
+ await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in reference", reference.source, sourceHash);
496
+ }
497
+ result.written += 1;
498
+ }
499
+ catch (error) {
500
+ result.errors.push({
501
+ signal: `reference:${reference.title}`,
502
+ reason: error instanceof Error ? error.message : String(error),
503
+ });
504
+ }
505
+ return result;
506
+ }
507
+ async writeKnowledge(knowledge) {
508
+ const result = { written: 0, skipped: 0, errors: [] };
509
+ try {
510
+ // Skip speculative knowledge
511
+ if (knowledge.confidence === "speculative") {
512
+ result.skipped += 1;
513
+ return result;
514
+ }
515
+ // Build slug: knowledge/{topic}/{content-hash-12}
516
+ const contentHash = this.contentHash(knowledge.content);
517
+ const contentHash12 = contentHash.slice(0, 12);
518
+ const slug = `knowledge/${knowledge.topic}/${contentHash12}`;
519
+ const sourceHash = knowledge.source.raw_hash;
520
+ // Check for duplicate
521
+ const existingPage = await this.stores.pages.getPage(slug);
522
+ if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
523
+ result.skipped += 1;
524
+ return result;
525
+ }
526
+ // H4: respect user edits made via Obsidian sync
527
+ if (existingPage?.frontmatter.user_edited === true) {
528
+ result.skipped += 1;
529
+ return result;
530
+ }
531
+ // Build markdown with frontmatter
532
+ const frontmatter = {
533
+ title: knowledge.content.slice(0, 80),
534
+ type: "knowledge",
535
+ topic: knowledge.topic,
536
+ source_type: knowledge.source_type,
537
+ confidence: knowledge.confidence,
538
+ source_hash: sourceHash,
539
+ source: knowledge.source,
540
+ created_at: new Date().toISOString(),
541
+ };
542
+ if (knowledge.valid_at)
543
+ frontmatter.valid_at = knowledge.valid_at;
544
+ if (knowledge.invalid_at)
545
+ frontmatter.invalid_at = knowledge.invalid_at;
546
+ const parts = [];
547
+ parts.push(`# ${knowledge.content}`);
548
+ parts.push("");
549
+ parts.push("## Related Entities");
550
+ parts.push("");
551
+ if (knowledge.related_entities.length > 0) {
552
+ for (const entity of knowledge.related_entities) {
553
+ parts.push(`- ${entity}`);
554
+ }
555
+ }
556
+ else {
557
+ parts.push("- (none)");
558
+ }
559
+ parts.push("");
560
+ const content = `---
561
+ ${yamlStringify(frontmatter).trimEnd()}
562
+ ---
563
+
564
+ ${parts.join("\n")}`;
565
+ // Write page
566
+ const page = await this.stores.pages.putPage(slug, content, {
567
+ halflife_days: HALFLIFE_DAYS.knowledge,
568
+ });
569
+ // Notify callback
570
+ this.notifyPageWritten(page);
571
+ // Rechunk
572
+ await this.stores.chunks.rechunk(page.id, page.compiled_truth);
573
+ // Add tags
574
+ await this.stores.tags.addTag(slug, "knowledge");
575
+ await this.stores.tags.addTag(slug, knowledge.topic);
576
+ // Create links to related entities
577
+ for (const entitySlug of knowledge.related_entities) {
578
+ await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in knowledge", knowledge.source, sourceHash);
579
+ }
580
+ result.written += 1;
581
+ }
582
+ catch (error) {
583
+ result.errors.push({
584
+ signal: `knowledge:${knowledge.topic}/${knowledge.content.slice(0, 30)}`,
585
+ reason: error instanceof Error ? error.message : String(error),
586
+ });
587
+ }
588
+ return result;
589
+ }
590
+ async appendTimelineEntry(entry) {
591
+ const result = { written: 0, skipped: 0, errors: [] };
592
+ // Add timeline entry to all related entity pages
593
+ for (const entitySlug of entry.entities) {
594
+ try {
595
+ await this.stores.timeline.addEntry(entitySlug, {
596
+ date: entry.date,
597
+ summary: entry.summary,
598
+ source: entry.source.platform,
599
+ provenance: entry.source,
600
+ });
601
+ result.written += 1;
602
+ }
603
+ catch (error) {
604
+ // Entity page might not exist yet, skip
605
+ result.errors.push({
606
+ signal: `timeline:${entitySlug}`,
607
+ reason: error instanceof Error ? error.message : String(error),
608
+ });
609
+ }
610
+ }
611
+ return result;
612
+ }
613
+ async appendLink(link) {
614
+ const result = { written: 0, skipped: 0, errors: [] };
615
+ try {
616
+ await this.stores.graph.addLink(link.from, link.to, link.type, link.context, link.source, link.source.raw_hash);
617
+ result.written += 1;
618
+ }
619
+ catch (error) {
620
+ result.errors.push({
621
+ signal: `link:${link.from}-${link.to}`,
622
+ reason: error instanceof Error ? error.message : String(error),
623
+ });
624
+ }
625
+ return result;
626
+ }
627
+ kebabCase(str) {
628
+ const ascii = str
629
+ .toLowerCase()
630
+ .replace(/[^a-z0-9]+/g, "-")
631
+ .replace(/^-+|-+$/g, "");
632
+ if (ascii.length >= 3)
633
+ return ascii;
634
+ const hash = createHash("sha256").update(str).digest("hex").slice(0, 12);
635
+ return ascii ? `${ascii}-${hash}` : hash;
636
+ }
637
+ contentHash(content) {
638
+ return createHash("sha256").update(content).digest("hex");
639
+ }
640
+ }
641
+ //# sourceMappingURL=store.js.map