aws-runtime-bridge 1.9.33 → 1.9.41

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 (324) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +66 -5
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +771 -69
  4. package/dist/adapter/ClaudeSdkAdapter.d.ts +6 -0
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +24 -1
  7. package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
  8. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  9. package/dist/adapter/OpencodeSdkAdapter.js +62 -0
  10. package/dist/adapter/idle-poll-loop.d.ts +2 -1
  11. package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
  12. package/dist/adapter/types.d.ts +86 -9
  13. package/dist/adapter/types.d.ts.map +1 -1
  14. package/dist/adapter/types.js +15 -5
  15. package/dist/index.js +15 -0
  16. package/dist/routes/acode-todos.d.ts +11 -0
  17. package/dist/routes/acode-todos.d.ts.map +1 -0
  18. package/dist/routes/acode-todos.js +75 -0
  19. package/dist/routes/ai-sources.js +4 -1
  20. package/dist/routes/dashboard.d.ts.map +1 -1
  21. package/dist/routes/dashboard.js +1 -1
  22. package/dist/routes/memory.d.ts +1 -1
  23. package/dist/routes/memory.d.ts.map +1 -1
  24. package/dist/routes/memory.js +3 -3
  25. package/dist/routes/pty.d.ts.map +1 -1
  26. package/dist/routes/pty.js +9 -0
  27. package/dist/routes/runtime-binding.d.ts.map +1 -1
  28. package/dist/routes/runtime-binding.js +6 -3
  29. package/dist/routes/sessions.js +89 -4
  30. package/dist/routes/sub-agents.d.ts +14 -0
  31. package/dist/routes/sub-agents.d.ts.map +1 -0
  32. package/dist/routes/sub-agents.js +267 -0
  33. package/dist/routes/terminal.d.ts +12 -1
  34. package/dist/routes/terminal.d.ts.map +1 -1
  35. package/dist/routes/terminal.js +326 -24
  36. package/dist/services/acode-package.d.ts +8 -1
  37. package/dist/services/acode-package.d.ts.map +1 -1
  38. package/dist/services/acode-package.js +33 -4
  39. package/dist/services/agent-event-store.d.ts +1 -0
  40. package/dist/services/agent-event-store.d.ts.map +1 -1
  41. package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
  42. package/dist/services/aws-client-agent-mcp.js +11 -4
  43. package/dist/services/event-delta-pusher.js +4 -4
  44. package/dist/services/fileSnapshotStore.js +1 -1
  45. package/dist/services/legacy-path-migration.d.ts +3 -0
  46. package/dist/services/legacy-path-migration.d.ts.map +1 -0
  47. package/dist/services/legacy-path-migration.js +66 -0
  48. package/dist/services/lifecycle-state.d.ts.map +1 -1
  49. package/dist/services/lifecycle-state.js +1 -1
  50. package/dist/services/runtime-binding.d.ts +5 -0
  51. package/dist/services/runtime-binding.d.ts.map +1 -1
  52. package/dist/services/runtime-binding.js +33 -1
  53. package/dist/services/session-output.d.ts +10 -1
  54. package/dist/services/session-output.d.ts.map +1 -1
  55. package/dist/services/session-output.js +54 -4
  56. package/dist/services/sub-agent-manager-instance.d.ts +4 -0
  57. package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
  58. package/dist/services/sub-agent-manager-instance.js +12 -0
  59. package/dist/services/workspace-files.d.ts +1 -0
  60. package/dist/services/workspace-files.d.ts.map +1 -1
  61. package/dist/services/workspace-files.js +57 -1
  62. package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
  63. package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
  64. package/package/acode/dist/ask-user-question-tool.js +233 -0
  65. package/package/acode/dist/built-in-file-tools.d.ts +2 -0
  66. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  67. package/package/acode/dist/built-in-file-tools.js +504 -3
  68. package/package/acode/dist/compaction.d.ts +242 -0
  69. package/package/acode/dist/compaction.d.ts.map +1 -0
  70. package/package/acode/dist/compaction.js +919 -0
  71. package/package/acode/dist/config.d.ts +6 -1
  72. package/package/acode/dist/config.d.ts.map +1 -1
  73. package/package/acode/dist/config.js +27 -2
  74. package/package/acode/dist/index.d.ts +4 -0
  75. package/package/acode/dist/index.d.ts.map +1 -1
  76. package/package/acode/dist/index.js +4 -0
  77. package/package/acode/dist/runtime.d.ts +257 -0
  78. package/package/acode/dist/runtime.d.ts.map +1 -1
  79. package/package/acode/dist/runtime.js +1843 -191
  80. package/package/acode/dist/skill-tool.d.ts +30 -0
  81. package/package/acode/dist/skill-tool.d.ts.map +1 -0
  82. package/package/acode/dist/skill-tool.js +174 -0
  83. package/package/acode/dist/sub-agent-manager.d.ts +264 -0
  84. package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
  85. package/package/acode/dist/sub-agent-manager.js +825 -0
  86. package/package/acode/dist/sub-agent-store.d.ts +40 -0
  87. package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
  88. package/package/acode/dist/sub-agent-store.js +164 -0
  89. package/package/acode/dist/sub-agent-tools.d.ts +72 -0
  90. package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
  91. package/package/acode/dist/sub-agent-tools.js +429 -0
  92. package/package/acode/dist/sub-agent-types.d.ts +85 -0
  93. package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
  94. package/package/acode/dist/sub-agent-types.js +8 -0
  95. package/package/acode/dist/todo-store.d.ts +42 -0
  96. package/package/acode/dist/todo-store.d.ts.map +1 -0
  97. package/package/acode/dist/todo-store.js +68 -0
  98. package/package/acode/dist/todo-tool.d.ts +6 -0
  99. package/package/acode/dist/todo-tool.d.ts.map +1 -0
  100. package/package/acode/dist/todo-tool.js +138 -0
  101. package/package/acode/dist/types.d.ts +41 -1
  102. package/package/acode/dist/types.d.ts.map +1 -1
  103. package/package/acode/package.json +13 -2
  104. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
  105. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
  107. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/config.js +4 -0
  110. package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
  112. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/constants.js +3 -1
  114. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
  116. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
  118. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
  119. package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -3
  120. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  121. package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
  122. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  123. package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
  124. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  125. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +162 -71
  126. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  127. package/package/aws-client-agent-mcp/dist/mcp-server.js +1007 -504
  128. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  129. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +371 -253
  130. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  131. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +6 -17
  132. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  133. package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -75
  134. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  135. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +45 -45
  136. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  137. package/package/aws-client-agent-mcp/dist/memory-store.js +114 -162
  138. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  139. package/package/aws-client-agent-mcp/dist/memory-store.test.js +175 -164
  140. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
  141. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -9
  142. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  143. package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -58
  144. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  145. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +40 -9
  146. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
  147. package/package/aws-client-agent-mcp/dist/message-buffer.js +123 -23
  148. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
  149. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -13
  150. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  151. package/package/aws-client-agent-mcp/dist/server-memory-store.js +23 -16
  152. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  153. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  154. package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
  155. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  156. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
  157. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
  158. package/package/aws-client-agent-mcp/dist/types.d.ts +12 -25
  159. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  160. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  161. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
  162. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  163. package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
  164. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  165. package/package.json +17 -7
  166. package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
  167. package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
  168. package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
  169. package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
  170. package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
  171. package/dist/adapter/AdapterRegistry.test.js +0 -118
  172. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
  173. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
  174. package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
  175. package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
  176. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
  177. package/dist/adapter/CodexSdkAdapter.test.js +0 -270
  178. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
  179. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
  180. package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
  181. package/dist/adapter/acode-tool-names.test.d.ts +0 -2
  182. package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
  183. package/dist/adapter/acode-tool-names.test.js +0 -28
  184. package/dist/adapter/adapter.test.d.ts +0 -5
  185. package/dist/adapter/adapter.test.d.ts.map +0 -1
  186. package/dist/adapter/adapter.test.js +0 -180
  187. package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
  188. package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
  189. package/dist/adapter/idle-poll-loop.test.js +0 -85
  190. package/dist/adapter/types.test.d.ts +0 -2
  191. package/dist/adapter/types.test.d.ts.map +0 -1
  192. package/dist/adapter/types.test.js +0 -50
  193. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
  194. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
  195. package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
  196. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
  197. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
  198. package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
  199. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
  200. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
  201. package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
  202. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
  203. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
  204. package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
  205. package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
  206. package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
  207. package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
  208. package/dist/config.test.d.ts +0 -2
  209. package/dist/config.test.d.ts.map +0 -1
  210. package/dist/config.test.js +0 -107
  211. package/dist/routes/ai-sources.test.d.ts +0 -2
  212. package/dist/routes/ai-sources.test.d.ts.map +0 -1
  213. package/dist/routes/ai-sources.test.js +0 -169
  214. package/dist/routes/file-browser.test.d.ts +0 -5
  215. package/dist/routes/file-browser.test.d.ts.map +0 -1
  216. package/dist/routes/file-browser.test.js +0 -155
  217. package/dist/routes/git.test.d.ts +0 -2
  218. package/dist/routes/git.test.d.ts.map +0 -1
  219. package/dist/routes/git.test.js +0 -330
  220. package/dist/routes/instance.test.d.ts +0 -5
  221. package/dist/routes/instance.test.d.ts.map +0 -1
  222. package/dist/routes/instance.test.js +0 -389
  223. package/dist/routes/mcp.test.d.ts +0 -5
  224. package/dist/routes/mcp.test.d.ts.map +0 -1
  225. package/dist/routes/mcp.test.js +0 -92
  226. package/dist/routes/memory-route-wiring.test.d.ts +0 -2
  227. package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
  228. package/dist/routes/memory-route-wiring.test.js +0 -15
  229. package/dist/routes/memory.test.d.ts +0 -2
  230. package/dist/routes/memory.test.d.ts.map +0 -1
  231. package/dist/routes/memory.test.js +0 -177
  232. package/dist/routes/properties.test.d.ts +0 -5
  233. package/dist/routes/properties.test.d.ts.map +0 -1
  234. package/dist/routes/properties.test.js +0 -72
  235. package/dist/routes/pty.test.d.ts +0 -2
  236. package/dist/routes/pty.test.d.ts.map +0 -1
  237. package/dist/routes/pty.test.js +0 -82
  238. package/dist/routes/runtime-binding.test.d.ts +0 -2
  239. package/dist/routes/runtime-binding.test.d.ts.map +0 -1
  240. package/dist/routes/runtime-binding.test.js +0 -32
  241. package/dist/routes/sessions.test.d.ts +0 -5
  242. package/dist/routes/sessions.test.d.ts.map +0 -1
  243. package/dist/routes/sessions.test.js +0 -86
  244. package/dist/routes/skills.test.d.ts +0 -5
  245. package/dist/routes/skills.test.d.ts.map +0 -1
  246. package/dist/routes/skills.test.js +0 -50
  247. package/dist/routes/system-metrics.test.d.ts +0 -2
  248. package/dist/routes/system-metrics.test.d.ts.map +0 -1
  249. package/dist/routes/system-metrics.test.js +0 -16
  250. package/dist/routes/terminal.stop-options.test.d.ts +0 -2
  251. package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
  252. package/dist/routes/terminal.stop-options.test.js +0 -39
  253. package/dist/routes/terminal.test.d.ts +0 -2
  254. package/dist/routes/terminal.test.d.ts.map +0 -1
  255. package/dist/routes/terminal.test.js +0 -746
  256. package/dist/routes/yml.test.d.ts +0 -5
  257. package/dist/routes/yml.test.d.ts.map +0 -1
  258. package/dist/routes/yml.test.js +0 -58
  259. package/dist/services/ai-source-apply.test.d.ts +0 -2
  260. package/dist/services/ai-source-apply.test.d.ts.map +0 -1
  261. package/dist/services/ai-source-apply.test.js +0 -138
  262. package/dist/services/auto-register.test.d.ts +0 -2
  263. package/dist/services/auto-register.test.d.ts.map +0 -1
  264. package/dist/services/auto-register.test.js +0 -184
  265. package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
  266. package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
  267. package/dist/services/aws-client-agent-mcp.test.js +0 -242
  268. package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
  269. package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
  270. package/dist/services/bridge-package-publish-hooks.test.js +0 -136
  271. package/dist/services/cc-switch-discovery.test.d.ts +0 -2
  272. package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
  273. package/dist/services/cc-switch-discovery.test.js +0 -56
  274. package/dist/services/cli-commands.test.d.ts +0 -2
  275. package/dist/services/cli-commands.test.d.ts.map +0 -1
  276. package/dist/services/cli-commands.test.js +0 -230
  277. package/dist/services/instance-init-service.test.d.ts +0 -2
  278. package/dist/services/instance-init-service.test.d.ts.map +0 -1
  279. package/dist/services/instance-init-service.test.js +0 -140
  280. package/dist/services/instance-state.test.d.ts +0 -2
  281. package/dist/services/instance-state.test.d.ts.map +0 -1
  282. package/dist/services/instance-state.test.js +0 -245
  283. package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
  284. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
  285. package/dist/services/mcp-launch-binding-queue.test.js +0 -181
  286. package/dist/services/runtime-binding.test.d.ts +0 -2
  287. package/dist/services/runtime-binding.test.d.ts.map +0 -1
  288. package/dist/services/runtime-binding.test.js +0 -78
  289. package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
  290. package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
  291. package/dist/services/runtime-lifecycle-policy.test.js +0 -41
  292. package/dist/services/session-output.test.d.ts +0 -5
  293. package/dist/services/session-output.test.d.ts.map +0 -1
  294. package/dist/services/session-output.test.js +0 -177
  295. package/dist/services/startup-config-wizard.test.d.ts +0 -2
  296. package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
  297. package/dist/services/startup-config-wizard.test.js +0 -184
  298. package/dist/services/terminal-persistence.test.d.ts +0 -5
  299. package/dist/services/terminal-persistence.test.d.ts.map +0 -1
  300. package/dist/services/terminal-persistence.test.js +0 -159
  301. package/dist/services/tool-installer.test.d.ts +0 -2
  302. package/dist/services/tool-installer.test.d.ts.map +0 -1
  303. package/dist/services/tool-installer.test.js +0 -225
  304. package/dist/services/workspace-files.test.d.ts +0 -2
  305. package/dist/services/workspace-files.test.d.ts.map +0 -1
  306. package/dist/services/workspace-files.test.js +0 -648
  307. package/dist/services/workspace-watch.test.d.ts +0 -2
  308. package/dist/services/workspace-watch.test.d.ts.map +0 -1
  309. package/dist/services/workspace-watch.test.js +0 -38
  310. package/dist/utils/file-utils.test.d.ts +0 -2
  311. package/dist/utils/file-utils.test.d.ts.map +0 -1
  312. package/dist/utils/file-utils.test.js +0 -244
  313. package/dist/utils/logger.test.d.ts +0 -2
  314. package/dist/utils/logger.test.d.ts.map +0 -1
  315. package/dist/utils/logger.test.js +0 -93
  316. package/dist/utils/sdk-package-loader.test.d.ts +0 -2
  317. package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
  318. package/dist/utils/sdk-package-loader.test.js +0 -84
  319. package/dist/utils/validation.test.d.ts +0 -2
  320. package/dist/utils/validation.test.d.ts.map +0 -1
  321. package/dist/utils/validation.test.js +0 -88
  322. package/dist/utils/yaml-utils.test.d.ts +0 -2
  323. package/dist/utils/yaml-utils.test.d.ts.map +0 -1
  324. package/dist/utils/yaml-utils.test.js +0 -363
@@ -3,7 +3,7 @@ import { mkdtemp, readdir, readFile, rm } from 'node:fs/promises';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { describe, it } from 'node:test';
6
- import { MemoryCapacityError, MemoryStore } from './memory-store.js';
6
+ import { MemoryStore, normalizeBoundFilePath } from './memory-store.js';
7
7
  describe('MemoryStore', () => {
8
8
  it('creates and reads memory by uri', async () => {
9
9
  const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
@@ -11,12 +11,12 @@ describe('MemoryStore', () => {
11
11
  const store = new MemoryStore(storePath);
12
12
  try {
13
13
  const created = await store.createMemory({
14
- memory_type: 'memory',
14
+ memory_type: 'project_memory',
15
15
  uri: 'core://agent/profile',
16
16
  content: 'I am a backend expert.'
17
17
  });
18
18
  assert.equal(created.uri, 'core://agent/profile');
19
- const loaded = await store.readMemory({ uri: 'core://agent/profile', memory_type: 'memory' });
19
+ const loaded = await store.readMemory({ uri: 'core://agent/profile', memory_type: 'project_memory' });
20
20
  assert.ok(loaded);
21
21
  assert.equal(loaded?.content, 'I am a backend expert.');
22
22
  }
@@ -30,19 +30,19 @@ describe('MemoryStore', () => {
30
30
  const store = new MemoryStore(storePath);
31
31
  try {
32
32
  await store.createMemory({
33
- memory_type: 'memory',
33
+ memory_type: 'project_memory',
34
34
  uri: 'notes://project/todo',
35
35
  content: 'finish api docs'
36
36
  });
37
37
  const replaced = await store.updateMemory({
38
- memory_type: 'memory',
38
+ memory_type: 'project_memory',
39
39
  uri: 'notes://project/todo',
40
40
  old_string: 'api docs',
41
41
  new_string: 'API docs v2'
42
42
  });
43
43
  assert.equal(replaced.content, 'finish API docs v2');
44
44
  const appended = await store.updateMemory({
45
- memory_type: 'memory',
45
+ memory_type: 'project_memory',
46
46
  uri: 'notes://project/todo',
47
47
  append: '\n- add memory tests'
48
48
  });
@@ -58,16 +58,16 @@ describe('MemoryStore', () => {
58
58
  const store = new MemoryStore(storePath);
59
59
  try {
60
60
  await store.createMemory({
61
- memory_type: 'memory',
61
+ memory_type: 'project_memory',
62
62
  uri: 'core://agent/skills',
63
63
  content: 'java spring boot mysql'
64
64
  });
65
65
  await store.createMemory({
66
- memory_type: 'memory',
66
+ memory_type: 'project_memory',
67
67
  uri: 'notes://project/readme',
68
68
  content: 'project setup and architecture'
69
69
  });
70
- const result = await store.searchMemory({ query: 'project', limit: 1, memory_type: 'memory' });
70
+ const result = await store.searchMemory({ query: 'project', limit: 1, memory_type: 'project_memory' });
71
71
  assert.equal(result.results.length, 1);
72
72
  assert.equal(result.results[0]?.uri, 'notes://project/readme');
73
73
  }
@@ -81,13 +81,13 @@ describe('MemoryStore', () => {
81
81
  const store = new MemoryStore(storePath);
82
82
  try {
83
83
  await store.createMemory({
84
- memory_type: 'memory',
84
+ memory_type: 'project_memory',
85
85
  uri: 'core://agent/temp',
86
86
  content: 'temporary memory'
87
87
  });
88
- const deleted = await store.deleteMemory({ uri: 'core://agent/temp', memory_type: 'memory' });
88
+ const deleted = await store.deleteMemory({ uri: 'core://agent/temp', memory_type: 'project_memory' });
89
89
  assert.equal(deleted, true);
90
- const loaded = await store.readMemory({ uri: 'core://agent/temp', memory_type: 'memory' });
90
+ const loaded = await store.readMemory({ uri: 'core://agent/temp', memory_type: 'project_memory' });
91
91
  assert.equal(loaded, null);
92
92
  }
93
93
  finally {
@@ -99,17 +99,17 @@ describe('MemoryStore', () => {
99
99
  const storePath = path.join(dir, 'memory');
100
100
  const store = new MemoryStore(storePath);
101
101
  try {
102
- const types = ['task_list', 'recently_memory', 'memory'];
102
+ const types = ['recently_memory', 'agent_memory', 'project_memory'];
103
103
  await store.createMemory({ memory_type: types[0], uri: 'task://todo/1', content: 'fix tests' });
104
104
  await store.createMemory({ memory_type: types[1], uri: 'recent://ctx/1', content: 'just discussed API design' });
105
105
  await store.createMemory({ memory_type: types[2], uri: 'core://archive/1', content: 'long-term architecture decision' });
106
- const taskList = await store.listByType('task_list');
106
+ const taskList = await store.listByType('recently_memory');
107
107
  assert.equal(taskList.length, 1);
108
- assert.equal(taskList[0]?.memory_type, 'task_list');
109
- const recentList = await store.listByType('recently_memory');
108
+ assert.equal(taskList[0]?.memory_type, 'recently_memory');
109
+ const recentList = await store.listByType('agent_memory');
110
110
  assert.equal(recentList.length, 1);
111
- assert.equal(recentList[0]?.memory_type, 'recently_memory');
112
- await assert.rejects(() => store.listByType('memory'), /Invalid memory_type/);
111
+ assert.equal(recentList[0]?.memory_type, 'agent_memory');
112
+ await assert.rejects(() => store.listByType('project_memory'), /Invalid memory_type/);
113
113
  }
114
114
  finally {
115
115
  await rm(dir, { recursive: true, force: true });
@@ -120,8 +120,8 @@ describe('MemoryStore', () => {
120
120
  const storePath = path.join(dir, 'memory');
121
121
  const store = new MemoryStore(storePath);
122
122
  try {
123
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/remove-1', content: 'to be removed' });
124
- const deleted = await store.deleteMemory({ uri: 'task://todo/remove-1', memory_type: 'task_list' });
123
+ await store.createMemory({ memory_type: 'recently_memory', uri: 'task://todo/remove-1', content: 'to be removed' });
124
+ const deleted = await store.deleteMemory({ uri: 'task://todo/remove-1', memory_type: 'recently_memory' });
125
125
  assert.equal(deleted, true);
126
126
  assert.equal(await store.readMemory({ uri: 'task://todo/remove-1' }), null);
127
127
  }
@@ -129,47 +129,29 @@ describe('MemoryStore', () => {
129
129
  await rm(dir, { recursive: true, force: true });
130
130
  }
131
131
  });
132
- it('archives recently_memory into memory', async () => {
133
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
134
- const storePath = path.join(dir, 'memory');
135
- const store = new MemoryStore(storePath);
136
- try {
137
- await store.createMemory({ memory_type: 'recently_memory', uri: 'recent://note/1', content: 'hot memory' });
138
- const archived = await store.archiveRecentlyMemory('recent://note/1');
139
- assert.equal(archived.memory_type, 'memory');
140
- const loaded = await store.readMemory({ uri: 'recent://note/1', memory_type: 'memory' });
141
- assert.ok(loaded);
142
- assert.equal(loaded?.memory_type, 'memory');
143
- await store.createMemory({ memory_type: 'memory', uri: 'core://cold/2', content: 'cold memory' });
144
- await assert.rejects(() => store.archiveRecentlyMemory('core://cold/2'), /recently_memory_archive/);
145
- }
146
- finally {
147
- await rm(dir, { recursive: true, force: true });
148
- }
149
- });
150
132
  it('reports memory stats with top-level counts and per-domain occupancy', async () => {
151
133
  const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
152
134
  const storePath = path.join(dir, 'memory');
153
135
  const store = new MemoryStore(storePath);
154
136
  try {
155
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/stats', content: 'task' });
156
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/other', content: 'another task' });
157
- await store.createMemory({ memory_type: 'recently_memory', uri: 'recent://ctx/stats', content: 'recent' });
158
- await store.createMemory({ memory_type: 'recently_memory', uri: 'note://ctx/stats', content: 'recent note' });
159
- await store.createMemory({ memory_type: 'memory', uri: 'core://stats/long-term', content: 'long term' });
137
+ await store.createMemory({ memory_type: 'recently_memory', uri: 'task://todo/stats', content: 'task' });
138
+ await store.createMemory({ memory_type: 'recently_memory', uri: 'task://todo/other', content: 'another task' });
139
+ await store.createMemory({ memory_type: 'agent_memory', uri: 'recent://ctx/stats', content: 'recent' });
140
+ await store.createMemory({ memory_type: 'agent_memory', uri: 'note://ctx/stats', content: 'recent note' });
141
+ await store.createMemory({ memory_type: 'project_memory', uri: 'core://stats/long-term', content: 'long term' });
160
142
  const stats = await store.getStats();
161
143
  assert.equal(stats.total, 5);
162
144
  assert.deepEqual(stats.listable, { count: 4, limit: 64, hardLimit: 128, exceeded: false, hardExceeded: false });
163
- assert.equal(stats.by_type.task_list.count, 2);
164
- assert.equal(stats.by_type.task_list.domainCount, 1);
165
- assert.equal(stats.by_type.task_list.by_domain.task?.count, 2);
166
145
  assert.equal(stats.by_type.recently_memory.count, 2);
167
- assert.equal(stats.by_type.recently_memory.domainCount, 2);
168
- assert.equal(stats.by_type.recently_memory.by_domain.recent?.count, 1);
169
- assert.equal(stats.by_type.recently_memory.by_domain.note?.count, 1);
170
- assert.equal(stats.by_type.memory.count, 1);
171
- assert.equal(stats.by_type.memory.domainCount, 1);
172
- assert.equal(stats.by_type.memory.by_domain.core?.count, 1);
146
+ assert.equal(stats.by_type.recently_memory.domainCount, 1);
147
+ assert.equal(stats.by_type.recently_memory.by_domain.task?.count, 2);
148
+ assert.equal(stats.by_type.agent_memory.count, 2);
149
+ assert.equal(stats.by_type.agent_memory.domainCount, 2);
150
+ assert.equal(stats.by_type.agent_memory.by_domain.recent?.count, 1);
151
+ assert.equal(stats.by_type.agent_memory.by_domain.note?.count, 1);
152
+ assert.equal(stats.by_type.project_memory.count, 1);
153
+ assert.equal(stats.by_type.project_memory.domainCount, 1);
154
+ assert.equal(stats.by_type.project_memory.by_domain.core?.count, 1);
173
155
  }
174
156
  finally {
175
157
  await rm(dir, { recursive: true, force: true });
@@ -180,7 +162,7 @@ describe('MemoryStore', () => {
180
162
  const storePath = path.join(dir, 'memory');
181
163
  const store = new MemoryStore(storePath);
182
164
  try {
183
- await store.createMemory({ memory_type: 'memory', uri: 'core://atomic/write', content: 'persisted' });
165
+ await store.createMemory({ memory_type: 'project_memory', uri: 'core://atomic/write', content: 'persisted' });
184
166
  const files = await readdir(storePath);
185
167
  assert.deepEqual(files, ['core.json']);
186
168
  }
@@ -193,14 +175,14 @@ describe('MemoryStore', () => {
193
175
  const storePath = path.join(dir, 'memory');
194
176
  const store = new MemoryStore(storePath);
195
177
  try {
196
- await store.createMemory({ memory_type: 'memory', uri: 'core://agent/profile', content: 'profile' });
197
- await store.createMemory({ memory_type: 'memory', uri: 'notes://project/readme', content: 'readme' });
178
+ await store.createMemory({ memory_type: 'project_memory', uri: 'core://agent/profile', content: 'profile' });
179
+ await store.createMemory({ memory_type: 'project_memory', uri: 'notes://project/readme', content: 'readme' });
198
180
  assert.deepEqual((await readdir(storePath)).sort(), ['core.json', 'notes.json']);
199
181
  const coreRaw = JSON.parse(await readFile(path.join(storePath, 'core.json'), 'utf-8'));
200
182
  const notesRaw = JSON.parse(await readFile(path.join(storePath, 'notes.json'), 'utf-8'));
201
183
  assert.equal(coreRaw.by_uri['core://agent/profile']?.content, 'profile');
202
184
  assert.equal(notesRaw.by_uri['notes://project/readme']?.content, 'readme');
203
- const searched = await store.searchMemory({ query: 'readme', memory_type: 'memory' });
185
+ const searched = await store.searchMemory({ query: 'readme', memory_type: 'project_memory' });
204
186
  assert.equal(searched.results[0]?.uri, 'notes://project/readme');
205
187
  }
206
188
  finally {
@@ -212,54 +194,11 @@ describe('MemoryStore', () => {
212
194
  const storePath = path.join(dir, 'memory');
213
195
  const store = new MemoryStore(storePath);
214
196
  try {
215
- await store.createMemory({ memory_type: 'memory', uri: 'core://agent/profile', content: 'profile' });
216
- await store.createMemory({ memory_type: 'memory', uri: 'notes://project/readme', content: 'readme' });
217
- assert.equal(await store.deleteMemory({ uri: 'notes://project/readme', memory_type: 'memory' }), true);
197
+ await store.createMemory({ memory_type: 'project_memory', uri: 'core://agent/profile', content: 'profile' });
198
+ await store.createMemory({ memory_type: 'project_memory', uri: 'notes://project/readme', content: 'readme' });
199
+ assert.equal(await store.deleteMemory({ uri: 'notes://project/readme', memory_type: 'project_memory' }), true);
218
200
  assert.deepEqual(await readdir(storePath), ['core.json']);
219
- assert.equal(await store.readMemory({ uri: 'notes://project/readme', memory_type: 'memory' }), null);
220
- }
221
- finally {
222
- await rm(dir, { recursive: true, force: true });
223
- }
224
- });
225
- it('allows listable memory beyond soft limits and rejects at the doubled hard type limit', async () => {
226
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
227
- const storePath = path.join(dir, 'memory');
228
- const store = new MemoryStore(storePath);
229
- try {
230
- for (let index = 0; index < 64; index += 1) {
231
- await store.createMemory({
232
- memory_type: 'recently_memory',
233
- uri: `recent://ctx/${index}`,
234
- content: `recent context ${index}`
235
- });
236
- }
237
- await assert.rejects(async () => {
238
- await store.createMemory({
239
- memory_type: 'recently_memory',
240
- uri: 'recent://ctx/overflow',
241
- content: 'overflow context'
242
- });
243
- }, (error) => {
244
- assert.ok(error instanceof MemoryCapacityError);
245
- assert.equal(error.details.code, 'MEMORY_TYPE_LIMIT_REACHED');
246
- assert.equal(error.details.memory_type, 'recently_memory');
247
- assert.equal(error.details.domain, 'recent');
248
- assert.equal(error.details.limit, 64);
249
- assert.equal(error.details.current, 64);
250
- assert.ok(error.details.recommended_actions.includes('archive_recently_memory({ uri })'));
251
- assert.match(error.message, /hard memory limit 64 reached under domain recent/s);
252
- return true;
253
- });
254
- await store.archiveRecentlyMemory('recent://ctx/0');
255
- const createdAfterArchive = await store.createMemory({
256
- memory_type: 'recently_memory',
257
- uri: 'recent://ctx/after-archive',
258
- content: 'capacity restored by archive'
259
- });
260
- assert.equal(createdAfterArchive.memory_type, 'recently_memory');
261
- const recentList = await store.listByType('recently_memory');
262
- assert.equal(recentList.length, 64);
201
+ assert.equal(await store.readMemory({ uri: 'notes://project/readme', memory_type: 'project_memory' }), null);
263
202
  }
264
203
  finally {
265
204
  await rm(dir, { recursive: true, force: true });
@@ -272,38 +211,38 @@ describe('MemoryStore', () => {
272
211
  try {
273
212
  for (let index = 0; index < 32; index += 1) {
274
213
  await store.createMemory({
275
- memory_type: 'task_list',
214
+ memory_type: 'recently_memory',
276
215
  uri: `task://todo/${index}`,
277
216
  content: `task ${index}`
278
217
  });
279
218
  await store.createMemory({
280
- memory_type: 'recently_memory',
219
+ memory_type: 'agent_memory',
281
220
  uri: `recent://ctx/${index}`,
282
221
  content: `recent context ${index}`
283
222
  });
284
223
  }
285
224
  const longTermMemory = await store.createMemory({
286
- memory_type: 'memory',
225
+ memory_type: 'project_memory',
287
226
  uri: 'core://long-term/not-listable',
288
227
  content: 'long-term memories are not constrained by listable limits'
289
228
  });
290
- assert.equal(longTermMemory.memory_type, 'memory');
229
+ assert.equal(longTermMemory.memory_type, 'project_memory');
291
230
  const stats = await store.getStats();
292
231
  assert.equal(stats.listable.count, 64);
293
232
  assert.equal(stats.listable.exceeded, false);
294
233
  assert.equal(stats.listable.hardExceeded, false);
295
- assert.equal(stats.by_type.task_list.exceeded, false);
296
234
  assert.equal(stats.by_type.recently_memory.exceeded, false);
235
+ assert.equal(stats.by_type.agent_memory.exceeded, false);
297
236
  const allowedBeyondSoftLimit = await store.createMemory({
298
- memory_type: 'task_list',
237
+ memory_type: 'recently_memory',
299
238
  uri: 'task://todo/beyond-soft-limit',
300
239
  content: 'allowed beyond soft limit until hard limit'
301
240
  });
302
- assert.equal(allowedBeyondSoftLimit.memory_type, 'task_list');
241
+ assert.equal(allowedBeyondSoftLimit.memory_type, 'recently_memory');
303
242
  const exceededStats = await store.getStats();
304
243
  assert.equal(exceededStats.listable.exceeded, true);
305
- assert.equal(exceededStats.by_type.task_list.exceeded, false);
306
- assert.equal(exceededStats.by_type.task_list.by_domain.task?.exceeded, true);
244
+ assert.equal(exceededStats.by_type.recently_memory.exceeded, false);
245
+ assert.equal(exceededStats.by_type.recently_memory.by_domain.task?.exceeded, true);
307
246
  }
308
247
  finally {
309
248
  await rm(dir, { recursive: true, force: true });
@@ -316,26 +255,26 @@ describe('MemoryStore', () => {
316
255
  try {
317
256
  for (let index = 0; index < 64; index += 1) {
318
257
  await store.createMemory({
319
- memory_type: 'task_list',
258
+ memory_type: 'recently_memory',
320
259
  uri: `task${index}://todo/current`,
321
260
  content: `task ${index}`
322
261
  });
323
262
  await store.createMemory({
324
- memory_type: 'recently_memory',
263
+ memory_type: 'agent_memory',
325
264
  uri: `recent${index}://ctx/current`,
326
265
  content: `recent ${index}`
327
266
  });
328
267
  }
329
268
  const created = await store.createMemory({
330
- memory_type: 'task_list',
269
+ memory_type: 'recently_memory',
331
270
  uri: 'task0://todo/extra',
332
271
  content: 'same domain remains below item hard limit'
333
272
  });
334
- assert.equal(created.memory_type, 'task_list');
273
+ assert.equal(created.memory_type, 'recently_memory');
335
274
  const stats = await store.getStats();
336
275
  assert.equal(stats.listable.hardExceeded, true);
337
- assert.equal(stats.by_type.task_list.hardExceeded, true);
338
- assert.equal(stats.by_type.task_list.by_domain.task0?.count, 2);
276
+ assert.equal(stats.by_type.recently_memory.hardExceeded, true);
277
+ assert.equal(stats.by_type.recently_memory.by_domain.task0?.count, 2);
339
278
  }
340
279
  finally {
341
280
  await rm(dir, { recursive: true, force: true });
@@ -358,7 +297,7 @@ describe('MemoryStore', () => {
358
297
  const store = new MemoryStore(storePath);
359
298
  try {
360
299
  const created = await store.createMemory({
361
- memory_type: 'recently_memory',
300
+ memory_type: 'agent_memory',
362
301
  uri: 'recent://expire/test1',
363
302
  content: 'test expiration'
364
303
  });
@@ -366,11 +305,11 @@ describe('MemoryStore', () => {
366
305
  const expiresDate = new Date(created.expiresAt);
367
306
  const now = new Date();
368
307
  const diffHours = (expiresDate.getTime() - now.getTime()) / (60 * 60 * 1000);
369
- // Should be approximately 24 hours from now
370
- assert.ok(diffHours > 23 && diffHours < 25, `expiresAt should be ~24h from now, got ${diffHours}h`);
308
+ // Should be approximately 12 hours from now (initial TTL)
309
+ assert.ok(diffHours > 11 && diffHours < 13, `expiresAt should be ~12h from now, got ${diffHours}h`);
371
310
  // memory type should NOT have expiresAt
372
311
  const memoryCreated = await store.createMemory({
373
- memory_type: 'memory',
312
+ memory_type: 'project_memory',
374
313
  uri: 'core://perm/test1',
375
314
  content: 'permanent'
376
315
  });
@@ -386,7 +325,7 @@ describe('MemoryStore', () => {
386
325
  const store = new MemoryStore(storePath);
387
326
  try {
388
327
  const created = await store.createMemory({
389
- memory_type: 'recently_memory',
328
+ memory_type: 'agent_memory',
390
329
  uri: 'recent://expire/test2',
391
330
  content: 'original content'
392
331
  });
@@ -412,14 +351,14 @@ describe('MemoryStore', () => {
412
351
  try {
413
352
  // Already expired (pass expiresAt in the past)
414
353
  await store.createMemory({
415
- memory_type: 'recently_memory',
354
+ memory_type: 'agent_memory',
416
355
  uri: 'recent://expire/past1',
417
356
  content: 'already expired',
418
357
  expiresAt: new Date(Date.now() - 60_000).toISOString(), // 1 minute ago
419
358
  });
420
359
  // Future expiration
421
360
  await store.createMemory({
422
- memory_type: 'recently_memory',
361
+ memory_type: 'agent_memory',
423
362
  uri: 'recent://expire/future1',
424
363
  content: 'not expired yet',
425
364
  });
@@ -431,72 +370,144 @@ describe('MemoryStore', () => {
431
370
  await rm(dir, { recursive: true, force: true });
432
371
  }
433
372
  });
434
- // ========== todoCompleted 测试 (v1.14.0) ==========
435
- it('todoCompleted marks single task as completed without cleaning', async () => {
436
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
373
+ });
374
+ // ========== listByFile normalizeBoundFilePath 测试 ==========
375
+ describe('normalizeBoundFilePath', () => {
376
+ it('normalizes @/ prefix to ./', () => {
377
+ assert.equal(normalizeBoundFilePath('@/src/main.ts'), './src/main.ts');
378
+ });
379
+ it('normalizes / prefix to ./', () => {
380
+ assert.equal(normalizeBoundFilePath('/src/main.ts'), './src/main.ts');
381
+ });
382
+ it('normalizes bare path to ./', () => {
383
+ assert.equal(normalizeBoundFilePath('src/main.ts'), './src/main.ts');
384
+ });
385
+ it('keeps ./ prefix as-is', () => {
386
+ assert.equal(normalizeBoundFilePath('./src/main.ts'), './src/main.ts');
387
+ });
388
+ it('trims whitespace', () => {
389
+ assert.equal(normalizeBoundFilePath(' ./src/main.ts '), './src/main.ts');
390
+ });
391
+ });
392
+ describe('MemoryStore listByFile', () => {
393
+ it('finds memories by exact bound_files match', async () => {
394
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-listbyfile-'));
437
395
  const storePath = path.join(dir, 'memory');
438
396
  const store = new MemoryStore(storePath);
439
397
  try {
440
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/a', content: 'task A' });
441
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/b', content: 'task B' });
442
- const result = await store.todoCompleted('task://todo/a');
443
- assert.equal(result.completed, true);
444
- assert.equal(result.uri, 'task://todo/a');
445
- assert.equal(result.allCleaned, false);
446
- assert.equal(result.cleanedCount, 0);
447
- // 第二条仍应为 pending
448
- const pending = await store.listByTodoStatus('pending');
449
- assert.equal(pending.length, 1);
450
- assert.equal(pending[0]?.uri, 'task://todo/b');
451
- // 第一条应为 completed
452
- const completed = await store.listByTodoStatus('completed');
453
- assert.equal(completed.length, 1);
454
- assert.equal(completed[0]?.uri, 'task://todo/a');
398
+ await store.createMemory({
399
+ memory_type: 'project_memory',
400
+ uri: 'core://file/notes',
401
+ content: 'Notes about main.ts',
402
+ bound_files: ['./src/main.ts'],
403
+ });
404
+ await store.createMemory({
405
+ memory_type: 'project_memory',
406
+ uri: 'core://other/entry',
407
+ content: 'Unrelated memory',
408
+ bound_files: ['./src/utils.ts'],
409
+ });
410
+ const results = await store.listByFile('./src/main.ts');
411
+ assert.equal(results.length, 1);
412
+ assert.equal(results[0]?.uri, 'core://file/notes');
455
413
  }
456
414
  finally {
457
415
  await rm(dir, { recursive: true, force: true });
458
416
  }
459
417
  });
460
- it('todoCompleted auto-cleans when all todos are completed', async () => {
461
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
418
+ it('normalizes file path before matching', async () => {
419
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-listbyfile-'));
462
420
  const storePath = path.join(dir, 'memory');
463
421
  const store = new MemoryStore(storePath);
464
422
  try {
465
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/a', content: 'task A' });
466
- await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/b', content: 'task B' });
467
- // 标记第一条完成
468
- await store.todoCompleted('task://todo/a');
469
- // 标记第二条完成(全部完成 -> 自动清理)
470
- const result = await store.todoCompleted('task://todo/b');
471
- assert.equal(result.completed, true);
472
- assert.equal(result.allCleaned, true);
473
- assert.equal(result.cleanedCount, 2);
474
- // 清理后应无 task_list
475
- const allTaskList = await store.listByType('task_list');
476
- assert.equal(allTaskList.length, 0);
423
+ await store.createMemory({
424
+ memory_type: 'project_memory',
425
+ uri: 'core://file/notes',
426
+ content: 'Notes',
427
+ bound_files: ['./src/main.ts'],
428
+ });
429
+ // Search with @/ prefix should normalize to ./src/main.ts
430
+ const results = await store.listByFile('@/src/main.ts');
431
+ assert.equal(results.length, 1);
432
+ assert.equal(results[0]?.uri, 'core://file/notes');
433
+ // Search with bare path should also match
434
+ const results2 = await store.listByFile('src/main.ts');
435
+ assert.equal(results2.length, 1);
436
+ // Search with / prefix should also match
437
+ const results3 = await store.listByFile('/src/main.ts');
438
+ assert.equal(results3.length, 1);
477
439
  }
478
440
  finally {
479
441
  await rm(dir, { recursive: true, force: true });
480
442
  }
481
443
  });
482
- it('todoCompleted rejects non-task_list type', async () => {
483
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
444
+ it('returns empty when no bound_files match', async () => {
445
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-listbyfile-'));
484
446
  const storePath = path.join(dir, 'memory');
485
447
  const store = new MemoryStore(storePath);
486
448
  try {
487
- await store.createMemory({ memory_type: 'recently_memory', uri: 'recent://note/1', content: 'a note' });
488
- await assert.rejects(() => store.todoCompleted('recent://note/1'), { message: /todo_completed only supports task_list type/ });
449
+ await store.createMemory({
450
+ memory_type: 'project_memory',
451
+ uri: 'core://other/entry',
452
+ content: 'No files bound',
453
+ });
454
+ const results = await store.listByFile('./src/main.ts');
455
+ assert.equal(results.length, 0);
489
456
  }
490
457
  finally {
491
458
  await rm(dir, { recursive: true, force: true });
492
459
  }
493
460
  });
494
- it('todoCompleted rejects nonexistent uri', async () => {
495
- const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
461
+ it('matches memories with multiple bound_files', async () => {
462
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-listbyfile-'));
463
+ const storePath = path.join(dir, 'memory');
464
+ const store = new MemoryStore(storePath);
465
+ try {
466
+ await store.createMemory({
467
+ memory_type: 'project_memory',
468
+ uri: 'core://multi/file',
469
+ content: 'Multi-file memory',
470
+ bound_files: ['./src/main.ts', './src/utils.ts'],
471
+ });
472
+ const results1 = await store.listByFile('./src/main.ts');
473
+ assert.equal(results1.length, 1);
474
+ const results2 = await store.listByFile('./src/utils.ts');
475
+ assert.equal(results2.length, 1);
476
+ const results3 = await store.listByFile('./src/other.ts');
477
+ assert.equal(results3.length, 0);
478
+ }
479
+ finally {
480
+ await rm(dir, { recursive: true, force: true });
481
+ }
482
+ });
483
+ it('filters by memory_type when provided', async () => {
484
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-listbyfile-'));
496
485
  const storePath = path.join(dir, 'memory');
497
486
  const store = new MemoryStore(storePath);
498
487
  try {
499
- await assert.rejects(() => store.todoCompleted('task://nonexistent'), { message: /Memory not found/ });
488
+ await store.createMemory({
489
+ memory_type: 'project_memory',
490
+ uri: 'core://permanent/notes',
491
+ content: 'Permanent notes',
492
+ bound_files: ['./src/main.ts'],
493
+ });
494
+ await store.createMemory({
495
+ memory_type: 'agent_memory',
496
+ uri: 'recent://temp/notes',
497
+ content: 'Temporary notes',
498
+ bound_files: ['./src/main.ts'],
499
+ });
500
+ // Both types match without filter
501
+ const allResults = await store.listByFile('./src/main.ts');
502
+ assert.equal(allResults.length, 2);
503
+ // Filter by memory type
504
+ const memResults = await store.listByFile('./src/main.ts', 'project_memory');
505
+ assert.equal(memResults.length, 1);
506
+ assert.equal(memResults[0]?.memory_type, 'project_memory');
507
+ // Filter with options object
508
+ const recentResults = await store.listByFile('./src/main.ts', { memory_type: 'agent_memory' });
509
+ assert.equal(recentResults.length, 1);
510
+ assert.equal(recentResults[0]?.memory_type, 'agent_memory');
500
511
  }
501
512
  finally {
502
513
  await rm(dir, { recursive: true, force: true });