@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,539 @@
1
+ /**
2
+ * Obsidian vault bidirectional sync.
3
+ *
4
+ * Implements `memoark export --vault <path>` and `memoark import --vault <path>`.
5
+ * See spec: docs/specs/memoark-2026-06-04-obsidian-sync.md (v7).
6
+ */
7
+ import { createHash } from "node:crypto";
8
+ import { access, lstat, mkdir, open, readdir, readFile, rename, unlink, writeFile, } from "node:fs/promises";
9
+ import { dirname, join, relative, resolve, sep } from "node:path";
10
+ import { parse as yamlParse, stringify as yamlStringify } from "yaml";
11
+ // ============================================================================
12
+ // Constants
13
+ // ============================================================================
14
+ const RELATED_MARKER = "<!-- memoark:related -->";
15
+ const TIMELINE_MARKER = "<!-- memoark:timeline -->";
16
+ /** Unicode-safe slug regex (H3). */
17
+ const SLUG_REGEX = /^[\p{L}\p{N}_-]+(\/[\p{L}\p{N}_-]+)*$/u;
18
+ /** Windows reserved names (L6) — rejected on all platforms for portability. */
19
+ const WINDOWS_RESERVED = new Set([
20
+ "con",
21
+ "prn",
22
+ "aux",
23
+ "nul",
24
+ "com1",
25
+ "com2",
26
+ "com3",
27
+ "com4",
28
+ "com5",
29
+ "com6",
30
+ "com7",
31
+ "com8",
32
+ "com9",
33
+ "lpt1",
34
+ "lpt2",
35
+ "lpt3",
36
+ "lpt4",
37
+ "lpt5",
38
+ "lpt6",
39
+ "lpt7",
40
+ "lpt8",
41
+ "lpt9",
42
+ ]);
43
+ const MAX_SLUG_LENGTH = 200;
44
+ /** Wikilink pattern: matches [[slug]] or [[slug|display]] with Unicode support. */
45
+ const WIKILINK_REGEX = /\[\[([^\]|]+?)(?:\|[^\]]+?)?\]\]/gu;
46
+ // ============================================================================
47
+ // Section 1: serializePage (Spec §4.4)
48
+ // ============================================================================
49
+ /**
50
+ * Serialize a Page into Obsidian-compatible markdown.
51
+ *
52
+ * Fixes applied:
53
+ * H1: explicit fields written AFTER `...page.frontmatter` so they cannot be
54
+ * clobbered by user-supplied frontmatter that happens to share a key.
55
+ * M1: `updated_at` is NOT written to frontmatter — it would change every export
56
+ * even when content is identical, defeating incremental sync.
57
+ * N3: rebuild `## Aliases` body section from `frontmatter.aliases` each time
58
+ * (frontmatter is the single source of truth; the body section is derived).
59
+ */
60
+ export function serializePage(page, tags, links, timeline, userEdited) {
61
+ const fm = {
62
+ // 1. spread page.frontmatter FIRST (low precedence — H1)
63
+ ...page.frontmatter,
64
+ // 2. explicit fields LAST (high precedence — H1)
65
+ title: page.title,
66
+ type: page.type,
67
+ slug: page.slug,
68
+ tags,
69
+ links: links.map((l) => ({ target: l.to_slug, type: l.link_type })),
70
+ content_hash: page.content_hash,
71
+ user_edited: userEdited,
72
+ // NOTE: updated_at intentionally omitted (M1)
73
+ };
74
+ // N3: rebuild Aliases section from frontmatter, not from body
75
+ const aliases = page.frontmatter.aliases ?? [];
76
+ const compiledWithoutAliases = stripAliasesSection(page.compiled_truth);
77
+ const bodyParts = [];
78
+ if (aliases.length > 0) {
79
+ bodyParts.push("## Aliases", "");
80
+ for (const alias of aliases) {
81
+ bodyParts.push(`- ${alias}`);
82
+ }
83
+ bodyParts.push("");
84
+ }
85
+ bodyParts.push(compiledWithoutAliases.trim());
86
+ if (links.length > 0) {
87
+ bodyParts.push("", "<!-- memoark:related -->", "");
88
+ for (const link of links) {
89
+ bodyParts.push(`- [[${link.to_slug}]]`);
90
+ }
91
+ }
92
+ if (timeline.length > 0) {
93
+ bodyParts.push("", "<!-- memoark:timeline -->", "");
94
+ bodyParts.push("> ⚠️ Timeline 为只读派生数据,编辑此处不会同步回 DB", "");
95
+ for (const entry of timeline) {
96
+ bodyParts.push(`- **${entry.date}**: ${entry.summary}`);
97
+ }
98
+ }
99
+ const body = bodyParts.join("\n");
100
+ const fmYaml = yamlStringify(fm).trimEnd();
101
+ return `---\n${fmYaml}\n---\n\n${body}\n`;
102
+ }
103
+ /**
104
+ * Strip `## Aliases\n\n- ...` section if it appears at the start of body.
105
+ *
106
+ * Only matches at body start so that mid-body Aliases-like headings stay intact.
107
+ */
108
+ export function stripAliasesSection(body) {
109
+ const pattern = /^##\s+Aliases\s*\n+(?:- .+\n?)+\n*/;
110
+ return body.replace(pattern, "").trimStart();
111
+ }
112
+ /**
113
+ * Split body into three sections by HTML comment markers.
114
+ *
115
+ * Fixes:
116
+ * M3: detect marker order reversal (timeline before related) and signal error.
117
+ */
118
+ export function splitBody(body) {
119
+ const rIdx = body.indexOf(RELATED_MARKER);
120
+ const tIdx = body.indexOf(TIMELINE_MARKER);
121
+ // M3: timeline marker must come after related marker if both exist
122
+ if (rIdx >= 0 && tIdx >= 0 && tIdx < rIdx) {
123
+ return { mainBody: "", related: "", timeline: "", orderError: true };
124
+ }
125
+ let main = body;
126
+ let related = "";
127
+ let timeline = "";
128
+ // Split timeline first (later marker), then related
129
+ if (tIdx >= 0) {
130
+ timeline = main.slice(tIdx + TIMELINE_MARKER.length).trim();
131
+ main = main.slice(0, tIdx);
132
+ }
133
+ if (rIdx >= 0) {
134
+ related = main.slice(rIdx + RELATED_MARKER.length).trim();
135
+ main = main.slice(0, rIdx);
136
+ }
137
+ return { mainBody: main.trim(), related, timeline, orderError: false };
138
+ }
139
+ /** Validate slug: Unicode-safe + Windows reserved + length (H3 + L6). */
140
+ export function isValidSlug(slug) {
141
+ if (!slug || slug.length === 0)
142
+ return false;
143
+ if (slug.length > MAX_SLUG_LENGTH)
144
+ return false;
145
+ if (!SLUG_REGEX.test(slug))
146
+ return false;
147
+ for (const segment of slug.split("/")) {
148
+ if (WINDOWS_RESERVED.has(segment.toLowerCase()))
149
+ return false;
150
+ }
151
+ return true;
152
+ }
153
+ /** Convert a file path (relative to vault root) to slug. */
154
+ export function slugifyPath(relativePath) {
155
+ return relativePath.replace(/^\.\//, "").replace(/^\//, "").replace(/\.md$/i, "");
156
+ }
157
+ /** Extract all wikilink targets from text, stripping display suffix. */
158
+ export function extractWikilinks(text) {
159
+ const results = [];
160
+ const re = new RegExp(WIKILINK_REGEX.source, WIKILINK_REGEX.flags);
161
+ for (const match of text.matchAll(re)) {
162
+ results.push(match[1].trim());
163
+ }
164
+ return results;
165
+ }
166
+ function parseFrontmatterAndBody(content) {
167
+ const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
168
+ if (!match) {
169
+ return { fm: {}, body: content };
170
+ }
171
+ const fm = (yamlParse(match[1]) ?? {});
172
+ return { fm, body: match[2] };
173
+ }
174
+ /**
175
+ * Parse a vault markdown file into the pieces needed for putPage / addTag / addLink.
176
+ *
177
+ * Fixes:
178
+ * H2-incomplete: filter links by type — only obsidian and bare strings are
179
+ * taken as user-editable; pipeline-managed types (works_on,
180
+ * collaborates, etc.) are ignored here so they cannot be
181
+ * duplicated as obsidian-type edges on round-trip.
182
+ * H4: inject user_edited=true into cleanMarkdown so putPage persists the lock.
183
+ * M3: throw if body marker order is reversed.
184
+ * M7: timeline section is NOT parsed (export-only).
185
+ * L4: body `## Aliases` section is not interpreted — only frontmatter is.
186
+ */
187
+ export function parseVaultFile(content, relativePath) {
188
+ const { fm, body } = parseFrontmatterAndBody(content);
189
+ const slugRaw = fm.slug ?? slugifyPath(relativePath);
190
+ if (!isValidSlug(slugRaw)) {
191
+ throw new Error(`invalid slug: ${slugRaw}`);
192
+ }
193
+ const slug = slugRaw;
194
+ const split = splitBody(body);
195
+ if (split.orderError) {
196
+ throw new Error("marker order incorrect: timeline appears before related");
197
+ }
198
+ // H2-incomplete: filter frontmatter links to obsidian-type only
199
+ const rawFmLinks = Array.isArray(fm.links) ? fm.links : [];
200
+ const fmLinks = [];
201
+ for (const item of rawFmLinks) {
202
+ if (typeof item === "string") {
203
+ fmLinks.push(item);
204
+ }
205
+ else if (item && typeof item === "object") {
206
+ const obj = item;
207
+ if (typeof obj.target === "string") {
208
+ const type = obj.type;
209
+ if (type === undefined || type === null || type === "obsidian") {
210
+ fmLinks.push(obj.target);
211
+ }
212
+ }
213
+ }
214
+ }
215
+ // Wikilinks from main body (always treated as obsidian)
216
+ const bodyLinks = extractWikilinks(split.mainBody);
217
+ const links = Array.from(new Set([...fmLinks, ...bodyLinks]));
218
+ const tags = Array.isArray(fm.tags) ? fm.tags : [];
219
+ // Build clean frontmatter for putPage (strip sync-layer metadata)
220
+ const cleanFm = { ...fm };
221
+ delete cleanFm.slug;
222
+ delete cleanFm.tags;
223
+ delete cleanFm.links;
224
+ delete cleanFm.content_hash;
225
+ delete cleanFm.user_edited;
226
+ // H4: stamp user_edited=true
227
+ cleanFm.user_edited = true;
228
+ const cleanFmYaml = yamlStringify(cleanFm).trimEnd();
229
+ // M7: drop timeline section from main body; keep mainBody only
230
+ const cleanMarkdown = `---\n${cleanFmYaml}\n---\n\n${split.mainBody}\n`;
231
+ return { slug, cleanMarkdown, tags, links };
232
+ }
233
+ // ============================================================================
234
+ // Section 3: Manifest I/O (Spec §4.7 + §7.8)
235
+ // ============================================================================
236
+ const MANIFEST_FILENAME = ".memoark-sync.json";
237
+ const MANIFEST_VERSION = 2;
238
+ /** Load the sync manifest from a vault. Returns null if missing or invalid. */
239
+ export async function loadManifest(vaultPath) {
240
+ const path = join(vaultPath, MANIFEST_FILENAME);
241
+ try {
242
+ const raw = await readFile(path, "utf-8");
243
+ const parsed = JSON.parse(raw);
244
+ if (parsed.version !== MANIFEST_VERSION)
245
+ return null;
246
+ if (!parsed.pages || typeof parsed.pages !== "object")
247
+ return null;
248
+ return parsed;
249
+ }
250
+ catch {
251
+ // Missing, unreadable, or malformed — treat as no manifest
252
+ return null;
253
+ }
254
+ }
255
+ /**
256
+ * Atomically write the sync manifest (M8 + N2).
257
+ *
258
+ * Procedure:
259
+ * 1. open(tmpPath, "w") → write JSON → handle.sync() → handle.close()
260
+ * 2. rename(tmpPath, targetPath) — POSIX atomic
261
+ * 3. On error: close handle if open, unlink tmp
262
+ *
263
+ * Note: Node `fs.fsync()` takes a file descriptor, not a path. We use
264
+ * `FileHandle.sync()` which is the FileHandle API's wrapper around fsync(fd).
265
+ */
266
+ export async function saveManifest(vaultPath, manifest) {
267
+ const targetPath = join(vaultPath, MANIFEST_FILENAME);
268
+ const tmpPath = `${targetPath}.tmp`;
269
+ let handle = null;
270
+ try {
271
+ handle = await open(tmpPath, "w");
272
+ await handle.writeFile(JSON.stringify(manifest, null, 2), "utf-8");
273
+ await handle.sync();
274
+ await handle.close();
275
+ handle = null;
276
+ await rename(tmpPath, targetPath);
277
+ }
278
+ catch (e) {
279
+ if (handle)
280
+ await handle.close().catch(() => { });
281
+ await unlink(tmpPath).catch(() => { });
282
+ throw e;
283
+ }
284
+ }
285
+ function sha256(content) {
286
+ return createHash("sha256").update(content).digest("hex");
287
+ }
288
+ function nowIso() {
289
+ return new Date().toISOString();
290
+ }
291
+ // ============================================================================
292
+ // Section 5: exportToVault (Spec §5)
293
+ // ============================================================================
294
+ export async function exportToVault(stores, vaultPath, opts = {}) {
295
+ const result = { written: 0, skipped: 0, errors: [] };
296
+ // 1. Ensure vault directory exists
297
+ await mkdir(vaultPath, { recursive: true });
298
+ // 2. Load old manifest
299
+ const oldManifest = await loadManifest(vaultPath);
300
+ // 3. List all pages
301
+ const pages = await stores.pages.listPages({ limit: 100000 });
302
+ // 4. M6: batch pre-query tags / links / timeline
303
+ const [tagsBySlug, linksBySlug, timelineBySlug] = await Promise.all([
304
+ stores.tags.getAllTagsGrouped(),
305
+ stores.graph.getAllLinksGrouped(),
306
+ stores.timeline.getAllTimelineGrouped(),
307
+ ]);
308
+ // 5. Build new manifest as we go
309
+ const newManifest = {
310
+ version: 2,
311
+ last_sync_at: nowIso(),
312
+ last_sync_op: "export",
313
+ pages: {},
314
+ };
315
+ // 6. Per-page serialization
316
+ for (const page of pages) {
317
+ try {
318
+ const tags = tagsBySlug.get(page.slug) ?? [];
319
+ const links = linksBySlug.get(page.slug) ?? [];
320
+ const timeline = timelineBySlug.get(page.slug) ?? [];
321
+ const userEdited = oldManifest?.pages[page.slug]?.user_edited ?? false;
322
+ const content = serializePage(page, tags, links, timeline, userEdited);
323
+ const fileHash = sha256(content);
324
+ const previousFileHash = oldManifest?.pages[page.slug]?.file_hash;
325
+ const unchanged = !opts.force && previousFileHash === fileHash;
326
+ if (!unchanged && !opts.dryRun) {
327
+ const filePath = join(vaultPath, `${page.slug}.md`);
328
+ await mkdir(dirname(filePath), { recursive: true });
329
+ await writeFile(filePath, content, "utf-8");
330
+ }
331
+ newManifest.pages[page.slug] = {
332
+ file_hash: fileHash,
333
+ db_content_hash_at_last_sync: page.content_hash,
334
+ last_synced_at: newManifest.last_sync_at,
335
+ last_synced_op: "export",
336
+ user_edited: userEdited,
337
+ };
338
+ if (unchanged) {
339
+ result.skipped += 1;
340
+ }
341
+ else {
342
+ result.written += 1;
343
+ }
344
+ }
345
+ catch (e) {
346
+ result.errors.push({
347
+ slug: page.slug,
348
+ reason: e instanceof Error ? e.message : String(e),
349
+ });
350
+ }
351
+ }
352
+ // 7. Persist manifest
353
+ if (!opts.dryRun) {
354
+ await saveManifest(vaultPath, newManifest);
355
+ }
356
+ return result;
357
+ }
358
+ // ============================================================================
359
+ // Section 6: importFromVault (Spec §6)
360
+ // ============================================================================
361
+ /**
362
+ * Recursively scan markdown files in vault. Defensive against symlinks (L8).
363
+ */
364
+ async function scanMarkdownFiles(dir, vaultRoot, results = []) {
365
+ const entries = await readdir(dir, { withFileTypes: true });
366
+ for (const entry of entries) {
367
+ const fullPath = join(dir, entry.name);
368
+ // L8: refuse to follow symlinks
369
+ const stat = await lstat(fullPath);
370
+ if (stat.isSymbolicLink())
371
+ continue;
372
+ // Defensive: stay within vault boundary
373
+ const resolved = resolve(fullPath);
374
+ if (!resolved.startsWith(resolve(vaultRoot) + sep) && resolved !== resolve(vaultRoot)) {
375
+ continue;
376
+ }
377
+ if (entry.isDirectory()) {
378
+ if (entry.name.startsWith("."))
379
+ continue;
380
+ if (entry.name === "node_modules")
381
+ continue;
382
+ await scanMarkdownFiles(fullPath, vaultRoot, results);
383
+ }
384
+ else if (entry.isFile()) {
385
+ if (!entry.name.endsWith(".md"))
386
+ continue;
387
+ results.push(fullPath);
388
+ }
389
+ }
390
+ return results;
391
+ }
392
+ /**
393
+ * Read vault file content, returning null when the file is an iCloud
394
+ * placeholder or empty (L7 + N1).
395
+ */
396
+ async function readVaultFile(filePath) {
397
+ // L7: check for iCloud placeholder sibling .filename.icloud
398
+ const dir = dirname(filePath);
399
+ const base = filePath.slice(dir.length + 1);
400
+ const placeholderPath = join(dir, `.${base}.icloud`);
401
+ try {
402
+ await access(placeholderPath);
403
+ return null;
404
+ }
405
+ catch {
406
+ // No placeholder — proceed
407
+ }
408
+ const content = await readFile(filePath, "utf-8");
409
+ // N1: only flag genuinely empty content (the v4 regex /^[ -]+/ was nonsense)
410
+ if (content.length === 0 || content.trim().length === 0) {
411
+ return null;
412
+ }
413
+ return content;
414
+ }
415
+ export async function importFromVault(stores, vaultPath, opts = {}) {
416
+ const result = {
417
+ imported: 0,
418
+ skipped: 0,
419
+ errors: [],
420
+ warnings: [],
421
+ };
422
+ // 1. Verify vault exists
423
+ await access(vaultPath);
424
+ // 2. Load existing manifest (may be null on first import)
425
+ const manifest = (await loadManifest(vaultPath)) ??
426
+ {
427
+ version: 2,
428
+ last_sync_at: nowIso(),
429
+ last_sync_op: "import",
430
+ pages: {},
431
+ };
432
+ // 3. Scan vault for markdown files
433
+ const files = await scanMarkdownFiles(vaultPath, vaultPath);
434
+ for (const filePath of files) {
435
+ const relPath = relative(vaultPath, filePath);
436
+ try {
437
+ const content = await readVaultFile(filePath);
438
+ if (content === null) {
439
+ result.warnings.push({
440
+ slug: relPath,
441
+ reason: "iCloud placeholder or empty file — skipping",
442
+ });
443
+ result.skipped += 1;
444
+ continue;
445
+ }
446
+ const fileHash = sha256(content);
447
+ // 4. Parse to extract slug (needed for hash comparison)
448
+ const parsed = parseVaultFile(content, relPath);
449
+ const slug = parsed.slug;
450
+ const previousFileHash = manifest.pages[slug]?.file_hash;
451
+ if (!opts.force && previousFileHash === fileHash) {
452
+ result.skipped += 1;
453
+ continue;
454
+ }
455
+ // 5. H5: detect DB-side changes between syncs
456
+ const existingPage = await stores.pages.getPage(slug);
457
+ const recordedDbHash = manifest.pages[slug]?.db_content_hash_at_last_sync;
458
+ if (!opts.force &&
459
+ existingPage &&
460
+ recordedDbHash &&
461
+ existingPage.content_hash !== recordedDbHash) {
462
+ result.warnings.push({
463
+ slug,
464
+ reason: "DB content changed since last sync — your vault edits will overwrite DB changes",
465
+ });
466
+ if (opts.strictConflict) {
467
+ result.skipped += 1;
468
+ continue;
469
+ }
470
+ }
471
+ if (opts.dryRun) {
472
+ result.imported += 1;
473
+ continue;
474
+ }
475
+ // 6. Per-file write sequence (M2 deferred — see Spec §7.9 note)
476
+ //
477
+ // NOTE: We do NOT wrap in pg.transaction() — PGlite's transaction uses
478
+ // a mutex on the single connection, and store methods using `this.pg.query`
479
+ // (instead of tx.query) would deadlock waiting for the mutex to release.
480
+ // Refactoring all store methods to accept tx is out of scope.
481
+ //
482
+ // Atomicity guarantee: NONE. We rely on idempotent upserts:
483
+ // - putPage: INSERT ... ON CONFLICT UPDATE (idempotent)
484
+ // - addTag: INSERT ... ON CONFLICT DO NOTHING (idempotent)
485
+ // - addLink: INSERT ... ON CONFLICT UPDATE (idempotent)
486
+ // - rechunk: DELETE + INSERT (eventual consistency; retry-safe)
487
+ //
488
+ // If the process crashes mid-write, the next `memoark import` run will
489
+ // re-process the file (file_hash will still differ) and reach a
490
+ // consistent state. Worst case: chunks briefly out of date.
491
+ const newPage = await stores.pages.putPage(slug, parsed.cleanMarkdown);
492
+ for (const tag of parsed.tags) {
493
+ await stores.tags.addTag(slug, tag);
494
+ }
495
+ // H2-incomplete: only add obsidian-typed links; do not touch
496
+ // pipeline-typed links (works_on, collaborates, mentions, etc.)
497
+ const existingLinks = await stores.graph.getLinks(slug);
498
+ const existingObsidian = new Set(existingLinks.filter((l) => l.link_type === "obsidian").map((l) => l.to_slug));
499
+ for (const target of parsed.links) {
500
+ if (existingObsidian.has(target))
501
+ continue;
502
+ try {
503
+ await stores.graph.addLink(slug, target, "obsidian", "from obsidian vault");
504
+ }
505
+ catch (linkErr) {
506
+ // Target may not exist — warn, do not fail
507
+ result.warnings.push({
508
+ slug,
509
+ reason: `addLink ${slug} → ${target}: ${linkErr instanceof Error ? linkErr.message : String(linkErr)}`,
510
+ });
511
+ }
512
+ }
513
+ // M7: NOT processing timeline (export-only)
514
+ await stores.chunks.rechunk(newPage.id, newPage.compiled_truth);
515
+ manifest.pages[slug] = {
516
+ file_hash: fileHash,
517
+ db_content_hash_at_last_sync: newPage.content_hash,
518
+ last_synced_at: nowIso(),
519
+ last_synced_op: "import",
520
+ user_edited: true,
521
+ };
522
+ result.imported += 1;
523
+ }
524
+ catch (e) {
525
+ result.errors.push({
526
+ file: relPath,
527
+ reason: e instanceof Error ? e.message : String(e),
528
+ });
529
+ }
530
+ }
531
+ // 7. Persist manifest
532
+ if (!opts.dryRun) {
533
+ manifest.last_sync_at = nowIso();
534
+ manifest.last_sync_op = "import";
535
+ await saveManifest(vaultPath, manifest);
536
+ }
537
+ return result;
538
+ }
539
+ //# sourceMappingURL=obsidian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/sync/obsidian.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@andre.li/memoark",
3
+ "version": "0.3.1",
4
+ "description": "Local-first personal memory extraction and storage",
5
+ "type": "module",
6
+ "bin": {
7
+ "memoark": "./bin/memoark.mjs"
8
+ },
9
+ "main": "./dist/cli.js",
10
+ "exports": {
11
+ ".": "./dist/cli.js"
12
+ },
13
+ "files": [
14
+ "dist/",
15
+ "bin/",
16
+ "README.md",
17
+ "README.en.md",
18
+ "LICENSE"
19
+ ],
20
+ "homepage": "https://github.com/AndreLYL/memoark#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/AndreLYL/memoark/issues"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "dev": "bun src/cli.ts",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest --watch",
31
+ "gen:assets": "node scripts/gen-embedded-assets.mjs",
32
+ "build": "node scripts/gen-embedded-assets.mjs && tsc && node scripts/post-build.mjs",
33
+ "compile": "node scripts/gen-embedded-assets.mjs && bun build --compile src/cli.ts --outfile dist-bin/memoark",
34
+ "typecheck": "tsc --noEmit",
35
+ "prepublishOnly": "npm run build",
36
+ "lint": "biome check src/ tests/",
37
+ "lint:fix": "biome check --fix src/ tests/",
38
+ "format": "biome format --write src/ tests/",
39
+ "serve": "bun src/cli.ts serve",
40
+ "web:dev": "cd web && bun run dev",
41
+ "web:build": "cd web && bun run build",
42
+ "web:preview": "cd web && bun run preview"
43
+ },
44
+ "dependencies": {
45
+ "@electric-sql/pglite": "^0.4.6",
46
+ "@modelcontextprotocol/sdk": "^1.29.0",
47
+ "commander": "^11.1.0",
48
+ "hono": "^4.12.23",
49
+ "ink": "^7.0.5",
50
+ "openai": "^6.39.0",
51
+ "react": "^19.2.7",
52
+ "react-devtools-core": "^6.1.5",
53
+ "yaml": "^2.3.4",
54
+ "zod": "^3.22.4"
55
+ },
56
+ "devDependencies": {
57
+ "@biomejs/biome": "^2.4.15",
58
+ "@types/bun": "latest",
59
+ "@types/node": "^25.9.1",
60
+ "@types/react": "^19.2.16",
61
+ "fast-glob": "^3.3.3",
62
+ "typescript": "^6.0.3",
63
+ "vitest": "^1.0.4"
64
+ },
65
+ "keywords": [
66
+ "knowledge-graph",
67
+ "signal-extraction",
68
+ "claude-code",
69
+ "codex",
70
+ "ai-agent",
71
+ "conversation-mining",
72
+ "cli"
73
+ ],
74
+ "author": "AndreLYL",
75
+ "license": "Apache-2.0",
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "https://github.com/AndreLYL/memoark.git"
79
+ },
80
+ "engines": {
81
+ "node": ">=18.0.0",
82
+ "bun": ">=1.0.0"
83
+ }
84
+ }