@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
@@ -2,6 +2,7 @@ import { DANGEROUS_PATTERNS } from '../constants/tools/index.js'
2
2
  import { isTrustedReadOnly } from '../tools/trusted-read-only.js'
3
3
  import type { AuthorizationRule, GateDecision } from '../types/authorization/index.js'
4
4
  import type { ToolDefinition } from '../types/tool/index.js'
5
+ import { decomposeCommandLine } from './command-line.js'
5
6
 
6
7
  export function evaluateRule(
7
8
  rule: AuthorizationRule,
@@ -105,7 +106,27 @@ export function evaluateRule(
105
106
  : undefined
106
107
  if (subject === undefined) return null
107
108
 
108
- return compiledPattern.test(subject) ? rule.decision : null
109
+ // A command line is not one string, and testing it as one is how a
110
+ // prohibition gets bypassed: `^git push` sees `git push origin main`
111
+ // and does not see `true; git push origin main`. See
112
+ // `decomposeCommandLine` for the measurement and for why the two
113
+ // decisions must read the result differently.
114
+ const { segments, opaque } = decomposeCommandLine(subject)
115
+
116
+ if (rule.decision === 'deny') {
117
+ // ANY segment. The whole subject is tested first so an
118
+ // unanchored deny keeps matching across a boundary, which
119
+ // splitting alone would have taken away.
120
+ if (compiledPattern.test(subject)) return 'deny'
121
+ return segments.some((segment) => compiledPattern.test(segment)) ? 'deny' : null
122
+ }
123
+
124
+ // EVERY segment, and nothing that hides one. Permission is a claim
125
+ // about the whole line; granting it from one matching part is what
126
+ // let `git status && rm -rf ~` through an allow rule for
127
+ // `^git status`.
128
+ if (opaque) return null
129
+ return segments.every((segment) => compiledPattern.test(segment)) ? 'allow' : null
109
130
  }
110
131
 
111
132
  case 'allow_by_tier': {
@@ -38,6 +38,14 @@ export type FetchLike = (
38
38
  text(): Promise<string>
39
39
  }>
40
40
 
41
+ export interface FetchAgentCardOptions {
42
+ readonly fetch: FetchLike
43
+ /** Cancels discovery; a pre-aborted signal starts no request. */
44
+ readonly signal?: AbortSignal
45
+ /** Whole fetch-and-body deadline. Defaults to 30 seconds; `0` opts out. */
46
+ readonly timeoutMs?: number
47
+ }
48
+
41
49
  /** A peer that answered with something that is not an agent card. */
42
50
  export class InvalidAgentCardError extends Error {
43
51
  readonly details: { url: string; reason: string }
@@ -75,6 +83,149 @@ export class A2ARequestError extends Error {
75
83
 
76
84
  const majorMinor = (version: string): string => version.split('.').slice(0, 2).join('.')
77
85
 
86
+ const MAX_TIMER_DELAY_MS = 2_147_483_647
87
+ const DEFAULT_CARD_TIMEOUT_MS = 30_000
88
+ const DEFAULT_POLL_MS = 1_000
89
+ const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000
90
+ const PEER_CANCEL_GRACE_MS = 500
91
+
92
+ function resolveTimerMs(
93
+ value: number | undefined,
94
+ fallback: number,
95
+ name: string,
96
+ allowZero: boolean,
97
+ ): number {
98
+ const resolved = value ?? fallback
99
+ const minimum = allowZero ? 0 : 1
100
+ if (!Number.isInteger(resolved) || resolved < minimum || resolved > MAX_TIMER_DELAY_MS) {
101
+ throw new RangeError(
102
+ `${name} must be an integer from ${minimum} to ${MAX_TIMER_DELAY_MS}; received ${String(resolved)}`,
103
+ )
104
+ }
105
+ return resolved
106
+ }
107
+
108
+ function timeoutError(message: string): Error {
109
+ const error = new Error(message)
110
+ error.name = 'TimeoutError'
111
+ return error
112
+ }
113
+
114
+ interface OperationCause {
115
+ readonly kind: 'caller' | 'timeout'
116
+ readonly reason: unknown
117
+ }
118
+
119
+ function taskIdOf(value: unknown): string | undefined {
120
+ if (typeof value !== 'object' || value === null || !Object.hasOwn(value, 'id')) return undefined
121
+ const id = (value as { readonly id?: unknown }).id
122
+ return typeof id === 'string' && id.length > 0 ? id : undefined
123
+ }
124
+
125
+ /** Internal control flow. Public callers receive the exact cause instead. */
126
+ class OperationInterrupted {
127
+ constructor(readonly cause: OperationCause) {}
128
+ }
129
+
130
+ interface OperationBoundary {
131
+ readonly signal: AbortSignal
132
+ wait<T>(operation: Promise<T>): Promise<T>
133
+ throwIfStopped(): void
134
+ armTransportAbort(): void
135
+ abortTransport(): void
136
+ dispose(): void
137
+ }
138
+
139
+ /**
140
+ * One caller-owned cancellation plus one kernel-owned deadline.
141
+ *
142
+ * The promise race is intentional even though the signal is forwarded. A
143
+ * host can inject `FetchLike`, and accepting an AbortSignal does not prove it
144
+ * settles when that signal fires. The race settles Namzu independently while
145
+ * keeping the losing promise observed.
146
+ */
147
+ function operationBoundary(options: {
148
+ readonly callerSignal?: AbortSignal
149
+ readonly timeoutMs: number
150
+ readonly timeoutMessage: string
151
+ readonly abortTransportInitially: boolean
152
+ }): OperationBoundary {
153
+ options.callerSignal?.throwIfAborted()
154
+
155
+ const transport = new AbortController()
156
+ let cause: OperationCause | undefined
157
+ let transportAbortArmed = options.abortTransportInitially
158
+ let resolveStopped!: (cause: OperationCause) => void
159
+ const stopped = new Promise<OperationCause>((resolve) => {
160
+ resolveStopped = resolve
161
+ })
162
+
163
+ const stop = (next: OperationCause): void => {
164
+ if (cause !== undefined) return
165
+ cause = next
166
+ // Latch and resolve BEFORE aborting the transport. A fetch implementation
167
+ // may synchronously turn transport abort into a generic AbortError; that
168
+ // fallout must not erase whether the caller or the deadline stopped us.
169
+ resolveStopped(next)
170
+ if (transportAbortArmed && !transport.signal.aborted) {
171
+ transport.abort(next.reason)
172
+ }
173
+ }
174
+
175
+ const onCallerAbort = (): void => {
176
+ stop({ kind: 'caller', reason: options.callerSignal?.reason })
177
+ }
178
+ options.callerSignal?.addEventListener('abort', onCallerAbort, { once: true })
179
+ // Abort events are not replayed. The first throw closes the ordinary
180
+ // pre-abort case; this second check closes a signal that changed while its
181
+ // listener was being installed by a non-standard implementation.
182
+ if (options.callerSignal?.aborted) onCallerAbort()
183
+
184
+ const timer =
185
+ options.timeoutMs > 0
186
+ ? setTimeout(() => {
187
+ stop({ kind: 'timeout', reason: timeoutError(options.timeoutMessage) })
188
+ }, options.timeoutMs)
189
+ : undefined
190
+
191
+ return {
192
+ signal: transport.signal,
193
+ async wait<T>(operation: Promise<T>): Promise<T> {
194
+ if (cause !== undefined) throw new OperationInterrupted(cause)
195
+ const completed = operation.then(
196
+ (value) => ({ kind: 'value' as const, value, causeAtSettlement: cause }),
197
+ (error: unknown) => ({ kind: 'error' as const, error, causeAtSettlement: cause }),
198
+ )
199
+ const winner = await Promise.race([
200
+ completed,
201
+ stopped.then((stoppedCause) => ({ kind: 'stopped' as const, cause: stoppedCause })),
202
+ ])
203
+ if (winner.kind === 'stopped') throw new OperationInterrupted(winner.cause)
204
+ // If transport.abort() made the operation reject first, the cause was
205
+ // already latched. Preserve it rather than leaking a generic AbortError.
206
+ if (winner.causeAtSettlement !== undefined) {
207
+ throw new OperationInterrupted(winner.causeAtSettlement)
208
+ }
209
+ if (winner.kind === 'error') throw winner.error
210
+ return winner.value
211
+ },
212
+ throwIfStopped(): void {
213
+ if (cause !== undefined) throw new OperationInterrupted(cause)
214
+ },
215
+ armTransportAbort(): void {
216
+ transportAbortArmed = true
217
+ if (cause !== undefined && !transport.signal.aborted) transport.abort(cause.reason)
218
+ },
219
+ abortTransport(): void {
220
+ if (!transport.signal.aborted) transport.abort(cause?.reason)
221
+ },
222
+ dispose(): void {
223
+ if (timer !== undefined) clearTimeout(timer)
224
+ options.callerSignal?.removeEventListener('abort', onCallerAbort)
225
+ },
226
+ }
227
+ }
228
+
78
229
  /**
79
230
  * Read a peer's card, and refuse one this kernel cannot honestly use.
80
231
  *
@@ -91,51 +242,74 @@ const majorMinor = (version: string): string => version.split('.').slice(0, 2).j
91
242
  */
92
243
  export async function fetchAgentCard(
93
244
  baseUrl: string,
94
- opts: { readonly fetch: FetchLike; readonly signal?: AbortSignal },
245
+ opts: FetchAgentCardOptions,
95
246
  ): Promise<A2AAgentCard> {
96
- const url = `${baseUrl.replace(/\/$/, '')}/.well-known/agent-card.json`
97
- const response = await opts.fetch(url, {
98
- method: 'GET',
99
- headers: { accept: 'application/json' },
100
- ...(opts.signal ? { signal: opts.signal } : {}),
247
+ const timeoutMs = resolveTimerMs(
248
+ opts.timeoutMs,
249
+ DEFAULT_CARD_TIMEOUT_MS,
250
+ 'fetchAgentCard timeoutMs',
251
+ true,
252
+ )
253
+ const boundary = operationBoundary({
254
+ callerSignal: opts.signal,
255
+ timeoutMs,
256
+ timeoutMessage: `A2A agent-card request timed out after ${timeoutMs}ms`,
257
+ abortTransportInitially: true,
101
258
  })
102
- if (!response.ok) {
103
- throw new InvalidAgentCardError({ url, reason: `HTTP ${response.status}` })
104
- }
105
-
106
- let body: unknown
259
+ const url = `${baseUrl.replace(/\/$/, '')}/.well-known/agent-card.json`
107
260
  try {
108
- body = await response.json()
109
- } catch (err) {
110
- throw new InvalidAgentCardError({
111
- url,
112
- reason: err instanceof Error ? err.message : 'the body is not JSON',
113
- })
114
- }
261
+ boundary.throwIfStopped()
262
+ const response = await boundary.wait(
263
+ opts.fetch(url, {
264
+ method: 'GET',
265
+ headers: { accept: 'application/json' },
266
+ signal: boundary.signal,
267
+ }),
268
+ )
269
+ if (!response.ok) {
270
+ throw new InvalidAgentCardError({ url, reason: `HTTP ${response.status}` })
271
+ }
115
272
 
116
- const card = body as Partial<A2AAgentCard>
117
- // Checked by hand rather than through a schema, because there is no
118
- // `A2AAgentCardSchema` in `contracts/a2a.ts` — the card is a type here
119
- // and not a parser. Only the fields this client actually depends on are
120
- // required; inventing requirements a peer does not owe us would refuse
121
- // working peers.
122
- if (typeof card?.name !== 'string' || !Array.isArray(card.supportedInterfaces)) {
123
- throw new InvalidAgentCardError({ url, reason: 'no name, or no supportedInterfaces' })
124
- }
125
- if (card.supportedInterfaces.length === 0) {
126
- throw new InvalidAgentCardError({ url, reason: 'supportedInterfaces is empty' })
127
- }
128
- if (
129
- card.protocolVersion &&
130
- majorMinor(card.protocolVersion) !== majorMinor(A2A_PROTOCOL_VERSION)
131
- ) {
132
- throw new A2AProtocolMismatchError({
133
- url,
134
- theirs: card.protocolVersion,
135
- ours: A2A_PROTOCOL_VERSION,
136
- })
273
+ let body: unknown
274
+ try {
275
+ body = await boundary.wait(response.json())
276
+ } catch (err) {
277
+ if (err instanceof OperationInterrupted) throw err
278
+ throw new InvalidAgentCardError({
279
+ url,
280
+ reason: err instanceof Error ? err.message : 'the body is not JSON',
281
+ })
282
+ }
283
+
284
+ const card = body as Partial<A2AAgentCard>
285
+ // Checked by hand rather than through a schema, because there is no
286
+ // `A2AAgentCardSchema` in `contracts/a2a.ts` — the card is a type here
287
+ // and not a parser. Only the fields this client actually depends on are
288
+ // required; inventing requirements a peer does not owe us would refuse
289
+ // working peers.
290
+ if (typeof card?.name !== 'string' || !Array.isArray(card.supportedInterfaces)) {
291
+ throw new InvalidAgentCardError({ url, reason: 'no name, or no supportedInterfaces' })
292
+ }
293
+ if (card.supportedInterfaces.length === 0) {
294
+ throw new InvalidAgentCardError({ url, reason: 'supportedInterfaces is empty' })
295
+ }
296
+ if (
297
+ card.protocolVersion &&
298
+ majorMinor(card.protocolVersion) !== majorMinor(A2A_PROTOCOL_VERSION)
299
+ ) {
300
+ throw new A2AProtocolMismatchError({
301
+ url,
302
+ theirs: card.protocolVersion,
303
+ ours: A2A_PROTOCOL_VERSION,
304
+ })
305
+ }
306
+ return card as A2AAgentCard
307
+ } catch (err) {
308
+ if (err instanceof OperationInterrupted) throw err.cause.reason
309
+ throw err
310
+ } finally {
311
+ boundary.dispose()
137
312
  }
138
- return card as A2AAgentCard
139
313
  }
140
314
 
141
315
  export interface A2ADelegateConfig {
@@ -147,13 +321,10 @@ export interface A2ADelegateConfig {
147
321
  readonly headers?: Readonly<Record<string, string>>
148
322
  /** How often to ask `tasks/get` while the peer is still working. */
149
323
  readonly pollIntervalMs?: number
150
- /** Give up on a delegation still running after this long. */
324
+ /** Give up on the whole delegation, including `message/send`, after this long. */
151
325
  readonly timeoutMs?: number
152
326
  }
153
327
 
154
- const DEFAULT_POLL_MS = 1_000
155
- const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000
156
-
157
328
  /**
158
329
  * States this CLIENT will stop polling on — `TERMINAL_STATES` plus
159
330
  * `input-required`, and the difference is not a widening of the same idea.
@@ -226,8 +397,17 @@ export class A2ADelegate implements Delegate {
226
397
  readonly capabilities: DelegateCapabilities
227
398
 
228
399
  private readonly endpoint: string
400
+ private readonly pollIntervalMs: number
401
+ private readonly timeoutMs: number
229
402
 
230
403
  constructor(private readonly config: A2ADelegateConfig) {
404
+ this.pollIntervalMs = resolveTimerMs(
405
+ config.pollIntervalMs,
406
+ DEFAULT_POLL_MS,
407
+ 'pollIntervalMs',
408
+ false,
409
+ )
410
+ this.timeoutMs = resolveTimerMs(config.timeoutMs, DEFAULT_TIMEOUT_MS, 'timeoutMs', false)
231
411
  this.id = config.id
232
412
  const target = config.card.supportedInterfaces.find((i) => i.transport === 'jsonrpc')
233
413
  if (!target) {
@@ -256,7 +436,7 @@ export class A2ADelegate implements Delegate {
256
436
  }
257
437
  }
258
438
 
259
- private async rpc(method: A2AMethod, params: unknown, signal?: AbortSignal): Promise<unknown> {
439
+ private async rpc(method: A2AMethod, params: unknown, signal: AbortSignal): Promise<unknown> {
260
440
  const response = await this.config.fetch(this.endpoint, {
261
441
  method: 'POST',
262
442
  headers: {
@@ -265,7 +445,7 @@ export class A2ADelegate implements Delegate {
265
445
  ...this.config.headers,
266
446
  },
267
447
  body: JSON.stringify({ jsonrpc: '2.0', id: `${method}-${this.id}`, method, params }),
268
- ...(signal ? { signal } : {}),
448
+ signal,
269
449
  })
270
450
  if (!response.ok) {
271
451
  throw new A2ARequestError(`${method} failed with HTTP ${response.status}`, {
@@ -286,9 +466,70 @@ export class A2ADelegate implements Delegate {
286
466
  return body.result
287
467
  }
288
468
 
289
- private parseTask(raw: unknown, method: A2AMethod): A2ATask {
469
+ /** Bounded best effort; cancellation is never allowed to create a second hang. */
470
+ private async cancelPeer(taskId: string): Promise<void> {
471
+ const boundary = operationBoundary({
472
+ timeoutMs: PEER_CANCEL_GRACE_MS,
473
+ timeoutMessage: `A2A tasks/cancel timed out after ${PEER_CANCEL_GRACE_MS}ms`,
474
+ abortTransportInitially: true,
475
+ })
476
+ try {
477
+ await boundary.wait(this.rpc('tasks/cancel', { id: taskId }, boundary.signal))
478
+ } catch {
479
+ // Best-effort courtesy on a path already unwinding. A refusal or an
480
+ // unreachable peer does not reverse the caller's stop or deadline.
481
+ } finally {
482
+ boundary.dispose()
483
+ }
484
+ }
485
+
486
+ /** A client-terminal state may still be live on the peer. */
487
+ private async settleKnownTask(task: A2ATask): Promise<DelegateResult> {
488
+ if (!TERMINAL_STATES.has(task.status.state)) await this.cancelPeer(task.id)
489
+ return toDelegateResult(task)
490
+ }
491
+
492
+ /**
493
+ * Give an in-flight `message/send` one short chance to reveal its task id.
494
+ *
495
+ * Aborting that first transport immediately can abandon remote work while
496
+ * claiming cancellation locally. A2A cannot address a task until the peer
497
+ * returns its id, so this bounded grace is the only honest cleanup attempt.
498
+ */
499
+ private async recoverInitialTask(
500
+ request: Promise<unknown>,
501
+ ): Promise<{ readonly taskId?: string; readonly task?: A2ATask }> {
502
+ let timer: ReturnType<typeof setTimeout> | undefined
503
+ const expired = new Promise<undefined>((resolve) => {
504
+ timer = setTimeout(() => resolve(undefined), PEER_CANCEL_GRACE_MS)
505
+ })
506
+ try {
507
+ const recovered = await Promise.race([
508
+ request.then(
509
+ (value) => value,
510
+ () => undefined,
511
+ ),
512
+ expired,
513
+ ])
514
+ if (recovered === undefined) return {}
515
+ const taskId = taskIdOf(recovered)
516
+ try {
517
+ const task = this.parseTask(recovered, 'message/send')
518
+ return { taskId: task.id, task }
519
+ } catch {
520
+ // The answer remains unusable, but a non-empty string id is enough
521
+ // authority to address `tasks/cancel`. Throwing that id away because
522
+ // an unrelated status/artifact field was malformed orphans work.
523
+ return taskId === undefined ? {} : { taskId }
524
+ }
525
+ } finally {
526
+ if (timer !== undefined) clearTimeout(timer)
527
+ }
528
+ }
529
+
530
+ private parseTask(raw: unknown, method: A2AMethod, expectedTaskId?: string): A2ATask {
290
531
  const parsed = A2ATaskSchema.safeParse(raw)
291
- if (!parsed.success) {
532
+ if (!parsed.success || taskIdOf(parsed.data) === undefined) {
292
533
  // Validated rather than trusted. This is a foreign service's reply
293
534
  // being turned into a result the model will read as an answer, and
294
535
  // the difference between a malformed task and a task in a state we
@@ -297,6 +538,12 @@ export class A2ADelegate implements Delegate {
297
538
  method,
298
539
  })
299
540
  }
541
+ if (expectedTaskId !== undefined && parsed.data.id !== expectedTaskId) {
542
+ throw new A2ARequestError(
543
+ `${method} returned task ${parsed.data.id} for requested task ${expectedTaskId}`,
544
+ { method },
545
+ )
546
+ }
300
547
  return parsed.data as A2ATask
301
548
  }
302
549
 
@@ -304,66 +551,106 @@ export class A2ADelegate implements Delegate {
304
551
  request: DelegateRequest,
305
552
  opts: { readonly signal?: AbortSignal },
306
553
  ): Promise<DelegateResult> {
307
- const sent = this.parseTask(
308
- await this.rpc(
554
+ if (opts.signal?.aborted) return { status: 'cancelled' }
555
+ const boundary = operationBoundary({
556
+ callerSignal: opts.signal,
557
+ timeoutMs: this.timeoutMs,
558
+ timeoutMessage: `A2A delegation timed out after ${this.timeoutMs}ms`,
559
+ // `message/send` has not returned an addressable task id yet. Hold
560
+ // transport abort for one bounded cleanup attempt if cancellation wins.
561
+ abortTransportInitially: false,
562
+ })
563
+ let initialRequest: Promise<unknown> | undefined
564
+ let sent: A2ATask | undefined
565
+ let latest: A2ATask | undefined
566
+ let taskId: string | undefined
567
+ try {
568
+ boundary.throwIfStopped()
569
+ initialRequest = this.rpc(
309
570
  'message/send',
310
571
  { message: { role: 'user', parts: [{ kind: 'text', text: request.prompt }] } },
311
- // Deliberately NOT `opts.signal`. An abort must reach the peer as
312
- // a `tasks/cancel`, and it cannot if the request that learns the
313
- // task id is itself aborted — the delegation would be left
314
- // running on the peer's side, billed, with nothing here holding
315
- // an id that could stop it.
316
- ),
317
- 'message/send',
318
- )
319
-
320
- // The abort tells the PEER to stop. Aborting only our poll loop leaves
321
- // the peer working and holding whatever the task holds; a cancel has
322
- // to reach the side doing the work. Fire-and-forget with the failure
323
- // swallowed: this is best-effort courtesy on a path that is already
324
- // unwinding, and a peer that refuses the cancel must not turn the
325
- // parent's cancellation into an exception.
326
- const tellThePeer = () => {
327
- void this.rpc('tasks/cancel', { id: sent.id }).catch(() => {})
328
- }
329
- opts.signal?.addEventListener('abort', tellThePeer, { once: true })
330
- if (opts.signal?.aborted) tellThePeer()
331
-
332
- try {
333
- const deadline = Date.now() + (this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS)
334
- let task = sent
335
- while (!WILL_NOT_PROGRESS.has(task.status.state)) {
336
- if (opts.signal?.aborted) {
337
- // The peer has been told. Reported as cancelled rather than
338
- // polled to a terminal state, because the parent has stopped
339
- // waiting and the answer is no longer wanted.
340
- return { status: 'cancelled' }
341
- }
342
- if (Date.now() > deadline) {
343
- return {
344
- status: 'failed',
345
- error: `The peer was still ${task.status.state} after ${this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS}ms.`,
346
- }
347
- }
348
- await sleep(this.config.pollIntervalMs ?? DEFAULT_POLL_MS, opts.signal)
349
- task = this.parseTask(
350
- await this.rpc('tasks/get', { id: sent.id }, opts.signal),
572
+ boundary.signal,
573
+ )
574
+ const initialReply = await boundary.wait(initialRequest)
575
+ taskId = taskIdOf(initialReply)
576
+ sent = this.parseTask(initialReply, 'message/send')
577
+ latest = sent
578
+ if (WILL_NOT_PROGRESS.has(latest.status.state)) return await this.settleKnownTask(latest)
579
+ // From this point onward the peer has given us an id. Abort pending
580
+ // poll transport immediately, then address the remote task separately.
581
+ boundary.armTransportAbort()
582
+ boundary.throwIfStopped()
583
+ while (!WILL_NOT_PROGRESS.has(latest.status.state)) {
584
+ await boundary.wait(sleep(this.pollIntervalMs, boundary.signal))
585
+ latest = this.parseTask(
586
+ await boundary.wait(this.rpc('tasks/get', { id: sent.id }, boundary.signal)),
351
587
  'tasks/get',
588
+ sent.id,
352
589
  )
353
590
  }
354
- return toDelegateResult(task)
591
+ return await this.settleKnownTask(latest)
592
+ } catch (err) {
593
+ if (!(err instanceof OperationInterrupted)) {
594
+ // A protocol/HTTP/body failure does not prove a task that was already
595
+ // accepted by the peer stopped. Once we know its id, clean it up
596
+ // under the same bounded best-effort path, then preserve the original
597
+ // failure for the caller.
598
+ if (
599
+ taskId !== undefined &&
600
+ (latest === undefined || !WILL_NOT_PROGRESS.has(latest.status.state))
601
+ ) {
602
+ await this.cancelPeer(taskId)
603
+ }
604
+ throw err
605
+ }
606
+
607
+ if (sent === undefined && initialRequest !== undefined) {
608
+ const recovered = await this.recoverInitialTask(initialRequest)
609
+ sent = recovered.task
610
+ latest = sent
611
+ taskId = recovered.taskId
612
+ boundary.abortTransport()
613
+ }
614
+ if (
615
+ taskId !== undefined &&
616
+ (latest === undefined || !WILL_NOT_PROGRESS.has(latest.status.state))
617
+ ) {
618
+ await this.cancelPeer(taskId)
619
+ }
620
+
621
+ if (err.cause.kind === 'caller') return { status: 'cancelled' }
622
+ return {
623
+ status: 'failed',
624
+ error:
625
+ sent === undefined
626
+ ? `The peer did not return a task id before the ${this.timeoutMs}ms delegation deadline; its remote outcome is unknown.`
627
+ : `The peer was still ${latest?.status.state ?? sent.status.state} after ${this.timeoutMs}ms.`,
628
+ }
355
629
  } finally {
356
- opts.signal?.removeEventListener('abort', tellThePeer)
630
+ boundary.dispose()
357
631
  }
358
632
  }
359
633
  }
360
634
 
361
- function sleep(ms: number, signal?: AbortSignal): Promise<void> {
362
- return new Promise((resolve) => {
363
- const timer = setTimeout(resolve, ms)
364
- signal?.addEventListener('abort', () => {
635
+ function sleep(ms: number, signal: AbortSignal): Promise<void> {
636
+ signal.throwIfAborted()
637
+ return new Promise((resolve, reject) => {
638
+ let settled = false
639
+ const cleanup = (): void => signal.removeEventListener('abort', onAbort)
640
+ const onAbort = (): void => {
641
+ if (settled) return
642
+ settled = true
365
643
  clearTimeout(timer)
644
+ cleanup()
645
+ reject(signal.reason)
646
+ }
647
+ const timer = setTimeout(() => {
648
+ if (settled) return
649
+ settled = true
650
+ cleanup()
366
651
  resolve()
367
- })
652
+ }, ms)
653
+ signal.addEventListener('abort', onAbort, { once: true })
654
+ if (signal.aborted) onAbort()
368
655
  })
369
656
  }
@@ -82,6 +82,11 @@ const MAPPING: {
82
82
  // Capability degradation is host-facing diagnostics, not A2A task state.
83
83
  capability_warning: null,
84
84
 
85
+ // Local history normalization is an operator/audit fact. The peer receives
86
+ // only the repaired provider-valid conversation, never this host's storage
87
+ // diagnosis or its counts.
88
+ message_history_repaired: null,
89
+
85
90
  // Who approves on THIS side is an operator fact about this host, not a
86
91
  // transition in the task the peer is watching. Forwarding it would also
87
92
  // tell a remote caller how loosely its work is being supervised, which