@copilotkit/aimock 1.38.0 → 1.40.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 (81) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +56 -0
  4. package/README.md +24 -2
  5. package/dist/agui-handler.cjs +20 -18
  6. package/dist/agui-handler.cjs.map +1 -1
  7. package/dist/agui-handler.d.cts +8 -1
  8. package/dist/agui-handler.d.cts.map +1 -1
  9. package/dist/agui-handler.d.ts +8 -1
  10. package/dist/agui-handler.d.ts.map +1 -1
  11. package/dist/agui-handler.js +20 -18
  12. package/dist/agui-handler.js.map +1 -1
  13. package/dist/agui-stub.d.cts +2 -2
  14. package/dist/agui-stub.d.ts +2 -2
  15. package/dist/agui-types.d.cts +84 -3
  16. package/dist/agui-types.d.cts.map +1 -1
  17. package/dist/agui-types.d.ts +84 -3
  18. package/dist/agui-types.d.ts.map +1 -1
  19. package/dist/aimock-cli.cjs +1 -1
  20. package/dist/aimock-cli.cjs.map +1 -1
  21. package/dist/aimock-cli.js +1 -1
  22. package/dist/aimock-cli.js.map +1 -1
  23. package/dist/cli.cjs +10 -10
  24. package/dist/cli.cjs.map +1 -1
  25. package/dist/cli.js +10 -10
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config-loader.d.cts.map +1 -1
  28. package/dist/helpers.cjs +8 -4
  29. package/dist/helpers.cjs.map +1 -1
  30. package/dist/helpers.d.cts.map +1 -1
  31. package/dist/helpers.d.ts.map +1 -1
  32. package/dist/helpers.js +8 -4
  33. package/dist/helpers.js.map +1 -1
  34. package/dist/index.d.cts +2 -2
  35. package/dist/index.d.ts +2 -2
  36. package/dist/llmock.cjs +23 -9
  37. package/dist/llmock.cjs.map +1 -1
  38. package/dist/llmock.d.cts +22 -0
  39. package/dist/llmock.d.cts.map +1 -1
  40. package/dist/llmock.d.ts +22 -0
  41. package/dist/llmock.d.ts.map +1 -1
  42. package/dist/llmock.js +25 -11
  43. package/dist/llmock.js.map +1 -1
  44. package/dist/openrouter-chat.cjs +41 -0
  45. package/dist/openrouter-chat.cjs.map +1 -1
  46. package/dist/openrouter-chat.js +41 -0
  47. package/dist/openrouter-chat.js.map +1 -1
  48. package/dist/openrouter-video.cjs.map +1 -1
  49. package/dist/openrouter-video.js.map +1 -1
  50. package/dist/recorder.cjs +77 -8
  51. package/dist/recorder.cjs.map +1 -1
  52. package/dist/recorder.d.cts.map +1 -1
  53. package/dist/recorder.d.ts.map +1 -1
  54. package/dist/recorder.js +77 -8
  55. package/dist/recorder.js.map +1 -1
  56. package/dist/server.cjs +80 -17
  57. package/dist/server.cjs.map +1 -1
  58. package/dist/server.d.cts +6 -1
  59. package/dist/server.d.cts.map +1 -1
  60. package/dist/server.d.ts +6 -1
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +80 -18
  63. package/dist/server.js.map +1 -1
  64. package/dist/stream-collapse.cjs +97 -6
  65. package/dist/stream-collapse.cjs.map +1 -1
  66. package/dist/stream-collapse.d.cts +16 -0
  67. package/dist/stream-collapse.d.cts.map +1 -1
  68. package/dist/stream-collapse.d.ts +16 -0
  69. package/dist/stream-collapse.d.ts.map +1 -1
  70. package/dist/stream-collapse.js +97 -6
  71. package/dist/stream-collapse.js.map +1 -1
  72. package/dist/types.d.cts +22 -3
  73. package/dist/types.d.cts.map +1 -1
  74. package/dist/types.d.ts +22 -3
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/vector-types.d.ts.map +1 -1
  77. package/dist/ws-gemini-live.cjs +41 -6
  78. package/dist/ws-gemini-live.cjs.map +1 -1
  79. package/dist/ws-gemini-live.js +41 -6
  80. package/dist/ws-gemini-live.js.map +1 -1
  81. package/package.json +5 -3
package/dist/server.d.cts CHANGED
@@ -20,6 +20,12 @@ interface ServerInstance {
20
20
  veoVideoJobs: VeoVideoJobMap;
21
21
  grokVideoJobs: GrokVideoJobMap;
22
22
  }
23
+ /**
24
+ * The per-server state a full reset clears. `ServerInstance` structurally
25
+ * satisfies this, so `LLMock.reset()` and the control-API full-reset route
26
+ * share a single definition of "everything" instead of two lists that drift.
27
+ */
28
+
23
29
  interface ServiceFixtures {
24
30
  search: SearchFixture[];
25
31
  rerank: RerankFixture[];
@@ -30,7 +36,6 @@ declare function createServer(fixtures: Fixture[], options?: MockServerOptions,
30
36
  handler: Mountable;
31
37
  }>, serviceFixtures?: ServiceFixtures): Promise<ServerInstance>;
32
38
  /** @internal Config startup uses this to avoid parsing a selected auth source twice. */
33
-
34
39
  //#endregion
35
40
  export { ServerInstance, ServiceFixtures, createServer };
36
41
  //# sourceMappingURL=server.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.cts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAyHiB,cAAA;EAAA,MAAA,EACP,MAAA,CAAK,MADgB;EAAA,OAAA,EAEpB,OAFoB;KACrB,EAAA,MAAK;UACJ,EAEC,eAFD;aAEC,EACG,aADH;qBACG,EACQ,qBADR;cACQ,EACP,cADO;eACP,EACC,eADD;;AACgB,UAyqCf,eAAA,CAzqCe;EAyqCf,MAAA,EACP,aADsB,EAAA;EAAA,MAAA,EAEtB,aAFsB,EAAA;YACtB,EAEI,iBAFJ,EAAA;;AAEI,iBAMQ,YAAA,CANR,QAAA,EAOF,OAPE,EAAA,EAAA,OAAA,CAAA,EAQF,iBARE,EAAA,MAMoB,CANpB,EASH,KATG,CAAA;EAAiB,IAAA,EAAA,MAAA;EAMT,OAAA,EAGoB,SAHR;CAAA,CAAA,EAAA,eAAA,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAyHiB,cAAA;EAAA,MAAA,EACP,MAAA,CAAK,MADgB;EAAA,OAAA,EAEpB,OAFoB;KACrB,EAAA,MAAK;UACJ,EAEC,eAFD;aAEC,EACG,aADH;qBACG,EACQ,qBADR;cACQ,EACP,cADO;eACP,EACC,eADD;;;AA2rChB;;;;;UAAiB,eAAA;UACP;UACA;cACI;;iBAMQ,YAAA,WACV,qBACA,4BACD;;WAA+B;sBACtB,kBACjB,QAAQ"}
package/dist/server.d.ts CHANGED
@@ -20,6 +20,12 @@ interface ServerInstance {
20
20
  veoVideoJobs: VeoVideoJobMap;
21
21
  grokVideoJobs: GrokVideoJobMap;
22
22
  }
23
+ /**
24
+ * The per-server state a full reset clears. `ServerInstance` structurally
25
+ * satisfies this, so `LLMock.reset()` and the control-API full-reset route
26
+ * share a single definition of "everything" instead of two lists that drift.
27
+ */
28
+
23
29
  interface ServiceFixtures {
24
30
  search: SearchFixture[];
25
31
  rerank: RerankFixture[];
@@ -30,7 +36,6 @@ declare function createServer(fixtures: Fixture[], options?: MockServerOptions,
30
36
  handler: Mountable;
31
37
  }>, serviceFixtures?: ServiceFixtures): Promise<ServerInstance>;
32
38
  /** @internal Config startup uses this to avoid parsing a selected auth source twice. */
33
-
34
39
  //#endregion
35
40
  export { ServerInstance, ServiceFixtures, createServer };
36
41
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAyHiB,cAAA;EAAA,MAAA,EACP,MAAA,CAAK,MADgB;EAAA,OAAA,EAEpB,OAFoB;KACrB,EAAA,MAAK;UACJ,EAEC,eAFD;aAEC,EACG,aADH;qBACG,EACQ,qBADR;cACQ,EACP,cADO;eACP,EACC,eADD;;AACgB,UAyqCf,eAAA,CAzqCe;EAyqCf,MAAA,EACP,aADsB,EAAA;EAAA,MAAA,EAEtB,aAFsB,EAAA;YACtB,EAEI,iBAFJ,EAAA;;AAEI,iBAMQ,YAAA,CANR,QAAA,EAOF,OAPE,EAAA,EAAA,OAAA,CAAA,EAQF,iBARE,EAAA,MAMoB,CANpB,EASH,KATG,CAAA;EAAiB,IAAA,EAAA,MAAA;EAMT,OAAA,EAGoB,SAHR;CAAA,CAAA,EAAA,eAAA,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAyHiB,cAAA;EAAA,MAAA,EACP,MAAA,CAAK,MADgB;EAAA,OAAA,EAEpB,OAFoB;KACrB,EAAA,MAAK;UACJ,EAEC,eAFD;aAEC,EACG,aADH;qBACG,EACQ,qBADR;cACQ,EACP,cADO;eACP,EACC,eADD;;;AA2rChB;;;;;UAAiB,eAAA;UACP;UACA;cACI;;iBAMQ,YAAA,WACV,qBACA,4BACD;;WAA+B;sBACtB,kBACjB,QAAQ"}
package/dist/server.js CHANGED
@@ -143,23 +143,31 @@ function handleNotFound(res, message) {
143
143
  }
144
144
  const CONTROL_PREFIX = "/__aimock";
145
145
  /**
146
- * Perform a full fixtures reset: clear the fixtures array, journal, video/fal
147
- * generation state, and the interaction/event-id counters, then zero the
148
- * `aimock_fixtures_loaded` gauge. Shared by `/reset/fixtures` and the
149
- * deprecated `/reset` alias.
146
+ * Perform a full reset: clear the fixtures array, the journal (entries *and*
147
+ * per-test fixture match-counts, i.e. sequence position), the video and fal.ai
148
+ * job/queue state, and the Gemini interaction/event-id counters, then re-zero
149
+ * the `aimock_fixtures_loaded` gauge.
150
+ *
151
+ * `targets` is `null` when no server is running (an in-process `reset()` before
152
+ * `start()`). The process-global generation state is reset either way, since it
153
+ * is not owned by any one server instance.
154
+ *
155
+ * Shared by `POST /__aimock/reset` (canonical), its deprecated
156
+ * `POST /__aimock/reset/fixtures` alias, and `LLMock.reset()`.
150
157
  */
151
- function performFixturesReset(fixtures, journal, videoStates, openRouterVideoJobs, veoVideoJobs, grokVideoJobs, defaults) {
158
+ function performFullReset(fixtures, targets) {
152
159
  fixtures.length = 0;
153
- journal.clear();
154
- videoStates.clear();
155
- openRouterVideoJobs.clear();
156
- veoVideoJobs.clear();
157
- grokVideoJobs.clear();
158
160
  falJobs.clear();
159
161
  falQueueStates.clear();
160
162
  resetInteractionCounter();
161
163
  resetEventIdCounter();
162
- if (defaults.registry) defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
164
+ if (!targets) return;
165
+ targets.journal.clear();
166
+ targets.videoStates.clear();
167
+ targets.openRouterVideoJobs.clear();
168
+ targets.veoVideoJobs.clear();
169
+ targets.grokVideoJobs.clear();
170
+ if (targets.defaults.registry) targets.defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
163
171
  }
164
172
  /**
165
173
  * Handle requests under `/__aimock/`. Returns `true` if the request was
@@ -179,6 +187,11 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
179
187
  res.end(JSON.stringify(journal.getAll()));
180
188
  return true;
181
189
  }
190
+ if (subPath === "/fixtures" && req.method === "GET") {
191
+ res.writeHead(200, { "Content-Type": "application/json" });
192
+ res.end(JSON.stringify({ count: fixtures.length }));
193
+ return true;
194
+ }
182
195
  if (subPath === "/fixtures" && req.method === "POST") {
183
196
  let raw;
184
197
  try {
@@ -228,8 +241,16 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
228
241
  res.end(JSON.stringify({ cleared: true }));
229
242
  return true;
230
243
  }
231
- if (subPath === "/reset/fixtures" && req.method === "POST") {
232
- performFixturesReset(fixtures, journal, videoStates, openRouterVideoJobs, veoVideoJobs, grokVideoJobs, defaults);
244
+ const resetTargets = () => ({
245
+ journal,
246
+ videoStates,
247
+ openRouterVideoJobs,
248
+ veoVideoJobs,
249
+ grokVideoJobs,
250
+ defaults
251
+ });
252
+ if (subPath === "/reset" && req.method === "POST") {
253
+ performFullReset(fixtures, resetTargets());
233
254
  res.writeHead(200, { "Content-Type": "application/json" });
234
255
  res.end(JSON.stringify({ reset: true }));
235
256
  return true;
@@ -240,10 +261,10 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
240
261
  res.end(JSON.stringify({ reset: true }));
241
262
  return true;
242
263
  }
243
- if (subPath === "/reset" && req.method === "POST") {
244
- performFixturesReset(fixtures, journal, videoStates, openRouterVideoJobs, veoVideoJobs, grokVideoJobs, defaults);
245
- const deprecation = "POST /__aimock/reset is deprecated; use POST /__aimock/reset/fixtures (full reset) or POST /__aimock/reset/journal (journal only)";
246
- defaults.logger.warn("POST /__aimock/reset is deprecated; use /__aimock/reset/fixtures or /__aimock/reset/journal");
264
+ if (subPath === "/reset/fixtures" && req.method === "POST") {
265
+ performFullReset(fixtures, resetTargets());
266
+ const deprecation = "POST /__aimock/reset/fixtures is deprecated; use POST /__aimock/reset (full reset) or POST /__aimock/reset/journal (journal only)";
267
+ defaults.logger.warn("POST /__aimock/reset/fixtures is deprecated; use /__aimock/reset or /__aimock/reset/journal");
247
268
  res.writeHead(200, {
248
269
  "Content-Type": "application/json",
249
270
  Deprecation: "true"
@@ -1837,7 +1858,48 @@ async function createServerWithResolvedAuth(fixtures, options, resolvedAuth, mou
1837
1858
  if (!socket.destroyed) socket.destroy();
1838
1859
  });
1839
1860
  });
1861
+ /**
1862
+ * Body bytes the platform already parsed onto `req` for an upgrade request.
1863
+ *
1864
+ * Node >= 26 delivers an upgrade request's body here and leaves `head`
1865
+ * empty; Node <= 24 leaves the body in `head` and ends `req` with nothing.
1866
+ * The stream has already ended in both cases, so this resolves on the next
1867
+ * tick either way — it never waits on the network.
1868
+ */
1869
+ function drainParsedRequestBody(req) {
1870
+ return new Promise((resolve) => {
1871
+ const chunks = [];
1872
+ let settled = false;
1873
+ const done = () => {
1874
+ if (settled) return;
1875
+ settled = true;
1876
+ resolve(Buffer.concat(chunks));
1877
+ };
1878
+ req.on("data", (c) => chunks.push(c));
1879
+ req.on("end", done);
1880
+ req.on("error", done);
1881
+ req.on("close", done);
1882
+ req.resume();
1883
+ });
1884
+ }
1840
1885
  async function handleUpgradeRequest(req, socket, head) {
1886
+ if ((req.headers.upgrade ?? "").toLowerCase() !== "websocket") {
1887
+ const parsedBody = await drainParsedRequestBody(req);
1888
+ const requestLine = `${req.method} ${req.url} HTTP/${req.httpVersion}\r\n`;
1889
+ const headerLines = [];
1890
+ for (let i = 0; i < req.rawHeaders.length; i += 2) {
1891
+ if (/^(?:upgrade|connection)$/i.test(req.rawHeaders[i])) continue;
1892
+ headerLines.push(`${req.rawHeaders[i]}: ${req.rawHeaders[i + 1]}`);
1893
+ }
1894
+ const rebuilt = Buffer.from(requestLine + headerLines.join("\r\n") + "\r\n\r\n");
1895
+ socket.unshift(Buffer.concat([
1896
+ rebuilt,
1897
+ parsedBody,
1898
+ head
1899
+ ]));
1900
+ server.emit("connection", socket);
1901
+ return;
1902
+ }
1841
1903
  const parsedUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
1842
1904
  let pathname = parsedUrl.pathname;
1843
1905
  if (!validateRequestApiKey(req, resolvedAuth.policy).ok) {
@@ -1936,5 +1998,5 @@ async function createServerWithResolvedAuth(fixtures, options, resolvedAuth, mou
1936
1998
  }
1937
1999
 
1938
2000
  //#endregion
1939
- export { createServer, createServerWithResolvedAuth };
2001
+ export { createServer, createServerWithResolvedAuth, performFullReset };
1940
2002
  //# sourceMappingURL=server.js.map