hippo-memory 1.32.0 → 1.33.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 (374) hide show
  1. package/dist/api.d.ts +24 -17
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +78 -142
  4. package/dist/api.js.map +1 -1
  5. package/dist/audit-prune.d.ts.map +1 -1
  6. package/dist/audit-prune.js +7 -1
  7. package/dist/audit-prune.js.map +1 -1
  8. package/dist/audit.d.ts +3 -2
  9. package/dist/audit.d.ts.map +1 -1
  10. package/dist/audit.js +13 -6
  11. package/dist/audit.js.map +1 -1
  12. package/dist/auth.d.ts.map +1 -1
  13. package/dist/auth.js +6 -0
  14. package/dist/auth.js.map +1 -1
  15. package/dist/autolearn.js +4 -4
  16. package/dist/autolearn.js.map +1 -1
  17. package/dist/benchmarks/e1.3/incident-recall-eval.js +4 -0
  18. package/dist/benchmarks/e1.3/incident-recall-eval.js.map +1 -1
  19. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +2 -2
  20. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +1 -1
  21. package/dist/capture.d.ts.map +1 -1
  22. package/dist/capture.js +93 -66
  23. package/dist/capture.js.map +1 -1
  24. package/dist/client.d.ts +0 -5
  25. package/dist/client.d.ts.map +1 -1
  26. package/dist/client.js +32 -14
  27. package/dist/client.js.map +1 -1
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +7 -4
  30. package/dist/config.js.map +1 -1
  31. package/dist/connectors/github/backfill.d.ts.map +1 -1
  32. package/dist/connectors/github/backfill.js +25 -16
  33. package/dist/connectors/github/backfill.js.map +1 -1
  34. package/dist/connectors/github/cli-impl.d.ts +2 -1
  35. package/dist/connectors/github/cli-impl.d.ts.map +1 -1
  36. package/dist/connectors/github/cli-impl.js +20 -4
  37. package/dist/connectors/github/cli-impl.js.map +1 -1
  38. package/dist/connectors/github/deletion.d.ts.map +1 -1
  39. package/dist/connectors/github/deletion.js +2 -0
  40. package/dist/connectors/github/deletion.js.map +1 -1
  41. package/dist/connectors/github/dlq.d.ts.map +1 -1
  42. package/dist/connectors/github/dlq.js +9 -1
  43. package/dist/connectors/github/dlq.js.map +1 -1
  44. package/dist/connectors/github/idempotency.d.ts.map +1 -1
  45. package/dist/connectors/github/idempotency.js +2 -0
  46. package/dist/connectors/github/idempotency.js.map +1 -1
  47. package/dist/connectors/github/octokit-client.d.ts +2 -1
  48. package/dist/connectors/github/octokit-client.d.ts.map +1 -1
  49. package/dist/connectors/github/octokit-client.js +8 -3
  50. package/dist/connectors/github/octokit-client.js.map +1 -1
  51. package/dist/connectors/github/tenant-routing.d.ts.map +1 -1
  52. package/dist/connectors/github/tenant-routing.js +8 -0
  53. package/dist/connectors/github/tenant-routing.js.map +1 -1
  54. package/dist/connectors/github/types.d.ts +14 -5
  55. package/dist/connectors/github/types.d.ts.map +1 -1
  56. package/dist/connectors/github/types.js +35 -29
  57. package/dist/connectors/github/types.js.map +1 -1
  58. package/dist/connectors/slack/backfill.d.ts.map +1 -1
  59. package/dist/connectors/slack/backfill.js +2 -0
  60. package/dist/connectors/slack/backfill.js.map +1 -1
  61. package/dist/connectors/slack/deletion.d.ts.map +1 -1
  62. package/dist/connectors/slack/deletion.js +2 -0
  63. package/dist/connectors/slack/deletion.js.map +1 -1
  64. package/dist/connectors/slack/dlq.d.ts.map +1 -1
  65. package/dist/connectors/slack/dlq.js +3 -1
  66. package/dist/connectors/slack/dlq.js.map +1 -1
  67. package/dist/connectors/slack/idempotency.d.ts.map +1 -1
  68. package/dist/connectors/slack/idempotency.js +2 -0
  69. package/dist/connectors/slack/idempotency.js.map +1 -1
  70. package/dist/connectors/slack/tenant-routing.d.ts.map +1 -1
  71. package/dist/connectors/slack/tenant-routing.js +4 -0
  72. package/dist/connectors/slack/tenant-routing.js.map +1 -1
  73. package/dist/connectors/slack/types.d.ts +8 -3
  74. package/dist/connectors/slack/types.d.ts.map +1 -1
  75. package/dist/connectors/slack/types.js +22 -10
  76. package/dist/connectors/slack/types.js.map +1 -1
  77. package/dist/connectors/slack/web-client.d.ts +0 -9
  78. package/dist/connectors/slack/web-client.d.ts.map +1 -1
  79. package/dist/connectors/slack/web-client.js +11 -11
  80. package/dist/connectors/slack/web-client.js.map +1 -1
  81. package/dist/connectors/slack/workspaces.d.ts.map +1 -1
  82. package/dist/connectors/slack/workspaces.js +2 -0
  83. package/dist/connectors/slack/workspaces.js.map +1 -1
  84. package/dist/consolidate.d.ts.map +1 -1
  85. package/dist/consolidate.js +8 -3
  86. package/dist/consolidate.js.map +1 -1
  87. package/dist/customer-notes.d.ts.map +1 -1
  88. package/dist/customer-notes.js +17 -0
  89. package/dist/customer-notes.js.map +1 -1
  90. package/dist/dag.js +1 -1
  91. package/dist/dag.js.map +1 -1
  92. package/dist/dashboard.d.ts.map +1 -1
  93. package/dist/dashboard.js +5 -2
  94. package/dist/dashboard.js.map +1 -1
  95. package/dist/db.d.ts +1 -1
  96. package/dist/db.d.ts.map +1 -1
  97. package/dist/db.js +24 -0
  98. package/dist/db.js.map +1 -1
  99. package/dist/decisions.d.ts.map +1 -1
  100. package/dist/decisions.js +10 -0
  101. package/dist/decisions.js.map +1 -1
  102. package/dist/dedupe.d.ts +14 -6
  103. package/dist/dedupe.d.ts.map +1 -1
  104. package/dist/dedupe.js +61 -39
  105. package/dist/dedupe.js.map +1 -1
  106. package/dist/embedding-provider.d.ts.map +1 -1
  107. package/dist/embedding-provider.js +24 -15
  108. package/dist/embedding-provider.js.map +1 -1
  109. package/dist/embeddings.d.ts.map +1 -1
  110. package/dist/embeddings.js +17 -1
  111. package/dist/embeddings.js.map +1 -1
  112. package/dist/eval-suite.d.ts.map +1 -1
  113. package/dist/eval-suite.js +5 -0
  114. package/dist/eval-suite.js.map +1 -1
  115. package/dist/extract.d.ts.map +1 -1
  116. package/dist/extract.js +10 -3
  117. package/dist/extract.js.map +1 -1
  118. package/dist/goals.d.ts.map +1 -1
  119. package/dist/goals.js +26 -12
  120. package/dist/goals.js.map +1 -1
  121. package/dist/graph-extract.d.ts.map +1 -1
  122. package/dist/graph-extract.js +9 -1
  123. package/dist/graph-extract.js.map +1 -1
  124. package/dist/graph-view.d.ts.map +1 -1
  125. package/dist/graph-view.js.map +1 -1
  126. package/dist/graph.d.ts.map +1 -1
  127. package/dist/graph.js +38 -13
  128. package/dist/graph.js.map +1 -1
  129. package/dist/hooks.d.ts.map +1 -1
  130. package/dist/hooks.js +42 -21
  131. package/dist/hooks.js.map +1 -1
  132. package/dist/importers.d.ts.map +1 -1
  133. package/dist/importers.js +23 -42
  134. package/dist/importers.js.map +1 -1
  135. package/dist/incidents.d.ts.map +1 -1
  136. package/dist/incidents.js +14 -0
  137. package/dist/incidents.js.map +1 -1
  138. package/dist/mcp/server.d.ts +4 -1
  139. package/dist/mcp/server.d.ts.map +1 -1
  140. package/dist/mcp/server.js +58 -28
  141. package/dist/mcp/server.js.map +1 -1
  142. package/dist/memory-value.d.ts +0 -10
  143. package/dist/memory-value.d.ts.map +1 -1
  144. package/dist/memory-value.js +8 -2
  145. package/dist/memory-value.js.map +1 -1
  146. package/dist/memory.js.map +1 -1
  147. package/dist/physics-state.d.ts.map +1 -1
  148. package/dist/physics-state.js +5 -0
  149. package/dist/physics-state.js.map +1 -1
  150. package/dist/physics.js.map +1 -1
  151. package/dist/policies.d.ts.map +1 -1
  152. package/dist/policies.js +22 -0
  153. package/dist/policies.js.map +1 -1
  154. package/dist/predictions.d.ts.map +1 -1
  155. package/dist/predictions.js +14 -0
  156. package/dist/predictions.js.map +1 -1
  157. package/dist/processes.d.ts +7 -1
  158. package/dist/processes.d.ts.map +1 -1
  159. package/dist/processes.js +21 -2
  160. package/dist/processes.js.map +1 -1
  161. package/dist/project-briefs.d.ts.map +1 -1
  162. package/dist/project-briefs.js +28 -2
  163. package/dist/project-briefs.js.map +1 -1
  164. package/dist/raw-archive-mirror-cleanup.d.ts.map +1 -1
  165. package/dist/raw-archive-mirror-cleanup.js +2 -0
  166. package/dist/raw-archive-mirror-cleanup.js.map +1 -1
  167. package/dist/raw-archive.d.ts +0 -9
  168. package/dist/raw-archive.d.ts.map +1 -1
  169. package/dist/raw-archive.js +3 -9
  170. package/dist/raw-archive.js.map +1 -1
  171. package/dist/recall-scope.d.ts.map +1 -1
  172. package/dist/recall-scope.js +11 -6
  173. package/dist/recall-scope.js.map +1 -1
  174. package/dist/recall-trace.d.ts.map +1 -1
  175. package/dist/recall-trace.js +7 -3
  176. package/dist/recall-trace.js.map +1 -1
  177. package/dist/refine-llm.d.ts.map +1 -1
  178. package/dist/refine-llm.js +3 -0
  179. package/dist/refine-llm.js.map +1 -1
  180. package/dist/reject-flow.d.ts.map +1 -1
  181. package/dist/reject-flow.js +2 -0
  182. package/dist/reject-flow.js.map +1 -1
  183. package/dist/rejection.d.ts.map +1 -1
  184. package/dist/rejection.js +3 -0
  185. package/dist/rejection.js.map +1 -1
  186. package/dist/replay.js.map +1 -1
  187. package/dist/rerankers/cross-encoder.d.ts.map +1 -1
  188. package/dist/rerankers/cross-encoder.js +11 -4
  189. package/dist/rerankers/cross-encoder.js.map +1 -1
  190. package/dist/rerankers/index.d.ts.map +1 -1
  191. package/dist/rerankers/index.js +5 -3
  192. package/dist/rerankers/index.js.map +1 -1
  193. package/dist/rerankers/llm.d.ts.map +1 -1
  194. package/dist/rerankers/llm.js +8 -5
  195. package/dist/rerankers/llm.js.map +1 -1
  196. package/dist/rerankers/types.d.ts +6 -1
  197. package/dist/rerankers/types.d.ts.map +1 -1
  198. package/dist/scheduler.d.ts +16 -0
  199. package/dist/scheduler.d.ts.map +1 -1
  200. package/dist/scheduler.js +15 -5
  201. package/dist/scheduler.js.map +1 -1
  202. package/dist/search.d.ts +4 -6
  203. package/dist/search.d.ts.map +1 -1
  204. package/dist/search.js.map +1 -1
  205. package/dist/server-detect.d.ts.map +1 -1
  206. package/dist/server-detect.js +2 -0
  207. package/dist/server-detect.js.map +1 -1
  208. package/dist/server.d.ts.map +1 -1
  209. package/dist/server.js +194 -135
  210. package/dist/server.js.map +1 -1
  211. package/dist/skills.d.ts.map +1 -1
  212. package/dist/skills.js +10 -3
  213. package/dist/skills.js.map +1 -1
  214. package/dist/src/api.js +78 -142
  215. package/dist/src/api.js.map +1 -1
  216. package/dist/src/audit-prune.js +7 -1
  217. package/dist/src/audit-prune.js.map +1 -1
  218. package/dist/src/audit.js +13 -6
  219. package/dist/src/audit.js.map +1 -1
  220. package/dist/src/auth.js +6 -0
  221. package/dist/src/auth.js.map +1 -1
  222. package/dist/src/autolearn.js +4 -4
  223. package/dist/src/autolearn.js.map +1 -1
  224. package/dist/src/capture.js +93 -66
  225. package/dist/src/capture.js.map +1 -1
  226. package/dist/src/client.js +32 -14
  227. package/dist/src/client.js.map +1 -1
  228. package/dist/src/config.js +7 -4
  229. package/dist/src/config.js.map +1 -1
  230. package/dist/src/connectors/github/backfill.js +25 -16
  231. package/dist/src/connectors/github/backfill.js.map +1 -1
  232. package/dist/src/connectors/github/cli-impl.js +20 -4
  233. package/dist/src/connectors/github/cli-impl.js.map +1 -1
  234. package/dist/src/connectors/github/deletion.js +2 -0
  235. package/dist/src/connectors/github/deletion.js.map +1 -1
  236. package/dist/src/connectors/github/dlq.js +9 -1
  237. package/dist/src/connectors/github/dlq.js.map +1 -1
  238. package/dist/src/connectors/github/idempotency.js +2 -0
  239. package/dist/src/connectors/github/idempotency.js.map +1 -1
  240. package/dist/src/connectors/github/octokit-client.js +8 -3
  241. package/dist/src/connectors/github/octokit-client.js.map +1 -1
  242. package/dist/src/connectors/github/tenant-routing.js +8 -0
  243. package/dist/src/connectors/github/tenant-routing.js.map +1 -1
  244. package/dist/src/connectors/github/types.js +35 -29
  245. package/dist/src/connectors/github/types.js.map +1 -1
  246. package/dist/src/connectors/slack/backfill.js +2 -0
  247. package/dist/src/connectors/slack/backfill.js.map +1 -1
  248. package/dist/src/connectors/slack/deletion.js +2 -0
  249. package/dist/src/connectors/slack/deletion.js.map +1 -1
  250. package/dist/src/connectors/slack/dlq.js +3 -1
  251. package/dist/src/connectors/slack/dlq.js.map +1 -1
  252. package/dist/src/connectors/slack/idempotency.js +2 -0
  253. package/dist/src/connectors/slack/idempotency.js.map +1 -1
  254. package/dist/src/connectors/slack/tenant-routing.js +4 -0
  255. package/dist/src/connectors/slack/tenant-routing.js.map +1 -1
  256. package/dist/src/connectors/slack/types.js +22 -10
  257. package/dist/src/connectors/slack/types.js.map +1 -1
  258. package/dist/src/connectors/slack/web-client.js +11 -11
  259. package/dist/src/connectors/slack/web-client.js.map +1 -1
  260. package/dist/src/connectors/slack/workspaces.js +2 -0
  261. package/dist/src/connectors/slack/workspaces.js.map +1 -1
  262. package/dist/src/consolidate.js +8 -3
  263. package/dist/src/consolidate.js.map +1 -1
  264. package/dist/src/customer-notes.js +17 -0
  265. package/dist/src/customer-notes.js.map +1 -1
  266. package/dist/src/dag.js +1 -1
  267. package/dist/src/dag.js.map +1 -1
  268. package/dist/src/dashboard.js +5 -2
  269. package/dist/src/dashboard.js.map +1 -1
  270. package/dist/src/db.js +24 -0
  271. package/dist/src/db.js.map +1 -1
  272. package/dist/src/decisions.js +10 -0
  273. package/dist/src/decisions.js.map +1 -1
  274. package/dist/src/dedupe.js +61 -39
  275. package/dist/src/dedupe.js.map +1 -1
  276. package/dist/src/embedding-provider.js +24 -15
  277. package/dist/src/embedding-provider.js.map +1 -1
  278. package/dist/src/embeddings.js +17 -1
  279. package/dist/src/embeddings.js.map +1 -1
  280. package/dist/src/eval-suite.js +5 -0
  281. package/dist/src/eval-suite.js.map +1 -1
  282. package/dist/src/extract.js +10 -3
  283. package/dist/src/extract.js.map +1 -1
  284. package/dist/src/goals.js +26 -12
  285. package/dist/src/goals.js.map +1 -1
  286. package/dist/src/graph-extract.js +9 -1
  287. package/dist/src/graph-extract.js.map +1 -1
  288. package/dist/src/graph-view.js.map +1 -1
  289. package/dist/src/graph.js +38 -13
  290. package/dist/src/graph.js.map +1 -1
  291. package/dist/src/hooks.js +42 -21
  292. package/dist/src/hooks.js.map +1 -1
  293. package/dist/src/importers.js +23 -42
  294. package/dist/src/importers.js.map +1 -1
  295. package/dist/src/incidents.js +14 -0
  296. package/dist/src/incidents.js.map +1 -1
  297. package/dist/src/mcp/server.js +58 -28
  298. package/dist/src/mcp/server.js.map +1 -1
  299. package/dist/src/memory-value.js +8 -2
  300. package/dist/src/memory-value.js.map +1 -1
  301. package/dist/src/memory.js.map +1 -1
  302. package/dist/src/physics-state.js +5 -0
  303. package/dist/src/physics-state.js.map +1 -1
  304. package/dist/src/physics.js.map +1 -1
  305. package/dist/src/policies.js +22 -0
  306. package/dist/src/policies.js.map +1 -1
  307. package/dist/src/predictions.js +14 -0
  308. package/dist/src/predictions.js.map +1 -1
  309. package/dist/src/processes.js +21 -2
  310. package/dist/src/processes.js.map +1 -1
  311. package/dist/src/project-briefs.js +28 -2
  312. package/dist/src/project-briefs.js.map +1 -1
  313. package/dist/src/raw-archive-mirror-cleanup.js +2 -0
  314. package/dist/src/raw-archive-mirror-cleanup.js.map +1 -1
  315. package/dist/src/raw-archive.js +3 -9
  316. package/dist/src/raw-archive.js.map +1 -1
  317. package/dist/src/recall-scope.js +11 -6
  318. package/dist/src/recall-scope.js.map +1 -1
  319. package/dist/src/recall-trace.js +7 -3
  320. package/dist/src/recall-trace.js.map +1 -1
  321. package/dist/src/refine-llm.js +3 -0
  322. package/dist/src/refine-llm.js.map +1 -1
  323. package/dist/src/reject-flow.js +2 -0
  324. package/dist/src/reject-flow.js.map +1 -1
  325. package/dist/src/rejection.js +3 -0
  326. package/dist/src/rejection.js.map +1 -1
  327. package/dist/src/replay.js.map +1 -1
  328. package/dist/src/rerankers/cross-encoder.js +11 -4
  329. package/dist/src/rerankers/cross-encoder.js.map +1 -1
  330. package/dist/src/rerankers/index.js +5 -3
  331. package/dist/src/rerankers/index.js.map +1 -1
  332. package/dist/src/rerankers/llm.js +8 -5
  333. package/dist/src/rerankers/llm.js.map +1 -1
  334. package/dist/src/scheduler.js +15 -5
  335. package/dist/src/scheduler.js.map +1 -1
  336. package/dist/src/search.js.map +1 -1
  337. package/dist/src/server-detect.js +2 -0
  338. package/dist/src/server-detect.js.map +1 -1
  339. package/dist/src/server.js +194 -135
  340. package/dist/src/server.js.map +1 -1
  341. package/dist/src/skills.js +10 -3
  342. package/dist/src/skills.js.map +1 -1
  343. package/dist/src/store.js +140 -14
  344. package/dist/src/store.js.map +1 -1
  345. package/dist/src/trace.js +15 -7
  346. package/dist/src/trace.js.map +1 -1
  347. package/dist/src/version.js +1 -1
  348. package/dist/src/working-memory.js +8 -0
  349. package/dist/src/working-memory.js.map +1 -1
  350. package/dist/src/yaml.js +12 -3
  351. package/dist/src/yaml.js.map +1 -1
  352. package/dist/store.d.ts +16 -3
  353. package/dist/store.d.ts.map +1 -1
  354. package/dist/store.js +140 -14
  355. package/dist/store.js.map +1 -1
  356. package/dist/trace.d.ts.map +1 -1
  357. package/dist/trace.js +15 -7
  358. package/dist/trace.js.map +1 -1
  359. package/dist/version.d.ts +1 -1
  360. package/dist/version.js +1 -1
  361. package/dist/working-memory.d.ts +6 -2
  362. package/dist/working-memory.d.ts.map +1 -1
  363. package/dist/working-memory.js +8 -0
  364. package/dist/working-memory.js.map +1 -1
  365. package/dist/yaml.d.ts.map +1 -1
  366. package/dist/yaml.js +12 -3
  367. package/dist/yaml.js.map +1 -1
  368. package/dist-ui/assets/{index-Cxa4RcAh.js → index-DOqenbV2.js} +11 -11
  369. package/dist-ui/index.html +1 -1
  370. package/extensions/openclaw-plugin/index.ts +50 -10
  371. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  372. package/extensions/openclaw-plugin/package.json +1 -1
  373. package/openclaw.plugin.json +1 -1
  374. package/package.json +4 -1
@@ -24,7 +24,7 @@
24
24
  height: 100vh;
25
25
  }
26
26
  </style>
27
- <script type="module" crossorigin src="/assets/index-Cxa4RcAh.js"></script>
27
+ <script type="module" crossorigin src="/assets/index-DOqenbV2.js"></script>
28
28
  <link rel="modulepreload" crossorigin href="/assets/react-CEUiQZj-.js">
29
29
  <link rel="modulepreload" crossorigin href="/assets/three-BDgTxR1l.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/d3-BiWEKnn4.js">
@@ -28,6 +28,38 @@ type HippoRuntimeContext = {
28
28
  sessionKey?: string;
29
29
  };
30
30
 
31
+ /**
32
+ * Dependency-injection seam for tests. Production code always uses the real
33
+ * child_process/fs functions imported above; tests override this via
34
+ * __setHippoPluginDeps to substitute fakes instead of `vi.mock`ing the
35
+ * built-in modules. Never called outside tests -- register(api)'s public
36
+ * behavior is unaffected when it's never invoked.
37
+ *
38
+ * The function shapes below are narrower than Node's full overloaded
39
+ * child_process/fs types -- they capture only the call shape this plugin
40
+ * actually uses, so test doubles don't need to satisfy every overload.
41
+ */
42
+ export interface HippoPluginDeps {
43
+ execFileSync: (
44
+ file: string,
45
+ args: readonly string[],
46
+ options: { cwd: string; encoding: 'utf8'; timeout: number; stdio: string[] },
47
+ ) => string;
48
+ spawn: (
49
+ command: string,
50
+ args: string[],
51
+ options: { cwd: string; detached: boolean; stdio: string; windowsHide: boolean },
52
+ ) => { unref: () => void };
53
+ existsSync: (path: string) => boolean;
54
+ }
55
+
56
+ let deps: HippoPluginDeps = { execFileSync, spawn, existsSync };
57
+
58
+ /** Test-only override. Not part of the plugin's public API surface. */
59
+ export function __setHippoPluginDeps(overrides: Partial<HippoPluginDeps>): void {
60
+ deps = { ...deps, ...overrides };
61
+ }
62
+
31
63
  const AUTO_SLEEP_SESSION_THRESHOLD = 10;
32
64
  const MAX_ERRORS_PER_SESSION = 5;
33
65
  const sessionMemoryCounts = new Map<string, number>();
@@ -59,6 +91,12 @@ function isNoiseError(error: string): boolean {
59
91
  return NOISE_ERROR_PATTERNS.some((p) => p.test(error));
60
92
  }
61
93
 
94
+ /** True for a non-empty string, without assuming the input's shape — used
95
+ * on values read off the untyped OpenClaw plugin `api` surface. */
96
+ function isNonEmptyString<T>(value: T): value is T & string {
97
+ return typeof value === 'string' && value.length > 0;
98
+ }
99
+
62
100
  function hashError(toolName: string, error: string): string {
63
101
  // Normalize the error to a stable key: tool + first 80 chars of error
64
102
  const normalized = error.replace(/\s+/g, ' ').trim().slice(0, 80).toLowerCase();
@@ -75,7 +113,7 @@ function getConfig(api: any): HippoConfig {
75
113
  }
76
114
 
77
115
  function findHippoRoot(workspace?: string, configRoot?: string): string | null {
78
- if (configRoot && existsSync(configRoot)) return configRoot;
116
+ if (configRoot && deps.existsSync(configRoot)) return configRoot;
79
117
 
80
118
  const home = process.env.USERPROFILE || process.env.HOME || '';
81
119
  const candidates = [
@@ -84,10 +122,10 @@ function findHippoRoot(workspace?: string, configRoot?: string): string | null {
84
122
  process.env.HIPPO_ROOT,
85
123
  process.env.XDG_DATA_HOME ? join(process.env.XDG_DATA_HOME, 'hippo') : null,
86
124
  home ? join(home, '.hippo') : null,
87
- ].filter(Boolean) as string[];
125
+ ].filter((candidate): candidate is string => Boolean(candidate));
88
126
 
89
127
  for (const candidate of candidates) {
90
- if (existsSync(candidate)) return candidate;
128
+ if (deps.existsSync(candidate)) return candidate;
91
129
  }
92
130
  return null;
93
131
  }
@@ -99,16 +137,16 @@ function getAgentWorkspace(api: any, agentId?: string): string | undefined {
99
137
 
100
138
  if (agentId) {
101
139
  const match = list.find((agent: any) => agent?.id === agentId);
102
- if (typeof match?.workspace === 'string' && match.workspace) return match.workspace;
140
+ if (isNonEmptyString(match?.workspace)) return match.workspace;
103
141
  }
104
142
 
105
143
  const defaultAgent = list.find((agent: any) => agent?.default);
106
- if (typeof defaultAgent?.workspace === 'string' && defaultAgent.workspace) {
144
+ if (isNonEmptyString(defaultAgent?.workspace)) {
107
145
  return defaultAgent.workspace;
108
146
  }
109
147
 
110
148
  const fallback = agents?.defaults?.workspace;
111
- return typeof fallback === 'string' && fallback ? fallback : undefined;
149
+ return isNonEmptyString(fallback) ? fallback : undefined;
112
150
  } catch {
113
151
  return undefined;
114
152
  }
@@ -173,7 +211,7 @@ function cleanupBackupPlugins(logger?: { info?: (...args: unknown[]) => void }):
173
211
  process.env.USERPROFILE || process.env.HOME || '',
174
212
  '.openclaw', 'extensions'
175
213
  );
176
- if (!existsSync(extensionsDir)) return;
214
+ if (!deps.existsSync(extensionsDir)) return;
177
215
 
178
216
  for (const entry of readdirSync(extensionsDir)) {
179
217
  if (entry.startsWith('hippo-memory.bak')) {
@@ -193,13 +231,15 @@ function hippoRememberSucceeded(result: string): boolean {
193
231
 
194
232
  function runHippo(args: readonly string[], cwd?: string): string {
195
233
  try {
196
- const result = execFileSync('hippo', args, {
234
+ const result = deps.execFileSync('hippo', args, {
197
235
  cwd: cwd || process.cwd(),
198
236
  encoding: 'utf8',
199
237
  timeout: 30_000,
200
238
  stdio: ['pipe', 'pipe', 'pipe'],
201
239
  });
202
- return typeof result === 'string' ? result.trim() : '';
240
+ // `encoding: 'utf8'` above selects the ExecFileSyncOptionsWithStringEncoding
241
+ // overload, so `result` is always a `string` here — no runtime check needed.
242
+ return result.trim();
203
243
  } catch (err: any) {
204
244
  return err.stdout?.trim() || err.message || 'hippo command failed';
205
245
  }
@@ -207,7 +247,7 @@ function runHippo(args: readonly string[], cwd?: string): string {
207
247
 
208
248
  function spawnHippoDetached(args: readonly string[], cwd?: string): boolean {
209
249
  try {
210
- const child = spawn('hippo', [...args], {
250
+ const child = deps.spawn('hippo', [...args], {
211
251
  cwd: cwd || process.cwd(),
212
252
  detached: true,
213
253
  stdio: 'ignore',
@@ -2,7 +2,7 @@
2
2
  "id": "hippo-memory",
3
3
  "name": "Hippo Memory",
4
4
  "description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
5
- "version": "1.32.0",
5
+ "version": "1.33.0",
6
6
 
7
7
  "configSchema": {
8
8
  "type": "object",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hippo-memory",
3
- "version": "1.32.0",
3
+ "version": "1.33.0",
4
4
  "description": "Hippo Memory plugin for OpenClaw - biologically-inspired agent memory",
5
5
  "main": "index.ts",
6
6
  "openclaw": {
@@ -2,7 +2,7 @@
2
2
  "id": "hippo-memory",
3
3
  "name": "Hippo Memory",
4
4
  "description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
5
- "version": "1.32.0",
5
+ "version": "1.33.0",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hippo-memory",
3
- "version": "1.32.0",
3
+ "version": "1.33.0",
4
4
  "description": "Biologically-inspired memory system for AI agents. Decay by default, strength through use.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,6 +30,7 @@
30
30
  "pretest": "npm run build",
31
31
  "test": "vitest run",
32
32
  "test:watch": "vitest",
33
+ "lint": "oxlint",
33
34
  "audit:security": "npm audit --audit-level=high && npm --prefix ui audit --audit-level=high",
34
35
  "postinstall": "node scripts/postinstall.cjs",
35
36
  "smoke:pack": "node scripts/smoke-pack.mjs",
@@ -62,7 +63,9 @@
62
63
  "node": ">=22.5.0"
63
64
  },
64
65
  "devDependencies": {
66
+ "@oxlint/plugins": "^1.78.0",
65
67
  "@types/node": "^20.11.0",
68
+ "oxlint": "^1.78.0",
66
69
  "typescript": "^5.4.0",
67
70
  "vitest": "^3.2.6"
68
71
  },