@andre.li/memoark 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/README.en.md +388 -69
  2. package/README.md +674 -309
  3. package/README.zh-CN.md +816 -0
  4. package/bin/memoark.mjs +7 -2
  5. package/dist/adapters/store.d.ts.map +1 -1
  6. package/dist/adapters/store.js +6 -5
  7. package/dist/adapters/store.js.map +1 -1
  8. package/dist/cli-helpers.d.ts +12 -0
  9. package/dist/cli-helpers.d.ts.map +1 -0
  10. package/dist/cli-helpers.js +11 -0
  11. package/dist/cli-helpers.js.map +1 -0
  12. package/dist/cli.js +682 -126
  13. package/dist/cli.js.map +1 -1
  14. package/dist/collectors/feishu/chat-name-resolver.d.ts +33 -0
  15. package/dist/collectors/feishu/chat-name-resolver.d.ts.map +1 -0
  16. package/dist/collectors/feishu/chat-name-resolver.js +63 -0
  17. package/dist/collectors/feishu/chat-name-resolver.js.map +1 -0
  18. package/dist/collectors/feishu/collector.d.ts +4 -0
  19. package/dist/collectors/feishu/collector.d.ts.map +1 -1
  20. package/dist/collectors/feishu/collector.js +27 -4
  21. package/dist/collectors/feishu/collector.js.map +1 -1
  22. package/dist/collectors/feishu/docs/blocks.d.ts +25 -0
  23. package/dist/collectors/feishu/docs/blocks.d.ts.map +1 -0
  24. package/dist/collectors/feishu/docs/blocks.js +34 -0
  25. package/dist/collectors/feishu/docs/blocks.js.map +1 -0
  26. package/dist/collectors/feishu/docs/candidate.d.ts +17 -0
  27. package/dist/collectors/feishu/docs/candidate.d.ts.map +1 -0
  28. package/dist/collectors/feishu/docs/candidate.js +36 -0
  29. package/dist/collectors/feishu/docs/candidate.js.map +1 -0
  30. package/dist/collectors/feishu/docs/config.d.ts +41 -0
  31. package/dist/collectors/feishu/docs/config.d.ts.map +1 -0
  32. package/dist/collectors/feishu/docs/config.js +30 -0
  33. package/dist/collectors/feishu/docs/config.js.map +1 -0
  34. package/dist/collectors/feishu/docs/decision.d.ts +14 -0
  35. package/dist/collectors/feishu/docs/decision.d.ts.map +1 -0
  36. package/dist/collectors/feishu/docs/decision.js +43 -0
  37. package/dist/collectors/feishu/docs/decision.js.map +1 -0
  38. package/dist/collectors/feishu/docs/full-builder.d.ts +17 -0
  39. package/dist/collectors/feishu/docs/full-builder.d.ts.map +1 -0
  40. package/dist/collectors/feishu/docs/full-builder.js +136 -0
  41. package/dist/collectors/feishu/docs/full-builder.js.map +1 -0
  42. package/dist/collectors/feishu/docs/hash.d.ts +8 -0
  43. package/dist/collectors/feishu/docs/hash.d.ts.map +1 -0
  44. package/dist/collectors/feishu/docs/hash.js +15 -0
  45. package/dist/collectors/feishu/docs/hash.js.map +1 -0
  46. package/dist/collectors/feishu/docs/ingest.d.ts +54 -0
  47. package/dist/collectors/feishu/docs/ingest.d.ts.map +1 -0
  48. package/dist/collectors/feishu/docs/ingest.js +120 -0
  49. package/dist/collectors/feishu/docs/ingest.js.map +1 -0
  50. package/dist/collectors/feishu/docs/llm-json.d.ts +13 -0
  51. package/dist/collectors/feishu/docs/llm-json.d.ts.map +1 -0
  52. package/dist/collectors/feishu/docs/llm-json.js +40 -0
  53. package/dist/collectors/feishu/docs/llm-json.js.map +1 -0
  54. package/dist/collectors/feishu/docs/pointer-builder.d.ts +7 -0
  55. package/dist/collectors/feishu/docs/pointer-builder.d.ts.map +1 -0
  56. package/dist/collectors/feishu/docs/pointer-builder.js +11 -0
  57. package/dist/collectors/feishu/docs/pointer-builder.js.map +1 -0
  58. package/dist/collectors/feishu/docs/render.d.ts +8 -0
  59. package/dist/collectors/feishu/docs/render.d.ts.map +1 -0
  60. package/dist/collectors/feishu/docs/render.js +105 -0
  61. package/dist/collectors/feishu/docs/render.js.map +1 -0
  62. package/dist/collectors/feishu/docs/run.d.ts +37 -0
  63. package/dist/collectors/feishu/docs/run.d.ts.map +1 -0
  64. package/dist/collectors/feishu/docs/run.js +143 -0
  65. package/dist/collectors/feishu/docs/run.js.map +1 -0
  66. package/dist/collectors/feishu/docs/status.d.ts +16 -0
  67. package/dist/collectors/feishu/docs/status.d.ts.map +1 -0
  68. package/dist/collectors/feishu/docs/status.js +24 -0
  69. package/dist/collectors/feishu/docs/status.js.map +1 -0
  70. package/dist/collectors/feishu/docs/store-writer.d.ts +32 -0
  71. package/dist/collectors/feishu/docs/store-writer.d.ts.map +1 -0
  72. package/dist/collectors/feishu/docs/store-writer.js +71 -0
  73. package/dist/collectors/feishu/docs/store-writer.js.map +1 -0
  74. package/dist/collectors/feishu/docs/toc.d.ts +3 -0
  75. package/dist/collectors/feishu/docs/toc.d.ts.map +1 -0
  76. package/dist/collectors/feishu/docs/toc.js +19 -0
  77. package/dist/collectors/feishu/docs/toc.js.map +1 -0
  78. package/dist/collectors/feishu/docs/triggers.d.ts +7 -0
  79. package/dist/collectors/feishu/docs/triggers.d.ts.map +1 -0
  80. package/dist/collectors/feishu/docs/triggers.js +31 -0
  81. package/dist/collectors/feishu/docs/triggers.js.map +1 -0
  82. package/dist/collectors/feishu/docs/types.d.ts +109 -0
  83. package/dist/collectors/feishu/docs/types.d.ts.map +1 -0
  84. package/dist/collectors/feishu/docs/types.js +2 -0
  85. package/dist/collectors/feishu/docs/types.js.map +1 -0
  86. package/dist/collectors/feishu/docs/upgrade-queue.d.ts +19 -0
  87. package/dist/collectors/feishu/docs/upgrade-queue.d.ts.map +1 -0
  88. package/dist/collectors/feishu/docs/upgrade-queue.js +36 -0
  89. package/dist/collectors/feishu/docs/upgrade-queue.js.map +1 -0
  90. package/dist/collectors/feishu/docs/url-parser.d.ts +3 -0
  91. package/dist/collectors/feishu/docs/url-parser.d.ts.map +1 -0
  92. package/dist/collectors/feishu/docs/url-parser.js +39 -0
  93. package/dist/collectors/feishu/docs/url-parser.js.map +1 -0
  94. package/dist/collectors/feishu/docs/walkers.d.ts +24 -0
  95. package/dist/collectors/feishu/docs/walkers.d.ts.map +1 -0
  96. package/dist/collectors/feishu/docs/walkers.js +90 -0
  97. package/dist/collectors/feishu/docs/walkers.js.map +1 -0
  98. package/dist/collectors/feishu/docs/wiki-resolver.d.ts +15 -0
  99. package/dist/collectors/feishu/docs/wiki-resolver.d.ts.map +1 -0
  100. package/dist/collectors/feishu/docs/wiki-resolver.js +24 -0
  101. package/dist/collectors/feishu/docs/wiki-resolver.js.map +1 -0
  102. package/dist/collectors/feishu/lark-cli-client.d.ts +12 -0
  103. package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -1
  104. package/dist/collectors/feishu/lark-cli-client.js +37 -2
  105. package/dist/collectors/feishu/lark-cli-client.js.map +1 -1
  106. package/dist/collectors/feishu/lark-cli-identity-backend.d.ts +28 -0
  107. package/dist/collectors/feishu/lark-cli-identity-backend.d.ts.map +1 -0
  108. package/dist/collectors/feishu/lark-cli-identity-backend.js +110 -0
  109. package/dist/collectors/feishu/lark-cli-identity-backend.js.map +1 -0
  110. package/dist/collectors/feishu/self-open-id.d.ts +20 -0
  111. package/dist/collectors/feishu/self-open-id.d.ts.map +1 -0
  112. package/dist/collectors/feishu/self-open-id.js +31 -0
  113. package/dist/collectors/feishu/self-open-id.js.map +1 -0
  114. package/dist/collectors/feishu/sources/dm.d.ts.map +1 -1
  115. package/dist/collectors/feishu/sources/dm.js +4 -0
  116. package/dist/collectors/feishu/sources/dm.js.map +1 -1
  117. package/dist/collectors/feishu/sources/mail.d.ts.map +1 -1
  118. package/dist/collectors/feishu/sources/mail.js +18 -20
  119. package/dist/collectors/feishu/sources/mail.js.map +1 -1
  120. package/dist/collectors/feishu/sources/messages.d.ts +2 -0
  121. package/dist/collectors/feishu/sources/messages.d.ts.map +1 -1
  122. package/dist/collectors/feishu/sources/messages.js +28 -1
  123. package/dist/collectors/feishu/sources/messages.js.map +1 -1
  124. package/dist/collectors/feishu/types.d.ts +37 -3
  125. package/dist/collectors/feishu/types.d.ts.map +1 -1
  126. package/dist/collectors/feishu/types.js.map +1 -1
  127. package/dist/config-center/connection-checks.d.ts.map +1 -1
  128. package/dist/config-center/connection-checks.js +1 -1
  129. package/dist/config-center/connection-checks.js.map +1 -1
  130. package/dist/config-center/schema.d.ts.map +1 -1
  131. package/dist/config-center/schema.js +77 -0
  132. package/dist/config-center/schema.js.map +1 -1
  133. package/dist/consolidator/consolidator.d.ts +13 -1
  134. package/dist/consolidator/consolidator.d.ts.map +1 -1
  135. package/dist/consolidator/consolidator.js +12 -2
  136. package/dist/consolidator/consolidator.js.map +1 -1
  137. package/dist/core/canonicalize.js +5 -1
  138. package/dist/core/canonicalize.js.map +1 -1
  139. package/dist/core/config.d.ts +52 -9
  140. package/dist/core/config.d.ts.map +1 -1
  141. package/dist/core/config.js +86 -24
  142. package/dist/core/config.js.map +1 -1
  143. package/dist/core/env-validation.d.ts +9 -0
  144. package/dist/core/env-validation.d.ts.map +1 -0
  145. package/dist/core/env-validation.js +94 -0
  146. package/dist/core/env-validation.js.map +1 -0
  147. package/dist/core/identity-resolver.d.ts +24 -3
  148. package/dist/core/identity-resolver.d.ts.map +1 -1
  149. package/dist/core/identity-resolver.js +147 -2
  150. package/dist/core/identity-resolver.js.map +1 -1
  151. package/dist/core/person-identity.d.ts +124 -0
  152. package/dist/core/person-identity.d.ts.map +1 -0
  153. package/dist/core/person-identity.js +342 -0
  154. package/dist/core/person-identity.js.map +1 -0
  155. package/dist/core/person-slug.d.ts +21 -0
  156. package/dist/core/person-slug.d.ts.map +1 -0
  157. package/dist/core/person-slug.js +93 -0
  158. package/dist/core/person-slug.js.map +1 -0
  159. package/dist/core/pipeline-factory.d.ts +1 -1
  160. package/dist/core/pipeline-factory.d.ts.map +1 -1
  161. package/dist/core/pipeline-factory.js +8 -3
  162. package/dist/core/pipeline-factory.js.map +1 -1
  163. package/dist/core/pipeline.d.ts +16 -0
  164. package/dist/core/pipeline.d.ts.map +1 -1
  165. package/dist/core/pipeline.js +49 -1
  166. package/dist/core/pipeline.js.map +1 -1
  167. package/dist/core/resource-loader.d.ts +2 -0
  168. package/dist/core/resource-loader.d.ts.map +1 -0
  169. package/dist/core/resource-loader.js +12 -0
  170. package/dist/core/resource-loader.js.map +1 -0
  171. package/dist/core/schemas.d.ts +2981 -309
  172. package/dist/core/schemas.d.ts.map +1 -1
  173. package/dist/core/schemas.js +27 -0
  174. package/dist/core/schemas.js.map +1 -1
  175. package/dist/core/signal-scoring.d.ts.map +1 -1
  176. package/dist/core/signal-scoring.js +5 -1
  177. package/dist/core/signal-scoring.js.map +1 -1
  178. package/dist/core/source-ref.d.ts +4 -0
  179. package/dist/core/source-ref.d.ts.map +1 -0
  180. package/dist/core/source-ref.js +24 -0
  181. package/dist/core/source-ref.js.map +1 -0
  182. package/dist/core/state.d.ts +1 -1
  183. package/dist/core/state.d.ts.map +1 -1
  184. package/dist/core/state.js +3 -2
  185. package/dist/core/state.js.map +1 -1
  186. package/dist/core/types.d.ts +34 -6
  187. package/dist/core/types.d.ts.map +1 -1
  188. package/dist/daemon/reload-manager.d.ts +27 -0
  189. package/dist/daemon/reload-manager.d.ts.map +1 -0
  190. package/dist/daemon/reload-manager.js +67 -0
  191. package/dist/daemon/reload-manager.js.map +1 -0
  192. package/dist/daemon/scheduler.d.ts +9 -1
  193. package/dist/daemon/scheduler.d.ts.map +1 -1
  194. package/dist/daemon/scheduler.js +113 -38
  195. package/dist/daemon/scheduler.js.map +1 -1
  196. package/dist/daemon/serve-runtime.d.ts +31 -0
  197. package/dist/daemon/serve-runtime.d.ts.map +1 -0
  198. package/dist/daemon/serve-runtime.js +230 -0
  199. package/dist/daemon/serve-runtime.js.map +1 -0
  200. package/dist/embedded-assets.generated.d.ts.map +1 -1
  201. package/dist/embedded-assets.generated.js +3 -3
  202. package/dist/embedded-assets.generated.js.map +1 -1
  203. package/dist/extractors/playbook-extractor.d.ts +35 -0
  204. package/dist/extractors/playbook-extractor.d.ts.map +1 -0
  205. package/dist/extractors/playbook-extractor.js +98 -0
  206. package/dist/extractors/playbook-extractor.js.map +1 -0
  207. package/dist/extractors/prompts/examples/agent-session.md +257 -0
  208. package/dist/extractors/prompts/signal-extract.md +199 -0
  209. package/dist/extractors/prompts/system.md +45 -0
  210. package/dist/extractors/signal-extractor.d.ts +2 -1
  211. package/dist/extractors/signal-extractor.d.ts.map +1 -1
  212. package/dist/extractors/signal-extractor.js +99 -7
  213. package/dist/extractors/signal-extractor.js.map +1 -1
  214. package/dist/hooks/handlers.d.ts +21 -0
  215. package/dist/hooks/handlers.d.ts.map +1 -0
  216. package/dist/hooks/handlers.js +22 -0
  217. package/dist/hooks/handlers.js.map +1 -0
  218. package/dist/hooks/inject.d.ts +7 -0
  219. package/dist/hooks/inject.d.ts.map +1 -0
  220. package/dist/hooks/inject.js +18 -0
  221. package/dist/hooks/inject.js.map +1 -0
  222. package/dist/hooks/install.d.ts +14 -0
  223. package/dist/hooks/install.d.ts.map +1 -0
  224. package/dist/hooks/install.js +34 -0
  225. package/dist/hooks/install.js.map +1 -0
  226. package/dist/hooks/output.d.ts +19 -0
  227. package/dist/hooks/output.d.ts.map +1 -0
  228. package/dist/hooks/output.js +13 -0
  229. package/dist/hooks/output.js.map +1 -0
  230. package/dist/hooks/recall-client.d.ts +25 -0
  231. package/dist/hooks/recall-client.d.ts.map +1 -0
  232. package/dist/hooks/recall-client.js +56 -0
  233. package/dist/hooks/recall-client.js.map +1 -0
  234. package/dist/hooks/run-event.d.ts +13 -0
  235. package/dist/hooks/run-event.d.ts.map +1 -0
  236. package/dist/hooks/run-event.js +20 -0
  237. package/dist/hooks/run-event.js.map +1 -0
  238. package/dist/hooks/settings-edit.d.ts +10 -0
  239. package/dist/hooks/settings-edit.d.ts.map +1 -0
  240. package/dist/hooks/settings-edit.js +44 -0
  241. package/dist/hooks/settings-edit.js.map +1 -0
  242. package/dist/hooks/writeback.d.ts +12 -0
  243. package/dist/hooks/writeback.d.ts.map +1 -0
  244. package/dist/hooks/writeback.js +48 -0
  245. package/dist/hooks/writeback.js.map +1 -0
  246. package/dist/install/clients/claude-code.d.ts +3 -0
  247. package/dist/install/clients/claude-code.d.ts.map +1 -0
  248. package/dist/install/clients/claude-code.js +30 -0
  249. package/dist/install/clients/claude-code.js.map +1 -0
  250. package/dist/install/clients/claude-desktop.d.ts +3 -0
  251. package/dist/install/clients/claude-desktop.d.ts.map +1 -0
  252. package/dist/install/clients/claude-desktop.js +31 -0
  253. package/dist/install/clients/claude-desktop.js.map +1 -0
  254. package/dist/install/clients/codex.d.ts +3 -0
  255. package/dist/install/clients/codex.d.ts.map +1 -0
  256. package/dist/install/clients/codex.js +32 -0
  257. package/dist/install/clients/codex.js.map +1 -0
  258. package/dist/install/clients/cursor.d.ts +3 -0
  259. package/dist/install/clients/cursor.d.ts.map +1 -0
  260. package/dist/install/clients/cursor.js +35 -0
  261. package/dist/install/clients/cursor.js.map +1 -0
  262. package/dist/install/clients/hermes.d.ts +3 -0
  263. package/dist/install/clients/hermes.d.ts.map +1 -0
  264. package/dist/install/clients/hermes.js +35 -0
  265. package/dist/install/clients/hermes.js.map +1 -0
  266. package/dist/install/clients/index.d.ts +4 -0
  267. package/dist/install/clients/index.d.ts.map +1 -0
  268. package/dist/install/clients/index.js +18 -0
  269. package/dist/install/clients/index.js.map +1 -0
  270. package/dist/install/clients/windsurf.d.ts +3 -0
  271. package/dist/install/clients/windsurf.d.ts.map +1 -0
  272. package/dist/install/clients/windsurf.js +32 -0
  273. package/dist/install/clients/windsurf.js.map +1 -0
  274. package/dist/install/command.d.ts +14 -0
  275. package/dist/install/command.d.ts.map +1 -0
  276. package/dist/install/command.js +34 -0
  277. package/dist/install/command.js.map +1 -0
  278. package/dist/install/directive.d.ts +7 -0
  279. package/dist/install/directive.d.ts.map +1 -0
  280. package/dist/install/directive.js +31 -0
  281. package/dist/install/directive.js.map +1 -0
  282. package/dist/install/index.d.ts +26 -0
  283. package/dist/install/index.d.ts.map +1 -0
  284. package/dist/install/index.js +117 -0
  285. package/dist/install/index.js.map +1 -0
  286. package/dist/install/json-config.d.ts +11 -0
  287. package/dist/install/json-config.d.ts.map +1 -0
  288. package/dist/install/json-config.js +39 -0
  289. package/dist/install/json-config.js.map +1 -0
  290. package/dist/install/marked-block.d.ts +11 -0
  291. package/dist/install/marked-block.d.ts.map +1 -0
  292. package/dist/install/marked-block.js +34 -0
  293. package/dist/install/marked-block.js.map +1 -0
  294. package/dist/install/skill.d.ts +4 -0
  295. package/dist/install/skill.d.ts.map +1 -0
  296. package/dist/install/skill.js +61 -0
  297. package/dist/install/skill.js.map +1 -0
  298. package/dist/install/toml-config.d.ts +4 -0
  299. package/dist/install/toml-config.d.ts.map +1 -0
  300. package/dist/install/toml-config.js +51 -0
  301. package/dist/install/toml-config.js.map +1 -0
  302. package/dist/install/types.d.ts +37 -0
  303. package/dist/install/types.d.ts.map +1 -0
  304. package/dist/install/types.js +4 -0
  305. package/dist/install/types.js.map +1 -0
  306. package/dist/install/yaml-config.d.ts +4 -0
  307. package/dist/install/yaml-config.d.ts.map +1 -0
  308. package/dist/install/yaml-config.js +18 -0
  309. package/dist/install/yaml-config.js.map +1 -0
  310. package/dist/processors/privacy.d.ts +4 -1
  311. package/dist/processors/privacy.d.ts.map +1 -1
  312. package/dist/processors/privacy.js +5 -3
  313. package/dist/processors/privacy.js.map +1 -1
  314. package/dist/profile/accumulate.d.ts +28 -0
  315. package/dist/profile/accumulate.d.ts.map +1 -0
  316. package/dist/profile/accumulate.js +48 -0
  317. package/dist/profile/accumulate.js.map +1 -0
  318. package/dist/profile/behavior.d.ts +32 -0
  319. package/dist/profile/behavior.d.ts.map +1 -0
  320. package/dist/profile/behavior.js +122 -0
  321. package/dist/profile/behavior.js.map +1 -0
  322. package/dist/profile/four-color.d.ts +12 -0
  323. package/dist/profile/four-color.d.ts.map +1 -0
  324. package/dist/profile/four-color.js +39 -0
  325. package/dist/profile/four-color.js.map +1 -0
  326. package/dist/profile/profile-synth.d.ts +27 -0
  327. package/dist/profile/profile-synth.d.ts.map +1 -0
  328. package/dist/profile/profile-synth.js +174 -0
  329. package/dist/profile/profile-synth.js.map +1 -0
  330. package/dist/profile/types.d.ts +84 -0
  331. package/dist/profile/types.d.ts.map +1 -0
  332. package/dist/profile/types.js +11 -0
  333. package/dist/profile/types.js.map +1 -0
  334. package/dist/server/api.d.ts +8 -2
  335. package/dist/server/api.d.ts.map +1 -1
  336. package/dist/server/api.js +69 -34
  337. package/dist/server/api.js.map +1 -1
  338. package/dist/server/backfill-routes.d.ts.map +1 -1
  339. package/dist/server/backfill-routes.js +14 -1
  340. package/dist/server/backfill-routes.js.map +1 -1
  341. package/dist/server/chat-name-refresh-job.d.ts +33 -0
  342. package/dist/server/chat-name-refresh-job.d.ts.map +1 -0
  343. package/dist/server/chat-name-refresh-job.js +120 -0
  344. package/dist/server/chat-name-refresh-job.js.map +1 -0
  345. package/dist/server/chat-name-routes.d.ts +13 -0
  346. package/dist/server/chat-name-routes.d.ts.map +1 -0
  347. package/dist/server/chat-name-routes.js +81 -0
  348. package/dist/server/chat-name-routes.js.map +1 -0
  349. package/dist/server/config-routes.d.ts +2 -0
  350. package/dist/server/config-routes.d.ts.map +1 -1
  351. package/dist/server/config-routes.js +2 -1
  352. package/dist/server/config-routes.js.map +1 -1
  353. package/dist/server/mcp-http.d.ts +26 -0
  354. package/dist/server/mcp-http.d.ts.map +1 -0
  355. package/dist/server/mcp-http.js +102 -0
  356. package/dist/server/mcp-http.js.map +1 -0
  357. package/dist/server/mcp.d.ts +191 -25
  358. package/dist/server/mcp.d.ts.map +1 -1
  359. package/dist/server/mcp.js +1111 -68
  360. package/dist/server/mcp.js.map +1 -1
  361. package/dist/server/open-browser.d.ts +3 -0
  362. package/dist/server/open-browser.d.ts.map +1 -0
  363. package/dist/server/open-browser.js +12 -0
  364. package/dist/server/open-browser.js.map +1 -0
  365. package/dist/server/runtime.d.ts +13 -0
  366. package/dist/server/runtime.d.ts.map +1 -0
  367. package/dist/server/runtime.js +27 -0
  368. package/dist/server/runtime.js.map +1 -0
  369. package/dist/server/setup-server.d.ts.map +1 -1
  370. package/dist/server/setup-server.js +8 -11
  371. package/dist/server/setup-server.js.map +1 -1
  372. package/dist/setup/connection-tests.d.ts +1 -1
  373. package/dist/setup/connection-tests.d.ts.map +1 -1
  374. package/dist/setup/connection-tests.js +4 -2
  375. package/dist/setup/connection-tests.js.map +1 -1
  376. package/dist/setup/generate-config.d.ts.map +1 -1
  377. package/dist/setup/generate-config.js +31 -1
  378. package/dist/setup/generate-config.js.map +1 -1
  379. package/dist/setup/init-wizard.d.ts +1 -0
  380. package/dist/setup/init-wizard.d.ts.map +1 -1
  381. package/dist/setup/init-wizard.js +38 -21
  382. package/dist/setup/init-wizard.js.map +1 -1
  383. package/dist/setup/validate-config.d.ts +5 -1
  384. package/dist/setup/validate-config.d.ts.map +1 -1
  385. package/dist/setup/validate-config.js +18 -0
  386. package/dist/setup/validate-config.js.map +1 -1
  387. package/dist/store/data-dir-lock.d.ts +15 -0
  388. package/dist/store/data-dir-lock.d.ts.map +1 -0
  389. package/dist/store/data-dir-lock.js +96 -0
  390. package/dist/store/data-dir-lock.js.map +1 -0
  391. package/dist/store/database.d.ts +2 -0
  392. package/dist/store/database.d.ts.map +1 -1
  393. package/dist/store/database.js +23 -10
  394. package/dist/store/database.js.map +1 -1
  395. package/dist/store/graph.d.ts +22 -0
  396. package/dist/store/graph.d.ts.map +1 -1
  397. package/dist/store/graph.js +97 -7
  398. package/dist/store/graph.js.map +1 -1
  399. package/dist/store/migrations/index.d.ts.map +1 -1
  400. package/dist/store/migrations/index.js +52 -0
  401. package/dist/store/migrations/index.js.map +1 -1
  402. package/dist/store/pages.d.ts +7 -0
  403. package/dist/store/pages.d.ts.map +1 -1
  404. package/dist/store/pages.js +56 -1
  405. package/dist/store/pages.js.map +1 -1
  406. package/dist/store/person-behavior.d.ts +28 -0
  407. package/dist/store/person-behavior.d.ts.map +1 -0
  408. package/dist/store/person-behavior.js +127 -0
  409. package/dist/store/person-behavior.js.map +1 -0
  410. package/dist/store/pglite-assets.d.ts +15 -0
  411. package/dist/store/pglite-assets.d.ts.map +1 -0
  412. package/dist/store/pglite-assets.js +47 -0
  413. package/dist/store/pglite-assets.js.map +1 -0
  414. package/dist/store/query-rewrite.d.ts +28 -0
  415. package/dist/store/query-rewrite.d.ts.map +1 -0
  416. package/dist/store/query-rewrite.js +97 -0
  417. package/dist/store/query-rewrite.js.map +1 -0
  418. package/dist/store/schema.sql +107 -0
  419. package/dist/store/search.d.ts +36 -8
  420. package/dist/store/search.d.ts.map +1 -1
  421. package/dist/store/search.js +188 -76
  422. package/dist/store/search.js.map +1 -1
  423. package/dist/store/tags.d.ts.map +1 -1
  424. package/dist/store/tags.js +6 -2
  425. package/dist/store/tags.js.map +1 -1
  426. package/dist/store/timeline.d.ts +13 -1
  427. package/dist/store/timeline.d.ts.map +1 -1
  428. package/dist/store/timeline.js +134 -4
  429. package/dist/store/timeline.js.map +1 -1
  430. package/dist/store/trgm-search.d.ts +13 -0
  431. package/dist/store/trgm-search.d.ts.map +1 -0
  432. package/dist/store/trgm-search.js +53 -0
  433. package/dist/store/trgm-search.js.map +1 -0
  434. package/dist/store/wikilink.d.ts +17 -0
  435. package/dist/store/wikilink.d.ts.map +1 -0
  436. package/dist/store/wikilink.js +58 -0
  437. package/dist/store/wikilink.js.map +1 -0
  438. package/dist/sync/obsidian.d.ts.map +1 -1
  439. package/dist/sync/obsidian.js +5 -1
  440. package/dist/sync/obsidian.js.map +1 -1
  441. package/dist/synth/cache.d.ts +17 -0
  442. package/dist/synth/cache.d.ts.map +1 -0
  443. package/dist/synth/cache.js +67 -0
  444. package/dist/synth/cache.js.map +1 -0
  445. package/dist/synth/citations.d.ts +12 -0
  446. package/dist/synth/citations.d.ts.map +1 -0
  447. package/dist/synth/citations.js +28 -0
  448. package/dist/synth/citations.js.map +1 -0
  449. package/dist/synth/context.d.ts +10 -0
  450. package/dist/synth/context.d.ts.map +1 -0
  451. package/dist/synth/context.js +67 -0
  452. package/dist/synth/context.js.map +1 -0
  453. package/dist/synth/engine.d.ts +16 -0
  454. package/dist/synth/engine.d.ts.map +1 -0
  455. package/dist/synth/engine.js +111 -0
  456. package/dist/synth/engine.js.map +1 -0
  457. package/dist/synth/gaps.d.ts +17 -0
  458. package/dist/synth/gaps.d.ts.map +1 -0
  459. package/dist/synth/gaps.js +57 -0
  460. package/dist/synth/gaps.js.map +1 -0
  461. package/dist/synth/index.d.ts +6 -0
  462. package/dist/synth/index.d.ts.map +1 -0
  463. package/dist/synth/index.js +6 -0
  464. package/dist/synth/index.js.map +1 -0
  465. package/dist/synth/intent.d.ts +6 -0
  466. package/dist/synth/intent.d.ts.map +1 -0
  467. package/dist/synth/intent.js +13 -0
  468. package/dist/synth/intent.js.map +1 -0
  469. package/dist/synth/intents/daily-report.d.ts +7 -0
  470. package/dist/synth/intents/daily-report.d.ts.map +1 -0
  471. package/dist/synth/intents/daily-report.js +37 -0
  472. package/dist/synth/intents/daily-report.js.map +1 -0
  473. package/dist/synth/intents/index.d.ts +2 -0
  474. package/dist/synth/intents/index.d.ts.map +1 -0
  475. package/dist/synth/intents/index.js +12 -0
  476. package/dist/synth/intents/index.js.map +1 -0
  477. package/dist/synth/intents/person-strategy.d.ts +40 -0
  478. package/dist/synth/intents/person-strategy.d.ts.map +1 -0
  479. package/dist/synth/intents/person-strategy.js +66 -0
  480. package/dist/synth/intents/person-strategy.js.map +1 -0
  481. package/dist/synth/intents/recall.d.ts +8 -0
  482. package/dist/synth/intents/recall.d.ts.map +1 -0
  483. package/dist/synth/intents/recall.js +26 -0
  484. package/dist/synth/intents/recall.js.map +1 -0
  485. package/dist/synth/intents/troubleshoot.d.ts +11 -0
  486. package/dist/synth/intents/troubleshoot.d.ts.map +1 -0
  487. package/dist/synth/intents/troubleshoot.js +66 -0
  488. package/dist/synth/intents/troubleshoot.js.map +1 -0
  489. package/dist/synth/scope.d.ts +13 -0
  490. package/dist/synth/scope.d.ts.map +1 -0
  491. package/dist/synth/scope.js +139 -0
  492. package/dist/synth/scope.js.map +1 -0
  493. package/dist/synth/types.d.ts +117 -0
  494. package/dist/synth/types.d.ts.map +1 -0
  495. package/dist/synth/types.js +2 -0
  496. package/dist/synth/types.js.map +1 -0
  497. package/package.json +18 -6
@@ -0,0 +1,816 @@
1
+ <p align="center">
2
+ <h1 align="center">Memoark</h1>
3
+ <p align="center"><em>人是一切社会关系的总和。</em></p>
4
+ <p align="center"><strong>一个面向个人工作场景的、本地优先的记忆系统 —— 把你的私聊、群聊、邮件、文档、会议,沉淀成本地私有的个人记忆,让你的 AI Agent 最懂你。</strong></p>
5
+ </p>
6
+
7
+ <p align="center">
8
+ 简体中文 | <a href="README.en.md">English</a>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="LICENSE"><img alt="License: Apache 2.0" src="https://img.shields.io/badge/License-Apache_2.0-blue.svg"></a>
13
+ <a href="https://www.npmjs.com/package/@andre.li/memoark"><img alt="npm" src="https://img.shields.io/npm/v/@andre.li/memoark?color=cb3837&logo=npm"></a>
14
+ <img alt="Runtime: Bun" src="https://img.shields.io/badge/runtime-Bun-black">
15
+ <img alt="Language: TypeScript" src="https://img.shields.io/badge/lang-TypeScript-3178c6">
16
+ <img alt="Tests: 1000+" src="https://img.shields.io/badge/tests-1000%2B-success">
17
+ </p>
18
+
19
+ <p align="center">
20
+ <img src="docs/assets/web-ui-graph.jpeg" alt="Memoark 知识图谱 —— 实体、决策、任务、知识在你的工作中相互连接" width="850">
21
+ <br>
22
+ <em>把你的工作变成一张活的知识图谱 —— 人、决策、任务、知识,全部连起来。</em>
23
+ </p>
24
+
25
+ <!-- TODO(demo): 在此处替换为一段 8~12 秒的演示 GIF —— 在 Claude Code 里向 Memoark 提问,
26
+ Agent 通过 MCP 召回一条飞书会议决策 + 关联任务。脚本见 docs(hero demo)。
27
+ 研究表明,"展示产品真正在工作"的 GIF 是 README 转化率最高的单一要素。 -->
28
+
29
+ ---
30
+
31
+ ## 痛点
32
+
33
+ 你的工作记忆有两个家,而你的 AI Agent 一个都够不着。
34
+
35
+ - **飞书**承载你的工作关系网 — 私信、群聊、邮件、会议、文档、任务。这是你*在做什么*、*和谁一起做*。
36
+ - **AI Agent**(Claude Code、Codex、OpenClaw)承载你的构建过程 — 每次编程会话里的决策、发现和踩过的坑。
37
+
38
+ 但每次打开新的 Agent 会话,它都一无所知。你得重新解释你是谁、项目是什么、上周决定了什么、为什么。上下文明明*就在某处* — 埋在你再也不会翻的聊天记录和会话日志里。
39
+
40
+ **你不是记忆力差,你是信息碎片化 — 而你的 Agent 每天都在为此买单。**
41
+
42
+ ## 解决方案
43
+
44
+ Memoark 是一个**面向中国职场、本地优先的个人记忆系统**。中国职场的工作发生在飞书、钉钉、企业微信里 —— 我们把这些工具里的私聊、群聊、邮件、会议、文档,连同你与 AI Agent 的会话,一起提取成结构化信号(实体、决策、任务、发现、知识、关系),汇入你自己机器上一个统一、可搜索的知识图谱,再通过 **MCP** 把这份记忆喂回给任何 Agent。
45
+
46
+ > 一期(MVP)聚焦**飞书**全量采集;**钉钉、企业微信**等更多中国职场工具在路线图上(见下方)。
47
+
48
+ 结果是:你的 Agent 既**写入**又**读取**同一份记忆 —— 让 Claude Code、Codex 以及任何 MCP 客户端,终于*懂你和你的工作*。
49
+
50
+ ```
51
+ 飞书工作流 AI Agent 会话
52
+ (私信 / 群聊 / 邮件 (Claude Code / Codex
53
+ 会议 / 文档 / 任务) / OpenClaw)
54
+ │ │
55
+ └───────────────┬───────────────┘
56
+ ▼ 采集 + 抽取(本地)
57
+ ┌──────────────────┐
58
+ │ 你的核心记忆 │ 实体 · 决策 · 任务
59
+ │ (PGLite, 本地) │ 知识 · 时间线 · 图谱
60
+ └────────┬─────────┘
61
+ ▼ MCP
62
+ 你的 Agent 懂你
63
+
64
+ └──── Agent 用得越多,记忆越懂你 ───┘
65
+ ```
66
+
67
+ > "我昨天在飞书和同事讨论了一个方案,今天在 Claude Code 里实现了一部分,下周还有个评审会。"
68
+ >
69
+ > Memoark 自动把这三件事串起来 —— 跨平台、跨时间 —— 并在你需要时把完整脉络交给 Agent。
70
+
71
+ ## 三大支柱
72
+
73
+ **🔒 本地优先,绝对私密**
74
+ 数据永远不离开你的机器。PGLite 嵌入式数据库存储一切,可选 Ollama 本地向量嵌入,无任何云依赖。双轨隐私脱敏(可逆 / 不可逆)在写入前清洗敏感信息。
75
+
76
+ **🕸️ 实体知识图谱,而非一堆向量分块**
77
+ 信号被锚定到实体(人、项目、工具)并以有向图相互链接。你得到的是有上下文的答案 —— 谁、为什么、和什么相关 —— 而不是孤立的相似文本片段。
78
+
79
+ **🤖 MCP 原生 + 飞书采集**
80
+ **29 个内置 MCP 工具**让任何 Agent 既查询又写回你的记忆。飞书全量采集(7 个源)把你真实的工作 —— 需求、方案、团队决策 —— 变成一等数据源,这是纯 RAG 和笔记工具都做不到的。
81
+
82
+ ## 核心特性
83
+
84
+ **🛰️ 飞书全量采集**
85
+ 你的工作在飞书里。Memoark 覆盖 **7 个源** —— 私信、群聊、邮件、日历、文档、任务、消息搜索 —— 把你的工作关系网变成结构化记忆。文档采集会生成可升级的"摘要卡片"(DocSource v2)。
86
+
87
+ **🤖 让 Agent 懂你(MCP)**
88
+ 把 Memoark 作为任何 MCP Agent 的记忆层 —— Claude Code、Cursor、Claude Desktop、Windsurf。**29 个内置工具**让 Agent 查询历史、读取实体页面、写回新知识。Agent 既是记忆的生产者,也是消费者。
89
+
90
+ **🧠 AI 驱动信号提取**
91
+ LLM 驱动的 Pipeline 从原始对话中提取 7 类结构化信号:实体、时间线、决策、任务、发现、知识、关系。
92
+
93
+ **🔍 混合语义搜索**
94
+ 全文搜索(tsvector,支持中文)+ 向量检索(pgvector),通过 RRF(Reciprocal Rank Fusion)融合排序。支持自然语言提问。
95
+
96
+ **♻️ 记忆巩固(Dream Cycle)**
97
+ 后台巩固任务自动做分层轮转(hot → warm → cold)、死链修复、偏好推断 —— 让记忆随时间自我整理。
98
+
99
+ **⏰ 常驻 Daemon + 定时采集**
100
+ 内置守护进程按计划自动采集各数据源,带运行历史与告警,让记忆持续保持新鲜。
101
+
102
+ **🔗 Obsidian 双向同步**
103
+ 把记忆页面导出为 Obsidian vault(Markdown),编辑后再导入回来。
104
+
105
+ **🕸️ 知识图谱 + Web UI**
106
+ 看见人、项目、决策之间的关联。内置 Web UI 提供 Dashboard、时间线、力导向知识图谱和搜索。
107
+
108
+ **🔌 REST API**
109
+ 基于 Hono 的 HTTP API,暴露所有存储操作。
110
+
111
+ ## 功能清单
112
+
113
+ 完整的能力清单(✅ = 已实现并随包发布)。
114
+
115
+ ### 📥 数据采集
116
+ - ✅ 飞书群聊(OpenAPI chat/message)
117
+ - ✅ 飞书私信 / 最近会话(lark-cli `message_search`,user 态)
118
+ - ✅ 飞书邮件
119
+ - ✅ 飞书日历事件
120
+ - ✅ 飞书任务
121
+ - ✅ 飞书文档摘要卡片(DocSource v2:pointer 卡 → 触发后升级完整卡)
122
+ - ✅ Claude Code 会话(`~/.claude/projects/`)
123
+ - ✅ Codex CLI 会话(`~/.codex/`)
124
+ - ✅ OpenClaw Hermes 多 Agent 会话(`~/.openclaw/agents/`,自动发现子 Agent)
125
+ - ✅ 增量采集:按源 cursor + 内容 hash 去重
126
+ - ✅ 历史回填(backfill):覆盖范围统计、启动 / 取消 / 重置
127
+
128
+ ### 🧠 信号提取 Pipeline
129
+ - ✅ 采集 → 去重 → 分块(Block Builder)→ 噪声过滤 → 信号提取 → 隐私脱敏
130
+ - ✅ 双层噪声过滤:L1 规则 + L2 LLM 打分
131
+ - ✅ 7 类结构化信号:实体、时间线、决策、任务、发现、知识、关系
132
+ - ✅ LLM 提供方:OpenAI / Anthropic(含 mock,便于测试)
133
+ - ✅ 信号打分(signal scoring)与实体抽取
134
+ - ✅ JSON / Markdown 两种输出格式
135
+ - ✅ 输出适配器:store(PGLite)/ file / gbrain / stdout
136
+ - ✅ 来源溯源(provenance):每条信号可追溯到原始消息
137
+
138
+ ### 🔒 隐私与安全
139
+ - ✅ 写入前脱敏,数据全程本地
140
+ - ✅ 双轨模式:可逆(reversible)/ 不可逆(irreversible)
141
+ - ✅ 内置脱敏:手机号、身份证、银行卡,可自定义替换符
142
+ - ✅ 配置中心 API key 全程掩码显示
143
+
144
+ ### 🗄️ 存储与检索
145
+ - ✅ PGLite 嵌入式 PostgreSQL(进程内,零外部依赖)
146
+ - ✅ pgvector 向量检索
147
+ - ✅ tsvector 全文检索(simple 分词器,支持中文)
148
+ - ✅ RRF 混合搜索(全文 + 向量融合排序),compiled_truth / backlink 加权
149
+ - ✅ 递归文本分块(300 词 / 50 词重叠),嵌入复用与过期检测
150
+ - ✅ 向量嵌入:OpenAI / Ollama(本地)
151
+
152
+ ### 🕸️ 知识图谱
153
+ - ✅ 有向链接图,带链接类型与上下文
154
+ - ✅ BFS 图遍历(可控深度 / 方向)
155
+ - ✅ 反向链接(backlinks)
156
+ - ✅ 实体锚定:信号挂到人 / 项目 / 工具
157
+ - ✅ 实体画像聚合(profile:信号 + 时间线)
158
+
159
+ ### 👤 人物身份管理
160
+ - ✅ 身份解析与规范化(canonicalize)
161
+ - ✅ 别名 / handle 绑定(飞书 open_id、邮箱、姓名、昵称、slug)
162
+ - ✅ 强 / 弱 绑定强度
163
+ - ✅ 人物合并(merge,自动重指向链接 / 时间线 / 标签 / 别名)
164
+ - ✅ 重命名规范 slug(修正错误规范化)
165
+
166
+ ### ♻️ 记忆生命周期 & 常驻服务
167
+ - ✅ 记忆巩固(dream cycle):hot → warm → cold 分层轮转
168
+ - ✅ 死链修复
169
+ - ✅ 偏好推断(从历史中归纳 preference)
170
+ - ✅ 常驻 Daemon:按源定时采集、调度、运行历史、告警
171
+
172
+ ### 🔗 同步与互通
173
+ - ✅ Obsidian 双向同步(导出 vault / 导入回库)
174
+ - ✅ MCP stdio 服务器(29 个工具)
175
+ - ✅ REST API(Hono,覆盖页面 / 搜索 / 图谱 / 标签 / 时间线 / 嵌入 / 提取 / 溯源 / 事件流)
176
+
177
+ ### 🖥️ Web UI(React + Vite)
178
+ - ✅ Dashboard 概览
179
+ - ✅ 时间线视图(feed)
180
+ - ✅ 力导向知识图谱
181
+ - ✅ 搜索界面
182
+ - ✅ 实体 / 页面详情
183
+ - ✅ 浏览器内配置编辑 + 引导式 setup 向导
184
+
185
+ ### ⚙️ 配置与上手
186
+ - ✅ 交互式配置中心(全屏 TUI,React + ink)
187
+ - ✅ 线性问答向导 fallback(`--no-tui`)/ 全自动(`--auto`)
188
+ - ✅ 自动检测:运行时、API key、已有数据源
189
+ - ✅ 硬件评估 → 推荐本地 / 远程 Embedding
190
+ - ✅ 实时连接测试(LLM / Embedding API key 与连通性)
191
+ - ✅ `memoark doctor` 环境诊断
192
+
193
+ ## 适配的 MCP 客户端
194
+
195
+ Memoark 是标准 MCP stdio 服务器,可接入任何 MCP 客户端:
196
+
197
+ **Claude Code** · **Cursor** · **Claude Desktop** · **Windsurf** · 以及任何兼容 MCP 的 Agent。
198
+
199
+ ## 使用场景
200
+
201
+ > Memoark 回答的不是"我知道什么",而是"**我该怎么做**"——每个场景的输出都是**带 `[n]` 引用、可溯源的行动建议**。
202
+
203
+ **🌟 见人之前,先想好怎么沟通(Hero)**
204
+ *"我明天要见张总,谈续约涨价,该注意什么?"* —— `prep_for_person` 从你和张总的真实互动里**被动推断**出沟通画像(直接还是委婉、看数据还是看关系、有哪些雷区),结合本次目标给出沟通建议,并提醒缺口(*"你已 18 天没有他的新信息,画像可能过时"*)。零问卷,画像永不出本机。
205
+
206
+ **📋 一句话生成跨渠道日报**
207
+ *"帮我生成今天的日报"* —— `daily_report` 把今天散落在私聊、群聊、邮件、妙记会议纪要、日历里的信号,聚合成 7 段:今日决策 / 推进中 / 我的待办 / 待回复·被@ / 人脉动态 / 明日提醒。会议纪要里点到你名字的待办,自动进"我的待办"。
208
+
209
+ **🔧 按手册排查问题**
210
+ *"智驾为什么无法激活?"* —— `troubleshoot` 沿 playbook 的排查链给出有序步骤,并解释每一步不同结果代表什么。排查手册可以手动沉淀,也能从你帮人排查的对话里自动抽取成草稿。
211
+
212
+ **⚡ 让 Agent 几秒接手一个项目**
213
+ *"memoark 这个项目现在进展如何?"* —— `get_session_context` 直接拉出聚合的决策、待办和最近时间线,无需你重新解释。
214
+
215
+ **🔎 回忆某人、某件事**
216
+ *"我上周和这位同事聊了什么?"* —— 把飞书私信、会议、后续任务串成一个带引用的答案。
217
+
218
+ ## 为什么选 Memoark
219
+
220
+ | | Memoark | 纯 RAG / 向量检索 | 笔记工具(Obsidian / Notion) | GBrain | OpenHuman |
221
+ |---|:---:|:---:|:---:|:---:|:---:|
222
+ | 本地优先 & 私密 | ✅ | 视情况 | 视情况 | ✅ | ✅ |
223
+ | 开源 | ✅ | 不一定 | 部分 | 部分 | ✅ |
224
+ | 飞书工作采集(私信/群聊/邮件/会议/文档/任务) | ✅ | ❌ | 手动 | ❌ | ❌ |
225
+ | 把 AI Agent 会话作为数据源 | ✅ | ❌ | ❌ | ✅ | ✅ |
226
+ | Agent 原生:通过 MCP 既读**又**写 | ✅ | ❌ | ❌ | ✅ | 部分 |
227
+ | 实体 + 关系知识图谱 | ✅ | ❌ | 手动 | ✅ | 部分 |
228
+ | 结构化信号提取(不只是分块) | ✅ | ❌ | ❌ | ✅ | ✅ |
229
+ | 记忆巩固 + 定时采集 daemon | ✅ | ❌ | ❌ | 部分 | 部分 |
230
+
231
+ > 纯 RAG 只有向量、没有实体和关系,回答缺乏上下文;笔记工具强大但依赖手动维护。Memoark 保持本地、Agent 原生 —— 并把飞书工作作为一等数据源。
232
+
233
+ ## 快速开始
234
+
235
+ ### 一键启动(推荐)
236
+
237
+ ```bash
238
+ # 免安装直接运行 —— 没有配置会自动引导 setup 向导,完成后自动起服务并打开浏览器
239
+ npx @andre.li/memoark start
240
+
241
+ # 不带任何子命令也等效于 start
242
+ npx @andre.li/memoark
243
+ ```
244
+
245
+ `memoark start` 是单步上手路径:检测到没有 `memoark.yaml` 时先拉起浏览器 setup 向导,配置完成后立即启动 HTTP 服务并自动打开浏览器。
246
+
247
+ > npm 包名为 `@andre.li/memoark`(作用域包),但命令名仍是 `memoark`。
248
+
249
+ ### 端口一览
250
+
251
+ | 服务 | 默认端口 | 地址 |
252
+ |------|---------|------|
253
+ | HTTP API + Web UI | `3927` | `http://localhost:3927` |
254
+ | MCP Streamable HTTP(`--mcp-http`) | `3928` | `http://localhost:3928/mcp` |
255
+
256
+ ### 30 秒上手(手动配置)
257
+
258
+ ```bash
259
+ # 只想先生成配置、不立即起服务 —— 启动交互式配置中心
260
+ npx @andre.li/memoark init
261
+ ```
262
+
263
+ ### 前置条件
264
+
265
+ - [Node.js](https://nodejs.org) >= 18(用 `npx` / `npm` 安装时)
266
+ - (可选)[Ollama](https://ollama.ai) 本地嵌入
267
+
268
+ ### 安装方式
269
+
270
+ ```bash
271
+ # 方式 A:免安装直接运行
272
+ npx @andre.li/memoark --help
273
+
274
+ # 方式 B:全局安装,得到 memoark 命令
275
+ npm install -g @andre.li/memoark
276
+
277
+ # 方式 C:从源码安装(开发)
278
+ git clone https://github.com/AndreLYL/memoark.git
279
+ cd memoark
280
+ bun install
281
+ npm link # 注册 memoark 全局命令
282
+ ```
283
+
284
+ ### 初始化配置
285
+
286
+ `memoark init` 启动一个**交互式配置中心**(基于 React + ink 的全屏 TUI),让你零手写地生成 / 编辑 `memoark.yaml`:
287
+
288
+ ```bash
289
+ memoark init
290
+ ```
291
+
292
+ **配置中心特性:**
293
+ - 📋 **分区编辑**:Overview、LLM、Embedding、数据源、隐私、分块(Block Builder)等分区
294
+ - ⌨️ **键盘操作**:↑/↓ 或 Tab 切换字段,Enter 编辑,Ctrl+S 保存,q / Esc 退出(有改动会自动保存)
295
+ - 🔌 **实时连接测试**:编辑 LLM / Embedding 时自动校验 API key 与连通性
296
+ - 💡 **智能推荐**:根据本机硬件推荐本地(Ollama)或远程(OpenAI)Embedding
297
+ - 🔒 **密钥脱敏**:API key 始终掩码显示
298
+ - 🧭 **自动检测**:识别已有数据源(Claude Code、Codex、Hermes)并注册 `memoark` 命令
299
+
300
+ **运行模式:**
301
+
302
+ | 命令 / 环境 | 行为 |
303
+ |---|---|
304
+ | `memoark init`(TTY 终端下) | 全屏 TUI 配置中心 |
305
+ | `memoark init --no-tui` | 逐项问答式向导(线性 fallback) |
306
+ | `memoark init --auto` | 全自动,无提示,用检测到的默认值生成 |
307
+ | `memoark init --force` | 覆盖已有配置 |
308
+ | `MEMOARK_NO_TUI=1` | 强制禁用 TUI(非 TTY 环境也会自动 fallback) |
309
+
310
+ > `memoark config init` 与 `memoark init` 等价。飞书等少数高级配置目前需直接编辑 `memoark.yaml`(见下方飞书章节)。
311
+
312
+ ### 检查环境
313
+
314
+ ```bash
315
+ memoark doctor
316
+ ```
317
+
318
+ ### 运行提取
319
+
320
+ ```bash
321
+ # 从 Claude Code 提取
322
+ memoark extract --source claude-code
323
+
324
+ # 从 Codex 提取
325
+ memoark extract --source codex
326
+
327
+ # 从所有启用的数据源提取
328
+ memoark extract --source all
329
+
330
+ # 干跑模式(不调用 LLM,仅扫描数据量)
331
+ memoark extract --source claude-code --dry-run
332
+ ```
333
+
334
+ ### 飞书私聊/群聊提取
335
+
336
+ 飞书消息有两条不同路径:
337
+
338
+ - `sources.feishu.sources.messages` 使用 OpenAPI chat/message 接口,适合明确群聊 `chat_id` 或自动发现到的群聊。
339
+ - `sources.feishu.sources.message_search` 使用 `lark-cli im +messages-search`,适合 user-mode 下搜索最近私聊和群聊。私聊机器人对话通常需要这条路径,否则最近三天会明显少数据。
340
+
341
+ 本地需要先完成 lark-cli 的飞书用户态登录,并在 `memoark.yaml` 打开 `message_search`:
342
+
343
+ ```yaml
344
+ llm:
345
+ provider: openai
346
+ model: gpt-4.1-mini
347
+ api_key: ${TOKENFREE_API_KEY}
348
+
349
+ sources:
350
+ feishu:
351
+ enabled: true
352
+ auth_mode: user
353
+ app_id: ${FEISHU_APP_ID}
354
+ app_secret: ${FEISHU_APP_SECRET}
355
+ sources:
356
+ messages:
357
+ enabled: true
358
+ chat_ids: []
359
+ lookback_days: 3
360
+ message_search:
361
+ enabled: true
362
+ chat_types:
363
+ - p2p
364
+ # - group
365
+ lookback_days: 3
366
+ page_size: 50
367
+ ```
368
+
369
+ 然后运行:
370
+
371
+ ```bash
372
+ bun src/cli.ts extract --source feishu --adapter store --since 3d
373
+ ```
374
+
375
+ `--dry-run` 只验证采集数量,不写数据库、不提交 cursor:
376
+
377
+ ```bash
378
+ bun src/cli.ts extract --source feishu --adapter store --since 3d --dry-run
379
+ ```
380
+
381
+ ### 飞书文档摘要卡片(DocSource v2)
382
+
383
+ Memoark 可以把飞书文档采集为可升级的"摘要卡片":先建立轻量的 pointer 卡,被触发后再升级为完整摘要卡。
384
+
385
+ ```bash
386
+ # 扫描飞书文档,建立 pointer 卡,并把触发的文档升级为完整卡
387
+ memoark docs sync
388
+
389
+ # 查看各类文档卡片数量
390
+ memoark docs status
391
+
392
+ # 重试某个失败文档的完整卡提取(或 --all-failed 重试全部)
393
+ memoark docs retry <doc_token>
394
+ memoark docs retry --all-failed
395
+ ```
396
+
397
+ Agent 也可以通过 MCP 工具 `ingest_feishu_doc`(传入文档 URL 或 token)直接采集单篇文档。
398
+
399
+ ### 增量状态与重建
400
+
401
+ Memoark 的增量状态分两层:
402
+
403
+ - 数据库:默认在 `~/.memoark/data`,保存提取后的页面、chunk、关系和时间线。
404
+ - 运行状态:当前仓库的 `.memoark/cursors.yaml` 和 `.memoark/dedup.jsonl`,分别保存源 cursor 和消息去重 hash。
405
+
406
+ 正常增量运行不要手动删这些文件。需要删除某个源的过期提取结果并重跑时,用内置命令,它会先备份数据库和 `.memoark`:
407
+
408
+ ```bash
409
+ # 先预览会删除多少内容
410
+ bun src/cli.ts store purge-source feishu
411
+
412
+ # 确认后清理飞书结果、飞书 cursor,并重置旧格式 dedup
413
+ bun src/cli.ts store purge-source feishu --yes
414
+
415
+ # 再跑最近三天
416
+ bun src/cli.ts extract --source feishu --adapter store --since 3d
417
+ ```
418
+
419
+ 旧版 `dedup.jsonl` 只记录 hash,没有记录来源平台,所以彻底重跑飞书时默认会备份后清空整个 dedup。后续增量会重新建立去重状态。
420
+
421
+ ### 搜索记忆
422
+
423
+ ```bash
424
+ # 混合搜索(全文 + 向量)
425
+ memoark search "认证中间件决策"
426
+
427
+ # 仅全文搜索
428
+ memoark search "JWT token" --mode fts
429
+ ```
430
+
431
+ ### 启动服务器
432
+
433
+ ```bash
434
+ # HTTP API + Web UI(默认 http://localhost:3927)—— 启动后自动打开浏览器
435
+ memoark serve
436
+
437
+ # 不想自动开浏览器(比如在远程 / 服务器上跑)
438
+ memoark serve --no-open
439
+
440
+ # MCP stdio(AI Agent 本地直连 — Claude Code、Cursor 等,不开浏览器)
441
+ memoark serve --mcp
442
+
443
+ # MCP Streamable HTTP(远程 / 多客户端,默认 http://localhost:3928/mcp,不开浏览器)
444
+ memoark serve --mcp-http
445
+ ```
446
+
447
+ > 缺少 `memoark.yaml` 时 `serve` 会提示先用 `memoark start` 一步配置 + 启动,或 `memoark init --web` 先完成配置。
448
+
449
+ ### 接入你的 Agent(MCP)
450
+
451
+ **一键接入(推荐)**:`memoark install` 会自动把 MCP 配置 + 一份极简「记忆指令」写进你的 AI 客户端(**默认全局**,对所有项目生效),支持 **Claude Code · Claude Desktop · Cursor · Codex · Windsurf**:
452
+
453
+ ```bash
454
+ memoark install # 探测本机已装的客户端并接入
455
+ memoark install --agent claude-code # 指定单个客户端
456
+ memoark install --dry-run # 先预览会改哪些文件,不写盘
457
+ memoark uninstall # 干净移除(幂等)
458
+ ```
459
+
460
+ 装完重开客户端即可——之后你问「X 上周跟我聊了啥」「这个项目推进到哪了」,Agent 会按注入的「记忆指令」**主动来 Memoark 检索**(cheap-first:先 `search` 零成本关键词,不够再 `query`/`recall`),而不是凭空作答。
461
+
462
+ > Claude Desktop 没有规则文件,靠 MCP server 的 `instructions` 字段兜底。也可按下面的方式手动配置。
463
+
464
+ **Claude Code 自动召回(可选 · hooks)**:在 Claude Code 上更进一步,让记忆「零感知」自动到手:
465
+
466
+ ```bash
467
+ memoark hooks install # SessionStart + UserPromptSubmit 读侧 hook(默认开)
468
+ memoark hooks install --write-back # 额外开启会话结束自动写回(opt-in)
469
+ memoark hooks uninstall # 移除
470
+ ```
471
+
472
+ - **SessionStart**:开新会话自动注入「近期项目 / 决策 / 待办 / 关键人」摘要(常驻 core)。
473
+ - **UserPromptSubmit**:每条提问前用**零成本 FTS** 试召回,命中才注入(限 3 条、≤3000 字符、追加在用户消息后以保 prompt 缓存)。
474
+ - **SessionEnd**(`--write-back`,默认关):会话结束**异步增量**抽取写回,记忆自生长。
475
+
476
+ > 读侧默认开(本地、便宜);写回需显式 `--write-back`(成本 + 隐私,逐项 opt-in)。其它客户端没有生命周期 hook,靠上面的指令层让模型自主召回。
477
+
478
+ **让 Agent 自己接入**:对能读取外链的 Agent,直接说「按 [`MEMOARK_FOR_AGENTS.md`](MEMOARK_FOR_AGENTS.md) 把我接入 Memoark」,它会自跑上面的命令完成接入并自检。**OpenClaw / Hermes** 用 `memoark install --agent hermes`(写 `config.yaml` 的 `mcp_servers` + 铺 `memoark` skill,会话里 `/reload-mcp` 生效);也可 `memoark skill scaffold --dir ~/.hermes/skills` 单独铺 skill。
479
+
480
+ Memoark 提供两种 MCP 接入方式,按场景选:
481
+
482
+ - **stdio(`--mcp`)** —— 本地直连,Agent 把 `memoark` 作为子进程拉起,零网络配置,单机单客户端首选。
483
+ - **Streamable HTTP(`--mcp-http`)** —— 走 HTTP(默认 `3928`),适合远程接入或多个客户端共享同一份记忆。
484
+
485
+ 让任何 MCP 客户端指向 Memoark,即可读写你的记忆。以 Claude Code 为例(stdio 本地直连):
486
+
487
+ ```json
488
+ {
489
+ "mcpServers": {
490
+ "memoark": {
491
+ "command": "memoark",
492
+ "args": ["serve", "--mcp"]
493
+ }
494
+ }
495
+ }
496
+ ```
497
+
498
+ 然后就可以让 Agent *"在我的记忆里搜一下 auth 重构的决策"* 或 *"项目 X 还有哪些未完成任务?"* —— 它会从你的本地记忆作答。
499
+
500
+ ### 浏览 Web UI
501
+
502
+ ```bash
503
+ cd web
504
+ bun install
505
+ bun run dev # Dashboard、时间线、知识图谱、搜索
506
+ ```
507
+
508
+ ## 架构
509
+
510
+ Memoark 是 **5 层纵向数据流 + 3 个横切关注点**。数据自上而下流动:数据源被采集、提取成信号、存入本地记忆,再由底层接口对外读写;**人物身份**与**记忆巩固**、**调度**则横切贯穿其间。
511
+
512
+ <p align="center">
513
+ <img src="docs/assets/architecture.png" alt="Memoark 架构图 —— 5 层纵向数据流 + 3 个横切关注点" width="920">
514
+ </p>
515
+
516
+ <details>
517
+ <summary>📐 查看可编辑的 Mermaid 源码</summary>
518
+
519
+ ```mermaid
520
+ flowchart TB
521
+ subgraph L1["① 配置与上手层"]
522
+ cfg["TUI 配置中心 · Web UI 配置 · memoark.yaml<br/>自动检测 · 硬件评估 · 连接测试"]
523
+ end
524
+ subgraph L2["② 采集层"]
525
+ feishu["飞书:私聊 · 群聊 · 邮件 · 日历 · 任务 · 消息搜索 · 云文档"]
526
+ agent["AI Agent 会话:Claude Code · Codex · Hermes"]
527
+ inc["增量采集(cursor + 去重) · 历史回溯 Backfill"]
528
+ planned1["规划中:钉钉 · 企业微信 · 本地文档"]:::planned
529
+ end
530
+ subgraph L3["③ 信号提取 Pipeline"]
531
+ pipe["分块 → 噪声过滤(规则+LLM) → 信号抽取(OpenAI/Anthropic)<br/>→ 实体抽取 → 打分 → 隐私脱敏 → 7 类信号"]
532
+ end
533
+ subgraph L4["④ 记忆存储层"]
534
+ store["PGLite + pgvector<br/>Page · Chunk · Tag · Timeline · Graph<br/>混合检索(全文 + 向量 + RRF)"]
535
+ end
536
+ subgraph L5["⑤ 接口与消费层"]
537
+ cli["CLI"]
538
+ mcp["MCP(29 工具)"]
539
+ rest["REST API"]
540
+ web["Web UI(只读)"]
541
+ obs["Obsidian 双向同步"]
542
+ end
543
+
544
+ L1 --> L2 --> L3 --> L4 --> L5
545
+
546
+ subgraph X["横切关注点"]
547
+ id["🧬 人物身份<br/>跨平台同一人归并"]
548
+ cons["♻️ 记忆巩固 Dream Cycle<br/>分层轮转 · 死链修复 · 偏好推断"]
549
+ sched["⏰ 调度 / AutoFetch<br/>定时采集 · 运行历史 · 告警"]
550
+ end
551
+
552
+ id -.-> L2
553
+ id -.-> L4
554
+ cons -.-> L4
555
+ sched -.-> L2
556
+
557
+ classDef planned stroke-dasharray: 5 5,fill:#f6f6f6,color:#888;
558
+ ```
559
+
560
+ </details>
561
+
562
+ ### 分层说明
563
+
564
+ | 层 | 职责 |
565
+ |----|------|
566
+ | **① 配置与上手层** | TUI 配置中心(React + ink)、Web UI 配置、`memoark.yaml` 手编;自动检测运行时 / API key / 数据源,硬件评估推荐 Embedding,实时连接测试 |
567
+ | **② 采集层** | 飞书(私聊 / 群聊 / 邮件 / 日历 / 任务 / 消息搜索 / 云文档)、AI Agent 会话(Claude Code / Codex / Hermes);增量采集(per-source cursor + 内容去重)、历史回溯 Backfill。**规划中**:钉钉、企业微信、本地文档 |
568
+ | **③ 信号提取 Pipeline** | 分块 → 噪声过滤(L1 规则 + L2 LLM)→ 信号抽取(OpenAI / Anthropic)→ 实体抽取 → 打分 → 隐私脱敏;产出 7 类信号,经输出适配器(store / file / gbrain / stdout)落库 |
569
+ | **④ 记忆存储层** | PGLite(进程内嵌入式 PostgreSQL)+ pgvector;Page / Chunk / Tag / Timeline / Graph 存储;混合检索(tsvector 全文 + 向量 + RRF) |
570
+ | **⑤ 接口与消费层** | CLI、MCP Server(29 工具,Agent 读 / 写 / 维护)、REST API(Hono)、Web UI(检索 / 查看 / 图谱 / 时间线,**当前只读**)、Obsidian 双向同步 |
571
+
572
+ **横切关注点(贯穿多层,而非独立流水线层):**
573
+
574
+ - **🧬 人物身份** — 贯穿「采集 ↔ 存储」:跨平台(飞书 open_id、邮箱、昵称)识别并归并同一个人,别名绑定、规范化。这是「社会关系总和」的地基。
575
+ - **♻️ 记忆巩固(Dream Cycle)** — 后台旁路作用于存储层:hot → warm → cold 分层轮转、死链修复、偏好推断,让记忆自我整理。
576
+ - **⏰ 调度 / AutoFetch** — 后台驱动采集层:定时自动采集、运行历史、告警。*(当前运行于 `serve` 进程内;独立 daemon 服务化 + 开机自启见路线图。)*
577
+
578
+ > 运行平台:macOS / Linux / Windows · 一键安装(npm / npx)· 本地优先、自托管、零云依赖。
579
+
580
+ ### 信号类型
581
+
582
+ | 信号类型 | 说明 | 示例 |
583
+ |---------|------|------|
584
+ | **实体** | 人物、项目、工具、概念 | `project/memoark`, `tool/claude-code` |
585
+ | **时间线** | 关键事件及时间戳 | "2026-05-19: 完成多平台采集器重构" |
586
+ | **决策** | 架构选型、技术决策及其理由 | "选择 PGLite 作为嵌入式 PostgreSQL 方案" |
587
+ | **任务** | 待办事项及状态追踪 | `[open] 实现 token 自动刷新` |
588
+ | **发现** | 技术洞察、bug 根因、edge case | "UUID v4 不可按字典序排序" |
589
+ | **知识** | 可复用的事实性知识 | "PGLite 通过 WASM 在进程内运行完整 Postgres" |
590
+ | **关系** | 实体间的依赖、引用、协作 | `project/memoark --[depends_on]--> tool/pglite` |
591
+
592
+ ### 存储层
593
+
594
+ | 组件 | 说明 |
595
+ |------|------|
596
+ | **PageStore** | Wiki 风格页面,YAML frontmatter,CRUD |
597
+ | **ChunkStore** | 递归文本分块(300 词,50 词重叠),嵌入复用 |
598
+ | **SearchEngine** | tsvector 全文搜索 + pgvector 向量搜索,RRF 融合排序 |
599
+ | **GraphStore** | 有向链接图,BFS 遍历,链接类型过滤,反向链接 |
600
+ | **TagStore** | 页面标签,冲突安全 upsert |
601
+ | **TimelineStore** | 按时间排序的条目,去重 |
602
+ | **EmbeddingService** | OpenAI / Ollama 批量嵌入,过期 chunk 检测 |
603
+
604
+ ## MCP 工具
605
+
606
+ Memoark 的 MCP 服务器暴露 **29 个工具**,覆盖检索、合成、页面 CRUD、图谱、标签、时间线、身份管理与飞书文档采集。高层工具优先:
607
+
608
+ | 类别 | 工具 |
609
+ |------|------|
610
+ | **检索(高层)** | `query`、`get_session_context`、`get_entity_profile`、`list_signals_by_entity` |
611
+ | **合成** | `synthesize`、`recall`(带 `[n]` 引用的成段答案 + gap 分析)、`prep_for_person`(人物沟通画像 → 目标条件化的沟通策略,被动推断·零问卷·本地优先·伦理护栏)、`daily_report`(跨渠道 7 段日报)、`troubleshoot`(沿 playbook 排查链一次性排查) |
612
+ | **搜索** | `search` |
613
+ | **页面 / 内容** | `get_page`、`put_page`、`list_pages`、`get_chunks` |
614
+ | **图谱** | `add_link`、`remove_link`、`get_links`、`get_backlinks`、`traverse_graph` |
615
+ | **标签** | `add_tag`、`remove_tag`、`get_tags` |
616
+ | **时间线** | `add_timeline_entry`、`get_timeline` |
617
+ | **身份(人物)** | `link_person_alias`、`list_person_handles`、`remove_person_alias`、`merge_persons`、`recanonicalize_person` |
618
+ | **飞书文档** | `ingest_feishu_doc` |
619
+ | **健康** | `get_health` |
620
+
621
+ ## CLI 命令
622
+
623
+ | 命令 | 说明 |
624
+ |------|------|
625
+ | `memoark start` | 一键启动:无配置自动引导 setup,完成后 serve + 自动开浏览器(裸跑 `memoark` 等效) |
626
+ | `memoark init` | 交互式配置中心,生成 / 编辑 `memoark.yaml`(`--auto` / `--no-tui` / `--force` / `--web`) |
627
+ | `memoark extract` | 从数据源提取信号 |
628
+ | `memoark search <query>` | 搜索记忆(混合 / `--mode fts`) |
629
+ | `memoark embed` | 为未嵌入的 chunk 生成向量 |
630
+ | `memoark serve` | 启动 HTTP API(自动开浏览器,`--no-open` 关闭)/ `--mcp` stdio / `--mcp-http` |
631
+ | `memoark consolidate` | 运行记忆巩固(分层轮转 hot→warm / warm→cold) |
632
+ | `memoark export` | 把记忆页面导出为 Obsidian vault(Markdown) |
633
+ | `memoark import` | 把 Obsidian vault 导回 Memoark |
634
+ | `memoark docs` | 飞书文档摘要卡片:`sync` / `status` / `retry` |
635
+ | `memoark identity` | 人物身份管理:别名、合并、重命名 |
636
+ | `memoark sources` | `list` 列出 / `test <name>` 测试数据源 |
637
+ | `memoark doctor` | 诊断配置和连通性 |
638
+ | `memoark config` | `init`(等价 `memoark init`)/ `edit`(浏览器 UI 编辑) |
639
+
640
+ ### `memoark extract` 选项
641
+
642
+ ```bash
643
+ memoark extract \
644
+ --source <name> # claude-code, codex, hermes, feishu, all
645
+ --format json|markdown # 输出格式,默认 json
646
+ --adapter store|file|gbrain|stdout # 输出目标,默认 store
647
+ --since <date> # 只处理此日期之后的消息
648
+ --limit <n> # 限制消息数
649
+ --dry-run # 测试模式
650
+ ```
651
+
652
+ ## 配置
653
+
654
+ ### `memoark.yaml`
655
+
656
+ ```yaml
657
+ # 隐私配置
658
+ privacy:
659
+ enabled: true
660
+ mode: reversible # reversible(可逆)| irreversible(不可逆)
661
+ redact_phone: true
662
+ redact_id_card: true
663
+ redact_bank_card: true
664
+ replacement: "[REDACTED]"
665
+
666
+ # LLM(信号提取用)
667
+ llm:
668
+ provider: openai
669
+ model: gpt-4o-mini
670
+ api_key: ${OPENAI_API_KEY}
671
+
672
+ # 分块配置
673
+ block_builder:
674
+ block_gap_minutes: 30
675
+ max_block_tokens: 4000
676
+ max_block_messages: 100
677
+
678
+ # 数据源
679
+ sources:
680
+ claude-code:
681
+ enabled: true
682
+ codex:
683
+ enabled: true
684
+ hermes:
685
+ enabled: true
686
+
687
+ # 存储(PGLite)
688
+ store:
689
+ data_dir: ~/.memoark/data
690
+
691
+ # 嵌入
692
+ embedding:
693
+ provider: openai # openai | ollama
694
+ model: text-embedding-3-large
695
+ dimensions: 1536
696
+ api_key: ${OPENAI_API_KEY}
697
+
698
+ # 服务器
699
+ server:
700
+ http_port: 3927
701
+ ```
702
+
703
+ ## 支持的数据源
704
+
705
+ | 数据源 | 路径 | 说明 |
706
+ |--------|------|------|
707
+ | **飞书(Lark)** | API + lark-cli | 核心工作源 —— 7 个源:群聊、私信、邮件、日历、文档、任务、消息搜索 |
708
+ | **Claude Code** | `~/.claude/projects/` | Claude Code Agent 对话记录 |
709
+ | **Codex** | `~/.codex/` | OpenAI Codex CLI 会话 |
710
+ | **Hermes** | `~/.openclaw/agents/` | OpenClaw Hermes Agent 会话 |
711
+
712
+ > 飞书优先:它承载的是工作本身 —— 需求讨论、技术方案、团队决策。私信和最近会话需要先完成 `lark-cli` 用户态登录并启用 `message_search`(详见上方配置)。
713
+
714
+ ## 路线图
715
+
716
+ ### Phase 1 — 信号提取(已完成)
717
+
718
+ - [x] 多平台采集器(Claude Code、Codex、Hermes、飞书)
719
+ - [x] LLM 驱动的噪声过滤和信号提取
720
+ - [x] 7 类信号:实体、时间线、决策、任务、发现、知识、关系
721
+ - [x] 双轨隐私脱敏(可逆 + 不可逆)
722
+ - [x] JSON 和 Markdown 输出格式
723
+
724
+ ### Phase 2 — 存储 & 服务器(已完成)
725
+
726
+ - [x] PGLite 嵌入式 PostgreSQL + pgvector
727
+ - [x] PageStore、ChunkStore、TagStore、TimelineStore、GraphStore
728
+ - [x] 全文搜索(simple 分词器,支持中文)+ 向量搜索
729
+ - [x] RRF 混合搜索
730
+ - [x] EmbeddingService(OpenAI / Ollama)
731
+ - [x] StoreAdapter — Pipeline 直接写入 PGLite
732
+ - [x] Hono REST API
733
+ - [x] MCP 服务器(29 个 stdio 工具)
734
+ - [x] CLI serve、search、embed 命令
735
+
736
+ ### Phase 3 — Web UI(已完成)
737
+
738
+ - [x] Dashboard
739
+ - [x] 时间线视图
740
+ - [x] 知识图谱可视化(力导向)
741
+ - [x] 搜索界面
742
+ - [x] 实体 / 页面详情
743
+
744
+ ### Phase 4 — 巩固与常驻服务(已完成)
745
+
746
+ - [x] 记忆巩固(dream cycle):分层轮转、死链修复、偏好推断
747
+ - [x] 常驻 Daemon + 定时采集(调度、运行历史、告警)
748
+ - [x] 人物身份管理(别名、合并、重命名)
749
+ - [x] 飞书文档摘要卡片(DocSource v2)
750
+ - [x] Obsidian 双向同步(export / import)
751
+
752
+ ### Phase 5 — 常驻自托管(进行中 · MVP)
753
+
754
+ - [ ] 独立 daemon 服务化 + 开机自启(systemd / launchd / Windows 服务)—— "配置一次,后台免维护"
755
+ - [ ] Agent Hook 机制:会话结束 / 关键决策后自动读写记忆
756
+
757
+ ### Phase 6 — 更多中国职场数据源(规划中)
758
+
759
+ - [ ] 钉钉
760
+ - [ ] 企业微信
761
+ - [ ] 微信聊天记录
762
+ - [ ] 本地文档源(扫描本机文件,社区驱动 · 低优先)
763
+
764
+ ### Phase 7 — 上下文感知提取 & 问答(进行中)
765
+
766
+ - [x] 合成层(基础):`synthesize` / `recall` —— 带 `[n]` 引用的成段答案 + gap 分析、意图模板框架、逐 scope 缓存
767
+ - [x] **人物沟通画像(Hero)**:`prep_for_person(person, goal?)` —— 从真实互动**被动推断**沟通画像(行为层零-LLM 统计 + 行为四象限特质层 + 关系层 + 四色外壳),给出**目标条件化、带 `[n]` 引用**的沟通策略。零问卷·本地优先·伦理护栏(建议非操纵),默认关闭、逐人 opt-in
768
+ - [x] **跨渠道日报**:`daily_report(date?)` —— 把今天散落在私聊/群聊/邮件/妙记纪要/日历的信号聚合成 7 段日报(今日决策 / 推进中 / 我的待办 / 待回复被@ / 人脉动态 / 明日提醒);妙记纪要可抽出 `decisions` 与带 owner 的 `action_items`(owner 是我的进"我的待办")
769
+ - [x] **排查 Playbook**:`troubleshoot(query)` —— 沿 playbook 的排查链(`precedes`)给出有序步骤并解释每步结果含义;分层树(`part_of`)组织问题域,手册可手动沉淀或从排查对话自动抽取(草稿待确认)
770
+ - [x] **检索质量**:best-chunk-per-page 池化(以最强证据露出)、写入时零-LLM 自布线(`[[slug]]`/`[[rel:slug]]` 建图边)、规则式 query 改写
771
+ - [ ] ContextBuffer —— 跨 block 共享上下文
772
+ - [ ] 加权准入评分(替换二元噪声过滤)
773
+ - [ ] NarrativeAssembler —— 按实体聚合叙事
774
+ - [ ] 自然语言问答
775
+
776
+ ### Phase 8 — Web UI 增强(规划中)
777
+
778
+ - [ ] 记忆编辑(当前为只读)
779
+ - [ ] 审计视图(信号溯源可视化)
780
+
781
+ ## 技术栈
782
+
783
+ | 层 | 技术 |
784
+ |----|------|
785
+ | 语言 | TypeScript |
786
+ | 运行时 | Bun |
787
+ | 数据库 | PGLite(嵌入式 PostgreSQL) |
788
+ | 向量搜索 | pgvector |
789
+ | 嵌入 | OpenAI / Ollama |
790
+ | Web 框架 | Hono |
791
+ | Web UI | React + Vite |
792
+ | MCP | @modelcontextprotocol/sdk |
793
+ | Linter | Biome |
794
+ | 测试 | Vitest(1000+ 测试) |
795
+
796
+ ## 开发
797
+
798
+ ```bash
799
+ bun run test # 全量测试
800
+ bun run test:watch # 监听模式
801
+ bun run typecheck # 类型检查
802
+ bun run lint # 代码检查
803
+ bun run lint:fix # 自动修复
804
+ ```
805
+
806
+ 详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
807
+
808
+ ## 社区与支持
809
+
810
+ - 🐛 发现 bug 或有功能建议?[提交 issue](https://github.com/AndreLYL/memoark/issues)。
811
+ - 💡 欢迎在 issue 区交流问题和想法。
812
+ - ⭐ 如果 Memoark 对你有帮助,点个 Star 支持一下 —— 这是对项目最大的鼓励。
813
+
814
+ ## License
815
+
816
+ 基于 [Apache License 2.0](LICENSE) 开源。