@namzu/sdk 0.4.1 → 0.4.3

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 (685) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/__tests__/replay-public-surface.test.d.ts +2 -0
  3. package/dist/__tests__/replay-public-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/replay-public-surface.test.js +45 -0
  5. package/dist/__tests__/replay-public-surface.test.js.map +1 -0
  6. package/dist/advisory/context.test.d.ts +16 -0
  7. package/dist/advisory/context.test.d.ts.map +1 -0
  8. package/dist/advisory/context.test.js +92 -0
  9. package/dist/advisory/context.test.js.map +1 -0
  10. package/dist/advisory/evaluator.test.d.ts +34 -0
  11. package/dist/advisory/evaluator.test.d.ts.map +1 -0
  12. package/dist/advisory/evaluator.test.js +172 -0
  13. package/dist/advisory/evaluator.test.js.map +1 -0
  14. package/dist/advisory/executor.test.d.ts +35 -0
  15. package/dist/advisory/executor.test.d.ts.map +1 -0
  16. package/dist/advisory/executor.test.js +233 -0
  17. package/dist/advisory/executor.test.js.map +1 -0
  18. package/dist/advisory/registry.test.d.ts +16 -0
  19. package/dist/advisory/registry.test.d.ts.map +1 -0
  20. package/dist/advisory/registry.test.js +62 -0
  21. package/dist/advisory/registry.test.js.map +1 -0
  22. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  23. package/dist/agents/SupervisorAgent.js.map +1 -1
  24. package/dist/bridge/a2a/agent-card.test.d.ts +24 -0
  25. package/dist/bridge/a2a/agent-card.test.d.ts.map +1 -0
  26. package/dist/bridge/a2a/agent-card.test.js +118 -0
  27. package/dist/bridge/a2a/agent-card.test.js.map +1 -0
  28. package/dist/bridge/a2a/mapper.test.d.ts +29 -0
  29. package/dist/bridge/a2a/mapper.test.d.ts.map +1 -0
  30. package/dist/bridge/a2a/mapper.test.js +265 -0
  31. package/dist/bridge/a2a/mapper.test.js.map +1 -0
  32. package/dist/bridge/a2a/message.test.d.ts +20 -0
  33. package/dist/bridge/a2a/message.test.d.ts.map +1 -0
  34. package/dist/bridge/a2a/message.test.js +116 -0
  35. package/dist/bridge/a2a/message.test.js.map +1 -0
  36. package/dist/bridge/a2a/task.d.ts +2 -2
  37. package/dist/bridge/a2a/task.d.ts.map +1 -1
  38. package/dist/bridge/a2a/task.js.map +1 -1
  39. package/dist/bridge/a2a/task.test.d.ts +29 -0
  40. package/dist/bridge/a2a/task.test.d.ts.map +1 -0
  41. package/dist/bridge/a2a/task.test.js +198 -0
  42. package/dist/bridge/a2a/task.test.js.map +1 -0
  43. package/dist/bridge/mcp/connector/adapter.test.d.ts +27 -0
  44. package/dist/bridge/mcp/connector/adapter.test.d.ts.map +1 -0
  45. package/dist/bridge/mcp/connector/adapter.test.js +203 -0
  46. package/dist/bridge/mcp/connector/adapter.test.js.map +1 -0
  47. package/dist/bridge/sse/mapper.test.d.ts +27 -0
  48. package/dist/bridge/sse/mapper.test.d.ts.map +1 -0
  49. package/dist/bridge/sse/mapper.test.js +271 -0
  50. package/dist/bridge/sse/mapper.test.js.map +1 -0
  51. package/dist/bridge/tools/connector/adapter.test.d.ts +28 -0
  52. package/dist/bridge/tools/connector/adapter.test.d.ts.map +1 -0
  53. package/dist/bridge/tools/connector/adapter.test.js +182 -0
  54. package/dist/bridge/tools/connector/adapter.test.js.map +1 -0
  55. package/dist/bridge/tools/connector/definitions.test.d.ts +23 -0
  56. package/dist/bridge/tools/connector/definitions.test.d.ts.map +1 -0
  57. package/dist/bridge/tools/connector/definitions.test.js +158 -0
  58. package/dist/bridge/tools/connector/definitions.test.js.map +1 -0
  59. package/dist/bridge/tools/connector/router.test.d.ts +21 -0
  60. package/dist/bridge/tools/connector/router.test.d.ts.map +1 -0
  61. package/dist/bridge/tools/connector/router.test.js +139 -0
  62. package/dist/bridge/tools/connector/router.test.js.map +1 -0
  63. package/dist/bus/breaker.test.d.ts +41 -0
  64. package/dist/bus/breaker.test.d.ts.map +1 -0
  65. package/dist/bus/breaker.test.js +242 -0
  66. package/dist/bus/breaker.test.js.map +1 -0
  67. package/dist/bus/index.test.d.ts +25 -0
  68. package/dist/bus/index.test.d.ts.map +1 -0
  69. package/dist/bus/index.test.js +151 -0
  70. package/dist/bus/index.test.js.map +1 -0
  71. package/dist/bus/lock.test.d.ts +44 -0
  72. package/dist/bus/lock.test.d.ts.map +1 -0
  73. package/dist/bus/lock.test.js +226 -0
  74. package/dist/bus/lock.test.js.map +1 -0
  75. package/dist/bus/ownership.test.d.ts +26 -0
  76. package/dist/bus/ownership.test.d.ts.map +1 -0
  77. package/dist/bus/ownership.test.js +205 -0
  78. package/dist/bus/ownership.test.js.map +1 -0
  79. package/dist/config/runtime.d.ts +24 -25
  80. package/dist/config/runtime.d.ts.map +1 -1
  81. package/dist/config/runtime.js.map +1 -1
  82. package/dist/connector/BaseConnector.test.d.ts +21 -0
  83. package/dist/connector/BaseConnector.test.d.ts.map +1 -0
  84. package/dist/connector/BaseConnector.test.js +108 -0
  85. package/dist/connector/BaseConnector.test.js.map +1 -0
  86. package/dist/connector/builtins/http.test.d.ts +30 -0
  87. package/dist/connector/builtins/http.test.d.ts.map +1 -0
  88. package/dist/connector/builtins/http.test.js +232 -0
  89. package/dist/connector/builtins/http.test.js.map +1 -0
  90. package/dist/connector/builtins/webhook.test.d.ts +20 -0
  91. package/dist/connector/builtins/webhook.test.d.ts.map +1 -0
  92. package/dist/connector/builtins/webhook.test.js +113 -0
  93. package/dist/connector/builtins/webhook.test.js.map +1 -0
  94. package/dist/connector/execution/factory.test.d.ts +16 -0
  95. package/dist/connector/execution/factory.test.d.ts.map +1 -0
  96. package/dist/connector/execution/factory.test.js +64 -0
  97. package/dist/connector/execution/factory.test.js.map +1 -0
  98. package/dist/connector/execution/remote.test.d.ts +16 -0
  99. package/dist/connector/execution/remote.test.d.ts.map +1 -0
  100. package/dist/connector/execution/remote.test.js +53 -0
  101. package/dist/connector/execution/remote.test.js.map +1 -0
  102. package/dist/connector/mcp/adapter.test.d.ts +34 -0
  103. package/dist/connector/mcp/adapter.test.d.ts.map +1 -0
  104. package/dist/connector/mcp/adapter.test.js +199 -0
  105. package/dist/connector/mcp/adapter.test.js.map +1 -0
  106. package/dist/contracts/api.d.ts +2 -2
  107. package/dist/contracts/api.d.ts.map +1 -1
  108. package/dist/contracts/index.d.ts +1 -2
  109. package/dist/contracts/index.d.ts.map +1 -1
  110. package/dist/contracts/index.js.map +1 -1
  111. package/dist/contracts/schemas.d.ts +10 -10
  112. package/dist/index.d.ts +3 -103
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +9 -89
  115. package/dist/index.js.map +1 -1
  116. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -1
  117. package/dist/manager/agent/lifecycle.d.ts +1 -1
  118. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  119. package/dist/manager/agent/lifecycle.js +1 -1
  120. package/dist/manager/agent/lifecycle.js.map +1 -1
  121. package/dist/manager/run/persistence.d.ts +3 -3
  122. package/dist/manager/run/persistence.d.ts.map +1 -1
  123. package/dist/manager/run/persistence.js.map +1 -1
  124. package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -1
  125. package/dist/manager/thread/lifecycle.d.ts +1 -1
  126. package/dist/manager/thread/lifecycle.d.ts.map +1 -1
  127. package/dist/plugin/loader.d.ts +0 -5
  128. package/dist/plugin/loader.d.ts.map +1 -1
  129. package/dist/plugin/loader.js +1 -13
  130. package/dist/plugin/loader.js.map +1 -1
  131. package/dist/public-runtime.d.ts +70 -0
  132. package/dist/public-runtime.d.ts.map +1 -0
  133. package/dist/public-runtime.js +108 -0
  134. package/dist/public-runtime.js.map +1 -0
  135. package/dist/public-tools.d.ts +19 -0
  136. package/dist/public-tools.d.ts.map +1 -0
  137. package/dist/public-tools.js +34 -0
  138. package/dist/public-tools.js.map +1 -0
  139. package/dist/public-types.d.ts +55 -0
  140. package/dist/public-types.d.ts.map +1 -0
  141. package/dist/public-types.js +14 -0
  142. package/dist/public-types.js.map +1 -0
  143. package/dist/rag/chunking.test.d.ts +20 -0
  144. package/dist/rag/chunking.test.d.ts.map +1 -0
  145. package/dist/rag/chunking.test.js +92 -0
  146. package/dist/rag/chunking.test.js.map +1 -0
  147. package/dist/rag/context-assembler.test.d.ts +19 -0
  148. package/dist/rag/context-assembler.test.d.ts.map +1 -0
  149. package/dist/rag/context-assembler.test.js +98 -0
  150. package/dist/rag/context-assembler.test.js.map +1 -0
  151. package/dist/rag/embedding.test.d.ts +19 -0
  152. package/dist/rag/embedding.test.d.ts.map +1 -0
  153. package/dist/rag/embedding.test.js +115 -0
  154. package/dist/rag/embedding.test.js.map +1 -0
  155. package/dist/rag/ingestion.test.d.ts +22 -0
  156. package/dist/rag/ingestion.test.d.ts.map +1 -0
  157. package/dist/rag/ingestion.test.js +99 -0
  158. package/dist/rag/ingestion.test.js.map +1 -0
  159. package/dist/rag/knowledge-base.test.d.ts +17 -0
  160. package/dist/rag/knowledge-base.test.d.ts.map +1 -0
  161. package/dist/rag/knowledge-base.test.js +77 -0
  162. package/dist/rag/knowledge-base.test.js.map +1 -0
  163. package/dist/rag/rag-tool.d.ts +1 -1
  164. package/dist/rag/rag-tool.test.d.ts +21 -0
  165. package/dist/rag/rag-tool.test.d.ts.map +1 -0
  166. package/dist/rag/rag-tool.test.js +149 -0
  167. package/dist/rag/rag-tool.test.js.map +1 -0
  168. package/dist/rag/retriever.test.d.ts +26 -0
  169. package/dist/rag/retriever.test.d.ts.map +1 -0
  170. package/dist/rag/retriever.test.js +180 -0
  171. package/dist/rag/retriever.test.js.map +1 -0
  172. package/dist/rag/vector-store.test.d.ts +38 -0
  173. package/dist/rag/vector-store.test.d.ts.map +1 -0
  174. package/dist/rag/vector-store.test.js +175 -0
  175. package/dist/rag/vector-store.test.js.map +1 -0
  176. package/dist/registry/ManagedRegistry.test.d.ts +21 -0
  177. package/dist/registry/ManagedRegistry.test.d.ts.map +1 -0
  178. package/dist/registry/ManagedRegistry.test.js +98 -0
  179. package/dist/registry/ManagedRegistry.test.js.map +1 -0
  180. package/dist/registry/Registry.test.d.ts +18 -0
  181. package/dist/registry/Registry.test.d.ts.map +1 -0
  182. package/dist/registry/Registry.test.js +79 -0
  183. package/dist/registry/Registry.test.js.map +1 -0
  184. package/dist/registry/agent/definitions.test.d.ts +15 -0
  185. package/dist/registry/agent/definitions.test.d.ts.map +1 -0
  186. package/dist/registry/agent/definitions.test.js +84 -0
  187. package/dist/registry/agent/definitions.test.js.map +1 -0
  188. package/dist/registry/connector/definitions.test.d.ts +13 -0
  189. package/dist/registry/connector/definitions.test.d.ts.map +1 -0
  190. package/dist/registry/connector/definitions.test.js +41 -0
  191. package/dist/registry/connector/definitions.test.js.map +1 -0
  192. package/dist/registry/connector/scoped.test.d.ts +21 -0
  193. package/dist/registry/connector/scoped.test.d.ts.map +1 -0
  194. package/dist/registry/connector/scoped.test.js +115 -0
  195. package/dist/registry/connector/scoped.test.js.map +1 -0
  196. package/dist/registry/plugin/index.test.d.ts +12 -0
  197. package/dist/registry/plugin/index.test.d.ts.map +1 -0
  198. package/dist/registry/plugin/index.test.js +69 -0
  199. package/dist/registry/plugin/index.test.js.map +1 -0
  200. package/dist/registry/tool/execute.test.d.ts +42 -0
  201. package/dist/registry/tool/execute.test.d.ts.map +1 -0
  202. package/dist/registry/tool/execute.test.js +281 -0
  203. package/dist/registry/tool/execute.test.js.map +1 -0
  204. package/dist/run/LimitChecker.d.ts +0 -1
  205. package/dist/run/LimitChecker.d.ts.map +1 -1
  206. package/dist/run/LimitChecker.js +0 -6
  207. package/dist/run/LimitChecker.js.map +1 -1
  208. package/dist/run/reporter.d.ts +2 -2
  209. package/dist/run/reporter.d.ts.map +1 -1
  210. package/dist/run/reporter.js.map +1 -1
  211. package/dist/runtime/query/__tests__/checkpoint.test.d.ts +2 -0
  212. package/dist/runtime/query/__tests__/checkpoint.test.d.ts.map +1 -0
  213. package/dist/runtime/query/__tests__/checkpoint.test.js +150 -0
  214. package/dist/runtime/query/__tests__/checkpoint.test.js.map +1 -0
  215. package/dist/runtime/query/checkpoint.d.ts +23 -0
  216. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  217. package/dist/runtime/query/checkpoint.js +49 -0
  218. package/dist/runtime/query/checkpoint.js.map +1 -1
  219. package/dist/runtime/query/context.d.ts +0 -2
  220. package/dist/runtime/query/context.d.ts.map +1 -1
  221. package/dist/runtime/query/context.js +0 -4
  222. package/dist/runtime/query/context.js.map +1 -1
  223. package/dist/runtime/query/index.d.ts +3 -3
  224. package/dist/runtime/query/index.d.ts.map +1 -1
  225. package/dist/runtime/query/iteration/phases/advisory.test.d.ts +42 -0
  226. package/dist/runtime/query/iteration/phases/advisory.test.d.ts.map +1 -0
  227. package/dist/runtime/query/iteration/phases/advisory.test.js +334 -0
  228. package/dist/runtime/query/iteration/phases/advisory.test.js.map +1 -0
  229. package/dist/runtime/query/replay/__tests__/mutate.test.d.ts +2 -0
  230. package/dist/runtime/query/replay/__tests__/mutate.test.d.ts.map +1 -0
  231. package/dist/runtime/query/replay/__tests__/mutate.test.js +123 -0
  232. package/dist/runtime/query/replay/__tests__/mutate.test.js.map +1 -0
  233. package/dist/runtime/query/replay/__tests__/prepare.test.d.ts +2 -0
  234. package/dist/runtime/query/replay/__tests__/prepare.test.d.ts.map +1 -0
  235. package/dist/runtime/query/replay/__tests__/prepare.test.js +171 -0
  236. package/dist/runtime/query/replay/__tests__/prepare.test.js.map +1 -0
  237. package/dist/runtime/query/replay/list.d.ts +24 -0
  238. package/dist/runtime/query/replay/list.d.ts.map +1 -0
  239. package/dist/runtime/query/replay/list.js +21 -0
  240. package/dist/runtime/query/replay/list.js.map +1 -0
  241. package/dist/runtime/query/replay/mutate.d.ts +17 -0
  242. package/dist/runtime/query/replay/mutate.d.ts.map +1 -0
  243. package/dist/runtime/query/replay/mutate.js +62 -0
  244. package/dist/runtime/query/replay/mutate.js.map +1 -0
  245. package/dist/runtime/query/replay/prepare.d.ts +56 -0
  246. package/dist/runtime/query/replay/prepare.d.ts.map +1 -0
  247. package/dist/runtime/query/replay/prepare.js +65 -0
  248. package/dist/runtime/query/replay/prepare.js.map +1 -0
  249. package/dist/runtime/query/result.d.ts +2 -2
  250. package/dist/runtime/query/result.d.ts.map +1 -1
  251. package/dist/session/__tests__/integration/_fixtures.d.ts +4 -4
  252. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -1
  253. package/dist/session/__tests__/integration/_fixtures.js.map +1 -1
  254. package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -1
  255. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -1
  256. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -1
  257. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -1
  258. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -1
  259. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -1
  260. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -1
  261. package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -1
  262. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +1 -1
  263. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -1
  264. package/dist/session/errors.d.ts +1 -1
  265. package/dist/session/errors.d.ts.map +1 -1
  266. package/dist/session/events/index.d.ts +3 -3
  267. package/dist/session/events/index.d.ts.map +1 -1
  268. package/dist/session/events/index.js +3 -2
  269. package/dist/session/events/index.js.map +1 -1
  270. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -1
  271. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -1
  272. package/dist/session/handoff/__tests__/single.test.js.map +1 -1
  273. package/dist/session/handoff/assignment.d.ts +1 -1
  274. package/dist/session/handoff/assignment.d.ts.map +1 -1
  275. package/dist/session/handoff/broadcast.d.ts.map +1 -1
  276. package/dist/session/handoff/broadcast.js.map +1 -1
  277. package/dist/session/handoff/single.d.ts.map +1 -1
  278. package/dist/session/handoff/single.js.map +1 -1
  279. package/dist/session/index.d.ts +0 -1
  280. package/dist/session/index.d.ts.map +1 -1
  281. package/dist/session/index.js +7 -6
  282. package/dist/session/index.js.map +1 -1
  283. package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -1
  284. package/dist/session/intervention/prev-artifact.d.ts +1 -1
  285. package/dist/session/intervention/prev-artifact.d.ts.map +1 -1
  286. package/dist/session/retention/__tests__/archive.test.js.map +1 -1
  287. package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -1
  288. package/dist/session/retention/archive.d.ts +1 -1
  289. package/dist/session/retention/archive.d.ts.map +1 -1
  290. package/dist/session/retention/backend.d.ts +4 -4
  291. package/dist/session/retention/backend.d.ts.map +1 -1
  292. package/dist/session/retention/disk-backend.d.ts +1 -1
  293. package/dist/session/retention/disk-backend.d.ts.map +1 -1
  294. package/dist/session/retention/index.d.ts +3 -3
  295. package/dist/session/retention/index.d.ts.map +1 -1
  296. package/dist/session/retention/index.js +4 -2
  297. package/dist/session/retention/index.js.map +1 -1
  298. package/dist/session/status/__tests__/derive.test.d.ts +2 -0
  299. package/dist/session/status/__tests__/derive.test.d.ts.map +1 -0
  300. package/dist/session/{hierarchy/__tests__/session.test.js → status/__tests__/derive.test.js} +2 -2
  301. package/dist/session/status/__tests__/derive.test.js.map +1 -0
  302. package/dist/session/status/derive.d.ts +33 -0
  303. package/dist/session/status/derive.d.ts.map +1 -0
  304. package/dist/session/{hierarchy/session.js → status/derive.js} +6 -1
  305. package/dist/session/status/derive.js.map +1 -0
  306. package/dist/session/summary/__tests__/materialize.test.js +2 -1
  307. package/dist/session/summary/__tests__/materialize.test.js.map +1 -1
  308. package/dist/session/summary/errors.d.ts +43 -0
  309. package/dist/session/summary/errors.d.ts.map +1 -0
  310. package/dist/session/summary/errors.js +37 -0
  311. package/dist/session/summary/errors.js.map +1 -0
  312. package/dist/session/summary/index.d.ts +4 -3
  313. package/dist/session/summary/index.d.ts.map +1 -1
  314. package/dist/session/summary/index.js +5 -4
  315. package/dist/session/summary/index.js.map +1 -1
  316. package/dist/session/summary/materialize.d.ts +2 -2
  317. package/dist/session/summary/materialize.d.ts.map +1 -1
  318. package/dist/session/summary/materialize.js +2 -1
  319. package/dist/session/summary/materialize.js.map +1 -1
  320. package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -1
  321. package/dist/session/workspace/driver.d.ts +2 -2
  322. package/dist/session/workspace/driver.d.ts.map +1 -1
  323. package/dist/session/workspace/git-worktree.d.ts +1 -1
  324. package/dist/session/workspace/git-worktree.d.ts.map +1 -1
  325. package/dist/session/workspace/git-worktree.js.map +1 -1
  326. package/dist/session/workspace/index.d.ts +1 -1
  327. package/dist/session/workspace/index.d.ts.map +1 -1
  328. package/dist/session/workspace/index.js +3 -2
  329. package/dist/session/workspace/index.js.map +1 -1
  330. package/dist/store/run/disk.d.ts +4 -4
  331. package/dist/store/run/disk.d.ts.map +1 -1
  332. package/dist/store/run/disk.js.map +1 -1
  333. package/dist/store/session/__tests__/disk.test.js.map +1 -1
  334. package/dist/store/session/__tests__/memory.test.js.map +1 -1
  335. package/dist/store/session/disk.d.ts +6 -6
  336. package/dist/store/session/disk.d.ts.map +1 -1
  337. package/dist/store/session/disk.js +1 -1
  338. package/dist/store/session/disk.js.map +1 -1
  339. package/dist/store/session/index.d.ts +1 -1
  340. package/dist/store/session/index.d.ts.map +1 -1
  341. package/dist/store/session/index.js +2 -1
  342. package/dist/store/session/index.js.map +1 -1
  343. package/dist/store/session/linkage.d.ts +1 -1
  344. package/dist/store/session/linkage.d.ts.map +1 -1
  345. package/dist/store/session/memory.d.ts +5 -5
  346. package/dist/store/session/memory.d.ts.map +1 -1
  347. package/dist/store/session/memory.js +1 -1
  348. package/dist/store/session/memory.js.map +1 -1
  349. package/dist/store/thread/disk.d.ts +1 -1
  350. package/dist/store/thread/disk.d.ts.map +1 -1
  351. package/dist/store/thread/memory.d.ts +1 -1
  352. package/dist/store/thread/memory.d.ts.map +1 -1
  353. package/dist/telemetry/attributes.d.ts +0 -1
  354. package/dist/telemetry/attributes.d.ts.map +1 -1
  355. package/dist/telemetry/attributes.js +0 -3
  356. package/dist/telemetry/attributes.js.map +1 -1
  357. package/dist/telemetry/runtime-accessors.d.ts +1 -2
  358. package/dist/telemetry/runtime-accessors.d.ts.map +1 -1
  359. package/dist/telemetry/runtime-accessors.js +1 -4
  360. package/dist/telemetry/runtime-accessors.js.map +1 -1
  361. package/dist/test-setup.d.ts +22 -0
  362. package/dist/test-setup.d.ts.map +1 -0
  363. package/dist/test-setup.js +23 -0
  364. package/dist/test-setup.js.map +1 -0
  365. package/dist/tools/builtins/bash.d.ts +1 -1
  366. package/dist/tools/builtins/computer-use.d.ts +4 -4
  367. package/dist/tools/builtins/edit.d.ts +1 -1
  368. package/dist/tools/builtins/glob.d.ts +1 -1
  369. package/dist/tools/builtins/grep.d.ts +1 -1
  370. package/dist/tools/builtins/ls.d.ts +1 -1
  371. package/dist/tools/builtins/read-file.d.ts +1 -1
  372. package/dist/tools/builtins/search-tools.d.ts +1 -1
  373. package/dist/tools/builtins/write-file.d.ts +1 -1
  374. package/dist/types/agent/task.d.ts +2 -2
  375. package/dist/types/agent/task.d.ts.map +1 -1
  376. package/dist/{session/hierarchy/project.d.ts → types/project/entity.d.ts} +4 -4
  377. package/dist/types/project/entity.d.ts.map +1 -0
  378. package/dist/types/project/entity.js +2 -0
  379. package/dist/types/project/entity.js.map +1 -0
  380. package/dist/types/project/index.d.ts +2 -0
  381. package/dist/types/project/index.d.ts.map +1 -0
  382. package/dist/types/project/index.js +4 -0
  383. package/dist/types/project/index.js.map +1 -0
  384. package/dist/types/retention/archive-backend-ref.d.ts.map +1 -0
  385. package/dist/types/retention/archive-backend-ref.js.map +1 -0
  386. package/dist/types/retention/index.d.ts +4 -0
  387. package/dist/types/retention/index.d.ts.map +1 -0
  388. package/dist/types/retention/index.js +4 -0
  389. package/dist/types/retention/index.js.map +1 -0
  390. package/dist/types/retention/policy.d.ts.map +1 -0
  391. package/dist/types/retention/policy.js.map +1 -0
  392. package/dist/types/run/entity.d.ts +56 -0
  393. package/dist/types/run/entity.d.ts.map +1 -0
  394. package/dist/types/run/entity.js +2 -0
  395. package/dist/types/run/entity.js.map +1 -0
  396. package/dist/types/run/events.d.ts +2 -2
  397. package/dist/types/run/events.d.ts.map +1 -1
  398. package/dist/types/run/index.d.ts +7 -1
  399. package/dist/types/run/index.d.ts.map +1 -1
  400. package/dist/types/run/index.js +8 -9
  401. package/dist/types/run/index.js.map +1 -1
  402. package/dist/{session/hierarchy → types/run}/lineage.d.ts +1 -1
  403. package/dist/types/run/lineage.d.ts.map +1 -0
  404. package/dist/types/run/lineage.js.map +1 -0
  405. package/dist/types/run/replay.d.ts +53 -0
  406. package/dist/types/run/replay.d.ts.map +1 -0
  407. package/dist/types/run/replay.js +15 -0
  408. package/dist/types/run/replay.js.map +1 -0
  409. package/dist/types/run/schema-version.d.ts.map +1 -0
  410. package/dist/types/run/schema-version.js.map +1 -0
  411. package/dist/{session/events/types.d.ts → types/run/subsession-events.d.ts} +5 -5
  412. package/dist/types/run/subsession-events.d.ts.map +1 -0
  413. package/dist/types/run/subsession-events.js +2 -0
  414. package/dist/types/run/subsession-events.js.map +1 -0
  415. package/dist/{session/hierarchy → types/session}/actor.d.ts +1 -1
  416. package/dist/types/session/actor.d.ts.map +1 -0
  417. package/dist/{session/hierarchy → types/session}/actor.js.map +1 -1
  418. package/dist/types/session/entity.d.ts +51 -0
  419. package/dist/types/session/entity.d.ts.map +1 -0
  420. package/dist/types/session/entity.js +2 -0
  421. package/dist/types/session/entity.js.map +1 -0
  422. package/dist/types/session/index.d.ts +4 -0
  423. package/dist/types/session/index.d.ts.map +1 -1
  424. package/dist/{store → types}/session/messages.d.ts +2 -2
  425. package/dist/{store → types}/session/messages.d.ts.map +1 -1
  426. package/dist/types/session/messages.js.map +1 -0
  427. package/dist/types/session/store.d.ts +6 -6
  428. package/dist/types/session/store.d.ts.map +1 -1
  429. package/dist/{session/hierarchy → types/session}/sub-session.d.ts +9 -9
  430. package/dist/types/session/sub-session.d.ts.map +1 -0
  431. package/dist/types/session/sub-session.js.map +1 -0
  432. package/dist/{session → types}/summary/deliverable.d.ts +2 -2
  433. package/dist/types/summary/deliverable.d.ts.map +1 -0
  434. package/dist/types/summary/deliverable.js.map +1 -0
  435. package/dist/types/summary/index.d.ts +4 -0
  436. package/dist/types/summary/index.d.ts.map +1 -0
  437. package/dist/types/summary/index.js +4 -0
  438. package/dist/types/summary/index.js.map +1 -0
  439. package/dist/{session → types}/summary/ref.d.ts +9 -36
  440. package/dist/types/summary/ref.d.ts.map +1 -0
  441. package/dist/types/summary/ref.js +28 -0
  442. package/dist/types/summary/ref.js.map +1 -0
  443. package/dist/{session/hierarchy/tenant.d.ts → types/tenant/entity.d.ts} +2 -2
  444. package/dist/types/tenant/entity.d.ts.map +1 -0
  445. package/dist/types/tenant/entity.js +2 -0
  446. package/dist/types/tenant/entity.js.map +1 -0
  447. package/dist/types/tenant/index.d.ts +2 -0
  448. package/dist/types/tenant/index.d.ts.map +1 -0
  449. package/dist/types/tenant/index.js +4 -0
  450. package/dist/types/tenant/index.js.map +1 -0
  451. package/dist/{session/hierarchy/thread.d.ts → types/thread/entity.d.ts} +31 -7
  452. package/dist/types/thread/entity.d.ts.map +1 -0
  453. package/dist/types/thread/entity.js +2 -0
  454. package/dist/types/thread/entity.js.map +1 -0
  455. package/dist/types/thread/index.d.ts +1 -0
  456. package/dist/types/thread/index.d.ts.map +1 -1
  457. package/dist/types/thread/store.d.ts +1 -1
  458. package/dist/types/thread/store.d.ts.map +1 -1
  459. package/dist/types/workspace/index.d.ts +2 -0
  460. package/dist/types/workspace/index.d.ts.map +1 -0
  461. package/dist/types/workspace/index.js +7 -0
  462. package/dist/types/workspace/index.js.map +1 -0
  463. package/dist/{session → types}/workspace/ref.d.ts +1 -1
  464. package/dist/types/workspace/ref.d.ts.map +1 -0
  465. package/dist/types/workspace/ref.js.map +1 -0
  466. package/dist/utils/logger.d.ts +1 -1
  467. package/dist/utils/logger.d.ts.map +1 -1
  468. package/dist/utils/logger.js +5 -0
  469. package/dist/utils/logger.js.map +1 -1
  470. package/package.json +4 -1
  471. package/src/__tests__/replay-public-surface.test.ts +54 -0
  472. package/src/advisory/context.test.ts +109 -0
  473. package/src/advisory/evaluator.test.ts +192 -0
  474. package/src/advisory/executor.test.ts +272 -0
  475. package/src/advisory/registry.test.ts +75 -0
  476. package/src/agents/SupervisorAgent.ts +1 -1
  477. package/src/bridge/a2a/agent-card.test.ts +140 -0
  478. package/src/bridge/a2a/mapper.test.ts +293 -0
  479. package/src/bridge/a2a/message.test.ts +138 -0
  480. package/src/bridge/a2a/task.test.ts +235 -0
  481. package/src/bridge/a2a/task.ts +4 -4
  482. package/src/bridge/mcp/connector/adapter.test.ts +230 -0
  483. package/src/bridge/sse/mapper.test.ts +422 -0
  484. package/src/bridge/tools/connector/adapter.test.ts +224 -0
  485. package/src/bridge/tools/connector/definitions.test.ts +183 -0
  486. package/src/bridge/tools/connector/router.test.ts +159 -0
  487. package/src/bus/breaker.test.ts +274 -0
  488. package/src/bus/index.test.ts +183 -0
  489. package/src/bus/lock.test.ts +265 -0
  490. package/src/bus/ownership.test.ts +243 -0
  491. package/src/config/runtime.ts +0 -2
  492. package/src/connector/BaseConnector.test.ts +130 -0
  493. package/src/connector/builtins/http.test.ts +290 -0
  494. package/src/connector/builtins/webhook.test.ts +138 -0
  495. package/src/connector/execution/factory.test.ts +75 -0
  496. package/src/connector/execution/remote.test.ts +63 -0
  497. package/src/connector/mcp/adapter.test.ts +249 -0
  498. package/src/contracts/api.ts +2 -2
  499. package/src/contracts/index.ts +1 -3
  500. package/src/index.ts +11 -362
  501. package/src/manager/agent/__tests__/lifecycle.test.ts +2 -2
  502. package/src/manager/agent/lifecycle.ts +5 -5
  503. package/src/manager/run/persistence.ts +4 -4
  504. package/src/manager/thread/__tests__/lifecycle.test.ts +1 -1
  505. package/src/manager/thread/lifecycle.ts +2 -2
  506. package/src/plugin/loader.ts +0 -16
  507. package/src/public-runtime.ts +373 -0
  508. package/src/public-tools.ts +63 -0
  509. package/src/public-types.ts +156 -0
  510. package/src/rag/chunking.test.ts +107 -0
  511. package/src/rag/context-assembler.test.ts +114 -0
  512. package/src/rag/embedding.test.ts +130 -0
  513. package/src/rag/ingestion.test.ts +114 -0
  514. package/src/rag/knowledge-base.test.ts +106 -0
  515. package/src/rag/rag-tool.test.ts +167 -0
  516. package/src/rag/retriever.test.ts +210 -0
  517. package/src/rag/vector-store.test.ts +196 -0
  518. package/src/registry/ManagedRegistry.test.ts +118 -0
  519. package/src/registry/Registry.test.ts +91 -0
  520. package/src/registry/agent/definitions.test.ts +100 -0
  521. package/src/registry/connector/definitions.test.ts +51 -0
  522. package/src/registry/connector/scoped.test.ts +129 -0
  523. package/src/registry/plugin/index.test.ts +85 -0
  524. package/src/registry/tool/execute.test.ts +330 -0
  525. package/src/run/LimitChecker.ts +0 -9
  526. package/src/run/reporter.ts +3 -3
  527. package/src/runtime/query/__tests__/checkpoint.test.ts +169 -0
  528. package/src/runtime/query/checkpoint.ts +54 -0
  529. package/src/runtime/query/context.ts +0 -5
  530. package/src/runtime/query/index.ts +4 -4
  531. package/src/runtime/query/iteration/phases/advisory.test.ts +412 -0
  532. package/src/runtime/query/replay/__tests__/mutate.test.ts +134 -0
  533. package/src/runtime/query/replay/__tests__/prepare.test.ts +207 -0
  534. package/src/runtime/query/replay/list.ts +32 -0
  535. package/src/runtime/query/replay/mutate.ts +76 -0
  536. package/src/runtime/query/replay/prepare.ts +114 -0
  537. package/src/runtime/query/result.ts +2 -2
  538. package/src/session/__tests__/integration/_fixtures.ts +2 -2
  539. package/src/session/__tests__/integration/archive-gate.test.ts +1 -1
  540. package/src/session/__tests__/integration/capacity-caps.test.ts +1 -1
  541. package/src/session/__tests__/integration/e2e-spawn.test.ts +1 -1
  542. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +1 -1
  543. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +1 -1
  544. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +4 -1
  545. package/src/session/__tests__/integration/retention-archive.test.ts +1 -1
  546. package/src/session/__tests__/integration/spawn-rollback.test.ts +2 -2
  547. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +1 -1
  548. package/src/session/errors.ts +1 -1
  549. package/src/session/events/index.ts +5 -4
  550. package/src/session/handoff/__tests__/broadcast.test.ts +1 -1
  551. package/src/session/handoff/__tests__/capacity.test.ts +1 -1
  552. package/src/session/handoff/__tests__/single.test.ts +1 -1
  553. package/src/session/handoff/assignment.ts +1 -1
  554. package/src/session/handoff/broadcast.ts +2 -2
  555. package/src/session/handoff/single.ts +2 -2
  556. package/src/session/index.ts +7 -6
  557. package/src/session/intervention/__tests__/prev-artifact.test.ts +4 -1
  558. package/src/session/intervention/prev-artifact.ts +1 -1
  559. package/src/session/retention/__tests__/archive.test.ts +3 -3
  560. package/src/session/retention/__tests__/disk-backend.test.ts +4 -4
  561. package/src/session/retention/archive.ts +2 -2
  562. package/src/session/retention/backend.ts +4 -4
  563. package/src/session/retention/disk-backend.ts +4 -4
  564. package/src/session/retention/index.ts +6 -4
  565. package/src/session/{hierarchy/__tests__/session.test.ts → status/__tests__/derive.test.ts} +3 -2
  566. package/src/session/{hierarchy/session.ts → status/derive.ts} +9 -55
  567. package/src/session/summary/__tests__/materialize.test.ts +4 -7
  568. package/src/session/summary/errors.ts +51 -0
  569. package/src/session/summary/index.ts +7 -10
  570. package/src/session/summary/materialize.ts +4 -5
  571. package/src/session/workspace/__tests__/git-worktree.test.ts +1 -1
  572. package/src/session/workspace/driver.ts +2 -2
  573. package/src/session/workspace/git-worktree.ts +1 -1
  574. package/src/session/workspace/index.ts +7 -6
  575. package/src/store/run/disk.ts +4 -4
  576. package/src/store/session/__tests__/disk.test.ts +2 -2
  577. package/src/store/session/__tests__/memory.test.ts +2 -2
  578. package/src/store/session/disk.ts +12 -12
  579. package/src/store/session/index.ts +3 -2
  580. package/src/store/session/linkage.ts +1 -1
  581. package/src/store/session/memory.ts +6 -6
  582. package/src/store/thread/disk.ts +1 -1
  583. package/src/store/thread/memory.ts +1 -1
  584. package/src/telemetry/attributes.ts +0 -4
  585. package/src/telemetry/runtime-accessors.ts +1 -5
  586. package/src/test-setup.ts +24 -0
  587. package/src/types/agent/task.ts +2 -2
  588. package/src/{session/hierarchy/project.ts → types/project/entity.ts} +3 -3
  589. package/src/types/project/index.ts +4 -0
  590. package/src/types/retention/index.ts +6 -0
  591. package/src/types/run/entity.ts +63 -0
  592. package/src/types/run/events.ts +6 -6
  593. package/src/types/run/index.ts +16 -9
  594. package/src/{session/hierarchy → types/run}/lineage.ts +1 -1
  595. package/src/types/run/replay.ts +61 -0
  596. package/src/{session/events/types.ts → types/run/subsession-events.ts} +4 -4
  597. package/src/{session/hierarchy → types/session}/actor.ts +1 -1
  598. package/src/types/session/entity.ts +59 -0
  599. package/src/types/session/index.ts +15 -0
  600. package/src/{store → types}/session/messages.ts +2 -2
  601. package/src/types/session/store.ts +6 -6
  602. package/src/{session/hierarchy → types/session}/sub-session.ts +9 -9
  603. package/src/{session → types}/summary/deliverable.ts +2 -2
  604. package/src/types/summary/index.ts +18 -0
  605. package/src/{session → types}/summary/ref.ts +9 -44
  606. package/src/{session/hierarchy/tenant.ts → types/tenant/entity.ts} +1 -1
  607. package/src/types/tenant/index.ts +4 -0
  608. package/src/{session/hierarchy/thread.ts → types/thread/entity.ts} +30 -6
  609. package/src/types/thread/index.ts +1 -0
  610. package/src/types/thread/store.ts +1 -1
  611. package/src/types/workspace/index.ts +12 -0
  612. package/src/{session → types}/workspace/ref.ts +1 -1
  613. package/src/utils/logger.ts +6 -1
  614. package/dist/contracts/ids.d.ts +0 -2
  615. package/dist/contracts/ids.d.ts.map +0 -1
  616. package/dist/contracts/ids.js +0 -2
  617. package/dist/contracts/ids.js.map +0 -1
  618. package/dist/session/events/schema-version.d.ts.map +0 -1
  619. package/dist/session/events/schema-version.js.map +0 -1
  620. package/dist/session/events/types.d.ts.map +0 -1
  621. package/dist/session/events/types.js +0 -2
  622. package/dist/session/events/types.js.map +0 -1
  623. package/dist/session/hierarchy/__tests__/session.test.d.ts +0 -2
  624. package/dist/session/hierarchy/__tests__/session.test.d.ts.map +0 -1
  625. package/dist/session/hierarchy/__tests__/session.test.js.map +0 -1
  626. package/dist/session/hierarchy/actor.d.ts.map +0 -1
  627. package/dist/session/hierarchy/index.d.ts +0 -9
  628. package/dist/session/hierarchy/index.d.ts.map +0 -1
  629. package/dist/session/hierarchy/index.js +0 -4
  630. package/dist/session/hierarchy/index.js.map +0 -1
  631. package/dist/session/hierarchy/lineage.d.ts.map +0 -1
  632. package/dist/session/hierarchy/lineage.js.map +0 -1
  633. package/dist/session/hierarchy/project.d.ts.map +0 -1
  634. package/dist/session/hierarchy/project.js +0 -2
  635. package/dist/session/hierarchy/project.js.map +0 -1
  636. package/dist/session/hierarchy/session.d.ts +0 -71
  637. package/dist/session/hierarchy/session.d.ts.map +0 -1
  638. package/dist/session/hierarchy/session.js.map +0 -1
  639. package/dist/session/hierarchy/sub-session.d.ts.map +0 -1
  640. package/dist/session/hierarchy/sub-session.js.map +0 -1
  641. package/dist/session/hierarchy/tenant.d.ts.map +0 -1
  642. package/dist/session/hierarchy/tenant.js +0 -2
  643. package/dist/session/hierarchy/tenant.js.map +0 -1
  644. package/dist/session/hierarchy/thread.d.ts.map +0 -1
  645. package/dist/session/hierarchy/thread.js +0 -2
  646. package/dist/session/hierarchy/thread.js.map +0 -1
  647. package/dist/session/retention/archive-backend-ref.d.ts.map +0 -1
  648. package/dist/session/retention/archive-backend-ref.js.map +0 -1
  649. package/dist/session/retention/policy.d.ts.map +0 -1
  650. package/dist/session/retention/policy.js.map +0 -1
  651. package/dist/session/summary/deliverable.d.ts.map +0 -1
  652. package/dist/session/summary/deliverable.js.map +0 -1
  653. package/dist/session/summary/ref.d.ts.map +0 -1
  654. package/dist/session/summary/ref.js +0 -51
  655. package/dist/session/summary/ref.js.map +0 -1
  656. package/dist/session/workspace/ref.d.ts.map +0 -1
  657. package/dist/session/workspace/ref.js.map +0 -1
  658. package/dist/store/session/messages.js.map +0 -1
  659. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +0 -140
  660. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts.map +0 -1
  661. package/dist/tools/builtins/__tests__/structuredOutput.example.js +0 -183
  662. package/dist/tools/builtins/__tests__/structuredOutput.example.js.map +0 -1
  663. package/dist/types/run/state.d.ts +0 -30
  664. package/dist/types/run/state.d.ts.map +0 -1
  665. package/dist/types/run/state.js +0 -2
  666. package/dist/types/run/state.js.map +0 -1
  667. package/src/contracts/ids.ts +0 -1
  668. package/src/session/hierarchy/index.ts +0 -18
  669. package/src/tools/builtins/__tests__/structuredOutput.example.ts +0 -221
  670. package/src/types/run/state.ts +0 -35
  671. /package/dist/{session → types}/retention/archive-backend-ref.d.ts +0 -0
  672. /package/dist/{session → types}/retention/archive-backend-ref.js +0 -0
  673. /package/dist/{session → types}/retention/policy.d.ts +0 -0
  674. /package/dist/{session → types}/retention/policy.js +0 -0
  675. /package/dist/{session/hierarchy → types/run}/lineage.js +0 -0
  676. /package/dist/{session/events → types/run}/schema-version.d.ts +0 -0
  677. /package/dist/{session/events → types/run}/schema-version.js +0 -0
  678. /package/dist/{session/hierarchy → types/session}/actor.js +0 -0
  679. /package/dist/{store → types}/session/messages.js +0 -0
  680. /package/dist/{session/hierarchy → types/session}/sub-session.js +0 -0
  681. /package/dist/{session → types}/summary/deliverable.js +0 -0
  682. /package/dist/{session → types}/workspace/ref.js +0 -0
  683. /package/src/{session → types}/retention/archive-backend-ref.ts +0 -0
  684. /package/src/{session → types}/retention/policy.ts +0 -0
  685. /package/src/{session/events → types/run}/schema-version.ts +0 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 6):
3
+ *
4
+ * - `AdvisoryContext` composes a registry + executor + evaluator +
5
+ * optional budget. It is a dumb container + a call-history log.
6
+ * - `recordCall(record)` appends to `callHistory` in call order.
7
+ * - `getBudgetStatus()`:
8
+ * - `used` = `callHistory.length`.
9
+ * - `total` = `budget?.maxCallsPerRun` (undefined when no budget).
10
+ * - `remaining` = total − used when total defined; undefined else.
11
+ * - `checkBudget()`:
12
+ * - Allowed when no budget OR remaining > 0.
13
+ * - Denied with reason when remaining ≤ 0.
14
+ */
15
+
16
+ import { describe, expect, it } from 'vitest'
17
+
18
+ import type { AdvisoryCallRecord } from '../types/advisory/index.js'
19
+
20
+ import { AdvisoryContext } from './context.js'
21
+ import type { TriggerEvaluator } from './evaluator.js'
22
+ import type { AdvisoryExecutor } from './executor.js'
23
+ import type { AdvisorRegistry } from './registry.js'
24
+
25
+ function stubRegistry(): AdvisorRegistry {
26
+ return {} as unknown as AdvisorRegistry
27
+ }
28
+
29
+ function stubExecutor(): AdvisoryExecutor {
30
+ return {} as unknown as AdvisoryExecutor
31
+ }
32
+
33
+ function stubEvaluator(): TriggerEvaluator {
34
+ return {} as unknown as TriggerEvaluator
35
+ }
36
+
37
+ function callRecord(id: string): AdvisoryCallRecord {
38
+ return {
39
+ advisorId: id,
40
+ request: { question: 'q' },
41
+ result: { advice: 'a' },
42
+ usage: {
43
+ promptTokens: 0,
44
+ completionTokens: 0,
45
+ totalTokens: 0,
46
+ cachedTokens: 0,
47
+ cacheWriteTokens: 0,
48
+ },
49
+ cost: { inputCostPer1M: 0, outputCostPer1M: 0, totalCost: 0, cacheDiscount: 0 },
50
+ durationMs: 0,
51
+ iteration: 0,
52
+ timestamp: Date.now(),
53
+ }
54
+ }
55
+
56
+ describe('AdvisoryContext', () => {
57
+ it('starts with empty callHistory', () => {
58
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator())
59
+ expect(ctx.callHistory).toEqual([])
60
+ })
61
+
62
+ it('recordCall appends in order', () => {
63
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator())
64
+ ctx.recordCall(callRecord('a'))
65
+ ctx.recordCall(callRecord('b'))
66
+ expect(ctx.callHistory.map((r) => r.advisorId)).toEqual(['a', 'b'])
67
+ })
68
+
69
+ describe('getBudgetStatus', () => {
70
+ it('no budget → total + remaining undefined; used reflects history length', () => {
71
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator())
72
+ ctx.recordCall(callRecord('a'))
73
+ expect(ctx.getBudgetStatus()).toEqual({ used: 1, total: undefined, remaining: undefined })
74
+ })
75
+
76
+ it('with budget → total + remaining computed', () => {
77
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator(), {
78
+ maxCallsPerRun: 3,
79
+ })
80
+ ctx.recordCall(callRecord('a'))
81
+ expect(ctx.getBudgetStatus()).toEqual({ used: 1, total: 3, remaining: 2 })
82
+ })
83
+ })
84
+
85
+ describe('checkBudget', () => {
86
+ it('allowed when no budget', () => {
87
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator())
88
+ expect(ctx.checkBudget()).toEqual({ allowed: true })
89
+ })
90
+
91
+ it('allowed when remaining > 0', () => {
92
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator(), {
93
+ maxCallsPerRun: 2,
94
+ })
95
+ ctx.recordCall(callRecord('a'))
96
+ expect(ctx.checkBudget()).toEqual({ allowed: true })
97
+ })
98
+
99
+ it('denied when remaining <= 0', () => {
100
+ const ctx = new AdvisoryContext(stubRegistry(), stubExecutor(), stubEvaluator(), {
101
+ maxCallsPerRun: 1,
102
+ })
103
+ ctx.recordCall(callRecord('a'))
104
+ const result = ctx.checkBudget()
105
+ expect(result.allowed).toBe(false)
106
+ expect(result.reason).toMatch(/budget exhausted/)
107
+ })
108
+ })
109
+ })
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 6):
3
+ *
4
+ * - Constructor filters OUT triggers with `enabled: false` + sorts
5
+ * by `priority` desc (higher first). Triggers without priority
6
+ * sort at 0.
7
+ * - `evaluate(state)` returns every trigger whose condition matches
8
+ * AND whose cooldown has elapsed. Order reflects the sorted
9
+ * trigger list.
10
+ * - Budget exhausted (callCount ≥ maxCallsPerRun) → evaluate returns [].
11
+ * - `recordFiring(id, iteration)` updates both `lastFiredMap` (for
12
+ * cooldown) and `callCount` (for budget).
13
+ * - Condition matchers:
14
+ * - `on_error`: matches iff state.lastError is set; if categories
15
+ * are given, requires at least one category substring match.
16
+ * - `on_iteration`: `state.iteration % everyN === 0`.
17
+ * - `on_context_percent`: `state.contextWindowPercent >= threshold`.
18
+ * - `on_tool_category`: `state.lastToolCategory` present + in
19
+ * `condition.categories`.
20
+ * - `on_cost_percent`: costBudgetPercent present + ≥ threshold.
21
+ * - `on_complexity`: totalToolCalls ≥ toolCallThreshold.
22
+ * - `custom`: calls the predicate.
23
+ * - Cooldown: trigger does NOT fire if `iteration - lastFired <
24
+ * cooldownIterations`. No cooldown → always eligible.
25
+ *
26
+ * - **Purity:** evaluate() is pure relative to the advisory phase —
27
+ * it returns triggers; it does NOT inject messages or mutate
28
+ * external state. The injection happens in the advisory phase
29
+ * (runtime/query/iteration/phases/advisory.ts), which pushes a
30
+ * user message via `runMgr.pushMessage`. That file is OUT of
31
+ * scope for this test file (covered by the phase test).
32
+ */
33
+
34
+ import { describe, expect, it, vi } from 'vitest'
35
+
36
+ import type { AdvisoryTrigger, TriggerEvaluationState } from '../types/advisory/index.js'
37
+
38
+ import { TriggerEvaluator } from './evaluator.js'
39
+
40
+ function trigger(id: string, overrides: Partial<AdvisoryTrigger> = {}): AdvisoryTrigger {
41
+ return {
42
+ id,
43
+ condition: { type: 'on_iteration', everyN: 1 },
44
+ ...overrides,
45
+ }
46
+ }
47
+
48
+ function state(overrides: Partial<TriggerEvaluationState> = {}): TriggerEvaluationState {
49
+ return {
50
+ iteration: 1,
51
+ totalToolCalls: 0,
52
+ totalTokens: 0,
53
+ contextWindowPercent: 0,
54
+ totalCostUsd: 0,
55
+ costBudgetPercent: undefined,
56
+ lastError: undefined,
57
+ lastToolCategory: undefined,
58
+ advisoryCallCount: 0,
59
+ ...overrides,
60
+ }
61
+ }
62
+
63
+ describe('TriggerEvaluator — constructor', () => {
64
+ it('filters out triggers with enabled: false', () => {
65
+ const e = new TriggerEvaluator([trigger('a'), trigger('b', { enabled: false })])
66
+ expect(e.evaluate(state()).map((t) => t.id)).toEqual(['a'])
67
+ })
68
+
69
+ it('sorts triggers by priority descending', () => {
70
+ const e = new TriggerEvaluator([
71
+ trigger('low', { priority: 1 }),
72
+ trigger('high', { priority: 10 }),
73
+ trigger('mid', { priority: 5 }),
74
+ ])
75
+ expect(e.evaluate(state()).map((t) => t.id)).toEqual(['high', 'mid', 'low'])
76
+ })
77
+ })
78
+
79
+ describe('TriggerEvaluator — budget', () => {
80
+ it('returns [] when callCount >= maxCallsPerRun', () => {
81
+ const e = new TriggerEvaluator([trigger('a')], { maxCallsPerRun: 1 })
82
+ e.recordFiring('a', 1)
83
+ expect(e.evaluate(state({ iteration: 2 }))).toEqual([])
84
+ })
85
+
86
+ it('ignores budget when maxCallsPerRun is not set', () => {
87
+ const e = new TriggerEvaluator([trigger('a')])
88
+ e.recordFiring('a', 1)
89
+ e.recordFiring('a', 2)
90
+ expect(e.evaluate(state({ iteration: 3 })).length).toBeGreaterThan(0)
91
+ })
92
+ })
93
+
94
+ describe('TriggerEvaluator — cooldown', () => {
95
+ it('blocks triggers in their cooldown window', () => {
96
+ const e = new TriggerEvaluator([trigger('a', { cooldownIterations: 3 })])
97
+ e.recordFiring('a', 1)
98
+ expect(e.evaluate(state({ iteration: 2 })).map((t) => t.id)).toEqual([])
99
+ expect(e.evaluate(state({ iteration: 3 })).map((t) => t.id)).toEqual([])
100
+ expect(e.evaluate(state({ iteration: 4 })).map((t) => t.id)).toEqual(['a'])
101
+ })
102
+
103
+ it('always fires when no cooldown is configured', () => {
104
+ const e = new TriggerEvaluator([trigger('a')])
105
+ e.recordFiring('a', 1)
106
+ expect(e.evaluate(state({ iteration: 2 })).map((t) => t.id)).toEqual(['a'])
107
+ })
108
+ })
109
+
110
+ describe('TriggerEvaluator — condition matchers', () => {
111
+ it('on_error: requires lastError to be set', () => {
112
+ const e = new TriggerEvaluator([trigger('t', { condition: { type: 'on_error' } })])
113
+ expect(e.evaluate(state())).toEqual([])
114
+ expect(e.evaluate(state({ lastError: 'boom' })).map((t) => t.id)).toEqual(['t'])
115
+ })
116
+
117
+ it('on_error with categories: at least one substring match', () => {
118
+ const e = new TriggerEvaluator([
119
+ trigger('t', { condition: { type: 'on_error', categories: ['timeout', 'permission'] } }),
120
+ ])
121
+ expect(e.evaluate(state({ lastError: 'Connection timeout' })).map((t) => t.id)).toEqual(['t'])
122
+ expect(e.evaluate(state({ lastError: 'Syntax error' }))).toEqual([])
123
+ })
124
+
125
+ it('on_iteration: iteration % everyN === 0', () => {
126
+ const e = new TriggerEvaluator([
127
+ trigger('t', { condition: { type: 'on_iteration', everyN: 3 } }),
128
+ ])
129
+ expect(e.evaluate(state({ iteration: 1 }))).toEqual([])
130
+ expect(e.evaluate(state({ iteration: 3 })).map((t) => t.id)).toEqual(['t'])
131
+ expect(e.evaluate(state({ iteration: 6 })).map((t) => t.id)).toEqual(['t'])
132
+ })
133
+
134
+ it('on_context_percent: contextWindowPercent >= threshold', () => {
135
+ const e = new TriggerEvaluator([
136
+ trigger('t', { condition: { type: 'on_context_percent', threshold: 80 } }),
137
+ ])
138
+ expect(e.evaluate(state({ contextWindowPercent: 70 }))).toEqual([])
139
+ expect(e.evaluate(state({ contextWindowPercent: 80 })).map((t) => t.id)).toEqual(['t'])
140
+ })
141
+
142
+ it('on_tool_category: lastToolCategory present + in categories list', () => {
143
+ const e = new TriggerEvaluator([
144
+ trigger('t', {
145
+ condition: { type: 'on_tool_category', categories: ['network', 'filesystem'] },
146
+ }),
147
+ ])
148
+ expect(e.evaluate(state())).toEqual([])
149
+ expect(e.evaluate(state({ lastToolCategory: 'other' }))).toEqual([])
150
+ expect(e.evaluate(state({ lastToolCategory: 'network' })).map((t) => t.id)).toEqual(['t'])
151
+ })
152
+
153
+ it('on_cost_percent: costBudgetPercent present + >= threshold', () => {
154
+ const e = new TriggerEvaluator([
155
+ trigger('t', { condition: { type: 'on_cost_percent', threshold: 75 } }),
156
+ ])
157
+ expect(e.evaluate(state())).toEqual([]) // undefined costBudgetPercent
158
+ expect(e.evaluate(state({ costBudgetPercent: 50 }))).toEqual([])
159
+ expect(e.evaluate(state({ costBudgetPercent: 80 })).map((t) => t.id)).toEqual(['t'])
160
+ })
161
+
162
+ it('on_complexity: totalToolCalls >= toolCallThreshold', () => {
163
+ const e = new TriggerEvaluator([
164
+ trigger('t', { condition: { type: 'on_complexity', toolCallThreshold: 10 } }),
165
+ ])
166
+ expect(e.evaluate(state({ totalToolCalls: 5 }))).toEqual([])
167
+ expect(e.evaluate(state({ totalToolCalls: 10 })).map((t) => t.id)).toEqual(['t'])
168
+ })
169
+
170
+ it('custom: calls the predicate with state', () => {
171
+ const predicate = vi.fn(() => true)
172
+ const e = new TriggerEvaluator([trigger('t', { condition: { type: 'custom', predicate } })])
173
+ const s = state({ iteration: 42 })
174
+ expect(e.evaluate(s).map((t) => t.id)).toEqual(['t'])
175
+ expect(predicate).toHaveBeenCalledWith(s)
176
+ })
177
+ })
178
+
179
+ describe('TriggerEvaluator — recordFiring', () => {
180
+ it('updates lastFiredMap + callCount', () => {
181
+ const e = new TriggerEvaluator([trigger('a', { cooldownIterations: 5 })], {
182
+ maxCallsPerRun: 2,
183
+ })
184
+ e.recordFiring('a', 1)
185
+ // cooldown active: no fires in iterations 2–5
186
+ expect(e.evaluate(state({ iteration: 2 }))).toEqual([])
187
+ // cooldown lifted at 6, but budget allows one more
188
+ e.recordFiring('a', 6)
189
+ // budget exhausted
190
+ expect(e.evaluate(state({ iteration: 11 }))).toEqual([])
191
+ })
192
+ })
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 6):
3
+ *
4
+ * - `AdvisoryExecutor.consult(advisor, request, callCtx)`:
5
+ * - Builds a system prompt (see buildSystemPrompt tests).
6
+ * - Builds a context message block (see buildContext tests).
7
+ * - Concatenates `[system, ...context, user(question)]` and calls
8
+ * `advisor.provider.chat(...)` with `toolChoice: 'none'`.
9
+ * - Parses the response via a passthrough `{ advice: rawContent }`
10
+ * shape (no structured parsing yet — advisor.ts line 166-168).
11
+ * - Returns `{result, usage, cost, durationMs}`. `cost` is a
12
+ * zero-value `CostInfo` — pricing is provider-specific and not
13
+ * applied here.
14
+ *
15
+ * - `buildSystemPrompt` priority:
16
+ * 1. `advisor.systemPrompt` (verbatim).
17
+ * 2. `advisor.persona` (via `assembleSystemPrompt`).
18
+ * 3. Fallback: "You are <name>, an advisory agent." + optional
19
+ * domains line + "Provide concise, actionable advice..."
20
+ *
21
+ * - `buildContext`:
22
+ * - Returns [] when `request.includeContext === false`.
23
+ * - Includes workingStateSummary when present.
24
+ * - Includes toolCatalog names when present + non-empty.
25
+ * - Includes truncated conversation context (most-recent-first
26
+ * walk, bounded by `advisor.maxContextTokens * CHARS_PER_TOKEN`).
27
+ * - Returns [] when no context parts were assembled.
28
+ *
29
+ * - `truncateMessages(msgs, maxTokens)` walks right-to-left and
30
+ * includes messages until the char budget is exhausted (in token
31
+ * terms). Returns the included subset preserving original order.
32
+ * No limit when `maxTokens` is undefined.
33
+ */
34
+
35
+ import { describe, expect, it, vi } from 'vitest'
36
+
37
+ import type { AdvisorDefinition } from '../types/advisory/config.js'
38
+ import type { AdvisoryRequest } from '../types/advisory/result.js'
39
+ import type { Message } from '../types/message/index.js'
40
+ import type {
41
+ ChatCompletionParams,
42
+ ChatCompletionResponse,
43
+ LLMProvider,
44
+ } from '../types/provider/index.js'
45
+
46
+ import { type AdvisoryCallContext, AdvisoryExecutor } from './executor.js'
47
+
48
+ function mockProvider(response: Partial<ChatCompletionResponse> = {}): LLMProvider {
49
+ const chat = vi.fn<(p: ChatCompletionParams) => Promise<ChatCompletionResponse>>(async () => ({
50
+ id: 'resp_1',
51
+ model: 'm',
52
+ message: { role: 'assistant', content: 'advice text' },
53
+ usage: {
54
+ promptTokens: 100,
55
+ completionTokens: 50,
56
+ totalTokens: 150,
57
+ cachedTokens: 0,
58
+ cacheWriteTokens: 0,
59
+ },
60
+ finishReason: 'stop',
61
+ ...response,
62
+ }))
63
+ return {
64
+ id: 'mock',
65
+ name: 'Mock',
66
+ chat,
67
+ chatStream: vi.fn(),
68
+ } as unknown as LLMProvider
69
+ }
70
+
71
+ function advisor(overrides: Partial<AdvisorDefinition> = {}): AdvisorDefinition {
72
+ return {
73
+ id: 'adv',
74
+ name: 'Adv',
75
+ provider: mockProvider(),
76
+ model: 'm',
77
+ ...overrides,
78
+ }
79
+ }
80
+
81
+ function ctx(overrides: Partial<AdvisoryCallContext> = {}): AdvisoryCallContext {
82
+ return {
83
+ messages: [],
84
+ iteration: 1,
85
+ ...overrides,
86
+ }
87
+ }
88
+
89
+ const req: AdvisoryRequest = { question: 'what next?' }
90
+
91
+ describe('AdvisoryExecutor — consult happy path', () => {
92
+ it('calls provider.chat with system + question, toolChoice none', async () => {
93
+ const provider = mockProvider()
94
+ const e = new AdvisoryExecutor()
95
+ const a = advisor({ provider, systemPrompt: 'You are Adv.' })
96
+ await e.consult(a, req, ctx())
97
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
98
+ expect(call.model).toBe('m')
99
+ expect(call.toolChoice).toBe('none')
100
+ const roles = call.messages.map((m) => m.role)
101
+ expect(roles[0]).toBe('system')
102
+ expect(roles.at(-1)).toBe('user')
103
+ })
104
+
105
+ it('returns {result, usage, cost, durationMs}; cost is zero-valued', async () => {
106
+ const e = new AdvisoryExecutor()
107
+ const out = await e.consult(advisor(), req, ctx())
108
+ expect(out.result.advice).toBe('advice text')
109
+ expect(out.usage.totalTokens).toBe(150)
110
+ expect(out.cost).toEqual({
111
+ inputCostPer1M: 0,
112
+ outputCostPer1M: 0,
113
+ totalCost: 0,
114
+ cacheDiscount: 0,
115
+ })
116
+ expect(typeof out.durationMs).toBe('number')
117
+ })
118
+
119
+ it('parseResult is currently a passthrough — advice = content verbatim', async () => {
120
+ const provider = mockProvider({
121
+ message: { role: 'assistant', content: 'Raw text with **markdown**' },
122
+ })
123
+ const e = new AdvisoryExecutor()
124
+ const out = await e.consult(advisor({ provider }), req, ctx())
125
+ expect(out.result.advice).toBe('Raw text with **markdown**')
126
+ })
127
+
128
+ it('handles null provider content as empty string', async () => {
129
+ const provider = mockProvider({
130
+ message: { role: 'assistant', content: null },
131
+ })
132
+ const e = new AdvisoryExecutor()
133
+ const out = await e.consult(advisor({ provider }), req, ctx())
134
+ expect(out.result.advice).toBe('')
135
+ })
136
+ })
137
+
138
+ describe('AdvisoryExecutor — buildSystemPrompt', () => {
139
+ it('uses advisor.systemPrompt verbatim when set', async () => {
140
+ const provider = mockProvider()
141
+ const e = new AdvisoryExecutor()
142
+ await e.consult(advisor({ provider, systemPrompt: 'FIXED PROMPT' }), req, ctx())
143
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
144
+ expect(call.messages[0]?.content).toBe('FIXED PROMPT')
145
+ })
146
+
147
+ it('falls back to name + domains + boilerplate when no systemPrompt or persona', async () => {
148
+ const provider = mockProvider()
149
+ const e = new AdvisoryExecutor()
150
+ await e.consult(
151
+ advisor({ provider, name: 'Architect', domains: ['security', 'performance'] }),
152
+ req,
153
+ ctx(),
154
+ )
155
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
156
+ const systemContent = call.messages[0]?.content ?? ''
157
+ expect(systemContent).toContain('Architect')
158
+ expect(systemContent).toContain('security, performance')
159
+ expect(systemContent).toContain('concise, actionable advice')
160
+ })
161
+
162
+ it('fallback without domains omits the domains line', async () => {
163
+ const provider = mockProvider()
164
+ const e = new AdvisoryExecutor()
165
+ await e.consult(advisor({ provider, name: 'Adv' }), req, ctx())
166
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
167
+ const systemContent = call.messages[0]?.content ?? ''
168
+ expect(systemContent).not.toContain('domains of expertise')
169
+ })
170
+ })
171
+
172
+ describe('AdvisoryExecutor — buildContext', () => {
173
+ it('returns no context message when request.includeContext is false', async () => {
174
+ const provider = mockProvider()
175
+ const e = new AdvisoryExecutor()
176
+ await e.consult(
177
+ advisor({ provider }),
178
+ { question: 'q', includeContext: false },
179
+ ctx({ workingStateSummary: 'should be ignored' }),
180
+ )
181
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
182
+ // Only system + user(question)
183
+ expect(call.messages).toHaveLength(2)
184
+ })
185
+
186
+ it('includes workingStateSummary + toolCatalog names when present', async () => {
187
+ const provider = mockProvider()
188
+ const e = new AdvisoryExecutor()
189
+ await e.consult(advisor({ provider }), req, {
190
+ messages: [],
191
+ iteration: 1,
192
+ workingStateSummary: 'state summary here',
193
+ toolCatalog: [
194
+ {
195
+ type: 'function',
196
+ function: { name: 'read_file', description: 'read', parameters: {} },
197
+ },
198
+ {
199
+ type: 'function',
200
+ function: { name: 'write_file', description: 'write', parameters: {} },
201
+ },
202
+ ],
203
+ })
204
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
205
+ const contextMsg = call.messages[1]?.content ?? ''
206
+ expect(contextMsg).toContain('Working State')
207
+ expect(contextMsg).toContain('state summary here')
208
+ expect(contextMsg).toContain('Available Tools')
209
+ expect(contextMsg).toContain('read_file, write_file')
210
+ })
211
+
212
+ it('includes conversation context (no truncation when no maxContextTokens)', async () => {
213
+ const provider = mockProvider()
214
+ const messages: Message[] = [
215
+ { role: 'user', content: 'hi' },
216
+ { role: 'assistant', content: 'hello' },
217
+ ]
218
+ const e = new AdvisoryExecutor()
219
+ await e.consult(advisor({ provider }), req, ctx({ messages }))
220
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
221
+ const contextMsg = call.messages[1]?.content ?? ''
222
+ expect(contextMsg).toContain('Conversation Context')
223
+ expect(contextMsg).toContain('[user]: hi')
224
+ expect(contextMsg).toContain('[assistant]: hello')
225
+ })
226
+
227
+ it('truncates conversation from the back when maxContextTokens is set', async () => {
228
+ const provider = mockProvider()
229
+ const messages: Message[] = [
230
+ { role: 'user', content: 'a'.repeat(100) }, // oldest — should be dropped
231
+ { role: 'user', content: 'recent' },
232
+ ]
233
+ const e = new AdvisoryExecutor()
234
+ // maxContextTokens=5 → 5*4=20 char budget; only 'recent' (6 chars) fits.
235
+ await e.consult(advisor({ provider, maxContextTokens: 5 }), req, ctx({ messages }))
236
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
237
+ const contextMsg = call.messages[1]?.content ?? ''
238
+ expect(contextMsg).toContain('recent')
239
+ expect(contextMsg).not.toContain('a'.repeat(100))
240
+ })
241
+
242
+ it('omits the context message entirely when there are no context parts', async () => {
243
+ const provider = mockProvider()
244
+ const e = new AdvisoryExecutor()
245
+ await e.consult(advisor({ provider }), req, ctx())
246
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
247
+ expect(call.messages).toHaveLength(2)
248
+ })
249
+ })
250
+
251
+ describe('AdvisoryExecutor — tool calls in context', () => {
252
+ it('represents assistant messages with tool calls as "(tool calls)" stub', async () => {
253
+ const provider = mockProvider()
254
+ const e = new AdvisoryExecutor()
255
+ await e.consult(
256
+ advisor({ provider }),
257
+ req,
258
+ ctx({
259
+ messages: [
260
+ {
261
+ role: 'assistant',
262
+ content: null,
263
+ toolCalls: [{ id: 't1', type: 'function', function: { name: 'x', arguments: '{}' } }],
264
+ },
265
+ ],
266
+ }),
267
+ )
268
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0] as ChatCompletionParams
269
+ const contextMsg = call.messages[1]?.content ?? ''
270
+ expect(contextMsg).toContain('[assistant]: (tool calls)')
271
+ })
272
+ })
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 6):
3
+ *
4
+ * - `AdvisorRegistry` extends the plain `Registry<AdvisorDefinition>`
5
+ * (NOT `ManagedRegistry` — no warn-log, direct register via `Map.set`).
6
+ * - Constructor registers every advisor immediately.
7
+ * - `resolve(advisorId?, domain?)` resolution priority:
8
+ * 1. Explicit `advisorId` (even if unknown — returns undefined).
9
+ * 2. Domain match — first advisor whose `domains[]` includes the domain.
10
+ * 3. Explicit `defaultId`.
11
+ * 4. First registered advisor.
12
+ * 5. Undefined when nothing is registered.
13
+ * - `listAll()` returns everything in insertion order.
14
+ */
15
+
16
+ import { describe, expect, it } from 'vitest'
17
+
18
+ import type { AdvisorDefinition } from '../types/advisory/index.js'
19
+ import type { LLMProvider } from '../types/provider/index.js'
20
+
21
+ import { AdvisorRegistry } from './registry.js'
22
+
23
+ const provider = {} as LLMProvider
24
+
25
+ function makeAdvisor(id: string, domains?: string[]): AdvisorDefinition {
26
+ return {
27
+ id,
28
+ name: id,
29
+ provider,
30
+ model: 'opus',
31
+ domains,
32
+ }
33
+ }
34
+
35
+ describe('AdvisorRegistry', () => {
36
+ it('registers every advisor from the constructor array', () => {
37
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')])
38
+ expect(r.listAll().map((a) => a.id)).toEqual(['a', 'b'])
39
+ })
40
+
41
+ describe('resolve priority', () => {
42
+ it('returns the advisor for an explicit advisorId', () => {
43
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')])
44
+ expect(r.resolve('b')?.id).toBe('b')
45
+ })
46
+
47
+ it('returns undefined for an explicit unknown advisorId (does NOT fall through)', () => {
48
+ const r = new AdvisorRegistry([makeAdvisor('a')])
49
+ expect(r.resolve('unknown')).toBeUndefined()
50
+ })
51
+
52
+ it('matches first advisor with a matching domain when no advisorId', () => {
53
+ const r = new AdvisorRegistry([
54
+ makeAdvisor('sec', ['security']),
55
+ makeAdvisor('perf', ['performance']),
56
+ ])
57
+ expect(r.resolve(undefined, 'performance')?.id).toBe('perf')
58
+ })
59
+
60
+ it('falls back to defaultId when no advisorId and no matching domain', () => {
61
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')], 'b')
62
+ expect(r.resolve(undefined, 'nope')?.id).toBe('b')
63
+ })
64
+
65
+ it('falls back to first registered advisor when no default', () => {
66
+ const r = new AdvisorRegistry([makeAdvisor('first'), makeAdvisor('second')])
67
+ expect(r.resolve(undefined, 'nope')?.id).toBe('first')
68
+ })
69
+
70
+ it('returns undefined on an empty registry with no context', () => {
71
+ const r = new AdvisorRegistry([])
72
+ expect(r.resolve()).toBeUndefined()
73
+ })
74
+ })
75
+ })
@@ -3,7 +3,6 @@ import { LocalTaskGateway } from '../gateway/local.js'
3
3
  import { ToolRegistry } from '../registry/tool/execute.js'
4
4
  import { drainQuery } from '../runtime/query/index.js'
5
5
  import type { LaunchedTaskMeta } from '../runtime/query/iteration/phases/context.js'
6
- import type { ActorRef } from '../session/hierarchy/actor.js'
7
6
  import { buildCoordinatorTools } from '../tools/coordinator/index.js'
8
7
  import type { TaskGateway } from '../types/agent/gateway.js'
9
8
  import type {
@@ -16,6 +15,7 @@ import type { AgentTaskContext } from '../types/agent/task.js'
16
15
  import type { AgentId, TaskId } from '../types/ids/index.js'
17
16
  import { deriveChildState } from '../types/invocation/index.js'
18
17
  import type { RunEventListener } from '../types/run/index.js'
18
+ import type { ActorRef } from '../types/session/actor.js'
19
19
  import { ZERO_COST } from '../utils/cost.js'
20
20
  import { AbstractAgent } from './AbstractAgent.js'
21
21