hmem-mcp 7.4.0 → 8.0.0

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 (315) hide show
  1. package/README.md +266 -54
  2. package/dist/cli-checkpoint-agent.d.ts +27 -0
  3. package/dist/cli-checkpoint-agent.js +320 -0
  4. package/dist/cli-checkpoint-agent.js.map +1 -0
  5. package/dist/cli-checkpoint.js +165 -78
  6. package/dist/cli-checkpoint.js.map +1 -1
  7. package/dist/cli-context-inject.d.ts +7 -7
  8. package/dist/cli-context-inject.js +54 -41
  9. package/dist/cli-context-inject.js.map +1 -1
  10. package/dist/cli-doctor.d.ts +7 -0
  11. package/dist/cli-doctor.js +156 -0
  12. package/dist/cli-doctor.js.map +1 -0
  13. package/dist/cli-hook-startup.d.ts +1 -0
  14. package/dist/cli-hook-startup.js +97 -10
  15. package/dist/cli-hook-startup.js.map +1 -1
  16. package/dist/cli-init.d.ts +0 -4
  17. package/dist/cli-init.js +48 -6
  18. package/dist/cli-init.js.map +1 -1
  19. package/dist/cli-log-exchange.js +10 -2
  20. package/dist/cli-log-exchange.js.map +1 -1
  21. package/dist/cli-mcp-add-curate.d.ts +7 -0
  22. package/dist/cli-mcp-add-curate.js +40 -0
  23. package/dist/cli-mcp-add-curate.js.map +1 -0
  24. package/dist/cli-migrate.d.ts +57 -0
  25. package/dist/cli-migrate.js +394 -0
  26. package/dist/cli-migrate.js.map +1 -0
  27. package/dist/cli-session-summary.d.ts +1 -1
  28. package/dist/cli-session-summary.js +9 -54
  29. package/dist/cli-session-summary.js.map +1 -1
  30. package/dist/cli-statusline.js +15 -11
  31. package/dist/cli-statusline.js.map +1 -1
  32. package/dist/cli-sync-pull.d.ts +3 -0
  33. package/dist/cli-sync-pull.js +79 -0
  34. package/dist/cli-sync-pull.js.map +1 -0
  35. package/dist/cli-sync-push.d.ts +4 -0
  36. package/dist/cli-sync-push.js +85 -0
  37. package/dist/cli-sync-push.js.map +1 -0
  38. package/dist/cli-sync-setup.d.ts +18 -0
  39. package/dist/cli-sync-setup.js +308 -0
  40. package/dist/cli-sync-setup.js.map +1 -0
  41. package/dist/cli-sync-status.d.ts +1 -0
  42. package/dist/cli-sync-status.js +20 -0
  43. package/dist/cli-sync-status.js.map +1 -0
  44. package/dist/cli-v2-checkpoint.d.ts +38 -0
  45. package/dist/cli-v2-checkpoint.js +134 -0
  46. package/dist/cli-v2-checkpoint.js.map +1 -0
  47. package/dist/cli.js +154 -34
  48. package/dist/cli.js.map +1 -1
  49. package/dist/config/config.d.ts +29 -0
  50. package/dist/config/config.js +123 -0
  51. package/dist/config/config.js.map +1 -0
  52. package/dist/diagnostics.js +1 -6
  53. package/dist/diagnostics.js.map +1 -1
  54. package/dist/extensions/pi-hmem.js +141 -35
  55. package/dist/extensions/pi-hmem.js.map +1 -1
  56. package/dist/hmem-config.d.ts +30 -5
  57. package/dist/hmem-config.js +50 -8
  58. package/dist/hmem-config.js.map +1 -1
  59. package/dist/hmem-store.d.ts +60 -2
  60. package/dist/hmem-store.js +205 -26
  61. package/dist/hmem-store.js.map +1 -1
  62. package/dist/hooks/binding-resolver.d.ts +13 -0
  63. package/dist/hooks/binding-resolver.js +42 -0
  64. package/dist/hooks/binding-resolver.js.map +1 -0
  65. package/dist/hooks/brief.d.ts +2 -0
  66. package/dist/hooks/brief.js +26 -0
  67. package/dist/hooks/brief.js.map +1 -0
  68. package/dist/hooks/dispatch.d.ts +5 -0
  69. package/dist/hooks/dispatch.js +119 -0
  70. package/dist/hooks/dispatch.js.map +1 -0
  71. package/dist/hooks/git-probe.d.ts +4 -0
  72. package/dist/hooks/git-probe.js +46 -0
  73. package/dist/hooks/git-probe.js.map +1 -0
  74. package/dist/hooks/harness/claude-code.d.ts +10 -0
  75. package/dist/hooks/harness/claude-code.js +133 -0
  76. package/dist/hooks/harness/claude-code.js.map +1 -0
  77. package/dist/hooks/harness/hermes.d.ts +4 -0
  78. package/dist/hooks/harness/hermes.js +20 -0
  79. package/dist/hooks/harness/hermes.js.map +1 -0
  80. package/dist/hooks/harness/pi.d.ts +4 -0
  81. package/dist/hooks/harness/pi.js +21 -0
  82. package/dist/hooks/harness/pi.js.map +1 -0
  83. package/dist/hooks/prompt-submit.d.ts +16 -0
  84. package/dist/hooks/prompt-submit.js +11 -0
  85. package/dist/hooks/prompt-submit.js.map +1 -0
  86. package/dist/hooks/session-start.d.ts +3 -0
  87. package/dist/hooks/session-start.js +31 -0
  88. package/dist/hooks/session-start.js.map +1 -0
  89. package/dist/hooks/stable-context.d.ts +11 -0
  90. package/dist/hooks/stable-context.js +117 -0
  91. package/dist/hooks/stable-context.js.map +1 -0
  92. package/dist/hooks/stop-log.d.ts +4 -0
  93. package/dist/hooks/stop-log.js +12 -0
  94. package/dist/hooks/stop-log.js.map +1 -0
  95. package/dist/hooks/summarizer-pick.d.ts +8 -0
  96. package/dist/hooks/summarizer-pick.js +18 -0
  97. package/dist/hooks/summarizer-pick.js.map +1 -0
  98. package/dist/hooks/transcript.d.ts +6 -0
  99. package/dist/hooks/transcript.js +72 -0
  100. package/dist/hooks/transcript.js.map +1 -0
  101. package/dist/hooks/types.d.ts +56 -0
  102. package/dist/hooks/types.js +2 -0
  103. package/dist/hooks/types.js.map +1 -0
  104. package/dist/mcp-curate-server.js +50 -4
  105. package/dist/mcp-curate-server.js.map +1 -1
  106. package/dist/mcp-server.js +121 -58
  107. package/dist/mcp-server.js.map +1 -1
  108. package/dist/mcp-shared.js +119 -29
  109. package/dist/mcp-shared.js.map +1 -1
  110. package/dist/memory-search.d.ts +5 -2
  111. package/dist/memory-search.js +5 -2
  112. package/dist/memory-search.js.map +1 -1
  113. package/dist/migrate/o-decompose.d.ts +14 -0
  114. package/dist/migrate/o-decompose.js +112 -0
  115. package/dist/migrate/o-decompose.js.map +1 -0
  116. package/dist/migrate/tree.d.ts +16 -0
  117. package/dist/migrate/tree.js +102 -0
  118. package/dist/migrate/tree.js.map +1 -0
  119. package/dist/migrate/v1-reader.d.ts +38 -0
  120. package/dist/migrate/v1-reader.js +34 -0
  121. package/dist/migrate/v1-reader.js.map +1 -0
  122. package/dist/migrate/v1-to-v2.d.ts +25 -0
  123. package/dist/migrate/v1-to-v2.js +127 -0
  124. package/dist/migrate/v1-to-v2.js.map +1 -0
  125. package/dist/session-state.d.ts +3 -0
  126. package/dist/session-state.js +7 -5
  127. package/dist/session-state.js.map +1 -1
  128. package/dist/store/db.d.ts +25 -0
  129. package/dist/store/db.js +159 -0
  130. package/dist/store/db.js.map +1 -0
  131. package/dist/store/entries.d.ts +48 -0
  132. package/dist/store/entries.js +145 -0
  133. package/dist/store/entries.js.map +1 -0
  134. package/dist/store/events-fts.d.ts +18 -0
  135. package/dist/store/events-fts.js +18 -0
  136. package/dist/store/events-fts.js.map +1 -0
  137. package/dist/store/events.d.ts +30 -0
  138. package/dist/store/events.js +48 -0
  139. package/dist/store/events.js.map +1 -0
  140. package/dist/store/fts.d.ts +24 -0
  141. package/dist/store/fts.js +35 -0
  142. package/dist/store/fts.js.map +1 -0
  143. package/dist/store/links.d.ts +24 -0
  144. package/dist/store/links.js +29 -0
  145. package/dist/store/links.js.map +1 -0
  146. package/dist/store/schema-engine.d.ts +20 -0
  147. package/dist/store/schema-engine.js +41 -0
  148. package/dist/store/schema-engine.js.map +1 -0
  149. package/dist/store/schema-v2.sql +149 -0
  150. package/dist/store/sessions.d.ts +38 -0
  151. package/dist/store/sessions.js +98 -0
  152. package/dist/store/sessions.js.map +1 -0
  153. package/dist/store/types.d.ts +74 -0
  154. package/dist/store/types.js +3 -0
  155. package/dist/store/types.js.map +1 -0
  156. package/dist/store/ulid.d.ts +1 -0
  157. package/dist/store/ulid.js +10 -0
  158. package/dist/store/ulid.js.map +1 -0
  159. package/dist/summarize/anthropic.d.ts +8 -0
  160. package/dist/summarize/anthropic.js +38 -0
  161. package/dist/summarize/anthropic.js.map +1 -0
  162. package/dist/summarize/loop.d.ts +40 -0
  163. package/dist/summarize/loop.js +64 -0
  164. package/dist/summarize/loop.js.map +1 -0
  165. package/dist/sync/api.d.ts +49 -0
  166. package/dist/sync/api.js +99 -0
  167. package/dist/sync/api.js.map +1 -0
  168. package/dist/sync/config.d.ts +16 -0
  169. package/dist/sync/config.js +27 -0
  170. package/dist/sync/config.js.map +1 -0
  171. package/dist/sync/conflict.d.ts +24 -0
  172. package/dist/sync/conflict.js +125 -0
  173. package/dist/sync/conflict.js.map +1 -0
  174. package/dist/sync/crypto.d.ts +53 -0
  175. package/dist/sync/crypto.js +140 -0
  176. package/dist/sync/crypto.js.map +1 -0
  177. package/dist/sync/passphrase.d.ts +1 -0
  178. package/dist/sync/passphrase.js +17 -0
  179. package/dist/sync/passphrase.js.map +1 -0
  180. package/dist/sync/v2/dispatch.d.ts +6 -0
  181. package/dist/sync/v2/dispatch.js +24 -0
  182. package/dist/sync/v2/dispatch.js.map +1 -0
  183. package/dist/sync/v2/envelope.d.ts +13 -0
  184. package/dist/sync/v2/envelope.js +36 -0
  185. package/dist/sync/v2/envelope.js.map +1 -0
  186. package/dist/sync/v2/export.d.ts +10 -0
  187. package/dist/sync/v2/export.js +32 -0
  188. package/dist/sync/v2/export.js.map +1 -0
  189. package/dist/sync/v2/import.d.ts +10 -0
  190. package/dist/sync/v2/import.js +130 -0
  191. package/dist/sync/v2/import.js.map +1 -0
  192. package/dist/sync/v2/queue.d.ts +18 -0
  193. package/dist/sync/v2/queue.js +59 -0
  194. package/dist/sync/v2/queue.js.map +1 -0
  195. package/dist/sync/v2/reconcile.d.ts +3 -0
  196. package/dist/sync/v2/reconcile.js +18 -0
  197. package/dist/sync/v2/reconcile.js.map +1 -0
  198. package/dist/sync/v2/staging.d.ts +27 -0
  199. package/dist/sync/v2/staging.js +46 -0
  200. package/dist/sync/v2/staging.js.map +1 -0
  201. package/dist/sync/v2/sync.d.ts +18 -0
  202. package/dist/sync/v2/sync.js +63 -0
  203. package/dist/sync/v2/sync.js.map +1 -0
  204. package/dist/sync/v2/transport.d.ts +43 -0
  205. package/dist/sync/v2/transport.js +20 -0
  206. package/dist/sync/v2/transport.js.map +1 -0
  207. package/dist/sync-bridge.d.ts +2 -0
  208. package/dist/sync-bridge.js +134 -0
  209. package/dist/sync-bridge.js.map +1 -0
  210. package/dist/tools/analyze-v1.d.ts +1 -0
  211. package/dist/tools/analyze-v1.js +142 -0
  212. package/dist/tools/analyze-v1.js.map +1 -0
  213. package/dist/util/iso.d.ts +8 -0
  214. package/dist/util/iso.js +15 -0
  215. package/dist/util/iso.js.map +1 -0
  216. package/dist/utils.d.ts +7 -0
  217. package/dist/utils.js +14 -0
  218. package/dist/utils.js.map +1 -0
  219. package/dist/v2/addressing.d.ts +9 -0
  220. package/dist/v2/addressing.js +55 -0
  221. package/dist/v2/addressing.js.map +1 -0
  222. package/dist/v2/checkpoint-agent.d.ts +75 -0
  223. package/dist/v2/checkpoint-agent.js +231 -0
  224. package/dist/v2/checkpoint-agent.js.map +1 -0
  225. package/dist/v2/checkpoint-select.d.ts +60 -0
  226. package/dist/v2/checkpoint-select.js +106 -0
  227. package/dist/v2/checkpoint-select.js.map +1 -0
  228. package/dist/v2/checkpoint.d.ts +62 -0
  229. package/dist/v2/checkpoint.js +103 -0
  230. package/dist/v2/checkpoint.js.map +1 -0
  231. package/dist/v2/curation.d.ts +23 -0
  232. package/dist/v2/curation.js +118 -0
  233. package/dist/v2/curation.js.map +1 -0
  234. package/dist/v2/projects.d.ts +29 -0
  235. package/dist/v2/projects.js +60 -0
  236. package/dist/v2/projects.js.map +1 -0
  237. package/dist/v2/read-render.d.ts +31 -0
  238. package/dist/v2/read-render.js +150 -0
  239. package/dist/v2/read-render.js.map +1 -0
  240. package/dist/v2/related.d.ts +8 -0
  241. package/dist/v2/related.js +35 -0
  242. package/dist/v2/related.js.map +1 -0
  243. package/dist/v2/search.d.ts +6 -0
  244. package/dist/v2/search.js +24 -0
  245. package/dist/v2/search.js.map +1 -0
  246. package/dist/v2/session-id.d.ts +7 -0
  247. package/dist/v2/session-id.js +14 -0
  248. package/dist/v2/session-id.js.map +1 -0
  249. package/dist/v2/sessions-tools.d.ts +11 -0
  250. package/dist/v2/sessions-tools.js +30 -0
  251. package/dist/v2/sessions-tools.js.map +1 -0
  252. package/dist/v2/store-facade.d.ts +23 -0
  253. package/dist/v2/store-facade.js +33 -0
  254. package/dist/v2/store-facade.js.map +1 -0
  255. package/dist/v2/summarize-adapter.d.ts +11 -0
  256. package/dist/v2/summarize-adapter.js +19 -0
  257. package/dist/v2/summarize-adapter.js.map +1 -0
  258. package/dist/v2/writes.d.ts +30 -0
  259. package/dist/v2/writes.js +135 -0
  260. package/dist/v2/writes.js.map +1 -0
  261. package/hmem.config.example.json +92 -10
  262. package/opencode-plugin/hmem.js +5 -2
  263. package/package.json +7 -3
  264. package/plugins/hermes-hmem/README.md +56 -0
  265. package/plugins/hermes-hmem/__init__.py +187 -0
  266. package/plugins/hermes-hmem/plugin.yaml +8 -0
  267. package/server.json +2 -2
  268. package/skills/hmem-activate/SKILL.md +1 -1
  269. package/skills/hmem-config/SKILL.md +70 -5
  270. package/skills/hmem-curate/SKILL.md +13 -6
  271. package/skills/hmem-dispatch/SKILL.md +1 -1
  272. package/skills/hmem-migrate-o/SKILL.md +3 -8
  273. package/skills/hmem-new-error/SKILL.md +1 -9
  274. package/skills/hmem-new-project/SKILL.md +1 -9
  275. package/skills/hmem-new-rule/SKILL.md +93 -0
  276. package/skills/hmem-read/SKILL.md +16 -8
  277. package/skills/hmem-release/SKILL.md +108 -9
  278. package/skills/hmem-search/SKILL.md +48 -25
  279. package/skills/hmem-session-start/SKILL.md +147 -46
  280. package/skills/hmem-setup/SKILL.md +3 -3
  281. package/skills/hmem-sync-setup/SKILL.md +1 -5
  282. package/skills/hmem-update/SKILL.md +345 -19
  283. package/skills/hmem-wipe/SKILL.md +41 -7
  284. package/skills/hmem-write/SKILL.md +1 -12
  285. package/skills/hmem-activate-workspace/evals/evals.json +0 -29
  286. package/skills/hmem-activate-workspace/iteration-1/benchmark.json +0 -370
  287. package/skills/hmem-activate-workspace/iteration-1/benchmark.md +0 -13
  288. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/eval_metadata.json +0 -23
  289. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/grading.json +0 -55
  290. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/outputs/response.md +0 -121
  291. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/with_skill/run-1/grading.json +0 -55
  292. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/grading.json +0 -44
  293. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/outputs/response.md +0 -78
  294. package/skills/hmem-activate-workspace/iteration-1/eval-1-simple-switch/without_skill/run-1/grading.json +0 -44
  295. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/eval_metadata.json +0 -23
  296. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/grading.json +0 -49
  297. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/outputs/response.md +0 -98
  298. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/with_skill/run-1/grading.json +0 -49
  299. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/grading.json +0 -44
  300. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/outputs/response.md +0 -57
  301. package/skills/hmem-activate-workspace/iteration-1/eval-2-misrouting-fix/without_skill/run-1/grading.json +0 -44
  302. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/eval_metadata.json +0 -23
  303. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/grading.json +0 -48
  304. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/outputs/response.md +0 -69
  305. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/with_skill/run-1/grading.json +0 -48
  306. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/grading.json +0 -44
  307. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/outputs/response.md +0 -59
  308. package/skills/hmem-activate-workspace/iteration-1/eval-3-temporary-load/without_skill/run-1/grading.json +0 -44
  309. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/eval_metadata.json +0 -23
  310. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/grading.json +0 -55
  311. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/outputs/response.md +0 -182
  312. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/with_skill/run-1/grading.json +0 -55
  313. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/grading.json +0 -44
  314. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/outputs/response.md +0 -43
  315. package/skills/hmem-activate-workspace/iteration-1/eval-4-wrong-project/without_skill/run-1/grading.json +0 -44
@@ -0,0 +1,38 @@
1
+ /**
2
+ * cli-v2-checkpoint.ts
3
+ *
4
+ * Async Stop-hook entry point for the v2 checkpoint pipeline.
5
+ * Opens a v2 store exclusively — never touches HmemStore or any v1 path.
6
+ *
7
+ * On a v1 file, a missing/unreadable file, or a missing HMEM_PATH env:
8
+ * → silent no-op return (never throws, never constructs HmemStore).
9
+ *
10
+ * On a v2 file with a resolvable session:
11
+ * → runs one checkpoint-extraction pass (see ./v2/checkpoint.ts).
12
+ *
13
+ * Usage (hook): claude pipes `{ session_id, stop_hook_active }` on stdin.
14
+ *
15
+ * Requires env:
16
+ * HMEM_PATH — path to .hmem file (the hook sets this explicitly)
17
+ * HMEM_PROJECT_DIR — directory for config + company.hmem (derived from
18
+ * HMEM_PATH by resolveEnvDefaults — the hook does NOT set it)
19
+ */
20
+ import { type RunV2CheckpointOptions } from "./v2/checkpoint.js";
21
+ /**
22
+ * Hook entry point (dispatched by cli.ts). Reads the Stop-hook JSON from stdin to
23
+ * obtain the session id — Claude Code provides it there, NOT in the environment —
24
+ * mirroring cli-log-exchange.ts. A TTY (manual run) has no hook payload, so stdin
25
+ * is skipped and the core falls back to env/ppid session resolution.
26
+ */
27
+ export declare function runCliV2Checkpoint(): Promise<void>;
28
+ /**
29
+ * Testable core: resolve env, guard, open the v2 store, run one checkpoint pass.
30
+ * Kept separate from the stdin-reading wrapper so tests can drive it directly
31
+ * (same split as cli-log-exchange.ts's appendExchangeV2Path).
32
+ *
33
+ * @param sessionId explicit session id (from the hook stdin). Falls back to
34
+ * resolveSessionId() (HMEM_SESSION_ID env → ppid bridge) when omitted.
35
+ * @param opts test seams (agent `invoke`, gate/agent probes) forwarded to
36
+ * runV2Checkpoint. The production hook passes none → real spawn.
37
+ */
38
+ export declare function runCliV2CheckpointCore(sessionId?: string, opts?: RunV2CheckpointOptions): Promise<void>;
@@ -0,0 +1,134 @@
1
+ /**
2
+ * cli-v2-checkpoint.ts
3
+ *
4
+ * Async Stop-hook entry point for the v2 checkpoint pipeline.
5
+ * Opens a v2 store exclusively — never touches HmemStore or any v1 path.
6
+ *
7
+ * On a v1 file, a missing/unreadable file, or a missing HMEM_PATH env:
8
+ * → silent no-op return (never throws, never constructs HmemStore).
9
+ *
10
+ * On a v2 file with a resolvable session:
11
+ * → runs one checkpoint-extraction pass (see ./v2/checkpoint.ts).
12
+ *
13
+ * Usage (hook): claude pipes `{ session_id, stop_hook_active }` on stdin.
14
+ *
15
+ * Requires env:
16
+ * HMEM_PATH — path to .hmem file (the hook sets this explicitly)
17
+ * HMEM_PROJECT_DIR — directory for config + company.hmem (derived from
18
+ * HMEM_PATH by resolveEnvDefaults — the hook does NOT set it)
19
+ */
20
+ import fs from "node:fs";
21
+ import path from "node:path";
22
+ import Database from "better-sqlite3";
23
+ import { createV2Store } from "./v2/store-facade.js";
24
+ import { getSchemaMajor, V1FileError } from "./store/db.js";
25
+ import { loadHmemConfig } from "./hmem-config.js";
26
+ import { resolveSessionId } from "./v2/session-id.js";
27
+ import { resolveEnvDefaults } from "./cli-env.js";
28
+ import { runV2Checkpoint } from "./v2/checkpoint.js";
29
+ /**
30
+ * Read-only schema-major probe. Returns '2' only when the file exists and
31
+ * carries schema_major='2'. Any other case — v1 file, missing file, locked
32
+ * handle, corrupt header — returns null. Never throws.
33
+ *
34
+ * Uses a readonly better-sqlite3 handle so openDb's WAL pragma and schema
35
+ * bootstrap are NEVER run against the file (symmetric to the probe in
36
+ * cli-checkpoint.ts#isV2Store, but returns the raw major string instead of
37
+ * a boolean so callers can distinguish v1 vs. absent).
38
+ */
39
+ function probeSchemaMajor(hmemPath) {
40
+ let db;
41
+ try {
42
+ db = new Database(hmemPath, { readonly: true });
43
+ return getSchemaMajor(db);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ finally {
49
+ try {
50
+ db?.close();
51
+ }
52
+ catch { /* ignore */ }
53
+ }
54
+ }
55
+ /**
56
+ * Hook entry point (dispatched by cli.ts). Reads the Stop-hook JSON from stdin to
57
+ * obtain the session id — Claude Code provides it there, NOT in the environment —
58
+ * mirroring cli-log-exchange.ts. A TTY (manual run) has no hook payload, so stdin
59
+ * is skipped and the core falls back to env/ppid session resolution.
60
+ */
61
+ export async function runCliV2Checkpoint() {
62
+ let input = {};
63
+ if (!process.stdin.isTTY) {
64
+ try {
65
+ input = JSON.parse(fs.readFileSync(0, "utf8") || "{}");
66
+ }
67
+ catch {
68
+ // No / invalid stdin payload — core falls back to resolveSessionId().
69
+ }
70
+ }
71
+ // Re-entry guard: Claude re-fires Stop with this flag set; don't double-run.
72
+ if (input.stop_hook_active)
73
+ return;
74
+ await runCliV2CheckpointCore(input.session_id);
75
+ }
76
+ /**
77
+ * Testable core: resolve env, guard, open the v2 store, run one checkpoint pass.
78
+ * Kept separate from the stdin-reading wrapper so tests can drive it directly
79
+ * (same split as cli-log-exchange.ts's appendExchangeV2Path).
80
+ *
81
+ * @param sessionId explicit session id (from the hook stdin). Falls back to
82
+ * resolveSessionId() (HMEM_SESSION_ID env → ppid bridge) when omitted.
83
+ * @param opts test seams (agent `invoke`, gate/agent probes) forwarded to
84
+ * runV2Checkpoint. The production hook passes none → real spawn.
85
+ */
86
+ export async function runCliV2CheckpointCore(sessionId, opts = {}) {
87
+ // 1. HMEM_PATH guard FIRST — the hook sets it explicitly. Guarding before
88
+ // resolveEnvDefaults() preserves the "unset → no-op" contract and stops the
89
+ // HMEM_PATH auto-resolver from reaching a real store.
90
+ if (!process.env.HMEM_PATH)
91
+ return;
92
+ // 2. Derive HMEM_PROJECT_DIR from HMEM_PATH. The Stop hook sets only HMEM_PATH;
93
+ // without this the original code early-returned into a silent no-op, and
94
+ // downstream config/agent wiring (which reads HMEM_PROJECT_DIR) would break.
95
+ resolveEnvDefaults();
96
+ const hmemPath = process.env.HMEM_PATH;
97
+ if (!fs.existsSync(hmemPath))
98
+ return;
99
+ // 3. Read-only schema probe BEFORE opening anything heavy.
100
+ // Not v2 (v1 file, empty file, missing schema_version) → no-op.
101
+ // This is the primary guard; the V1FileError catch below is belt-and-suspenders.
102
+ const schemaMajor = probeSchemaMajor(hmemPath);
103
+ if (schemaMajor !== "2") {
104
+ return;
105
+ }
106
+ // 4. Open via createV2Store exclusively (never HmemStore).
107
+ const config = loadHmemConfig(path.dirname(hmemPath));
108
+ let store;
109
+ try {
110
+ try {
111
+ store = createV2Store(hmemPath, config);
112
+ }
113
+ catch (e) {
114
+ // Belt-and-suspenders: if the probe is bypassed and the file turns out
115
+ // to be v1, openDb throws V1FileError — swallow it into a no-op.
116
+ if (e instanceof V1FileError)
117
+ return;
118
+ throw e;
119
+ }
120
+ // Real extraction pass. With no resolvable session, or a session with no open
121
+ // binding, runV2Checkpoint is a clean no-op.
122
+ const sid = sessionId ?? resolveSessionId();
123
+ if (sid) {
124
+ await runV2Checkpoint(store, sid, config, hmemPath, opts);
125
+ }
126
+ }
127
+ finally {
128
+ try {
129
+ store?.close();
130
+ }
131
+ catch { /* ignore */ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=cli-v2-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-v2-checkpoint.js","sourceRoot":"","sources":["../src/cli-v2-checkpoint.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -13,6 +13,91 @@ if (pathIdx !== -1 && args[pathIdx + 1]) {
13
13
  args.splice(pathIdx, 2);
14
14
  }
15
15
  const command = args[0];
16
+ function printUsageTable() {
17
+ console.log(`hmem — Humanlike Memory for AI Agents
18
+
19
+ Usage:
20
+ hmem serve Start the MCP server (stdio transport)
21
+ hmem init Install hmem for AI coding tools (interactive or with flags)
22
+ hmem update-skills Copy/update skill files to detected AI tools
23
+ hmem mcp-add-curate Register the hmem-curate MCP server with Claude Code (opt-in)
24
+ hmem setup-hook Add hmem SessionStart hook to Claude Code settings
25
+ hmem doctor Detect stale or deprecated hmem MCP entries in host configs
26
+ hmem stats Show memory statistics + per-project token estimates
27
+ hmem version Show version
28
+
29
+ Hook drivers (called by AI tool hooks, not directly by users):
30
+ hmem hook-startup UserPromptSubmit hook — counter, checkpoint reminders
31
+ hmem log-exchange Stop hook — log exchange to active O-entry
32
+ hmem context-inject SessionStart[clear] hook — re-inject project context
33
+ hmem deactivate SessionStart[clear] hook — clear active project
34
+ hmem statusline statusLine — generate Claude Code statusline (JSON on stdin)
35
+ hmem checkpoint Extract knowledge from recent exchanges (background)
36
+
37
+ Curation:
38
+ hmem delete <ID> Permanently delete an entry (curator only, not synced)
39
+ hmem migrate-o-entries Migrate O-entries to current schema
40
+ hmem summarize-session <id> Generate summary node for a session
41
+
42
+ Sync (requires hmem-sync installed):
43
+ hmem sync push Push local memory to sync server
44
+ hmem sync pull Pull latest memory from sync server
45
+ hmem sync status Show sync server + auth + last-sync state
46
+ hmem sync setup [--join] Interactive sync-passphrase setup
47
+
48
+ Backup / migration:
49
+ hmem export-staging <hmem> <json> Export .hmem to JSON staging file
50
+ hmem import-staging <json> <hmem> Import JSON staging back into .hmem
51
+
52
+ Environment variables (for serve):
53
+ HMEM_PATH Path to .hmem file (optional, auto-detected)
54
+ HMEM_PROJECT_DIR Directory for config + company.hmem (derived from HMEM_PATH)
55
+ HMEM_AGENT_ROLE Role: worker | al | pl | ceo (default: worker)
56
+
57
+ Non-interactive init flags:
58
+ --global System-wide install (default)
59
+ --local Project-local install
60
+ --tools claude-code Comma-separated tool list (default: all detected)
61
+ --dir /path Memory directory (default: ~/.hmem)
62
+ --no-example Skip example memory installation
63
+
64
+ Examples:
65
+ npx hmem init # Interactive installer
66
+ npx hmem init --global # Non-interactive, all detected tools
67
+ npx hmem init --global --tools claude-code # Non-interactive, Claude Code only
68
+ npx hmem update-skills # Update skills after npm update
69
+ HMEM_PROJECT_DIR=. npx hmem serve # Start server in current directory`);
70
+ }
71
+ function printHelp() {
72
+ console.log(`🧠 hmem — Quick Tips
73
+
74
+ 📦 Context full? (>100k tokens)
75
+ /hmem-wipe — saves high-value knowledge to hmem, then /clear.
76
+ Run before context compaction kicks in.
77
+
78
+ 🔄 Multiple devices?
79
+ hmem sync setup — Cross-device sync via passphrase.
80
+ Passphrase stays device-local; server only sees ciphertext.
81
+
82
+ 📜 Define your own rules?
83
+ In-session: say "remember as a rule: ..."
84
+ → stored as an R-entry, re-injected at every session start.
85
+
86
+ ✨ Register a new project?
87
+ In-session: say "new project XYZ"
88
+ → hmem-new-project skill handles schema + O-entry linking.
89
+
90
+ 📌 Keep important entries visible every session?
91
+ In-session: say "pin this entry"
92
+ → marks entry as [P] pinned, L2 content injected at session start.
93
+
94
+ 🧹 Curate / delete entries?
95
+ hmem mcp-add-curate
96
+ → registers the maintenance MCP (bulk edits, delete, merge, stats).
97
+ Activate via /mcp only when curating, deactivate when done.
98
+ `);
99
+ printUsageTable();
100
+ }
16
101
  switch (command) {
17
102
  case "serve":
18
103
  await import("./mcp-server.js");
@@ -27,6 +112,11 @@ switch (command) {
27
112
  updateSkills();
28
113
  break;
29
114
  }
115
+ case "mcp-add-curate": {
116
+ const { runMcpAddCurate } = await import("./cli-mcp-add-curate.js");
117
+ runMcpAddCurate();
118
+ break;
119
+ }
30
120
  case "log-exchange": {
31
121
  const { logExchange } = await import("./cli-log-exchange.js");
32
122
  await logExchange();
@@ -82,6 +172,35 @@ switch (command) {
82
172
  await setupHook();
83
173
  break;
84
174
  }
175
+ case "doctor": {
176
+ const { doctor } = await import("./cli-doctor.js");
177
+ await doctor();
178
+ break;
179
+ }
180
+ case "export-staging": {
181
+ const { exportToStaging } = await import("./sync-bridge.js");
182
+ const hmemPath = args[1];
183
+ const stagingPath = args[2];
184
+ if (!hmemPath || !stagingPath) {
185
+ console.error("Usage: hmem export-staging <hmem-path> <staging-path>");
186
+ process.exit(1);
187
+ }
188
+ await exportToStaging(hmemPath, stagingPath);
189
+ console.log(`✓ Exported ${hmemPath} → ${stagingPath}`);
190
+ break;
191
+ }
192
+ case "import-staging": {
193
+ const { importFromStaging } = await import("./sync-bridge.js");
194
+ const hmemPath = args[1];
195
+ const stagingPath = args[2];
196
+ if (!hmemPath || !stagingPath) {
197
+ console.error("Usage: hmem import-staging <staging-path> <hmem-path>");
198
+ process.exit(1);
199
+ }
200
+ await importFromStaging(stagingPath, hmemPath);
201
+ console.log(`✓ Imported ${stagingPath} → ${hmemPath}`);
202
+ break;
203
+ }
85
204
  case "version":
86
205
  case "--version":
87
206
  case "-v": {
@@ -91,41 +210,42 @@ switch (command) {
91
210
  console.log(`hmem ${pkg.version}`);
92
211
  break;
93
212
  }
213
+ case "setup": {
214
+ const { runSetup } = await import("./cli-sync-setup.js");
215
+ await runSetup({ join: process.argv.includes("--join") });
216
+ break;
217
+ }
218
+ case "help":
219
+ case "--help":
220
+ case "-h":
221
+ printHelp();
222
+ break;
223
+ case "sync": {
224
+ const subCmd = process.argv[3];
225
+ if (subCmd === "push") {
226
+ const { syncPush } = await import("./cli-sync-push.js");
227
+ await syncPush({ skipPull: process.argv.includes("--skip-pull") });
228
+ }
229
+ else if (subCmd === "pull") {
230
+ const { syncPull } = await import("./cli-sync-pull.js");
231
+ await syncPull();
232
+ }
233
+ else if (subCmd === "status") {
234
+ const { syncStatus } = await import("./cli-sync-status.js");
235
+ await syncStatus();
236
+ }
237
+ else if (subCmd === "setup") {
238
+ const { runSetup } = await import("./cli-sync-setup.js");
239
+ await runSetup({ join: process.argv.includes("--join") });
240
+ }
241
+ else {
242
+ console.error("Usage: hmem sync <push|pull|status|setup>");
243
+ process.exit(1);
244
+ }
245
+ break;
246
+ }
94
247
  default:
95
- console.log(`hmem — Humanlike Memory for AI Agents
96
-
97
- Usage:
98
- hmem serve Start the MCP server (stdio transport)
99
- hmem init Install hmem for AI coding tools (interactive or with flags)
100
- hmem update-skills Copy/update skill files to detected AI tools
101
- hmem log-exchange Log a chat exchange to active O-entry (called by Stop hook)
102
- hmem context-inject Output compressed context for re-injection after /clear
103
- hmem deactivate Clear active project for current session (called by SessionStart[clear] hook)
104
- hmem setup-hook Add hmem-using-hmem SessionStart hook to Claude Code settings
105
- hmem delete <ID> Permanently delete an entry (curator use only, not synced)
106
- hmem checkpoint Extract knowledge from recent exchanges via Haiku (background)
107
- hmem hook-startup UserPromptSubmit hook — counter, checkpoint reminders (cross-platform)
108
- hmem statusline Generate statusline for Claude Code (reads JSON from stdin)
109
- hmem version Show version
110
-
111
- Environment variables (for serve):
112
- HMEM_PATH Path to .hmem file (optional, auto-detected)
113
- HMEM_PROJECT_DIR Directory for config + company.hmem (derived from HMEM_PATH)
114
- HMEM_AGENT_ROLE Role: worker | al | pl | ceo (default: worker)
115
-
116
- Non-interactive init flags:
117
- --global System-wide install (default)
118
- --local Project-local install
119
- --tools claude-code Comma-separated tool list (default: all detected)
120
- --dir /path Memory directory (default: ~/.hmem)
121
- --no-example Skip example memory installation
122
-
123
- Examples:
124
- npx hmem init # Interactive installer
125
- npx hmem init --global # Non-interactive, all detected tools
126
- npx hmem init --global --tools claude-code # Non-interactive, Claude Code only
127
- npx hmem update-skills # Update skills after npm update
128
- HMEM_PROJECT_DIR=. npx hmem serve # Start server in current directory`);
248
+ printUsageTable();
129
249
  break;
130
250
  }
131
251
  export {};
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface SchemaSection {
2
+ name: string;
3
+ loadDepth: number;
4
+ defaultChildren?: string[];
5
+ /** Short convention describing what belongs in this section. Consumed by the
6
+ * checkpoint agent and shown as placeholder body in empty sections. ~100 chars. */
7
+ description?: string;
8
+ /** What the checkpoint agent may write here: readonly | pointer | append (default). */
9
+ checkpointPolicy?: 'readonly' | 'pointer' | 'append';
10
+ }
11
+ export interface EntrySchema {
12
+ sections: SchemaSection[];
13
+ createLinkedO?: boolean;
14
+ }
15
+ export interface HmemConfig {
16
+ /** Per-prefix entry schemas. Keys are prefix letters ("P", "E", …). Generic. */
17
+ schemas?: Record<string, EntrySchema>;
18
+ prefixes?: Record<string, string>;
19
+ maxTitleChars?: number;
20
+ maxNodeChars?: number;
21
+ }
22
+ export declare const DEFAULT_PREFIXES: Record<string, string>;
23
+ export declare const DEFAULT_CONFIG: HmemConfig;
24
+ /**
25
+ * Load config from `<dir>/hmem.config.json`, deep-merging `schemas` over DEFAULT_CONFIG.
26
+ * Missing file → defaults. User-supplied schema keys win; default keys fill the rest.
27
+ * Malformed prefix keys (not 1–2 uppercase letters) are dropped.
28
+ */
29
+ export declare function loadConfig(dir: string): HmemConfig;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * hmem v2 — single config source.
3
+ *
4
+ * One discovery path only: `hmem.config.json` co-located with the `.hmem` store.
5
+ * This deliberately replaces v1's dual-config discovery (env-var path + cwd walk),
6
+ * which caused E0151 / L0180 (two configs disagreeing). User keys deep-merge over
7
+ * DEFAULT_CONFIG; defaults fill any gaps.
8
+ *
9
+ * The per-prefix schema model is generic: `schemas` is keyed by prefix letter, and
10
+ * every prefix is treated identically (no P-hardcoding — kills E0150). The P/E/H/I
11
+ * schemas below are ported verbatim from v1 `hmem-config.ts` (proven conventions).
12
+ */
13
+ import { readFileSync, existsSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ export const DEFAULT_PREFIXES = {
16
+ P: 'Project',
17
+ L: 'Lesson',
18
+ T: 'Task',
19
+ E: 'Error',
20
+ D: 'Decision',
21
+ M: 'Milestone',
22
+ S: 'Skill',
23
+ N: 'Navigator',
24
+ H: 'Human',
25
+ R: 'Rule',
26
+ O: 'Original',
27
+ I: 'Infrastructure',
28
+ C: 'Convention',
29
+ };
30
+ export const DEFAULT_CONFIG = {
31
+ prefixes: { ...DEFAULT_PREFIXES },
32
+ maxTitleChars: 50,
33
+ maxNodeChars: 100_000,
34
+ schemas: {
35
+ P: {
36
+ sections: [
37
+ { name: 'Overview', loadDepth: 2, description: 'Current state / Goals / Architecture / Environment as L3 (≤4 lines each). L1 body: Name | Status | Tech | Repo' },
38
+ { name: 'Codebase', loadDepth: 1, description: "L3.0 = Pipeline (data flow overview, auto-created). L3.N = Module (title: filename, body: purpose). L4 = exported function/class (title: full signature, body: description + src/file.ts).", defaultChildren: ['Pipeline'] },
39
+ { name: 'Usage', loadDepth: 1, description: 'Installation, CLI/API, common workflows. No code — commands only' },
40
+ { name: 'Context', loadDepth: 1, description: 'Initiator, audience, business context, dependencies as L3' },
41
+ { name: 'Deployment', loadDepth: 1, description: 'Only if relevant. Server, build, CI/CD, release process' },
42
+ { name: 'Bugs', loadDepth: 1, description: 'Open first, fixed marked [✓] or moved to .History. L3 = bug title or pointer → E-entry.' },
43
+ { name: 'History', loadDepth: 0, description: 'Chronological session log. One-liner + pointer to O-entries. No copy-paste snapshots', defaultChildren: ['Tests', 'Code Style', 'Commits'] },
44
+ { name: 'Roadmap', loadDepth: 2, description: '5–8 milestones as L3, main tasks as L4, subtasks as L5. Non-project-specific work → T-entry' },
45
+ { name: 'Ideas', loadDepth: 1, description: 'Brainstorming. L3 = one-liner, L4 = details. Concrete ideas → promote to .Roadmap' },
46
+ ],
47
+ },
48
+ E: {
49
+ sections: [
50
+ { name: 'Reproduction', loadDepth: 1, description: 'Exact steps to trigger. Environment + minimal repro' },
51
+ { name: 'Analysis', loadDepth: 1, description: 'Root cause investigation. What was checked, what was found' },
52
+ { name: 'Possible Fixes', loadDepth: 1, description: 'Candidate approaches with tradeoffs' },
53
+ { name: 'Fixing Attempts', loadDepth: 1, description: "What was tried, what worked, what didn't" },
54
+ { name: 'Solution', loadDepth: 1, description: 'The fix that shipped. Commit hash + one-line summary' },
55
+ { name: 'Cause', loadDepth: 1, description: 'Why the bug existed — the underlying mistake or gap' },
56
+ { name: 'Key Learnings', loadDepth: 1, description: 'Generalizable insight for future work. Tag #open / #solved' },
57
+ ],
58
+ },
59
+ H: {
60
+ sections: [
61
+ { name: 'Identity', loadDepth: 1, description: 'Who the user is — name, contact, GitHub, roles, background. Flat L2 sub-nodes, one fact per node.' },
62
+ { name: 'Work Style', loadDepth: 1, description: 'How the user works — communication style, decision-making, iteration preferences, agent behavior expectations.' },
63
+ { name: 'Priorities', loadDepth: 1, description: 'Current goals, focus areas, what to optimize for.' },
64
+ { name: 'Preferences', loadDepth: 1, description: "Likes and dislikes — what works, what doesn't, what to avoid. Directly actionable for agent behavior." },
65
+ ],
66
+ },
67
+ I: {
68
+ sections: [
69
+ { name: 'Specs', loadDepth: 2, description: 'Hardware or service description. L1 body: Name | Status | Type | Host' },
70
+ { name: 'Access', loadDepth: 1, description: 'Connection methods, ports, credentials location (never store credentials inline)' },
71
+ { name: 'Services', loadDepth: 1, description: 'Running services / provided functions' },
72
+ { name: 'Apps', loadDepth: 1, description: 'Installed software and tools' },
73
+ { name: 'Config', loadDepth: 1, description: 'Important config file paths and settings' },
74
+ { name: 'Notes', loadDepth: 1, description: 'Caveats, quirks, known issues' },
75
+ { name: 'Rules', loadDepth: 1, description: 'Agent rules for working with this resource' },
76
+ ],
77
+ },
78
+ },
79
+ };
80
+ const PREFIX_KEY = /^[A-Z]{1,2}$/;
81
+ /**
82
+ * Load config from `<dir>/hmem.config.json`, deep-merging `schemas` over DEFAULT_CONFIG.
83
+ * Missing file → defaults. User-supplied schema keys win; default keys fill the rest.
84
+ * Malformed prefix keys (not 1–2 uppercase letters) are dropped.
85
+ */
86
+ export function loadConfig(dir) {
87
+ const merged = {
88
+ ...DEFAULT_CONFIG,
89
+ prefixes: { ...DEFAULT_CONFIG.prefixes },
90
+ schemas: { ...DEFAULT_CONFIG.schemas },
91
+ };
92
+ const file = join(dir, 'hmem.config.json');
93
+ if (!existsSync(file))
94
+ return merged;
95
+ let raw;
96
+ try {
97
+ raw = JSON.parse(readFileSync(file, 'utf8'));
98
+ }
99
+ catch {
100
+ return merged; // unreadable/invalid JSON → fall back to defaults, never crash
101
+ }
102
+ if (!raw || typeof raw !== 'object')
103
+ return merged;
104
+ const user = raw;
105
+ if (typeof user.maxTitleChars === 'number')
106
+ merged.maxTitleChars = user.maxTitleChars;
107
+ if (typeof user.maxNodeChars === 'number')
108
+ merged.maxNodeChars = user.maxNodeChars;
109
+ if (user.prefixes && typeof user.prefixes === 'object') {
110
+ merged.prefixes = { ...merged.prefixes, ...user.prefixes };
111
+ }
112
+ if (user.schemas && typeof user.schemas === 'object' && !Array.isArray(user.schemas)) {
113
+ for (const [prefix, schema] of Object.entries(user.schemas)) {
114
+ if (!PREFIX_KEY.test(prefix))
115
+ continue;
116
+ if (!schema || typeof schema !== 'object' || !Array.isArray(schema.sections))
117
+ continue;
118
+ merged.schemas[prefix] = schema;
119
+ }
120
+ }
121
+ return merged;
122
+ }
123
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0BjC,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,YAAY;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,QAAQ,EAAE,EAAE,GAAG,gBAAgB,EAAE;IACjC,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,OAAO;IACrB,OAAO,EAAE;QACP,CAAC,EAAE;YACD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,gHAAgH,EAAE;gBACjK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,4LAA4L,EAAE,eAAe,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC5Q,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,kEAAkE,EAAE;gBAChH,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE;gBAC3G,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,yDAAyD,EAAE;gBAC5G,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,yFAAyF,EAAE;gBACtI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,sFAAsF,EAAE,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE;gBAC3L,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,6FAA6F,EAAE;gBAC7I,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,mFAAmF,EAAE;aAClI;SACF;QACD,CAAC,EAAE;YACD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE;gBAC1G,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,4DAA4D,EAAE;gBAC7G,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE;gBAC5F,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,0CAA0C,EAAE;gBAClG,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE;gBACvG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE;gBACnG,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,4DAA4D,EAAE;aACnH;SACF;QACD,CAAC,EAAE;YACD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,mGAAmG,EAAE;gBACpJ,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,gHAAgH,EAAE;gBACnK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,mDAAmD,EAAE;gBACtG,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,uGAAuG,EAAE;aAC5J;SACF;QACD,CAAC,EAAE;YACD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,uEAAuE,EAAE;gBACrH,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,kFAAkF,EAAE;gBACjI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,uCAAuC,EAAE;gBACxF,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBAC3E,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,0CAA0C,EAAE;gBACzF,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE;gBAC7E,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE;aAC3F;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAe;QACzB,GAAG,cAAc;QACjB,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE;QACxC,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE;KACvC,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAErC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,+DAA+D;IAChF,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACnD,MAAM,IAAI,GAAG,GAA0B,CAAC;IAExC,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ;QAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IACtF,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;QAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACnF,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrF,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,MAAsB,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACxG,MAAM,CAAC,OAAQ,CAAC,MAAM,CAAC,GAAG,MAAqB,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -5,14 +5,9 @@
5
5
  * Rotated to .1 when the file exceeds 1 MB.
6
6
  */
7
7
  import fs from "node:fs";
8
- import os from "node:os";
9
8
  import path from "node:path";
9
+ import { safeHomedir } from "./utils.js";
10
10
  const MAX_BYTES = 1024 * 1024;
11
- function safeHomedir() {
12
- if (process.platform === "win32" && process.env.USERPROFILE)
13
- return process.env.USERPROFILE;
14
- return process.env.HOME || os.homedir();
15
- }
16
11
  export function diagnosticsLogPath() {
17
12
  return path.join(safeHomedir(), ".hmem", "diagnostics.log");
18
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5F,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC9D,CAAC;AAcD,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC;oBAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACtD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/E,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC9D,CAAC;AAcD,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC;oBAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACtD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/E,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC"}