@copilotkit/aimock 1.10.0 → 1.12.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 (167) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +4 -2
  4. package/dist/a2a-types.d.cts.map +1 -1
  5. package/dist/a2a-types.d.ts.map +1 -1
  6. package/dist/agui-handler.cjs +340 -0
  7. package/dist/agui-handler.cjs.map +1 -0
  8. package/dist/agui-handler.d.cts +96 -0
  9. package/dist/agui-handler.d.cts.map +1 -0
  10. package/dist/agui-handler.d.ts +96 -0
  11. package/dist/agui-handler.d.ts.map +1 -0
  12. package/dist/agui-handler.js +326 -0
  13. package/dist/agui-handler.js.map +1 -0
  14. package/dist/agui-mock.cjs +190 -0
  15. package/dist/agui-mock.cjs.map +1 -0
  16. package/dist/agui-mock.d.cts +50 -0
  17. package/dist/agui-mock.d.cts.map +1 -0
  18. package/dist/agui-mock.d.ts +50 -0
  19. package/dist/agui-mock.d.ts.map +1 -0
  20. package/dist/agui-mock.js +188 -0
  21. package/dist/agui-mock.js.map +1 -0
  22. package/dist/agui-recorder.cjs +153 -0
  23. package/dist/agui-recorder.cjs.map +1 -0
  24. package/dist/agui-recorder.d.cts +19 -0
  25. package/dist/agui-recorder.d.cts.map +1 -0
  26. package/dist/agui-recorder.d.ts +19 -0
  27. package/dist/agui-recorder.d.ts.map +1 -0
  28. package/dist/agui-recorder.js +147 -0
  29. package/dist/agui-recorder.js.map +1 -0
  30. package/dist/agui-types.d.cts +231 -0
  31. package/dist/agui-types.d.cts.map +1 -0
  32. package/dist/agui-types.d.ts +231 -0
  33. package/dist/agui-types.d.ts.map +1 -0
  34. package/dist/bedrock-converse.cjs +2 -0
  35. package/dist/bedrock-converse.cjs.map +1 -1
  36. package/dist/bedrock-converse.d.cts.map +1 -1
  37. package/dist/bedrock-converse.d.ts.map +1 -1
  38. package/dist/bedrock-converse.js +2 -0
  39. package/dist/bedrock-converse.js.map +1 -1
  40. package/dist/bedrock.cjs +2 -0
  41. package/dist/bedrock.cjs.map +1 -1
  42. package/dist/bedrock.d.cts.map +1 -1
  43. package/dist/bedrock.d.ts.map +1 -1
  44. package/dist/bedrock.js +2 -0
  45. package/dist/bedrock.js.map +1 -1
  46. package/dist/cli.cjs +32 -1
  47. package/dist/cli.cjs.map +1 -1
  48. package/dist/cli.js +32 -1
  49. package/dist/cli.js.map +1 -1
  50. package/dist/cohere.cjs +1 -0
  51. package/dist/cohere.cjs.map +1 -1
  52. package/dist/cohere.js +1 -0
  53. package/dist/cohere.js.map +1 -1
  54. package/dist/config-loader.cjs +19 -0
  55. package/dist/config-loader.cjs.map +1 -1
  56. package/dist/config-loader.d.cts +16 -0
  57. package/dist/config-loader.d.cts.map +1 -1
  58. package/dist/config-loader.d.ts +16 -0
  59. package/dist/config-loader.d.ts.map +1 -1
  60. package/dist/config-loader.js +19 -0
  61. package/dist/config-loader.js.map +1 -1
  62. package/dist/embeddings.cjs +2 -1
  63. package/dist/embeddings.cjs.map +1 -1
  64. package/dist/embeddings.js +2 -1
  65. package/dist/embeddings.js.map +1 -1
  66. package/dist/gemini.cjs +1 -0
  67. package/dist/gemini.cjs.map +1 -1
  68. package/dist/gemini.js +1 -0
  69. package/dist/gemini.js.map +1 -1
  70. package/dist/helpers.cjs +16 -0
  71. package/dist/helpers.cjs.map +1 -1
  72. package/dist/helpers.d.cts +6 -2
  73. package/dist/helpers.d.cts.map +1 -1
  74. package/dist/helpers.d.ts +6 -2
  75. package/dist/helpers.d.ts.map +1 -1
  76. package/dist/helpers.js +13 -1
  77. package/dist/helpers.js.map +1 -1
  78. package/dist/images.cjs +166 -0
  79. package/dist/images.cjs.map +1 -0
  80. package/dist/images.d.cts +11 -0
  81. package/dist/images.d.cts.map +1 -0
  82. package/dist/images.d.ts +11 -0
  83. package/dist/images.d.ts.map +1 -0
  84. package/dist/images.js +166 -0
  85. package/dist/images.js.map +1 -0
  86. package/dist/index.cjs +32 -0
  87. package/dist/index.d.cts +11 -3
  88. package/dist/index.d.ts +11 -3
  89. package/dist/index.js +9 -2
  90. package/dist/llmock.cjs +37 -1
  91. package/dist/llmock.cjs.map +1 -1
  92. package/dist/llmock.d.cts +5 -1
  93. package/dist/llmock.d.cts.map +1 -1
  94. package/dist/llmock.d.ts +5 -1
  95. package/dist/llmock.d.ts.map +1 -1
  96. package/dist/llmock.js +37 -1
  97. package/dist/llmock.js.map +1 -1
  98. package/dist/messages.cjs +1 -0
  99. package/dist/messages.cjs.map +1 -1
  100. package/dist/messages.js +1 -0
  101. package/dist/messages.js.map +1 -1
  102. package/dist/ollama.cjs +2 -0
  103. package/dist/ollama.cjs.map +1 -1
  104. package/dist/ollama.d.cts.map +1 -1
  105. package/dist/ollama.d.ts.map +1 -1
  106. package/dist/ollama.js +2 -0
  107. package/dist/ollama.js.map +1 -1
  108. package/dist/recorder.cjs +50 -7
  109. package/dist/recorder.cjs.map +1 -1
  110. package/dist/recorder.js +50 -7
  111. package/dist/recorder.js.map +1 -1
  112. package/dist/responses.cjs +1 -0
  113. package/dist/responses.cjs.map +1 -1
  114. package/dist/responses.js +1 -0
  115. package/dist/responses.js.map +1 -1
  116. package/dist/router.cjs +8 -0
  117. package/dist/router.cjs.map +1 -1
  118. package/dist/router.d.cts.map +1 -1
  119. package/dist/router.d.ts.map +1 -1
  120. package/dist/router.js +9 -0
  121. package/dist/router.js.map +1 -1
  122. package/dist/server.cjs +80 -3
  123. package/dist/server.cjs.map +1 -1
  124. package/dist/server.d.cts +2 -0
  125. package/dist/server.d.cts.map +1 -1
  126. package/dist/server.d.ts +2 -0
  127. package/dist/server.d.ts.map +1 -1
  128. package/dist/server.js +80 -3
  129. package/dist/server.js.map +1 -1
  130. package/dist/speech.cjs +144 -0
  131. package/dist/speech.cjs.map +1 -0
  132. package/dist/speech.d.cts +11 -0
  133. package/dist/speech.d.cts.map +1 -0
  134. package/dist/speech.d.ts +11 -0
  135. package/dist/speech.d.ts.map +1 -0
  136. package/dist/speech.js +144 -0
  137. package/dist/speech.js.map +1 -0
  138. package/dist/suite.cjs +8 -0
  139. package/dist/suite.cjs.map +1 -1
  140. package/dist/suite.d.cts +4 -0
  141. package/dist/suite.d.cts.map +1 -1
  142. package/dist/suite.d.ts +4 -0
  143. package/dist/suite.d.ts.map +1 -1
  144. package/dist/suite.js +8 -0
  145. package/dist/suite.js.map +1 -1
  146. package/dist/transcription.cjs +134 -0
  147. package/dist/transcription.cjs.map +1 -0
  148. package/dist/transcription.d.cts +11 -0
  149. package/dist/transcription.d.cts.map +1 -0
  150. package/dist/transcription.d.ts +11 -0
  151. package/dist/transcription.d.ts.map +1 -0
  152. package/dist/transcription.js +134 -0
  153. package/dist/transcription.js.map +1 -0
  154. package/dist/types.d.cts +44 -2
  155. package/dist/types.d.cts.map +1 -1
  156. package/dist/types.d.ts +44 -2
  157. package/dist/types.d.ts.map +1 -1
  158. package/dist/vector-types.d.ts.map +1 -1
  159. package/dist/video.cjs +196 -0
  160. package/dist/video.cjs.map +1 -0
  161. package/dist/video.d.cts +14 -0
  162. package/dist/video.d.cts.map +1 -0
  163. package/dist/video.d.ts +14 -0
  164. package/dist/video.d.ts.map +1 -0
  165. package/dist/video.js +195 -0
  166. package/dist/video.js.map +1 -0
  167. package/package.json +2 -2
@@ -9,7 +9,7 @@
9
9
  "source": {
10
10
  "source": "npm",
11
11
  "package": "@copilotkit/aimock",
12
- "version": "^1.10.0"
12
+ "version": "^1.11.0"
13
13
  },
14
14
  "description": "Fixture authoring skill for @copilotkit/aimock — match fields, response types, embeddings, structured output, sequential responses, streaming physics, agent loop patterns, gotchas, and debugging"
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llmock",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "Fixture authoring guidance for @copilotkit/aimock",
5
5
  "author": {
6
6
  "name": "CopilotKit"
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  https://github.com/user-attachments/assets/646bf106-0320-41f2-a9b1-5090454830f3
4
4
 
5
- Mock infrastructure for AI application testing — LLM APIs, MCP tools, A2A agents, vector databases, search, rerank, and moderation. One package, one port, zero dependencies.
5
+ Mock infrastructure for AI application testing — LLM APIs, image generation, text-to-speech, transcription, video generation, MCP tools, A2A agents, AG-UI event streams, vector databases, search, rerank, and moderation. One package, one port, zero dependencies.
6
6
 
7
7
  ## Quick Start
8
8
 
@@ -33,6 +33,7 @@ aimock mocks everything your AI app talks to:
33
33
  | **LLMock** | OpenAI, Claude, Gemini, Bedrock, Azure, Vertex AI, Ollama, Cohere | [Providers](https://aimock.copilotkit.dev/docs) |
34
34
  | **MCPMock** | MCP tools, resources, prompts with session management | [MCP](https://aimock.copilotkit.dev/mcp-mock) |
35
35
  | **A2AMock** | Agent-to-agent protocol with SSE streaming | [A2A](https://aimock.copilotkit.dev/a2a-mock) |
36
+ | **AGUIMock** | AG-UI agent-to-UI event streams for frontend testing | [AG-UI](https://aimock.copilotkit.dev/agui-mock) |
36
37
  | **VectorMock** | Pinecone, Qdrant, ChromaDB compatible endpoints | [Vector](https://aimock.copilotkit.dev/vector-mock) |
37
38
  | **Services** | Tavily search, Cohere rerank, OpenAI moderation | [Services](https://aimock.copilotkit.dev/services) |
38
39
 
@@ -42,7 +43,8 @@ Run them all on one port with `npx aimock --config aimock.json`, or use the prog
42
43
 
43
44
  - **[Record & Replay](https://aimock.copilotkit.dev/record-replay)** — Proxy real APIs, save as fixtures, replay deterministically forever
44
45
  - **[11 LLM Providers](https://aimock.copilotkit.dev/docs)** — OpenAI, Claude, Gemini, Bedrock, Azure, Vertex AI, Ollama, Cohere — full streaming support
45
- - **[MCP / A2A / Vector](https://aimock.copilotkit.dev/mcp-mock)** — Mock every protocol your AI agents use
46
+ - **[Multimedia APIs](https://aimock.copilotkit.dev/images)** — Image generation (DALL-E, Imagen), text-to-speech, audio transcription, video generation
47
+ - **[MCP / A2A / AG-UI / Vector](https://aimock.copilotkit.dev/mcp-mock)** — Mock every protocol your AI agents use
46
48
  - **[Chaos Testing](https://aimock.copilotkit.dev/chaos-testing)** — 500 errors, malformed JSON, mid-stream disconnects at any probability
47
49
  - **[Drift Detection](https://aimock.copilotkit.dev/drift-detection)** — Daily CI validation against real APIs
48
50
  - **[Streaming Physics](https://aimock.copilotkit.dev/streaming-physics)** — Configurable `ttft`, `tps`, and `jitter`
@@ -1 +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"}
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,CAiBD;EAGC,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"}
@@ -1 +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"}
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,CAiBD;EAGC,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,340 @@
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ let node_crypto = require("node:crypto");
3
+
4
+ //#region src/agui-handler.ts
5
+ /**
6
+ * Extract the content of the last message with role "user" from the input.
7
+ */
8
+ function extractLastUserMessage(input) {
9
+ if (!input.messages || input.messages.length === 0) return "";
10
+ for (let i = input.messages.length - 1; i >= 0; i--) {
11
+ const msg = input.messages[i];
12
+ if (msg.role === "user" && typeof msg.content === "string") return msg.content;
13
+ }
14
+ return "";
15
+ }
16
+ /**
17
+ * Check whether an input matches a fixture's match criteria.
18
+ * All specified criteria must pass (AND logic).
19
+ */
20
+ function matchesFixture(input, match) {
21
+ if (match.message !== void 0) {
22
+ const text = extractLastUserMessage(input);
23
+ if (typeof match.message === "string") {
24
+ if (!text.includes(match.message)) return false;
25
+ } else if (!match.message.test(text)) return false;
26
+ }
27
+ if (match.toolName !== void 0) {
28
+ if (!(input.tools ?? []).some((t) => t.name === match.toolName)) return false;
29
+ }
30
+ if (match.stateKey !== void 0) {
31
+ if (input.state === null || input.state === void 0 || typeof input.state !== "object" || !(match.stateKey in input.state)) return false;
32
+ }
33
+ if (match.predicate !== void 0) {
34
+ if (!match.predicate(input)) return false;
35
+ }
36
+ return true;
37
+ }
38
+ /**
39
+ * Find the first fixture whose match criteria pass for the given input.
40
+ */
41
+ function findFixture(input, fixtures) {
42
+ for (const fixture of fixtures) if (matchesFixture(input, fixture.match)) return fixture;
43
+ return null;
44
+ }
45
+ function makeRunStarted(opts) {
46
+ return {
47
+ type: "RUN_STARTED",
48
+ threadId: opts?.threadId ?? (0, node_crypto.randomUUID)(),
49
+ runId: opts?.runId ?? (0, node_crypto.randomUUID)(),
50
+ ...opts?.parentRunId ? { parentRunId: opts.parentRunId } : {}
51
+ };
52
+ }
53
+ function makeRunFinished(started) {
54
+ return {
55
+ type: "RUN_FINISHED",
56
+ threadId: started.threadId,
57
+ runId: started.runId
58
+ };
59
+ }
60
+ /**
61
+ * Build a complete text message response sequence.
62
+ * [RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED]
63
+ */
64
+ function buildTextResponse(text, opts) {
65
+ const started = makeRunStarted(opts);
66
+ const messageId = (0, node_crypto.randomUUID)();
67
+ return [
68
+ started,
69
+ {
70
+ type: "TEXT_MESSAGE_START",
71
+ messageId,
72
+ role: "assistant"
73
+ },
74
+ {
75
+ type: "TEXT_MESSAGE_CONTENT",
76
+ messageId,
77
+ delta: text
78
+ },
79
+ {
80
+ type: "TEXT_MESSAGE_END",
81
+ messageId
82
+ },
83
+ makeRunFinished(started)
84
+ ];
85
+ }
86
+ /**
87
+ * Build a text chunk response (single chunk, no start/end envelope).
88
+ * [RUN_STARTED, TEXT_MESSAGE_CHUNK, RUN_FINISHED]
89
+ */
90
+ function buildTextChunkResponse(text, opts) {
91
+ const started = makeRunStarted(opts);
92
+ return [
93
+ started,
94
+ {
95
+ type: "TEXT_MESSAGE_CHUNK",
96
+ messageId: (0, node_crypto.randomUUID)(),
97
+ role: "assistant",
98
+ delta: text
99
+ },
100
+ makeRunFinished(started)
101
+ ];
102
+ }
103
+ /**
104
+ * Build a tool call response sequence.
105
+ * [RUN_STARTED, TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, (TOOL_CALL_RESULT)?, RUN_FINISHED]
106
+ */
107
+ function buildToolCallResponse(toolName, args, opts) {
108
+ const started = makeRunStarted(opts);
109
+ const toolCallId = (0, node_crypto.randomUUID)();
110
+ const events = [
111
+ started,
112
+ {
113
+ type: "TOOL_CALL_START",
114
+ toolCallId,
115
+ toolCallName: toolName
116
+ },
117
+ {
118
+ type: "TOOL_CALL_ARGS",
119
+ toolCallId,
120
+ delta: args
121
+ },
122
+ {
123
+ type: "TOOL_CALL_END",
124
+ toolCallId
125
+ }
126
+ ];
127
+ if (opts?.result !== void 0) events.push({
128
+ type: "TOOL_CALL_RESULT",
129
+ messageId: (0, node_crypto.randomUUID)(),
130
+ toolCallId,
131
+ content: opts.result,
132
+ role: "tool"
133
+ });
134
+ events.push(makeRunFinished(started));
135
+ return events;
136
+ }
137
+ /**
138
+ * Build a state snapshot response.
139
+ * [RUN_STARTED, STATE_SNAPSHOT, RUN_FINISHED]
140
+ */
141
+ function buildStateUpdate(snapshot, opts) {
142
+ const started = makeRunStarted(opts);
143
+ return [
144
+ started,
145
+ {
146
+ type: "STATE_SNAPSHOT",
147
+ snapshot
148
+ },
149
+ makeRunFinished(started)
150
+ ];
151
+ }
152
+ /**
153
+ * Build a state delta response (JSON Patch).
154
+ * [RUN_STARTED, STATE_DELTA, RUN_FINISHED]
155
+ */
156
+ function buildStateDelta(patches, opts) {
157
+ const started = makeRunStarted(opts);
158
+ return [
159
+ started,
160
+ {
161
+ type: "STATE_DELTA",
162
+ delta: patches
163
+ },
164
+ makeRunFinished(started)
165
+ ];
166
+ }
167
+ /**
168
+ * Build a messages snapshot response.
169
+ * [RUN_STARTED, MESSAGES_SNAPSHOT, RUN_FINISHED]
170
+ */
171
+ function buildMessagesSnapshot(messages, opts) {
172
+ const started = makeRunStarted(opts);
173
+ return [
174
+ started,
175
+ {
176
+ type: "MESSAGES_SNAPSHOT",
177
+ messages
178
+ },
179
+ makeRunFinished(started)
180
+ ];
181
+ }
182
+ /**
183
+ * Build a reasoning response sequence.
184
+ * [RUN_STARTED, REASONING_START, REASONING_MESSAGE_START, REASONING_MESSAGE_CONTENT,
185
+ * REASONING_MESSAGE_END, REASONING_END, RUN_FINISHED]
186
+ */
187
+ function buildReasoningResponse(text, opts) {
188
+ const started = makeRunStarted(opts);
189
+ const messageId = (0, node_crypto.randomUUID)();
190
+ return [
191
+ started,
192
+ {
193
+ type: "REASONING_START",
194
+ messageId
195
+ },
196
+ {
197
+ type: "REASONING_MESSAGE_START",
198
+ messageId,
199
+ role: "reasoning"
200
+ },
201
+ {
202
+ type: "REASONING_MESSAGE_CONTENT",
203
+ messageId,
204
+ delta: text
205
+ },
206
+ {
207
+ type: "REASONING_MESSAGE_END",
208
+ messageId
209
+ },
210
+ {
211
+ type: "REASONING_END",
212
+ messageId
213
+ },
214
+ makeRunFinished(started)
215
+ ];
216
+ }
217
+ /**
218
+ * Build an activity snapshot response.
219
+ * [RUN_STARTED, ACTIVITY_SNAPSHOT, RUN_FINISHED]
220
+ */
221
+ function buildActivityResponse(messageId, activityType, content, opts) {
222
+ const started = makeRunStarted(opts);
223
+ return [
224
+ started,
225
+ {
226
+ type: "ACTIVITY_SNAPSHOT",
227
+ messageId,
228
+ activityType,
229
+ content,
230
+ replace: true
231
+ },
232
+ makeRunFinished(started)
233
+ ];
234
+ }
235
+ /**
236
+ * Build an error response.
237
+ * [RUN_STARTED, RUN_ERROR] (no RUN_FINISHED — the run errored)
238
+ */
239
+ function buildErrorResponse(message, code, opts) {
240
+ return [makeRunStarted(opts), {
241
+ type: "RUN_ERROR",
242
+ message,
243
+ ...code !== void 0 ? { code } : {}
244
+ }];
245
+ }
246
+ /**
247
+ * Build a step-wrapped text response.
248
+ * [RUN_STARTED, STEP_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT,
249
+ * TEXT_MESSAGE_END, STEP_FINISHED, RUN_FINISHED]
250
+ */
251
+ function buildStepWithText(stepName, text, opts) {
252
+ const started = makeRunStarted(opts);
253
+ const messageId = (0, node_crypto.randomUUID)();
254
+ return [
255
+ started,
256
+ {
257
+ type: "STEP_STARTED",
258
+ stepName
259
+ },
260
+ {
261
+ type: "TEXT_MESSAGE_START",
262
+ messageId,
263
+ role: "assistant"
264
+ },
265
+ {
266
+ type: "TEXT_MESSAGE_CONTENT",
267
+ messageId,
268
+ delta: text
269
+ },
270
+ {
271
+ type: "TEXT_MESSAGE_END",
272
+ messageId
273
+ },
274
+ {
275
+ type: "STEP_FINISHED",
276
+ stepName
277
+ },
278
+ makeRunFinished(started)
279
+ ];
280
+ }
281
+ /**
282
+ * Combine multiple builder outputs into a single run.
283
+ * Strips RUN_STARTED/RUN_FINISHED from each input, wraps all inner events
284
+ * in one RUN_STARTED...RUN_FINISHED pair.
285
+ */
286
+ function buildCompositeResponse(builderOutputs, opts) {
287
+ const started = makeRunStarted(opts);
288
+ const inner = [];
289
+ for (const events of builderOutputs) for (const event of events) if (event.type !== "RUN_STARTED" && event.type !== "RUN_FINISHED") inner.push(event);
290
+ return [
291
+ started,
292
+ ...inner,
293
+ makeRunFinished(started)
294
+ ];
295
+ }
296
+ /**
297
+ * Write AG-UI events as an SSE stream to an HTTP response.
298
+ * Sets appropriate headers, serializes each event as `data: {...}\n\n`,
299
+ * and optionally delays between events.
300
+ */
301
+ async function writeAGUIEventStream(res, events, opts) {
302
+ const delayMs = opts?.delayMs ?? 0;
303
+ res.writeHead(200, {
304
+ "Content-Type": "text/event-stream",
305
+ "Cache-Control": "no-cache",
306
+ Connection: "keep-alive"
307
+ });
308
+ for (const event of events) {
309
+ if (opts?.signal?.aborted) break;
310
+ if (res.socket?.destroyed) break;
311
+ const stamped = {
312
+ ...event,
313
+ timestamp: Date.now()
314
+ };
315
+ try {
316
+ res.write(`data: ${JSON.stringify(stamped)}\n\n`);
317
+ } catch {
318
+ break;
319
+ }
320
+ if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
321
+ }
322
+ if (!res.writableEnded) res.end();
323
+ }
324
+
325
+ //#endregion
326
+ exports.buildActivityResponse = buildActivityResponse;
327
+ exports.buildCompositeResponse = buildCompositeResponse;
328
+ exports.buildErrorResponse = buildErrorResponse;
329
+ exports.buildMessagesSnapshot = buildMessagesSnapshot;
330
+ exports.buildReasoningResponse = buildReasoningResponse;
331
+ exports.buildStateDelta = buildStateDelta;
332
+ exports.buildStateUpdate = buildStateUpdate;
333
+ exports.buildStepWithText = buildStepWithText;
334
+ exports.buildTextChunkResponse = buildTextChunkResponse;
335
+ exports.buildTextResponse = buildTextResponse;
336
+ exports.buildToolCallResponse = buildToolCallResponse;
337
+ exports.extractLastUserMessage = extractLastUserMessage;
338
+ exports.findFixture = findFixture;
339
+ exports.writeAGUIEventStream = writeAGUIEventStream;
340
+ //# sourceMappingURL=agui-handler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agui-handler.cjs","names":[],"sources":["../src/agui-handler.ts"],"sourcesContent":["// ─── AG-UI Handler ───────────────────────────────────────────────────────────\n//\n// Matching functions, event builders, and SSE writer for AG-UI protocol.\n\nimport * as http from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type {\n AGUIRunAgentInput,\n AGUIFixtureMatch,\n AGUIFixture,\n AGUIEvent,\n AGUIMessage,\n AGUIRunStartedEvent,\n AGUIRunFinishedEvent,\n AGUIRunErrorEvent,\n AGUITextMessageStartEvent,\n AGUITextMessageContentEvent,\n AGUITextMessageEndEvent,\n AGUITextMessageChunkEvent,\n AGUIToolCallStartEvent,\n AGUIToolCallArgsEvent,\n AGUIToolCallEndEvent,\n AGUIToolCallResultEvent,\n AGUIStateSnapshotEvent,\n AGUIStateDeltaEvent,\n AGUIMessagesSnapshotEvent,\n AGUIStepStartedEvent,\n AGUIStepFinishedEvent,\n AGUIReasoningStartEvent,\n AGUIReasoningMessageStartEvent,\n AGUIReasoningMessageContentEvent,\n AGUIReasoningMessageEndEvent,\n AGUIReasoningEndEvent,\n AGUIActivitySnapshotEvent,\n} from \"./agui-types.js\";\n\n// ─── Matching functions ──────────────────────────────────────────────────────\n\n/**\n * Extract the content of the last message with role \"user\" from the input.\n */\nexport function extractLastUserMessage(input: AGUIRunAgentInput): string {\n if (!input.messages || input.messages.length === 0) return \"\";\n for (let i = input.messages.length - 1; i >= 0; i--) {\n const msg = input.messages[i];\n if (msg.role === \"user\" && typeof msg.content === \"string\") {\n return msg.content;\n }\n }\n return \"\";\n}\n\n/**\n * Check whether an input matches a fixture's match criteria.\n * All specified criteria must pass (AND logic).\n */\nexport function matchesFixture(input: AGUIRunAgentInput, match: AGUIFixtureMatch): boolean {\n if (match.message !== undefined) {\n const text = extractLastUserMessage(input);\n if (typeof match.message === \"string\") {\n if (!text.includes(match.message)) return false;\n } else {\n if (!match.message.test(text)) return false;\n }\n }\n\n if (match.toolName !== undefined) {\n const tools = input.tools ?? [];\n if (!tools.some((t) => t.name === match.toolName)) return false;\n }\n\n if (match.stateKey !== undefined) {\n if (\n input.state === null ||\n input.state === undefined ||\n typeof input.state !== \"object\" ||\n !(match.stateKey in (input.state as Record<string, unknown>))\n ) {\n return false;\n }\n }\n\n if (match.predicate !== undefined) {\n if (!match.predicate(input)) return false;\n }\n\n return true;\n}\n\n/**\n * Find the first fixture whose match criteria pass for the given input.\n */\nexport function findFixture(input: AGUIRunAgentInput, fixtures: AGUIFixture[]): AGUIFixture | null {\n for (const fixture of fixtures) {\n if (matchesFixture(input, fixture.match)) {\n return fixture;\n }\n }\n return null;\n}\n\n// ─── Builder options ─────────────────────────────────────────────────────────\n\nexport interface AGUIBuildOpts {\n threadId?: string;\n runId?: string;\n parentRunId?: string;\n /** For tool call builder: include a result event */\n result?: string;\n}\n\n// ─── Event builders ──────────────────────────────────────────────────────────\n\nfunction makeRunStarted(opts?: AGUIBuildOpts): AGUIRunStartedEvent {\n return {\n type: \"RUN_STARTED\",\n threadId: opts?.threadId ?? randomUUID(),\n runId: opts?.runId ?? randomUUID(),\n ...(opts?.parentRunId ? { parentRunId: opts.parentRunId } : {}),\n };\n}\n\nfunction makeRunFinished(started: AGUIRunStartedEvent): AGUIRunFinishedEvent {\n return {\n type: \"RUN_FINISHED\",\n threadId: started.threadId,\n runId: started.runId,\n };\n}\n\n/**\n * Build a complete text message response sequence.\n * [RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED]\n */\nexport function buildTextResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n const messageId = randomUUID();\n return [\n started,\n {\n type: \"TEXT_MESSAGE_START\",\n messageId,\n role: \"assistant\",\n } as AGUITextMessageStartEvent,\n {\n type: \"TEXT_MESSAGE_CONTENT\",\n messageId,\n delta: text,\n } as AGUITextMessageContentEvent,\n {\n type: \"TEXT_MESSAGE_END\",\n messageId,\n } as AGUITextMessageEndEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build a text chunk response (single chunk, no start/end envelope).\n * [RUN_STARTED, TEXT_MESSAGE_CHUNK, RUN_FINISHED]\n */\nexport function buildTextChunkResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"TEXT_MESSAGE_CHUNK\",\n messageId: randomUUID(),\n role: \"assistant\",\n delta: text,\n } as AGUITextMessageChunkEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build a tool call response sequence.\n * [RUN_STARTED, TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, (TOOL_CALL_RESULT)?, RUN_FINISHED]\n */\nexport function buildToolCallResponse(\n toolName: string,\n args: string,\n opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n const started = makeRunStarted(opts);\n const toolCallId = randomUUID();\n const events: AGUIEvent[] = [\n started,\n {\n type: \"TOOL_CALL_START\",\n toolCallId,\n toolCallName: toolName,\n } as AGUIToolCallStartEvent,\n {\n type: \"TOOL_CALL_ARGS\",\n toolCallId,\n delta: args,\n } as AGUIToolCallArgsEvent,\n {\n type: \"TOOL_CALL_END\",\n toolCallId,\n } as AGUIToolCallEndEvent,\n ];\n\n if (opts?.result !== undefined) {\n events.push({\n type: \"TOOL_CALL_RESULT\",\n messageId: randomUUID(),\n toolCallId,\n content: opts.result,\n role: \"tool\",\n } as AGUIToolCallResultEvent);\n }\n\n events.push(makeRunFinished(started));\n return events;\n}\n\n/**\n * Build a state snapshot response.\n * [RUN_STARTED, STATE_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildStateUpdate(snapshot: unknown, opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"STATE_SNAPSHOT\",\n snapshot,\n } as AGUIStateSnapshotEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build a state delta response (JSON Patch).\n * [RUN_STARTED, STATE_DELTA, RUN_FINISHED]\n */\nexport function buildStateDelta(patches: unknown[], opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"STATE_DELTA\",\n delta: patches,\n } as AGUIStateDeltaEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build a messages snapshot response.\n * [RUN_STARTED, MESSAGES_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildMessagesSnapshot(messages: AGUIMessage[], opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"MESSAGES_SNAPSHOT\",\n messages,\n } as AGUIMessagesSnapshotEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build a reasoning response sequence.\n * [RUN_STARTED, REASONING_START, REASONING_MESSAGE_START, REASONING_MESSAGE_CONTENT,\n * REASONING_MESSAGE_END, REASONING_END, RUN_FINISHED]\n */\nexport function buildReasoningResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n const started = makeRunStarted(opts);\n const messageId = randomUUID();\n return [\n started,\n {\n type: \"REASONING_START\",\n messageId,\n } as AGUIReasoningStartEvent,\n {\n type: \"REASONING_MESSAGE_START\",\n messageId,\n role: \"reasoning\",\n } as AGUIReasoningMessageStartEvent,\n {\n type: \"REASONING_MESSAGE_CONTENT\",\n messageId,\n delta: text,\n } as AGUIReasoningMessageContentEvent,\n {\n type: \"REASONING_MESSAGE_END\",\n messageId,\n } as AGUIReasoningMessageEndEvent,\n {\n type: \"REASONING_END\",\n messageId,\n } as AGUIReasoningEndEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build an activity snapshot response.\n * [RUN_STARTED, ACTIVITY_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildActivityResponse(\n messageId: string,\n activityType: string,\n content: Record<string, unknown>,\n opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"ACTIVITY_SNAPSHOT\",\n messageId,\n activityType,\n content,\n replace: true,\n } as AGUIActivitySnapshotEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Build an error response.\n * [RUN_STARTED, RUN_ERROR] (no RUN_FINISHED — the run errored)\n */\nexport function buildErrorResponse(\n message: string,\n code?: string,\n opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n const started = makeRunStarted(opts);\n return [\n started,\n {\n type: \"RUN_ERROR\",\n message,\n ...(code !== undefined ? { code } : {}),\n } as AGUIRunErrorEvent,\n ];\n}\n\n/**\n * Build a step-wrapped text response.\n * [RUN_STARTED, STEP_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT,\n * TEXT_MESSAGE_END, STEP_FINISHED, RUN_FINISHED]\n */\nexport function buildStepWithText(\n stepName: string,\n text: string,\n opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n const started = makeRunStarted(opts);\n const messageId = randomUUID();\n return [\n started,\n {\n type: \"STEP_STARTED\",\n stepName,\n } as AGUIStepStartedEvent,\n {\n type: \"TEXT_MESSAGE_START\",\n messageId,\n role: \"assistant\",\n } as AGUITextMessageStartEvent,\n {\n type: \"TEXT_MESSAGE_CONTENT\",\n messageId,\n delta: text,\n } as AGUITextMessageContentEvent,\n {\n type: \"TEXT_MESSAGE_END\",\n messageId,\n } as AGUITextMessageEndEvent,\n {\n type: \"STEP_FINISHED\",\n stepName,\n } as AGUIStepFinishedEvent,\n makeRunFinished(started),\n ];\n}\n\n/**\n * Combine multiple builder outputs into a single run.\n * Strips RUN_STARTED/RUN_FINISHED from each input, wraps all inner events\n * in one RUN_STARTED...RUN_FINISHED pair.\n */\nexport function buildCompositeResponse(\n builderOutputs: AGUIEvent[][],\n opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n const started = makeRunStarted(opts);\n const inner: AGUIEvent[] = [];\n\n for (const events of builderOutputs) {\n for (const event of events) {\n if (event.type !== \"RUN_STARTED\" && event.type !== \"RUN_FINISHED\") {\n inner.push(event);\n }\n }\n }\n\n return [started, ...inner, makeRunFinished(started)];\n}\n\n// ─── SSE writer ──────────────────────────────────────────────────────────────\n\n/**\n * Write AG-UI events as an SSE stream to an HTTP response.\n * Sets appropriate headers, serializes each event as `data: {...}\\n\\n`,\n * and optionally delays between events.\n */\nexport async function writeAGUIEventStream(\n res: http.ServerResponse,\n events: AGUIEvent[],\n opts?: { delayMs?: number; signal?: AbortSignal },\n): Promise<void> {\n const delayMs = opts?.delayMs ?? 0;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n for (const event of events) {\n if (opts?.signal?.aborted) break;\n if (res.socket?.destroyed) break;\n\n const stamped = { ...event, timestamp: Date.now() };\n try {\n res.write(`data: ${JSON.stringify(stamped)}\\n\\n`);\n } catch {\n break; // client disconnected or stream error — stop writing\n }\n\n if (delayMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n if (!res.writableEnded) res.end();\n}\n"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { AGUIEvent, AGUIFixture, AGUIMessage, AGUIRunAgentInput } from "./agui-types.cjs";
2
+ import * as http from "node:http";
3
+
4
+ //#region src/agui-handler.d.ts
5
+
6
+ /**
7
+ * Extract the content of the last message with role "user" from the input.
8
+ */
9
+ declare function extractLastUserMessage(input: AGUIRunAgentInput): string;
10
+ /**
11
+ * Check whether an input matches a fixture's match criteria.
12
+ * All specified criteria must pass (AND logic).
13
+ */
14
+
15
+ /**
16
+ * Find the first fixture whose match criteria pass for the given input.
17
+ */
18
+ declare function findFixture(input: AGUIRunAgentInput, fixtures: AGUIFixture[]): AGUIFixture | null;
19
+ interface AGUIBuildOpts {
20
+ threadId?: string;
21
+ runId?: string;
22
+ parentRunId?: string;
23
+ /** For tool call builder: include a result event */
24
+ result?: string;
25
+ }
26
+ /**
27
+ * Build a complete text message response sequence.
28
+ * [RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED]
29
+ */
30
+ declare function buildTextResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
31
+ /**
32
+ * Build a text chunk response (single chunk, no start/end envelope).
33
+ * [RUN_STARTED, TEXT_MESSAGE_CHUNK, RUN_FINISHED]
34
+ */
35
+ declare function buildTextChunkResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
36
+ /**
37
+ * Build a tool call response sequence.
38
+ * [RUN_STARTED, TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, (TOOL_CALL_RESULT)?, RUN_FINISHED]
39
+ */
40
+ declare function buildToolCallResponse(toolName: string, args: string, opts?: AGUIBuildOpts): AGUIEvent[];
41
+ /**
42
+ * Build a state snapshot response.
43
+ * [RUN_STARTED, STATE_SNAPSHOT, RUN_FINISHED]
44
+ */
45
+ declare function buildStateUpdate(snapshot: unknown, opts?: AGUIBuildOpts): AGUIEvent[];
46
+ /**
47
+ * Build a state delta response (JSON Patch).
48
+ * [RUN_STARTED, STATE_DELTA, RUN_FINISHED]
49
+ */
50
+ declare function buildStateDelta(patches: unknown[], opts?: AGUIBuildOpts): AGUIEvent[];
51
+ /**
52
+ * Build a messages snapshot response.
53
+ * [RUN_STARTED, MESSAGES_SNAPSHOT, RUN_FINISHED]
54
+ */
55
+ declare function buildMessagesSnapshot(messages: AGUIMessage[], opts?: AGUIBuildOpts): AGUIEvent[];
56
+ /**
57
+ * Build a reasoning response sequence.
58
+ * [RUN_STARTED, REASONING_START, REASONING_MESSAGE_START, REASONING_MESSAGE_CONTENT,
59
+ * REASONING_MESSAGE_END, REASONING_END, RUN_FINISHED]
60
+ */
61
+ declare function buildReasoningResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
62
+ /**
63
+ * Build an activity snapshot response.
64
+ * [RUN_STARTED, ACTIVITY_SNAPSHOT, RUN_FINISHED]
65
+ */
66
+ declare function buildActivityResponse(messageId: string, activityType: string, content: Record<string, unknown>, opts?: AGUIBuildOpts): AGUIEvent[];
67
+ /**
68
+ * Build an error response.
69
+ * [RUN_STARTED, RUN_ERROR] (no RUN_FINISHED — the run errored)
70
+ */
71
+ declare function buildErrorResponse(message: string, code?: string, opts?: AGUIBuildOpts): AGUIEvent[];
72
+ /**
73
+ * Build a step-wrapped text response.
74
+ * [RUN_STARTED, STEP_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT,
75
+ * TEXT_MESSAGE_END, STEP_FINISHED, RUN_FINISHED]
76
+ */
77
+ declare function buildStepWithText(stepName: string, text: string, opts?: AGUIBuildOpts): AGUIEvent[];
78
+ /**
79
+ * Combine multiple builder outputs into a single run.
80
+ * Strips RUN_STARTED/RUN_FINISHED from each input, wraps all inner events
81
+ * in one RUN_STARTED...RUN_FINISHED pair.
82
+ */
83
+ declare function buildCompositeResponse(builderOutputs: AGUIEvent[][], opts?: AGUIBuildOpts): AGUIEvent[];
84
+ /**
85
+ * Write AG-UI events as an SSE stream to an HTTP response.
86
+ * Sets appropriate headers, serializes each event as `data: {...}\n\n`,
87
+ * and optionally delays between events.
88
+ */
89
+ declare function writeAGUIEventStream(res: http.ServerResponse, events: AGUIEvent[], opts?: {
90
+ delayMs?: number;
91
+ signal?: AbortSignal;
92
+ }): Promise<void>;
93
+ //# sourceMappingURL=agui-handler.d.ts.map
94
+ //#endregion
95
+ export { buildActivityResponse, buildCompositeResponse, buildErrorResponse, buildMessagesSnapshot, buildReasoningResponse, buildStateDelta, buildStateUpdate, buildStepWithText, buildTextChunkResponse, buildTextResponse, buildToolCallResponse, extractLastUserMessage, findFixture, writeAGUIEventStream };
96
+ //# sourceMappingURL=agui-handler.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agui-handler.d.cts","names":[],"sources":["../src/agui-handler.ts"],"sourcesContent":[],"mappings":";;;;;;;AA0CA;AAmDgB,iBAnDA,sBAAA,CAmDW,KAAA,EAnDmB,iBAmDnB,CAAA,EAAA,MAAA;;;;;;AAW3B;AA+BA;;AAAuD,iBA1CvC,WAAA,CA0CuC,KAAA,EA1CpB,iBA0CoB,EAAA,QAAA,EA1CS,WA0CT,EAAA,CAAA,EA1CyB,WA0CzB,GAAA,IAAA;AAAgB,UA/BtD,aAAA,CA+BsD;EAAS,QAAA,CAAA,EAAA,MAAA;EA2BhE,KAAA,CAAA,EAAA,MAAA;EAAsB,WAAA,CAAA,EAAA,MAAA;;QAAsC,CAAA,EAAA,MAAA;;AAkB5E;;;;AAIY,iBAjDI,iBAAA,CAiDJ,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAjD2C,aAiD3C,CAAA,EAjD2D,SAiD3D,EAAA;AAuCZ;;;;AAAoF,iBA7DpE,sBAAA,CA6DoE,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA7DxB,aA6DwB,CAAA,EA7DR,SA6DQ,EAAA;AAgBpF;;;;AAAoF,iBA3DpE,qBAAA,CA2DoE,QAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAxD3E,aAwD2E,CAAA,EAvDjF,SAuDiF,EAAA;AAgBpF;;;;AAAsF,iBAhCtE,gBAAA,CAgCsE,QAAA,EAAA,OAAA,EAAA,IAAA,CAAA,EAhC3B,aAgC2B,CAAA,EAhCX,SAgCW,EAAA;;AAiBtF;;;AAA4E,iBAjC5D,eAAA,CAiC4D,OAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CAAA,EAjCjB,aAiCiB,CAAA,EAjCD,SAiCC,EAAA;;AAmC5E;;;AAIS,iBAxDO,qBAAA,CAwDP,QAAA,EAxDuC,WAwDvC,EAAA,EAAA,IAAA,CAAA,EAxD6D,aAwD7D,CAAA,EAxD6E,SAwD7E,EAAA;;;AAoBT;;;AAIG,iBA/Da,sBAAA,CA+Db,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA/DyD,aA+DzD,CAAA,EA/DyE,SA+DzE,EAAA;;AAiBH;;;AAIG,iBAjDa,qBAAA,CAiDb,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EA9CQ,MA8CR,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,IAAA,CAAA,EA7CM,aA6CN,CAAA,EA5CA,SA4CA,EAAA;;AAoCH;;;AAES,iBA/DO,kBAAA,CA+DP,OAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA5DA,aA4DA,CAAA,EA3DN,SA2DM,EAAA;;;AAuBT;;;AAEU,iBAnEM,iBAAA,CAmEN,QAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAhED,aAgEC,CAAA,EA/DP,SA+DO,EAAA;;;;;;iBA3BM,sBAAA,iBACE,sBACT,gBACN;;;;;;iBAsBmB,oBAAA,MACf,IAAA,CAAK,wBACF;;WAC4B;IACnC"}
@@ -0,0 +1,96 @@
1
+ import { AGUIEvent, AGUIFixture, AGUIMessage, AGUIRunAgentInput } from "./agui-types.js";
2
+ import * as http from "node:http";
3
+
4
+ //#region src/agui-handler.d.ts
5
+
6
+ /**
7
+ * Extract the content of the last message with role "user" from the input.
8
+ */
9
+ declare function extractLastUserMessage(input: AGUIRunAgentInput): string;
10
+ /**
11
+ * Check whether an input matches a fixture's match criteria.
12
+ * All specified criteria must pass (AND logic).
13
+ */
14
+
15
+ /**
16
+ * Find the first fixture whose match criteria pass for the given input.
17
+ */
18
+ declare function findFixture(input: AGUIRunAgentInput, fixtures: AGUIFixture[]): AGUIFixture | null;
19
+ interface AGUIBuildOpts {
20
+ threadId?: string;
21
+ runId?: string;
22
+ parentRunId?: string;
23
+ /** For tool call builder: include a result event */
24
+ result?: string;
25
+ }
26
+ /**
27
+ * Build a complete text message response sequence.
28
+ * [RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED]
29
+ */
30
+ declare function buildTextResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
31
+ /**
32
+ * Build a text chunk response (single chunk, no start/end envelope).
33
+ * [RUN_STARTED, TEXT_MESSAGE_CHUNK, RUN_FINISHED]
34
+ */
35
+ declare function buildTextChunkResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
36
+ /**
37
+ * Build a tool call response sequence.
38
+ * [RUN_STARTED, TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, (TOOL_CALL_RESULT)?, RUN_FINISHED]
39
+ */
40
+ declare function buildToolCallResponse(toolName: string, args: string, opts?: AGUIBuildOpts): AGUIEvent[];
41
+ /**
42
+ * Build a state snapshot response.
43
+ * [RUN_STARTED, STATE_SNAPSHOT, RUN_FINISHED]
44
+ */
45
+ declare function buildStateUpdate(snapshot: unknown, opts?: AGUIBuildOpts): AGUIEvent[];
46
+ /**
47
+ * Build a state delta response (JSON Patch).
48
+ * [RUN_STARTED, STATE_DELTA, RUN_FINISHED]
49
+ */
50
+ declare function buildStateDelta(patches: unknown[], opts?: AGUIBuildOpts): AGUIEvent[];
51
+ /**
52
+ * Build a messages snapshot response.
53
+ * [RUN_STARTED, MESSAGES_SNAPSHOT, RUN_FINISHED]
54
+ */
55
+ declare function buildMessagesSnapshot(messages: AGUIMessage[], opts?: AGUIBuildOpts): AGUIEvent[];
56
+ /**
57
+ * Build a reasoning response sequence.
58
+ * [RUN_STARTED, REASONING_START, REASONING_MESSAGE_START, REASONING_MESSAGE_CONTENT,
59
+ * REASONING_MESSAGE_END, REASONING_END, RUN_FINISHED]
60
+ */
61
+ declare function buildReasoningResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[];
62
+ /**
63
+ * Build an activity snapshot response.
64
+ * [RUN_STARTED, ACTIVITY_SNAPSHOT, RUN_FINISHED]
65
+ */
66
+ declare function buildActivityResponse(messageId: string, activityType: string, content: Record<string, unknown>, opts?: AGUIBuildOpts): AGUIEvent[];
67
+ /**
68
+ * Build an error response.
69
+ * [RUN_STARTED, RUN_ERROR] (no RUN_FINISHED — the run errored)
70
+ */
71
+ declare function buildErrorResponse(message: string, code?: string, opts?: AGUIBuildOpts): AGUIEvent[];
72
+ /**
73
+ * Build a step-wrapped text response.
74
+ * [RUN_STARTED, STEP_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT,
75
+ * TEXT_MESSAGE_END, STEP_FINISHED, RUN_FINISHED]
76
+ */
77
+ declare function buildStepWithText(stepName: string, text: string, opts?: AGUIBuildOpts): AGUIEvent[];
78
+ /**
79
+ * Combine multiple builder outputs into a single run.
80
+ * Strips RUN_STARTED/RUN_FINISHED from each input, wraps all inner events
81
+ * in one RUN_STARTED...RUN_FINISHED pair.
82
+ */
83
+ declare function buildCompositeResponse(builderOutputs: AGUIEvent[][], opts?: AGUIBuildOpts): AGUIEvent[];
84
+ /**
85
+ * Write AG-UI events as an SSE stream to an HTTP response.
86
+ * Sets appropriate headers, serializes each event as `data: {...}\n\n`,
87
+ * and optionally delays between events.
88
+ */
89
+ declare function writeAGUIEventStream(res: http.ServerResponse, events: AGUIEvent[], opts?: {
90
+ delayMs?: number;
91
+ signal?: AbortSignal;
92
+ }): Promise<void>;
93
+ //# sourceMappingURL=agui-handler.d.ts.map
94
+ //#endregion
95
+ export { buildActivityResponse, buildCompositeResponse, buildErrorResponse, buildMessagesSnapshot, buildReasoningResponse, buildStateDelta, buildStateUpdate, buildStepWithText, buildTextChunkResponse, buildTextResponse, buildToolCallResponse, extractLastUserMessage, findFixture, writeAGUIEventStream };
96
+ //# sourceMappingURL=agui-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agui-handler.d.ts","names":[],"sources":["../src/agui-handler.ts"],"sourcesContent":[],"mappings":";;;;;;;AA0CA;AAmDgB,iBAnDA,sBAAA,CAmDW,KAAA,EAnDmB,iBAmDnB,CAAA,EAAA,MAAA;;;;;;AAW3B;AA+BA;;AAAuD,iBA1CvC,WAAA,CA0CuC,KAAA,EA1CpB,iBA0CoB,EAAA,QAAA,EA1CS,WA0CT,EAAA,CAAA,EA1CyB,WA0CzB,GAAA,IAAA;AAAgB,UA/BtD,aAAA,CA+BsD;EAAS,QAAA,CAAA,EAAA,MAAA;EA2BhE,KAAA,CAAA,EAAA,MAAA;EAAsB,WAAA,CAAA,EAAA,MAAA;;QAAsC,CAAA,EAAA,MAAA;;AAkB5E;;;;AAIY,iBAjDI,iBAAA,CAiDJ,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAjD2C,aAiD3C,CAAA,EAjD2D,SAiD3D,EAAA;AAuCZ;;;;AAAoF,iBA7DpE,sBAAA,CA6DoE,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA7DxB,aA6DwB,CAAA,EA7DR,SA6DQ,EAAA;AAgBpF;;;;AAAoF,iBA3DpE,qBAAA,CA2DoE,QAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAxD3E,aAwD2E,CAAA,EAvDjF,SAuDiF,EAAA;AAgBpF;;;;AAAsF,iBAhCtE,gBAAA,CAgCsE,QAAA,EAAA,OAAA,EAAA,IAAA,CAAA,EAhC3B,aAgC2B,CAAA,EAhCX,SAgCW,EAAA;;AAiBtF;;;AAA4E,iBAjC5D,eAAA,CAiC4D,OAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CAAA,EAjCjB,aAiCiB,CAAA,EAjCD,SAiCC,EAAA;;AAmC5E;;;AAIS,iBAxDO,qBAAA,CAwDP,QAAA,EAxDuC,WAwDvC,EAAA,EAAA,IAAA,CAAA,EAxD6D,aAwD7D,CAAA,EAxD6E,SAwD7E,EAAA;;;AAoBT;;;AAIG,iBA/Da,sBAAA,CA+Db,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA/DyD,aA+DzD,CAAA,EA/DyE,SA+DzE,EAAA;;AAiBH;;;AAIG,iBAjDa,qBAAA,CAiDb,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EA9CQ,MA8CR,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,IAAA,CAAA,EA7CM,aA6CN,CAAA,EA5CA,SA4CA,EAAA;;AAoCH;;;AAES,iBA/DO,kBAAA,CA+DP,OAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EA5DA,aA4DA,CAAA,EA3DN,SA2DM,EAAA;;;AAuBT;;;AAEU,iBAnEM,iBAAA,CAmEN,QAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAhED,aAgEC,CAAA,EA/DP,SA+DO,EAAA;;;;;;iBA3BM,sBAAA,iBACE,sBACT,gBACN;;;;;;iBAsBmB,oBAAA,MACf,IAAA,CAAK,wBACF;;WAC4B;IACnC"}