@namzu/sdk 30.2.0 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (712) hide show
  1. package/CHANGELOG.md +556 -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 +75 -10
  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/interface.d.ts +18 -7
  496. package/dist/types/provider/interface.d.ts.map +1 -1
  497. package/dist/types/provider/stream.d.ts +6 -0
  498. package/dist/types/provider/stream.d.ts.map +1 -1
  499. package/dist/types/rag/embedding.d.ts +15 -2
  500. package/dist/types/rag/embedding.d.ts.map +1 -1
  501. package/dist/types/rag/ingestion.d.ts +2 -2
  502. package/dist/types/rag/ingestion.d.ts.map +1 -1
  503. package/dist/types/rag/knowledge-base.d.ts +3 -3
  504. package/dist/types/rag/knowledge-base.d.ts.map +1 -1
  505. package/dist/types/rag/retrieval.d.ts +2 -2
  506. package/dist/types/rag/retrieval.d.ts.map +1 -1
  507. package/dist/types/rag/scope.d.ts +4 -0
  508. package/dist/types/rag/scope.d.ts.map +1 -1
  509. package/dist/types/rag/vector.d.ts +5 -2
  510. package/dist/types/rag/vector.d.ts.map +1 -1
  511. package/dist/types/run/config.d.ts +20 -0
  512. package/dist/types/run/config.d.ts.map +1 -1
  513. package/dist/types/run/events.d.ts +25 -1
  514. package/dist/types/run/events.d.ts.map +1 -1
  515. package/dist/types/run/events.js.map +1 -1
  516. package/dist/types/run/metadata.d.ts +2 -0
  517. package/dist/types/run/metadata.d.ts.map +1 -1
  518. package/dist/types/run/step.d.ts +2 -6
  519. package/dist/types/run/step.d.ts.map +1 -1
  520. package/dist/types/run/step.js.map +1 -1
  521. package/dist/types/run/store.d.ts +55 -2
  522. package/dist/types/run/store.d.ts.map +1 -1
  523. package/dist/types/sandbox/index.d.ts +47 -6
  524. package/dist/types/sandbox/index.d.ts.map +1 -1
  525. package/dist/types/sandbox/index.js +23 -10
  526. package/dist/types/sandbox/index.js.map +1 -1
  527. package/dist/types/session/store.d.ts +13 -0
  528. package/dist/types/session/store.d.ts.map +1 -1
  529. package/dist/types/tool/index.d.ts +33 -11
  530. package/dist/types/tool/index.d.ts.map +1 -1
  531. package/dist/types/tool/index.js.map +1 -1
  532. package/dist/types/topic/entity.d.ts +3 -4
  533. package/dist/types/topic/entity.d.ts.map +1 -1
  534. package/dist/types/topic/store.d.ts +3 -3
  535. package/dist/utils/id.d.ts +3 -1
  536. package/dist/utils/id.d.ts.map +1 -1
  537. package/dist/utils/id.js +4 -0
  538. package/dist/utils/id.js.map +1 -1
  539. package/dist/utils/process-environment.d.ts +26 -0
  540. package/dist/utils/process-environment.d.ts.map +1 -0
  541. package/dist/utils/process-environment.js +78 -0
  542. package/dist/utils/process-environment.js.map +1 -0
  543. package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
  544. package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
  545. package/dist/vault/InMemoryCredentialVault.js +24 -4
  546. package/dist/vault/InMemoryCredentialVault.js.map +1 -1
  547. package/dist/vault/instrumentation.d.ts.map +1 -1
  548. package/dist/vault/instrumentation.js +15 -0
  549. package/dist/vault/instrumentation.js.map +1 -1
  550. package/package.json +1 -1
  551. package/src/advisory/executor.ts +4 -1
  552. package/src/agents/ReactiveAgent.ts +12 -0
  553. package/src/agents/RouterAgent.ts +25 -3
  554. package/src/agents/SupervisorAgent.ts +33 -11
  555. package/src/agents/runAgent.ts +38 -2
  556. package/src/authorization/command-line.ts +390 -0
  557. package/src/authorization/rules.ts +22 -1
  558. package/src/bridge/a2a/client.ts +384 -97
  559. package/src/bridge/a2a/mapper.ts +5 -0
  560. package/src/bridge/acp/server.ts +184 -42
  561. package/src/bridge/mcp/connector/adapter.ts +28 -20
  562. package/src/bridge/sse/mapper.ts +3 -0
  563. package/src/compaction/dangling.ts +203 -38
  564. package/src/compaction/index.ts +9 -2
  565. package/src/compaction/manual.ts +125 -18
  566. package/src/compaction/plan.ts +42 -11
  567. package/src/compaction/retention.ts +23 -8
  568. package/src/compaction/summary.ts +4 -4
  569. package/src/compaction/verifier.ts +66 -0
  570. package/src/connector/BaseConnector.ts +19 -4
  571. package/src/connector/builtins/http.ts +236 -46
  572. package/src/connector/builtins/webhook.ts +207 -47
  573. package/src/connector/execution-contract.ts +27 -0
  574. package/src/connector/http-operation.ts +238 -0
  575. package/src/connector/mcp/adapter.ts +8 -3
  576. package/src/connector/mcp/client.ts +207 -58
  577. package/src/connector/mcp/http-sse.ts +91 -23
  578. package/src/connector/mcp/prompt-adapter.ts +8 -2
  579. package/src/connector/mcp/stdio.ts +21 -46
  580. package/src/connector/mcp/streamable-http.ts +86 -22
  581. package/src/connector/tools/adapter.ts +23 -14
  582. package/src/connector/tools/definitions.ts +5 -2
  583. package/src/connector/tools/result.ts +21 -0
  584. package/src/connector/web/guarded-fetch.ts +188 -48
  585. package/src/constants/sandbox/index.ts +3 -2
  586. package/src/contracts/api.ts +2 -0
  587. package/src/contracts/schemas.ts +7 -0
  588. package/src/directory/derive-supervisor.ts +8 -0
  589. package/src/directory/derive.ts +8 -0
  590. package/src/directory/load.ts +2 -0
  591. package/src/directory/types.ts +4 -0
  592. package/src/eval/experiment.ts +160 -111
  593. package/src/eval/judge.ts +13 -2
  594. package/src/eval/types.ts +7 -1
  595. package/src/manager/agent/lifecycle.ts +28 -12
  596. package/src/manager/connector/environment.ts +3 -1
  597. package/src/manager/connector/lifecycle.ts +364 -24
  598. package/src/manager/connector/tenant.ts +56 -23
  599. package/src/manager/goal/activation.ts +52 -0
  600. package/src/manager/index.ts +10 -2
  601. package/src/manager/run/persistence.ts +6 -1
  602. package/src/manager/topic/dependency.ts +39 -0
  603. package/src/manager/topic/lifecycle.ts +19 -31
  604. package/src/plugin/index.ts +1 -0
  605. package/src/plugin/lifecycle.ts +180 -39
  606. package/src/plugin/loader.ts +70 -13
  607. package/src/provider/collect-chat-completion.ts +3 -0
  608. package/src/provider/fallback.ts +79 -11
  609. package/src/provider/idle-timeout.ts +143 -17
  610. package/src/provider/index.ts +2 -0
  611. package/src/provider/instrumentation.ts +1 -0
  612. package/src/provider/retry.ts +16 -1
  613. package/src/public-runtime.ts +190 -32
  614. package/src/public-tools.ts +5 -0
  615. package/src/public-types.ts +85 -11
  616. package/src/rag/embedding.ts +147 -19
  617. package/src/rag/index.ts +1 -1
  618. package/src/rag/ingestion.ts +16 -2
  619. package/src/rag/knowledge-base.ts +13 -4
  620. package/src/rag/operation.ts +28 -0
  621. package/src/rag/rag-tool.ts +6 -3
  622. package/src/rag/retriever.ts +62 -11
  623. package/src/rag/vector-store.ts +8 -2
  624. package/src/registry/command/kernel-commands.ts +223 -4
  625. package/src/run/reporter.ts +10 -0
  626. package/src/run-query/index.ts +84 -15
  627. package/src/runtime/query/context.ts +13 -3
  628. package/src/runtime/query/executor.ts +90 -17
  629. package/src/runtime/query/guard.ts +12 -0
  630. package/src/runtime/query/index.ts +652 -103
  631. package/src/runtime/query/iteration/index.ts +89 -13
  632. package/src/runtime/query/iteration/phases/compaction.ts +120 -55
  633. package/src/runtime/query/iteration/phases/context.ts +4 -0
  634. package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
  635. package/src/runtime/query/iteration/stream-turn.ts +3 -0
  636. package/src/runtime/query/project-instructions.ts +212 -0
  637. package/src/runtime/query/request-rich-content.ts +153 -0
  638. package/src/runtime/query/result.ts +12 -1
  639. package/src/runtime/query/resume-pending.ts +20 -18
  640. package/src/runtime/query/resume-run.ts +52 -8
  641. package/src/runtime/query/run-state.ts +11 -1
  642. package/src/runtime/query/sandbox-lifecycle.ts +210 -0
  643. package/src/sandbox/isolation.ts +9 -0
  644. package/src/sandbox/provider/local.ts +255 -90
  645. package/src/sandbox/terminal.ts +13 -5
  646. package/src/session/errors.ts +68 -42
  647. package/src/session/handoff/broadcast.ts +20 -14
  648. package/src/session/handoff/single.ts +14 -13
  649. package/src/store/attachment/index.ts +65 -3
  650. package/src/store/feedback/conformance.ts +39 -0
  651. package/src/store/feedback/disk.ts +128 -82
  652. package/src/store/goal/index.ts +594 -0
  653. package/src/store/index.ts +1 -1
  654. package/src/store/kv/revision-record-store.ts +346 -0
  655. package/src/store/memory/disk.ts +288 -113
  656. package/src/store/run/disk.ts +96 -5
  657. package/src/store/run/memory.ts +22 -2
  658. package/src/store/session/disk.ts +93 -6
  659. package/src/store/session/memory.ts +22 -0
  660. package/src/store/topic/memory.ts +4 -5
  661. package/src/store/topic/objective.ts +215 -100
  662. package/src/store/topic/state.ts +100 -63
  663. package/src/tools/builtins/bash.ts +21 -0
  664. package/src/tools/builtins/computer-use.ts +9 -1
  665. package/src/tools/builtins/content-fingerprint.ts +9 -12
  666. package/src/tools/builtins/edit.ts +190 -27
  667. package/src/tools/builtins/write-file.ts +55 -19
  668. package/src/tools/command-arguments.ts +54 -0
  669. package/src/tools/coordinator/index.ts +4 -1
  670. package/src/tools/defineTool.ts +11 -0
  671. package/src/tools/env-scrub.ts +7 -5
  672. package/src/tools/goal/index.ts +129 -0
  673. package/src/tools/memory/index.ts +26 -3
  674. package/src/tools/memory/search.ts +20 -3
  675. package/src/types/agent/base.ts +12 -3
  676. package/src/types/agent/factory.ts +2 -0
  677. package/src/types/agent/reactive.ts +2 -0
  678. package/src/types/agent/supervisor.ts +6 -0
  679. package/src/types/agent/task.ts +6 -2
  680. package/src/types/connector/core.ts +13 -8
  681. package/src/types/connector/definition.ts +54 -20
  682. package/src/types/connector/http.ts +7 -0
  683. package/src/types/connector/mcp.ts +27 -6
  684. package/src/types/connector/tenant.ts +21 -7
  685. package/src/types/connector/webhook.ts +7 -0
  686. package/src/types/goal/index.ts +50 -0
  687. package/src/types/ids/index.ts +2 -0
  688. package/src/types/message/index.ts +143 -9
  689. package/src/types/plugin/index.ts +7 -5
  690. package/src/types/provider/chat.ts +35 -4
  691. package/src/types/provider/interface.ts +22 -7
  692. package/src/types/provider/stream.ts +6 -0
  693. package/src/types/rag/embedding.ts +16 -2
  694. package/src/types/rag/ingestion.ts +2 -1
  695. package/src/types/rag/knowledge-base.ts +7 -3
  696. package/src/types/rag/retrieval.ts +2 -1
  697. package/src/types/rag/scope.ts +5 -0
  698. package/src/types/rag/vector.ts +5 -2
  699. package/src/types/run/config.ts +20 -0
  700. package/src/types/run/events.ts +28 -3
  701. package/src/types/run/metadata.ts +2 -0
  702. package/src/types/run/step.ts +2 -7
  703. package/src/types/run/store.ts +60 -2
  704. package/src/types/sandbox/index.ts +57 -14
  705. package/src/types/session/store.ts +18 -0
  706. package/src/types/tool/index.ts +33 -11
  707. package/src/types/topic/entity.ts +3 -4
  708. package/src/types/topic/store.ts +3 -3
  709. package/src/utils/id.ts +6 -0
  710. package/src/utils/process-environment.ts +101 -0
  711. package/src/vault/InMemoryCredentialVault.ts +29 -4
  712. package/src/vault/instrumentation.ts +24 -0
@@ -9,6 +9,7 @@ import type {
9
9
  MCPLifecycleEvent,
10
10
  MCPPromptDefinition,
11
11
  MCPPromptMessage,
12
+ MCPRequestOptions,
12
13
  MCPResource,
13
14
  MCPResourceTemplate,
14
15
  MCPServerCapabilities,
@@ -23,6 +24,7 @@ import { generateMCPClientId } from '../../utils/id.js'
23
24
  import type { LogAttributes } from '../../utils/log/index.js'
24
25
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
25
26
  import { type Logger, resolveLogger } from '../../utils/logger.js'
27
+ import { validateConnectorTimeoutMs } from '../http-operation.js'
26
28
  import { HttpSseTransport } from './http-sse.js'
27
29
  import { StdioTransport } from './stdio.js'
28
30
  import { StreamableHttpTransport } from './streamable-http.js'
@@ -39,6 +41,9 @@ import { VERSION } from '../../version.js'
39
41
  /** Runaway guard for a server whose cursor never ends. */
40
42
  const MAX_LIST_PAGES = 100
41
43
 
44
+ /** A cancellation notification must never become the next unbounded wait. */
45
+ const CANCEL_NOTIFICATION_TIMEOUT_MS = 1_000
46
+
42
47
  const NAMZU_CLIENT_INFO = { name: 'namzu-sdk', version: VERSION }
43
48
 
44
49
  export class MCPClient {
@@ -53,18 +58,26 @@ export class MCPClient {
53
58
  string | number,
54
59
  {
55
60
  resolve: (value: unknown) => void
56
- reject: (reason: Error) => void
61
+ reject: (reason: unknown) => void
62
+ abort: (reason: unknown) => void
57
63
  }
58
64
  >()
59
65
  private nextRequestId = 1
60
66
  private notificationHandlers: Array<(method: string, params?: Record<string, unknown>) => void> =
61
67
  []
62
68
  private lifecycleListeners: MCPEventListener[] = []
69
+ /** Best-effort protocol cancellations still belong to this connection generation. */
70
+ private cancellationControllers = new Set<AbortController>()
63
71
  private log: Logger
64
72
  private readonly config: MCPClientConfig
73
+ private readonly requestTimeoutMs: number
65
74
 
66
75
  constructor(config: MCPClientConfig) {
67
76
  this.config = config
77
+ this.requestTimeoutMs = validateConnectorTimeoutMs(
78
+ config.requestTimeoutMs ?? DEFAULT_MCP_REQUEST_TIMEOUT_MS,
79
+ 'MCPClient requestTimeoutMs',
80
+ )
68
81
  this.id = config.id ?? generateMCPClientId()
69
82
  // Built BEFORE the transport, not after: `createTransport` threads
70
83
  // `this.log` into whichever transport it constructs (LOG-10), so the
@@ -87,12 +100,14 @@ export class MCPClient {
87
100
  this.transport.onMessage((msg) => this.handleMessage(msg))
88
101
  this.transport.onClose(() => {
89
102
  this.status = 'disconnected'
103
+ this.abortCancellations(new Error('MCP transport closed'))
90
104
  this.log.info('MCP transport closed')
91
105
  this.emitLifecycle({ type: 'mcp_client_disconnected', clientId: this.id })
92
106
  this.rejectAllPending(`MCP transport to "${this.config.serverName}" closed`)
93
107
  })
94
108
  this.transport.onError((err) => {
95
109
  this.status = 'error'
110
+ this.abortCancellations(err)
96
111
  this.error = err.message
97
112
  this.log.error('MCP transport error', { 'exception.message': err.message })
98
113
  this.emitLifecycle({ type: 'mcp_client_error', clientId: this.id, error: err.message })
@@ -153,6 +168,8 @@ export class MCPClient {
153
168
  }
154
169
 
155
170
  async disconnect(): Promise<void> {
171
+ const reason = new Error('MCPClient disconnecting')
172
+ this.abortCancellations(reason)
156
173
  if (this.status === 'disconnected') return
157
174
 
158
175
  this.rejectAllPending('MCPClient disconnecting')
@@ -180,28 +197,36 @@ export class MCPClient {
180
197
  }
181
198
  }
182
199
 
183
- async listTools(): Promise<MCPToolDefinition[]> {
200
+ async listTools(options?: MCPRequestOptions): Promise<MCPToolDefinition[]> {
184
201
  this.requireConnected()
185
- return await this.listAllPages('tools/list', 'tools')
202
+ return await this.listAllPages('tools/list', 'tools', options)
186
203
  }
187
204
 
188
- async callTool(name: string, args?: Record<string, unknown>): Promise<MCPToolResult> {
205
+ async callTool(
206
+ name: string,
207
+ args?: Record<string, unknown>,
208
+ options?: MCPRequestOptions,
209
+ ): Promise<MCPToolResult> {
189
210
  this.requireConnected()
190
- const result = (await this.request('tools/call', {
191
- name,
192
- arguments: args ?? {},
193
- })) as MCPToolResult
211
+ const result = (await this.request(
212
+ 'tools/call',
213
+ {
214
+ name,
215
+ arguments: args ?? {},
216
+ },
217
+ options,
218
+ )) as MCPToolResult
194
219
  return result
195
220
  }
196
221
 
197
- async listResources(): Promise<MCPResource[]> {
222
+ async listResources(options?: MCPRequestOptions): Promise<MCPResource[]> {
198
223
  this.requireConnected()
199
- return await this.listAllPages('resources/list', 'resources')
224
+ return await this.listAllPages('resources/list', 'resources', options)
200
225
  }
201
226
 
202
- async readResource(uri: string): Promise<MCPContentBlock[]> {
227
+ async readResource(uri: string, options?: MCPRequestOptions): Promise<MCPContentBlock[]> {
203
228
  this.requireConnected()
204
- const result = (await this.request('resources/read', { uri })) as {
229
+ const result = (await this.request('resources/read', { uri }, options)) as {
205
230
  contents: MCPContentBlock[]
206
231
  }
207
232
  return result.contents
@@ -220,9 +245,9 @@ export class MCPClient {
220
245
  * of it being generic: a server that pages its prompts does not get
221
246
  * silently truncated to page one the way the tool list once was.
222
247
  */
223
- async listPrompts(): Promise<MCPPromptDefinition[]> {
248
+ async listPrompts(options?: MCPRequestOptions): Promise<MCPPromptDefinition[]> {
224
249
  this.requireConnected()
225
- return await this.listAllPages('prompts/list', 'prompts')
250
+ return await this.listAllPages('prompts/list', 'prompts', options)
226
251
  }
227
252
 
228
253
  /**
@@ -237,21 +262,26 @@ export class MCPClient {
237
262
  async getPrompt(
238
263
  name: string,
239
264
  args?: Record<string, string>,
265
+ options?: MCPRequestOptions,
240
266
  ): Promise<{ description?: string; messages: MCPPromptMessage[] }> {
241
267
  this.requireConnected()
242
- const result = (await this.request('prompts/get', {
243
- name,
244
- arguments: args ?? {},
245
- })) as { description?: string; messages?: MCPPromptMessage[] }
268
+ const result = (await this.request(
269
+ 'prompts/get',
270
+ {
271
+ name,
272
+ arguments: args ?? {},
273
+ },
274
+ options,
275
+ )) as { description?: string; messages?: MCPPromptMessage[] }
246
276
  return {
247
277
  ...(result.description !== undefined ? { description: result.description } : {}),
248
278
  messages: result.messages ?? [],
249
279
  }
250
280
  }
251
281
 
252
- async listResourceTemplates(): Promise<MCPResourceTemplate[]> {
282
+ async listResourceTemplates(options?: MCPRequestOptions): Promise<MCPResourceTemplate[]> {
253
283
  this.requireConnected()
254
- return await this.listAllPages('resources/templates/list', 'resourceTemplates')
284
+ return await this.listAllPages('resources/templates/list', 'resourceTemplates', options)
255
285
  }
256
286
 
257
287
  /**
@@ -271,15 +301,20 @@ export class MCPClient {
271
301
  * until the process dies. Hitting it is loud, because a silently
272
302
  * truncated catalogue is the failure being fixed here.
273
303
  */
274
- private async listAllPages<T>(method: string, field: string): Promise<T[]> {
304
+ private async listAllPages<T>(
305
+ method: string,
306
+ field: string,
307
+ options?: MCPRequestOptions,
308
+ ): Promise<T[]> {
275
309
  const items: T[] = []
276
310
  let cursor: string | undefined
277
311
 
278
312
  for (let page = 1; ; page++) {
279
- const result = (await this.request(method, cursor === undefined ? {} : { cursor })) as Record<
280
- string,
281
- unknown
282
- >
313
+ const result = (await this.request(
314
+ method,
315
+ cursor === undefined ? {} : { cursor },
316
+ options,
317
+ )) as Record<string, unknown>
283
318
 
284
319
  const batch = result[field]
285
320
  if (Array.isArray(batch)) items.push(...(batch as T[]))
@@ -364,7 +399,13 @@ export class MCPClient {
364
399
  * server hung the whole run with no error and no `run_failed`: not a
365
400
  * crash, just a process that stopped.
366
401
  */
367
- private async request(method: string, params: Record<string, unknown>): Promise<unknown> {
402
+ private request(
403
+ method: string,
404
+ params: Record<string, unknown>,
405
+ options?: MCPRequestOptions,
406
+ ): Promise<unknown> {
407
+ // Refuse before allocating an id or asking the transport to do work.
408
+ options?.signal?.throwIfAborted()
368
409
  const id = this.nextRequestId++
369
410
  const message: MCPJsonRpcMessage = {
370
411
  jsonrpc: '2.0',
@@ -372,40 +413,150 @@ export class MCPClient {
372
413
  method,
373
414
  params,
374
415
  }
375
- const timeoutMs = this.config.requestTimeoutMs ?? DEFAULT_MCP_REQUEST_TIMEOUT_MS
376
-
377
- return new Promise<unknown>((resolve, reject) => {
378
- const timer = setTimeout(() => {
379
- this.pendingRequests.delete(id)
380
- this.log.warn('MCP request timed out', {
381
- 'namzu.connector.server': this.config.serverName,
382
- 'namzu.connector.method': method,
383
- 'namzu.connector.timeout_ms': timeoutMs,
384
- })
385
- reject(
386
- new Error(
387
- `MCP request "${method}" to "${this.config.serverName}" timed out after ${timeoutMs}ms`,
388
- ),
416
+ const transportController = new AbortController()
417
+ let issued = false
418
+ let settled = false
419
+ let resolvePublic!: (value: unknown) => void
420
+ let rejectPublic!: (reason: unknown) => void
421
+ const result = new Promise<unknown>((resolve, reject) => {
422
+ resolvePublic = resolve
423
+ rejectPublic = reject
424
+ })
425
+
426
+ type Terminal = 'response' | 'failure' | 'caller' | 'timeout' | 'transport_closed'
427
+ const entry = {
428
+ resolve: (value: unknown) => settle('response', value),
429
+ reject: (reason: unknown) => settle('failure', reason),
430
+ abort: (reason: unknown) => settle('transport_closed', reason),
431
+ }
432
+ const onCallerAbort = (): void => {
433
+ settle('caller', options?.signal?.reason)
434
+ }
435
+ const cleanup = (): void => {
436
+ clearTimeout(timer)
437
+ options?.signal?.removeEventListener('abort', onCallerAbort)
438
+ if (this.pendingRequests.get(id) === entry) this.pendingRequests.delete(id)
439
+ }
440
+ const settle = (terminal: Terminal, value: unknown): boolean => {
441
+ if (settled) return false
442
+ settled = true
443
+ // The terminal winner owns cleanup synchronously. In particular, a
444
+ // response delivered from inside transport.send removes the abort
445
+ // listener before that same send call can observe a later abort.
446
+ cleanup()
447
+
448
+ if (terminal === 'response') {
449
+ resolvePublic(value)
450
+ return true
451
+ }
452
+
453
+ rejectPublic(value)
454
+ if (terminal === 'caller' || terminal === 'timeout' || terminal === 'transport_closed') {
455
+ // Latch public settlement before aborting transport. An abort listener
456
+ // may synchronously reject send() with a generic AbortError; it no
457
+ // longer owns this request and cannot replace the first cause.
458
+ transportController.abort(value)
459
+ }
460
+ if (issued && method !== 'initialize' && (terminal === 'caller' || terminal === 'timeout')) {
461
+ this.sendCancellation(
462
+ id,
463
+ terminal === 'caller' ? 'Caller cancelled request' : 'Request deadline expired',
389
464
  )
390
- }, timeoutMs)
465
+ }
466
+ return true
467
+ }
468
+ const settleSendFailure = (reason: unknown): void => {
469
+ // An HTTP transport may have a deliberately shorter deadline than
470
+ // the JSON-RPC round-trip deadline. It is still a request timeout:
471
+ // the peer may be working after this local POST wait ended, so the
472
+ // correlated protocol cancellation remains required.
473
+ if (reason instanceof Error && reason.name === 'TimeoutError') {
474
+ settle('timeout', reason)
475
+ return
476
+ }
477
+ entry.reject(reason)
478
+ }
391
479
 
392
- this.pendingRequests.set(id, {
393
- resolve: (value) => {
394
- clearTimeout(timer)
395
- resolve(value)
396
- },
397
- reject: (err) => {
398
- clearTimeout(timer)
399
- reject(err)
400
- },
480
+ this.pendingRequests.set(id, entry)
481
+ const timer = setTimeout(() => {
482
+ const error = new Error(
483
+ `MCP request "${method}" to "${this.config.serverName}" timed out after ${this.requestTimeoutMs}ms`,
484
+ )
485
+ error.name = 'TimeoutError'
486
+ this.log.warn('MCP request timed out', {
487
+ 'namzu.connector.server': this.config.serverName,
488
+ 'namzu.connector.method': method,
489
+ 'namzu.connector.timeout_ms': this.requestTimeoutMs,
490
+ })
491
+ settle('timeout', error)
492
+ }, this.requestTimeoutMs)
493
+ options?.signal?.addEventListener('abort', onCallerAbort, { once: true })
494
+ // AbortSignal events are not replayed. This closes the listener-install
495
+ // race before the request is issued.
496
+ if (options?.signal?.aborted) {
497
+ onCallerAbort()
498
+ return result
499
+ }
500
+
501
+ try {
502
+ issued = true
503
+ const sending = this.transport.send(message, {
504
+ signal: transportController.signal,
401
505
  })
506
+ void sending.catch((err) => {
507
+ settleSendFailure(err)
508
+ })
509
+ } catch (err) {
510
+ settleSendFailure(err)
511
+ }
402
512
 
403
- this.transport.send(message).catch((err) => {
513
+ return result
514
+ }
515
+
516
+ /** Ask the peer to stop without letting cleanup become another hanging request. */
517
+ private sendCancellation(id: string | number, reason: string): void {
518
+ const controller = new AbortController()
519
+ this.cancellationControllers.add(controller)
520
+ const timer = setTimeout(() => {
521
+ const error = new Error('MCP cancellation notification timed out')
522
+ error.name = 'TimeoutError'
523
+ controller.abort(error)
524
+ this.cancellationControllers.delete(controller)
525
+ }, CANCEL_NOTIFICATION_TIMEOUT_MS)
526
+ timer.unref?.()
527
+ let sending: Promise<void>
528
+ try {
529
+ sending = this.transport.send(
530
+ {
531
+ jsonrpc: '2.0',
532
+ method: 'notifications/cancelled',
533
+ params: { requestId: id, reason },
534
+ },
535
+ { signal: controller.signal },
536
+ )
537
+ } catch (err) {
538
+ clearTimeout(timer)
539
+ this.cancellationControllers.delete(controller)
540
+ this.log.debug('Failed to send MCP cancellation notification', {
541
+ 'exception.message': toErrorMessage(err),
542
+ })
543
+ return
544
+ }
545
+ void sending
546
+ .catch((err) => {
547
+ this.log.debug('Failed to send MCP cancellation notification', {
548
+ 'exception.message': toErrorMessage(err),
549
+ })
550
+ })
551
+ .finally(() => {
404
552
  clearTimeout(timer)
405
- this.pendingRequests.delete(id)
406
- reject(err)
553
+ this.cancellationControllers.delete(controller)
407
554
  })
408
- })
555
+ }
556
+
557
+ private abortCancellations(reason: unknown): void {
558
+ for (const controller of this.cancellationControllers) controller.abort(reason)
559
+ this.cancellationControllers.clear()
409
560
  }
410
561
 
411
562
  /**
@@ -422,10 +573,9 @@ export class MCPClient {
422
573
  'namzu.connector.count': this.pendingRequests.size,
423
574
  'namzu.connector.reason': reason,
424
575
  })
425
- for (const [, pending] of this.pendingRequests) {
426
- pending.reject(new Error(reason))
576
+ for (const pending of [...this.pendingRequests.values()]) {
577
+ pending.abort(new Error(reason))
427
578
  }
428
- this.pendingRequests.clear()
429
579
  }
430
580
 
431
581
  private async notify(method: string, params: Record<string, unknown>): Promise<void> {
@@ -441,7 +591,6 @@ export class MCPClient {
441
591
  if (message.id !== undefined) {
442
592
  const pending = this.pendingRequests.get(message.id)
443
593
  if (pending) {
444
- this.pendingRequests.delete(message.id)
445
594
  if (message.error) {
446
595
  pending.reject(new Error(`MCP error ${message.error.code}: ${message.error.message}`))
447
596
  } else {
@@ -2,9 +2,13 @@ import type {
2
2
  MCPHttpSseTransportConfig,
3
3
  MCPJsonRpcMessage,
4
4
  MCPTransport,
5
+ MCPTransportSendOptions,
5
6
  } from '../../types/connector/index.js'
6
7
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
7
8
  import { type Logger, resolveLogger } from '../../utils/logger.js'
9
+ import { ConnectorHttpOperation, validateConnectorTimeoutMs } from '../http-operation.js'
10
+
11
+ const DEFAULT_TIMEOUT_MS = 30_000
8
12
 
9
13
  /**
10
14
  * Trim trailing slashes without a regex.
@@ -27,9 +31,12 @@ export class HttpSseTransport implements MCPTransport {
27
31
  private errorHandlers: Array<(error: Error) => void> = []
28
32
  private connected = false
29
33
  private abortController: AbortController | null = null
34
+ private generation = 0
35
+ private activeSends = new Set<AbortController>()
30
36
  private sseUrl: string
31
37
  private postUrl: string
32
38
  private log: Logger
39
+ private readonly timeoutMs: number
33
40
 
34
41
  constructor(
35
42
  private readonly config: MCPHttpSseTransportConfig,
@@ -38,6 +45,10 @@ export class HttpSseTransport implements MCPTransport {
38
45
  const base = stripTrailingSlashes(config.url)
39
46
  this.sseUrl = `${base}/sse`
40
47
  this.postUrl = `${base}/message`
48
+ this.timeoutMs = validateConnectorTimeoutMs(
49
+ config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
50
+ 'HttpSseTransport timeoutMs',
51
+ )
41
52
  this.log = resolveLogger(log).child({ [SCOPE_ATTRIBUTE]: 'connector/mcp/http-sse' })
42
53
  }
43
54
 
@@ -45,13 +56,18 @@ export class HttpSseTransport implements MCPTransport {
45
56
  if (this.connected) return
46
57
 
47
58
  this.abortController = new AbortController()
48
- await this.startSSE()
59
+ const generation = ++this.generation
49
60
  this.connected = true
61
+ await this.startSSE(generation, this.abortController.signal)
50
62
  this.log.info('HttpSseTransport connected', { 'namzu.mcp.url': this.config.url })
51
63
  }
52
64
 
53
65
  async close(): Promise<void> {
54
66
  this.connected = false
67
+ this.generation++
68
+ const reason = new Error('HttpSseTransport closed')
69
+ for (const controller of this.activeSends) controller.abort(reason)
70
+ this.activeSends.clear()
55
71
  this.abortController?.abort()
56
72
  this.abortController = null
57
73
  for (const handler of this.closeHandlers) handler()
@@ -74,24 +90,30 @@ export class HttpSseTransport implements MCPTransport {
74
90
  this.errorHandlers = []
75
91
  }
76
92
 
77
- async send(message: MCPJsonRpcMessage): Promise<void> {
93
+ async send(message: MCPJsonRpcMessage, options?: MCPTransportSendOptions): Promise<void> {
78
94
  if (!this.connected) {
79
95
  throw new Error('HttpSseTransport: not connected')
80
96
  }
81
97
 
82
- const controller = new AbortController()
83
- const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs ?? 30_000)
98
+ const owned = this.beginSend(options?.signal)
99
+ const operation = new ConnectorHttpOperation(
100
+ owned.controller.signal,
101
+ this.timeoutMs,
102
+ 'HTTP-SSE MCP send',
103
+ )
84
104
 
85
105
  try {
86
- const response = await fetch(this.postUrl, {
87
- method: 'POST',
88
- headers: {
89
- 'Content-Type': 'application/json',
90
- ...this.config.headers,
91
- },
92
- body: JSON.stringify(message),
93
- signal: controller.signal,
94
- })
106
+ const response = await operation.run(() =>
107
+ fetch(this.postUrl, {
108
+ method: 'POST',
109
+ headers: {
110
+ 'Content-Type': 'application/json',
111
+ ...this.config.headers,
112
+ },
113
+ body: JSON.stringify(message),
114
+ signal: operation.signal,
115
+ }),
116
+ )
95
117
 
96
118
  if (!response.ok) {
97
119
  throw new Error(`HTTP ${response.status}: ${response.statusText}`)
@@ -99,11 +121,16 @@ export class HttpSseTransport implements MCPTransport {
99
121
 
100
122
  const contentType = response.headers.get('content-type') ?? ''
101
123
  if (contentType.includes('application/json')) {
102
- const body = (await response.json()) as MCPJsonRpcMessage
103
- for (const handler of this.messageHandlers) handler(body)
124
+ const body = (await operation.run(() => response.json())) as MCPJsonRpcMessage
125
+ this.assertCurrent(owned.generation, operation)
126
+ for (const handler of [...this.messageHandlers]) {
127
+ this.assertCurrent(owned.generation, operation)
128
+ handler(body)
129
+ }
104
130
  }
105
131
  } finally {
106
- clearTimeout(timeout)
132
+ operation.close()
133
+ owned.dispose()
107
134
  }
108
135
  }
109
136
 
@@ -123,9 +150,45 @@ export class HttpSseTransport implements MCPTransport {
123
150
  return this.connected
124
151
  }
125
152
 
126
- private async startSSE(): Promise<void> {
127
- this.listenSSE().catch((err) => {
128
- if (this.connected) {
153
+ private beginSend(signal: AbortSignal | undefined): {
154
+ readonly controller: AbortController
155
+ readonly generation: number
156
+ dispose(): void
157
+ } {
158
+ signal?.throwIfAborted()
159
+ const controller = new AbortController()
160
+ const onAbort = (): void => controller.abort(signal?.reason)
161
+ signal?.addEventListener('abort', onAbort, { once: true })
162
+ if (signal?.aborted) onAbort()
163
+ if (controller.signal.aborted) {
164
+ signal?.removeEventListener('abort', onAbort)
165
+ controller.signal.throwIfAborted()
166
+ }
167
+ this.activeSends.add(controller)
168
+ return {
169
+ controller,
170
+ generation: this.generation,
171
+ dispose: () => {
172
+ signal?.removeEventListener('abort', onAbort)
173
+ this.activeSends.delete(controller)
174
+ },
175
+ }
176
+ }
177
+
178
+ private assertCurrent(generation: number, operation: ConnectorHttpOperation): void {
179
+ operation.throwIfStopped()
180
+ if (!this.connected || generation !== this.generation) {
181
+ throw new Error('HTTP-SSE MCP response belongs to a closed connection generation')
182
+ }
183
+ }
184
+
185
+ private isCurrent(generation: number): boolean {
186
+ return this.connected && generation === this.generation
187
+ }
188
+
189
+ private async startSSE(generation: number, signal: AbortSignal): Promise<void> {
190
+ this.listenSSE(generation, signal).catch((err) => {
191
+ if (this.connected && generation === this.generation) {
129
192
  this.log.error('SSE stream error', { 'exception.message': String(err) })
130
193
  for (const handler of this.errorHandlers)
131
194
  handler(err instanceof Error ? err : new Error(String(err)))
@@ -133,13 +196,13 @@ export class HttpSseTransport implements MCPTransport {
133
196
  })
134
197
  }
135
198
 
136
- private async listenSSE(): Promise<void> {
199
+ private async listenSSE(generation: number, signal: AbortSignal): Promise<void> {
137
200
  const response = await fetch(this.sseUrl, {
138
201
  headers: {
139
202
  Accept: 'text/event-stream',
140
203
  ...this.config.headers,
141
204
  },
142
- signal: this.abortController?.signal,
205
+ signal,
143
206
  })
144
207
 
145
208
  if (!response.ok || !response.body) {
@@ -150,21 +213,26 @@ export class HttpSseTransport implements MCPTransport {
150
213
  const decoder = new TextDecoder()
151
214
  let buffer = ''
152
215
 
153
- while (this.connected) {
216
+ while (this.isCurrent(generation)) {
154
217
  const { done, value } = await reader.read()
155
218
  if (done) break
219
+ if (!this.isCurrent(generation)) break
156
220
 
157
221
  buffer += decoder.decode(value, { stream: true })
158
222
  const events = buffer.split('\n\n')
159
223
  buffer = events.pop() ?? ''
160
224
 
161
225
  for (const event of events) {
226
+ if (!this.isCurrent(generation)) return
162
227
  const dataLine = event.split('\n').find((line) => line.startsWith('data: '))
163
228
  if (!dataLine) continue
164
229
  const data = dataLine.slice(6)
165
230
  try {
166
231
  const message = JSON.parse(data) as MCPJsonRpcMessage
167
- for (const handler of this.messageHandlers) handler(message)
232
+ for (const handler of [...this.messageHandlers]) {
233
+ if (!this.isCurrent(generation)) return
234
+ handler(message)
235
+ }
168
236
  } catch {
169
237
  this.log.warn('HttpSseTransport: invalid SSE data', {
170
238
  'namzu.mcp.data_head': data.slice(0, 100),
@@ -123,10 +123,12 @@ export function mcpPromptToToolDefinition(
123
123
  isDestructive: () => false,
124
124
  isConcurrencySafe: () => true,
125
125
 
126
- async execute(input: unknown, _context: ToolContext): Promise<ToolResult> {
126
+ async execute(input: unknown, context: ToolContext): Promise<ToolResult> {
127
127
  const args = (input ?? {}) as Record<string, string>
128
128
  try {
129
- const result = await client.getPrompt(prompt.name, args)
129
+ const result = await client.getPrompt(prompt.name, args, {
130
+ signal: context.abortSignal,
131
+ })
130
132
  return {
131
133
  success: true,
132
134
  output: renderPromptMessages(
@@ -137,6 +139,10 @@ export function mcpPromptToToolDefinition(
137
139
  ),
138
140
  }
139
141
  } catch (err) {
142
+ // Cancellation belongs to the run, not to the remote prompt. Turning
143
+ // it into an ordinary failed tool result would let the executor treat
144
+ // a withdrawn operation as one the model may route around.
145
+ if (context.abortSignal?.aborted) throw context.abortSignal.reason
140
146
  // Returned to the MODEL rather than thrown. A prompt that
141
147
  // cannot be fetched — a server that went away, an argument it
142
148
  // rejected — is something the agent can work around, and