@copilotkit/aimock 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +12 -0
  3. package/LICENSE +21 -0
  4. package/README.md +82 -0
  5. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  6. package/dist/a2a-handler.cjs +203 -0
  7. package/dist/a2a-handler.cjs.map +1 -0
  8. package/dist/a2a-handler.js +199 -0
  9. package/dist/a2a-handler.js.map +1 -0
  10. package/dist/a2a-mock.cjs +292 -0
  11. package/dist/a2a-mock.cjs.map +1 -0
  12. package/dist/a2a-mock.d.cts +41 -0
  13. package/dist/a2a-mock.d.cts.map +1 -0
  14. package/dist/a2a-mock.d.ts +41 -0
  15. package/dist/a2a-mock.d.ts.map +1 -0
  16. package/dist/a2a-mock.js +290 -0
  17. package/dist/a2a-mock.js.map +1 -0
  18. package/dist/a2a-stub.cjs +4 -0
  19. package/dist/a2a-stub.d.cts +3 -0
  20. package/dist/a2a-stub.d.ts +3 -0
  21. package/dist/a2a-stub.js +3 -0
  22. package/dist/a2a-types.d.cts +68 -0
  23. package/dist/a2a-types.d.cts.map +1 -0
  24. package/dist/a2a-types.d.ts +68 -0
  25. package/dist/a2a-types.d.ts.map +1 -0
  26. package/dist/aimock-cli.cjs +112 -0
  27. package/dist/aimock-cli.cjs.map +1 -0
  28. package/dist/aimock-cli.d.cts +19 -0
  29. package/dist/aimock-cli.d.cts.map +1 -0
  30. package/dist/aimock-cli.d.ts +19 -0
  31. package/dist/aimock-cli.d.ts.map +1 -0
  32. package/dist/aimock-cli.js +110 -0
  33. package/dist/aimock-cli.js.map +1 -0
  34. package/dist/aws-event-stream.cjs +117 -0
  35. package/dist/aws-event-stream.cjs.map +1 -0
  36. package/dist/aws-event-stream.d.cts +38 -0
  37. package/dist/aws-event-stream.d.cts.map +1 -0
  38. package/dist/aws-event-stream.d.ts +38 -0
  39. package/dist/aws-event-stream.d.ts.map +1 -0
  40. package/dist/aws-event-stream.js +114 -0
  41. package/dist/aws-event-stream.js.map +1 -0
  42. package/dist/bedrock-converse.cjs +445 -0
  43. package/dist/bedrock-converse.cjs.map +1 -0
  44. package/dist/bedrock-converse.d.cts +50 -0
  45. package/dist/bedrock-converse.d.cts.map +1 -0
  46. package/dist/bedrock-converse.d.ts +50 -0
  47. package/dist/bedrock-converse.d.ts.map +1 -0
  48. package/dist/bedrock-converse.js +443 -0
  49. package/dist/bedrock-converse.js.map +1 -0
  50. package/dist/bedrock.cjs +557 -0
  51. package/dist/bedrock.cjs.map +1 -0
  52. package/dist/bedrock.d.cts +41 -0
  53. package/dist/bedrock.d.cts.map +1 -0
  54. package/dist/bedrock.d.ts +41 -0
  55. package/dist/bedrock.d.ts.map +1 -0
  56. package/dist/bedrock.js +553 -0
  57. package/dist/bedrock.js.map +1 -0
  58. package/dist/chaos.cjs +114 -0
  59. package/dist/chaos.cjs.map +1 -0
  60. package/dist/chaos.d.cts +27 -0
  61. package/dist/chaos.d.cts.map +1 -0
  62. package/dist/chaos.d.ts +27 -0
  63. package/dist/chaos.d.ts.map +1 -0
  64. package/dist/chaos.js +113 -0
  65. package/dist/chaos.js.map +1 -0
  66. package/dist/cli.cjs +268 -0
  67. package/dist/cli.cjs.map +1 -0
  68. package/dist/cli.d.cts +1 -0
  69. package/dist/cli.d.ts +1 -0
  70. package/dist/cli.js +268 -0
  71. package/dist/cli.js.map +1 -0
  72. package/dist/cohere.cjs +434 -0
  73. package/dist/cohere.cjs.map +1 -0
  74. package/dist/cohere.d.cts +34 -0
  75. package/dist/cohere.d.cts.map +1 -0
  76. package/dist/cohere.d.ts +34 -0
  77. package/dist/cohere.d.ts.map +1 -0
  78. package/dist/cohere.js +433 -0
  79. package/dist/cohere.js.map +1 -0
  80. package/dist/config-loader.cjs +111 -0
  81. package/dist/config-loader.cjs.map +1 -0
  82. package/dist/config-loader.d.cts +100 -0
  83. package/dist/config-loader.d.cts.map +1 -0
  84. package/dist/config-loader.d.ts +100 -0
  85. package/dist/config-loader.d.ts.map +1 -0
  86. package/dist/config-loader.js +107 -0
  87. package/dist/config-loader.js.map +1 -0
  88. package/dist/embeddings.cjs +150 -0
  89. package/dist/embeddings.cjs.map +1 -0
  90. package/dist/embeddings.d.cts +12 -0
  91. package/dist/embeddings.d.cts.map +1 -0
  92. package/dist/embeddings.d.ts +12 -0
  93. package/dist/embeddings.d.ts.map +1 -0
  94. package/dist/embeddings.js +150 -0
  95. package/dist/embeddings.js.map +1 -0
  96. package/dist/fixture-loader.cjs +269 -0
  97. package/dist/fixture-loader.cjs.map +1 -0
  98. package/dist/fixture-loader.d.cts +17 -0
  99. package/dist/fixture-loader.d.cts.map +1 -0
  100. package/dist/fixture-loader.d.ts +17 -0
  101. package/dist/fixture-loader.d.ts.map +1 -0
  102. package/dist/fixture-loader.js +265 -0
  103. package/dist/fixture-loader.js.map +1 -0
  104. package/dist/gemini.cjs +403 -0
  105. package/dist/gemini.cjs.map +1 -0
  106. package/dist/gemini.d.cts +10 -0
  107. package/dist/gemini.d.cts.map +1 -0
  108. package/dist/gemini.d.ts +10 -0
  109. package/dist/gemini.d.ts.map +1 -0
  110. package/dist/gemini.js +403 -0
  111. package/dist/gemini.js.map +1 -0
  112. package/dist/helpers.cjs +276 -0
  113. package/dist/helpers.cjs.map +1 -0
  114. package/dist/helpers.d.cts +39 -0
  115. package/dist/helpers.d.cts.map +1 -0
  116. package/dist/helpers.d.ts +39 -0
  117. package/dist/helpers.d.ts.map +1 -0
  118. package/dist/helpers.js +259 -0
  119. package/dist/helpers.js.map +1 -0
  120. package/dist/index.cjs +113 -0
  121. package/dist/index.d.cts +42 -0
  122. package/dist/index.d.ts +42 -0
  123. package/dist/index.js +39 -0
  124. package/dist/interruption.cjs +40 -0
  125. package/dist/interruption.cjs.map +1 -0
  126. package/dist/interruption.d.cts +15 -0
  127. package/dist/interruption.d.cts.map +1 -0
  128. package/dist/interruption.d.ts +15 -0
  129. package/dist/interruption.d.ts.map +1 -0
  130. package/dist/interruption.js +39 -0
  131. package/dist/interruption.js.map +1 -0
  132. package/dist/journal.cjs +65 -0
  133. package/dist/journal.cjs.map +1 -0
  134. package/dist/journal.d.cts +23 -0
  135. package/dist/journal.d.cts.map +1 -0
  136. package/dist/journal.d.ts +23 -0
  137. package/dist/journal.d.ts.map +1 -0
  138. package/dist/journal.js +65 -0
  139. package/dist/journal.js.map +1 -0
  140. package/dist/jsonrpc.cjs +91 -0
  141. package/dist/jsonrpc.cjs.map +1 -0
  142. package/dist/jsonrpc.d.cts +24 -0
  143. package/dist/jsonrpc.d.cts.map +1 -0
  144. package/dist/jsonrpc.d.ts +24 -0
  145. package/dist/jsonrpc.d.ts.map +1 -0
  146. package/dist/jsonrpc.js +90 -0
  147. package/dist/jsonrpc.js.map +1 -0
  148. package/dist/llmock.cjs +223 -0
  149. package/dist/llmock.cjs.map +1 -0
  150. package/dist/llmock.d.cts +70 -0
  151. package/dist/llmock.d.cts.map +1 -0
  152. package/dist/llmock.d.ts +70 -0
  153. package/dist/llmock.d.ts.map +1 -0
  154. package/dist/llmock.js +223 -0
  155. package/dist/llmock.js.map +1 -0
  156. package/dist/logger.cjs +29 -0
  157. package/dist/logger.cjs.map +1 -0
  158. package/dist/logger.d.cts +14 -0
  159. package/dist/logger.d.cts.map +1 -0
  160. package/dist/logger.d.ts +14 -0
  161. package/dist/logger.d.ts.map +1 -0
  162. package/dist/logger.js +28 -0
  163. package/dist/logger.js.map +1 -0
  164. package/dist/mcp-handler.cjs +189 -0
  165. package/dist/mcp-handler.cjs.map +1 -0
  166. package/dist/mcp-handler.js +188 -0
  167. package/dist/mcp-handler.js.map +1 -0
  168. package/dist/mcp-mock.cjs +169 -0
  169. package/dist/mcp-mock.cjs.map +1 -0
  170. package/dist/mcp-mock.d.cts +40 -0
  171. package/dist/mcp-mock.d.cts.map +1 -0
  172. package/dist/mcp-mock.d.ts +40 -0
  173. package/dist/mcp-mock.d.ts.map +1 -0
  174. package/dist/mcp-mock.js +167 -0
  175. package/dist/mcp-mock.js.map +1 -0
  176. package/dist/mcp-stub.cjs +4 -0
  177. package/dist/mcp-stub.d.cts +3 -0
  178. package/dist/mcp-stub.d.ts +3 -0
  179. package/dist/mcp-stub.js +3 -0
  180. package/dist/mcp-types.d.cts +65 -0
  181. package/dist/mcp-types.d.cts.map +1 -0
  182. package/dist/mcp-types.d.ts +65 -0
  183. package/dist/mcp-types.d.ts.map +1 -0
  184. package/dist/messages.cjs +489 -0
  185. package/dist/messages.cjs.map +1 -0
  186. package/dist/messages.d.cts +10 -0
  187. package/dist/messages.d.cts.map +1 -0
  188. package/dist/messages.d.ts +10 -0
  189. package/dist/messages.d.ts.map +1 -0
  190. package/dist/messages.js +489 -0
  191. package/dist/messages.js.map +1 -0
  192. package/dist/metrics.cjs +160 -0
  193. package/dist/metrics.cjs.map +1 -0
  194. package/dist/metrics.d.cts +24 -0
  195. package/dist/metrics.d.cts.map +1 -0
  196. package/dist/metrics.d.ts +24 -0
  197. package/dist/metrics.d.ts.map +1 -0
  198. package/dist/metrics.js +158 -0
  199. package/dist/metrics.js.map +1 -0
  200. package/dist/moderation.cjs +91 -0
  201. package/dist/moderation.cjs.map +1 -0
  202. package/dist/moderation.d.cts +23 -0
  203. package/dist/moderation.d.cts.map +1 -0
  204. package/dist/moderation.d.ts +23 -0
  205. package/dist/moderation.d.ts.map +1 -0
  206. package/dist/moderation.js +91 -0
  207. package/dist/moderation.js.map +1 -0
  208. package/dist/ndjson-writer.cjs +31 -0
  209. package/dist/ndjson-writer.cjs.map +1 -0
  210. package/dist/ndjson-writer.d.cts +17 -0
  211. package/dist/ndjson-writer.d.cts.map +1 -0
  212. package/dist/ndjson-writer.d.ts +17 -0
  213. package/dist/ndjson-writer.d.ts.map +1 -0
  214. package/dist/ndjson-writer.js +31 -0
  215. package/dist/ndjson-writer.js.map +1 -0
  216. package/dist/ollama.cjs +519 -0
  217. package/dist/ollama.cjs.map +1 -0
  218. package/dist/ollama.d.cts +34 -0
  219. package/dist/ollama.d.cts.map +1 -0
  220. package/dist/ollama.d.ts +34 -0
  221. package/dist/ollama.d.ts.map +1 -0
  222. package/dist/ollama.js +517 -0
  223. package/dist/ollama.js.map +1 -0
  224. package/dist/recorder.cjs +311 -0
  225. package/dist/recorder.cjs.map +1 -0
  226. package/dist/recorder.d.cts +23 -0
  227. package/dist/recorder.d.cts.map +1 -0
  228. package/dist/recorder.d.ts +23 -0
  229. package/dist/recorder.d.ts.map +1 -0
  230. package/dist/recorder.js +305 -0
  231. package/dist/recorder.js.map +1 -0
  232. package/dist/rerank.cjs +71 -0
  233. package/dist/rerank.cjs.map +1 -0
  234. package/dist/rerank.d.cts +22 -0
  235. package/dist/rerank.d.cts.map +1 -0
  236. package/dist/rerank.d.ts +22 -0
  237. package/dist/rerank.d.ts.map +1 -0
  238. package/dist/rerank.js +71 -0
  239. package/dist/rerank.js.map +1 -0
  240. package/dist/responses.cjs +637 -0
  241. package/dist/responses.cjs.map +1 -0
  242. package/dist/responses.d.cts +16 -0
  243. package/dist/responses.d.cts.map +1 -0
  244. package/dist/responses.d.ts +16 -0
  245. package/dist/responses.d.ts.map +1 -0
  246. package/dist/responses.js +634 -0
  247. package/dist/responses.js.map +1 -0
  248. package/dist/router.cjs +68 -0
  249. package/dist/router.cjs.map +1 -0
  250. package/dist/router.d.cts +16 -0
  251. package/dist/router.d.cts.map +1 -0
  252. package/dist/router.d.ts +16 -0
  253. package/dist/router.d.ts.map +1 -0
  254. package/dist/router.js +65 -0
  255. package/dist/router.js.map +1 -0
  256. package/dist/search.cjs +59 -0
  257. package/dist/search.cjs.map +1 -0
  258. package/dist/search.d.cts +23 -0
  259. package/dist/search.d.cts.map +1 -0
  260. package/dist/search.d.ts +23 -0
  261. package/dist/search.d.ts.map +1 -0
  262. package/dist/search.js +59 -0
  263. package/dist/search.js.map +1 -0
  264. package/dist/server.cjs +935 -0
  265. package/dist/server.cjs.map +1 -0
  266. package/dist/server.d.cts +28 -0
  267. package/dist/server.d.cts.map +1 -0
  268. package/dist/server.d.ts +28 -0
  269. package/dist/server.d.ts.map +1 -0
  270. package/dist/server.js +933 -0
  271. package/dist/server.js.map +1 -0
  272. package/dist/sse-writer.cjs +59 -0
  273. package/dist/sse-writer.cjs.map +1 -0
  274. package/dist/sse-writer.d.cts +19 -0
  275. package/dist/sse-writer.d.cts.map +1 -0
  276. package/dist/sse-writer.d.ts +19 -0
  277. package/dist/sse-writer.d.ts.map +1 -0
  278. package/dist/sse-writer.js +55 -0
  279. package/dist/sse-writer.js.map +1 -0
  280. package/dist/stream-collapse.cjs +496 -0
  281. package/dist/stream-collapse.cjs.map +1 -0
  282. package/dist/stream-collapse.d.cts +70 -0
  283. package/dist/stream-collapse.d.cts.map +1 -0
  284. package/dist/stream-collapse.d.ts +70 -0
  285. package/dist/stream-collapse.d.ts.map +1 -0
  286. package/dist/stream-collapse.js +489 -0
  287. package/dist/stream-collapse.js.map +1 -0
  288. package/dist/suite.cjs +46 -0
  289. package/dist/suite.cjs.map +1 -0
  290. package/dist/suite.d.cts +31 -0
  291. package/dist/suite.d.cts.map +1 -0
  292. package/dist/suite.d.ts +31 -0
  293. package/dist/suite.d.ts.map +1 -0
  294. package/dist/suite.js +46 -0
  295. package/dist/suite.js.map +1 -0
  296. package/dist/types.d.cts +243 -0
  297. package/dist/types.d.cts.map +1 -0
  298. package/dist/types.d.ts +243 -0
  299. package/dist/types.d.ts.map +1 -0
  300. package/dist/url.cjs +21 -0
  301. package/dist/url.cjs.map +1 -0
  302. package/dist/url.d.cts +16 -0
  303. package/dist/url.d.cts.map +1 -0
  304. package/dist/url.d.ts +16 -0
  305. package/dist/url.d.ts.map +1 -0
  306. package/dist/url.js +20 -0
  307. package/dist/url.js.map +1 -0
  308. package/dist/vector-handler.cjs +239 -0
  309. package/dist/vector-handler.cjs.map +1 -0
  310. package/dist/vector-handler.js +238 -0
  311. package/dist/vector-handler.js.map +1 -0
  312. package/dist/vector-mock.cjs +229 -0
  313. package/dist/vector-mock.cjs.map +1 -0
  314. package/dist/vector-mock.d.cts +39 -0
  315. package/dist/vector-mock.d.cts.map +1 -0
  316. package/dist/vector-mock.d.ts +39 -0
  317. package/dist/vector-mock.d.ts.map +1 -0
  318. package/dist/vector-mock.js +227 -0
  319. package/dist/vector-mock.js.map +1 -0
  320. package/dist/vector-stub.cjs +4 -0
  321. package/dist/vector-stub.d.cts +3 -0
  322. package/dist/vector-stub.d.ts +3 -0
  323. package/dist/vector-stub.js +3 -0
  324. package/dist/vector-types.d.cts +32 -0
  325. package/dist/vector-types.d.cts.map +1 -0
  326. package/dist/vector-types.d.ts +32 -0
  327. package/dist/vector-types.d.ts.map +1 -0
  328. package/dist/watcher.cjs +59 -0
  329. package/dist/watcher.cjs.map +1 -0
  330. package/dist/watcher.js +58 -0
  331. package/dist/watcher.js.map +1 -0
  332. package/dist/ws-framing.cjs +187 -0
  333. package/dist/ws-framing.cjs.map +1 -0
  334. package/dist/ws-framing.d.cts +26 -0
  335. package/dist/ws-framing.d.cts.map +1 -0
  336. package/dist/ws-framing.d.ts +26 -0
  337. package/dist/ws-framing.d.ts.map +1 -0
  338. package/dist/ws-framing.js +184 -0
  339. package/dist/ws-framing.js.map +1 -0
  340. package/dist/ws-gemini-live.cjs +364 -0
  341. package/dist/ws-gemini-live.cjs.map +1 -0
  342. package/dist/ws-gemini-live.d.cts +18 -0
  343. package/dist/ws-gemini-live.d.cts.map +1 -0
  344. package/dist/ws-gemini-live.d.ts +18 -0
  345. package/dist/ws-gemini-live.d.ts.map +1 -0
  346. package/dist/ws-gemini-live.js +364 -0
  347. package/dist/ws-gemini-live.js.map +1 -0
  348. package/dist/ws-realtime.cjs +435 -0
  349. package/dist/ws-realtime.cjs.map +1 -0
  350. package/dist/ws-realtime.d.cts +17 -0
  351. package/dist/ws-realtime.d.cts.map +1 -0
  352. package/dist/ws-realtime.d.ts +17 -0
  353. package/dist/ws-realtime.d.ts.map +1 -0
  354. package/dist/ws-realtime.js +435 -0
  355. package/dist/ws-realtime.js.map +1 -0
  356. package/dist/ws-responses.cjs +164 -0
  357. package/dist/ws-responses.cjs.map +1 -0
  358. package/dist/ws-responses.d.cts +18 -0
  359. package/dist/ws-responses.d.cts.map +1 -0
  360. package/dist/ws-responses.d.ts +18 -0
  361. package/dist/ws-responses.d.ts.map +1 -0
  362. package/dist/ws-responses.js +164 -0
  363. package/dist/ws-responses.js.map +1 -0
  364. package/fixtures/example-greeting.json +12 -0
  365. package/fixtures/example-multi-turn.json +14 -0
  366. package/fixtures/example-tool-call.json +15 -0
  367. package/package.json +118 -0
  368. package/skills/write-fixtures/SKILL.md +625 -0
@@ -0,0 +1,290 @@
1
+ import { flattenHeaders, generateId, readBody } from "./helpers.js";
2
+ import { TERMINAL_STATES, buildAgentCard, createA2AMethods, extractText, findStreamingMatch } from "./a2a-handler.js";
3
+ import { createJsonRpcDispatcher } from "./jsonrpc.js";
4
+ import * as http from "node:http";
5
+
6
+ //#region src/a2a-mock.ts
7
+ var A2AMock = class {
8
+ agents = /* @__PURE__ */ new Map();
9
+ tasks = /* @__PURE__ */ new Map();
10
+ server = null;
11
+ journal = null;
12
+ registry = null;
13
+ options;
14
+ baseUrl = "";
15
+ dispatcher;
16
+ constructor(options) {
17
+ this.options = options ?? {};
18
+ this.dispatcher = this.buildDispatcher();
19
+ }
20
+ buildDispatcher() {
21
+ return createJsonRpcDispatcher({ methods: createA2AMethods(this.agents, this.tasks) });
22
+ }
23
+ registerAgent(def) {
24
+ this.agents.set(def.name, {
25
+ def,
26
+ patterns: []
27
+ });
28
+ return this;
29
+ }
30
+ onMessage(agentName, pattern, parts) {
31
+ const agent = this.agents.get(agentName);
32
+ if (!agent) throw new Error(`Agent "${agentName}" not registered`);
33
+ agent.patterns.push({
34
+ kind: "message",
35
+ pattern,
36
+ agentName,
37
+ parts
38
+ });
39
+ return this;
40
+ }
41
+ onTask(agentName, pattern, artifacts) {
42
+ const agent = this.agents.get(agentName);
43
+ if (!agent) throw new Error(`Agent "${agentName}" not registered`);
44
+ agent.patterns.push({
45
+ kind: "task",
46
+ pattern,
47
+ agentName,
48
+ artifacts
49
+ });
50
+ return this;
51
+ }
52
+ onStreamingTask(agentName, pattern, events, delayMs) {
53
+ const agent = this.agents.get(agentName);
54
+ if (!agent) throw new Error(`Agent "${agentName}" not registered`);
55
+ agent.patterns.push({
56
+ kind: "streamingTask",
57
+ pattern,
58
+ agentName,
59
+ events,
60
+ delayMs
61
+ });
62
+ return this;
63
+ }
64
+ async handleRequest(req, res, pathname) {
65
+ if (req.method === "GET" && pathname === "/.well-known/agent-card.json") {
66
+ if (this.registry) this.registry.incrementCounter("aimock_a2a_requests_total", { method: "GetAgentCard" });
67
+ const card = buildAgentCard(this.agents, this.baseUrl);
68
+ res.writeHead(200, {
69
+ "Content-Type": "application/json",
70
+ "A2A-Version": "1.0"
71
+ });
72
+ res.end(JSON.stringify(card));
73
+ return true;
74
+ }
75
+ if (req.method === "POST" && (pathname === "/" || pathname === "")) {
76
+ const body = await readBody(req);
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(body);
80
+ } catch {
81
+ res.writeHead(200, {
82
+ "Content-Type": "application/json",
83
+ "A2A-Version": "1.0"
84
+ });
85
+ res.end(JSON.stringify({
86
+ jsonrpc: "2.0",
87
+ id: null,
88
+ error: {
89
+ code: -32700,
90
+ message: "Parse error"
91
+ }
92
+ }));
93
+ return true;
94
+ }
95
+ if (this.registry) {
96
+ const rpcMethod = typeof parsed === "object" && parsed !== null && "method" in parsed ? String(parsed.method) : "unknown";
97
+ this.registry.incrementCounter("aimock_a2a_requests_total", { method: rpcMethod });
98
+ }
99
+ if (isStreamingRequest(parsed)) {
100
+ await this.handleStreamingMessage(parsed, req, res);
101
+ return true;
102
+ }
103
+ res.setHeader("A2A-Version", "1.0");
104
+ await this.dispatcher(req, res, body);
105
+ if (this.journal) this.journal.add({
106
+ method: req.method ?? "POST",
107
+ path: pathname,
108
+ headers: flattenHeaders(req.headers),
109
+ body: null,
110
+ service: "a2a",
111
+ response: {
112
+ status: res.statusCode,
113
+ fixture: null
114
+ }
115
+ });
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ health() {
121
+ return {
122
+ status: "ok",
123
+ agents: this.agents.size,
124
+ tasks: this.tasks.size
125
+ };
126
+ }
127
+ setJournal(journal) {
128
+ this.journal = journal;
129
+ }
130
+ setRegistry(registry) {
131
+ this.registry = registry;
132
+ }
133
+ async start() {
134
+ if (this.server) throw new Error("A2AMock server already started");
135
+ const host = this.options.host ?? "127.0.0.1";
136
+ const port = this.options.port ?? 0;
137
+ return new Promise((resolve, reject) => {
138
+ const srv = http.createServer(async (req, res) => {
139
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
140
+ await this.handleRequest(req, res, url.pathname).catch((err) => {
141
+ console.error("A2AMock request error:", err);
142
+ if (!res.headersSent) {
143
+ res.writeHead(500);
144
+ res.end("Internal server error");
145
+ }
146
+ });
147
+ });
148
+ srv.on("error", reject);
149
+ srv.listen(port, host, () => {
150
+ const addr = srv.address();
151
+ if (typeof addr === "object" && addr !== null) this.baseUrl = `http://${host}:${addr.port}`;
152
+ this.server = srv;
153
+ resolve(this.baseUrl);
154
+ });
155
+ });
156
+ }
157
+ async stop() {
158
+ if (!this.server) throw new Error("A2AMock server not started");
159
+ const srv = this.server;
160
+ await new Promise((resolve, reject) => {
161
+ srv.close((err) => err ? reject(err) : resolve());
162
+ });
163
+ this.server = null;
164
+ }
165
+ get url() {
166
+ if (!this.server) throw new Error("A2AMock server not started");
167
+ return this.baseUrl;
168
+ }
169
+ reset() {
170
+ this.agents.clear();
171
+ this.tasks.clear();
172
+ return this;
173
+ }
174
+ setBaseUrl(url) {
175
+ this.baseUrl = url;
176
+ }
177
+ async handleStreamingMessage(parsed, req, res) {
178
+ const params = parsed.params;
179
+ const id = parsed.id;
180
+ const text = extractText(params);
181
+ const entry = findStreamingMatch(text, this.agents);
182
+ if (!entry) {
183
+ res.writeHead(200, {
184
+ "Content-Type": "application/json",
185
+ "A2A-Version": "1.0"
186
+ });
187
+ res.end(JSON.stringify({
188
+ jsonrpc: "2.0",
189
+ id,
190
+ error: {
191
+ code: -32e3,
192
+ message: "No matching pattern for message"
193
+ }
194
+ }));
195
+ return;
196
+ }
197
+ const taskId = generateId("task");
198
+ const contextId = generateId("ctx");
199
+ const userParts = params?.message ? params.message.parts ?? [{ text }] : [{ text }];
200
+ const task = {
201
+ id: taskId,
202
+ contextId,
203
+ status: {
204
+ state: "TASK_STATE_WORKING",
205
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
206
+ },
207
+ artifacts: [],
208
+ history: [{
209
+ messageId: generateId("msg"),
210
+ role: "ROLE_USER",
211
+ parts: userParts
212
+ }]
213
+ };
214
+ this.tasks.set(taskId, task);
215
+ res.writeHead(200, {
216
+ "Content-Type": "text/event-stream",
217
+ "Cache-Control": "no-cache",
218
+ Connection: "keep-alive",
219
+ "A2A-Version": "1.0"
220
+ });
221
+ const delayMs = entry.delayMs ?? 0;
222
+ for (const event of entry.events) {
223
+ if (delayMs > 0) await delay(delayMs);
224
+ let resultPayload;
225
+ if (event.type === "status") {
226
+ task.status = {
227
+ state: event.state,
228
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
229
+ };
230
+ resultPayload = { task: {
231
+ id: task.id,
232
+ contextId: task.contextId,
233
+ status: task.status
234
+ } };
235
+ } else {
236
+ const artifact = {
237
+ parts: event.parts,
238
+ name: event.name,
239
+ append: event.append,
240
+ lastChunk: event.lastChunk
241
+ };
242
+ task.artifacts.push({
243
+ parts: event.parts,
244
+ name: event.name
245
+ });
246
+ resultPayload = {
247
+ task: {
248
+ id: task.id,
249
+ contextId: task.contextId,
250
+ status: task.status
251
+ },
252
+ artifact
253
+ };
254
+ }
255
+ const envelope = JSON.stringify({
256
+ jsonrpc: "2.0",
257
+ id,
258
+ result: resultPayload
259
+ });
260
+ res.write(`data: ${envelope}\n\n`);
261
+ }
262
+ if (!TERMINAL_STATES.has(task.status.state)) task.status = {
263
+ state: "TASK_STATE_COMPLETED",
264
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
265
+ };
266
+ res.end();
267
+ if (this.journal) this.journal.add({
268
+ method: "POST",
269
+ path: "/",
270
+ headers: flattenHeaders(req.headers),
271
+ body: null,
272
+ service: "a2a",
273
+ response: {
274
+ status: res.statusCode,
275
+ fixture: null
276
+ }
277
+ });
278
+ }
279
+ };
280
+ function isStreamingRequest(parsed) {
281
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return false;
282
+ return parsed.method === "SendStreamingMessage";
283
+ }
284
+ function delay(ms) {
285
+ return new Promise((resolve) => setTimeout(resolve, ms));
286
+ }
287
+
288
+ //#endregion
289
+ export { A2AMock };
290
+ //# sourceMappingURL=a2a-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-mock.js","names":[],"sources":["../src/a2a-mock.ts"],"sourcesContent":["import * as http from \"node:http\";\nimport type { Mountable } from \"./types.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { MetricsRegistry } from \"./metrics.js\";\nimport type {\n A2AAgentDefinition,\n A2AArtifact,\n A2AMockOptions,\n A2APart,\n A2AStreamEvent,\n A2ATask,\n} from \"./a2a-types.js\";\nimport type { PatternEntry } from \"./a2a-handler.js\";\nimport {\n buildAgentCard,\n createA2AMethods,\n extractText,\n findStreamingMatch,\n TERMINAL_STATES,\n} from \"./a2a-handler.js\";\nimport { createJsonRpcDispatcher } from \"./jsonrpc.js\";\nimport { generateId, flattenHeaders, readBody } from \"./helpers.js\";\n\nexport class A2AMock implements Mountable {\n private agents: Map<string, { def: A2AAgentDefinition; patterns: PatternEntry[] }> = new Map();\n private tasks: Map<string, A2ATask> = new Map();\n private server: http.Server | null = null;\n private journal: Journal | null = null;\n private registry: MetricsRegistry | null = null;\n private options: A2AMockOptions;\n private baseUrl = \"\";\n private dispatcher: ReturnType<typeof createJsonRpcDispatcher>;\n\n constructor(options?: A2AMockOptions) {\n this.options = options ?? {};\n this.dispatcher = this.buildDispatcher();\n }\n\n private buildDispatcher() {\n const methods = createA2AMethods(this.agents, this.tasks);\n return createJsonRpcDispatcher({ methods });\n }\n\n // ---- Agent registration ----\n\n registerAgent(def: A2AAgentDefinition): this {\n this.agents.set(def.name, { def, patterns: [] });\n return this;\n }\n\n // ---- Pattern registration ----\n\n onMessage(agentName: string, pattern: string | RegExp, parts: A2APart[]): this {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not registered`);\n }\n agent.patterns.push({ kind: \"message\", pattern, agentName, parts });\n return this;\n }\n\n onTask(agentName: string, pattern: string | RegExp, artifacts: A2AArtifact[]): this {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not registered`);\n }\n agent.patterns.push({ kind: \"task\", pattern, agentName, artifacts });\n return this;\n }\n\n onStreamingTask(\n agentName: string,\n pattern: string | RegExp,\n events: A2AStreamEvent[],\n delayMs?: number,\n ): this {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not registered`);\n }\n agent.patterns.push({ kind: \"streamingTask\", pattern, agentName, events, delayMs });\n return this;\n }\n\n // ---- Mountable interface ----\n\n async handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n pathname: string,\n ): Promise<boolean> {\n // Agent card endpoint\n if (req.method === \"GET\" && pathname === \"/.well-known/agent-card.json\") {\n if (this.registry) {\n this.registry.incrementCounter(\"aimock_a2a_requests_total\", { method: \"GetAgentCard\" });\n }\n const card = buildAgentCard(this.agents, this.baseUrl);\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"A2A-Version\": \"1.0\",\n });\n res.end(JSON.stringify(card));\n return true;\n }\n\n // JSON-RPC endpoint\n if (req.method === \"POST\" && (pathname === \"/\" || pathname === \"\")) {\n const body = await readBody(req);\n\n // Check for SendStreamingMessage before dispatching\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"A2A-Version\": \"1.0\",\n });\n res.end(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32700, message: \"Parse error\" },\n }),\n );\n return true;\n }\n\n // Record A2A method metric\n if (this.registry) {\n const rpcMethod =\n typeof parsed === \"object\" && parsed !== null && \"method\" in parsed\n ? String((parsed as Record<string, unknown>).method)\n : \"unknown\";\n this.registry.incrementCounter(\"aimock_a2a_requests_total\", { method: rpcMethod });\n }\n\n if (isStreamingRequest(parsed)) {\n await this.handleStreamingMessage(parsed as Record<string, unknown>, req, res);\n return true;\n }\n\n // Regular JSON-RPC dispatch\n // Add A2A-Version header before dispatching\n res.setHeader(\"A2A-Version\", \"1.0\");\n\n await this.dispatcher(req, res, body);\n\n // Journal the request after the handler completes\n if (this.journal) {\n this.journal.add({\n method: req.method ?? \"POST\",\n path: pathname,\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"a2a\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n\n return true;\n }\n\n return false;\n }\n\n health(): { status: string; agents: number; tasks: number } {\n return {\n status: \"ok\",\n agents: this.agents.size,\n tasks: this.tasks.size,\n };\n }\n\n setJournal(journal: Journal): void {\n this.journal = journal;\n }\n\n setRegistry(registry: MetricsRegistry): void {\n this.registry = registry;\n }\n\n // ---- Standalone mode ----\n\n async start(): Promise<string> {\n if (this.server) {\n throw new Error(\"A2AMock server already started\");\n }\n\n const host = this.options.host ?? \"127.0.0.1\";\n const port = this.options.port ?? 0;\n\n return new Promise<string>((resolve, reject) => {\n const srv = http.createServer(async (req, res) => {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n await this.handleRequest(req, res, url.pathname).catch((err) => {\n console.error(\"A2AMock request error:\", err);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal server error\");\n }\n });\n });\n\n srv.on(\"error\", reject);\n\n srv.listen(port, host, () => {\n const addr = srv.address();\n if (typeof addr === \"object\" && addr !== null) {\n this.baseUrl = `http://${host}:${addr.port}`;\n }\n this.server = srv;\n resolve(this.baseUrl);\n });\n });\n }\n\n async stop(): Promise<void> {\n if (!this.server) {\n throw new Error(\"A2AMock server not started\");\n }\n const srv = this.server;\n await new Promise<void>((resolve, reject) => {\n srv.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n });\n this.server = null;\n }\n\n get url(): string {\n if (!this.server) {\n throw new Error(\"A2AMock server not started\");\n }\n return this.baseUrl;\n }\n\n // ---- Reset ----\n\n reset(): this {\n this.agents.clear();\n this.tasks.clear();\n return this;\n }\n\n // ---- Internal: set base URL when mounted ----\n\n setBaseUrl(url: string): void {\n this.baseUrl = url;\n }\n\n // ---- Private: streaming handler ----\n\n private async handleStreamingMessage(\n parsed: Record<string, unknown>,\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): Promise<void> {\n const params = parsed.params as Record<string, unknown> | undefined;\n const id = parsed.id as string | number;\n const text = extractText(params);\n const entry = findStreamingMatch(text, this.agents);\n\n if (!entry) {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"A2A-Version\": \"1.0\",\n });\n res.end(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n error: { code: -32000, message: \"No matching pattern for message\" },\n }),\n );\n return;\n }\n\n // Create task for the streaming response\n const taskId = generateId(\"task\");\n const contextId = generateId(\"ctx\");\n const userParts: A2APart[] = params?.message\n ? (((params.message as Record<string, unknown>).parts as A2APart[]) ?? [{ text }])\n : [{ text }];\n\n const task: A2ATask = {\n id: taskId,\n contextId,\n status: { state: \"TASK_STATE_WORKING\", timestamp: new Date().toISOString() },\n artifacts: [],\n history: [\n {\n messageId: generateId(\"msg\"),\n role: \"ROLE_USER\",\n parts: userParts,\n },\n ],\n };\n this.tasks.set(taskId, task);\n\n // Write SSE response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"A2A-Version\": \"1.0\",\n });\n\n const delayMs = entry.delayMs ?? 0;\n\n for (const event of entry.events) {\n if (delayMs > 0) {\n await delay(delayMs);\n }\n\n let resultPayload: Record<string, unknown>;\n\n if (event.type === \"status\") {\n task.status = { state: event.state, timestamp: new Date().toISOString() };\n resultPayload = {\n task: {\n id: task.id,\n contextId: task.contextId,\n status: task.status,\n },\n };\n } else {\n // artifact event\n const artifact = {\n parts: event.parts,\n name: event.name,\n append: event.append,\n lastChunk: event.lastChunk,\n };\n task.artifacts.push({ parts: event.parts, name: event.name });\n resultPayload = {\n task: {\n id: task.id,\n contextId: task.contextId,\n status: task.status,\n },\n artifact,\n };\n }\n\n const envelope = JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n result: resultPayload,\n });\n\n res.write(`data: ${envelope}\\n\\n`);\n }\n\n // Final completion — only set COMPLETED if the task is not already in a terminal state\n if (!TERMINAL_STATES.has(task.status.state)) {\n task.status = { state: \"TASK_STATE_COMPLETED\", timestamp: new Date().toISOString() };\n }\n\n res.end();\n\n // Journal\n if (this.journal) {\n this.journal.add({\n method: \"POST\",\n path: \"/\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"a2a\",\n response: { status: res.statusCode, fixture: null },\n });\n }\n }\n}\n\n// ---- Helpers ----\n\nfunction isStreamingRequest(parsed: unknown): boolean {\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n return obj.method === \"SendStreamingMessage\";\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_a2a_mock = require('./a2a-mock.cjs');
3
+
4
+ exports.A2AMock = require_a2a_mock.A2AMock;
@@ -0,0 +1,3 @@
1
+ import { A2AAgentDefinition, A2AArtifact, A2AMessage, A2AMockOptions, A2APart, A2ARole, A2AStreamEvent, A2ATask, A2ATaskResponse, A2ATaskState } from "./a2a-types.cjs";
2
+ import { A2AMock } from "./a2a-mock.cjs";
3
+ export { type A2AAgentDefinition, type A2AArtifact, type A2AMessage, A2AMock, type A2AMockOptions, type A2APart, type A2ARole, type A2AStreamEvent, type A2ATask, type A2ATaskResponse, type A2ATaskState };
@@ -0,0 +1,3 @@
1
+ import { A2AAgentDefinition, A2AArtifact, A2AMessage, A2AMockOptions, A2APart, A2ARole, A2AStreamEvent, A2ATask, A2ATaskResponse, A2ATaskState } from "./a2a-types.js";
2
+ import { A2AMock } from "./a2a-mock.js";
3
+ export { type A2AAgentDefinition, type A2AArtifact, type A2AMessage, A2AMock, type A2AMockOptions, type A2APart, type A2ARole, type A2AStreamEvent, type A2ATask, type A2ATaskResponse, type A2ATaskState };
@@ -0,0 +1,3 @@
1
+ import { A2AMock } from "./a2a-mock.js";
2
+
3
+ export { A2AMock };
@@ -0,0 +1,68 @@
1
+ //#region src/a2a-types.d.ts
2
+ interface A2AMockOptions {
3
+ port?: number;
4
+ host?: string;
5
+ }
6
+ interface A2AAgentDefinition {
7
+ name: string;
8
+ description?: string;
9
+ version?: string;
10
+ skills?: Array<{
11
+ id: string;
12
+ name: string;
13
+ description?: string;
14
+ tags?: string[];
15
+ }>;
16
+ capabilities?: {
17
+ streaming?: boolean;
18
+ };
19
+ }
20
+ type A2APart = {
21
+ text: string;
22
+ } | {
23
+ data: unknown;
24
+ mediaType?: string;
25
+ } | {
26
+ url: string;
27
+ mediaType?: string;
28
+ };
29
+ interface A2AArtifact {
30
+ artifactId?: string;
31
+ name?: string;
32
+ description?: string;
33
+ parts: A2APart[];
34
+ }
35
+ interface A2ATaskResponse {
36
+ artifacts?: A2AArtifact[];
37
+ }
38
+ type A2AStreamEvent = {
39
+ type: "status";
40
+ state: A2ATaskState;
41
+ } | {
42
+ type: "artifact";
43
+ parts: A2APart[];
44
+ append?: boolean;
45
+ lastChunk?: boolean;
46
+ name?: string;
47
+ };
48
+ interface A2ATask {
49
+ id: string;
50
+ contextId: string;
51
+ status: {
52
+ state: A2ATaskState;
53
+ timestamp: string;
54
+ };
55
+ artifacts: A2AArtifact[];
56
+ history: A2AMessage[];
57
+ }
58
+ type A2ARole = "ROLE_USER" | "ROLE_AGENT";
59
+ interface A2AMessage {
60
+ messageId: string;
61
+ role: A2ARole;
62
+ parts: A2APart[];
63
+ }
64
+ type A2ATaskState = "TASK_STATE_SUBMITTED" | "TASK_STATE_WORKING" | "TASK_STATE_COMPLETED" | "TASK_STATE_FAILED" | "TASK_STATE_CANCELED" | "TASK_STATE_INPUT_REQUIRED";
65
+ //# sourceMappingURL=a2a-types.d.ts.map
66
+ //#endregion
67
+ export { A2AAgentDefinition, A2AArtifact, A2AMessage, A2AMockOptions, A2APart, A2ARole, A2AStreamEvent, A2ATask, A2ATaskResponse, A2ATaskState };
68
+ //# sourceMappingURL=a2a-types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-types.d.cts","names":[],"sources":["../src/a2a-types.ts"],"sourcesContent":[],"mappings":";UAAiB,cAAA;EAAA,IAAA,CAAA,EAAA,MAAA;EAKA,IAAA,CAAA,EAAA,MAAA;AAQjB;AAKiB,UAbA,kBAAA,CAiBR;EAGQ,IAAA,EAAA,MAAA;EAIL,WAAA,CAAA,EAAA,MAAc;EAAA,OAAA,CAAA,EAAA,MAAA;QACG,CAAA,EArBlB,KAqBkB,CAAA;IACE,EAAA,EAAA,MAAA;IAAO,IAAA,EAAA,MAAA;IAErB,WAAO,CAAA,EAAA,MAAA;IAAA,IAAA,CAAA,EAAA,MAAA,EAAA;;cAIX,CAAA,EAAA;IACF,SAAA,CAAA,EAAA,OAAA;EAAU,CAAA;AAGrB;AAEiB,KA9BL,OAAA,GA8Be;EAAA,IAAA,EAAA,MAAA;;MAGlB,EAAA,OAAA;EAAO,SAAA,CAAA,EAAA,MAAA;AAGhB,CAAA,GAAY;;;;UA/BK,WAAA;;;;SAIR;;UAGQ,eAAA;cACH;;KAGF,cAAA;;SACiB;;;SACE;;;;;UAEd,OAAA;;;;WAGE;;;aACN;WACF;;KAGC,OAAA;UAEK,UAAA;;QAET;SACC;;KAGG,YAAA"}
@@ -0,0 +1,68 @@
1
+ //#region src/a2a-types.d.ts
2
+ interface A2AMockOptions {
3
+ port?: number;
4
+ host?: string;
5
+ }
6
+ interface A2AAgentDefinition {
7
+ name: string;
8
+ description?: string;
9
+ version?: string;
10
+ skills?: Array<{
11
+ id: string;
12
+ name: string;
13
+ description?: string;
14
+ tags?: string[];
15
+ }>;
16
+ capabilities?: {
17
+ streaming?: boolean;
18
+ };
19
+ }
20
+ type A2APart = {
21
+ text: string;
22
+ } | {
23
+ data: unknown;
24
+ mediaType?: string;
25
+ } | {
26
+ url: string;
27
+ mediaType?: string;
28
+ };
29
+ interface A2AArtifact {
30
+ artifactId?: string;
31
+ name?: string;
32
+ description?: string;
33
+ parts: A2APart[];
34
+ }
35
+ interface A2ATaskResponse {
36
+ artifacts?: A2AArtifact[];
37
+ }
38
+ type A2AStreamEvent = {
39
+ type: "status";
40
+ state: A2ATaskState;
41
+ } | {
42
+ type: "artifact";
43
+ parts: A2APart[];
44
+ append?: boolean;
45
+ lastChunk?: boolean;
46
+ name?: string;
47
+ };
48
+ interface A2ATask {
49
+ id: string;
50
+ contextId: string;
51
+ status: {
52
+ state: A2ATaskState;
53
+ timestamp: string;
54
+ };
55
+ artifacts: A2AArtifact[];
56
+ history: A2AMessage[];
57
+ }
58
+ type A2ARole = "ROLE_USER" | "ROLE_AGENT";
59
+ interface A2AMessage {
60
+ messageId: string;
61
+ role: A2ARole;
62
+ parts: A2APart[];
63
+ }
64
+ type A2ATaskState = "TASK_STATE_SUBMITTED" | "TASK_STATE_WORKING" | "TASK_STATE_COMPLETED" | "TASK_STATE_FAILED" | "TASK_STATE_CANCELED" | "TASK_STATE_INPUT_REQUIRED";
65
+ //# sourceMappingURL=a2a-types.d.ts.map
66
+ //#endregion
67
+ export { A2AAgentDefinition, A2AArtifact, A2AMessage, A2AMockOptions, A2APart, A2ARole, A2AStreamEvent, A2ATask, A2ATaskResponse, A2ATaskState };
68
+ //# sourceMappingURL=a2a-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-types.d.ts","names":[],"sources":["../src/a2a-types.ts"],"sourcesContent":[],"mappings":";UAAiB,cAAA;EAAA,IAAA,CAAA,EAAA,MAAA;EAKA,IAAA,CAAA,EAAA,MAAA;AAQjB;AAKiB,UAbA,kBAAA,CAiBR;EAGQ,IAAA,EAAA,MAAA;EAIL,WAAA,CAAA,EAAA,MAAc;EAAA,OAAA,CAAA,EAAA,MAAA;QACG,CAAA,EArBlB,KAqBkB,CAAA;IACE,EAAA,EAAA,MAAA;IAAO,IAAA,EAAA,MAAA;IAErB,WAAO,CAAA,EAAA,MAAA;IAAA,IAAA,CAAA,EAAA,MAAA,EAAA;;cAIX,CAAA,EAAA;IACF,SAAA,CAAA,EAAA,OAAA;EAAU,CAAA;AAGrB;AAEiB,KA9BL,OAAA,GA8Be;EAAA,IAAA,EAAA,MAAA;;MAGlB,EAAA,OAAA;EAAO,SAAA,CAAA,EAAA,MAAA;AAGhB,CAAA,GAAY;;;;UA/BK,WAAA;;;;SAIR;;UAGQ,eAAA;cACH;;KAGF,cAAA;;SACiB;;;SACE;;;;;UAEd,OAAA;;;;WAGE;;;aACN;WACF;;KAGC,OAAA;UAEK,UAAA;;QAET;SACC;;KAGG,YAAA"}
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
4
+ const require_config_loader = require('./config-loader.cjs');
5
+ let node_util = require("node:util");
6
+ let node_path = require("node:path");
7
+
8
+ //#region src/aimock-cli.ts
9
+ const HELP = `
10
+ Usage: aimock [options]
11
+
12
+ Options:
13
+ -c, --config <path> Path to aimock config JSON file (required)
14
+ -p, --port <number> Port override (default: from config or 0)
15
+ -h, --host <string> Host override (default: from config or 127.0.0.1)
16
+ --help Show this help message
17
+ `.trim();
18
+ function runAimockCli(deps = {}) {
19
+ /* v8 ignore next 6 -- defaults used only when called from CLI entry point */
20
+ const argv = deps.argv ?? process.argv.slice(2);
21
+ const log = deps.log ?? console.log.bind(console);
22
+ const logError = deps.logError ?? console.error.bind(console);
23
+ const exit = deps.exit ?? process.exit.bind(process);
24
+ const loadConfigFn = deps.loadConfigFn ?? require_config_loader.loadConfig;
25
+ const startFromConfigFn = deps.startFromConfigFn ?? require_config_loader.startFromConfig;
26
+ let values;
27
+ try {
28
+ ({values} = (0, node_util.parseArgs)({
29
+ args: argv,
30
+ options: {
31
+ config: {
32
+ type: "string",
33
+ short: "c"
34
+ },
35
+ port: {
36
+ type: "string",
37
+ short: "p"
38
+ },
39
+ host: {
40
+ type: "string",
41
+ short: "h"
42
+ },
43
+ help: {
44
+ type: "boolean",
45
+ default: false
46
+ }
47
+ },
48
+ strict: true
49
+ }));
50
+ } catch (err) {
51
+ logError(`Error: ${err instanceof Error ? err.message : String(err)}\n\n${HELP}`);
52
+ exit(1);
53
+ return;
54
+ }
55
+ if (values.help) {
56
+ log(HELP);
57
+ exit(0);
58
+ return;
59
+ }
60
+ if (!values.config) {
61
+ logError("Error: --config is required.\n\n" + HELP);
62
+ exit(1);
63
+ return;
64
+ }
65
+ const configPath = (0, node_path.resolve)(values.config);
66
+ let config;
67
+ try {
68
+ config = loadConfigFn(configPath);
69
+ } catch (err) {
70
+ logError(`Failed to load config from ${configPath}: ${err instanceof Error ? err.message : String(err)}`);
71
+ exit(1);
72
+ return;
73
+ }
74
+ const port = values.port ? Number(values.port) : void 0;
75
+ if (port !== void 0 && (Number.isNaN(port) || !Number.isInteger(port) || port < 0 || port > 65535)) {
76
+ logError(`Error: invalid port "${values.port}".\n\n${HELP}`);
77
+ exit(1);
78
+ return;
79
+ }
80
+ const host = values.host;
81
+ async function main() {
82
+ const { llmock, url } = await startFromConfigFn(config, {
83
+ port,
84
+ host
85
+ });
86
+ log(`aimock server listening on ${url}`);
87
+ function shutdown() {
88
+ log("Shutting down...");
89
+ process.removeListener("SIGINT", shutdown);
90
+ process.removeListener("SIGTERM", shutdown);
91
+ llmock.stop().then(() => exit(0), (err) => {
92
+ logError(`Shutdown error: ${err instanceof Error ? err.message : String(err)}`);
93
+ exit(1);
94
+ });
95
+ }
96
+ process.on("SIGINT", shutdown);
97
+ process.on("SIGTERM", shutdown);
98
+ if (deps.onReady) deps.onReady({ shutdown });
99
+ }
100
+ main().catch((err) => {
101
+ logError(err instanceof Error ? err.message : String(err));
102
+ exit(1);
103
+ });
104
+ }
105
+ /* v8 ignore start -- entry-point guard, exercised by integration tests */
106
+ const scriptName = process.argv[1] ?? "";
107
+ if (scriptName.endsWith("aimock-cli.js") || scriptName.endsWith("aimock-cli.ts")) runAimockCli();
108
+ /* v8 ignore stop */
109
+
110
+ //#endregion
111
+ exports.runAimockCli = runAimockCli;
112
+ //# sourceMappingURL=aimock-cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aimock-cli.cjs","names":["loadConfig","startFromConfig"],"sources":["../src/aimock-cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { resolve } from \"node:path\";\nimport { loadConfig, startFromConfig } from \"./config-loader.js\";\n\nconst HELP = `\nUsage: aimock [options]\n\nOptions:\n -c, --config <path> Path to aimock config JSON file (required)\n -p, --port <number> Port override (default: from config or 0)\n -h, --host <string> Host override (default: from config or 127.0.0.1)\n --help Show this help message\n`.trim();\n\nexport interface AimockCliDeps {\n argv?: string[];\n log?: (msg: string) => void;\n logError?: (msg: string) => void;\n exit?: (code: number) => void;\n loadConfigFn?: typeof loadConfig;\n startFromConfigFn?: typeof startFromConfig;\n onReady?: (ctx: { shutdown: () => void }) => void;\n}\n\nexport function runAimockCli(deps: AimockCliDeps = {}): void {\n /* v8 ignore next 6 -- defaults used only when called from CLI entry point */\n const argv = deps.argv ?? process.argv.slice(2);\n const log = deps.log ?? console.log.bind(console);\n const logError = deps.logError ?? console.error.bind(console);\n const exit = deps.exit ?? process.exit.bind(process);\n const loadConfigFn = deps.loadConfigFn ?? loadConfig;\n const startFromConfigFn = deps.startFromConfigFn ?? startFromConfig;\n\n let values;\n try {\n ({ values } = parseArgs({\n args: argv,\n options: {\n config: { type: \"string\", short: \"c\" },\n port: { type: \"string\", short: \"p\" },\n host: { type: \"string\", short: \"h\" },\n help: { type: \"boolean\", default: false },\n },\n strict: true,\n }));\n } catch (err) {\n /* v8 ignore next -- parseArgs always throws Error subclasses */\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Error: ${msg}\\n\\n${HELP}`);\n exit(1);\n return;\n }\n\n if (values.help) {\n log(HELP);\n exit(0);\n return;\n }\n if (!values.config) {\n logError(\"Error: --config is required.\\n\\n\" + HELP);\n exit(1);\n return;\n }\n\n const configPath = resolve(values.config);\n let config;\n try {\n config = loadConfigFn(configPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Failed to load config from ${configPath}: ${msg}`);\n exit(1);\n return;\n }\n\n const port = values.port ? Number(values.port) : undefined;\n if (\n port !== undefined &&\n (Number.isNaN(port) || !Number.isInteger(port) || port < 0 || port > 65535)\n ) {\n logError(`Error: invalid port \"${values.port}\".\\n\\n${HELP}`);\n exit(1);\n return;\n }\n const host = values.host;\n\n async function main() {\n const { llmock, url } = await startFromConfigFn(config!, { port, host });\n log(`aimock server listening on ${url}`);\n\n function shutdown() {\n log(\"Shutting down...\");\n process.removeListener(\"SIGINT\", shutdown);\n process.removeListener(\"SIGTERM\", shutdown);\n llmock.stop().then(\n () => exit(0),\n (err) => {\n logError(`Shutdown error: ${err instanceof Error ? err.message : String(err)}`);\n exit(1);\n },\n );\n }\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n if (deps.onReady) {\n deps.onReady({ shutdown });\n }\n }\n\n main().catch((err) => {\n logError(err instanceof Error ? err.message : String(err));\n exit(1);\n });\n}\n\n// Run when executed as a script (not when imported for testing).\n/* v8 ignore start -- entry-point guard, exercised by integration tests */\nconst scriptName = process.argv[1] ?? \"\";\nif (scriptName.endsWith(\"aimock-cli.js\") || scriptName.endsWith(\"aimock-cli.ts\")) {\n runAimockCli();\n}\n/* v8 ignore stop */\n"],"mappings":";;;;;;;;AAKA,MAAM,OAAO;;;;;;;;EAQX,MAAM;AAYR,SAAgB,aAAa,OAAsB,EAAE,EAAQ;;CAE3D,MAAM,OAAO,KAAK,QAAQ,QAAQ,KAAK,MAAM,EAAE;CAC/C,MAAM,MAAM,KAAK,OAAO,QAAQ,IAAI,KAAK,QAAQ;CACjD,MAAM,WAAW,KAAK,YAAY,QAAQ,MAAM,KAAK,QAAQ;CAC7D,MAAM,OAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK,QAAQ;CACpD,MAAM,eAAe,KAAK,gBAAgBA;CAC1C,MAAM,oBAAoB,KAAK,qBAAqBC;CAEpD,IAAI;AACJ,KAAI;AACF,GAAC,CAAE,mCAAqB;GACtB,MAAM;GACN,SAAS;IACP,QAAQ;KAAE,MAAM;KAAU,OAAO;KAAK;IACtC,MAAM;KAAE,MAAM;KAAU,OAAO;KAAK;IACpC,MAAM;KAAE,MAAM;KAAU,OAAO;KAAK;IACpC,MAAM;KAAE,MAAM;KAAW,SAAS;KAAO;IAC1C;GACD,QAAQ;GACT,CAAC;UACK,KAAK;AAGZ,WAAS,UADG,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CACrC,MAAM,OAAO;AACpC,OAAK,EAAE;AACP;;AAGF,KAAI,OAAO,MAAM;AACf,MAAI,KAAK;AACT,OAAK,EAAE;AACP;;AAEF,KAAI,CAAC,OAAO,QAAQ;AAClB,WAAS,qCAAqC,KAAK;AACnD,OAAK,EAAE;AACP;;CAGF,MAAM,oCAAqB,OAAO,OAAO;CACzC,IAAI;AACJ,KAAI;AACF,WAAS,aAAa,WAAW;UAC1B,KAAK;AAEZ,WAAS,8BAA8B,WAAW,IADtC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACA;AAC5D,OAAK,EAAE;AACP;;CAGF,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAAG;AACjD,KACE,SAAS,WACR,OAAO,MAAM,KAAK,IAAI,CAAC,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,QACrE;AACA,WAAS,wBAAwB,OAAO,KAAK,QAAQ,OAAO;AAC5D,OAAK,EAAE;AACP;;CAEF,MAAM,OAAO,OAAO;CAEpB,eAAe,OAAO;EACpB,MAAM,EAAE,QAAQ,QAAQ,MAAM,kBAAkB,QAAS;GAAE;GAAM;GAAM,CAAC;AACxE,MAAI,8BAA8B,MAAM;EAExC,SAAS,WAAW;AAClB,OAAI,mBAAmB;AACvB,WAAQ,eAAe,UAAU,SAAS;AAC1C,WAAQ,eAAe,WAAW,SAAS;AAC3C,UAAO,MAAM,CAAC,WACN,KAAK,EAAE,GACZ,QAAQ;AACP,aAAS,mBAAmB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;AAC/E,SAAK,EAAE;KAEV;;AAEH,UAAQ,GAAG,UAAU,SAAS;AAC9B,UAAQ,GAAG,WAAW,SAAS;AAE/B,MAAI,KAAK,QACP,MAAK,QAAQ,EAAE,UAAU,CAAC;;AAI9B,OAAM,CAAC,OAAO,QAAQ;AACpB,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC;AAC1D,OAAK,EAAE;GACP;;;AAKJ,MAAM,aAAa,QAAQ,KAAK,MAAM;AACtC,IAAI,WAAW,SAAS,gBAAgB,IAAI,WAAW,SAAS,gBAAgB,CAC9E,eAAc"}
@@ -0,0 +1,19 @@
1
+ import { loadConfig, startFromConfig } from "./config-loader.cjs";
2
+
3
+ //#region src/aimock-cli.d.ts
4
+ interface AimockCliDeps {
5
+ argv?: string[];
6
+ log?: (msg: string) => void;
7
+ logError?: (msg: string) => void;
8
+ exit?: (code: number) => void;
9
+ loadConfigFn?: typeof loadConfig;
10
+ startFromConfigFn?: typeof startFromConfig;
11
+ onReady?: (ctx: {
12
+ shutdown: () => void;
13
+ }) => void;
14
+ }
15
+ declare function runAimockCli(deps?: AimockCliDeps): void;
16
+ //# sourceMappingURL=aimock-cli.d.ts.map
17
+ //#endregion
18
+ export { AimockCliDeps, runAimockCli };
19
+ //# sourceMappingURL=aimock-cli.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aimock-cli.d.cts","names":[],"sources":["../src/aimock-cli.ts"],"sourcesContent":[],"mappings":";;;UAeiB,aAAA;EAAA,IAAA,CAAA,EAAA,MAAA,EAAA;EAAa,GAAA,CAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,IAAA;UAKN,CAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,IAAA;MACK,CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAAe,YAAA,CAAA,EAAA,OADpB,UACoB;EAI5B,iBAAY,CAAA,EAAA,OAJC,eAIwB;;;;;iBAArC,YAAA,QAAmB"}
@@ -0,0 +1,19 @@
1
+ import { loadConfig, startFromConfig } from "./config-loader.js";
2
+
3
+ //#region src/aimock-cli.d.ts
4
+ interface AimockCliDeps {
5
+ argv?: string[];
6
+ log?: (msg: string) => void;
7
+ logError?: (msg: string) => void;
8
+ exit?: (code: number) => void;
9
+ loadConfigFn?: typeof loadConfig;
10
+ startFromConfigFn?: typeof startFromConfig;
11
+ onReady?: (ctx: {
12
+ shutdown: () => void;
13
+ }) => void;
14
+ }
15
+ declare function runAimockCli(deps?: AimockCliDeps): void;
16
+ //# sourceMappingURL=aimock-cli.d.ts.map
17
+ //#endregion
18
+ export { AimockCliDeps, runAimockCli };
19
+ //# sourceMappingURL=aimock-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aimock-cli.d.ts","names":[],"sources":["../src/aimock-cli.ts"],"sourcesContent":[],"mappings":";;;UAeiB,aAAA;EAAA,IAAA,CAAA,EAAA,MAAA,EAAA;EAAa,GAAA,CAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,IAAA;UAKN,CAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,IAAA;MACK,CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAAe,YAAA,CAAA,EAAA,OADpB,UACoB;EAI5B,iBAAY,CAAA,EAAA,OAJC,eAIwB;;;;;iBAArC,YAAA,QAAmB"}