@namzu/sdk 30.1.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 (714) hide show
  1. package/CHANGELOG.md +576 -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 +7 -0
  207. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  208. package/dist/provider/collect-chat-completion.js +35 -0
  209. package/dist/provider/collect-chat-completion.js.map +1 -1
  210. package/dist/provider/fallback.d.ts +3 -1
  211. package/dist/provider/fallback.d.ts.map +1 -1
  212. package/dist/provider/fallback.js +62 -10
  213. package/dist/provider/fallback.js.map +1 -1
  214. package/dist/provider/idle-timeout.d.ts +4 -0
  215. package/dist/provider/idle-timeout.d.ts.map +1 -1
  216. package/dist/provider/idle-timeout.js +131 -15
  217. package/dist/provider/idle-timeout.js.map +1 -1
  218. package/dist/provider/index.d.ts +2 -0
  219. package/dist/provider/index.d.ts.map +1 -1
  220. package/dist/provider/index.js +1 -0
  221. package/dist/provider/index.js.map +1 -1
  222. package/dist/provider/instrumentation.d.ts.map +1 -1
  223. package/dist/provider/instrumentation.js +1 -0
  224. package/dist/provider/instrumentation.js.map +1 -1
  225. package/dist/provider/retry.d.ts.map +1 -1
  226. package/dist/provider/retry.js +13 -1
  227. package/dist/provider/retry.js.map +1 -1
  228. package/dist/public-runtime.d.ts +57 -24
  229. package/dist/public-runtime.d.ts.map +1 -1
  230. package/dist/public-runtime.js +42 -35
  231. package/dist/public-runtime.js.map +1 -1
  232. package/dist/public-tools.d.ts +1 -0
  233. package/dist/public-tools.d.ts.map +1 -1
  234. package/dist/public-tools.js +5 -0
  235. package/dist/public-tools.js.map +1 -1
  236. package/dist/public-types.d.ts +33 -12
  237. package/dist/public-types.d.ts.map +1 -1
  238. package/dist/rag/embedding.d.ts +8 -3
  239. package/dist/rag/embedding.d.ts.map +1 -1
  240. package/dist/rag/embedding.js +120 -9
  241. package/dist/rag/embedding.js.map +1 -1
  242. package/dist/rag/index.d.ts +1 -1
  243. package/dist/rag/index.d.ts.map +1 -1
  244. package/dist/rag/index.js +1 -1
  245. package/dist/rag/index.js.map +1 -1
  246. package/dist/rag/ingestion.d.ts +2 -2
  247. package/dist/rag/ingestion.d.ts.map +1 -1
  248. package/dist/rag/ingestion.js +15 -3
  249. package/dist/rag/ingestion.js.map +1 -1
  250. package/dist/rag/knowledge-base.d.ts +3 -3
  251. package/dist/rag/knowledge-base.d.ts.map +1 -1
  252. package/dist/rag/knowledge-base.js +8 -4
  253. package/dist/rag/knowledge-base.js.map +1 -1
  254. package/dist/rag/operation.d.ts +10 -0
  255. package/dist/rag/operation.d.ts.map +1 -0
  256. package/dist/rag/operation.js +26 -0
  257. package/dist/rag/operation.js.map +1 -0
  258. package/dist/rag/rag-tool.d.ts.map +1 -1
  259. package/dist/rag/rag-tool.js +6 -3
  260. package/dist/rag/rag-tool.js.map +1 -1
  261. package/dist/rag/retriever.d.ts +2 -2
  262. package/dist/rag/retriever.d.ts.map +1 -1
  263. package/dist/rag/retriever.js +31 -15
  264. package/dist/rag/retriever.js.map +1 -1
  265. package/dist/rag/vector-store.d.ts +3 -3
  266. package/dist/rag/vector-store.d.ts.map +1 -1
  267. package/dist/rag/vector-store.js +4 -2
  268. package/dist/rag/vector-store.js.map +1 -1
  269. package/dist/registry/command/kernel-commands.d.ts +16 -4
  270. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  271. package/dist/registry/command/kernel-commands.js +171 -0
  272. package/dist/registry/command/kernel-commands.js.map +1 -1
  273. package/dist/run/reporter.d.ts.map +1 -1
  274. package/dist/run/reporter.js +9 -0
  275. package/dist/run/reporter.js.map +1 -1
  276. package/dist/run-query/index.d.ts +15 -1
  277. package/dist/run-query/index.d.ts.map +1 -1
  278. package/dist/run-query/index.js +69 -15
  279. package/dist/run-query/index.js.map +1 -1
  280. package/dist/runtime/query/context.d.ts.map +1 -1
  281. package/dist/runtime/query/context.js +10 -3
  282. package/dist/runtime/query/context.js.map +1 -1
  283. package/dist/runtime/query/executor.d.ts +3 -0
  284. package/dist/runtime/query/executor.d.ts.map +1 -1
  285. package/dist/runtime/query/executor.js +80 -18
  286. package/dist/runtime/query/executor.js.map +1 -1
  287. package/dist/runtime/query/guard.d.ts +9 -0
  288. package/dist/runtime/query/guard.d.ts.map +1 -1
  289. package/dist/runtime/query/guard.js +11 -0
  290. package/dist/runtime/query/guard.js.map +1 -1
  291. package/dist/runtime/query/index.d.ts +30 -1
  292. package/dist/runtime/query/index.d.ts.map +1 -1
  293. package/dist/runtime/query/index.js +548 -95
  294. package/dist/runtime/query/index.js.map +1 -1
  295. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  296. package/dist/runtime/query/iteration/index.js +74 -14
  297. package/dist/runtime/query/iteration/index.js.map +1 -1
  298. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  299. package/dist/runtime/query/iteration/phases/compaction.js +94 -53
  300. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  301. package/dist/runtime/query/iteration/phases/context.d.ts +3 -0
  302. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  303. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  304. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  305. package/dist/runtime/query/iteration/phases/tool-review.js +21 -0
  306. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  307. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  308. package/dist/runtime/query/iteration/stream-turn.js +4 -0
  309. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  310. package/dist/runtime/query/project-instructions.d.ts +69 -0
  311. package/dist/runtime/query/project-instructions.d.ts.map +1 -0
  312. package/dist/runtime/query/project-instructions.js +137 -0
  313. package/dist/runtime/query/project-instructions.js.map +1 -0
  314. package/dist/runtime/query/request-rich-content.d.ts +22 -0
  315. package/dist/runtime/query/request-rich-content.d.ts.map +1 -0
  316. package/dist/runtime/query/request-rich-content.js +122 -0
  317. package/dist/runtime/query/request-rich-content.js.map +1 -0
  318. package/dist/runtime/query/result.d.ts.map +1 -1
  319. package/dist/runtime/query/result.js +12 -1
  320. package/dist/runtime/query/result.js.map +1 -1
  321. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  322. package/dist/runtime/query/resume-pending.js +19 -20
  323. package/dist/runtime/query/resume-pending.js.map +1 -1
  324. package/dist/runtime/query/resume-run.d.ts.map +1 -1
  325. package/dist/runtime/query/resume-run.js +54 -8
  326. package/dist/runtime/query/resume-run.js.map +1 -1
  327. package/dist/runtime/query/run-state.d.ts +5 -0
  328. package/dist/runtime/query/run-state.d.ts.map +1 -1
  329. package/dist/runtime/query/run-state.js +6 -1
  330. package/dist/runtime/query/run-state.js.map +1 -1
  331. package/dist/runtime/query/sandbox-lifecycle.d.ts +54 -0
  332. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -0
  333. package/dist/runtime/query/sandbox-lifecycle.js +167 -0
  334. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -0
  335. package/dist/sandbox/isolation.d.ts.map +1 -1
  336. package/dist/sandbox/isolation.js +9 -0
  337. package/dist/sandbox/isolation.js.map +1 -1
  338. package/dist/sandbox/provider/local.d.ts +56 -6
  339. package/dist/sandbox/provider/local.d.ts.map +1 -1
  340. package/dist/sandbox/provider/local.js +181 -76
  341. package/dist/sandbox/provider/local.js.map +1 -1
  342. package/dist/sandbox/terminal.d.ts +13 -5
  343. package/dist/sandbox/terminal.d.ts.map +1 -1
  344. package/dist/sandbox/terminal.js +11 -3
  345. package/dist/sandbox/terminal.js.map +1 -1
  346. package/dist/session/errors.d.ts +28 -29
  347. package/dist/session/errors.d.ts.map +1 -1
  348. package/dist/session/errors.js +28 -29
  349. package/dist/session/errors.js.map +1 -1
  350. package/dist/session/handoff/broadcast.d.ts +5 -8
  351. package/dist/session/handoff/broadcast.d.ts.map +1 -1
  352. package/dist/session/handoff/broadcast.js +16 -6
  353. package/dist/session/handoff/broadcast.js.map +1 -1
  354. package/dist/session/handoff/single.d.ts +5 -8
  355. package/dist/session/handoff/single.d.ts.map +1 -1
  356. package/dist/session/handoff/single.js +7 -4
  357. package/dist/session/handoff/single.js.map +1 -1
  358. package/dist/store/attachment/index.d.ts +11 -3
  359. package/dist/store/attachment/index.d.ts.map +1 -1
  360. package/dist/store/attachment/index.js +49 -4
  361. package/dist/store/attachment/index.js.map +1 -1
  362. package/dist/store/feedback/conformance.d.ts.map +1 -1
  363. package/dist/store/feedback/conformance.js +32 -0
  364. package/dist/store/feedback/conformance.js.map +1 -1
  365. package/dist/store/feedback/disk.d.ts +8 -6
  366. package/dist/store/feedback/disk.d.ts.map +1 -1
  367. package/dist/store/feedback/disk.js +111 -76
  368. package/dist/store/feedback/disk.js.map +1 -1
  369. package/dist/store/goal/index.d.ts +111 -0
  370. package/dist/store/goal/index.d.ts.map +1 -0
  371. package/dist/store/goal/index.js +436 -0
  372. package/dist/store/goal/index.js.map +1 -0
  373. package/dist/store/index.d.ts +1 -1
  374. package/dist/store/index.d.ts.map +1 -1
  375. package/dist/store/index.js +1 -1
  376. package/dist/store/index.js.map +1 -1
  377. package/dist/store/kv/revision-record-store.d.ts +70 -0
  378. package/dist/store/kv/revision-record-store.d.ts.map +1 -0
  379. package/dist/store/kv/revision-record-store.js +290 -0
  380. package/dist/store/kv/revision-record-store.js.map +1 -0
  381. package/dist/store/memory/disk.d.ts +9 -7
  382. package/dist/store/memory/disk.d.ts.map +1 -1
  383. package/dist/store/memory/disk.js +256 -98
  384. package/dist/store/memory/disk.js.map +1 -1
  385. package/dist/store/run/disk.d.ts +10 -2
  386. package/dist/store/run/disk.d.ts.map +1 -1
  387. package/dist/store/run/disk.js +70 -4
  388. package/dist/store/run/disk.js.map +1 -1
  389. package/dist/store/run/memory.d.ts +4 -2
  390. package/dist/store/run/memory.d.ts.map +1 -1
  391. package/dist/store/run/memory.js +15 -1
  392. package/dist/store/run/memory.js.map +1 -1
  393. package/dist/store/session/disk.d.ts +9 -0
  394. package/dist/store/session/disk.d.ts.map +1 -1
  395. package/dist/store/session/disk.js +57 -5
  396. package/dist/store/session/disk.js.map +1 -1
  397. package/dist/store/session/memory.d.ts +1 -0
  398. package/dist/store/session/memory.d.ts.map +1 -1
  399. package/dist/store/session/memory.js +14 -0
  400. package/dist/store/session/memory.js.map +1 -1
  401. package/dist/store/topic/memory.d.ts +1 -2
  402. package/dist/store/topic/memory.d.ts.map +1 -1
  403. package/dist/store/topic/memory.js +4 -5
  404. package/dist/store/topic/memory.js.map +1 -1
  405. package/dist/store/topic/objective.d.ts +8 -4
  406. package/dist/store/topic/objective.d.ts.map +1 -1
  407. package/dist/store/topic/objective.js +185 -100
  408. package/dist/store/topic/objective.js.map +1 -1
  409. package/dist/store/topic/state.d.ts +1 -2
  410. package/dist/store/topic/state.d.ts.map +1 -1
  411. package/dist/store/topic/state.js +50 -62
  412. package/dist/store/topic/state.js.map +1 -1
  413. package/dist/tools/builtins/bash.d.ts.map +1 -1
  414. package/dist/tools/builtins/bash.js +20 -0
  415. package/dist/tools/builtins/bash.js.map +1 -1
  416. package/dist/tools/builtins/computer-use.d.ts +9 -1
  417. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  418. package/dist/tools/builtins/computer-use.js.map +1 -1
  419. package/dist/tools/builtins/content-fingerprint.d.ts +8 -7
  420. package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
  421. package/dist/tools/builtins/content-fingerprint.js +9 -10
  422. package/dist/tools/builtins/content-fingerprint.js.map +1 -1
  423. package/dist/tools/builtins/edit.d.ts +6 -1
  424. package/dist/tools/builtins/edit.d.ts.map +1 -1
  425. package/dist/tools/builtins/edit.js +166 -27
  426. package/dist/tools/builtins/edit.js.map +1 -1
  427. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  428. package/dist/tools/builtins/write-file.js +45 -19
  429. package/dist/tools/builtins/write-file.js.map +1 -1
  430. package/dist/tools/command-arguments.d.ts +43 -0
  431. package/dist/tools/command-arguments.d.ts.map +1 -0
  432. package/dist/tools/command-arguments.js +52 -0
  433. package/dist/tools/command-arguments.js.map +1 -0
  434. package/dist/tools/coordinator/index.d.ts +2 -0
  435. package/dist/tools/coordinator/index.d.ts.map +1 -1
  436. package/dist/tools/coordinator/index.js +3 -1
  437. package/dist/tools/coordinator/index.js.map +1 -1
  438. package/dist/tools/defineTool.d.ts +10 -0
  439. package/dist/tools/defineTool.d.ts.map +1 -1
  440. package/dist/tools/defineTool.js +1 -0
  441. package/dist/tools/defineTool.js.map +1 -1
  442. package/dist/tools/env-scrub.d.ts +7 -5
  443. package/dist/tools/env-scrub.d.ts.map +1 -1
  444. package/dist/tools/env-scrub.js +7 -5
  445. package/dist/tools/env-scrub.js.map +1 -1
  446. package/dist/tools/goal/index.d.ts +20 -0
  447. package/dist/tools/goal/index.d.ts.map +1 -0
  448. package/dist/tools/goal/index.js +104 -0
  449. package/dist/tools/goal/index.js.map +1 -0
  450. package/dist/tools/memory/index.d.ts +16 -0
  451. package/dist/tools/memory/index.d.ts.map +1 -1
  452. package/dist/tools/memory/index.js +6 -2
  453. package/dist/tools/memory/index.js.map +1 -1
  454. package/dist/tools/memory/search.d.ts +4 -1
  455. package/dist/tools/memory/search.d.ts.map +1 -1
  456. package/dist/tools/memory/search.js +10 -2
  457. package/dist/tools/memory/search.js.map +1 -1
  458. package/dist/types/agent/base.d.ts +11 -3
  459. package/dist/types/agent/base.d.ts.map +1 -1
  460. package/dist/types/agent/factory.d.ts +2 -0
  461. package/dist/types/agent/factory.d.ts.map +1 -1
  462. package/dist/types/agent/reactive.d.ts +2 -0
  463. package/dist/types/agent/reactive.d.ts.map +1 -1
  464. package/dist/types/agent/supervisor.d.ts +6 -0
  465. package/dist/types/agent/supervisor.d.ts.map +1 -1
  466. package/dist/types/agent/task.d.ts +6 -2
  467. package/dist/types/agent/task.d.ts.map +1 -1
  468. package/dist/types/connector/core.d.ts +13 -8
  469. package/dist/types/connector/core.d.ts.map +1 -1
  470. package/dist/types/connector/definition.d.ts +37 -18
  471. package/dist/types/connector/definition.d.ts.map +1 -1
  472. package/dist/types/connector/http.d.ts +6 -0
  473. package/dist/types/connector/http.d.ts.map +1 -1
  474. package/dist/types/connector/mcp.d.ts +24 -6
  475. package/dist/types/connector/mcp.d.ts.map +1 -1
  476. package/dist/types/connector/tenant.d.ts +17 -7
  477. package/dist/types/connector/tenant.d.ts.map +1 -1
  478. package/dist/types/connector/webhook.d.ts +6 -0
  479. package/dist/types/connector/webhook.d.ts.map +1 -1
  480. package/dist/types/goal/index.d.ts +46 -0
  481. package/dist/types/goal/index.d.ts.map +1 -0
  482. package/dist/types/goal/index.js +2 -0
  483. package/dist/types/goal/index.js.map +1 -0
  484. package/dist/types/ids/index.d.ts +2 -0
  485. package/dist/types/ids/index.d.ts.map +1 -1
  486. package/dist/types/ids/index.js.map +1 -1
  487. package/dist/types/message/index.d.ts +75 -10
  488. package/dist/types/message/index.d.ts.map +1 -1
  489. package/dist/types/message/index.js +49 -3
  490. package/dist/types/message/index.js.map +1 -1
  491. package/dist/types/plugin/index.d.ts +7 -5
  492. package/dist/types/plugin/index.d.ts.map +1 -1
  493. package/dist/types/plugin/index.js.map +1 -1
  494. package/dist/types/provider/chat.d.ts +27 -4
  495. package/dist/types/provider/chat.d.ts.map +1 -1
  496. package/dist/types/provider/interface.d.ts +18 -7
  497. package/dist/types/provider/interface.d.ts.map +1 -1
  498. package/dist/types/provider/stream.d.ts +6 -0
  499. package/dist/types/provider/stream.d.ts.map +1 -1
  500. package/dist/types/rag/embedding.d.ts +15 -2
  501. package/dist/types/rag/embedding.d.ts.map +1 -1
  502. package/dist/types/rag/ingestion.d.ts +2 -2
  503. package/dist/types/rag/ingestion.d.ts.map +1 -1
  504. package/dist/types/rag/knowledge-base.d.ts +3 -3
  505. package/dist/types/rag/knowledge-base.d.ts.map +1 -1
  506. package/dist/types/rag/retrieval.d.ts +2 -2
  507. package/dist/types/rag/retrieval.d.ts.map +1 -1
  508. package/dist/types/rag/scope.d.ts +4 -0
  509. package/dist/types/rag/scope.d.ts.map +1 -1
  510. package/dist/types/rag/vector.d.ts +5 -2
  511. package/dist/types/rag/vector.d.ts.map +1 -1
  512. package/dist/types/run/config.d.ts +20 -0
  513. package/dist/types/run/config.d.ts.map +1 -1
  514. package/dist/types/run/events.d.ts +25 -1
  515. package/dist/types/run/events.d.ts.map +1 -1
  516. package/dist/types/run/events.js.map +1 -1
  517. package/dist/types/run/metadata.d.ts +2 -0
  518. package/dist/types/run/metadata.d.ts.map +1 -1
  519. package/dist/types/run/step.d.ts +2 -6
  520. package/dist/types/run/step.d.ts.map +1 -1
  521. package/dist/types/run/step.js.map +1 -1
  522. package/dist/types/run/store.d.ts +55 -2
  523. package/dist/types/run/store.d.ts.map +1 -1
  524. package/dist/types/sandbox/index.d.ts +47 -6
  525. package/dist/types/sandbox/index.d.ts.map +1 -1
  526. package/dist/types/sandbox/index.js +23 -10
  527. package/dist/types/sandbox/index.js.map +1 -1
  528. package/dist/types/session/store.d.ts +13 -0
  529. package/dist/types/session/store.d.ts.map +1 -1
  530. package/dist/types/tool/index.d.ts +33 -11
  531. package/dist/types/tool/index.d.ts.map +1 -1
  532. package/dist/types/tool/index.js.map +1 -1
  533. package/dist/types/topic/entity.d.ts +3 -4
  534. package/dist/types/topic/entity.d.ts.map +1 -1
  535. package/dist/types/topic/store.d.ts +3 -3
  536. package/dist/utils/id.d.ts +3 -1
  537. package/dist/utils/id.d.ts.map +1 -1
  538. package/dist/utils/id.js +4 -0
  539. package/dist/utils/id.js.map +1 -1
  540. package/dist/utils/process-environment.d.ts +26 -0
  541. package/dist/utils/process-environment.d.ts.map +1 -0
  542. package/dist/utils/process-environment.js +78 -0
  543. package/dist/utils/process-environment.js.map +1 -0
  544. package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
  545. package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
  546. package/dist/vault/InMemoryCredentialVault.js +24 -4
  547. package/dist/vault/InMemoryCredentialVault.js.map +1 -1
  548. package/dist/vault/instrumentation.d.ts.map +1 -1
  549. package/dist/vault/instrumentation.js +15 -0
  550. package/dist/vault/instrumentation.js.map +1 -1
  551. package/package.json +1 -1
  552. package/src/advisory/executor.ts +4 -1
  553. package/src/agents/ReactiveAgent.ts +12 -0
  554. package/src/agents/RouterAgent.ts +25 -3
  555. package/src/agents/SupervisorAgent.ts +33 -11
  556. package/src/agents/runAgent.ts +38 -2
  557. package/src/authorization/command-line.ts +390 -0
  558. package/src/authorization/rules.ts +22 -1
  559. package/src/bridge/a2a/client.ts +384 -97
  560. package/src/bridge/a2a/mapper.ts +5 -0
  561. package/src/bridge/acp/server.ts +184 -42
  562. package/src/bridge/mcp/connector/adapter.ts +28 -20
  563. package/src/bridge/sse/mapper.ts +3 -0
  564. package/src/compaction/dangling.ts +203 -38
  565. package/src/compaction/index.ts +9 -2
  566. package/src/compaction/manual.ts +125 -18
  567. package/src/compaction/plan.ts +42 -11
  568. package/src/compaction/retention.ts +23 -8
  569. package/src/compaction/summary.ts +4 -4
  570. package/src/compaction/verifier.ts +66 -0
  571. package/src/connector/BaseConnector.ts +19 -4
  572. package/src/connector/builtins/http.ts +236 -46
  573. package/src/connector/builtins/webhook.ts +207 -47
  574. package/src/connector/execution-contract.ts +27 -0
  575. package/src/connector/http-operation.ts +238 -0
  576. package/src/connector/mcp/adapter.ts +8 -3
  577. package/src/connector/mcp/client.ts +207 -58
  578. package/src/connector/mcp/http-sse.ts +91 -23
  579. package/src/connector/mcp/prompt-adapter.ts +8 -2
  580. package/src/connector/mcp/stdio.ts +21 -46
  581. package/src/connector/mcp/streamable-http.ts +86 -22
  582. package/src/connector/tools/adapter.ts +23 -14
  583. package/src/connector/tools/definitions.ts +5 -2
  584. package/src/connector/tools/result.ts +21 -0
  585. package/src/connector/web/guarded-fetch.ts +188 -48
  586. package/src/constants/sandbox/index.ts +3 -2
  587. package/src/contracts/api.ts +2 -0
  588. package/src/contracts/schemas.ts +7 -0
  589. package/src/directory/derive-supervisor.ts +8 -0
  590. package/src/directory/derive.ts +8 -0
  591. package/src/directory/load.ts +2 -0
  592. package/src/directory/types.ts +4 -0
  593. package/src/eval/experiment.ts +160 -111
  594. package/src/eval/judge.ts +13 -2
  595. package/src/eval/types.ts +7 -1
  596. package/src/manager/agent/lifecycle.ts +28 -12
  597. package/src/manager/connector/environment.ts +3 -1
  598. package/src/manager/connector/lifecycle.ts +364 -24
  599. package/src/manager/connector/tenant.ts +56 -23
  600. package/src/manager/goal/activation.ts +52 -0
  601. package/src/manager/index.ts +10 -2
  602. package/src/manager/run/persistence.ts +6 -1
  603. package/src/manager/topic/dependency.ts +39 -0
  604. package/src/manager/topic/lifecycle.ts +19 -31
  605. package/src/plugin/index.ts +1 -0
  606. package/src/plugin/lifecycle.ts +180 -39
  607. package/src/plugin/loader.ts +70 -13
  608. package/src/pricing/rates.source.json +315 -204
  609. package/src/provider/collect-chat-completion.ts +36 -0
  610. package/src/provider/fallback.ts +79 -11
  611. package/src/provider/idle-timeout.ts +143 -17
  612. package/src/provider/index.ts +2 -0
  613. package/src/provider/instrumentation.ts +1 -0
  614. package/src/provider/retry.ts +16 -1
  615. package/src/public-runtime.ts +190 -32
  616. package/src/public-tools.ts +5 -0
  617. package/src/public-types.ts +85 -11
  618. package/src/rag/embedding.ts +147 -19
  619. package/src/rag/index.ts +1 -1
  620. package/src/rag/ingestion.ts +16 -2
  621. package/src/rag/knowledge-base.ts +13 -4
  622. package/src/rag/operation.ts +28 -0
  623. package/src/rag/rag-tool.ts +6 -3
  624. package/src/rag/retriever.ts +62 -11
  625. package/src/rag/vector-store.ts +8 -2
  626. package/src/registry/command/kernel-commands.ts +223 -4
  627. package/src/run/reporter.ts +10 -0
  628. package/src/run-query/index.ts +84 -15
  629. package/src/runtime/query/context.ts +13 -3
  630. package/src/runtime/query/executor.ts +90 -17
  631. package/src/runtime/query/guard.ts +12 -0
  632. package/src/runtime/query/index.ts +652 -103
  633. package/src/runtime/query/iteration/index.ts +89 -13
  634. package/src/runtime/query/iteration/phases/compaction.ts +120 -55
  635. package/src/runtime/query/iteration/phases/context.ts +4 -0
  636. package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
  637. package/src/runtime/query/iteration/stream-turn.ts +3 -0
  638. package/src/runtime/query/project-instructions.ts +212 -0
  639. package/src/runtime/query/request-rich-content.ts +153 -0
  640. package/src/runtime/query/result.ts +12 -1
  641. package/src/runtime/query/resume-pending.ts +20 -18
  642. package/src/runtime/query/resume-run.ts +52 -8
  643. package/src/runtime/query/run-state.ts +11 -1
  644. package/src/runtime/query/sandbox-lifecycle.ts +210 -0
  645. package/src/sandbox/isolation.ts +9 -0
  646. package/src/sandbox/provider/local.ts +255 -90
  647. package/src/sandbox/terminal.ts +13 -5
  648. package/src/session/errors.ts +68 -42
  649. package/src/session/handoff/broadcast.ts +20 -14
  650. package/src/session/handoff/single.ts +14 -13
  651. package/src/store/attachment/index.ts +65 -3
  652. package/src/store/feedback/conformance.ts +39 -0
  653. package/src/store/feedback/disk.ts +128 -82
  654. package/src/store/goal/index.ts +594 -0
  655. package/src/store/index.ts +1 -1
  656. package/src/store/kv/revision-record-store.ts +346 -0
  657. package/src/store/memory/disk.ts +288 -113
  658. package/src/store/run/disk.ts +96 -5
  659. package/src/store/run/memory.ts +22 -2
  660. package/src/store/session/disk.ts +93 -6
  661. package/src/store/session/memory.ts +22 -0
  662. package/src/store/topic/memory.ts +4 -5
  663. package/src/store/topic/objective.ts +215 -100
  664. package/src/store/topic/state.ts +100 -63
  665. package/src/tools/builtins/bash.ts +21 -0
  666. package/src/tools/builtins/computer-use.ts +9 -1
  667. package/src/tools/builtins/content-fingerprint.ts +9 -12
  668. package/src/tools/builtins/edit.ts +190 -27
  669. package/src/tools/builtins/write-file.ts +55 -19
  670. package/src/tools/command-arguments.ts +54 -0
  671. package/src/tools/coordinator/index.ts +4 -1
  672. package/src/tools/defineTool.ts +11 -0
  673. package/src/tools/env-scrub.ts +7 -5
  674. package/src/tools/goal/index.ts +129 -0
  675. package/src/tools/memory/index.ts +26 -3
  676. package/src/tools/memory/search.ts +20 -3
  677. package/src/types/agent/base.ts +12 -3
  678. package/src/types/agent/factory.ts +2 -0
  679. package/src/types/agent/reactive.ts +2 -0
  680. package/src/types/agent/supervisor.ts +6 -0
  681. package/src/types/agent/task.ts +6 -2
  682. package/src/types/connector/core.ts +13 -8
  683. package/src/types/connector/definition.ts +54 -20
  684. package/src/types/connector/http.ts +7 -0
  685. package/src/types/connector/mcp.ts +27 -6
  686. package/src/types/connector/tenant.ts +21 -7
  687. package/src/types/connector/webhook.ts +7 -0
  688. package/src/types/goal/index.ts +50 -0
  689. package/src/types/ids/index.ts +2 -0
  690. package/src/types/message/index.ts +143 -9
  691. package/src/types/plugin/index.ts +7 -5
  692. package/src/types/provider/chat.ts +35 -4
  693. package/src/types/provider/interface.ts +22 -7
  694. package/src/types/provider/stream.ts +6 -0
  695. package/src/types/rag/embedding.ts +16 -2
  696. package/src/types/rag/ingestion.ts +2 -1
  697. package/src/types/rag/knowledge-base.ts +7 -3
  698. package/src/types/rag/retrieval.ts +2 -1
  699. package/src/types/rag/scope.ts +5 -0
  700. package/src/types/rag/vector.ts +5 -2
  701. package/src/types/run/config.ts +20 -0
  702. package/src/types/run/events.ts +28 -3
  703. package/src/types/run/metadata.ts +2 -0
  704. package/src/types/run/step.ts +2 -7
  705. package/src/types/run/store.ts +60 -2
  706. package/src/types/sandbox/index.ts +57 -14
  707. package/src/types/session/store.ts +18 -0
  708. package/src/types/tool/index.ts +33 -11
  709. package/src/types/topic/entity.ts +3 -4
  710. package/src/types/topic/store.ts +3 -3
  711. package/src/utils/id.ts +6 -0
  712. package/src/utils/process-environment.ts +101 -0
  713. package/src/vault/InMemoryCredentialVault.ts +29 -4
  714. package/src/vault/instrumentation.ts +24 -0
@@ -64,7 +64,10 @@ export class AncestryCycleError extends Error {
64
64
  cyclePath: readonly SessionId[]
65
65
  }
66
66
 
67
- constructor(details: { sessionId: SessionId; cyclePath: readonly SessionId[] }) {
67
+ constructor(details: {
68
+ sessionId: SessionId
69
+ cyclePath: readonly SessionId[]
70
+ }) {
68
71
  super(
69
72
  `Ancestry cycle detected starting at ${details.sessionId}: ${details.cyclePath.join(' -> ')}`,
70
73
  )
@@ -86,7 +89,11 @@ export class WorkspaceBackendError extends Error {
86
89
  cause?: unknown
87
90
  }
88
91
 
89
- constructor(details: { op: string; kind: WorkspaceBackendKind; cause?: unknown }) {
92
+ constructor(details: {
93
+ op: string
94
+ kind: WorkspaceBackendKind
95
+ cause?: unknown
96
+ }) {
90
97
  super(`Workspace backend ${details.kind} failed on ${details.op}`)
91
98
  this.name = 'WorkspaceBackendError'
92
99
  this.details = details
@@ -94,24 +101,27 @@ export class WorkspaceBackendError extends Error {
94
101
  }
95
102
 
96
103
  /**
97
- * Raised by {@link import('../types/thread/store.js').ThreadStore.updateThread}
98
- * when the supplied {@link Thread.ownerVersion} does not match the persisted
99
- * record. The caller must re-read via `getThread`, re-apply its intended
100
- * mutation on top of the fresh record, and retry. Mirrors the Session
101
- * handoff CAS pattern (§6.1).
104
+ * Raised by {@link import('../types/topic/store.js').TopicStore.updateTopic}
105
+ * when the supplied Topic owner version does not match the persisted record.
106
+ * The caller re-reads the Topic, reapplies its intended mutation, and retries.
107
+ * Mirrors the Session handoff CAS pattern (§6.1).
102
108
  */
103
- export class StaleThreadError extends Error {
109
+ export class StaleTopicError extends Error {
104
110
  readonly details: {
105
- threadId: TopicId
111
+ topicId: TopicId
106
112
  expectedVersion: number
107
113
  actualVersion: number
108
114
  }
109
115
 
110
- constructor(details: { threadId: TopicId; expectedVersion: number; actualVersion: number }) {
116
+ constructor(details: {
117
+ topicId: TopicId
118
+ expectedVersion: number
119
+ actualVersion: number
120
+ }) {
111
121
  super(
112
- `Stale Thread ${details.threadId}: expected ownerVersion=${details.expectedVersion}, actual=${details.actualVersion}`,
122
+ `Stale Topic ${details.topicId}: expected ownerVersion=${details.expectedVersion}, actual=${details.actualVersion}`,
113
123
  )
114
- this.name = 'StaleThreadError'
124
+ this.name = 'StaleTopicError'
115
125
  this.details = details
116
126
  }
117
127
  }
@@ -119,8 +129,8 @@ export class StaleThreadError extends Error {
119
129
  /**
120
130
  * Raised when a Session write names a version the store no longer has.
121
131
  *
122
- * The sibling of {@link StaleThreadError}, and it arrived much later: Thread
123
- * had a working compare-and-set from the start while `Session.ownerVersion`
132
+ * The sibling of {@link StaleTopicError}, and it arrived much later: Topic had
133
+ * a working compare-and-set from the start while `Session.ownerVersion`
124
134
  * was documented as a CAS counter that nothing enforced. Two concurrent
125
135
  * handoffs could both pass, both provision a worktree, and one silently erase
126
136
  * the other.
@@ -136,7 +146,11 @@ export class StaleSessionError extends Error {
136
146
  actualVersion: number
137
147
  }
138
148
 
139
- constructor(details: { sessionId: SessionId; expectedVersion: number; actualVersion: number }) {
149
+ constructor(details: {
150
+ sessionId: SessionId
151
+ expectedVersion: number
152
+ actualVersion: number
153
+ }) {
140
154
  super(
141
155
  `Stale Session ${details.sessionId}: expected ownerVersion=${details.expectedVersion}, actual=${details.actualVersion}. Another writer took ownership; re-read the session before retrying.`,
142
156
  )
@@ -146,65 +160,71 @@ export class StaleSessionError extends Error {
146
160
  }
147
161
 
148
162
  /**
149
- * Raised by the spawn path (and any caller that enforces the open-thread
150
- * precondition) when a Thread is in `'archived'` state and would-be mutations
151
- * require it to be `'open'`. Convention #5: deny-by-default — archival is a
152
- * hard read-only boundary.
163
+ * Raised by the spawn path (and any caller that enforces the open-Topic
164
+ * precondition) when a Topic is archived and a mutation requires it to be
165
+ * open. Convention #5: deny-by-default — archival is a hard read-only
166
+ * boundary.
153
167
  */
154
- export class ThreadClosedError extends Error {
168
+ export class TopicArchivedError extends Error {
155
169
  readonly details: {
156
- threadId: TopicId
170
+ topicId: TopicId
157
171
  op: string
158
172
  }
159
173
 
160
- constructor(details: { threadId: TopicId; op: string }) {
161
- super(`Thread ${details.threadId} is archived; operation '${details.op}' rejected`)
162
- this.name = 'ThreadClosedError'
174
+ constructor(details: { topicId: TopicId; op: string }) {
175
+ super(`Topic ${details.topicId} is archived; operation '${details.op}' rejected`)
176
+ this.name = 'TopicArchivedError'
163
177
  this.details = details
164
178
  }
165
179
  }
166
180
 
167
181
  /**
168
182
  * Raised by {@link import('../manager/topic/lifecycle.js').TopicManager.archive}
169
- * and `.delete` when the Thread's session-presence precondition is violated:
183
+ * and `.delete` when the Topic's session-presence precondition is violated:
170
184
  *
171
- * - `op: 'archive'` — at least one Session under the Thread is in a
185
+ * - `op: 'archive'` — at least one Session under the Topic is in a
172
186
  * non-terminal state (`active | locked | awaiting_hitl | awaiting_merge`).
173
187
  * The caller must first quiesce those sessions (let them reach `idle`,
174
- * `failed`, or `archived`) before flipping the Thread to archived.
175
- * - `op: 'delete'` — the Thread still has at least one attached Session.
188
+ * `failed`, or `archived`) before flipping the Topic to archived.
189
+ * - `op: 'delete'` — the Topic still has at least one attached Session.
176
190
  * Callers must either archive + tombstone those sessions (`deleteSession`)
177
- * before calling `deleteThread`, or accept that deletion is not yet safe.
191
+ * before calling `deleteTopic`, or accept that deletion is not yet safe.
178
192
  *
179
- * `blockingSessions` carries the first {@link THREAD_NOT_EMPTY_SAMPLE_LIMIT}
193
+ * `blockingSessions` carries the first {@link TOPIC_NOT_EMPTY_SAMPLE_LIMIT}
180
194
  * offenders with their current status so operator tooling can surface an
181
- * actionable list without unbounded error payloads on large threads.
195
+ * actionable list without unbounded error payloads on large topics.
182
196
  * `totalBlockingSessions` holds the full count even when the sample is
183
197
  * truncated. Convention #5: deny-by-default — no implicit cascade, no silent
184
198
  * no-op.
185
199
  */
186
- export const THREAD_NOT_EMPTY_SAMPLE_LIMIT = 50
200
+ export const TOPIC_NOT_EMPTY_SAMPLE_LIMIT = 50
187
201
 
188
- export class ThreadNotEmptyError extends Error {
202
+ export class TopicNotEmptyError extends Error {
189
203
  readonly details: {
190
- threadId: TopicId
204
+ topicId: TopicId
191
205
  tenantId: TenantId
192
206
  op: 'archive' | 'delete'
193
- blockingSessions: ReadonlyArray<{ sessionId: SessionId; status: SessionStatus }>
207
+ blockingSessions: ReadonlyArray<{
208
+ sessionId: SessionId
209
+ status: SessionStatus
210
+ }>
194
211
  totalBlockingSessions: number
195
212
  }
196
213
 
197
214
  constructor(details: {
198
- threadId: TopicId
215
+ topicId: TopicId
199
216
  tenantId: TenantId
200
217
  op: 'archive' | 'delete'
201
- blockingSessions: ReadonlyArray<{ sessionId: SessionId; status: SessionStatus }>
218
+ blockingSessions: ReadonlyArray<{
219
+ sessionId: SessionId
220
+ status: SessionStatus
221
+ }>
202
222
  totalBlockingSessions: number
203
223
  }) {
204
224
  super(
205
- `Thread ${details.threadId} ${details.op} blocked: ${details.totalBlockingSessions} session(s) still attached`,
225
+ `Topic ${details.topicId} ${details.op} blocked: ${details.totalBlockingSessions} session(s) still attached`,
206
226
  )
207
- this.name = 'ThreadNotEmptyError'
227
+ this.name = 'TopicNotEmptyError'
208
228
  this.details = details
209
229
  }
210
230
  }
@@ -212,7 +232,7 @@ export class ThreadNotEmptyError extends Error {
212
232
  /**
213
233
  * Raised when an ingress path is asked to attach work to an archived Project.
214
234
  *
215
- * The sibling of {@link ThreadClosedError}, on the level that survives. A
235
+ * The sibling of {@link TopicArchivedError}, on the level that survives. A
216
236
  * closed workspace is a decision by its owner, and the paths that create
217
237
  * sessions have to be able to see it — otherwise "archived" is a word in a
218
238
  * listing rather than a state of the system.
@@ -247,7 +267,10 @@ export class ProjectNotEmptyError extends Error {
247
267
  projectId: ProjectId
248
268
  tenantId: TenantId
249
269
  op: 'archive'
250
- blockingSessions: ReadonlyArray<{ sessionId: SessionId; status: SessionStatus }>
270
+ blockingSessions: ReadonlyArray<{
271
+ sessionId: SessionId
272
+ status: SessionStatus
273
+ }>
251
274
  totalBlockingSessions: number
252
275
  }
253
276
 
@@ -255,7 +278,10 @@ export class ProjectNotEmptyError extends Error {
255
278
  projectId: ProjectId
256
279
  tenantId: TenantId
257
280
  op: 'archive'
258
- blockingSessions: ReadonlyArray<{ sessionId: SessionId; status: SessionStatus }>
281
+ blockingSessions: ReadonlyArray<{
282
+ sessionId: SessionId
283
+ status: SessionStatus
284
+ }>
259
285
  totalBlockingSessions: number
260
286
  }) {
261
287
  super(
@@ -22,7 +22,7 @@
22
22
  */
23
23
 
24
24
  import { requireOpenProject } from '../../manager/project/lifecycle.js'
25
- import type { TopicManager } from '../../manager/topic/lifecycle.js'
25
+ import { type TopicManagerDependency, resolveTopicManager } from '../../manager/topic/dependency.js'
26
26
  import type { SessionId, TenantId } from '../../types/ids/index.js'
27
27
  import type { Session } from '../../types/session/entity.js'
28
28
  import type { SubSessionId } from '../../types/session/ids.js'
@@ -37,7 +37,7 @@ import type { HandoffEventSink } from './events.js'
37
37
  import type { RunStatusResolver } from './single.js'
38
38
  import { HandoffLockRejected, HandoffVersionConflict } from './version.js'
39
39
 
40
- export interface BroadcastHandoffDeps {
40
+ interface BroadcastHandoffBaseDeps {
41
41
  store: SessionStore
42
42
  workspaceRegistry: WorkspaceBackendRegistry
43
43
  capacity: CapacityValidator
@@ -47,14 +47,11 @@ export interface BroadcastHandoffDeps {
47
47
  * that used to stand in here reported every session unblocked.
48
48
  */
49
49
  runStatus: RunStatusResolver
50
- /**
51
- * Gate every recipient-session creation on the Thread being `'open'`.
52
- * Added in Phase 2.6; checked once per broadcast (all recipients share
53
- * a threadId by the fan-out invariant validated above).
54
- */
55
- threadManager: TopicManager
56
50
  }
57
51
 
52
+ /** Dependencies for a multi-recipient handoff. */
53
+ export type BroadcastHandoffDeps = BroadcastHandoffBaseDeps & TopicManagerDependency
54
+
58
55
  /**
59
56
  * Per-recipient partial state tracked during fan-out so rollback can
60
57
  * compensate exactly what was created. `subSessionId` is populated at the
@@ -145,11 +142,11 @@ export async function executeBroadcastHandoff(
145
142
  seen.add(key)
146
143
  }
147
144
 
148
- // Thread archive gate (Phase 2.6) — runs BEFORE source load/capacity so an
149
- // archived thread fails fastest with `ThreadClosedError`. All assignments
145
+ // Topic archive gate (Phase 2.6) — runs BEFORE source load/capacity so an
146
+ // archived Topic fails fastest with `TopicArchivedError`. All assignments
150
147
  // share `topicId` by the shape validation above. Runs BEFORE the CAS
151
148
  // lock so a denied fan-out leaves the source session untouched.
152
- await deps.threadManager.requireOpen(first.topicId, tenantId)
149
+ await resolveTopicManager(deps).requireOpen(first.topicId, tenantId)
153
150
 
154
151
  // 3. Load source + tenant check.
155
152
  const source = await deps.store.getSession(first.sourceSessionId, tenantId)
@@ -190,7 +187,10 @@ export async function executeBroadcastHandoff(
190
187
  const runResolver = deps.runStatus
191
188
  const blocking = await runResolver.blockingRun(source.id, tenantId)
192
189
  if (blocking) {
193
- throw new HandoffLockRejected({ sessionId: source.id, reason: blocking.reason })
190
+ throw new HandoffLockRejected({
191
+ sessionId: source.id,
192
+ reason: blocking.reason,
193
+ })
194
194
  }
195
195
 
196
196
  // 6. Capacity — width + depth. Width covers N new children in one shot
@@ -218,7 +218,11 @@ export async function executeBroadcastHandoff(
218
218
  // the lock at the version it read left the locked window invisible, so a
219
219
  // second broadcast holding the same snapshot passed the check above and
220
220
  // fanned out over a session that was already locked.
221
- const locked: Session = { ...source, status: 'locked', ownerVersion: source.ownerVersion + 1 }
221
+ const locked: Session = {
222
+ ...source,
223
+ status: 'locked',
224
+ ownerVersion: source.ownerVersion + 1,
225
+ }
222
226
  await deps.store.updateSession(locked, tenantId, first.expectedOwnerVersion)
223
227
  emit(deps.events.onLocked, { sessionId: source.id, at: new Date() })
224
228
 
@@ -244,7 +248,9 @@ export async function executeBroadcastHandoff(
244
248
  }
245
249
  partials.push(partial)
246
250
 
247
- partial.workspace = await driver.create({ label: `broadcast-${assignment.id}` })
251
+ partial.workspace = await driver.create({
252
+ label: `broadcast-${assignment.id}`,
253
+ })
248
254
  worktreesProvisioned += 1
249
255
 
250
256
  const childSession = await deps.store.createSession(
@@ -21,7 +21,7 @@
21
21
  */
22
22
 
23
23
  import { requireOpenProject } from '../../manager/project/lifecycle.js'
24
- import type { TopicManager } from '../../manager/topic/lifecycle.js'
24
+ import { type TopicManagerDependency, resolveTopicManager } from '../../manager/topic/dependency.js'
25
25
  import type { SessionId, TenantId } from '../../types/ids/index.js'
26
26
  import type { Session } from '../../types/session/entity.js'
27
27
  import type { SessionStore } from '../../types/session/store.js'
@@ -50,10 +50,12 @@ export interface RunStatusResolver {
50
50
  blockingRun(
51
51
  sessionId: SessionId,
52
52
  tenantId: TenantId,
53
- ): Promise<{ reason: 'active_run' | 'pending_hitl' | 'pending_subsession' } | null>
53
+ ): Promise<{
54
+ reason: 'active_run' | 'pending_hitl' | 'pending_subsession'
55
+ } | null>
54
56
  }
55
57
 
56
- export interface SingleHandoffDeps {
58
+ interface SingleHandoffBaseDeps {
57
59
  store: SessionStore
58
60
  workspaceRegistry: WorkspaceBackendRegistry
59
61
  capacity: CapacityValidator
@@ -65,14 +67,11 @@ export interface SingleHandoffDeps {
65
67
  * fail dressed as a check that ran.
66
68
  */
67
69
  runStatus: RunStatusResolver
68
- /**
69
- * Gate the recipient-session creation on the Topic being `'open'`.
70
- * Added in Phase 2.6 to mirror spawn — a handoff into an archived
71
- * Topic would otherwise undermine `TopicManager.archive`.
72
- */
73
- threadManager: TopicManager
74
70
  }
75
71
 
72
+ /** Dependencies for a single-recipient handoff. */
73
+ export type SingleHandoffDeps = SingleHandoffBaseDeps & TopicManagerDependency
74
+
76
75
  /**
77
76
  * Executes a single-recipient handoff against `deps.store`. Throws
78
77
  * {@link HandoffLockRejected}, {@link HandoffVersionConflict},
@@ -92,11 +91,11 @@ export async function executeSingleHandoff(
92
91
  })
93
92
  }
94
93
 
95
- // Thread archive gate (Phase 2.6) — runs FIRST so an archived thread
96
- // fails fastest with `ThreadClosedError` rather than a lock rejection or
94
+ // Topic archive gate (Phase 2.6) — runs FIRST so an archived Topic
95
+ // fails fastest with `TopicArchivedError` rather than a lock rejection or
97
96
  // capacity error. Checked BEFORE the CAS lock so a denied handoff leaves
98
97
  // the source session untouched.
99
- await deps.threadManager.requireOpen(assignment.topicId, tenantId)
98
+ await resolveTopicManager(deps).requireOpen(assignment.topicId, tenantId)
100
99
 
101
100
  // 1. Load source session + tenant check.
102
101
  const source = await deps.store.getSession(assignment.sourceSessionId, tenantId)
@@ -185,7 +184,9 @@ export async function executeSingleHandoff(
185
184
  let createdSessionId: SessionId | null = null
186
185
  try {
187
186
  const driver: WorkspaceBackendDriver = deps.workspaceRegistry.get('git-worktree')
188
- provisionedWorkspace = await driver.create({ label: `handoff-${assignment.id}` })
187
+ provisionedWorkspace = await driver.create({
188
+ label: `handoff-${assignment.id}`,
189
+ })
189
190
 
190
191
  const recipientSession = await deps.store.createSession(
191
192
  {
@@ -51,6 +51,15 @@ export interface StoredBytes {
51
51
  readonly mediaType: string
52
52
  }
53
53
 
54
+ /** Authority owned by the public operation resolving stored bytes. */
55
+ export interface AttachmentOperationOptions {
56
+ /**
57
+ * A pre-aborted signal starts no store work. Implementations should use it
58
+ * to stop their own I/O; the SDK also stops awaiting a store that ignores it.
59
+ */
60
+ readonly signal?: AbortSignal
61
+ }
62
+
54
63
  export interface AttachmentStore {
55
64
  /**
56
65
  * Take bytes, return a ref.
@@ -60,7 +69,7 @@ export interface AttachmentStore {
60
69
  */
61
70
  put(bytes: StoredBytes): Promise<string>
62
71
  /** `undefined` for a ref this store does not hold. */
63
- get(ref: string): Promise<StoredBytes | undefined>
72
+ get(ref: string, options?: AttachmentOperationOptions): Promise<StoredBytes | undefined>
64
73
  }
65
74
 
66
75
  /** A reference nothing could resolve. */
@@ -117,11 +126,20 @@ export const isStoredAttachment = (
117
126
  export async function resolveAttachment(
118
127
  attachment: MessageAttachment,
119
128
  store: AttachmentStore | undefined,
129
+ options: AttachmentOperationOptions = {},
120
130
  ): Promise<MessageAttachment> {
131
+ const { signal } = options
132
+ signal?.throwIfAborted()
121
133
  if (!isStoredAttachment(attachment)) return attachment
122
134
  if (!store) throw new NoAttachmentStoreError({ ref: attachment.ref })
123
135
 
124
- const bytes = await store.get(attachment.ref)
136
+ const bytes = await awaitStoreRead(signal, () =>
137
+ signal ? store.get(attachment.ref, { signal }) : store.get(attachment.ref),
138
+ )
139
+ // A store completion can win its promise reaction and remove the abort
140
+ // listener immediately before an already-queued abort. Publication is a
141
+ // second authority boundary, so fence it independently.
142
+ signal?.throwIfAborted()
125
143
  if (!bytes) throw new AttachmentNotFoundError({ ref: attachment.ref })
126
144
 
127
145
  if (bytes.mediaType !== attachment.mediaType) {
@@ -159,7 +177,9 @@ export async function resolveAttachment(
159
177
  export async function resolveAttachments(
160
178
  messages: readonly Message[],
161
179
  store: AttachmentStore | undefined,
180
+ options: AttachmentOperationOptions = {},
162
181
  ): Promise<readonly Message[]> {
182
+ options.signal?.throwIfAborted()
163
183
  // `Message` rather than a structural constraint: only some members of
164
184
  // the union carry `attachments`, and a structural bound over a union
165
185
  // like that is not assignable in either direction. Naming the real type
@@ -175,8 +195,50 @@ export async function resolveAttachments(
175
195
  if (!attachments?.some(isStoredAttachment)) return message
176
196
  return {
177
197
  ...message,
178
- attachments: await Promise.all(attachments.map((a) => resolveAttachment(a, store))),
198
+ attachments: await Promise.all(
199
+ attachments.map((attachment) => resolveAttachment(attachment, store, options)),
200
+ ),
179
201
  }
180
202
  }),
181
203
  )
182
204
  }
205
+
206
+ /**
207
+ * Await a host store without handing it ownership of run cancellation.
208
+ *
209
+ * Forwarding the signal is cooperative cleanup; this race is the public
210
+ * liveness boundary when a remote or custom store ignores it. The first cause
211
+ * wins, and late store completion has no route back into the returned value.
212
+ */
213
+ async function awaitStoreRead<T>(
214
+ signal: AbortSignal | undefined,
215
+ start: () => Promise<T>,
216
+ ): Promise<T> {
217
+ if (!signal) return await start()
218
+ signal.throwIfAborted()
219
+
220
+ return new Promise<T>((resolve, reject) => {
221
+ let settled = false
222
+ const cleanup = (): void => signal.removeEventListener('abort', onAbort)
223
+ const rejectOnce = (reason: unknown): void => {
224
+ if (settled) return
225
+ settled = true
226
+ cleanup()
227
+ reject(reason)
228
+ }
229
+ const resolveOnce = (value: T): void => {
230
+ if (settled) return
231
+ settled = true
232
+ cleanup()
233
+ resolve(value)
234
+ }
235
+ const onAbort = (): void => rejectOnce(signal.reason)
236
+
237
+ signal.addEventListener('abort', onAbort, { once: true })
238
+ try {
239
+ Promise.resolve(start()).then(resolveOnce, rejectOnce)
240
+ } catch (error) {
241
+ rejectOnce(error)
242
+ }
243
+ })
244
+ }
@@ -122,6 +122,45 @@ export function defineMessageFeedbackConformance(options: FeedbackConformanceOpt
122
122
  expect(listed[0]?.ownerVersion).toBe(1)
123
123
  })
124
124
 
125
+ it('lets exactly one of two racing updates advance a stored version', async () => {
126
+ const { store, runId, knownMessageId } = await makeStore()
127
+ await store.putMessageFeedback({
128
+ runId,
129
+ messageId: knownMessageId,
130
+ rating: 'good',
131
+ expectedVersion: 0,
132
+ })
133
+
134
+ const attempts = [
135
+ { rating: 'good' as const, note: 'writer-a' },
136
+ { rating: 'bad' as const, note: 'writer-b' },
137
+ ].map((candidate) =>
138
+ store
139
+ .putMessageFeedback({
140
+ runId,
141
+ messageId: knownMessageId,
142
+ ...candidate,
143
+ expectedVersion: 1,
144
+ })
145
+ .then(
146
+ (record) => ({ kind: 'ok' as const, record }),
147
+ () => ({ kind: 'refused' as const }),
148
+ ),
149
+ )
150
+ const outcomes = await Promise.all(attempts)
151
+ const winners = outcomes.filter((outcome) => outcome.kind === 'ok')
152
+
153
+ expect(winners).toHaveLength(1)
154
+ expect(outcomes.filter((outcome) => outcome.kind === 'refused')).toHaveLength(1)
155
+ const winner = winners[0]
156
+ if (winner?.kind !== 'ok') throw new Error('expected one feedback update winner')
157
+ const listed = await store.listMessageFeedback({ runId })
158
+ expect(listed).toHaveLength(1)
159
+ expect(listed[0]?.ownerVersion).toBe(2)
160
+ expect(listed[0]?.rating).toBe(winner.record.rating)
161
+ expect(listed[0]?.note).toBe(winner.record.note)
162
+ })
163
+
125
164
  it('advances the version on a correct update', async () => {
126
165
  const { store, runId, knownMessageId } = await makeStore()
127
166
  await store.putMessageFeedback({