@namzu/sdk 30.2.0 → 31.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/CHANGELOG.md +562 -0
  2. package/README.md +43 -2
  3. package/dist/advisory/executor.d.ts +2 -1
  4. package/dist/advisory/executor.d.ts.map +1 -1
  5. package/dist/advisory/executor.js +4 -1
  6. package/dist/advisory/executor.js.map +1 -1
  7. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  8. package/dist/agents/ReactiveAgent.js +12 -0
  9. package/dist/agents/ReactiveAgent.js.map +1 -1
  10. package/dist/agents/RouterAgent.d.ts.map +1 -1
  11. package/dist/agents/RouterAgent.js +21 -3
  12. package/dist/agents/RouterAgent.js.map +1 -1
  13. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  14. package/dist/agents/SupervisorAgent.js +34 -11
  15. package/dist/agents/SupervisorAgent.js.map +1 -1
  16. package/dist/agents/runAgent.d.ts +12 -0
  17. package/dist/agents/runAgent.d.ts.map +1 -1
  18. package/dist/agents/runAgent.js +26 -2
  19. package/dist/agents/runAgent.js.map +1 -1
  20. package/dist/authorization/command-line.d.ts +81 -0
  21. package/dist/authorization/command-line.d.ts.map +1 -0
  22. package/dist/authorization/command-line.js +347 -0
  23. package/dist/authorization/command-line.js.map +1 -0
  24. package/dist/authorization/rules.d.ts.map +1 -1
  25. package/dist/authorization/rules.js +22 -1
  26. package/dist/authorization/rules.js.map +1 -1
  27. package/dist/bridge/a2a/client.d.ts +23 -5
  28. package/dist/bridge/a2a/client.d.ts.map +1 -1
  29. package/dist/bridge/a2a/client.js +320 -73
  30. package/dist/bridge/a2a/client.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +4 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/acp/server.d.ts +13 -1
  35. package/dist/bridge/acp/server.d.ts.map +1 -1
  36. package/dist/bridge/acp/server.js +150 -44
  37. package/dist/bridge/acp/server.js.map +1 -1
  38. package/dist/bridge/mcp/connector/adapter.d.ts +3 -2
  39. package/dist/bridge/mcp/connector/adapter.d.ts.map +1 -1
  40. package/dist/bridge/mcp/connector/adapter.js +17 -21
  41. package/dist/bridge/mcp/connector/adapter.js.map +1 -1
  42. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  43. package/dist/bridge/sse/mapper.js +3 -0
  44. package/dist/bridge/sse/mapper.js.map +1 -1
  45. package/dist/compaction/dangling.d.ts +29 -2
  46. package/dist/compaction/dangling.d.ts.map +1 -1
  47. package/dist/compaction/dangling.js +172 -35
  48. package/dist/compaction/dangling.js.map +1 -1
  49. package/dist/compaction/index.d.ts +3 -2
  50. package/dist/compaction/index.d.ts.map +1 -1
  51. package/dist/compaction/index.js +1 -1
  52. package/dist/compaction/index.js.map +1 -1
  53. package/dist/compaction/manual.d.ts +11 -1
  54. package/dist/compaction/manual.d.ts.map +1 -1
  55. package/dist/compaction/manual.js +89 -14
  56. package/dist/compaction/manual.js.map +1 -1
  57. package/dist/compaction/plan.d.ts +19 -6
  58. package/dist/compaction/plan.d.ts.map +1 -1
  59. package/dist/compaction/plan.js +18 -4
  60. package/dist/compaction/plan.js.map +1 -1
  61. package/dist/compaction/retention.d.ts +10 -7
  62. package/dist/compaction/retention.d.ts.map +1 -1
  63. package/dist/compaction/retention.js +26 -8
  64. package/dist/compaction/retention.js.map +1 -1
  65. package/dist/compaction/summary.d.ts +4 -4
  66. package/dist/compaction/summary.js +4 -4
  67. package/dist/compaction/verifier.d.ts +19 -1
  68. package/dist/compaction/verifier.d.ts.map +1 -1
  69. package/dist/compaction/verifier.js +20 -1
  70. package/dist/compaction/verifier.js.map +1 -1
  71. package/dist/config/runtime.d.ts +6 -6
  72. package/dist/connector/BaseConnector.d.ts +6 -4
  73. package/dist/connector/BaseConnector.d.ts.map +1 -1
  74. package/dist/connector/BaseConnector.js +8 -2
  75. package/dist/connector/BaseConnector.js.map +1 -1
  76. package/dist/connector/builtins/http.d.ts +16 -4
  77. package/dist/connector/builtins/http.d.ts.map +1 -1
  78. package/dist/connector/builtins/http.js +177 -44
  79. package/dist/connector/builtins/http.js.map +1 -1
  80. package/dist/connector/builtins/webhook.d.ts +15 -4
  81. package/dist/connector/builtins/webhook.d.ts.map +1 -1
  82. package/dist/connector/builtins/webhook.js +165 -45
  83. package/dist/connector/builtins/webhook.js.map +1 -1
  84. package/dist/connector/execution-contract.d.ts +11 -0
  85. package/dist/connector/execution-contract.d.ts.map +1 -0
  86. package/dist/connector/execution-contract.js +14 -0
  87. package/dist/connector/execution-contract.js.map +1 -0
  88. package/dist/connector/http-operation.d.ts +48 -0
  89. package/dist/connector/http-operation.d.ts.map +1 -0
  90. package/dist/connector/http-operation.js +205 -0
  91. package/dist/connector/http-operation.js.map +1 -0
  92. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  93. package/dist/connector/mcp/adapter.js +8 -3
  94. package/dist/connector/mcp/adapter.js.map +1 -1
  95. package/dist/connector/mcp/client.d.ts +14 -8
  96. package/dist/connector/mcp/client.d.ts.map +1 -1
  97. package/dist/connector/mcp/client.js +160 -44
  98. package/dist/connector/mcp/client.js.map +1 -1
  99. package/dist/connector/mcp/http-sse.d.ts +8 -2
  100. package/dist/connector/mcp/http-sse.d.ts.map +1 -1
  101. package/dist/connector/mcp/http-sse.js +70 -17
  102. package/dist/connector/mcp/http-sse.js.map +1 -1
  103. package/dist/connector/mcp/prompt-adapter.d.ts.map +1 -1
  104. package/dist/connector/mcp/prompt-adapter.js +9 -2
  105. package/dist/connector/mcp/prompt-adapter.js.map +1 -1
  106. package/dist/connector/mcp/stdio.d.ts +2 -2
  107. package/dist/connector/mcp/stdio.d.ts.map +1 -1
  108. package/dist/connector/mcp/stdio.js +14 -50
  109. package/dist/connector/mcp/stdio.js.map +1 -1
  110. package/dist/connector/mcp/streamable-http.d.ts +7 -2
  111. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  112. package/dist/connector/mcp/streamable-http.js +66 -18
  113. package/dist/connector/mcp/streamable-http.js.map +1 -1
  114. package/dist/connector/tools/adapter.d.ts +2 -2
  115. package/dist/connector/tools/adapter.d.ts.map +1 -1
  116. package/dist/connector/tools/adapter.js +23 -14
  117. package/dist/connector/tools/adapter.js.map +1 -1
  118. package/dist/connector/tools/definitions.d.ts.map +1 -1
  119. package/dist/connector/tools/definitions.js +5 -2
  120. package/dist/connector/tools/definitions.js.map +1 -1
  121. package/dist/connector/tools/result.d.ts +4 -0
  122. package/dist/connector/tools/result.d.ts.map +1 -0
  123. package/dist/connector/tools/result.js +20 -0
  124. package/dist/connector/tools/result.js.map +1 -0
  125. package/dist/connector/web/guarded-fetch.d.ts +4 -2
  126. package/dist/connector/web/guarded-fetch.d.ts.map +1 -1
  127. package/dist/connector/web/guarded-fetch.js +157 -43
  128. package/dist/connector/web/guarded-fetch.js.map +1 -1
  129. package/dist/constants/sandbox/index.d.ts +3 -2
  130. package/dist/constants/sandbox/index.d.ts.map +1 -1
  131. package/dist/constants/sandbox/index.js +3 -2
  132. package/dist/constants/sandbox/index.js.map +1 -1
  133. package/dist/contracts/api.d.ts +2 -0
  134. package/dist/contracts/api.d.ts.map +1 -1
  135. package/dist/contracts/schemas.d.ts +38 -12
  136. package/dist/contracts/schemas.d.ts.map +1 -1
  137. package/dist/contracts/schemas.js +7 -0
  138. package/dist/contracts/schemas.js.map +1 -1
  139. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  140. package/dist/directory/derive-supervisor.js +8 -0
  141. package/dist/directory/derive-supervisor.js.map +1 -1
  142. package/dist/directory/derive.d.ts.map +1 -1
  143. package/dist/directory/derive.js +8 -0
  144. package/dist/directory/derive.js.map +1 -1
  145. package/dist/directory/load.d.ts.map +1 -1
  146. package/dist/directory/load.js +2 -0
  147. package/dist/directory/load.js.map +1 -1
  148. package/dist/directory/types.d.ts +4 -0
  149. package/dist/directory/types.d.ts.map +1 -1
  150. package/dist/eval/experiment.d.ts +10 -10
  151. package/dist/eval/experiment.d.ts.map +1 -1
  152. package/dist/eval/experiment.js +121 -91
  153. package/dist/eval/experiment.js.map +1 -1
  154. package/dist/eval/judge.d.ts +6 -0
  155. package/dist/eval/judge.d.ts.map +1 -1
  156. package/dist/eval/judge.js +7 -2
  157. package/dist/eval/judge.js.map +1 -1
  158. package/dist/eval/types.d.ts +7 -1
  159. package/dist/eval/types.d.ts.map +1 -1
  160. package/dist/manager/agent/lifecycle.d.ts +12 -10
  161. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  162. package/dist/manager/agent/lifecycle.js +16 -3
  163. package/dist/manager/agent/lifecycle.js.map +1 -1
  164. package/dist/manager/connector/environment.d.ts +2 -2
  165. package/dist/manager/connector/environment.d.ts.map +1 -1
  166. package/dist/manager/connector/environment.js +2 -2
  167. package/dist/manager/connector/environment.js.map +1 -1
  168. package/dist/manager/connector/lifecycle.d.ts +10 -2
  169. package/dist/manager/connector/lifecycle.d.ts.map +1 -1
  170. package/dist/manager/connector/lifecycle.js +273 -24
  171. package/dist/manager/connector/lifecycle.js.map +1 -1
  172. package/dist/manager/connector/tenant.d.ts +5 -4
  173. package/dist/manager/connector/tenant.d.ts.map +1 -1
  174. package/dist/manager/connector/tenant.js +47 -22
  175. package/dist/manager/connector/tenant.js.map +1 -1
  176. package/dist/manager/goal/activation.d.ts +23 -0
  177. package/dist/manager/goal/activation.d.ts.map +1 -0
  178. package/dist/manager/goal/activation.js +41 -0
  179. package/dist/manager/goal/activation.js.map +1 -0
  180. package/dist/manager/index.d.ts +3 -2
  181. package/dist/manager/index.d.ts.map +1 -1
  182. package/dist/manager/index.js.map +1 -1
  183. package/dist/manager/run/persistence.d.ts +2 -0
  184. package/dist/manager/run/persistence.d.ts.map +1 -1
  185. package/dist/manager/run/persistence.js +5 -1
  186. package/dist/manager/run/persistence.js.map +1 -1
  187. package/dist/manager/topic/dependency.d.ts +24 -0
  188. package/dist/manager/topic/dependency.d.ts.map +1 -0
  189. package/dist/manager/topic/dependency.js +13 -0
  190. package/dist/manager/topic/dependency.js.map +1 -0
  191. package/dist/manager/topic/lifecycle.d.ts +9 -21
  192. package/dist/manager/topic/lifecycle.d.ts.map +1 -1
  193. package/dist/manager/topic/lifecycle.js +17 -29
  194. package/dist/manager/topic/lifecycle.js.map +1 -1
  195. package/dist/plugin/index.d.ts +1 -0
  196. package/dist/plugin/index.d.ts.map +1 -1
  197. package/dist/plugin/index.js.map +1 -1
  198. package/dist/plugin/lifecycle.d.ts +15 -0
  199. package/dist/plugin/lifecycle.d.ts.map +1 -1
  200. package/dist/plugin/lifecycle.js +144 -38
  201. package/dist/plugin/lifecycle.js.map +1 -1
  202. package/dist/plugin/loader.d.ts +3 -3
  203. package/dist/plugin/loader.d.ts.map +1 -1
  204. package/dist/plugin/loader.js +58 -12
  205. package/dist/plugin/loader.js.map +1 -1
  206. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  207. package/dist/provider/collect-chat-completion.js +4 -0
  208. package/dist/provider/collect-chat-completion.js.map +1 -1
  209. package/dist/provider/fallback.d.ts +3 -1
  210. package/dist/provider/fallback.d.ts.map +1 -1
  211. package/dist/provider/fallback.js +62 -10
  212. package/dist/provider/fallback.js.map +1 -1
  213. package/dist/provider/idle-timeout.d.ts +4 -0
  214. package/dist/provider/idle-timeout.d.ts.map +1 -1
  215. package/dist/provider/idle-timeout.js +131 -15
  216. package/dist/provider/idle-timeout.js.map +1 -1
  217. package/dist/provider/index.d.ts +2 -0
  218. package/dist/provider/index.d.ts.map +1 -1
  219. package/dist/provider/index.js +1 -0
  220. package/dist/provider/index.js.map +1 -1
  221. package/dist/provider/instrumentation.d.ts.map +1 -1
  222. package/dist/provider/instrumentation.js +1 -0
  223. package/dist/provider/instrumentation.js.map +1 -1
  224. package/dist/provider/retry.d.ts.map +1 -1
  225. package/dist/provider/retry.js +13 -1
  226. package/dist/provider/retry.js.map +1 -1
  227. package/dist/public-runtime.d.ts +57 -24
  228. package/dist/public-runtime.d.ts.map +1 -1
  229. package/dist/public-runtime.js +42 -35
  230. package/dist/public-runtime.js.map +1 -1
  231. package/dist/public-tools.d.ts +1 -0
  232. package/dist/public-tools.d.ts.map +1 -1
  233. package/dist/public-tools.js +5 -0
  234. package/dist/public-tools.js.map +1 -1
  235. package/dist/public-types.d.ts +33 -12
  236. package/dist/public-types.d.ts.map +1 -1
  237. package/dist/rag/embedding.d.ts +8 -3
  238. package/dist/rag/embedding.d.ts.map +1 -1
  239. package/dist/rag/embedding.js +120 -9
  240. package/dist/rag/embedding.js.map +1 -1
  241. package/dist/rag/index.d.ts +1 -1
  242. package/dist/rag/index.d.ts.map +1 -1
  243. package/dist/rag/index.js +1 -1
  244. package/dist/rag/index.js.map +1 -1
  245. package/dist/rag/ingestion.d.ts +2 -2
  246. package/dist/rag/ingestion.d.ts.map +1 -1
  247. package/dist/rag/ingestion.js +15 -3
  248. package/dist/rag/ingestion.js.map +1 -1
  249. package/dist/rag/knowledge-base.d.ts +3 -3
  250. package/dist/rag/knowledge-base.d.ts.map +1 -1
  251. package/dist/rag/knowledge-base.js +8 -4
  252. package/dist/rag/knowledge-base.js.map +1 -1
  253. package/dist/rag/operation.d.ts +10 -0
  254. package/dist/rag/operation.d.ts.map +1 -0
  255. package/dist/rag/operation.js +26 -0
  256. package/dist/rag/operation.js.map +1 -0
  257. package/dist/rag/rag-tool.d.ts.map +1 -1
  258. package/dist/rag/rag-tool.js +6 -3
  259. package/dist/rag/rag-tool.js.map +1 -1
  260. package/dist/rag/retriever.d.ts +2 -2
  261. package/dist/rag/retriever.d.ts.map +1 -1
  262. package/dist/rag/retriever.js +31 -15
  263. package/dist/rag/retriever.js.map +1 -1
  264. package/dist/rag/vector-store.d.ts +3 -3
  265. package/dist/rag/vector-store.d.ts.map +1 -1
  266. package/dist/rag/vector-store.js +4 -2
  267. package/dist/rag/vector-store.js.map +1 -1
  268. package/dist/registry/command/kernel-commands.d.ts +16 -4
  269. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  270. package/dist/registry/command/kernel-commands.js +171 -0
  271. package/dist/registry/command/kernel-commands.js.map +1 -1
  272. package/dist/run/reporter.d.ts.map +1 -1
  273. package/dist/run/reporter.js +9 -0
  274. package/dist/run/reporter.js.map +1 -1
  275. package/dist/run-query/index.d.ts +15 -1
  276. package/dist/run-query/index.d.ts.map +1 -1
  277. package/dist/run-query/index.js +69 -15
  278. package/dist/run-query/index.js.map +1 -1
  279. package/dist/runtime/query/context.d.ts.map +1 -1
  280. package/dist/runtime/query/context.js +10 -3
  281. package/dist/runtime/query/context.js.map +1 -1
  282. package/dist/runtime/query/executor.d.ts +3 -0
  283. package/dist/runtime/query/executor.d.ts.map +1 -1
  284. package/dist/runtime/query/executor.js +80 -18
  285. package/dist/runtime/query/executor.js.map +1 -1
  286. package/dist/runtime/query/guard.d.ts +9 -0
  287. package/dist/runtime/query/guard.d.ts.map +1 -1
  288. package/dist/runtime/query/guard.js +11 -0
  289. package/dist/runtime/query/guard.js.map +1 -1
  290. package/dist/runtime/query/index.d.ts +30 -1
  291. package/dist/runtime/query/index.d.ts.map +1 -1
  292. package/dist/runtime/query/index.js +548 -95
  293. package/dist/runtime/query/index.js.map +1 -1
  294. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  295. package/dist/runtime/query/iteration/index.js +74 -14
  296. package/dist/runtime/query/iteration/index.js.map +1 -1
  297. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  298. package/dist/runtime/query/iteration/phases/compaction.js +94 -53
  299. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  300. package/dist/runtime/query/iteration/phases/context.d.ts +3 -0
  301. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  302. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  303. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  304. package/dist/runtime/query/iteration/phases/tool-review.js +21 -0
  305. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  306. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  307. package/dist/runtime/query/iteration/stream-turn.js +4 -0
  308. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  309. package/dist/runtime/query/project-instructions.d.ts +69 -0
  310. package/dist/runtime/query/project-instructions.d.ts.map +1 -0
  311. package/dist/runtime/query/project-instructions.js +137 -0
  312. package/dist/runtime/query/project-instructions.js.map +1 -0
  313. package/dist/runtime/query/request-rich-content.d.ts +22 -0
  314. package/dist/runtime/query/request-rich-content.d.ts.map +1 -0
  315. package/dist/runtime/query/request-rich-content.js +122 -0
  316. package/dist/runtime/query/request-rich-content.js.map +1 -0
  317. package/dist/runtime/query/result.d.ts.map +1 -1
  318. package/dist/runtime/query/result.js +12 -1
  319. package/dist/runtime/query/result.js.map +1 -1
  320. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  321. package/dist/runtime/query/resume-pending.js +19 -20
  322. package/dist/runtime/query/resume-pending.js.map +1 -1
  323. package/dist/runtime/query/resume-run.d.ts.map +1 -1
  324. package/dist/runtime/query/resume-run.js +54 -8
  325. package/dist/runtime/query/resume-run.js.map +1 -1
  326. package/dist/runtime/query/run-state.d.ts +5 -0
  327. package/dist/runtime/query/run-state.d.ts.map +1 -1
  328. package/dist/runtime/query/run-state.js +6 -1
  329. package/dist/runtime/query/run-state.js.map +1 -1
  330. package/dist/runtime/query/sandbox-lifecycle.d.ts +54 -0
  331. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -0
  332. package/dist/runtime/query/sandbox-lifecycle.js +167 -0
  333. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -0
  334. package/dist/sandbox/isolation.d.ts.map +1 -1
  335. package/dist/sandbox/isolation.js +9 -0
  336. package/dist/sandbox/isolation.js.map +1 -1
  337. package/dist/sandbox/provider/local.d.ts +56 -6
  338. package/dist/sandbox/provider/local.d.ts.map +1 -1
  339. package/dist/sandbox/provider/local.js +181 -76
  340. package/dist/sandbox/provider/local.js.map +1 -1
  341. package/dist/sandbox/terminal.d.ts +13 -5
  342. package/dist/sandbox/terminal.d.ts.map +1 -1
  343. package/dist/sandbox/terminal.js +11 -3
  344. package/dist/sandbox/terminal.js.map +1 -1
  345. package/dist/session/errors.d.ts +28 -29
  346. package/dist/session/errors.d.ts.map +1 -1
  347. package/dist/session/errors.js +28 -29
  348. package/dist/session/errors.js.map +1 -1
  349. package/dist/session/handoff/broadcast.d.ts +5 -8
  350. package/dist/session/handoff/broadcast.d.ts.map +1 -1
  351. package/dist/session/handoff/broadcast.js +16 -6
  352. package/dist/session/handoff/broadcast.js.map +1 -1
  353. package/dist/session/handoff/single.d.ts +5 -8
  354. package/dist/session/handoff/single.d.ts.map +1 -1
  355. package/dist/session/handoff/single.js +7 -4
  356. package/dist/session/handoff/single.js.map +1 -1
  357. package/dist/store/attachment/index.d.ts +11 -3
  358. package/dist/store/attachment/index.d.ts.map +1 -1
  359. package/dist/store/attachment/index.js +49 -4
  360. package/dist/store/attachment/index.js.map +1 -1
  361. package/dist/store/feedback/conformance.d.ts.map +1 -1
  362. package/dist/store/feedback/conformance.js +32 -0
  363. package/dist/store/feedback/conformance.js.map +1 -1
  364. package/dist/store/feedback/disk.d.ts +8 -6
  365. package/dist/store/feedback/disk.d.ts.map +1 -1
  366. package/dist/store/feedback/disk.js +111 -76
  367. package/dist/store/feedback/disk.js.map +1 -1
  368. package/dist/store/goal/index.d.ts +111 -0
  369. package/dist/store/goal/index.d.ts.map +1 -0
  370. package/dist/store/goal/index.js +436 -0
  371. package/dist/store/goal/index.js.map +1 -0
  372. package/dist/store/index.d.ts +1 -1
  373. package/dist/store/index.d.ts.map +1 -1
  374. package/dist/store/index.js +1 -1
  375. package/dist/store/index.js.map +1 -1
  376. package/dist/store/kv/revision-record-store.d.ts +70 -0
  377. package/dist/store/kv/revision-record-store.d.ts.map +1 -0
  378. package/dist/store/kv/revision-record-store.js +290 -0
  379. package/dist/store/kv/revision-record-store.js.map +1 -0
  380. package/dist/store/memory/disk.d.ts +9 -7
  381. package/dist/store/memory/disk.d.ts.map +1 -1
  382. package/dist/store/memory/disk.js +256 -98
  383. package/dist/store/memory/disk.js.map +1 -1
  384. package/dist/store/run/disk.d.ts +10 -2
  385. package/dist/store/run/disk.d.ts.map +1 -1
  386. package/dist/store/run/disk.js +70 -4
  387. package/dist/store/run/disk.js.map +1 -1
  388. package/dist/store/run/memory.d.ts +4 -2
  389. package/dist/store/run/memory.d.ts.map +1 -1
  390. package/dist/store/run/memory.js +15 -1
  391. package/dist/store/run/memory.js.map +1 -1
  392. package/dist/store/session/disk.d.ts +9 -0
  393. package/dist/store/session/disk.d.ts.map +1 -1
  394. package/dist/store/session/disk.js +57 -5
  395. package/dist/store/session/disk.js.map +1 -1
  396. package/dist/store/session/memory.d.ts +1 -0
  397. package/dist/store/session/memory.d.ts.map +1 -1
  398. package/dist/store/session/memory.js +14 -0
  399. package/dist/store/session/memory.js.map +1 -1
  400. package/dist/store/topic/memory.d.ts +1 -2
  401. package/dist/store/topic/memory.d.ts.map +1 -1
  402. package/dist/store/topic/memory.js +4 -5
  403. package/dist/store/topic/memory.js.map +1 -1
  404. package/dist/store/topic/objective.d.ts +8 -4
  405. package/dist/store/topic/objective.d.ts.map +1 -1
  406. package/dist/store/topic/objective.js +185 -100
  407. package/dist/store/topic/objective.js.map +1 -1
  408. package/dist/store/topic/state.d.ts +1 -2
  409. package/dist/store/topic/state.d.ts.map +1 -1
  410. package/dist/store/topic/state.js +50 -62
  411. package/dist/store/topic/state.js.map +1 -1
  412. package/dist/tools/builtins/bash.d.ts.map +1 -1
  413. package/dist/tools/builtins/bash.js +20 -0
  414. package/dist/tools/builtins/bash.js.map +1 -1
  415. package/dist/tools/builtins/computer-use.d.ts +9 -1
  416. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  417. package/dist/tools/builtins/computer-use.js.map +1 -1
  418. package/dist/tools/builtins/content-fingerprint.d.ts +8 -7
  419. package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
  420. package/dist/tools/builtins/content-fingerprint.js +9 -10
  421. package/dist/tools/builtins/content-fingerprint.js.map +1 -1
  422. package/dist/tools/builtins/edit.d.ts +6 -1
  423. package/dist/tools/builtins/edit.d.ts.map +1 -1
  424. package/dist/tools/builtins/edit.js +166 -27
  425. package/dist/tools/builtins/edit.js.map +1 -1
  426. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  427. package/dist/tools/builtins/write-file.js +45 -19
  428. package/dist/tools/builtins/write-file.js.map +1 -1
  429. package/dist/tools/command-arguments.d.ts +43 -0
  430. package/dist/tools/command-arguments.d.ts.map +1 -0
  431. package/dist/tools/command-arguments.js +52 -0
  432. package/dist/tools/command-arguments.js.map +1 -0
  433. package/dist/tools/coordinator/index.d.ts +2 -0
  434. package/dist/tools/coordinator/index.d.ts.map +1 -1
  435. package/dist/tools/coordinator/index.js +3 -1
  436. package/dist/tools/coordinator/index.js.map +1 -1
  437. package/dist/tools/defineTool.d.ts +10 -0
  438. package/dist/tools/defineTool.d.ts.map +1 -1
  439. package/dist/tools/defineTool.js +1 -0
  440. package/dist/tools/defineTool.js.map +1 -1
  441. package/dist/tools/env-scrub.d.ts +7 -5
  442. package/dist/tools/env-scrub.d.ts.map +1 -1
  443. package/dist/tools/env-scrub.js +7 -5
  444. package/dist/tools/env-scrub.js.map +1 -1
  445. package/dist/tools/goal/index.d.ts +20 -0
  446. package/dist/tools/goal/index.d.ts.map +1 -0
  447. package/dist/tools/goal/index.js +104 -0
  448. package/dist/tools/goal/index.js.map +1 -0
  449. package/dist/tools/memory/index.d.ts +16 -0
  450. package/dist/tools/memory/index.d.ts.map +1 -1
  451. package/dist/tools/memory/index.js +6 -2
  452. package/dist/tools/memory/index.js.map +1 -1
  453. package/dist/tools/memory/search.d.ts +4 -1
  454. package/dist/tools/memory/search.d.ts.map +1 -1
  455. package/dist/tools/memory/search.js +10 -2
  456. package/dist/tools/memory/search.js.map +1 -1
  457. package/dist/types/agent/base.d.ts +11 -3
  458. package/dist/types/agent/base.d.ts.map +1 -1
  459. package/dist/types/agent/factory.d.ts +2 -0
  460. package/dist/types/agent/factory.d.ts.map +1 -1
  461. package/dist/types/agent/reactive.d.ts +2 -0
  462. package/dist/types/agent/reactive.d.ts.map +1 -1
  463. package/dist/types/agent/supervisor.d.ts +6 -0
  464. package/dist/types/agent/supervisor.d.ts.map +1 -1
  465. package/dist/types/agent/task.d.ts +6 -2
  466. package/dist/types/agent/task.d.ts.map +1 -1
  467. package/dist/types/connector/core.d.ts +13 -8
  468. package/dist/types/connector/core.d.ts.map +1 -1
  469. package/dist/types/connector/definition.d.ts +37 -18
  470. package/dist/types/connector/definition.d.ts.map +1 -1
  471. package/dist/types/connector/http.d.ts +6 -0
  472. package/dist/types/connector/http.d.ts.map +1 -1
  473. package/dist/types/connector/mcp.d.ts +24 -6
  474. package/dist/types/connector/mcp.d.ts.map +1 -1
  475. package/dist/types/connector/tenant.d.ts +17 -7
  476. package/dist/types/connector/tenant.d.ts.map +1 -1
  477. package/dist/types/connector/webhook.d.ts +6 -0
  478. package/dist/types/connector/webhook.d.ts.map +1 -1
  479. package/dist/types/goal/index.d.ts +46 -0
  480. package/dist/types/goal/index.d.ts.map +1 -0
  481. package/dist/types/goal/index.js +2 -0
  482. package/dist/types/goal/index.js.map +1 -0
  483. package/dist/types/ids/index.d.ts +2 -0
  484. package/dist/types/ids/index.d.ts.map +1 -1
  485. package/dist/types/ids/index.js.map +1 -1
  486. package/dist/types/message/index.d.ts +79 -13
  487. package/dist/types/message/index.d.ts.map +1 -1
  488. package/dist/types/message/index.js +49 -3
  489. package/dist/types/message/index.js.map +1 -1
  490. package/dist/types/plugin/index.d.ts +7 -5
  491. package/dist/types/plugin/index.d.ts.map +1 -1
  492. package/dist/types/plugin/index.js.map +1 -1
  493. package/dist/types/provider/chat.d.ts +27 -4
  494. package/dist/types/provider/chat.d.ts.map +1 -1
  495. package/dist/types/provider/index.d.ts +1 -1
  496. package/dist/types/provider/index.d.ts.map +1 -1
  497. package/dist/types/provider/interface.d.ts +18 -7
  498. package/dist/types/provider/interface.d.ts.map +1 -1
  499. package/dist/types/provider/model.d.ts +12 -0
  500. package/dist/types/provider/model.d.ts.map +1 -1
  501. package/dist/types/provider/stream.d.ts +6 -0
  502. package/dist/types/provider/stream.d.ts.map +1 -1
  503. package/dist/types/rag/embedding.d.ts +15 -2
  504. package/dist/types/rag/embedding.d.ts.map +1 -1
  505. package/dist/types/rag/ingestion.d.ts +2 -2
  506. package/dist/types/rag/ingestion.d.ts.map +1 -1
  507. package/dist/types/rag/knowledge-base.d.ts +3 -3
  508. package/dist/types/rag/knowledge-base.d.ts.map +1 -1
  509. package/dist/types/rag/retrieval.d.ts +2 -2
  510. package/dist/types/rag/retrieval.d.ts.map +1 -1
  511. package/dist/types/rag/scope.d.ts +4 -0
  512. package/dist/types/rag/scope.d.ts.map +1 -1
  513. package/dist/types/rag/vector.d.ts +5 -2
  514. package/dist/types/rag/vector.d.ts.map +1 -1
  515. package/dist/types/run/config.d.ts +20 -0
  516. package/dist/types/run/config.d.ts.map +1 -1
  517. package/dist/types/run/events.d.ts +25 -1
  518. package/dist/types/run/events.d.ts.map +1 -1
  519. package/dist/types/run/events.js.map +1 -1
  520. package/dist/types/run/metadata.d.ts +2 -0
  521. package/dist/types/run/metadata.d.ts.map +1 -1
  522. package/dist/types/run/step.d.ts +2 -6
  523. package/dist/types/run/step.d.ts.map +1 -1
  524. package/dist/types/run/step.js.map +1 -1
  525. package/dist/types/run/store.d.ts +55 -2
  526. package/dist/types/run/store.d.ts.map +1 -1
  527. package/dist/types/sandbox/index.d.ts +47 -6
  528. package/dist/types/sandbox/index.d.ts.map +1 -1
  529. package/dist/types/sandbox/index.js +23 -10
  530. package/dist/types/sandbox/index.js.map +1 -1
  531. package/dist/types/session/store.d.ts +13 -0
  532. package/dist/types/session/store.d.ts.map +1 -1
  533. package/dist/types/tool/index.d.ts +33 -11
  534. package/dist/types/tool/index.d.ts.map +1 -1
  535. package/dist/types/tool/index.js.map +1 -1
  536. package/dist/types/topic/entity.d.ts +3 -4
  537. package/dist/types/topic/entity.d.ts.map +1 -1
  538. package/dist/types/topic/store.d.ts +3 -3
  539. package/dist/utils/id.d.ts +3 -1
  540. package/dist/utils/id.d.ts.map +1 -1
  541. package/dist/utils/id.js +4 -0
  542. package/dist/utils/id.js.map +1 -1
  543. package/dist/utils/process-environment.d.ts +26 -0
  544. package/dist/utils/process-environment.d.ts.map +1 -0
  545. package/dist/utils/process-environment.js +78 -0
  546. package/dist/utils/process-environment.js.map +1 -0
  547. package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
  548. package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
  549. package/dist/vault/InMemoryCredentialVault.js +24 -4
  550. package/dist/vault/InMemoryCredentialVault.js.map +1 -1
  551. package/dist/vault/instrumentation.d.ts.map +1 -1
  552. package/dist/vault/instrumentation.js +15 -0
  553. package/dist/vault/instrumentation.js.map +1 -1
  554. package/package.json +1 -1
  555. package/src/advisory/executor.ts +4 -1
  556. package/src/agents/ReactiveAgent.ts +12 -0
  557. package/src/agents/RouterAgent.ts +25 -3
  558. package/src/agents/SupervisorAgent.ts +33 -11
  559. package/src/agents/runAgent.ts +38 -2
  560. package/src/authorization/command-line.ts +390 -0
  561. package/src/authorization/rules.ts +22 -1
  562. package/src/bridge/a2a/client.ts +384 -97
  563. package/src/bridge/a2a/mapper.ts +5 -0
  564. package/src/bridge/acp/server.ts +184 -42
  565. package/src/bridge/mcp/connector/adapter.ts +28 -20
  566. package/src/bridge/sse/mapper.ts +3 -0
  567. package/src/compaction/dangling.ts +203 -38
  568. package/src/compaction/index.ts +9 -2
  569. package/src/compaction/manual.ts +125 -18
  570. package/src/compaction/plan.ts +42 -11
  571. package/src/compaction/retention.ts +23 -8
  572. package/src/compaction/summary.ts +4 -4
  573. package/src/compaction/verifier.ts +66 -0
  574. package/src/connector/BaseConnector.ts +19 -4
  575. package/src/connector/builtins/http.ts +236 -46
  576. package/src/connector/builtins/webhook.ts +207 -47
  577. package/src/connector/execution-contract.ts +27 -0
  578. package/src/connector/http-operation.ts +238 -0
  579. package/src/connector/mcp/adapter.ts +8 -3
  580. package/src/connector/mcp/client.ts +207 -58
  581. package/src/connector/mcp/http-sse.ts +91 -23
  582. package/src/connector/mcp/prompt-adapter.ts +8 -2
  583. package/src/connector/mcp/stdio.ts +21 -46
  584. package/src/connector/mcp/streamable-http.ts +86 -22
  585. package/src/connector/tools/adapter.ts +23 -14
  586. package/src/connector/tools/definitions.ts +5 -2
  587. package/src/connector/tools/result.ts +21 -0
  588. package/src/connector/web/guarded-fetch.ts +188 -48
  589. package/src/constants/sandbox/index.ts +3 -2
  590. package/src/contracts/api.ts +2 -0
  591. package/src/contracts/schemas.ts +7 -0
  592. package/src/directory/derive-supervisor.ts +8 -0
  593. package/src/directory/derive.ts +8 -0
  594. package/src/directory/load.ts +2 -0
  595. package/src/directory/types.ts +4 -0
  596. package/src/eval/experiment.ts +160 -111
  597. package/src/eval/judge.ts +13 -2
  598. package/src/eval/types.ts +7 -1
  599. package/src/manager/agent/lifecycle.ts +28 -12
  600. package/src/manager/connector/environment.ts +3 -1
  601. package/src/manager/connector/lifecycle.ts +364 -24
  602. package/src/manager/connector/tenant.ts +56 -23
  603. package/src/manager/goal/activation.ts +52 -0
  604. package/src/manager/index.ts +10 -2
  605. package/src/manager/run/persistence.ts +6 -1
  606. package/src/manager/topic/dependency.ts +39 -0
  607. package/src/manager/topic/lifecycle.ts +19 -31
  608. package/src/plugin/index.ts +1 -0
  609. package/src/plugin/lifecycle.ts +180 -39
  610. package/src/plugin/loader.ts +70 -13
  611. package/src/provider/collect-chat-completion.ts +3 -0
  612. package/src/provider/fallback.ts +79 -11
  613. package/src/provider/idle-timeout.ts +143 -17
  614. package/src/provider/index.ts +2 -0
  615. package/src/provider/instrumentation.ts +1 -0
  616. package/src/provider/retry.ts +16 -1
  617. package/src/public-runtime.ts +190 -32
  618. package/src/public-tools.ts +5 -0
  619. package/src/public-types.ts +85 -11
  620. package/src/rag/embedding.ts +147 -19
  621. package/src/rag/index.ts +1 -1
  622. package/src/rag/ingestion.ts +16 -2
  623. package/src/rag/knowledge-base.ts +13 -4
  624. package/src/rag/operation.ts +28 -0
  625. package/src/rag/rag-tool.ts +6 -3
  626. package/src/rag/retriever.ts +62 -11
  627. package/src/rag/vector-store.ts +8 -2
  628. package/src/registry/command/kernel-commands.ts +223 -4
  629. package/src/run/reporter.ts +10 -0
  630. package/src/run-query/index.ts +84 -15
  631. package/src/runtime/query/context.ts +13 -3
  632. package/src/runtime/query/executor.ts +90 -17
  633. package/src/runtime/query/guard.ts +12 -0
  634. package/src/runtime/query/index.ts +652 -103
  635. package/src/runtime/query/iteration/index.ts +89 -13
  636. package/src/runtime/query/iteration/phases/compaction.ts +120 -55
  637. package/src/runtime/query/iteration/phases/context.ts +4 -0
  638. package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
  639. package/src/runtime/query/iteration/stream-turn.ts +3 -0
  640. package/src/runtime/query/project-instructions.ts +212 -0
  641. package/src/runtime/query/request-rich-content.ts +153 -0
  642. package/src/runtime/query/result.ts +12 -1
  643. package/src/runtime/query/resume-pending.ts +20 -18
  644. package/src/runtime/query/resume-run.ts +52 -8
  645. package/src/runtime/query/run-state.ts +11 -1
  646. package/src/runtime/query/sandbox-lifecycle.ts +210 -0
  647. package/src/sandbox/isolation.ts +9 -0
  648. package/src/sandbox/provider/local.ts +255 -90
  649. package/src/sandbox/terminal.ts +13 -5
  650. package/src/session/errors.ts +68 -42
  651. package/src/session/handoff/broadcast.ts +20 -14
  652. package/src/session/handoff/single.ts +14 -13
  653. package/src/store/attachment/index.ts +65 -3
  654. package/src/store/feedback/conformance.ts +39 -0
  655. package/src/store/feedback/disk.ts +128 -82
  656. package/src/store/goal/index.ts +594 -0
  657. package/src/store/index.ts +1 -1
  658. package/src/store/kv/revision-record-store.ts +346 -0
  659. package/src/store/memory/disk.ts +288 -113
  660. package/src/store/run/disk.ts +96 -5
  661. package/src/store/run/memory.ts +22 -2
  662. package/src/store/session/disk.ts +93 -6
  663. package/src/store/session/memory.ts +22 -0
  664. package/src/store/topic/memory.ts +4 -5
  665. package/src/store/topic/objective.ts +215 -100
  666. package/src/store/topic/state.ts +100 -63
  667. package/src/tools/builtins/bash.ts +21 -0
  668. package/src/tools/builtins/computer-use.ts +9 -1
  669. package/src/tools/builtins/content-fingerprint.ts +9 -12
  670. package/src/tools/builtins/edit.ts +190 -27
  671. package/src/tools/builtins/write-file.ts +55 -19
  672. package/src/tools/command-arguments.ts +54 -0
  673. package/src/tools/coordinator/index.ts +4 -1
  674. package/src/tools/defineTool.ts +11 -0
  675. package/src/tools/env-scrub.ts +7 -5
  676. package/src/tools/goal/index.ts +129 -0
  677. package/src/tools/memory/index.ts +26 -3
  678. package/src/tools/memory/search.ts +20 -3
  679. package/src/types/agent/base.ts +12 -3
  680. package/src/types/agent/factory.ts +2 -0
  681. package/src/types/agent/reactive.ts +2 -0
  682. package/src/types/agent/supervisor.ts +6 -0
  683. package/src/types/agent/task.ts +6 -2
  684. package/src/types/connector/core.ts +13 -8
  685. package/src/types/connector/definition.ts +54 -20
  686. package/src/types/connector/http.ts +7 -0
  687. package/src/types/connector/mcp.ts +27 -6
  688. package/src/types/connector/tenant.ts +21 -7
  689. package/src/types/connector/webhook.ts +7 -0
  690. package/src/types/goal/index.ts +50 -0
  691. package/src/types/ids/index.ts +2 -0
  692. package/src/types/message/index.ts +147 -12
  693. package/src/types/plugin/index.ts +7 -5
  694. package/src/types/provider/chat.ts +35 -4
  695. package/src/types/provider/index.ts +1 -1
  696. package/src/types/provider/interface.ts +22 -7
  697. package/src/types/provider/model.ts +13 -0
  698. package/src/types/provider/stream.ts +6 -0
  699. package/src/types/rag/embedding.ts +16 -2
  700. package/src/types/rag/ingestion.ts +2 -1
  701. package/src/types/rag/knowledge-base.ts +7 -3
  702. package/src/types/rag/retrieval.ts +2 -1
  703. package/src/types/rag/scope.ts +5 -0
  704. package/src/types/rag/vector.ts +5 -2
  705. package/src/types/run/config.ts +20 -0
  706. package/src/types/run/events.ts +28 -3
  707. package/src/types/run/metadata.ts +2 -0
  708. package/src/types/run/step.ts +2 -7
  709. package/src/types/run/store.ts +60 -2
  710. package/src/types/sandbox/index.ts +57 -14
  711. package/src/types/session/store.ts +18 -0
  712. package/src/types/tool/index.ts +33 -11
  713. package/src/types/topic/entity.ts +3 -4
  714. package/src/types/topic/store.ts +3 -3
  715. package/src/utils/id.ts +6 -0
  716. package/src/utils/process-environment.ts +101 -0
  717. package/src/vault/InMemoryCredentialVault.ts +29 -4
  718. package/src/vault/instrumentation.ts +24 -0
@@ -1,5 +1,6 @@
1
- import { mkdir, unlink } from 'node:fs/promises'
2
- import { join } from 'node:path'
1
+ import { mkdir, realpath, unlink } from 'node:fs/promises'
2
+ import { dirname, join, resolve } from 'node:path'
3
+ import { NamzuError } from '../../types/errors/index.js'
3
4
  import type { MemoryId } from '../../types/ids/index.js'
4
5
  import type {
5
6
  CreateMemoryParams,
@@ -9,7 +10,7 @@ import type {
9
10
  MemorySearchResult,
10
11
  MemoryStore,
11
12
  } from '../../types/memory/index.js'
12
- import { generateMemoryId } from '../../utils/id.js'
13
+ import { asMemoryId, generateMemoryId } from '../../utils/id.js'
13
14
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
14
15
  import { type Logger, resolveLogger } from '../../utils/logger.js'
15
16
  import { DiskRecordStore } from '../kv/record-store.js'
@@ -26,142 +27,315 @@ import { InMemoryMemoryIndex } from './index.js'
26
27
  */
27
28
  const SCHEMA = defineSchema({ kind: 'memory-store', current: 1, migrations: {} })
28
29
 
30
+ const SAFE_STORAGE_ID = /^mem_[A-Za-z0-9_-]+$/
31
+
32
+ interface StorageLocation {
33
+ readonly indexPath: string
34
+ readonly contentDir: string
35
+ }
36
+
37
+ const operationTails = new Map<string, Promise<void>>()
38
+
39
+ /** Serialize every operation over one canonical disk projection in this process. */
40
+ async function withMemoryOperationLock<T>(key: string, operation: () => Promise<T>): Promise<T> {
41
+ const previous = operationTails.get(key) ?? Promise.resolve()
42
+ let release = () => {}
43
+ const current = new Promise<void>((resolveCurrent) => {
44
+ release = resolveCurrent
45
+ })
46
+ const tail = previous.then(() => current)
47
+ operationTails.set(key, tail)
48
+
49
+ await previous
50
+ try {
51
+ return await operation()
52
+ } finally {
53
+ release()
54
+ if (operationTails.get(key) === tail) operationTails.delete(key)
55
+ }
56
+ }
57
+
58
+ function invalidIndex(
59
+ reason: string,
60
+ details: { entryIndex?: number; field?: string } = {},
61
+ ): never {
62
+ throw new NamzuError({
63
+ code: 'storage_error',
64
+ message: `Memory index is invalid${
65
+ details.entryIndex === undefined ? '' : ` at entry ${details.entryIndex}`
66
+ }: ${reason}. Refusing to treat unreadable durable memory as empty.`,
67
+ details,
68
+ retryable: false,
69
+ })
70
+ }
71
+
72
+ function invalidContent(id: string, reason: string, details: { field?: string } = {}): never {
73
+ throw new NamzuError({
74
+ code: 'storage_error',
75
+ message: `Memory content for ${id} is invalid: ${reason}. Refusing to treat indexed durable memory as absent or valid.`,
76
+ details: { id, ...details },
77
+ retryable: false,
78
+ })
79
+ }
80
+
81
+ /** A typed ID is not automatically a safe filesystem segment. */
82
+ function assertStorageMemoryId(
83
+ value: unknown,
84
+ refuse: (reason: string) => never,
85
+ ): asserts value is MemoryId {
86
+ if (typeof value !== 'string') refuse('id must be a memory ID string')
87
+ try {
88
+ asMemoryId(value)
89
+ } catch {
90
+ refuse('id must use the recognized mem_ prefix')
91
+ }
92
+ if (!SAFE_STORAGE_ID.test(value)) {
93
+ refuse('id must be one cross-platform safe filename segment')
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Validate the domain shape before anything is installed in the live index.
99
+ *
100
+ * `DiskRecordStore` owns the version envelope and JSON parsing; it cannot
101
+ * know that this particular array contains memory entries. Keeping this
102
+ * check here avoids turning the generic primitive into a schema registry,
103
+ * while ensuring valid JSON with a wrong field type cannot be accepted and
104
+ * later written back beside a new record.
105
+ */
106
+ function assertMemoryIndexEntries(value: unknown): asserts value is readonly MemoryIndexEntry[] {
107
+ if (!Array.isArray(value)) invalidIndex('the top-level value must be an array')
108
+
109
+ const ids = new Set<string>()
110
+ for (const [entryIndex, candidate] of value.entries()) {
111
+ if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate)) {
112
+ invalidIndex('each entry must be an object', { entryIndex })
113
+ }
114
+ const entry = candidate as Record<string, unknown>
115
+
116
+ assertStorageMemoryId(entry.id, (reason) =>
117
+ invalidIndex(reason, {
118
+ entryIndex,
119
+ field: 'id',
120
+ }),
121
+ )
122
+ if (ids.has(entry.id)) {
123
+ invalidIndex('ids must be unique', { entryIndex, field: 'id' })
124
+ }
125
+ ids.add(entry.id)
126
+
127
+ for (const field of ['title', 'summary'] as const) {
128
+ if (typeof entry[field] !== 'string') {
129
+ invalidIndex(`${field} must be a string`, { entryIndex, field })
130
+ }
131
+ }
132
+ if (!Array.isArray(entry.tags) || !entry.tags.every((tag) => typeof tag === 'string')) {
133
+ invalidIndex('tags must be an array of strings', { entryIndex, field: 'tags' })
134
+ }
135
+ if (entry.status !== 'active' && entry.status !== 'archived') {
136
+ invalidIndex('status must be active or archived', { entryIndex, field: 'status' })
137
+ }
138
+ for (const field of ['createdAt', 'updatedAt'] as const) {
139
+ if (typeof entry[field] !== 'number' || !Number.isFinite(entry[field])) {
140
+ invalidIndex(`${field} must be a finite number`, { entryIndex, field })
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ function assertMemoryContent(value: unknown, expectedId: MemoryId): asserts value is MemoryContent {
147
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
148
+ invalidContent(expectedId, 'the record must be an object')
149
+ }
150
+ const content = value as Record<string, unknown>
151
+ assertStorageMemoryId(content.id, (reason) => invalidContent(expectedId, reason, { field: 'id' }))
152
+ if (content.id !== expectedId) {
153
+ invalidContent(expectedId, 'record id does not match its index owner', { field: 'id' })
154
+ }
155
+ if (typeof content.content !== 'string') {
156
+ invalidContent(expectedId, 'content must be a string', { field: 'content' })
157
+ }
158
+ if (content.format !== 'text' && content.format !== 'markdown' && content.format !== 'json') {
159
+ invalidContent(expectedId, 'format must be text, markdown, or json', { field: 'format' })
160
+ }
161
+ if (
162
+ content.metadata !== undefined &&
163
+ (content.metadata === null ||
164
+ typeof content.metadata !== 'object' ||
165
+ Array.isArray(content.metadata))
166
+ ) {
167
+ invalidContent(expectedId, 'metadata must be an object when present', { field: 'metadata' })
168
+ }
169
+ }
170
+
29
171
  export interface DiskMemoryStoreConfig {
30
172
  baseDir: string
31
173
  logger?: Logger
32
174
  }
33
175
 
34
176
  export class DiskMemoryStore implements MemoryStore {
35
- private baseDir: string
36
- private log: Logger
37
- private index = new InMemoryMemoryIndex()
38
- private initialized = false
177
+ private readonly baseDir: string
178
+ private readonly log: Logger
179
+ private readonly index = new InMemoryMemoryIndex()
180
+ private location?: StorageLocation
39
181
  // Two instances of one primitive rather than two copies of its body.
40
182
  // Typed separately because the index file holds an ARRAY and a content
41
183
  // file holds one record, and a single `DiskRecordStore<unknown>` would
42
184
  // have put the cast back at every call site.
43
- private readonly records = new DiskRecordStore<MemoryContent>(SCHEMA)
44
- private readonly indexRecords = new DiskRecordStore<readonly MemoryIndexEntry[]>(SCHEMA)
185
+ private readonly records = new DiskRecordStore<unknown>(SCHEMA)
186
+ private readonly indexRecords = new DiskRecordStore<unknown>(SCHEMA)
45
187
 
46
188
  constructor(config: DiskMemoryStoreConfig) {
47
189
  this.baseDir = join(config.baseDir, 'memory')
48
190
  this.log = resolveLogger(config.logger).child({ [SCOPE_ATTRIBUTE]: 'store/memory/disk' })
49
191
  }
50
192
 
51
- private get indexPath(): string {
52
- return join(this.baseDir, 'index.json')
53
- }
54
-
55
193
  private get contentDir(): string {
56
194
  return join(this.baseDir, 'content')
57
195
  }
58
196
 
59
- private contentPath(id: MemoryId): string {
60
- return join(this.contentDir, `${id}.json`)
61
- }
62
-
63
- private async ensureInit(): Promise<void> {
64
- if (this.initialized) return
197
+ private async storageLocation(): Promise<StorageLocation> {
198
+ if (this.location) return this.location
65
199
 
66
200
  await mkdir(this.contentDir, { recursive: true })
201
+ const [canonicalBaseDir, canonicalContentDir] = await Promise.all([
202
+ realpath(this.baseDir),
203
+ realpath(this.contentDir),
204
+ ])
205
+ if (dirname(canonicalContentDir) !== canonicalBaseDir) {
206
+ invalidIndex('the content directory resolves outside the memory store')
207
+ }
208
+ this.location = {
209
+ indexPath: join(canonicalBaseDir, 'index.json'),
210
+ contentDir: canonicalContentDir,
211
+ }
212
+ return this.location
213
+ }
214
+
215
+ private contentPath(location: StorageLocation, id: MemoryId): string {
216
+ assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
217
+ const path = resolve(location.contentDir, `${id}.json`)
218
+ if (dirname(path) !== location.contentDir) {
219
+ invalidContent(id, 'resolved path escapes the content directory', { field: 'id' })
220
+ }
221
+ return path
222
+ }
67
223
 
224
+ private async reloadIndex(location: StorageLocation): Promise<void> {
68
225
  try {
69
- // `null` for "no index yet", which is an ordinary first-run state
70
- // and not something to warn about. The catch below is now only
71
- // for a real IO or parse failure — the distinction this method
72
- // used to draw by hand with an ENOENT comparison.
73
- const entries = await this.indexRecords.read(this.indexPath)
74
- if (entries !== null) {
75
- this.index.rebuild([...entries])
76
- this.log.info('Memory index loaded', { 'namzu.store.count': entries.length })
226
+ const entries = await this.indexRecords.read(location.indexPath)
227
+ if (entries === null) {
228
+ this.index.rebuild([])
229
+ return
77
230
  }
231
+ assertMemoryIndexEntries(entries)
232
+ this.index.rebuild([...entries])
233
+ this.log.info('Memory index loaded', { 'namzu.store.count': entries.length })
78
234
  } catch (err) {
79
- this.log.warn('Failed to read memory index — starting fresh', {
235
+ this.log.error('Failed to read memory index — refusing to start empty', {
80
236
  'exception.message': String(err),
81
237
  })
238
+ throw err
82
239
  }
240
+ }
241
+
242
+ private async withAuthoritativeIndex<T>(
243
+ operation: (location: StorageLocation) => Promise<T>,
244
+ ): Promise<T> {
245
+ const location = await this.storageLocation()
246
+ return withMemoryOperationLock(location.indexPath, async () => {
247
+ await this.reloadIndex(location)
248
+ return operation(location)
249
+ })
250
+ }
83
251
 
84
- this.initialized = true
252
+ private async readContent(location: StorageLocation, id: MemoryId): Promise<MemoryContent> {
253
+ const content = await this.records.read(this.contentPath(location, id))
254
+ if (content === null) invalidContent(id, 'the indexed content record is missing')
255
+ assertMemoryContent(content, id)
256
+ return content
257
+ }
258
+
259
+ private async writeIndex(
260
+ location: StorageLocation,
261
+ entries: readonly MemoryIndexEntry[],
262
+ ): Promise<void> {
263
+ await this.indexRecords.write(location.indexPath, entries)
85
264
  }
86
265
 
87
266
  async create(
88
267
  params: CreateMemoryParams,
89
268
  ): Promise<{ entry: MemoryIndexEntry; content: MemoryContent }> {
90
- await this.ensureInit()
91
-
92
- const id = generateMemoryId()
93
- const now = Date.now()
94
-
95
- const entry: MemoryIndexEntry = {
96
- id,
97
- title: params.title,
98
- summary: params.summary,
99
- tags: params.tags ? [...params.tags] : [],
100
- status: 'active',
101
- createdAt: now,
102
- updatedAt: now,
103
- }
269
+ return this.withAuthoritativeIndex(async (location) => {
270
+ const id = generateMemoryId()
271
+ const now = Date.now()
272
+
273
+ const entry: MemoryIndexEntry = {
274
+ id,
275
+ title: params.title,
276
+ summary: params.summary,
277
+ tags: params.tags ? [...params.tags] : [],
278
+ status: 'active',
279
+ createdAt: now,
280
+ updatedAt: now,
281
+ }
104
282
 
105
- const memoryContent: MemoryContent = {
106
- id,
107
- content: params.content,
108
- format: params.format ?? 'text',
109
- metadata: params.metadata ? { ...params.metadata } : undefined,
110
- }
283
+ const memoryContent: MemoryContent = {
284
+ id,
285
+ content: params.content,
286
+ format: params.format ?? 'text',
287
+ metadata: params.metadata ? { ...params.metadata } : undefined,
288
+ }
289
+ const contentPath = this.contentPath(location, id)
290
+ const entries = [...this.index.allEntries(), entry]
111
291
 
112
- this.index.set(entry)
113
- await this.persistIndex()
114
- await this.records.write(this.contentPath(id), memoryContent)
292
+ await this.records.write(contentPath, memoryContent)
293
+ try {
294
+ await this.writeIndex(location, entries)
295
+ } catch (error) {
296
+ await unlink(contentPath).catch(() => undefined)
297
+ throw error
298
+ }
299
+ this.index.rebuild(entries)
115
300
 
116
- this.log.info('Memory created', { 'namzu.memory.id': id, 'namzu.store.title': params.title })
301
+ this.log.info('Memory created', {
302
+ 'namzu.memory.id': id,
303
+ 'namzu.store.title': params.title,
304
+ })
117
305
 
118
- return { entry, content: memoryContent }
306
+ return { entry, content: memoryContent }
307
+ })
119
308
  }
120
309
 
121
310
  async get(id: MemoryId): Promise<MemoryContent | undefined> {
122
- await this.ensureInit()
123
-
124
- if (!this.index.getEntry(id)) return undefined
125
-
126
- try {
127
- return (await this.records.read(this.contentPath(id))) ?? undefined
128
- } catch {
129
- this.log.warn('Failed to read memory content', { 'namzu.memory.id': id })
130
- return undefined
131
- }
311
+ return this.withAuthoritativeIndex(async (location) => {
312
+ assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
313
+ if (!this.index.getEntry(id)) return undefined
314
+ return this.readContent(location, id)
315
+ })
132
316
  }
133
317
 
134
318
  async update(
135
319
  id: MemoryId,
136
320
  updates: Partial<CreateMemoryParams>,
137
321
  ): Promise<MemoryIndexEntry | undefined> {
138
- await this.ensureInit()
139
-
140
- const existing = this.index.getEntry(id)
141
- if (!existing) return undefined
142
-
143
- const now = Date.now()
144
-
145
- const updated: MemoryIndexEntry = {
146
- ...existing,
147
- title: updates.title ?? existing.title,
148
- summary: updates.summary ?? existing.summary,
149
- tags: updates.tags ? [...updates.tags] : existing.tags,
150
- updatedAt: now,
151
- }
152
-
153
- this.index.set(updated)
154
- await this.persistIndex()
155
-
156
- if (
157
- updates.content !== undefined ||
158
- updates.format !== undefined ||
159
- updates.metadata !== undefined
160
- ) {
161
- try {
162
- const existingContent = await this.records.read(this.contentPath(id))
163
- if (existingContent === null) throw new Error('memory content is missing')
164
-
322
+ return this.withAuthoritativeIndex(async (location) => {
323
+ assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
324
+ const existing = this.index.getEntry(id)
325
+ if (!existing) return undefined
326
+ const existingContent = await this.readContent(location, id)
327
+ const updated: MemoryIndexEntry = {
328
+ ...existing,
329
+ title: updates.title ?? existing.title,
330
+ summary: updates.summary ?? existing.summary,
331
+ tags: updates.tags ? [...updates.tags] : existing.tags,
332
+ updatedAt: Date.now(),
333
+ }
334
+ const updatesContent =
335
+ updates.content !== undefined ||
336
+ updates.format !== undefined ||
337
+ updates.metadata !== undefined
338
+ if (updatesContent) {
165
339
  const updatedContent: MemoryContent = {
166
340
  ...existingContent,
167
341
  content: updates.content ?? existingContent.content,
@@ -169,41 +343,42 @@ export class DiskMemoryStore implements MemoryStore {
169
343
  metadata:
170
344
  updates.metadata !== undefined ? { ...updates.metadata } : existingContent.metadata,
171
345
  }
172
-
173
- await this.records.write(this.contentPath(id), updatedContent)
174
- } catch {
175
- this.log.warn('Failed to update memory content', { 'namzu.memory.id': id })
346
+ await this.records.write(this.contentPath(location, id), updatedContent)
176
347
  }
177
- }
178
348
 
179
- this.log.info('Memory updated', { 'namzu.memory.id': id })
180
- return updated
349
+ const entries = this.index.allEntries().map((entry) => (entry.id === id ? updated : entry))
350
+ await this.writeIndex(location, entries)
351
+ this.index.rebuild([...entries])
352
+
353
+ this.log.info('Memory updated', { 'namzu.memory.id': id })
354
+ return updated
355
+ })
181
356
  }
182
357
 
183
358
  async delete(id: MemoryId): Promise<boolean> {
184
- await this.ensureInit()
359
+ return this.withAuthoritativeIndex(async (location) => {
360
+ assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
361
+ if (!this.index.getEntry(id)) return false
185
362
 
186
- const existed = this.index.remove(id)
187
- if (!existed) return false
188
-
189
- await this.persistIndex()
190
- await unlink(this.contentPath(id)).catch(() => undefined)
363
+ try {
364
+ await unlink(this.contentPath(location, id))
365
+ } catch (error) {
366
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error
367
+ }
368
+ const entries = this.index.allEntries().filter((entry) => entry.id !== id)
369
+ await this.writeIndex(location, entries)
370
+ this.index.rebuild([...entries])
191
371
 
192
- this.log.info('Memory deleted', { 'namzu.memory.id': id })
193
- return true
372
+ this.log.info('Memory deleted', { 'namzu.memory.id': id })
373
+ return true
374
+ })
194
375
  }
195
376
 
196
377
  async list(params?: MemorySearchParams): Promise<MemorySearchResult> {
197
- await this.ensureInit()
198
- return this.index.search(params ?? {})
378
+ return this.withAuthoritativeIndex(async () => this.index.search(params ?? {}))
199
379
  }
200
380
 
201
381
  getIndex(): InMemoryMemoryIndex {
202
382
  return this.index
203
383
  }
204
-
205
- private async persistIndex(): Promise<void> {
206
- const entries = this.index.allEntries()
207
- await this.indexRecords.write(this.indexPath, entries)
208
- }
209
384
  }
@@ -1,6 +1,7 @@
1
1
  import { appendFile, mkdir, readFile, readdir, unlink } from 'node:fs/promises'
2
2
  import { join } from 'node:path'
3
3
  import type { CheckpointId, IterationCheckpoint } from '../../types/hitl/index.js'
4
+ import type { Message } from '../../types/message/index.js'
4
5
  import type {
5
6
  AuditEvent,
6
7
  PersistedRunEvent,
@@ -8,7 +9,12 @@ import type {
8
9
  RunEvent,
9
10
  RunStoreConfig,
10
11
  } from '../../types/run/index.js'
11
- import type { CompletedToolRecord, ReadRunEventsOptions, RunStore } from '../../types/run/store.js'
12
+ import type {
13
+ CompletedToolRecord,
14
+ ReadRunEventsOptions,
15
+ RunMessageSnapshot,
16
+ RunStore,
17
+ } from '../../types/run/store.js'
12
18
  import { atomicWriteFile } from '../../utils/atomic-write.js'
13
19
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
14
20
  import { type Logger, resolveLogger } from '../../utils/logger.js'
@@ -79,6 +85,10 @@ export class RunDiskStore implements RunStore {
79
85
  return readRunEventsIn(this.requireInit(), options)
80
86
  }
81
87
 
88
+ async readMessages(): Promise<RunMessageSnapshot> {
89
+ return readRunMessagesIn(this.requireInit())
90
+ }
91
+
82
92
  async appendAuditEvent(event: AuditEvent): Promise<void> {
83
93
  const dir = this.requireInit()
84
94
  // One JSON object per line, exactly like `transcript.jsonl` — but its
@@ -204,9 +214,13 @@ export class RunDiskStore implements RunStore {
204
214
  await atomicWriteJson(join(dir, 'run.json'), meta)
205
215
  }
206
216
 
207
- async writeMessages(run: Run): Promise<void> {
217
+ async writeMessages(run: Run, throughEventSeq: number): Promise<void> {
208
218
  const dir = this.requireInit()
209
- await atomicWriteJson(join(dir, 'messages.json'), run.messages)
219
+ await atomicWriteJson(join(dir, 'messages.json'), {
220
+ format: 'namzu.run-message-snapshot.v1',
221
+ throughEventSeq,
222
+ messages: run.messages,
223
+ })
210
224
  }
211
225
 
212
226
  async writeReport(content: string): Promise<string> {
@@ -389,8 +403,15 @@ export async function readRunEventsIn(
389
403
  }
390
404
 
391
405
  const sinceSeq = options?.sinceSeq ?? 0
406
+ const strict = options?.integrity === 'strict'
407
+ if (strict && raw.length > 0 && !raw.endsWith('\n')) {
408
+ throw new Error(
409
+ `Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: final record is not newline-terminated`,
410
+ )
411
+ }
392
412
  const events: PersistedRunEvent[] = []
393
413
  let position = 0
414
+ let previousSeq = 0
394
415
 
395
416
  for (const line of raw.split('\n')) {
396
417
  if (line.length === 0) continue
@@ -399,12 +420,31 @@ export async function readRunEventsIn(
399
420
  let parsed: Record<string, unknown>
400
421
  try {
401
422
  parsed = JSON.parse(line) as Record<string, unknown>
402
- } catch {
423
+ } catch (error) {
424
+ if (strict) {
425
+ throw new Error(
426
+ `Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} is not valid JSON`,
427
+ { cause: error },
428
+ )
429
+ }
430
+ continue
431
+ }
432
+ if (parsed === null || typeof parsed !== 'object' || typeof parsed.type !== 'string') {
433
+ if (strict) {
434
+ throw new Error(
435
+ `Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} is not an event object`,
436
+ )
437
+ }
403
438
  continue
404
439
  }
405
- if (parsed === null || typeof parsed !== 'object' || typeof parsed.type !== 'string') continue
406
440
 
407
441
  const seq = typeof parsed.seq === 'number' ? parsed.seq : position
442
+ if (strict && (!Number.isSafeInteger(seq) || seq <= 0 || seq !== previousSeq + 1)) {
443
+ throw new Error(
444
+ `Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} has sequence ${String(seq)}, expected ${previousSeq + 1}`,
445
+ )
446
+ }
447
+ previousSeq = seq
408
448
  if (seq <= sinceSeq) continue
409
449
 
410
450
  events.push({
@@ -421,6 +461,57 @@ export async function readRunEventsIn(
421
461
  return events
422
462
  }
423
463
 
464
+ /**
465
+ * Read a run's surviving message snapshot without binding a store to it.
466
+ *
467
+ * Binding a {@link RunDiskStore} creates the directory, which would turn a
468
+ * missing run into an apparently empty one. This helper performs no writes.
469
+ */
470
+ export async function readRunMessagesIn(runDir: string): Promise<RunMessageSnapshot> {
471
+ let raw: string
472
+ try {
473
+ raw = await readFile(join(runDir, 'messages.json'), 'utf-8')
474
+ } catch (err) {
475
+ if (isFileNotFound(err)) return { kind: 'unavailable', reason: 'not-persisted' }
476
+ throw err
477
+ }
478
+
479
+ let parsed: unknown
480
+ try {
481
+ parsed = JSON.parse(raw)
482
+ } catch {
483
+ throw new Error(
484
+ `Invalid run message snapshot in ${join(runDir, 'messages.json')}: invalid JSON`,
485
+ )
486
+ }
487
+
488
+ // The pre-boundary format was the message array itself. Preserve access to
489
+ // those bytes, but do not manufacture the event-log boundary it never held.
490
+ if (Array.isArray(parsed)) {
491
+ return { kind: 'legacy-unverified', messages: parsed as Message[] }
492
+ }
493
+
494
+ if (
495
+ parsed === null ||
496
+ typeof parsed !== 'object' ||
497
+ (parsed as Record<string, unknown>).format !== 'namzu.run-message-snapshot.v1' ||
498
+ typeof (parsed as Record<string, unknown>).throughEventSeq !== 'number' ||
499
+ !Number.isSafeInteger((parsed as Record<string, unknown>).throughEventSeq) ||
500
+ ((parsed as Record<string, unknown>).throughEventSeq as number) < 0 ||
501
+ !Array.isArray((parsed as Record<string, unknown>).messages)
502
+ ) {
503
+ throw new Error(
504
+ `Invalid run message snapshot in ${join(runDir, 'messages.json')}: expected a versioned snapshot`,
505
+ )
506
+ }
507
+
508
+ return {
509
+ kind: 'available',
510
+ throughEventSeq: (parsed as Record<string, unknown>).throughEventSeq as number,
511
+ messages: (parsed as Record<string, unknown>).messages as Message[],
512
+ }
513
+ }
514
+
424
515
  /**
425
516
  * Terminate a transcript whose last line was cut off mid-write.
426
517
  *