@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
package/README.md ADDED
@@ -0,0 +1,560 @@
1
+ <p align="center">
2
+ <h1 align="center">Memoark</h1>
3
+ <p align="center"><strong>把你的飞书工作与 AI Agent 会话,沉淀成一份私有、本地的核心记忆,让你的 Agent 真正懂你。</strong></p>
4
+ </p>
5
+
6
+ <p align="center">
7
+ 简体中文 | <a href="README.en.md">English</a>
8
+ </p>
9
+
10
+ <p align="center">
11
+ <a href="LICENSE"><img alt="License: Apache 2.0" src="https://img.shields.io/badge/License-Apache_2.0-blue.svg"></a>
12
+ <img alt="Runtime: Bun" src="https://img.shields.io/badge/runtime-Bun-black">
13
+ <img alt="Language: TypeScript" src="https://img.shields.io/badge/lang-TypeScript-3178c6">
14
+ <img alt="Tests: 800+" src="https://img.shields.io/badge/tests-800%2B-success">
15
+ </p>
16
+
17
+ <p align="center">
18
+ <img src="docs/assets/web-ui-graph.jpeg" alt="Memoark 知识图谱 —— 实体、决策、任务、知识在你的工作中相互连接" width="850">
19
+ <br>
20
+ <em>把你的工作变成一张活的知识图谱 —— 人、决策、任务、知识,全部连起来。</em>
21
+ </p>
22
+
23
+ ---
24
+
25
+ ## 痛点
26
+
27
+ 你的工作记忆有两个家,而你的 AI Agent 一个都够不着。
28
+
29
+ - **飞书**承载你的工作关系网 — 私信、群聊、邮件、会议、任务。这是你*在做什么*、*和谁一起做*。
30
+ - **AI Agent**(Claude Code、Codex、OpenClaw)承载你的构建过程 — 每次编程会话里的决策、发现和踩过的坑。
31
+
32
+ 但每次打开新的 Agent 会话,它都一无所知。你得重新解释你是谁、项目是什么、上周决定了什么、为什么。上下文明明*就在某处* — 埋在你再也不会翻的聊天记录和会话日志里。
33
+
34
+ **你不是记忆力差,你是信息碎片化 — 而你的 Agent 每天都在为此买单。**
35
+
36
+ ## 解决方案
37
+
38
+ Memoark 是一个**本地优先的个人记忆系统**,建立在两条同等重要的输入流之上 —— 你的**飞书工作**和你的 **AI Agent 会话**。它把两者提取成结构化信号(实体、决策、任务、发现、知识、关系),汇入你自己机器上一个统一、可搜索的知识图谱,再通过 **MCP** 把这份记忆喂回给任何 Agent。
39
+
40
+ 结果是:你的 Agent 既**写入**又**读取**同一份记忆 —— 让 Claude Code、Codex 以及任何 MCP 客户端,终于*懂你和你的工作*。
41
+
42
+ ```
43
+ 飞书工作流 AI Agent 会话
44
+ (私信 / 群聊 / 邮件 (Claude Code / Codex
45
+ 会议 / 任务) / OpenClaw)
46
+ │ │
47
+ └───────────────┬───────────────┘
48
+ ▼ 采集 + 抽取(本地)
49
+ ┌──────────────────┐
50
+ │ 你的核心记忆 │ 实体 · 决策 · 任务
51
+ │ (PGLite, 本地) │ 知识 · 时间线 · 图谱
52
+ └────────┬─────────┘
53
+ ▼ MCP
54
+ 你的 Agent 懂你
55
+
56
+ └──── Agent 用得越多,记忆越懂你 ───┘
57
+ ```
58
+
59
+ > "我昨天在飞书和同事讨论了一个方案,今天在 Claude Code 里实现了一部分,下周还有个评审会。"
60
+ >
61
+ > Memoark 自动把这三件事串起来 —— 跨平台、跨时间 —— 并在你需要时把完整脉络交给 Agent。
62
+
63
+ ## 核心特性
64
+
65
+ **🛰️ 飞书全量采集**
66
+ 你的工作在飞书里。Memoark 覆盖 **7 个源** —— 私信、群聊、邮件、日历、文档、任务、消息搜索 —— 把你的工作关系网变成结构化记忆。
67
+
68
+ **🤖 让 Agent 懂你(MCP)**
69
+ 把 Memoark 作为任何 MCP Agent 的记忆层 —— Claude Code、Cursor、Windsurf。**17 个内置工具**让 Agent 查询你的历史、读取实体页面、写回新知识。Agent 既是记忆的生产者,也是消费者。
70
+
71
+ **🔒 私密 & 本地优先**
72
+ 数据永远不离开你的机器。PGLite 嵌入式数据库,可选 Ollama 本地向量嵌入,无云依赖。
73
+
74
+ **🧠 AI 驱动信号提取**
75
+ LLM 驱动的 Pipeline 从原始对话中提取 7 类结构化信号:实体、时间线、决策、任务、发现、知识、关系。
76
+
77
+ **🔍 混合语义搜索**
78
+ 全文搜索(tsvector)+ 向量检索(pgvector),通过 RRF(Reciprocal Rank Fusion)融合排序。支持自然语言提问。
79
+
80
+ **🕸️ 知识图谱 + Web UI**
81
+ 看见人、项目、决策之间的关联。内置 Web UI 提供 Dashboard、时间线、力导向知识图谱和搜索。
82
+
83
+ **🔌 REST API**
84
+ 基于 Hono 的 HTTP API,暴露所有存储操作。
85
+
86
+ ## 使用场景
87
+
88
+ **几秒钟让 Agent 接手一个项目**
89
+ 打开 Claude Code 会话,问一句 *"memoark 这个项目现在进展如何?"* —— Agent 直接从你的记忆里拉出聚合的决策、待办任务和最近时间线,无需你重新解释。
90
+
91
+ **回忆某人、某件事**
92
+ *"我上周和同事聊了什么?"* —— Memoark 把飞书私信、会议、后续任务串成一个答案。
93
+
94
+ **自动生成的工作日志**
95
+ 像翻日记一样浏览你的时间线 —— 你做了什么决策、交付了什么、跨了哪些平台,全部自动写好。
96
+
97
+ ## 为什么选 Memoark
98
+
99
+ | | Memoark | 纯 RAG / 向量检索 | 笔记工具(Obsidian / Notion) | GBrain | OpenHuman |
100
+ |---|:---:|:---:|:---:|:---:|:---:|
101
+ | 本地优先 & 私密 | ✅ | 视情况 | 视情况 | ✅ | ✅ |
102
+ | 开源 | ✅ | 不一定 | 部分 | 部分 | ✅ |
103
+ | 飞书工作采集(私信/群聊/邮件/会议/任务) | ✅ | ❌ | 手动 | ❌ | ❌ |
104
+ | 把 AI Agent 会话作为数据源 | ✅ | ❌ | ❌ | ✅ | ✅ |
105
+ | Agent 原生:通过 MCP 既读**又**写 | ✅ | ❌ | ❌ | ✅ | 部分 |
106
+ | 实体 + 关系知识图谱 | ✅ | ❌ | 手动 | ✅ | 部分 |
107
+ | 结构化信号提取(不只是分块) | ✅ | ❌ | ❌ | ✅ | ✅ |
108
+ | 精简的 MCP 工具面(17 个,而非 40+) | ✅ | 不适用 | 不适用 | ❌(40+) | 不一定 |
109
+
110
+ > 纯 RAG 只有向量、没有实体和关系,回答缺乏上下文;笔记工具强大但依赖手动维护;GBrain 能力强但偏重、MCP 工具过多。Memoark 保持本地、精简、Agent 原生 —— 并把飞书工作作为一等数据源。
111
+
112
+ ## 快速开始
113
+
114
+ ### 前置条件
115
+
116
+ - [Node.js](https://nodejs.org) >= 18(用 `npx` / `npm` 安装时)
117
+ - (可选)[Ollama](https://ollama.ai) 本地嵌入
118
+
119
+ ### 安装(推荐:npm)
120
+
121
+ ```bash
122
+ # 免安装直接运行
123
+ npx @andre.li/memoark --help
124
+
125
+ # 或全局安装,得到 memoark 命令
126
+ npm install -g @andre.li/memoark
127
+ ```
128
+
129
+ > npm 包名为 `@andre.li/memoark`(作用域包),但命令名仍是 `memoark`。
130
+
131
+ ### 从源码安装(开发)
132
+
133
+ ```bash
134
+ git clone https://github.com/AndreLYL/memoark.git
135
+ cd memoark
136
+ bun install
137
+ npm link # 注册 memoark 全局命令
138
+ ```
139
+
140
+ ### 初始化配置
141
+
142
+ `memoark init` 启动一个**交互式配置中心**(基于 React + ink 的全屏 TUI),让你零手写地生成 / 编辑 `memoark.yaml`:
143
+
144
+ ```bash
145
+ memoark init
146
+ ```
147
+
148
+ **配置中心特性:**
149
+ - 📋 **分区编辑**:Overview、LLM、Embedding、数据源、隐私、分块(Block Builder)等分区
150
+ - ⌨️ **键盘操作**:↑/↓ 或 Tab 切换字段,Enter 编辑,Ctrl+S 保存,q / Esc 退出(有改动会自动保存)
151
+ - 🔌 **实时连接测试**:编辑 LLM / Embedding 时自动校验 API key 与连通性
152
+ - 💡 **智能推荐**:根据本机硬件推荐本地(Ollama)或远程(OpenAI)Embedding
153
+ - 🔒 **密钥脱敏**:API key 始终掩码显示
154
+ - 🧭 **自动检测**:识别已有数据源(Claude Code、Codex、Hermes)并注册 `memoark` 命令
155
+
156
+ **运行模式:**
157
+
158
+ | 命令 / 环境 | 行为 |
159
+ |---|---|
160
+ | `memoark init`(TTY 终端下) | 全屏 TUI 配置中心 |
161
+ | `memoark init --no-tui` | 逐项问答式向导(线性 fallback) |
162
+ | `memoark init --auto` | 全自动,无提示,用检测到的默认值生成 |
163
+ | `memoark init --force` | 覆盖已有配置 |
164
+ | `MEMOARK_NO_TUI=1` | 强制禁用 TUI(非 TTY 环境也会自动 fallback) |
165
+
166
+ > `memoark config init` 与 `memoark init` 等价。飞书等少数高级配置目前需直接编辑 `memoark.yaml`(见下方飞书章节)。
167
+
168
+ ### 检查环境
169
+
170
+ ```bash
171
+ memoark doctor
172
+ ```
173
+
174
+ ### 运行提取
175
+
176
+ ```bash
177
+ # 从 Claude Code 提取
178
+ memoark extract --source claude-code
179
+
180
+ # 从 Codex 提取
181
+ memoark extract --source codex
182
+
183
+ # 从所有启用的数据源提取
184
+ memoark extract --source all
185
+
186
+ # 干跑模式(不调用 LLM,仅扫描数据量)
187
+ memoark extract --source claude-code --dry-run
188
+ ```
189
+
190
+ ### 飞书私聊/群聊提取
191
+
192
+ 飞书消息有两条不同路径:
193
+
194
+ - `sources.feishu.sources.messages` 使用 OpenAPI chat/message 接口,适合明确群聊 `chat_id` 或自动发现到的群聊。
195
+ - `sources.feishu.sources.message_search` 使用 `lark-cli im +messages-search`,适合 user-mode 下搜索最近私聊和群聊。私聊机器人对话通常需要这条路径,否则最近三天会明显少数据。
196
+
197
+ 本地需要先完成 lark-cli 的飞书用户态登录,并在 `memoark.yaml` 打开 `message_search`:
198
+
199
+ ```yaml
200
+ llm:
201
+ provider: openai
202
+ model: gpt-4.1-mini
203
+ api_key: ${TOKENFREE_API_KEY}
204
+
205
+ sources:
206
+ feishu:
207
+ enabled: true
208
+ auth_mode: user
209
+ app_id: ${FEISHU_APP_ID}
210
+ app_secret: ${FEISHU_APP_SECRET}
211
+ sources:
212
+ messages:
213
+ enabled: true
214
+ chat_ids: []
215
+ lookback_days: 3
216
+ message_search:
217
+ enabled: true
218
+ chat_types:
219
+ - p2p
220
+ # - group
221
+ lookback_days: 3
222
+ page_size: 50
223
+ ```
224
+
225
+ 然后运行:
226
+
227
+ ```bash
228
+ bun src/cli.ts extract --source feishu --adapter store --since 3d
229
+ ```
230
+
231
+ `--dry-run` 只验证采集数量,不写数据库、不提交 cursor:
232
+
233
+ ```bash
234
+ bun src/cli.ts extract --source feishu --adapter store --since 3d --dry-run
235
+ ```
236
+
237
+ ### 增量状态与重建
238
+
239
+ Memoark 的增量状态分两层:
240
+
241
+ - 数据库:默认在 `~/.memoark/data`,保存提取后的页面、chunk、关系和时间线。
242
+ - 运行状态:当前仓库的 `.memoark/cursors.yaml` 和 `.memoark/dedup.jsonl`,分别保存源 cursor 和消息去重 hash。
243
+
244
+ 正常增量运行不要手动删这些文件。需要删除某个源的过期提取结果并重跑时,用内置命令,它会先备份数据库和 `.memoark`:
245
+
246
+ ```bash
247
+ # 先预览会删除多少内容
248
+ bun src/cli.ts store purge-source feishu
249
+
250
+ # 确认后清理飞书结果、飞书 cursor,并重置旧格式 dedup
251
+ bun src/cli.ts store purge-source feishu --yes
252
+
253
+ # 再跑最近三天
254
+ bun src/cli.ts extract --source feishu --adapter store --since 3d
255
+ ```
256
+
257
+ 旧版 `dedup.jsonl` 只记录 hash,没有记录来源平台,所以彻底重跑飞书时默认会备份后清空整个 dedup。后续增量会重新建立去重状态。
258
+
259
+ ### 搜索记忆
260
+
261
+ ```bash
262
+ # 混合搜索(全文 + 向量)
263
+ memoark search "认证中间件决策"
264
+
265
+ # 仅全文搜索
266
+ memoark search "JWT token" --mode fts
267
+ ```
268
+
269
+ ### 启动服务器
270
+
271
+ ```bash
272
+ # HTTP API(默认端口 3927)
273
+ memoark serve
274
+
275
+ # MCP stdio(AI Agent 集成 — Claude Code、Cursor 等)
276
+ memoark serve --mcp
277
+ ```
278
+
279
+ ### 接入你的 Agent(MCP)
280
+
281
+ 让任何 MCP 客户端指向 Memoark,即可读写你的记忆。以 Claude Code 为例:
282
+
283
+ ```json
284
+ {
285
+ "mcpServers": {
286
+ "memoark": {
287
+ "command": "memoark",
288
+ "args": ["serve", "--mcp"]
289
+ }
290
+ }
291
+ }
292
+ ```
293
+
294
+ 然后就可以让 Agent *"在我的记忆里搜一下 auth 重构的决策"* 或 *"项目 X 还有哪些未完成任务?"* —— 它会从你的本地记忆作答。
295
+
296
+ ### 浏览 Web UI
297
+
298
+ ```bash
299
+ cd web
300
+ bun install
301
+ bun run dev # Dashboard、时间线、知识图谱、搜索
302
+ ```
303
+
304
+ ## 架构
305
+
306
+ ```
307
+ ┌─────────────────────────────────────────────────────────────────┐
308
+ │ 数据源 │
309
+ │ Claude Code │ Codex │ Hermes │ 飞书 │ 微信 │
310
+ └───────┬───────┴────┬────┴────┬─────┴────┬───┴────┬──────────────┘
311
+ └────────────┴────────┴──────────┴────────┘
312
+
313
+ ┌─────────▼──────────┐
314
+ │ 信号提取 Pipeline │
315
+ │ │
316
+ │ 采集 → 去重 │
317
+ │ → 分块 → 噪声过滤 │
318
+ │ → 信号提取 → 脱敏 │
319
+ └─────────┬──────────┘
320
+
321
+ ┌─────────▼──────────┐
322
+ │ 存储层 │
323
+ │ │
324
+ │ PGLite + pgvector │
325
+ │ (嵌入式 PG) │
326
+ └─────────┬──────────┘
327
+
328
+ ┌───────────────┼───────────────┐
329
+ │ │ │
330
+ ┌────────▼──────┐ ┌─────▼──────┐ ┌──────▼───────┐
331
+ │ CLI │ │ MCP │ │ REST API │
332
+ │ 管理 & 提取 │ │ 服务器 │ │ (Hono) │
333
+ └────────────────┘ └────────────┘ └──────────────┘
334
+ ```
335
+
336
+ ### 信号类型
337
+
338
+ | 信号类型 | 说明 | 示例 |
339
+ |---------|------|------|
340
+ | **实体** | 人物、项目、工具、概念 | `project/memoark`, `tool/claude-code` |
341
+ | **时间线** | 关键事件及时间戳 | "2026-05-19: 完成多平台采集器重构" |
342
+ | **决策** | 架构选型、技术决策及其理由 | "选择 PGLite 作为嵌入式 PostgreSQL 方案" |
343
+ | **任务** | 待办事项及状态追踪 | `[open] 实现 token 自动刷新` |
344
+ | **发现** | 技术洞察、bug 根因、edge case | "UUID v4 不可按字典序排序" |
345
+ | **知识** | 可复用的事实性知识 | "PGLite 通过 WASM 在进程内运行完整 Postgres" |
346
+ | **关系** | 实体间的依赖、引用、协作 | `project/memoark --[depends_on]--> tool/pglite` |
347
+
348
+ ### 存储层
349
+
350
+ | 组件 | 说明 |
351
+ |------|------|
352
+ | **PageStore** | Wiki 风格页面,YAML frontmatter,CRUD |
353
+ | **ChunkStore** | 递归文本分块(300 词,50 词重叠),嵌入复用 |
354
+ | **SearchEngine** | tsvector 全文搜索 + pgvector 向量搜索,RRF 融合排序 |
355
+ | **GraphStore** | 有向链接图,BFS 遍历,链接类型过滤,反向链接 |
356
+ | **TagStore** | 页面标签,冲突安全 upsert |
357
+ | **TimelineStore** | 按时间排序的条目,去重 |
358
+ | **EmbeddingService** | OpenAI / Ollama 批量嵌入,过期 chunk 检测 |
359
+
360
+ ## CLI 命令
361
+
362
+ ### `memoark extract`
363
+
364
+ 从数据源提取信号。
365
+
366
+ ```bash
367
+ memoark extract \
368
+ --source <name> # claude-code, codex, hermes, feishu, all
369
+ --format json|markdown # 输出格式,默认 json
370
+ --adapter store|file|gbrain|stdout # 输出目标,默认 store
371
+ --since <date> # 只处理此日期之后的消息
372
+ --limit <n> # 限制消息数
373
+ --dry-run # 测试模式
374
+ ```
375
+
376
+ ### `memoark serve`
377
+
378
+ 启动服务器。
379
+
380
+ ```bash
381
+ memoark serve # HTTP API
382
+ memoark serve --mcp # MCP stdio 传输
383
+ ```
384
+
385
+ ### `memoark search <query>`
386
+
387
+ 搜索存储的记忆。
388
+
389
+ ```bash
390
+ memoark search "认证中间件" # 混合搜索(默认)
391
+ memoark search "JWT" --mode fts # 仅全文搜索
392
+ memoark search "部署" --limit 5 # 限制结果数
393
+ ```
394
+
395
+ ### `memoark embed`
396
+
397
+ 为未嵌入的 chunk 生成向量嵌入。
398
+
399
+ ```bash
400
+ memoark embed # 嵌入所有过期 chunk
401
+ memoark embed --limit 100 # 限制批量大小
402
+ ```
403
+
404
+ ### `memoark doctor`
405
+
406
+ 诊断配置和环境。
407
+
408
+ ### `memoark config init`
409
+
410
+ 等价于 `memoark init` —— 启动交互式配置中心生成 / 编辑 `memoark.yaml`(支持 `--auto` / `--no-tui` / `--force`)。
411
+
412
+ ### `memoark sources list` / `memoark sources test <name>`
413
+
414
+ 列出或测试数据源。
415
+
416
+ ## 配置
417
+
418
+ ### `memoark.yaml`
419
+
420
+ ```yaml
421
+ # 隐私配置
422
+ privacy:
423
+ enabled: true
424
+ mode: reversible # reversible(可逆)| irreversible(不可逆)
425
+ redact_phone: true
426
+ redact_id_card: true
427
+ redact_bank_card: true
428
+ replacement: "[REDACTED]"
429
+
430
+ # LLM(信号提取用)
431
+ llm:
432
+ provider: openai
433
+ model: gpt-4o-mini
434
+ api_key: ${OPENAI_API_KEY}
435
+
436
+ # 分块配置
437
+ block_builder:
438
+ block_gap_minutes: 30
439
+ max_block_tokens: 4000
440
+ max_block_messages: 100
441
+
442
+ # 数据源
443
+ sources:
444
+ claude-code:
445
+ enabled: true
446
+ codex:
447
+ enabled: true
448
+ hermes:
449
+ enabled: true
450
+
451
+ # 存储(PGLite)
452
+ store:
453
+ data_dir: ~/.memoark/data
454
+
455
+ # 嵌入
456
+ embedding:
457
+ provider: openai # openai | ollama
458
+ model: text-embedding-3-large
459
+ dimensions: 1536
460
+ api_key: ${OPENAI_API_KEY}
461
+
462
+ # 服务器
463
+ server:
464
+ http_port: 3927
465
+ ```
466
+
467
+ ## 支持的数据源
468
+
469
+ | 数据源 | 路径 | 说明 |
470
+ |--------|------|------|
471
+ | **飞书(Lark)** | API + lark-cli | 核心工作源 —— 7 个源:群聊、私信、邮件、日历、文档、任务、消息搜索 |
472
+ | **Claude Code** | `~/.claude/projects/` | Claude Code Agent 对话记录 |
473
+ | **Codex** | `~/.codex/` | OpenAI Codex CLI 会话 |
474
+ | **Hermes** | `~/.openclaw/agents/` | OpenClaw Hermes Agent 会话 |
475
+
476
+ > 飞书优先:它承载的是工作本身 —— 需求讨论、技术方案、团队决策。私信和最近会话需要先完成 `lark-cli` 用户态登录并启用 `message_search`(详见上方配置)。
477
+
478
+ ## 路线图
479
+
480
+ ### Phase 1 — 信号提取(已完成)
481
+
482
+ - [x] 多平台采集器(Claude Code、Codex、Hermes、飞书)
483
+ - [x] LLM 驱动的噪声过滤和信号提取
484
+ - [x] 7 类信号:实体、时间线、决策、任务、发现、知识、关系
485
+ - [x] 双轨隐私脱敏(可逆 + 不可逆)
486
+ - [x] JSON 和 Markdown 输出格式
487
+
488
+ ### Phase 2 — 存储 & 服务器(已完成)
489
+
490
+ - [x] PGLite 嵌入式 PostgreSQL + pgvector
491
+ - [x] PageStore、ChunkStore、TagStore、TimelineStore、GraphStore
492
+ - [x] 全文搜索(simple 分词器,支持中文)+ 向量搜索
493
+ - [x] RRF 混合搜索
494
+ - [x] EmbeddingService(OpenAI / Ollama)
495
+ - [x] StoreAdapter — Pipeline 直接写入 PGLite
496
+ - [x] Hono REST API
497
+ - [x] MCP 服务器(17 个 stdio 工具)
498
+ - [x] CLI serve、search、embed 命令
499
+
500
+ ### Phase 3 — Web UI(已完成)
501
+
502
+ - [x] Dashboard
503
+ - [x] 时间线视图
504
+ - [x] 知识图谱可视化(力导向)
505
+ - [x] 搜索界面
506
+ - [x] 实体 / 页面详情
507
+
508
+ ### Phase 4 — 上下文感知提取(规划中)
509
+
510
+ - [ ] ContextBuffer —— 跨 block 共享上下文
511
+ - [ ] 加权准入评分(替换二元噪声过滤)
512
+ - [ ] NarrativeAssembler —— 按实体聚合叙事
513
+
514
+ ### Phase 5 — 巩固与常驻服务(规划中)
515
+
516
+ - [ ] 记忆巩固(dream cycle):实体合并、链接修复、模式发现
517
+ - [ ] 常驻后台服务 + 定时采集
518
+ - [ ] 自然语言问答
519
+
520
+ ### Phase 6 — 同步与新数据源(规划中)
521
+
522
+ - [ ] Obsidian 双向同步
523
+ - [ ] 微信聊天记录
524
+ - [ ] 更多平台(社区驱动)
525
+
526
+ ## 技术栈
527
+
528
+ | 层 | 技术 |
529
+ |----|------|
530
+ | 语言 | TypeScript |
531
+ | 运行时 | Bun |
532
+ | 数据库 | PGLite(嵌入式 PostgreSQL) |
533
+ | 向量搜索 | pgvector |
534
+ | 嵌入 | OpenAI / Ollama |
535
+ | Web 框架 | Hono |
536
+ | Web UI | React + Vite |
537
+ | MCP | @modelcontextprotocol/sdk |
538
+ | Linter | Biome |
539
+ | 测试 | Vitest(800+ 测试) |
540
+
541
+ ## 开发
542
+
543
+ ```bash
544
+ bun run test # 全量测试
545
+ bun run test:watch # 监听模式
546
+ bun run typecheck # 类型检查
547
+ bun run lint # 代码检查
548
+ bun run lint:fix # 自动修复
549
+ ```
550
+
551
+ 详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
552
+
553
+ ## 社区与支持
554
+
555
+ - 🐛 发现 bug 或有功能建议?[提交 issue](https://github.com/AndreLYL/memoark/issues)。
556
+ - 💡 欢迎在 issue 区交流问题和想法。
557
+
558
+ ## License
559
+
560
+ 基于 [Apache License 2.0](LICENSE) 开源。
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const projectRoot = resolve(__dirname, "..");
9
+ const distCli = resolve(projectRoot, "dist", "cli.js");
10
+ const srcCli = resolve(projectRoot, "src", "cli.ts");
11
+ const args = process.argv.slice(2);
12
+
13
+ if (existsSync(distCli)) {
14
+ await import(pathToFileURL(distCli).href);
15
+ } else if (existsSync(srcCli)) {
16
+ const candidates = [
17
+ { command: "bun", args: [srcCli, ...args] },
18
+ { command: "tsx", args: [srcCli, ...args] },
19
+ { command: "npx", args: ["tsx", srcCli, ...args] },
20
+ ];
21
+
22
+ for (const candidate of candidates) {
23
+ const result = spawnSync(candidate.command, candidate.args, { stdio: "inherit" });
24
+ if (result.error) {
25
+ continue;
26
+ }
27
+ process.exit(result.status ?? 0);
28
+ }
29
+
30
+ console.error("Error: No runtime found to execute Memoark from source.");
31
+ console.error("Install Bun, install tsx, or run npm run build before using this binary.");
32
+ process.exit(1);
33
+ } else {
34
+ console.error("Error: Cannot find Memoark CLI entrypoint.");
35
+ process.exit(1);
36
+ }
@@ -0,0 +1,19 @@
1
+ import type { Adapter, AdapterPushResult, ExtractionResult } from "../core/types.js";
2
+ export interface FileAdapterConfig {
3
+ output_dir: string;
4
+ format: "json" | "markdown";
5
+ }
6
+ export declare class FileAdapter implements Adapter {
7
+ id: string;
8
+ name: string;
9
+ description: string;
10
+ private config;
11
+ private formatter;
12
+ constructor(config: FileAdapterConfig);
13
+ healthCheck(): Promise<{
14
+ ok: boolean;
15
+ message: string;
16
+ }>;
17
+ push(results: ExtractionResult[]): Promise<AdapterPushResult>;
18
+ }
19
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/adapters/file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIrF,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,qBAAa,WAAY,YAAW,OAAO;IACzC,EAAE,SAAU;IACZ,IAAI,SAAkB;IACtB,WAAW,SAAwC;IAEnD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAoC;gBAEzC,MAAM,EAAE,iBAAiB;IAK/B,WAAW,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBxD,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+BpE"}
@@ -0,0 +1,61 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { JSONFormatter } from "../formatters/json.js";
5
+ import { MarkdownFormatter } from "../formatters/markdown.js";
6
+ export class FileAdapter {
7
+ id = "file";
8
+ name = "File Adapter";
9
+ description = "Writes extraction results to files";
10
+ config;
11
+ formatter;
12
+ constructor(config) {
13
+ this.config = config;
14
+ this.formatter = config.format === "json" ? new JSONFormatter() : new MarkdownFormatter();
15
+ }
16
+ async healthCheck() {
17
+ try {
18
+ // Create output_dir if it doesn't exist
19
+ if (!existsSync(this.config.output_dir)) {
20
+ await mkdir(this.config.output_dir, { recursive: true });
21
+ }
22
+ return { ok: true, message: "File adapter is ready" };
23
+ }
24
+ catch (error) {
25
+ return {
26
+ ok: false,
27
+ message: `Failed to initialize output directory: ${error instanceof Error ? error.message : String(error)}`,
28
+ };
29
+ }
30
+ }
31
+ async push(results) {
32
+ const pushResult = {
33
+ written: 0,
34
+ skipped: 0,
35
+ errors: [],
36
+ };
37
+ for (const result of results) {
38
+ try {
39
+ const content = this.formatter.format(result);
40
+ const timestamp = Date.now();
41
+ const extension = this.config.format === "json" ? "json" : "md";
42
+ const filename = `${result.source.platform}-${result.source.channel}-${timestamp}.${extension}`;
43
+ const filepath = join(this.config.output_dir, filename);
44
+ const dir = dirname(filepath);
45
+ if (!existsSync(dir)) {
46
+ await mkdir(dir, { recursive: true });
47
+ }
48
+ await writeFile(filepath, content, "utf-8");
49
+ pushResult.written += 1;
50
+ }
51
+ catch (error) {
52
+ pushResult.errors.push({
53
+ signal: `${result.source.platform}/${result.source.channel}`,
54
+ reason: error instanceof Error ? error.message : String(error),
55
+ });
56
+ }
57
+ }
58
+ return pushResult;
59
+ }
60
+ }
61
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/adapters/file.ts"],"names":[],"mappings":"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"}