@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +4 -2
- package/dist/a2a-types.d.cts.map +1 -1
- package/dist/a2a-types.d.ts.map +1 -1
- package/dist/agui-handler.cjs +340 -0
- package/dist/agui-handler.cjs.map +1 -0
- package/dist/agui-handler.d.cts +96 -0
- package/dist/agui-handler.d.cts.map +1 -0
- package/dist/agui-handler.d.ts +96 -0
- package/dist/agui-handler.d.ts.map +1 -0
- package/dist/agui-handler.js +326 -0
- package/dist/agui-handler.js.map +1 -0
- package/dist/agui-mock.cjs +190 -0
- package/dist/agui-mock.cjs.map +1 -0
- package/dist/agui-mock.d.cts +50 -0
- package/dist/agui-mock.d.cts.map +1 -0
- package/dist/agui-mock.d.ts +50 -0
- package/dist/agui-mock.d.ts.map +1 -0
- package/dist/agui-mock.js +188 -0
- package/dist/agui-mock.js.map +1 -0
- package/dist/agui-recorder.cjs +153 -0
- package/dist/agui-recorder.cjs.map +1 -0
- package/dist/agui-recorder.d.cts +19 -0
- package/dist/agui-recorder.d.cts.map +1 -0
- package/dist/agui-recorder.d.ts +19 -0
- package/dist/agui-recorder.d.ts.map +1 -0
- package/dist/agui-recorder.js +147 -0
- package/dist/agui-recorder.js.map +1 -0
- package/dist/agui-types.d.cts +231 -0
- package/dist/agui-types.d.cts.map +1 -0
- package/dist/agui-types.d.ts +231 -0
- package/dist/agui-types.d.ts.map +1 -0
- package/dist/bedrock-converse.cjs +2 -0
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +2 -0
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +2 -0
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +2 -0
- package/dist/bedrock.js.map +1 -1
- package/dist/cli.cjs +32 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +32 -1
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +1 -0
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.js +1 -0
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +19 -0
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +16 -0
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +16 -0
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +19 -0
- package/dist/config-loader.js.map +1 -1
- package/dist/embeddings.cjs +2 -1
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.js +2 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/gemini.cjs +1 -0
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.js +1 -0
- package/dist/gemini.js.map +1 -1
- package/dist/helpers.cjs +16 -0
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +6 -2
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts +6 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +13 -1
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +166 -0
- package/dist/images.cjs.map +1 -0
- package/dist/images.d.cts +11 -0
- package/dist/images.d.cts.map +1 -0
- package/dist/images.d.ts +11 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +166 -0
- package/dist/images.js.map +1 -0
- package/dist/index.cjs +32 -0
- package/dist/index.d.cts +11 -3
- package/dist/index.d.ts +11 -3
- package/dist/index.js +9 -2
- package/dist/llmock.cjs +37 -1
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts +5 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts +5 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +37 -1
- package/dist/llmock.js.map +1 -1
- package/dist/messages.cjs +1 -0
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.js +1 -0
- package/dist/messages.js.map +1 -1
- package/dist/ollama.cjs +2 -0
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +2 -0
- package/dist/ollama.js.map +1 -1
- package/dist/recorder.cjs +50 -7
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.js +50 -7
- package/dist/recorder.js.map +1 -1
- package/dist/responses.cjs +1 -0
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.js +1 -0
- package/dist/responses.js.map +1 -1
- package/dist/router.cjs +8 -0
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +9 -0
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +80 -3
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +2 -0
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +80 -3
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +144 -0
- package/dist/speech.cjs.map +1 -0
- package/dist/speech.d.cts +11 -0
- package/dist/speech.d.cts.map +1 -0
- package/dist/speech.d.ts +11 -0
- package/dist/speech.d.ts.map +1 -0
- package/dist/speech.js +144 -0
- package/dist/speech.js.map +1 -0
- package/dist/suite.cjs +8 -0
- package/dist/suite.cjs.map +1 -1
- package/dist/suite.d.cts +4 -0
- package/dist/suite.d.cts.map +1 -1
- package/dist/suite.d.ts +4 -0
- package/dist/suite.d.ts.map +1 -1
- package/dist/suite.js +8 -0
- package/dist/suite.js.map +1 -1
- package/dist/transcription.cjs +134 -0
- package/dist/transcription.cjs.map +1 -0
- package/dist/transcription.d.cts +11 -0
- package/dist/transcription.d.cts.map +1 -0
- package/dist/transcription.d.ts +11 -0
- package/dist/transcription.d.ts.map +1 -0
- package/dist/transcription.js +134 -0
- package/dist/transcription.js.map +1 -0
- package/dist/types.d.cts +44 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +44 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vector-types.d.ts.map +1 -1
- package/dist/video.cjs +196 -0
- package/dist/video.cjs.map +1 -0
- package/dist/video.d.cts +14 -0
- package/dist/video.d.cts.map +1 -0
- package/dist/video.d.ts +14 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +195 -0
- package/dist/video.js.map +1 -0
- package/package.json +2 -2
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"source": {
|
|
10
10
|
"source": "npm",
|
|
11
11
|
"package": "@copilotkit/aimock",
|
|
12
|
-
"version": "^1.
|
|
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
|
}
|
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
|
-
- **[
|
|
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`
|
package/dist/a2a-types.d.cts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/a2a-types.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|