@copilotkit/aimock 1.43.0 → 1.45.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 (396) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +46 -0
  4. package/README.md +14 -2
  5. package/dist/agui-handler.d.ts.map +1 -1
  6. package/dist/aimock-cli.cjs +31 -5
  7. package/dist/aimock-cli.cjs.map +1 -1
  8. package/dist/aimock-cli.d.cts.map +1 -1
  9. package/dist/aimock-cli.d.ts.map +1 -1
  10. package/dist/aimock-cli.js +31 -5
  11. package/dist/aimock-cli.js.map +1 -1
  12. package/dist/bedrock-converse.cjs +344 -43
  13. package/dist/bedrock-converse.cjs.map +1 -1
  14. package/dist/bedrock-converse.d.cts.map +1 -1
  15. package/dist/bedrock-converse.d.ts.map +1 -1
  16. package/dist/bedrock-converse.js +345 -44
  17. package/dist/bedrock-converse.js.map +1 -1
  18. package/dist/bedrock.cjs +195 -42
  19. package/dist/bedrock.cjs.map +1 -1
  20. package/dist/bedrock.d.cts.map +1 -1
  21. package/dist/bedrock.d.ts.map +1 -1
  22. package/dist/bedrock.js +196 -43
  23. package/dist/bedrock.js.map +1 -1
  24. package/dist/chaos.cjs +9 -5
  25. package/dist/chaos.cjs.map +1 -1
  26. package/dist/chaos.d.cts.map +1 -1
  27. package/dist/chaos.d.ts.map +1 -1
  28. package/dist/chaos.js +10 -7
  29. package/dist/chaos.js.map +1 -1
  30. package/dist/cli.cjs +238 -9
  31. package/dist/cli.cjs.map +1 -1
  32. package/dist/cli.js +242 -13
  33. package/dist/cli.js.map +1 -1
  34. package/dist/cohere.cjs +159 -72
  35. package/dist/cohere.cjs.map +1 -1
  36. package/dist/cohere.d.cts.map +1 -1
  37. package/dist/cohere.d.ts.map +1 -1
  38. package/dist/cohere.js +160 -73
  39. package/dist/cohere.js.map +1 -1
  40. package/dist/config-loader.cjs +63 -5
  41. package/dist/config-loader.cjs.map +1 -1
  42. package/dist/config-loader.d.cts +37 -4
  43. package/dist/config-loader.d.cts.map +1 -1
  44. package/dist/config-loader.d.ts +37 -4
  45. package/dist/config-loader.d.ts.map +1 -1
  46. package/dist/config-loader.js +63 -5
  47. package/dist/config-loader.js.map +1 -1
  48. package/dist/constants.cjs +8 -0
  49. package/dist/constants.cjs.map +1 -1
  50. package/dist/constants.d.cts +6 -2
  51. package/dist/constants.d.ts +6 -2
  52. package/dist/constants.js +8 -1
  53. package/dist/constants.js.map +1 -1
  54. package/dist/echo-text.cjs +65 -0
  55. package/dist/echo-text.cjs.map +1 -0
  56. package/dist/echo-text.d.cts +22 -0
  57. package/dist/echo-text.d.cts.map +1 -0
  58. package/dist/echo-text.d.ts +22 -0
  59. package/dist/echo-text.d.ts.map +1 -0
  60. package/dist/echo-text.js +65 -0
  61. package/dist/echo-text.js.map +1 -0
  62. package/dist/embeddings.cjs +18 -1
  63. package/dist/embeddings.cjs.map +1 -1
  64. package/dist/embeddings.d.cts +1 -1
  65. package/dist/embeddings.d.cts.map +1 -1
  66. package/dist/embeddings.d.ts +1 -1
  67. package/dist/embeddings.d.ts.map +1 -1
  68. package/dist/embeddings.js +18 -1
  69. package/dist/embeddings.js.map +1 -1
  70. package/dist/fakes-plugin.cjs +131 -0
  71. package/dist/fakes-plugin.cjs.map +1 -0
  72. package/dist/fakes-plugin.d.cts +23 -0
  73. package/dist/fakes-plugin.d.cts.map +1 -0
  74. package/dist/fakes-plugin.d.ts +23 -0
  75. package/dist/fakes-plugin.d.ts.map +1 -0
  76. package/dist/fakes-plugin.js +127 -0
  77. package/dist/fakes-plugin.js.map +1 -0
  78. package/dist/files.cjs +9 -11
  79. package/dist/files.cjs.map +1 -1
  80. package/dist/files.d.cts.map +1 -1
  81. package/dist/files.d.ts.map +1 -1
  82. package/dist/files.js +10 -13
  83. package/dist/files.js.map +1 -1
  84. package/dist/fine-tuning.cjs +1 -19
  85. package/dist/fine-tuning.cjs.map +1 -1
  86. package/dist/fine-tuning.d.cts.map +1 -1
  87. package/dist/fine-tuning.d.ts.map +1 -1
  88. package/dist/fine-tuning.js +2 -20
  89. package/dist/fine-tuning.js.map +1 -1
  90. package/dist/fixture-loader-services.cjs +116 -0
  91. package/dist/fixture-loader-services.cjs.map +1 -0
  92. package/dist/fixture-loader-services.d.cts +48 -0
  93. package/dist/fixture-loader-services.d.cts.map +1 -0
  94. package/dist/fixture-loader-services.d.ts +48 -0
  95. package/dist/fixture-loader-services.d.ts.map +1 -0
  96. package/dist/fixture-loader-services.js +114 -0
  97. package/dist/fixture-loader-services.js.map +1 -0
  98. package/dist/fixture-loader.cjs +552 -29
  99. package/dist/fixture-loader.cjs.map +1 -1
  100. package/dist/fixture-loader.d.cts +140 -2
  101. package/dist/fixture-loader.d.cts.map +1 -1
  102. package/dist/fixture-loader.d.ts +140 -2
  103. package/dist/fixture-loader.d.ts.map +1 -1
  104. package/dist/fixture-loader.js +542 -31
  105. package/dist/fixture-loader.js.map +1 -1
  106. package/dist/gemini-embeddings.cjs +42 -2
  107. package/dist/gemini-embeddings.cjs.map +1 -1
  108. package/dist/gemini-embeddings.js +43 -3
  109. package/dist/gemini-embeddings.js.map +1 -1
  110. package/dist/gemini-interactions.cjs +288 -52
  111. package/dist/gemini-interactions.cjs.map +1 -1
  112. package/dist/gemini-interactions.d.cts.map +1 -1
  113. package/dist/gemini-interactions.d.ts.map +1 -1
  114. package/dist/gemini-interactions.js +289 -53
  115. package/dist/gemini-interactions.js.map +1 -1
  116. package/dist/gemini.cjs +234 -38
  117. package/dist/gemini.cjs.map +1 -1
  118. package/dist/gemini.d.cts.map +1 -1
  119. package/dist/gemini.d.ts.map +1 -1
  120. package/dist/gemini.js +235 -39
  121. package/dist/gemini.js.map +1 -1
  122. package/dist/helpers.cjs +1157 -12
  123. package/dist/helpers.cjs.map +1 -1
  124. package/dist/helpers.d.cts +85 -4
  125. package/dist/helpers.d.cts.map +1 -1
  126. package/dist/helpers.d.ts +85 -4
  127. package/dist/helpers.d.ts.map +1 -1
  128. package/dist/helpers.js +1113 -14
  129. package/dist/helpers.js.map +1 -1
  130. package/dist/images.cjs +3 -2
  131. package/dist/images.cjs.map +1 -1
  132. package/dist/images.js +3 -2
  133. package/dist/images.js.map +1 -1
  134. package/dist/index.cjs +39 -1
  135. package/dist/index.d.cts +11 -4
  136. package/dist/index.d.ts +11 -4
  137. package/dist/index.js +11 -4
  138. package/dist/jest.cjs +43 -14
  139. package/dist/jest.cjs.map +1 -1
  140. package/dist/jest.d.cts +47 -5
  141. package/dist/jest.d.cts.map +1 -1
  142. package/dist/jest.d.ts +47 -5
  143. package/dist/jest.d.ts.map +1 -1
  144. package/dist/jest.js +45 -16
  145. package/dist/jest.js.map +1 -1
  146. package/dist/journal.cjs +155 -13
  147. package/dist/journal.cjs.map +1 -1
  148. package/dist/journal.d.cts +54 -4
  149. package/dist/journal.d.cts.map +1 -1
  150. package/dist/journal.d.ts +54 -4
  151. package/dist/journal.d.ts.map +1 -1
  152. package/dist/journal.js +155 -13
  153. package/dist/journal.js.map +1 -1
  154. package/dist/live-sanitize.cjs +4 -32
  155. package/dist/live-sanitize.cjs.map +1 -1
  156. package/dist/live-sanitize.js +4 -32
  157. package/dist/live-sanitize.js.map +1 -1
  158. package/dist/llmock.cjs +204 -39
  159. package/dist/llmock.cjs.map +1 -1
  160. package/dist/llmock.d.cts +51 -1
  161. package/dist/llmock.d.cts.map +1 -1
  162. package/dist/llmock.d.ts +51 -1
  163. package/dist/llmock.d.ts.map +1 -1
  164. package/dist/llmock.js +206 -41
  165. package/dist/llmock.js.map +1 -1
  166. package/dist/mcp-fakes-mount.cjs +217 -0
  167. package/dist/mcp-fakes-mount.cjs.map +1 -0
  168. package/dist/mcp-fakes-mount.js +211 -0
  169. package/dist/mcp-fakes-mount.js.map +1 -0
  170. package/dist/mcp-fakes-report.cjs +111 -0
  171. package/dist/mcp-fakes-report.cjs.map +1 -0
  172. package/dist/mcp-fakes-report.d.cts +40 -0
  173. package/dist/mcp-fakes-report.d.cts.map +1 -0
  174. package/dist/mcp-fakes-report.d.ts +40 -0
  175. package/dist/mcp-fakes-report.d.ts.map +1 -0
  176. package/dist/mcp-fakes-report.js +107 -0
  177. package/dist/mcp-fakes-report.js.map +1 -0
  178. package/dist/mcp-fakes.cjs +1942 -0
  179. package/dist/mcp-fakes.cjs.map +1 -0
  180. package/dist/mcp-fakes.d.cts +504 -0
  181. package/dist/mcp-fakes.d.cts.map +1 -0
  182. package/dist/mcp-fakes.d.ts +504 -0
  183. package/dist/mcp-fakes.d.ts.map +1 -0
  184. package/dist/mcp-fakes.js +1937 -0
  185. package/dist/mcp-fakes.js.map +1 -0
  186. package/dist/mcp-handler.cjs +534 -27
  187. package/dist/mcp-handler.cjs.map +1 -1
  188. package/dist/mcp-handler.d.cts +49 -0
  189. package/dist/mcp-handler.d.cts.map +1 -0
  190. package/dist/mcp-handler.d.ts +49 -0
  191. package/dist/mcp-handler.d.ts.map +1 -0
  192. package/dist/mcp-handler.js +530 -28
  193. package/dist/mcp-handler.js.map +1 -1
  194. package/dist/mcp-mock.cjs +326 -47
  195. package/dist/mcp-mock.cjs.map +1 -1
  196. package/dist/mcp-mock.d.cts +97 -1
  197. package/dist/mcp-mock.d.cts.map +1 -1
  198. package/dist/mcp-mock.d.ts +97 -1
  199. package/dist/mcp-mock.d.ts.map +1 -1
  200. package/dist/mcp-mock.js +327 -48
  201. package/dist/mcp-mock.js.map +1 -1
  202. package/dist/mcp-recorder.cjs +1224 -0
  203. package/dist/mcp-recorder.cjs.map +1 -0
  204. package/dist/mcp-recorder.d.cts +108 -0
  205. package/dist/mcp-recorder.d.cts.map +1 -0
  206. package/dist/mcp-recorder.d.ts +108 -0
  207. package/dist/mcp-recorder.d.ts.map +1 -0
  208. package/dist/mcp-recorder.js +1215 -0
  209. package/dist/mcp-recorder.js.map +1 -0
  210. package/dist/mcp-stub.cjs +5 -1
  211. package/dist/mcp-stub.d.cts +3 -1
  212. package/dist/mcp-stub.d.ts +3 -1
  213. package/dist/mcp-stub.js +3 -1
  214. package/dist/mcp-types.d.cts +6 -0
  215. package/dist/mcp-types.d.ts +6 -0
  216. package/dist/message-text.cjs +192 -0
  217. package/dist/message-text.cjs.map +1 -0
  218. package/dist/message-text.d.cts +31 -0
  219. package/dist/message-text.d.cts.map +1 -0
  220. package/dist/message-text.d.ts +31 -0
  221. package/dist/message-text.d.ts.map +1 -0
  222. package/dist/message-text.js +184 -0
  223. package/dist/message-text.js.map +1 -0
  224. package/dist/messages.cjs +400 -56
  225. package/dist/messages.cjs.map +1 -1
  226. package/dist/messages.d.cts.map +1 -1
  227. package/dist/messages.d.ts.map +1 -1
  228. package/dist/messages.js +401 -58
  229. package/dist/messages.js.map +1 -1
  230. package/dist/metrics.cjs +46 -66
  231. package/dist/metrics.cjs.map +1 -1
  232. package/dist/metrics.d.cts +14 -6
  233. package/dist/metrics.d.cts.map +1 -1
  234. package/dist/metrics.d.ts +14 -6
  235. package/dist/metrics.d.ts.map +1 -1
  236. package/dist/metrics.js +32 -40
  237. package/dist/metrics.js.map +1 -1
  238. package/dist/misbehavior.cjs +1523 -0
  239. package/dist/misbehavior.cjs.map +1 -0
  240. package/dist/misbehavior.d.cts +43 -0
  241. package/dist/misbehavior.d.cts.map +1 -0
  242. package/dist/misbehavior.d.ts +43 -0
  243. package/dist/misbehavior.d.ts.map +1 -0
  244. package/dist/misbehavior.js +1511 -0
  245. package/dist/misbehavior.js.map +1 -0
  246. package/dist/ollama.cjs +315 -113
  247. package/dist/ollama.cjs.map +1 -1
  248. package/dist/ollama.d.cts.map +1 -1
  249. package/dist/ollama.d.ts.map +1 -1
  250. package/dist/ollama.js +316 -114
  251. package/dist/ollama.js.map +1 -1
  252. package/dist/openapi.cjs +3405 -0
  253. package/dist/openapi.cjs.map +1 -0
  254. package/dist/openapi.d.cts +30 -0
  255. package/dist/openapi.d.cts.map +1 -0
  256. package/dist/openapi.d.ts +30 -0
  257. package/dist/openapi.d.ts.map +1 -0
  258. package/dist/openapi.js +3404 -0
  259. package/dist/openapi.js.map +1 -0
  260. package/dist/openrouter-video.cjs +4 -4
  261. package/dist/openrouter-video.cjs.map +1 -1
  262. package/dist/openrouter-video.d.cts.map +1 -1
  263. package/dist/openrouter-video.d.ts.map +1 -1
  264. package/dist/openrouter-video.js +4 -4
  265. package/dist/openrouter-video.js.map +1 -1
  266. package/dist/record-sanitize.cjs +231 -0
  267. package/dist/record-sanitize.cjs.map +1 -0
  268. package/dist/record-sanitize.js +224 -0
  269. package/dist/record-sanitize.js.map +1 -0
  270. package/dist/recorder.cjs +115 -6
  271. package/dist/recorder.cjs.map +1 -1
  272. package/dist/recorder.d.cts +2 -1
  273. package/dist/recorder.d.cts.map +1 -1
  274. package/dist/recorder.d.ts +2 -1
  275. package/dist/recorder.d.ts.map +1 -1
  276. package/dist/recorder.js +116 -8
  277. package/dist/recorder.js.map +1 -1
  278. package/dist/responses.cjs +701 -166
  279. package/dist/responses.cjs.map +1 -1
  280. package/dist/responses.d.cts +5 -13
  281. package/dist/responses.d.cts.map +1 -1
  282. package/dist/responses.d.ts +5 -13
  283. package/dist/responses.d.ts.map +1 -1
  284. package/dist/responses.js +699 -169
  285. package/dist/responses.js.map +1 -1
  286. package/dist/route-registry.cjs +951 -0
  287. package/dist/route-registry.cjs.map +1 -0
  288. package/dist/route-registry.d.cts +33 -0
  289. package/dist/route-registry.d.cts.map +1 -0
  290. package/dist/route-registry.d.ts +33 -0
  291. package/dist/route-registry.d.ts.map +1 -0
  292. package/dist/route-registry.js +866 -0
  293. package/dist/route-registry.js.map +1 -0
  294. package/dist/router.cjs +24 -2
  295. package/dist/router.cjs.map +1 -1
  296. package/dist/router.d.cts.map +1 -1
  297. package/dist/router.d.ts.map +1 -1
  298. package/dist/router.js +25 -4
  299. package/dist/router.js.map +1 -1
  300. package/dist/server.cjs +1159 -264
  301. package/dist/server.cjs.map +1 -1
  302. package/dist/server.d.cts +4 -1
  303. package/dist/server.d.cts.map +1 -1
  304. package/dist/server.d.ts +4 -1
  305. package/dist/server.d.ts.map +1 -1
  306. package/dist/server.js +1067 -172
  307. package/dist/server.js.map +1 -1
  308. package/dist/speech.cjs +4 -2
  309. package/dist/speech.cjs.map +1 -1
  310. package/dist/speech.js +4 -2
  311. package/dist/speech.js.map +1 -1
  312. package/dist/stream-collapse.cjs +236 -34
  313. package/dist/stream-collapse.cjs.map +1 -1
  314. package/dist/stream-collapse.d.cts +39 -4
  315. package/dist/stream-collapse.d.cts.map +1 -1
  316. package/dist/stream-collapse.d.ts +39 -4
  317. package/dist/stream-collapse.d.ts.map +1 -1
  318. package/dist/stream-collapse.js +235 -35
  319. package/dist/stream-collapse.js.map +1 -1
  320. package/dist/suite.cjs +1 -1
  321. package/dist/suite.js +1 -1
  322. package/dist/transcription.cjs +2 -2
  323. package/dist/transcription.cjs.map +1 -1
  324. package/dist/transcription.d.cts.map +1 -1
  325. package/dist/transcription.d.ts.map +1 -1
  326. package/dist/transcription.js +2 -2
  327. package/dist/transcription.js.map +1 -1
  328. package/dist/types.cjs +18 -0
  329. package/dist/types.cjs.map +1 -0
  330. package/dist/types.d.cts +516 -5
  331. package/dist/types.d.cts.map +1 -1
  332. package/dist/types.d.ts +516 -5
  333. package/dist/types.d.ts.map +1 -1
  334. package/dist/types.js +17 -0
  335. package/dist/types.js.map +1 -0
  336. package/dist/validate-cli.cjs +123 -33
  337. package/dist/validate-cli.cjs.map +1 -1
  338. package/dist/validate-cli.js +125 -35
  339. package/dist/validate-cli.js.map +1 -1
  340. package/dist/vector-stores.cjs +1180 -0
  341. package/dist/vector-stores.cjs.map +1 -0
  342. package/dist/vector-stores.d.cts +106 -0
  343. package/dist/vector-stores.d.cts.map +1 -0
  344. package/dist/vector-stores.d.ts +106 -0
  345. package/dist/vector-stores.d.ts.map +1 -0
  346. package/dist/vector-stores.js +1164 -0
  347. package/dist/vector-stores.js.map +1 -0
  348. package/dist/vector-types.d.cts.map +1 -1
  349. package/dist/version.cjs +45 -0
  350. package/dist/version.cjs.map +1 -0
  351. package/dist/version.js +44 -0
  352. package/dist/version.js.map +1 -0
  353. package/dist/video.cjs +19 -0
  354. package/dist/video.cjs.map +1 -1
  355. package/dist/video.d.cts.map +1 -1
  356. package/dist/video.d.ts.map +1 -1
  357. package/dist/video.js +19 -0
  358. package/dist/video.js.map +1 -1
  359. package/dist/vitest.cjs +77 -16
  360. package/dist/vitest.cjs.map +1 -1
  361. package/dist/vitest.d.cts +38 -5
  362. package/dist/vitest.d.cts.map +1 -1
  363. package/dist/vitest.d.ts +38 -5
  364. package/dist/vitest.d.ts.map +1 -1
  365. package/dist/vitest.js +78 -17
  366. package/dist/vitest.js.map +1 -1
  367. package/dist/watcher.cjs +6 -2
  368. package/dist/watcher.cjs.map +1 -1
  369. package/dist/watcher.js +6 -2
  370. package/dist/watcher.js.map +1 -1
  371. package/dist/ws-gemini-live.cjs +210 -101
  372. package/dist/ws-gemini-live.cjs.map +1 -1
  373. package/dist/ws-gemini-live.d.cts +9 -3
  374. package/dist/ws-gemini-live.d.cts.map +1 -1
  375. package/dist/ws-gemini-live.d.ts +9 -3
  376. package/dist/ws-gemini-live.d.ts.map +1 -1
  377. package/dist/ws-gemini-live.js +211 -102
  378. package/dist/ws-gemini-live.js.map +1 -1
  379. package/dist/ws-realtime.cjs +175 -62
  380. package/dist/ws-realtime.cjs.map +1 -1
  381. package/dist/ws-realtime.d.cts +8 -3
  382. package/dist/ws-realtime.d.cts.map +1 -1
  383. package/dist/ws-realtime.d.ts +8 -3
  384. package/dist/ws-realtime.d.ts.map +1 -1
  385. package/dist/ws-realtime.js +176 -63
  386. package/dist/ws-realtime.js.map +1 -1
  387. package/dist/ws-responses.cjs +121 -16
  388. package/dist/ws-responses.cjs.map +1 -1
  389. package/dist/ws-responses.d.cts +8 -12
  390. package/dist/ws-responses.d.cts.map +1 -1
  391. package/dist/ws-responses.d.ts +8 -12
  392. package/dist/ws-responses.d.ts.map +1 -1
  393. package/dist/ws-responses.js +123 -18
  394. package/dist/ws-responses.js.map +1 -1
  395. package/package.json +13 -2
  396. package/skills/write-fixtures/SKILL.md +179 -21
@@ -0,0 +1,184 @@
1
+ import { MCP_FAKES_ECHO_LIMIT } from "./constants.js";
2
+ import { cutText } from "./echo-text.js";
3
+
4
+ //#region src/message-text.ts
5
+ /**
6
+ * The one message builder of MCP fakes: every error and warning message of
7
+ * mcp-fakes.ts, the `FixtureLoadError` message (fixture-loader.ts) and the MCP
8
+ * identity error messages (helpers.ts) are built here. A message is a list of
9
+ * parts: fixed text written by aimock, kept whole, and user parts (a tool
10
+ * name, an id, a source, a JSON path, a value, a thrown message), each quoted
11
+ * or rendered as JSON when it is made. `build` gives the user parts their
12
+ * shares of the message's length budget and cuts each one once, with
13
+ * `cutText` (echo-text.ts), so the fixed text is never cut and every
14
+ * `… (<n> more chars)` count is the true count of chars left out of that
15
+ * part. A leaf module (it imports only constants.ts and echo-text.ts).
16
+ */
17
+ /**
18
+ * User data in a message: its whole text, not cut until the message is built.
19
+ * `units` is what a cut of it must not split; `max` is the most chars it may
20
+ * take, whatever the budget: at least 1 (`Infinity` too), so a cut part
21
+ * always keeps at least a `…`. A `max` below 1, or `NaN`, is a `RangeError`.
22
+ *
23
+ * @internal
24
+ */
25
+ var UserText = class {
26
+ constructor(text, units, max) {
27
+ this.text = text;
28
+ this.units = units;
29
+ this.max = max;
30
+ if (!(max >= 1)) throw new RangeError(`a user part max must be at least 1, got ${max}`);
31
+ Object.freeze(this);
32
+ }
33
+ };
34
+ /**
35
+ * A message that is not built yet: fixed text and user parts, in order.
36
+ *
37
+ * @internal
38
+ */
39
+ var Message = class {
40
+ parts;
41
+ constructor(parts) {
42
+ this.parts = Object.freeze([...parts]);
43
+ Object.freeze(this);
44
+ }
45
+ };
46
+ /**
47
+ * A message from a template: its literal text is fixed text, a number is
48
+ * fixed text, a `Message` is spliced in part by part, and a `UserText` is a
49
+ * user part.
50
+ *
51
+ * @internal
52
+ */
53
+ function msg(strings, ...values) {
54
+ const parts = [];
55
+ strings.forEach((literal, i) => {
56
+ if (literal !== "") parts.push(literal);
57
+ if (i >= values.length) return;
58
+ const value = values[i];
59
+ if (typeof value === "number") parts.push(String(value));
60
+ else if (value instanceof Message) parts.push(...value.parts);
61
+ else parts.push(value);
62
+ });
63
+ return new Message(parts);
64
+ }
65
+ /**
66
+ * Aimock's own text as a message: a constant, a fixed list, a built-in tag,
67
+ * or a message that was already built. Never user data.
68
+ *
69
+ * @internal
70
+ */
71
+ function fixed(text) {
72
+ return new Message([text]);
73
+ }
74
+ /**
75
+ * Every control char (C0, DEL, C1) and the line and paragraph separators.
76
+ * `JSON.stringify` escapes C0 controls but keeps DEL, C1 controls and the
77
+ * separators raw; text that is not JSON (a text `FixtureLoadError` detail) can
78
+ * hold any of them.
79
+ */
80
+ const RAW_CONTROLS = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]/g;
81
+ /**
82
+ * `text` JSON-quoted: quotes, backslashes and control chars escaped, DEL, C1
83
+ * controls and U+2028 / U+2029 too (as `\uXXXX`), so the result is one line
84
+ * of printable text that `JSON.parse` reads back as `text`.
85
+ *
86
+ * @internal
87
+ */
88
+ function quoteJson(text) {
89
+ return escapeRawControls(JSON.stringify(text));
90
+ }
91
+ function escapeRawControls(json) {
92
+ return json.replace(RAW_CONTROLS, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, "0")}`);
93
+ }
94
+ /**
95
+ * A user string as a message part: JSON-quoted by `quoteJson`, cut as JSON
96
+ * text (never inside an escape) to its share, and never to more than `max`
97
+ * chars.
98
+ *
99
+ * @internal
100
+ */
101
+ function quote(text, max = MCP_FAKES_ECHO_LIMIT) {
102
+ return jsonText(JSON.stringify(text), max);
103
+ }
104
+ /**
105
+ * User data already rendered as JSON text (a value, or a JSON path whose keys
106
+ * are JSON-quoted), as a message part: every raw control char (C0, DEL, C1)
107
+ * and line separator in it escaped as `\uXXXX` (in JSON text they can only be
108
+ * inside its strings), cut as JSON text.
109
+ *
110
+ * @internal
111
+ */
112
+ function jsonText(json, max = MCP_FAKES_ECHO_LIMIT) {
113
+ return new UserText(escapeRawControls(json), "json", max);
114
+ }
115
+ /**
116
+ * Text that is not JSON as a message part, cut as text (never inside a
117
+ * surrogate pair).
118
+ *
119
+ * @internal
120
+ */
121
+ function plainText(text, max = MCP_FAKES_ECHO_LIMIT) {
122
+ return new UserText(text, "text", max);
123
+ }
124
+ /**
125
+ * `message` built in a budget of its own (`limit` chars), as fixed text of
126
+ * the message it goes into: a part of a message with its own cap.
127
+ *
128
+ * @internal
129
+ */
130
+ function within(limit, message) {
131
+ return fixed(build(message, limit));
132
+ }
133
+ /**
134
+ * The text of `message`, no longer than `limit` when its fixed text and one
135
+ * char per user part fit in `limit`. The fixed text is kept whole. The user
136
+ * parts share what is left: a part that fits in an equal share keeps all of
137
+ * it, and the others split the rest (water-filling), each at most its `max`.
138
+ * Each user part is then cut once, by `cutText`, to its share. A `limit` of
139
+ * `Infinity` cuts each part only to its `max`. A `NaN` limit is a
140
+ * `RangeError`; a limit too small for the fixed text still gives each
141
+ * non-empty user part 1 char, a bare `…`.
142
+ *
143
+ * @internal
144
+ */
145
+ function build(message, limit = Infinity) {
146
+ if (Number.isNaN(limit)) throw new RangeError("build limit must be a number, got NaN");
147
+ const users = message.parts.filter((part) => part instanceof UserText);
148
+ let fixedLength = 0;
149
+ for (const part of message.parts) if (typeof part === "string") fixedLength += part.length;
150
+ const shares = allocate(users, limit - fixedLength);
151
+ let i = 0;
152
+ return message.parts.map((part) => typeof part === "string" ? part : cutText(part.text, shares[i++], part.units)).join("");
153
+ }
154
+ /**
155
+ * Each user part's share of `room` chars, by water-filling: at least 1 char
156
+ * each (a bare `…` when room runs out), but never more than the part's cap.
157
+ */
158
+ function allocate(users, room) {
159
+ const caps = users.map((u) => Math.min(u.text.length, Math.floor(u.max)));
160
+ const order = caps.map((_, i) => i).sort((a, b) => caps[a] - caps[b]);
161
+ const shares = new Array(users.length).fill(0);
162
+ let left = Math.max(0, room);
163
+ order.forEach((index, k) => {
164
+ const fair = Math.floor(left / (order.length - k));
165
+ const share = Math.min(caps[index], Math.max(1, fair));
166
+ shares[index] = share;
167
+ left -= share;
168
+ });
169
+ return shares;
170
+ }
171
+ /**
172
+ * The text of `message` with no cut at all: for a message that goes, as
173
+ * text, into a user part of another message (a placeholder reason inside a
174
+ * rendered value), which is then cut once there.
175
+ *
176
+ * @internal
177
+ */
178
+ function fullText(message) {
179
+ return message.parts.map((part) => typeof part === "string" ? part : part.text).join("");
180
+ }
181
+
182
+ //#endregion
183
+ export { build, fixed, fullText, jsonText, msg, plainText, quote, quoteJson, within };
184
+ //# sourceMappingURL=message-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-text.js","names":[],"sources":["../src/message-text.ts"],"sourcesContent":["/**\n * The one message builder of MCP fakes: every error and warning message of\n * mcp-fakes.ts, the `FixtureLoadError` message (fixture-loader.ts) and the MCP\n * identity error messages (helpers.ts) are built here. A message is a list of\n * parts: fixed text written by aimock, kept whole, and user parts (a tool\n * name, an id, a source, a JSON path, a value, a thrown message), each quoted\n * or rendered as JSON when it is made. `build` gives the user parts their\n * shares of the message's length budget and cuts each one once, with\n * `cutText` (echo-text.ts), so the fixed text is never cut and every\n * `… (<n> more chars)` count is the true count of chars left out of that\n * part. A leaf module (it imports only constants.ts and echo-text.ts).\n */\nimport { MCP_FAKES_ECHO_LIMIT } from \"./constants.js\";\nimport { cutText, type CutUnits } from \"./echo-text.js\";\n\n/**\n * User data in a message: its whole text, not cut until the message is built.\n * `units` is what a cut of it must not split; `max` is the most chars it may\n * take, whatever the budget: at least 1 (`Infinity` too), so a cut part\n * always keeps at least a `…`. A `max` below 1, or `NaN`, is a `RangeError`.\n *\n * @internal\n */\nexport class UserText {\n constructor(\n readonly text: string,\n readonly units: CutUnits,\n readonly max: number,\n ) {\n if (!(max >= 1)) throw new RangeError(`a user part max must be at least 1, got ${max}`);\n Object.freeze(this);\n }\n}\n\n/**\n * A message that is not built yet: fixed text and user parts, in order.\n *\n * @internal\n */\nexport class Message {\n readonly parts: readonly (string | UserText)[];\n\n constructor(parts: readonly (string | UserText)[]) {\n this.parts = Object.freeze([...parts]);\n Object.freeze(this);\n }\n}\n\n/** What a `msg` template may interpolate: a user part, a message, or a number. */\nexport type MessageValue = UserText | Message | number;\n\n/**\n * A message from a template: its literal text is fixed text, a number is\n * fixed text, a `Message` is spliced in part by part, and a `UserText` is a\n * user part.\n *\n * @internal\n */\nexport function msg(strings: TemplateStringsArray, ...values: readonly MessageValue[]): Message {\n const parts: (string | UserText)[] = [];\n strings.forEach((literal, i) => {\n if (literal !== \"\") parts.push(literal);\n if (i >= values.length) return;\n const value = values[i];\n if (typeof value === \"number\") parts.push(String(value));\n else if (value instanceof Message) parts.push(...value.parts);\n else parts.push(value);\n });\n return new Message(parts);\n}\n\n/**\n * Aimock's own text as a message: a constant, a fixed list, a built-in tag,\n * or a message that was already built. Never user data.\n *\n * @internal\n */\nexport function fixed(text: string): Message {\n return new Message([text]);\n}\n\n/**\n * Every control char (C0, DEL, C1) and the line and paragraph separators.\n * `JSON.stringify` escapes C0 controls but keeps DEL, C1 controls and the\n * separators raw; text that is not JSON (a text `FixtureLoadError` detail) can\n * hold any of them.\n */\n// eslint-disable-next-line no-control-regex -- matching control chars is the point\nconst RAW_CONTROLS = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/g;\n\n/**\n * `text` JSON-quoted: quotes, backslashes and control chars escaped, DEL, C1\n * controls and U+2028 / U+2029 too (as `\\uXXXX`), so the result is one line\n * of printable text that `JSON.parse` reads back as `text`.\n *\n * @internal\n */\nexport function quoteJson(text: string): string {\n return escapeRawControls(JSON.stringify(text));\n}\n\nfunction escapeRawControls(json: string): string {\n return json.replace(RAW_CONTROLS, (c) => `\\\\u${c.charCodeAt(0).toString(16).padStart(4, \"0\")}`);\n}\n\n/**\n * A user string as a message part: JSON-quoted by `quoteJson`, cut as JSON\n * text (never inside an escape) to its share, and never to more than `max`\n * chars.\n *\n * @internal\n */\nexport function quote(text: string, max: number = MCP_FAKES_ECHO_LIMIT): UserText {\n return jsonText(JSON.stringify(text), max);\n}\n\n/**\n * User data already rendered as JSON text (a value, or a JSON path whose keys\n * are JSON-quoted), as a message part: every raw control char (C0, DEL, C1)\n * and line separator in it escaped as `\\uXXXX` (in JSON text they can only be\n * inside its strings), cut as JSON text.\n *\n * @internal\n */\nexport function jsonText(json: string, max: number = MCP_FAKES_ECHO_LIMIT): UserText {\n return new UserText(escapeRawControls(json), \"json\", max);\n}\n\n/**\n * Text that is not JSON as a message part, cut as text (never inside a\n * surrogate pair).\n *\n * @internal\n */\nexport function plainText(text: string, max: number = MCP_FAKES_ECHO_LIMIT): UserText {\n return new UserText(text, \"text\", max);\n}\n\n/**\n * `message` built in a budget of its own (`limit` chars), as fixed text of\n * the message it goes into: a part of a message with its own cap.\n *\n * @internal\n */\nexport function within(limit: number, message: Message): Message {\n return fixed(build(message, limit));\n}\n\n/**\n * The text of `message`, no longer than `limit` when its fixed text and one\n * char per user part fit in `limit`. The fixed text is kept whole. The user\n * parts share what is left: a part that fits in an equal share keeps all of\n * it, and the others split the rest (water-filling), each at most its `max`.\n * Each user part is then cut once, by `cutText`, to its share. A `limit` of\n * `Infinity` cuts each part only to its `max`. A `NaN` limit is a\n * `RangeError`; a limit too small for the fixed text still gives each\n * non-empty user part 1 char, a bare `…`.\n *\n * @internal\n */\nexport function build(message: Message, limit = Infinity): string {\n if (Number.isNaN(limit)) throw new RangeError(\"build limit must be a number, got NaN\");\n const users = message.parts.filter((part): part is UserText => part instanceof UserText);\n let fixedLength = 0;\n for (const part of message.parts) if (typeof part === \"string\") fixedLength += part.length;\n const shares = allocate(users, limit - fixedLength);\n let i = 0;\n return message.parts\n .map((part) => (typeof part === \"string\" ? part : cutText(part.text, shares[i++], part.units)))\n .join(\"\");\n}\n\n/**\n * Each user part's share of `room` chars, by water-filling: at least 1 char\n * each (a bare `…` when room runs out), but never more than the part's cap.\n */\nfunction allocate(users: readonly UserText[], room: number): number[] {\n // `max` is at least 1 (UserText checks it), so a non-empty part's cap is too.\n const caps = users.map((u) => Math.min(u.text.length, Math.floor(u.max)));\n const order = caps.map((_, i) => i).sort((a, b) => caps[a] - caps[b]);\n const shares: number[] = new Array<number>(users.length).fill(0);\n let left = Math.max(0, room);\n order.forEach((index, k) => {\n const fair = Math.floor(left / (order.length - k));\n const share = Math.min(caps[index], Math.max(1, fair));\n shares[index] = share;\n left -= share;\n });\n return shares;\n}\n\n/**\n * The text of `message` with no cut at all: for a message that goes, as\n * text, into a user part of another message (a placeholder reason inside a\n * rendered value), which is then cut once there.\n *\n * @internal\n */\nexport function fullText(message: Message): string {\n return message.parts.map((part) => (typeof part === \"string\" ? part : part.text)).join(\"\");\n}\n"],"mappings":"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"}