@namzu/sdk 0.4.2 → 0.4.4

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 (310) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/advisory/context.test.d.ts +16 -0
  3. package/dist/advisory/context.test.d.ts.map +1 -0
  4. package/dist/advisory/context.test.js +92 -0
  5. package/dist/advisory/context.test.js.map +1 -0
  6. package/dist/advisory/evaluator.test.d.ts +34 -0
  7. package/dist/advisory/evaluator.test.d.ts.map +1 -0
  8. package/dist/advisory/evaluator.test.js +172 -0
  9. package/dist/advisory/evaluator.test.js.map +1 -0
  10. package/dist/advisory/executor.test.d.ts +35 -0
  11. package/dist/advisory/executor.test.d.ts.map +1 -0
  12. package/dist/advisory/executor.test.js +233 -0
  13. package/dist/advisory/executor.test.js.map +1 -0
  14. package/dist/advisory/registry.test.d.ts +16 -0
  15. package/dist/advisory/registry.test.d.ts.map +1 -0
  16. package/dist/advisory/registry.test.js +62 -0
  17. package/dist/advisory/registry.test.js.map +1 -0
  18. package/dist/bridge/a2a/agent-card.test.d.ts +24 -0
  19. package/dist/bridge/a2a/agent-card.test.d.ts.map +1 -0
  20. package/dist/bridge/a2a/agent-card.test.js +118 -0
  21. package/dist/bridge/a2a/agent-card.test.js.map +1 -0
  22. package/dist/bridge/a2a/mapper.test.d.ts +29 -0
  23. package/dist/bridge/a2a/mapper.test.d.ts.map +1 -0
  24. package/dist/bridge/a2a/mapper.test.js +265 -0
  25. package/dist/bridge/a2a/mapper.test.js.map +1 -0
  26. package/dist/bridge/a2a/message.test.d.ts +20 -0
  27. package/dist/bridge/a2a/message.test.d.ts.map +1 -0
  28. package/dist/bridge/a2a/message.test.js +116 -0
  29. package/dist/bridge/a2a/message.test.js.map +1 -0
  30. package/dist/bridge/a2a/task.test.d.ts +29 -0
  31. package/dist/bridge/a2a/task.test.d.ts.map +1 -0
  32. package/dist/bridge/a2a/task.test.js +198 -0
  33. package/dist/bridge/a2a/task.test.js.map +1 -0
  34. package/dist/bridge/mcp/connector/adapter.test.d.ts +27 -0
  35. package/dist/bridge/mcp/connector/adapter.test.d.ts.map +1 -0
  36. package/dist/bridge/mcp/connector/adapter.test.js +203 -0
  37. package/dist/bridge/mcp/connector/adapter.test.js.map +1 -0
  38. package/dist/bridge/sse/mapper.test.d.ts +27 -0
  39. package/dist/bridge/sse/mapper.test.d.ts.map +1 -0
  40. package/dist/bridge/sse/mapper.test.js +271 -0
  41. package/dist/bridge/sse/mapper.test.js.map +1 -0
  42. package/dist/bridge/tools/connector/adapter.d.ts +2 -2
  43. package/dist/bridge/tools/connector/adapter.test.d.ts +28 -0
  44. package/dist/bridge/tools/connector/adapter.test.d.ts.map +1 -0
  45. package/dist/bridge/tools/connector/adapter.test.js +182 -0
  46. package/dist/bridge/tools/connector/adapter.test.js.map +1 -0
  47. package/dist/bridge/tools/connector/definitions.test.d.ts +23 -0
  48. package/dist/bridge/tools/connector/definitions.test.d.ts.map +1 -0
  49. package/dist/bridge/tools/connector/definitions.test.js +158 -0
  50. package/dist/bridge/tools/connector/definitions.test.js.map +1 -0
  51. package/dist/bridge/tools/connector/router.test.d.ts +21 -0
  52. package/dist/bridge/tools/connector/router.test.d.ts.map +1 -0
  53. package/dist/bridge/tools/connector/router.test.js +139 -0
  54. package/dist/bridge/tools/connector/router.test.js.map +1 -0
  55. package/dist/bus/breaker.test.d.ts +41 -0
  56. package/dist/bus/breaker.test.d.ts.map +1 -0
  57. package/dist/bus/breaker.test.js +242 -0
  58. package/dist/bus/breaker.test.js.map +1 -0
  59. package/dist/bus/index.d.ts +3 -1
  60. package/dist/bus/index.d.ts.map +1 -1
  61. package/dist/bus/index.js +18 -11
  62. package/dist/bus/index.js.map +1 -1
  63. package/dist/bus/index.test.d.ts +25 -0
  64. package/dist/bus/index.test.d.ts.map +1 -0
  65. package/dist/bus/index.test.js +151 -0
  66. package/dist/bus/index.test.js.map +1 -0
  67. package/dist/bus/lock.test.d.ts +44 -0
  68. package/dist/bus/lock.test.d.ts.map +1 -0
  69. package/dist/bus/lock.test.js +226 -0
  70. package/dist/bus/lock.test.js.map +1 -0
  71. package/dist/bus/ownership.test.d.ts +26 -0
  72. package/dist/bus/ownership.test.d.ts.map +1 -0
  73. package/dist/bus/ownership.test.js +205 -0
  74. package/dist/bus/ownership.test.js.map +1 -0
  75. package/dist/config/runtime.d.ts +28 -28
  76. package/dist/connector/BaseConnector.test.d.ts +21 -0
  77. package/dist/connector/BaseConnector.test.d.ts.map +1 -0
  78. package/dist/connector/BaseConnector.test.js +108 -0
  79. package/dist/connector/BaseConnector.test.js.map +1 -0
  80. package/dist/connector/builtins/http.test.d.ts +30 -0
  81. package/dist/connector/builtins/http.test.d.ts.map +1 -0
  82. package/dist/connector/builtins/http.test.js +232 -0
  83. package/dist/connector/builtins/http.test.js.map +1 -0
  84. package/dist/connector/builtins/webhook.test.d.ts +20 -0
  85. package/dist/connector/builtins/webhook.test.d.ts.map +1 -0
  86. package/dist/connector/builtins/webhook.test.js +113 -0
  87. package/dist/connector/builtins/webhook.test.js.map +1 -0
  88. package/dist/connector/execution/factory.test.d.ts +16 -0
  89. package/dist/connector/execution/factory.test.d.ts.map +1 -0
  90. package/dist/connector/execution/factory.test.js +64 -0
  91. package/dist/connector/execution/factory.test.js.map +1 -0
  92. package/dist/connector/execution/remote.test.d.ts +16 -0
  93. package/dist/connector/execution/remote.test.d.ts.map +1 -0
  94. package/dist/connector/execution/remote.test.js +53 -0
  95. package/dist/connector/execution/remote.test.js.map +1 -0
  96. package/dist/connector/mcp/adapter.test.d.ts +34 -0
  97. package/dist/connector/mcp/adapter.test.d.ts.map +1 -0
  98. package/dist/connector/mcp/adapter.test.js +199 -0
  99. package/dist/connector/mcp/adapter.test.js.map +1 -0
  100. package/dist/probe/context.d.ts +8 -0
  101. package/dist/probe/context.d.ts.map +1 -0
  102. package/dist/probe/context.js +7 -0
  103. package/dist/probe/context.js.map +1 -0
  104. package/dist/probe/errors.d.ts +12 -0
  105. package/dist/probe/errors.d.ts.map +1 -0
  106. package/dist/probe/errors.js +21 -0
  107. package/dist/probe/errors.js.map +1 -0
  108. package/dist/probe/index.d.ts +5 -0
  109. package/dist/probe/index.d.ts.map +1 -0
  110. package/dist/probe/index.js +4 -0
  111. package/dist/probe/index.js.map +1 -0
  112. package/dist/probe/registry.d.ts +24 -0
  113. package/dist/probe/registry.d.ts.map +1 -0
  114. package/dist/probe/registry.js +228 -0
  115. package/dist/probe/registry.js.map +1 -0
  116. package/dist/probe/registry.test.d.ts +7 -0
  117. package/dist/probe/registry.test.d.ts.map +1 -0
  118. package/dist/probe/registry.test.js +310 -0
  119. package/dist/probe/registry.test.js.map +1 -0
  120. package/dist/provider/instrumentation.d.ts +9 -0
  121. package/dist/provider/instrumentation.d.ts.map +1 -0
  122. package/dist/provider/instrumentation.js +104 -0
  123. package/dist/provider/instrumentation.js.map +1 -0
  124. package/dist/provider/instrumentation.test.d.ts +2 -0
  125. package/dist/provider/instrumentation.test.d.ts.map +1 -0
  126. package/dist/provider/instrumentation.test.js +152 -0
  127. package/dist/provider/instrumentation.test.js.map +1 -0
  128. package/dist/public-runtime.d.ts +5 -0
  129. package/dist/public-runtime.d.ts.map +1 -1
  130. package/dist/public-runtime.js +4 -0
  131. package/dist/public-runtime.js.map +1 -1
  132. package/dist/public-types.d.ts +3 -0
  133. package/dist/public-types.d.ts.map +1 -1
  134. package/dist/rag/chunking.test.d.ts +20 -0
  135. package/dist/rag/chunking.test.d.ts.map +1 -0
  136. package/dist/rag/chunking.test.js +92 -0
  137. package/dist/rag/chunking.test.js.map +1 -0
  138. package/dist/rag/context-assembler.test.d.ts +19 -0
  139. package/dist/rag/context-assembler.test.d.ts.map +1 -0
  140. package/dist/rag/context-assembler.test.js +98 -0
  141. package/dist/rag/context-assembler.test.js.map +1 -0
  142. package/dist/rag/embedding.test.d.ts +19 -0
  143. package/dist/rag/embedding.test.d.ts.map +1 -0
  144. package/dist/rag/embedding.test.js +115 -0
  145. package/dist/rag/embedding.test.js.map +1 -0
  146. package/dist/rag/ingestion.test.d.ts +22 -0
  147. package/dist/rag/ingestion.test.d.ts.map +1 -0
  148. package/dist/rag/ingestion.test.js +99 -0
  149. package/dist/rag/ingestion.test.js.map +1 -0
  150. package/dist/rag/knowledge-base.test.d.ts +17 -0
  151. package/dist/rag/knowledge-base.test.d.ts.map +1 -0
  152. package/dist/rag/knowledge-base.test.js +77 -0
  153. package/dist/rag/knowledge-base.test.js.map +1 -0
  154. package/dist/rag/rag-tool.test.d.ts +21 -0
  155. package/dist/rag/rag-tool.test.d.ts.map +1 -0
  156. package/dist/rag/rag-tool.test.js +149 -0
  157. package/dist/rag/rag-tool.test.js.map +1 -0
  158. package/dist/rag/retriever.test.d.ts +26 -0
  159. package/dist/rag/retriever.test.d.ts.map +1 -0
  160. package/dist/rag/retriever.test.js +180 -0
  161. package/dist/rag/retriever.test.js.map +1 -0
  162. package/dist/rag/vector-store.test.d.ts +38 -0
  163. package/dist/rag/vector-store.test.d.ts.map +1 -0
  164. package/dist/rag/vector-store.test.js +175 -0
  165. package/dist/rag/vector-store.test.js.map +1 -0
  166. package/dist/registry/ManagedRegistry.test.d.ts +21 -0
  167. package/dist/registry/ManagedRegistry.test.d.ts.map +1 -0
  168. package/dist/registry/ManagedRegistry.test.js +98 -0
  169. package/dist/registry/ManagedRegistry.test.js.map +1 -0
  170. package/dist/registry/Registry.test.d.ts +18 -0
  171. package/dist/registry/Registry.test.d.ts.map +1 -0
  172. package/dist/registry/Registry.test.js +79 -0
  173. package/dist/registry/Registry.test.js.map +1 -0
  174. package/dist/registry/agent/definitions.test.d.ts +15 -0
  175. package/dist/registry/agent/definitions.test.d.ts.map +1 -0
  176. package/dist/registry/agent/definitions.test.js +84 -0
  177. package/dist/registry/agent/definitions.test.js.map +1 -0
  178. package/dist/registry/connector/definitions.test.d.ts +13 -0
  179. package/dist/registry/connector/definitions.test.d.ts.map +1 -0
  180. package/dist/registry/connector/definitions.test.js +41 -0
  181. package/dist/registry/connector/definitions.test.js.map +1 -0
  182. package/dist/registry/connector/scoped.test.d.ts +21 -0
  183. package/dist/registry/connector/scoped.test.d.ts.map +1 -0
  184. package/dist/registry/connector/scoped.test.js +115 -0
  185. package/dist/registry/connector/scoped.test.js.map +1 -0
  186. package/dist/registry/plugin/index.test.d.ts +12 -0
  187. package/dist/registry/plugin/index.test.d.ts.map +1 -0
  188. package/dist/registry/plugin/index.test.js +69 -0
  189. package/dist/registry/plugin/index.test.js.map +1 -0
  190. package/dist/registry/tool/execute.test.d.ts +42 -0
  191. package/dist/registry/tool/execute.test.d.ts.map +1 -0
  192. package/dist/registry/tool/execute.test.js +281 -0
  193. package/dist/registry/tool/execute.test.js.map +1 -0
  194. package/dist/runtime/query/events.d.ts +3 -1
  195. package/dist/runtime/query/events.d.ts.map +1 -1
  196. package/dist/runtime/query/events.js +6 -1
  197. package/dist/runtime/query/events.js.map +1 -1
  198. package/dist/runtime/query/executor.d.ts +3 -1
  199. package/dist/runtime/query/executor.d.ts.map +1 -1
  200. package/dist/runtime/query/executor.js +30 -1
  201. package/dist/runtime/query/executor.js.map +1 -1
  202. package/dist/runtime/query/iteration/phases/advisory.test.d.ts +42 -0
  203. package/dist/runtime/query/iteration/phases/advisory.test.d.ts.map +1 -0
  204. package/dist/runtime/query/iteration/phases/advisory.test.js +334 -0
  205. package/dist/runtime/query/iteration/phases/advisory.test.js.map +1 -0
  206. package/dist/test-setup.d.ts +22 -0
  207. package/dist/test-setup.d.ts.map +1 -0
  208. package/dist/test-setup.js +23 -0
  209. package/dist/test-setup.js.map +1 -0
  210. package/dist/types/bus/index.d.ts +46 -2
  211. package/dist/types/bus/index.d.ts.map +1 -1
  212. package/dist/types/doctor/check.d.ts +41 -0
  213. package/dist/types/doctor/check.d.ts.map +1 -0
  214. package/dist/types/doctor/check.js +2 -0
  215. package/dist/types/doctor/check.js.map +1 -0
  216. package/dist/types/doctor/index.d.ts +2 -0
  217. package/dist/types/doctor/index.d.ts.map +1 -0
  218. package/dist/types/doctor/index.js +2 -0
  219. package/dist/types/doctor/index.js.map +1 -0
  220. package/dist/types/probe/event-kind.d.ts +6 -0
  221. package/dist/types/probe/event-kind.d.ts.map +1 -0
  222. package/dist/types/probe/event-kind.js +2 -0
  223. package/dist/types/probe/event-kind.js.map +1 -0
  224. package/dist/types/probe/event-of.d.ts +5 -0
  225. package/dist/types/probe/event-of.d.ts.map +1 -0
  226. package/dist/types/probe/event-of.js +2 -0
  227. package/dist/types/probe/event-of.js.map +1 -0
  228. package/dist/types/probe/index.d.ts +4 -0
  229. package/dist/types/probe/index.d.ts.map +1 -0
  230. package/dist/types/probe/index.js +2 -0
  231. package/dist/types/probe/index.js.map +1 -0
  232. package/dist/types/probe/registry.d.ts +27 -0
  233. package/dist/types/probe/registry.d.ts.map +1 -0
  234. package/dist/types/probe/registry.js +2 -0
  235. package/dist/types/probe/registry.js.map +1 -0
  236. package/dist/utils/logger.d.ts +1 -1
  237. package/dist/utils/logger.d.ts.map +1 -1
  238. package/dist/utils/logger.js +5 -0
  239. package/dist/utils/logger.js.map +1 -1
  240. package/dist/vault/instrumentation.d.ts +11 -0
  241. package/dist/vault/instrumentation.d.ts.map +1 -0
  242. package/dist/vault/instrumentation.js +32 -0
  243. package/dist/vault/instrumentation.js.map +1 -0
  244. package/dist/vault/instrumentation.test.d.ts +2 -0
  245. package/dist/vault/instrumentation.test.d.ts.map +1 -0
  246. package/dist/vault/instrumentation.test.js +80 -0
  247. package/dist/vault/instrumentation.test.js.map +1 -0
  248. package/package.json +4 -1
  249. package/src/advisory/context.test.ts +109 -0
  250. package/src/advisory/evaluator.test.ts +192 -0
  251. package/src/advisory/executor.test.ts +272 -0
  252. package/src/advisory/registry.test.ts +75 -0
  253. package/src/bridge/a2a/agent-card.test.ts +140 -0
  254. package/src/bridge/a2a/mapper.test.ts +293 -0
  255. package/src/bridge/a2a/message.test.ts +138 -0
  256. package/src/bridge/a2a/task.test.ts +235 -0
  257. package/src/bridge/mcp/connector/adapter.test.ts +230 -0
  258. package/src/bridge/sse/mapper.test.ts +422 -0
  259. package/src/bridge/tools/connector/adapter.test.ts +224 -0
  260. package/src/bridge/tools/connector/definitions.test.ts +183 -0
  261. package/src/bridge/tools/connector/router.test.ts +159 -0
  262. package/src/bus/breaker.test.ts +274 -0
  263. package/src/bus/index.test.ts +183 -0
  264. package/src/bus/index.ts +21 -10
  265. package/src/bus/lock.test.ts +265 -0
  266. package/src/bus/ownership.test.ts +243 -0
  267. package/src/connector/BaseConnector.test.ts +130 -0
  268. package/src/connector/builtins/http.test.ts +290 -0
  269. package/src/connector/builtins/webhook.test.ts +138 -0
  270. package/src/connector/execution/factory.test.ts +75 -0
  271. package/src/connector/execution/remote.test.ts +63 -0
  272. package/src/connector/mcp/adapter.test.ts +249 -0
  273. package/src/probe/context.ts +14 -0
  274. package/src/probe/errors.ts +27 -0
  275. package/src/probe/index.ts +4 -0
  276. package/src/probe/registry.test.ts +480 -0
  277. package/src/probe/registry.ts +276 -0
  278. package/src/provider/instrumentation.test.ts +192 -0
  279. package/src/provider/instrumentation.ts +139 -0
  280. package/src/public-runtime.ts +17 -0
  281. package/src/public-types.ts +3 -0
  282. package/src/rag/chunking.test.ts +107 -0
  283. package/src/rag/context-assembler.test.ts +114 -0
  284. package/src/rag/embedding.test.ts +130 -0
  285. package/src/rag/ingestion.test.ts +114 -0
  286. package/src/rag/knowledge-base.test.ts +106 -0
  287. package/src/rag/rag-tool.test.ts +167 -0
  288. package/src/rag/retriever.test.ts +210 -0
  289. package/src/rag/vector-store.test.ts +196 -0
  290. package/src/registry/ManagedRegistry.test.ts +118 -0
  291. package/src/registry/Registry.test.ts +91 -0
  292. package/src/registry/agent/definitions.test.ts +100 -0
  293. package/src/registry/connector/definitions.test.ts +51 -0
  294. package/src/registry/connector/scoped.test.ts +129 -0
  295. package/src/registry/plugin/index.test.ts +85 -0
  296. package/src/registry/tool/execute.test.ts +330 -0
  297. package/src/runtime/query/events.ts +6 -1
  298. package/src/runtime/query/executor.ts +34 -0
  299. package/src/runtime/query/iteration/phases/advisory.test.ts +412 -0
  300. package/src/test-setup.ts +24 -0
  301. package/src/types/bus/index.ts +54 -2
  302. package/src/types/doctor/check.ts +53 -0
  303. package/src/types/doctor/index.ts +9 -0
  304. package/src/types/probe/event-kind.ts +8 -0
  305. package/src/types/probe/event-of.ts +3 -0
  306. package/src/types/probe/index.ts +11 -0
  307. package/src/types/probe/registry.ts +36 -0
  308. package/src/utils/logger.ts +6 -1
  309. package/src/vault/instrumentation.test.ts +98 -0
  310. package/src/vault/instrumentation.ts +56 -0
@@ -0,0 +1,233 @@
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
+ import { describe, expect, it, vi } from 'vitest';
35
+ import { AdvisoryExecutor } from './executor.js';
36
+ function mockProvider(response = {}) {
37
+ const chat = vi.fn(async () => ({
38
+ id: 'resp_1',
39
+ model: 'm',
40
+ message: { role: 'assistant', content: 'advice text' },
41
+ usage: {
42
+ promptTokens: 100,
43
+ completionTokens: 50,
44
+ totalTokens: 150,
45
+ cachedTokens: 0,
46
+ cacheWriteTokens: 0,
47
+ },
48
+ finishReason: 'stop',
49
+ ...response,
50
+ }));
51
+ return {
52
+ id: 'mock',
53
+ name: 'Mock',
54
+ chat,
55
+ chatStream: vi.fn(),
56
+ };
57
+ }
58
+ function advisor(overrides = {}) {
59
+ return {
60
+ id: 'adv',
61
+ name: 'Adv',
62
+ provider: mockProvider(),
63
+ model: 'm',
64
+ ...overrides,
65
+ };
66
+ }
67
+ function ctx(overrides = {}) {
68
+ return {
69
+ messages: [],
70
+ iteration: 1,
71
+ ...overrides,
72
+ };
73
+ }
74
+ const req = { question: 'what next?' };
75
+ describe('AdvisoryExecutor — consult happy path', () => {
76
+ it('calls provider.chat with system + question, toolChoice none', async () => {
77
+ const provider = mockProvider();
78
+ const e = new AdvisoryExecutor();
79
+ const a = advisor({ provider, systemPrompt: 'You are Adv.' });
80
+ await e.consult(a, req, ctx());
81
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
82
+ expect(call.model).toBe('m');
83
+ expect(call.toolChoice).toBe('none');
84
+ const roles = call.messages.map((m) => m.role);
85
+ expect(roles[0]).toBe('system');
86
+ expect(roles.at(-1)).toBe('user');
87
+ });
88
+ it('returns {result, usage, cost, durationMs}; cost is zero-valued', async () => {
89
+ const e = new AdvisoryExecutor();
90
+ const out = await e.consult(advisor(), req, ctx());
91
+ expect(out.result.advice).toBe('advice text');
92
+ expect(out.usage.totalTokens).toBe(150);
93
+ expect(out.cost).toEqual({
94
+ inputCostPer1M: 0,
95
+ outputCostPer1M: 0,
96
+ totalCost: 0,
97
+ cacheDiscount: 0,
98
+ });
99
+ expect(typeof out.durationMs).toBe('number');
100
+ });
101
+ it('parseResult is currently a passthrough — advice = content verbatim', async () => {
102
+ const provider = mockProvider({
103
+ message: { role: 'assistant', content: 'Raw text with **markdown**' },
104
+ });
105
+ const e = new AdvisoryExecutor();
106
+ const out = await e.consult(advisor({ provider }), req, ctx());
107
+ expect(out.result.advice).toBe('Raw text with **markdown**');
108
+ });
109
+ it('handles null provider content as empty string', async () => {
110
+ const provider = mockProvider({
111
+ message: { role: 'assistant', content: null },
112
+ });
113
+ const e = new AdvisoryExecutor();
114
+ const out = await e.consult(advisor({ provider }), req, ctx());
115
+ expect(out.result.advice).toBe('');
116
+ });
117
+ });
118
+ describe('AdvisoryExecutor — buildSystemPrompt', () => {
119
+ it('uses advisor.systemPrompt verbatim when set', async () => {
120
+ const provider = mockProvider();
121
+ const e = new AdvisoryExecutor();
122
+ await e.consult(advisor({ provider, systemPrompt: 'FIXED PROMPT' }), req, ctx());
123
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
124
+ expect(call.messages[0]?.content).toBe('FIXED PROMPT');
125
+ });
126
+ it('falls back to name + domains + boilerplate when no systemPrompt or persona', async () => {
127
+ const provider = mockProvider();
128
+ const e = new AdvisoryExecutor();
129
+ await e.consult(advisor({ provider, name: 'Architect', domains: ['security', 'performance'] }), req, ctx());
130
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
131
+ const systemContent = call.messages[0]?.content ?? '';
132
+ expect(systemContent).toContain('Architect');
133
+ expect(systemContent).toContain('security, performance');
134
+ expect(systemContent).toContain('concise, actionable advice');
135
+ });
136
+ it('fallback without domains omits the domains line', async () => {
137
+ const provider = mockProvider();
138
+ const e = new AdvisoryExecutor();
139
+ await e.consult(advisor({ provider, name: 'Adv' }), req, ctx());
140
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
141
+ const systemContent = call.messages[0]?.content ?? '';
142
+ expect(systemContent).not.toContain('domains of expertise');
143
+ });
144
+ });
145
+ describe('AdvisoryExecutor — buildContext', () => {
146
+ it('returns no context message when request.includeContext is false', async () => {
147
+ const provider = mockProvider();
148
+ const e = new AdvisoryExecutor();
149
+ await e.consult(advisor({ provider }), { question: 'q', includeContext: false }, ctx({ workingStateSummary: 'should be ignored' }));
150
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
151
+ // Only system + user(question)
152
+ expect(call.messages).toHaveLength(2);
153
+ });
154
+ it('includes workingStateSummary + toolCatalog names when present', async () => {
155
+ const provider = mockProvider();
156
+ const e = new AdvisoryExecutor();
157
+ await e.consult(advisor({ provider }), req, {
158
+ messages: [],
159
+ iteration: 1,
160
+ workingStateSummary: 'state summary here',
161
+ toolCatalog: [
162
+ {
163
+ type: 'function',
164
+ function: { name: 'read_file', description: 'read', parameters: {} },
165
+ },
166
+ {
167
+ type: 'function',
168
+ function: { name: 'write_file', description: 'write', parameters: {} },
169
+ },
170
+ ],
171
+ });
172
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
173
+ const contextMsg = call.messages[1]?.content ?? '';
174
+ expect(contextMsg).toContain('Working State');
175
+ expect(contextMsg).toContain('state summary here');
176
+ expect(contextMsg).toContain('Available Tools');
177
+ expect(contextMsg).toContain('read_file, write_file');
178
+ });
179
+ it('includes conversation context (no truncation when no maxContextTokens)', async () => {
180
+ const provider = mockProvider();
181
+ const messages = [
182
+ { role: 'user', content: 'hi' },
183
+ { role: 'assistant', content: 'hello' },
184
+ ];
185
+ const e = new AdvisoryExecutor();
186
+ await e.consult(advisor({ provider }), req, ctx({ messages }));
187
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
188
+ const contextMsg = call.messages[1]?.content ?? '';
189
+ expect(contextMsg).toContain('Conversation Context');
190
+ expect(contextMsg).toContain('[user]: hi');
191
+ expect(contextMsg).toContain('[assistant]: hello');
192
+ });
193
+ it('truncates conversation from the back when maxContextTokens is set', async () => {
194
+ const provider = mockProvider();
195
+ const messages = [
196
+ { role: 'user', content: 'a'.repeat(100) }, // oldest — should be dropped
197
+ { role: 'user', content: 'recent' },
198
+ ];
199
+ const e = new AdvisoryExecutor();
200
+ // maxContextTokens=5 → 5*4=20 char budget; only 'recent' (6 chars) fits.
201
+ await e.consult(advisor({ provider, maxContextTokens: 5 }), req, ctx({ messages }));
202
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
203
+ const contextMsg = call.messages[1]?.content ?? '';
204
+ expect(contextMsg).toContain('recent');
205
+ expect(contextMsg).not.toContain('a'.repeat(100));
206
+ });
207
+ it('omits the context message entirely when there are no context parts', async () => {
208
+ const provider = mockProvider();
209
+ const e = new AdvisoryExecutor();
210
+ await e.consult(advisor({ provider }), req, ctx());
211
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
212
+ expect(call.messages).toHaveLength(2);
213
+ });
214
+ });
215
+ describe('AdvisoryExecutor — tool calls in context', () => {
216
+ it('represents assistant messages with tool calls as "(tool calls)" stub', async () => {
217
+ const provider = mockProvider();
218
+ const e = new AdvisoryExecutor();
219
+ await e.consult(advisor({ provider }), req, ctx({
220
+ messages: [
221
+ {
222
+ role: 'assistant',
223
+ content: null,
224
+ toolCalls: [{ id: 't1', type: 'function', function: { name: 'x', arguments: '{}' } }],
225
+ },
226
+ ],
227
+ }));
228
+ const call = vi.mocked(provider.chat).mock.calls[0]?.[0];
229
+ const contextMsg = call.messages[1]?.content ?? '';
230
+ expect(contextMsg).toContain('[assistant]: (tool calls)');
231
+ });
232
+ });
233
+ //# sourceMappingURL=executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../src/advisory/executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
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
+ export {};
16
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/advisory/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,62 @@
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
+ import { describe, expect, it } from 'vitest';
16
+ import { AdvisorRegistry } from './registry.js';
17
+ const provider = {};
18
+ function makeAdvisor(id, domains) {
19
+ return {
20
+ id,
21
+ name: id,
22
+ provider,
23
+ model: 'opus',
24
+ domains,
25
+ };
26
+ }
27
+ describe('AdvisorRegistry', () => {
28
+ it('registers every advisor from the constructor array', () => {
29
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')]);
30
+ expect(r.listAll().map((a) => a.id)).toEqual(['a', 'b']);
31
+ });
32
+ describe('resolve priority', () => {
33
+ it('returns the advisor for an explicit advisorId', () => {
34
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')]);
35
+ expect(r.resolve('b')?.id).toBe('b');
36
+ });
37
+ it('returns undefined for an explicit unknown advisorId (does NOT fall through)', () => {
38
+ const r = new AdvisorRegistry([makeAdvisor('a')]);
39
+ expect(r.resolve('unknown')).toBeUndefined();
40
+ });
41
+ it('matches first advisor with a matching domain when no advisorId', () => {
42
+ const r = new AdvisorRegistry([
43
+ makeAdvisor('sec', ['security']),
44
+ makeAdvisor('perf', ['performance']),
45
+ ]);
46
+ expect(r.resolve(undefined, 'performance')?.id).toBe('perf');
47
+ });
48
+ it('falls back to defaultId when no advisorId and no matching domain', () => {
49
+ const r = new AdvisorRegistry([makeAdvisor('a'), makeAdvisor('b')], 'b');
50
+ expect(r.resolve(undefined, 'nope')?.id).toBe('b');
51
+ });
52
+ it('falls back to first registered advisor when no default', () => {
53
+ const r = new AdvisorRegistry([makeAdvisor('first'), makeAdvisor('second')]);
54
+ expect(r.resolve(undefined, 'nope')?.id).toBe('first');
55
+ });
56
+ it('returns undefined on an empty registry with no context', () => {
57
+ const r = new AdvisorRegistry([]);
58
+ expect(r.resolve()).toBeUndefined();
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/advisory/registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 2):
3
+ *
4
+ * - `buildAgentCard(info, config, skills?)`:
5
+ * - `name`, `description`, `version` are passed through from info.
6
+ * - `protocolVersion` is pinned to `A2A_PROTOCOL_VERSION` (0.3.0).
7
+ * - `provider.organization` defaults to 'Namzu' when
8
+ * `config.providerOrganization` is absent.
9
+ * - `capabilities.streaming` mirrors
10
+ * `info.capabilities?.supportsStreaming` with false default;
11
+ * `pushNotifications` + `extendedAgentCard` are always false.
12
+ * - Each tool in `info.tools` becomes a skill with
13
+ * `{id: 'tool-<name>', name: '<name>', tags: ['tool']}`.
14
+ * - Each entry in the optional `skills` param becomes a skill with
15
+ * `tags: ['procedure']` and id = name = skill.metadata.name.
16
+ * - Tool skills come first, procedural skills after, in insertion
17
+ * order.
18
+ * - `supportedInterfaces[0].url` = `${config.baseUrl}/a2a/${info.id}`.
19
+ * - `securitySchemes` always includes `bearer` + `securityRequirements`
20
+ * is `[{bearer: []}]`.
21
+ * - `defaultInputModes` and `defaultOutputModes` are `['text']`.
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=agent-card.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.test.d.ts","sourceRoot":"","sources":["../../../src/bridge/a2a/agent-card.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 2):
3
+ *
4
+ * - `buildAgentCard(info, config, skills?)`:
5
+ * - `name`, `description`, `version` are passed through from info.
6
+ * - `protocolVersion` is pinned to `A2A_PROTOCOL_VERSION` (0.3.0).
7
+ * - `provider.organization` defaults to 'Namzu' when
8
+ * `config.providerOrganization` is absent.
9
+ * - `capabilities.streaming` mirrors
10
+ * `info.capabilities?.supportsStreaming` with false default;
11
+ * `pushNotifications` + `extendedAgentCard` are always false.
12
+ * - Each tool in `info.tools` becomes a skill with
13
+ * `{id: 'tool-<name>', name: '<name>', tags: ['tool']}`.
14
+ * - Each entry in the optional `skills` param becomes a skill with
15
+ * `tags: ['procedure']` and id = name = skill.metadata.name.
16
+ * - Tool skills come first, procedural skills after, in insertion
17
+ * order.
18
+ * - `supportedInterfaces[0].url` = `${config.baseUrl}/a2a/${info.id}`.
19
+ * - `securitySchemes` always includes `bearer` + `securityRequirements`
20
+ * is `[{bearer: []}]`.
21
+ * - `defaultInputModes` and `defaultOutputModes` are `['text']`.
22
+ */
23
+ import { describe, expect, it } from 'vitest';
24
+ import { buildAgentCard } from './agent-card.js';
25
+ const baseInfo = {
26
+ id: 'coder',
27
+ name: 'Coder',
28
+ version: '1.0.0',
29
+ category: 'coding',
30
+ description: 'Writes code',
31
+ tools: ['read_file', 'write_file'],
32
+ defaults: { model: 'claude-opus-4-7', tokenBudget: 100_000 },
33
+ };
34
+ const baseConfig = {
35
+ baseUrl: 'https://example.com',
36
+ transport: 'jsonrpc',
37
+ };
38
+ describe('buildAgentCard', () => {
39
+ it('passes name / description / version through', () => {
40
+ const card = buildAgentCard(baseInfo, baseConfig);
41
+ expect(card.name).toBe('Coder');
42
+ expect(card.description).toBe('Writes code');
43
+ expect(card.version).toBe('1.0.0');
44
+ });
45
+ it('pins protocolVersion to A2A_PROTOCOL_VERSION', () => {
46
+ const card = buildAgentCard(baseInfo, baseConfig);
47
+ expect(card.protocolVersion).toBe('0.3.0');
48
+ });
49
+ it('defaults provider.organization to Namzu when config omits it', () => {
50
+ const card = buildAgentCard(baseInfo, baseConfig);
51
+ expect(card.provider?.organization).toBe('Namzu');
52
+ expect(card.provider?.url).toBeUndefined();
53
+ });
54
+ it('uses config-supplied providerOrganization + providerUrl when given', () => {
55
+ const card = buildAgentCard(baseInfo, {
56
+ ...baseConfig,
57
+ providerOrganization: 'ACME',
58
+ providerUrl: 'https://acme.io',
59
+ });
60
+ expect(card.provider?.organization).toBe('ACME');
61
+ expect(card.provider?.url).toBe('https://acme.io');
62
+ });
63
+ it('streaming capability mirrors info.capabilities?.supportsStreaming (default false)', () => {
64
+ const noCaps = buildAgentCard(baseInfo, baseConfig);
65
+ expect(noCaps.capabilities.streaming).toBe(false);
66
+ const withStreaming = buildAgentCard({
67
+ ...baseInfo,
68
+ capabilities: {
69
+ supportsTools: true,
70
+ supportsStreaming: true,
71
+ supportsConcurrency: false,
72
+ supportsSubAgents: false,
73
+ },
74
+ }, baseConfig);
75
+ expect(withStreaming.capabilities.streaming).toBe(true);
76
+ });
77
+ it('pushNotifications + extendedAgentCard are always false', () => {
78
+ const card = buildAgentCard(baseInfo, baseConfig);
79
+ expect(card.capabilities.pushNotifications).toBe(false);
80
+ expect(card.capabilities.extendedAgentCard).toBe(false);
81
+ });
82
+ it('each tool becomes a skill with id = tool-<name> + tags = [tool]', () => {
83
+ const card = buildAgentCard(baseInfo, baseConfig);
84
+ const toolSkills = card.skills.filter((s) => s.tags?.includes('tool'));
85
+ expect(toolSkills.map((s) => s.id)).toEqual(['tool-read_file', 'tool-write_file']);
86
+ expect(toolSkills.map((s) => s.name)).toEqual(['read_file', 'write_file']);
87
+ });
88
+ it('procedural skills come after tool skills with tags = [procedure]', () => {
89
+ const skills = [
90
+ {
91
+ metadata: { name: 'commit', description: 'Drafts commits' },
92
+ dirPath: '/skills/commit',
93
+ },
94
+ ];
95
+ const card = buildAgentCard(baseInfo, baseConfig, skills);
96
+ expect(card.skills).toHaveLength(3);
97
+ const last = card.skills[2];
98
+ expect(last?.id).toBe('commit');
99
+ expect(last?.name).toBe('commit');
100
+ expect(last?.tags).toEqual(['procedure']);
101
+ });
102
+ it('supportedInterfaces[0].url = <baseUrl>/a2a/<id>', () => {
103
+ const card = buildAgentCard(baseInfo, baseConfig);
104
+ expect(card.supportedInterfaces[0]?.url).toBe('https://example.com/a2a/coder');
105
+ expect(card.supportedInterfaces[0]?.transport).toBe('jsonrpc');
106
+ });
107
+ it('carries bearer security scheme + requirement by default', () => {
108
+ const card = buildAgentCard(baseInfo, baseConfig);
109
+ expect(card.securitySchemes?.bearer).toMatchObject({ type: 'http', scheme: 'bearer' });
110
+ expect(card.securityRequirements).toEqual([{ bearer: [] }]);
111
+ });
112
+ it('default input / output modes are text-only', () => {
113
+ const card = buildAgentCard(baseInfo, baseConfig);
114
+ expect(card.defaultInputModes).toEqual(['text']);
115
+ expect(card.defaultOutputModes).toEqual(['text']);
116
+ });
117
+ });
118
+ //# sourceMappingURL=agent-card.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.test.js","sourceRoot":"","sources":["../../../src/bridge/a2a/agent-card.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Current-code invariants asserted (2026-04-21, ses_006 Phase 2):
3
+ *
4
+ * - `mapRunToA2AEvent(event, contextId?)` is a one-way mapper: RunEvent →
5
+ * A2AStreamEvent | null. There is no reverse mapper (§2.7).
6
+ * - For events in MAPPING, the returned object is either a
7
+ * TaskStatusUpdateEvent (with a `status` field) or a
8
+ * TaskArtifactUpdateEvent (with an `artifact` field).
9
+ * - For events explicitly mapped to null (iteration_completed,
10
+ * tool_executing, sub-session lifecycle, etc.), the mapper returns
11
+ * null — this is NOT a bug, it is the "bridge does not surface this"
12
+ * contract. Asserting the null-set here pins the contract.
13
+ * - `run_started` / `run_completed` / `run_failed` / `iteration_started`
14
+ * / `run_paused` produce TaskStatusUpdateEvent with stable states:
15
+ * running / completed / failed / running / input-required.
16
+ * - `run_completed.final` is true; every non-terminal status event has
17
+ * `final: false`.
18
+ * - `llm_response` with null/empty `content` returns null; with content
19
+ * returns a running status event.
20
+ * - `tool_completed` produces an artifact event with `artifactId`
21
+ * containing a timestamp and `metadata.toolName`.
22
+ * - `tool_review_requested` and `plan_ready` attach data parts with
23
+ * domain-specific mime types: `application/x-namzu-review-request`
24
+ * and `application/x-namzu-plan`.
25
+ * - `contextId` threads through into the returned event when provided.
26
+ * - `mapSessionToA2AEvent` is a deprecated alias — identical behavior.
27
+ */
28
+ export {};
29
+ //# sourceMappingURL=mapper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.test.d.ts","sourceRoot":"","sources":["../../../src/bridge/a2a/mapper.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}