indusagi 0.12.13 → 0.12.16

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 (344) hide show
  1. package/dist/agent/agent-session.d.ts +352 -0
  2. package/dist/agent/agent-session.d.ts.map +1 -0
  3. package/dist/agent/agent-session.js +870 -0
  4. package/dist/agent/agent-session.js.map +1 -0
  5. package/dist/agent/agent-session.test.d.ts +5 -0
  6. package/dist/agent/agent-session.test.d.ts.map +1 -0
  7. package/dist/agent/agent-session.test.js +129 -0
  8. package/dist/agent/agent-session.test.js.map +1 -0
  9. package/dist/agent/agent.d.ts +108 -2
  10. package/dist/agent/agent.d.ts.map +1 -1
  11. package/dist/agent/agent.js +210 -17
  12. package/dist/agent/agent.js.map +1 -1
  13. package/dist/agent/bash-executor.d.ts +33 -0
  14. package/dist/agent/bash-executor.d.ts.map +1 -0
  15. package/dist/agent/bash-executor.js +197 -0
  16. package/dist/agent/bash-executor.js.map +1 -0
  17. package/dist/agent/compaction/compaction.d.ts +87 -0
  18. package/dist/agent/compaction/compaction.d.ts.map +1 -0
  19. package/dist/agent/compaction/compaction.js +598 -0
  20. package/dist/agent/compaction/compaction.js.map +1 -0
  21. package/dist/agent/compaction/index.d.ts +6 -0
  22. package/dist/agent/compaction/index.d.ts.map +1 -0
  23. package/dist/agent/compaction/index.js +6 -0
  24. package/dist/agent/compaction/index.js.map +1 -0
  25. package/dist/agent/compaction/utils.d.ts +41 -0
  26. package/dist/agent/compaction/utils.d.ts.map +1 -0
  27. package/dist/agent/compaction/utils.js +240 -0
  28. package/dist/agent/compaction/utils.js.map +1 -0
  29. package/dist/agent/event-bus.js +1 -3
  30. package/dist/agent/event-bus.js.map +1 -1
  31. package/dist/agent/index.d.ts +11 -5
  32. package/dist/agent/index.d.ts.map +1 -1
  33. package/dist/agent/index.js +19 -8
  34. package/dist/agent/index.js.map +1 -1
  35. package/dist/agent/messages.d.ts +2 -48
  36. package/dist/agent/messages.d.ts.map +1 -1
  37. package/dist/agent/messages.js.map +1 -1
  38. package/dist/agent/proxy.js.map +1 -1
  39. package/dist/agent/session-manager.d.ts +2 -3
  40. package/dist/agent/session-manager.d.ts.map +1 -1
  41. package/dist/agent/session-manager.js +10 -6
  42. package/dist/agent/session-manager.js.map +1 -1
  43. package/dist/agent/settings-manager.d.ts +204 -0
  44. package/dist/agent/settings-manager.d.ts.map +1 -0
  45. package/dist/agent/settings-manager.js +594 -0
  46. package/dist/agent/settings-manager.js.map +1 -0
  47. package/dist/agent/state-manager.js +1 -0
  48. package/dist/agent/state-manager.js.map +1 -1
  49. package/dist/agent/telemetry.js +1 -3
  50. package/dist/agent/telemetry.js.map +1 -1
  51. package/dist/agent/tools/bash.js +1 -0
  52. package/dist/agent/tools/bash.js.map +1 -1
  53. package/dist/agent/tools/edit.test.d.ts +6 -0
  54. package/dist/agent/tools/edit.test.d.ts.map +1 -0
  55. package/dist/agent/tools/edit.test.js +196 -0
  56. package/dist/agent/tools/edit.test.js.map +1 -0
  57. package/dist/agent/tools/index.d.ts +26 -26
  58. package/dist/agent/tools/registry.d.ts +1 -1
  59. package/dist/agent/tools/registry.d.ts.map +1 -1
  60. package/dist/agent/tools/registry.js +2 -4
  61. package/dist/agent/tools/registry.js.map +1 -1
  62. package/dist/agent/tools/todo-store.js +2 -1
  63. package/dist/agent/tools/todo-store.js.map +1 -1
  64. package/dist/agent/tools/utils/hook-runner.js +1 -3
  65. package/dist/agent/tools/utils/hook-runner.js.map +1 -1
  66. package/dist/agent/types.d.ts +139 -1
  67. package/dist/agent/types.d.ts.map +1 -1
  68. package/dist/agent/types.js.map +1 -1
  69. package/dist/ai/api-registry.js +1 -3
  70. package/dist/ai/api-registry.js.map +1 -1
  71. package/dist/ai/models.generated.d.ts +621 -53
  72. package/dist/ai/models.generated.d.ts.map +1 -1
  73. package/dist/ai/models.generated.js +548 -0
  74. package/dist/ai/models.generated.js.map +1 -1
  75. package/dist/ai/models.js +1 -0
  76. package/dist/ai/models.js.map +1 -1
  77. package/dist/ai/providers/amazon-bedrock.d.ts +6 -0
  78. package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -1
  79. package/dist/ai/providers/amazon-bedrock.js +47 -9
  80. package/dist/ai/providers/amazon-bedrock.js.map +1 -1
  81. package/dist/ai/providers/anthropic.d.ts +8 -0
  82. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  83. package/dist/ai/providers/anthropic.js +28 -12
  84. package/dist/ai/providers/anthropic.js.map +1 -1
  85. package/dist/ai/providers/azure-openai-responses.js +1 -0
  86. package/dist/ai/providers/azure-openai-responses.js.map +1 -1
  87. package/dist/ai/providers/github-copilot-headers.d.ts +33 -0
  88. package/dist/ai/providers/github-copilot-headers.d.ts.map +1 -0
  89. package/dist/ai/providers/github-copilot-headers.js +51 -0
  90. package/dist/ai/providers/github-copilot-headers.js.map +1 -0
  91. package/dist/ai/providers/google-shared.d.ts.map +1 -1
  92. package/dist/ai/providers/google-shared.js +16 -22
  93. package/dist/ai/providers/google-shared.js.map +1 -1
  94. package/dist/ai/providers/google-vertex.d.ts.map +1 -1
  95. package/dist/ai/providers/google-vertex.js +28 -5
  96. package/dist/ai/providers/google-vertex.js.map +1 -1
  97. package/dist/ai/providers/google.js +1 -0
  98. package/dist/ai/providers/google.js.map +1 -1
  99. package/dist/ai/providers/kimi.js +1 -0
  100. package/dist/ai/providers/kimi.js.map +1 -1
  101. package/dist/ai/providers/mistral.d.ts +22 -0
  102. package/dist/ai/providers/mistral.d.ts.map +1 -0
  103. package/dist/ai/providers/mistral.js +497 -0
  104. package/dist/ai/providers/mistral.js.map +1 -0
  105. package/dist/ai/providers/openai-codex-responses.js +1 -0
  106. package/dist/ai/providers/openai-codex-responses.js.map +1 -1
  107. package/dist/ai/providers/openai-completions.js +2 -0
  108. package/dist/ai/providers/openai-completions.js.map +1 -1
  109. package/dist/ai/providers/openai-responses.d.ts.map +1 -1
  110. package/dist/ai/providers/openai-responses.js +30 -0
  111. package/dist/ai/providers/openai-responses.js.map +1 -1
  112. package/dist/ai/providers/register-builtins.d.ts.map +1 -1
  113. package/dist/ai/providers/register-builtins.js +6 -0
  114. package/dist/ai/providers/register-builtins.js.map +1 -1
  115. package/dist/ai/providers/simple-options.js +2 -0
  116. package/dist/ai/providers/simple-options.js.map +1 -1
  117. package/dist/ai/providers/transform-messages.js +3 -9
  118. package/dist/ai/providers/transform-messages.js.map +1 -1
  119. package/dist/ai/stream.js +1 -3
  120. package/dist/ai/stream.js.map +1 -1
  121. package/dist/ai/types.d.ts +34 -0
  122. package/dist/ai/types.d.ts.map +1 -1
  123. package/dist/ai/types.js.map +1 -1
  124. package/dist/ai/utils/base-stream-handler.js +1 -0
  125. package/dist/ai/utils/base-stream-handler.js.map +1 -1
  126. package/dist/ai/utils/event-stream.js +9 -4
  127. package/dist/ai/utils/event-stream.js.map +1 -1
  128. package/dist/ai/utils/hash.d.ts +6 -0
  129. package/dist/ai/utils/hash.d.ts.map +1 -0
  130. package/dist/ai/utils/hash.js +17 -0
  131. package/dist/ai/utils/hash.js.map +1 -0
  132. package/dist/ai/utils/index.d.ts +1 -0
  133. package/dist/ai/utils/index.d.ts.map +1 -1
  134. package/dist/ai/utils/index.js +1 -0
  135. package/dist/ai/utils/index.js.map +1 -1
  136. package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -1
  137. package/dist/ai/utils/oauth/github-copilot.js +19 -8
  138. package/dist/ai/utils/oauth/github-copilot.js.map +1 -1
  139. package/dist/ai/utils/overflow.d.ts.map +1 -1
  140. package/dist/ai/utils/overflow.js +4 -0
  141. package/dist/ai/utils/overflow.js.map +1 -1
  142. package/dist/ai/utils/provider-adapter.js +9 -0
  143. package/dist/ai/utils/provider-adapter.js.map +1 -1
  144. package/dist/ai/utils/provider-client-builder.js +1 -1
  145. package/dist/ai/utils/provider-client-builder.js.map +1 -1
  146. package/dist/ai/utils/provider-errors.js +2 -0
  147. package/dist/ai/utils/provider-errors.js.map +1 -1
  148. package/dist/ai/utils/stream-event-helper.js +3 -0
  149. package/dist/ai/utils/stream-event-helper.js.map +1 -1
  150. package/dist/ai/utils/stream-handler-types.js +5 -0
  151. package/dist/ai/utils/stream-handler-types.js.map +1 -1
  152. package/dist/ai/utils/streaming-state-manager.js +4 -2
  153. package/dist/ai/utils/streaming-state-manager.js.map +1 -1
  154. package/dist/index.d.ts +1 -0
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +1 -0
  157. package/dist/index.js.map +1 -1
  158. package/dist/mcp/client-pool.d.ts +106 -0
  159. package/dist/mcp/client-pool.d.ts.map +1 -0
  160. package/dist/mcp/client-pool.js +234 -0
  161. package/dist/mcp/client-pool.js.map +1 -0
  162. package/dist/mcp/client.d.ts +158 -0
  163. package/dist/mcp/client.d.ts.map +1 -0
  164. package/dist/mcp/client.js +599 -0
  165. package/dist/mcp/client.js.map +1 -0
  166. package/dist/mcp/config.d.ts +61 -0
  167. package/dist/mcp/config.d.ts.map +1 -0
  168. package/dist/mcp/config.js +250 -0
  169. package/dist/mcp/config.js.map +1 -0
  170. package/dist/mcp/errors.d.ts +104 -0
  171. package/dist/mcp/errors.d.ts.map +1 -0
  172. package/dist/mcp/errors.js +146 -0
  173. package/dist/mcp/errors.js.map +1 -0
  174. package/dist/mcp/index.d.ts +56 -0
  175. package/dist/mcp/index.d.ts.map +1 -0
  176. package/dist/mcp/index.js +83 -0
  177. package/dist/mcp/index.js.map +1 -0
  178. package/dist/mcp/schema-converter.d.ts +68 -0
  179. package/dist/mcp/schema-converter.d.ts.map +1 -0
  180. package/dist/mcp/schema-converter.js +230 -0
  181. package/dist/mcp/schema-converter.js.map +1 -0
  182. package/dist/mcp/server.d.ts +111 -0
  183. package/dist/mcp/server.d.ts.map +1 -0
  184. package/dist/mcp/server.js +305 -0
  185. package/dist/mcp/server.js.map +1 -0
  186. package/dist/mcp/tool-factory.d.ts +63 -0
  187. package/dist/mcp/tool-factory.d.ts.map +1 -0
  188. package/dist/mcp/tool-factory.js +228 -0
  189. package/dist/mcp/tool-factory.js.map +1 -0
  190. package/dist/mcp/types.d.ts +289 -0
  191. package/dist/mcp/types.d.ts.map +1 -0
  192. package/dist/mcp/types.js +8 -0
  193. package/dist/mcp/types.js.map +1 -0
  194. package/dist/mcp.d.ts +6 -0
  195. package/dist/mcp.d.ts.map +1 -0
  196. package/dist/mcp.js +6 -0
  197. package/dist/mcp.js.map +1 -0
  198. package/dist/memory/embedder/base.d.ts +41 -0
  199. package/dist/memory/embedder/base.d.ts.map +1 -0
  200. package/dist/memory/embedder/base.js +10 -0
  201. package/dist/memory/embedder/base.js.map +1 -0
  202. package/dist/memory/embedder/index.d.ts +8 -0
  203. package/dist/memory/embedder/index.d.ts.map +1 -0
  204. package/dist/memory/embedder/index.js +6 -0
  205. package/dist/memory/embedder/index.js.map +1 -0
  206. package/dist/memory/embedder/openai.d.ts +35 -0
  207. package/dist/memory/embedder/openai.d.ts.map +1 -0
  208. package/dist/memory/embedder/openai.js +109 -0
  209. package/dist/memory/embedder/openai.js.map +1 -0
  210. package/dist/memory/index.d.ts +33 -0
  211. package/dist/memory/index.d.ts.map +1 -0
  212. package/dist/memory/index.js +31 -0
  213. package/dist/memory/index.js.map +1 -0
  214. package/dist/memory/memory.d.ts +126 -0
  215. package/dist/memory/memory.d.ts.map +1 -0
  216. package/dist/memory/memory.js +285 -0
  217. package/dist/memory/memory.js.map +1 -0
  218. package/dist/memory/processors/base.d.ts +42 -0
  219. package/dist/memory/processors/base.d.ts.map +1 -0
  220. package/dist/memory/processors/base.js +6 -0
  221. package/dist/memory/processors/base.js.map +1 -0
  222. package/dist/memory/processors/index.d.ts +16 -0
  223. package/dist/memory/processors/index.d.ts.map +1 -0
  224. package/dist/memory/processors/index.js +18 -0
  225. package/dist/memory/processors/index.js.map +1 -0
  226. package/dist/memory/processors/message-history.d.ts +35 -0
  227. package/dist/memory/processors/message-history.d.ts.map +1 -0
  228. package/dist/memory/processors/message-history.js +53 -0
  229. package/dist/memory/processors/message-history.js.map +1 -0
  230. package/dist/memory/processors/observational-memory/index.d.ts +82 -0
  231. package/dist/memory/processors/observational-memory/index.d.ts.map +1 -0
  232. package/dist/memory/processors/observational-memory/index.js +239 -0
  233. package/dist/memory/processors/observational-memory/index.js.map +1 -0
  234. package/dist/memory/processors/observational-memory/observer-agent.d.ts +64 -0
  235. package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +1 -0
  236. package/dist/memory/processors/observational-memory/observer-agent.js +362 -0
  237. package/dist/memory/processors/observational-memory/observer-agent.js.map +1 -0
  238. package/dist/memory/processors/observational-memory/reflector-agent.d.ts +38 -0
  239. package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +1 -0
  240. package/dist/memory/processors/observational-memory/reflector-agent.js +213 -0
  241. package/dist/memory/processors/observational-memory/reflector-agent.js.map +1 -0
  242. package/dist/memory/processors/observational-memory/token-counter.d.ts +35 -0
  243. package/dist/memory/processors/observational-memory/token-counter.d.ts.map +1 -0
  244. package/dist/memory/processors/observational-memory/token-counter.js +90 -0
  245. package/dist/memory/processors/observational-memory/token-counter.js.map +1 -0
  246. package/dist/memory/processors/semantic-recall.d.ts +55 -0
  247. package/dist/memory/processors/semantic-recall.d.ts.map +1 -0
  248. package/dist/memory/processors/semantic-recall.js +152 -0
  249. package/dist/memory/processors/semantic-recall.js.map +1 -0
  250. package/dist/memory/processors/working-memory.d.ts +41 -0
  251. package/dist/memory/processors/working-memory.d.ts.map +1 -0
  252. package/dist/memory/processors/working-memory.js +87 -0
  253. package/dist/memory/processors/working-memory.js.map +1 -0
  254. package/dist/memory/storage/base.d.ts +288 -0
  255. package/dist/memory/storage/base.d.ts.map +1 -0
  256. package/dist/memory/storage/base.js +209 -0
  257. package/dist/memory/storage/base.js.map +1 -0
  258. package/dist/memory/storage/index.d.ts +9 -0
  259. package/dist/memory/storage/index.d.ts.map +1 -0
  260. package/dist/memory/storage/index.js +7 -0
  261. package/dist/memory/storage/index.js.map +1 -0
  262. package/dist/memory/storage/inmemory.d.ts +93 -0
  263. package/dist/memory/storage/inmemory.d.ts.map +1 -0
  264. package/dist/memory/storage/inmemory.js +647 -0
  265. package/dist/memory/storage/inmemory.js.map +1 -0
  266. package/dist/memory/tools/working-memory.d.ts +100 -0
  267. package/dist/memory/tools/working-memory.d.ts.map +1 -0
  268. package/dist/memory/tools/working-memory.js +237 -0
  269. package/dist/memory/tools/working-memory.js.map +1 -0
  270. package/dist/memory/types.d.ts +386 -0
  271. package/dist/memory/types.d.ts.map +1 -0
  272. package/dist/memory/types.js +58 -0
  273. package/dist/memory/types.js.map +1 -0
  274. package/dist/memory/vector/base.d.ts +145 -0
  275. package/dist/memory/vector/base.d.ts.map +1 -0
  276. package/dist/memory/vector/base.js +81 -0
  277. package/dist/memory/vector/base.js.map +1 -0
  278. package/dist/memory/vector/index.d.ts +8 -0
  279. package/dist/memory/vector/index.d.ts.map +1 -0
  280. package/dist/memory/vector/index.js +7 -0
  281. package/dist/memory/vector/index.js.map +1 -0
  282. package/dist/memory/vector/inmemory.d.ts +47 -0
  283. package/dist/memory/vector/inmemory.d.ts.map +1 -0
  284. package/dist/memory/vector/inmemory.js +231 -0
  285. package/dist/memory/vector/inmemory.js.map +1 -0
  286. package/dist/tui/autocomplete.js +5 -1
  287. package/dist/tui/autocomplete.js.map +1 -1
  288. package/dist/tui/components/box.js +9 -1
  289. package/dist/tui/components/box.js.map +1 -1
  290. package/dist/tui/components/cancellable-loader.js +3 -4
  291. package/dist/tui/components/cancellable-loader.js.map +1 -1
  292. package/dist/tui/components/editor.d.ts +39 -3
  293. package/dist/tui/components/editor.d.ts.map +1 -1
  294. package/dist/tui/components/editor.js +162 -133
  295. package/dist/tui/components/editor.js.map +1 -1
  296. package/dist/tui/components/image.js +8 -0
  297. package/dist/tui/components/image.js.map +1 -1
  298. package/dist/tui/components/input.js +10 -11
  299. package/dist/tui/components/input.js.map +1 -1
  300. package/dist/tui/components/loader.js +7 -4
  301. package/dist/tui/components/loader.js.map +1 -1
  302. package/dist/tui/components/markdown.js +10 -0
  303. package/dist/tui/components/markdown.js.map +1 -1
  304. package/dist/tui/components/select-list.js +8 -4
  305. package/dist/tui/components/select-list.js.map +1 -1
  306. package/dist/tui/components/settings-list.js +12 -4
  307. package/dist/tui/components/settings-list.js.map +1 -1
  308. package/dist/tui/components/spacer.js +1 -0
  309. package/dist/tui/components/spacer.js.map +1 -1
  310. package/dist/tui/components/text.js +5 -0
  311. package/dist/tui/components/text.js.map +1 -1
  312. package/dist/tui/components/truncated-text.js +3 -0
  313. package/dist/tui/components/truncated-text.js.map +1 -1
  314. package/dist/tui/fuzzy.js +4 -1
  315. package/dist/tui/fuzzy.js.map +1 -1
  316. package/dist/tui/keybindings.js +3 -2
  317. package/dist/tui/keybindings.js.map +1 -1
  318. package/dist/tui/keys.d.ts +17 -1
  319. package/dist/tui/keys.d.ts.map +1 -1
  320. package/dist/tui/keys.js +56 -0
  321. package/dist/tui/keys.js.map +1 -1
  322. package/dist/tui/kill-ring.d.ts +28 -0
  323. package/dist/tui/kill-ring.d.ts.map +1 -0
  324. package/dist/tui/kill-ring.js +44 -0
  325. package/dist/tui/kill-ring.js.map +1 -0
  326. package/dist/tui/stdin-buffer.js +6 -5
  327. package/dist/tui/stdin-buffer.js.map +1 -1
  328. package/dist/tui/terminal-image.js +1 -3
  329. package/dist/tui/terminal-image.js.map +1 -1
  330. package/dist/tui/terminal.d.ts +13 -0
  331. package/dist/tui/terminal.d.ts.map +1 -1
  332. package/dist/tui/terminal.js +70 -7
  333. package/dist/tui/terminal.js.map +1 -1
  334. package/dist/tui/tui.d.ts +36 -0
  335. package/dist/tui/tui.d.ts.map +1 -1
  336. package/dist/tui/tui.js +101 -29
  337. package/dist/tui/tui.js.map +1 -1
  338. package/dist/tui/undo-stack.d.ts +17 -0
  339. package/dist/tui/undo-stack.d.ts.map +1 -0
  340. package/dist/tui/undo-stack.js +25 -0
  341. package/dist/tui/undo-stack.js.map +1 -0
  342. package/dist/tui/utils.js +12 -16
  343. package/dist/tui/utils.js.map +1 -1
  344. package/package.json +32 -2
@@ -0,0 +1,647 @@
1
+ /**
2
+ * In-Memory Storage Implementation
3
+ * Based on Mastra InMemoryMemory
4
+ */
5
+ import { MemoryStorage, normalizePerPage, calculatePagination, } from "./base.js";
6
+ /**
7
+ * Create a new in-memory database
8
+ */
9
+ export function createInMemoryDB() {
10
+ return {
11
+ threads: new Map(),
12
+ messages: new Map(),
13
+ resources: new Map(),
14
+ observationalMemory: new Map(),
15
+ };
16
+ }
17
+ /**
18
+ * In-Memory Storage Implementation
19
+ */
20
+ export class InMemoryStorage extends MemoryStorage {
21
+ name = "inmemory";
22
+ supportsObservationalMemory = true;
23
+ db;
24
+ constructor(db) {
25
+ super();
26
+ this.db = db ?? createInMemoryDB();
27
+ }
28
+ async init() {
29
+ // Nothing to initialize for in-memory storage
30
+ }
31
+ async dangerouslyClearAll() {
32
+ this.db.threads.clear();
33
+ this.db.messages.clear();
34
+ this.db.resources.clear();
35
+ this.db.observationalMemory.clear();
36
+ }
37
+ // ========================================================================
38
+ // Thread Operations
39
+ // ========================================================================
40
+ async getThreadById({ threadId }) {
41
+ const thread = this.db.threads.get(threadId);
42
+ return thread ? { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata } : null;
43
+ }
44
+ async saveThread({ thread }) {
45
+ this.db.threads.set(thread.id, thread);
46
+ return thread;
47
+ }
48
+ async updateThread({ id, title, metadata, }) {
49
+ const thread = this.db.threads.get(id);
50
+ if (!thread) {
51
+ throw new Error(`Thread with id ${id} not found`);
52
+ }
53
+ if (title !== undefined)
54
+ thread.title = title;
55
+ if (metadata !== undefined)
56
+ thread.metadata = { ...thread.metadata, ...metadata };
57
+ thread.updatedAt = new Date();
58
+ return thread;
59
+ }
60
+ async deleteThread({ threadId }) {
61
+ this.db.threads.delete(threadId);
62
+ // Delete all messages in the thread
63
+ for (const [key, msg] of this.db.messages) {
64
+ if (msg.thread_id === threadId) {
65
+ this.db.messages.delete(key);
66
+ }
67
+ }
68
+ }
69
+ async listThreads(args) {
70
+ const { page = 0, perPage: perPageInput, orderBy, filter } = args;
71
+ const { field, direction } = this.parseOrderBy(orderBy);
72
+ this.validatePaginationInput(page, perPageInput ?? 100);
73
+ const perPage = normalizePerPage(perPageInput, 100);
74
+ // Start with all threads
75
+ let threads = Array.from(this.db.threads.values());
76
+ // Apply resourceId filter if provided
77
+ if (filter?.resourceId) {
78
+ threads = threads.filter(t => t.resourceId === filter.resourceId);
79
+ }
80
+ // Validate and apply metadata filter
81
+ this.validateMetadataKeys(filter?.metadata);
82
+ if (filter?.metadata && Object.keys(filter.metadata).length > 0) {
83
+ threads = threads.filter(thread => {
84
+ if (!thread.metadata)
85
+ return false;
86
+ return Object.entries(filter.metadata).every(([key, value]) => deepEquals(thread.metadata[key], value));
87
+ });
88
+ }
89
+ // Sort threads
90
+ threads.sort((a, b) => {
91
+ const aValue = new Date(a[field]).getTime();
92
+ const bValue = new Date(b[field]).getTime();
93
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
94
+ });
95
+ // Clone threads for output
96
+ const clonedThreads = threads.map(thread => ({
97
+ ...thread,
98
+ metadata: thread.metadata ? { ...thread.metadata } : thread.metadata,
99
+ }));
100
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
101
+ return {
102
+ threads: clonedThreads.slice(offset, offset + perPage),
103
+ total: clonedThreads.length,
104
+ page,
105
+ perPage: perPageForResponse,
106
+ hasMore: offset + perPage < clonedThreads.length,
107
+ };
108
+ }
109
+ // ========================================================================
110
+ // Message Operations
111
+ // ========================================================================
112
+ async listMessages({ threadId, resourceId: optionalResourceId, include, filter, perPage: perPageInput, page = 0, orderBy, }) {
113
+ const threadIds = Array.isArray(threadId) ? threadId : [threadId];
114
+ if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {
115
+ throw new Error("threadId must be a non-empty string or array of non-empty strings");
116
+ }
117
+ const threadIdSet = new Set(threadIds);
118
+ const { field, direction } = this.parseOrderBy(orderBy, "ASC");
119
+ const perPage = normalizePerPage(perPageInput, 40);
120
+ if (page < 0) {
121
+ throw new Error("page must be >= 0");
122
+ }
123
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
124
+ // Get messages matching threadId(s)
125
+ let threadMessages = Array.from(this.db.messages.values()).filter(msg => {
126
+ if (threadIdSet && !threadIdSet.has(msg.thread_id))
127
+ return false;
128
+ if (optionalResourceId && msg.resourceId !== optionalResourceId)
129
+ return false;
130
+ return true;
131
+ });
132
+ // Apply date filtering
133
+ if (filter?.dateRange) {
134
+ const { start, end } = filter.dateRange;
135
+ if (start) {
136
+ threadMessages = threadMessages.filter(msg => new Date(msg.createdAt) >= start);
137
+ }
138
+ if (end) {
139
+ threadMessages = threadMessages.filter(msg => new Date(msg.createdAt) <= end);
140
+ }
141
+ }
142
+ // Sort messages
143
+ threadMessages.sort((a, b) => {
144
+ const aDate = field === "updatedAt" ? a.updatedAt : a.createdAt;
145
+ const bDate = field === "updatedAt" ? b.updatedAt : b.createdAt;
146
+ const aValue = new Date(aDate ?? a.createdAt).getTime();
147
+ const bValue = new Date(bDate ?? b.createdAt).getTime();
148
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
149
+ });
150
+ const totalThreadMessages = threadMessages.length;
151
+ // Apply pagination
152
+ const paginatedMessages = threadMessages.slice(offset, offset + perPage);
153
+ // Convert to CoreMessage format
154
+ const messages = paginatedMessages.map(msg => this.parseStoredMessage(msg));
155
+ const messageIds = new Set(messages.map(m => m.id));
156
+ // Add included messages
157
+ if (include && include.length > 0) {
158
+ for (const includeItem of include) {
159
+ const targetMessage = this.db.messages.get(includeItem.id);
160
+ if (targetMessage && !messageIds.has(targetMessage.id)) {
161
+ const convertedMessage = this.parseStoredMessage(targetMessage);
162
+ messages.push(convertedMessage);
163
+ messageIds.add(targetMessage.id);
164
+ }
165
+ }
166
+ }
167
+ // Final sort
168
+ messages.sort((a, b) => {
169
+ const aValue = new Date(a.createdAt).getTime();
170
+ const bValue = new Date(b.createdAt).getTime();
171
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
172
+ });
173
+ return {
174
+ messages,
175
+ total: totalThreadMessages,
176
+ page,
177
+ perPage: perPageForResponse,
178
+ hasMore: offset + perPage < totalThreadMessages,
179
+ };
180
+ }
181
+ async listMessagesById({ messageIds }) {
182
+ const rawMessages = messageIds
183
+ .map(id => this.db.messages.get(id))
184
+ .filter((msg) => !!msg);
185
+ return {
186
+ messages: rawMessages.map(m => this.parseStoredMessage(m)),
187
+ };
188
+ }
189
+ async saveMessages(args) {
190
+ const { messages } = args;
191
+ // Update thread timestamps
192
+ const threadIds = new Set(messages.map(msg => msg.threadId).filter((id) => Boolean(id)));
193
+ for (const threadId of threadIds) {
194
+ const thread = this.db.threads.get(threadId);
195
+ if (thread) {
196
+ thread.updatedAt = new Date();
197
+ }
198
+ }
199
+ // Save messages
200
+ for (const message of messages) {
201
+ const storageMessage = {
202
+ id: message.id,
203
+ thread_id: message.threadId || "",
204
+ content: typeof message.content === "string"
205
+ ? message.content
206
+ : JSON.stringify(message.content),
207
+ role: message.role,
208
+ type: "text",
209
+ createdAt: message.createdAt,
210
+ resourceId: message.resourceId || null,
211
+ };
212
+ this.db.messages.set(message.id, storageMessage);
213
+ }
214
+ return { messages };
215
+ }
216
+ async updateMessages(args) {
217
+ const updatedMessages = [];
218
+ for (const update of args.messages) {
219
+ const storageMsg = this.db.messages.get(update.id);
220
+ if (!storageMsg)
221
+ continue;
222
+ if (update.role !== undefined)
223
+ storageMsg.role = update.role;
224
+ if (update.resourceId !== undefined)
225
+ storageMsg.resourceId = update.resourceId;
226
+ if (update.threadId !== undefined)
227
+ storageMsg.thread_id = update.threadId;
228
+ if (update.content !== undefined) {
229
+ storageMsg.content = typeof update.content === "string"
230
+ ? update.content
231
+ : JSON.stringify(update.content);
232
+ }
233
+ updatedMessages.push(this.parseStoredMessage(storageMsg));
234
+ }
235
+ return updatedMessages;
236
+ }
237
+ async deleteMessages(messageIds) {
238
+ if (!messageIds || messageIds.length === 0)
239
+ return;
240
+ const threadIds = new Set();
241
+ for (const messageId of messageIds) {
242
+ const message = this.db.messages.get(messageId);
243
+ if (message && message.thread_id) {
244
+ threadIds.add(message.thread_id);
245
+ }
246
+ this.db.messages.delete(messageId);
247
+ }
248
+ // Update thread timestamps
249
+ const now = new Date();
250
+ for (const threadId of threadIds) {
251
+ const thread = this.db.threads.get(threadId);
252
+ if (thread) {
253
+ thread.updatedAt = now;
254
+ }
255
+ }
256
+ }
257
+ // ========================================================================
258
+ // Resource Operations
259
+ // ========================================================================
260
+ async getResourceById({ resourceId }) {
261
+ const resource = this.db.resources.get(resourceId);
262
+ return resource
263
+ ? { ...resource, metadata: resource.metadata ? { ...resource.metadata } : resource.metadata }
264
+ : null;
265
+ }
266
+ async saveResource({ resource }) {
267
+ this.db.resources.set(resource.id, resource);
268
+ return resource;
269
+ }
270
+ async updateResource({ resourceId, workingMemory, metadata, }) {
271
+ let resource = this.db.resources.get(resourceId);
272
+ if (!resource) {
273
+ resource = {
274
+ id: resourceId,
275
+ workingMemory,
276
+ metadata: metadata || {},
277
+ createdAt: new Date(),
278
+ updatedAt: new Date(),
279
+ };
280
+ }
281
+ else {
282
+ resource = {
283
+ ...resource,
284
+ workingMemory: workingMemory !== undefined ? workingMemory : resource.workingMemory,
285
+ metadata: {
286
+ ...resource.metadata,
287
+ ...metadata,
288
+ },
289
+ updatedAt: new Date(),
290
+ };
291
+ }
292
+ this.db.resources.set(resourceId, resource);
293
+ return resource;
294
+ }
295
+ // ========================================================================
296
+ // Observational Memory Operations
297
+ // ========================================================================
298
+ getObservationalMemoryKey(threadId, resourceId) {
299
+ if (threadId) {
300
+ return `thread:${threadId}`;
301
+ }
302
+ return `resource:${resourceId}`;
303
+ }
304
+ async getObservationalMemory(threadId, resourceId) {
305
+ const key = this.getObservationalMemoryKey(threadId, resourceId);
306
+ const records = this.db.observationalMemory.get(key);
307
+ return records?.[0] ?? null;
308
+ }
309
+ async getObservationalMemoryHistory(threadId, resourceId, limit) {
310
+ const key = this.getObservationalMemoryKey(threadId, resourceId);
311
+ const records = this.db.observationalMemory.get(key) ?? [];
312
+ return limit != null ? records.slice(0, limit) : records;
313
+ }
314
+ async initializeObservationalMemory(input) {
315
+ const { threadId, resourceId, scope, config, observedTimezone } = input;
316
+ const key = this.getObservationalMemoryKey(threadId, resourceId);
317
+ const now = new Date();
318
+ const record = {
319
+ id: crypto.randomUUID(),
320
+ scope,
321
+ threadId,
322
+ resourceId,
323
+ createdAt: now,
324
+ updatedAt: now,
325
+ lastObservedAt: undefined,
326
+ originType: "initial",
327
+ generationCount: 0,
328
+ activeObservations: "",
329
+ bufferedObservationChunks: undefined,
330
+ bufferedReflection: undefined,
331
+ totalTokensObserved: 0,
332
+ observationTokenCount: 0,
333
+ pendingMessageTokens: 0,
334
+ isReflecting: false,
335
+ isObserving: false,
336
+ isBufferingObservation: false,
337
+ isBufferingReflection: false,
338
+ lastBufferedAtTokens: 0,
339
+ lastBufferedAtTime: null,
340
+ config,
341
+ observedTimezone,
342
+ metadata: {},
343
+ };
344
+ const existing = this.db.observationalMemory.get(key) ?? [];
345
+ this.db.observationalMemory.set(key, [record, ...existing]);
346
+ return record;
347
+ }
348
+ async insertObservationalMemoryRecord(record) {
349
+ const key = this.getObservationalMemoryKey(record.threadId, record.resourceId);
350
+ const existing = this.db.observationalMemory.get(key) ?? [];
351
+ let inserted = false;
352
+ for (let i = 0; i < existing.length; i++) {
353
+ if (record.generationCount >= existing[i].generationCount) {
354
+ existing.splice(i, 0, record);
355
+ inserted = true;
356
+ break;
357
+ }
358
+ }
359
+ if (!inserted)
360
+ existing.push(record);
361
+ this.db.observationalMemory.set(key, existing);
362
+ }
363
+ async updateActiveObservations(input) {
364
+ const { id, observations, tokenCount, lastObservedAt, observedMessageIds } = input;
365
+ const record = this.findObservationalMemoryRecordById(id);
366
+ if (!record) {
367
+ throw new Error(`Observational memory record not found: ${id}`);
368
+ }
369
+ record.activeObservations = observations;
370
+ record.observationTokenCount = tokenCount;
371
+ record.totalTokensObserved += tokenCount;
372
+ record.pendingMessageTokens = 0;
373
+ record.lastObservedAt = lastObservedAt;
374
+ record.updatedAt = new Date();
375
+ if (observedMessageIds) {
376
+ record.observedMessageIds = observedMessageIds;
377
+ }
378
+ }
379
+ async updateBufferedObservations(input) {
380
+ const { id, chunk, lastBufferedAtTime } = input;
381
+ const record = this.findObservationalMemoryRecordById(id);
382
+ if (!record) {
383
+ throw new Error(`Observational memory record not found: ${id}`);
384
+ }
385
+ const newChunk = {
386
+ id: `ombuf-${crypto.randomUUID()}`,
387
+ cycleId: chunk.cycleId,
388
+ observations: chunk.observations,
389
+ tokenCount: chunk.tokenCount,
390
+ messageIds: chunk.messageIds,
391
+ messageTokens: chunk.messageTokens,
392
+ lastObservedAt: chunk.lastObservedAt,
393
+ createdAt: new Date(),
394
+ suggestedContinuation: chunk.suggestedContinuation,
395
+ currentTask: chunk.currentTask,
396
+ };
397
+ const existingChunks = Array.isArray(record.bufferedObservationChunks)
398
+ ? record.bufferedObservationChunks
399
+ : [];
400
+ record.bufferedObservationChunks = [...existingChunks, newChunk];
401
+ if (lastBufferedAtTime) {
402
+ record.lastBufferedAtTime = lastBufferedAtTime;
403
+ }
404
+ record.updatedAt = new Date();
405
+ }
406
+ async swapBufferedToActive(input) {
407
+ const { id, activationRatio, lastObservedAt, messageTokensThreshold, currentPendingTokens, forceMaxActivation } = input;
408
+ const record = this.findObservationalMemoryRecordById(id);
409
+ if (!record) {
410
+ throw new Error(`Observational memory record not found: ${id}`);
411
+ }
412
+ const chunks = Array.isArray(record.bufferedObservationChunks)
413
+ ? record.bufferedObservationChunks
414
+ : [];
415
+ if (chunks.length === 0) {
416
+ return {
417
+ chunksActivated: 0,
418
+ messageTokensActivated: 0,
419
+ observationTokensActivated: 0,
420
+ messagesActivated: 0,
421
+ activatedCycleIds: [],
422
+ activatedMessageIds: [],
423
+ };
424
+ }
425
+ const retentionFloor = messageTokensThreshold * (1 - activationRatio);
426
+ const targetMessageTokens = Math.max(0, currentPendingTokens - retentionFloor);
427
+ let cumulativeMessageTokens = 0;
428
+ let chunksToActivate = 1;
429
+ for (let i = 0; i < chunks.length; i++) {
430
+ cumulativeMessageTokens += chunks[i].messageTokens ?? 0;
431
+ if (cumulativeMessageTokens >= targetMessageTokens) {
432
+ chunksToActivate = i + 1;
433
+ break;
434
+ }
435
+ }
436
+ const activatedChunks = chunks.slice(0, chunksToActivate);
437
+ const remainingChunks = chunks.slice(chunksToActivate);
438
+ const activatedContent = activatedChunks.map(c => c.observations).join("\n\n");
439
+ const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);
440
+ const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);
441
+ const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);
442
+ const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id) => !!id);
443
+ const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds);
444
+ const latestChunk = activatedChunks[activatedChunks.length - 1];
445
+ const derivedLastObservedAt = lastObservedAt ??
446
+ (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());
447
+ if (record.activeObservations) {
448
+ record.activeObservations = `${record.activeObservations}\n\n${activatedContent}`;
449
+ }
450
+ else {
451
+ record.activeObservations = activatedContent;
452
+ }
453
+ record.observationTokenCount = (record.observationTokenCount ?? 0) + activatedTokens;
454
+ record.pendingMessageTokens = Math.max(0, (record.pendingMessageTokens ?? 0) - activatedMessageTokens);
455
+ record.bufferedObservationChunks = remainingChunks.length > 0 ? remainingChunks : undefined;
456
+ record.lastObservedAt = derivedLastObservedAt;
457
+ record.updatedAt = new Date();
458
+ return {
459
+ chunksActivated: activatedChunks.length,
460
+ messageTokensActivated: activatedMessageTokens,
461
+ observationTokensActivated: activatedTokens,
462
+ messagesActivated: activatedMessageCount,
463
+ activatedCycleIds,
464
+ activatedMessageIds,
465
+ observations: activatedContent,
466
+ suggestedContinuation: latestChunk?.suggestedContinuation ?? undefined,
467
+ currentTask: latestChunk?.currentTask ?? undefined,
468
+ };
469
+ }
470
+ async createReflectionGeneration(input) {
471
+ const { currentRecord, reflection, tokenCount } = input;
472
+ const key = this.getObservationalMemoryKey(currentRecord.threadId, currentRecord.resourceId);
473
+ const now = new Date();
474
+ const newRecord = {
475
+ id: crypto.randomUUID(),
476
+ scope: currentRecord.scope,
477
+ threadId: currentRecord.threadId,
478
+ resourceId: currentRecord.resourceId,
479
+ createdAt: now,
480
+ updatedAt: now,
481
+ lastObservedAt: currentRecord.lastObservedAt ?? now,
482
+ originType: "reflection",
483
+ generationCount: currentRecord.generationCount + 1,
484
+ activeObservations: reflection,
485
+ config: currentRecord.config,
486
+ totalTokensObserved: currentRecord.totalTokensObserved,
487
+ observationTokenCount: tokenCount,
488
+ pendingMessageTokens: 0,
489
+ isReflecting: false,
490
+ isObserving: false,
491
+ isBufferingObservation: false,
492
+ isBufferingReflection: false,
493
+ lastBufferedAtTokens: 0,
494
+ lastBufferedAtTime: null,
495
+ observedTimezone: currentRecord.observedTimezone,
496
+ metadata: {},
497
+ };
498
+ const existing = this.db.observationalMemory.get(key) ?? [];
499
+ this.db.observationalMemory.set(key, [newRecord, ...existing]);
500
+ return newRecord;
501
+ }
502
+ async updateBufferedReflection(input) {
503
+ const { id, reflection, tokenCount, inputTokenCount, reflectedObservationLineCount } = input;
504
+ const record = this.findObservationalMemoryRecordById(id);
505
+ if (!record) {
506
+ throw new Error(`Observational memory record not found: ${id}`);
507
+ }
508
+ const existing = record.bufferedReflection || "";
509
+ record.bufferedReflection = existing ? `${existing}\n\n${reflection}` : reflection;
510
+ record.bufferedReflectionTokens = (record.bufferedReflectionTokens || 0) + tokenCount;
511
+ record.bufferedReflectionInputTokens = (record.bufferedReflectionInputTokens || 0) + inputTokenCount;
512
+ record.reflectedObservationLineCount = reflectedObservationLineCount;
513
+ record.updatedAt = new Date();
514
+ }
515
+ async swapBufferedReflectionToActive(input) {
516
+ const { currentRecord, tokenCount } = input;
517
+ const record = this.findObservationalMemoryRecordById(currentRecord.id);
518
+ if (!record) {
519
+ throw new Error(`Observational memory record not found: ${currentRecord.id}`);
520
+ }
521
+ if (!record.bufferedReflection) {
522
+ throw new Error("No buffered reflection to swap");
523
+ }
524
+ const bufferedReflection = record.bufferedReflection;
525
+ const reflectedLineCount = record.reflectedObservationLineCount ?? 0;
526
+ const currentObservations = record.activeObservations ?? "";
527
+ const allLines = currentObservations.split("\n");
528
+ const unreflectedLines = allLines.slice(reflectedLineCount);
529
+ const unreflectedContent = unreflectedLines.join("\n").trim();
530
+ const newObservations = unreflectedContent
531
+ ? `${bufferedReflection}\n\n${unreflectedContent}`
532
+ : bufferedReflection;
533
+ const newRecord = await this.createReflectionGeneration({
534
+ currentRecord: record,
535
+ reflection: newObservations,
536
+ tokenCount,
537
+ });
538
+ record.bufferedReflection = undefined;
539
+ record.bufferedReflectionTokens = undefined;
540
+ record.bufferedReflectionInputTokens = undefined;
541
+ record.reflectedObservationLineCount = undefined;
542
+ return newRecord;
543
+ }
544
+ async setReflectingFlag(id, isReflecting) {
545
+ const record = this.findObservationalMemoryRecordById(id);
546
+ if (!record)
547
+ throw new Error(`Observational memory record not found: ${id}`);
548
+ record.isReflecting = isReflecting;
549
+ record.updatedAt = new Date();
550
+ }
551
+ async setObservingFlag(id, isObserving) {
552
+ const record = this.findObservationalMemoryRecordById(id);
553
+ if (!record)
554
+ throw new Error(`Observational memory record not found: ${id}`);
555
+ record.isObserving = isObserving;
556
+ record.updatedAt = new Date();
557
+ }
558
+ async setBufferingObservationFlag(id, isBuffering, lastBufferedAtTokens) {
559
+ const record = this.findObservationalMemoryRecordById(id);
560
+ if (!record)
561
+ throw new Error(`Observational memory record not found: ${id}`);
562
+ record.isBufferingObservation = isBuffering;
563
+ if (lastBufferedAtTokens !== undefined) {
564
+ record.lastBufferedAtTokens = lastBufferedAtTokens;
565
+ }
566
+ record.updatedAt = new Date();
567
+ }
568
+ async setBufferingReflectionFlag(id, isBuffering) {
569
+ const record = this.findObservationalMemoryRecordById(id);
570
+ if (!record)
571
+ throw new Error(`Observational memory record not found: ${id}`);
572
+ record.isBufferingReflection = isBuffering;
573
+ record.updatedAt = new Date();
574
+ }
575
+ async clearObservationalMemory(threadId, resourceId) {
576
+ const key = this.getObservationalMemoryKey(threadId, resourceId);
577
+ this.db.observationalMemory.delete(key);
578
+ }
579
+ async setPendingMessageTokens(id, tokenCount) {
580
+ const record = this.findObservationalMemoryRecordById(id);
581
+ if (!record)
582
+ throw new Error(`Observational memory record not found: ${id}`);
583
+ record.pendingMessageTokens = tokenCount;
584
+ record.updatedAt = new Date();
585
+ }
586
+ // ========================================================================
587
+ // Private Helpers
588
+ // ========================================================================
589
+ parseStoredMessage(message) {
590
+ let parsedContent;
591
+ try {
592
+ const parsed = JSON.parse(message.content);
593
+ if (typeof parsed === "string") {
594
+ parsedContent = {
595
+ format: 2,
596
+ content: parsed,
597
+ parts: [{ type: "text", text: parsed }],
598
+ };
599
+ }
600
+ else {
601
+ parsedContent = parsed;
602
+ }
603
+ }
604
+ catch {
605
+ parsedContent = {
606
+ format: 2,
607
+ content: message.content,
608
+ parts: [{ type: "text", text: message.content }],
609
+ };
610
+ }
611
+ return {
612
+ id: message.id,
613
+ threadId: message.thread_id,
614
+ content: parsedContent,
615
+ role: message.role,
616
+ createdAt: message.createdAt,
617
+ resourceId: message.resourceId ?? undefined,
618
+ };
619
+ }
620
+ findObservationalMemoryRecordById(id) {
621
+ for (const records of this.db.observationalMemory.values()) {
622
+ const record = records.find(r => r.id === id);
623
+ if (record)
624
+ return record;
625
+ }
626
+ return null;
627
+ }
628
+ }
629
+ /**
630
+ * Deep equality check
631
+ */
632
+ function deepEquals(a, b) {
633
+ if (a === b)
634
+ return true;
635
+ if (typeof a !== typeof b)
636
+ return false;
637
+ if (typeof a !== "object" || a === null || b === null)
638
+ return false;
639
+ const aObj = a;
640
+ const bObj = b;
641
+ const aKeys = Object.keys(aObj);
642
+ const bKeys = Object.keys(bObj);
643
+ if (aKeys.length !== bKeys.length)
644
+ return false;
645
+ return aKeys.every(key => deepEquals(aObj[key], bObj[key]));
646
+ }
647
+ //# sourceMappingURL=inmemory.js.map