@copilotkit/aimock 1.10.0 → 1.11.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 (56) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/dist/agui-handler.cjs +340 -0
  4. package/dist/agui-handler.cjs.map +1 -0
  5. package/dist/agui-handler.d.cts +96 -0
  6. package/dist/agui-handler.d.cts.map +1 -0
  7. package/dist/agui-handler.d.ts +96 -0
  8. package/dist/agui-handler.d.ts.map +1 -0
  9. package/dist/agui-handler.js +326 -0
  10. package/dist/agui-handler.js.map +1 -0
  11. package/dist/agui-mock.cjs +190 -0
  12. package/dist/agui-mock.cjs.map +1 -0
  13. package/dist/agui-mock.d.cts +50 -0
  14. package/dist/agui-mock.d.cts.map +1 -0
  15. package/dist/agui-mock.d.ts +50 -0
  16. package/dist/agui-mock.d.ts.map +1 -0
  17. package/dist/agui-mock.js +188 -0
  18. package/dist/agui-mock.js.map +1 -0
  19. package/dist/agui-recorder.cjs +153 -0
  20. package/dist/agui-recorder.cjs.map +1 -0
  21. package/dist/agui-recorder.d.cts +19 -0
  22. package/dist/agui-recorder.d.cts.map +1 -0
  23. package/dist/agui-recorder.d.ts +19 -0
  24. package/dist/agui-recorder.d.ts.map +1 -0
  25. package/dist/agui-recorder.js +147 -0
  26. package/dist/agui-recorder.js.map +1 -0
  27. package/dist/agui-types.d.cts +231 -0
  28. package/dist/agui-types.d.cts.map +1 -0
  29. package/dist/agui-types.d.ts +231 -0
  30. package/dist/agui-types.d.ts.map +1 -0
  31. package/dist/cli.cjs +32 -1
  32. package/dist/cli.cjs.map +1 -1
  33. package/dist/cli.js +32 -1
  34. package/dist/cli.js.map +1 -1
  35. package/dist/config-loader.cjs +19 -0
  36. package/dist/config-loader.cjs.map +1 -1
  37. package/dist/config-loader.d.cts +16 -0
  38. package/dist/config-loader.d.cts.map +1 -1
  39. package/dist/config-loader.d.ts +16 -0
  40. package/dist/config-loader.d.ts.map +1 -1
  41. package/dist/config-loader.js +19 -0
  42. package/dist/config-loader.js.map +1 -1
  43. package/dist/index.cjs +19 -0
  44. package/dist/index.d.cts +5 -1
  45. package/dist/index.d.ts +5 -1
  46. package/dist/index.js +4 -1
  47. package/dist/suite.cjs +8 -0
  48. package/dist/suite.cjs.map +1 -1
  49. package/dist/suite.d.cts +4 -0
  50. package/dist/suite.d.cts.map +1 -1
  51. package/dist/suite.d.ts +4 -0
  52. package/dist/suite.d.ts.map +1 -1
  53. package/dist/suite.js +8 -0
  54. package/dist/suite.js.map +1 -1
  55. package/dist/vector-types.d.ts.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ //#region src/agui-types.d.ts
2
+ type AGUIEventType = "RUN_STARTED" | "RUN_FINISHED" | "RUN_ERROR" | "STEP_STARTED" | "STEP_FINISHED" | "TEXT_MESSAGE_START" | "TEXT_MESSAGE_CONTENT" | "TEXT_MESSAGE_END" | "TEXT_MESSAGE_CHUNK" | "TOOL_CALL_START" | "TOOL_CALL_ARGS" | "TOOL_CALL_END" | "TOOL_CALL_CHUNK" | "TOOL_CALL_RESULT" | "STATE_SNAPSHOT" | "STATE_DELTA" | "MESSAGES_SNAPSHOT" | "ACTIVITY_SNAPSHOT" | "ACTIVITY_DELTA" | "REASONING_START" | "REASONING_MESSAGE_START" | "REASONING_MESSAGE_CONTENT" | "REASONING_MESSAGE_END" | "REASONING_MESSAGE_CHUNK" | "REASONING_END" | "REASONING_ENCRYPTED_VALUE" | "RAW" | "CUSTOM" | "THINKING_START" | "THINKING_END" | "THINKING_TEXT_MESSAGE_START" | "THINKING_TEXT_MESSAGE_CONTENT" | "THINKING_TEXT_MESSAGE_END";
3
+ interface AGUIBaseEvent {
4
+ type: AGUIEventType;
5
+ timestamp?: number;
6
+ rawEvent?: unknown;
7
+ }
8
+ interface AGUIRunStartedEvent extends AGUIBaseEvent {
9
+ type: "RUN_STARTED";
10
+ threadId: string;
11
+ runId: string;
12
+ parentRunId?: string;
13
+ input?: AGUIRunAgentInput;
14
+ }
15
+ interface AGUIRunFinishedEvent extends AGUIBaseEvent {
16
+ type: "RUN_FINISHED";
17
+ threadId: string;
18
+ runId: string;
19
+ result?: unknown;
20
+ }
21
+ interface AGUIRunErrorEvent extends AGUIBaseEvent {
22
+ type: "RUN_ERROR";
23
+ message: string;
24
+ code?: string;
25
+ }
26
+ interface AGUIStepStartedEvent extends AGUIBaseEvent {
27
+ type: "STEP_STARTED";
28
+ stepName: string;
29
+ }
30
+ interface AGUIStepFinishedEvent extends AGUIBaseEvent {
31
+ type: "STEP_FINISHED";
32
+ stepName: string;
33
+ }
34
+ type AGUITextMessageRole = "developer" | "system" | "assistant" | "user";
35
+ interface AGUITextMessageStartEvent extends AGUIBaseEvent {
36
+ type: "TEXT_MESSAGE_START";
37
+ messageId: string;
38
+ role: AGUITextMessageRole;
39
+ name?: string;
40
+ }
41
+ interface AGUITextMessageContentEvent extends AGUIBaseEvent {
42
+ type: "TEXT_MESSAGE_CONTENT";
43
+ messageId: string;
44
+ delta: string;
45
+ }
46
+ interface AGUITextMessageEndEvent extends AGUIBaseEvent {
47
+ type: "TEXT_MESSAGE_END";
48
+ messageId: string;
49
+ }
50
+ interface AGUITextMessageChunkEvent extends AGUIBaseEvent {
51
+ type: "TEXT_MESSAGE_CHUNK";
52
+ messageId?: string;
53
+ role?: AGUITextMessageRole;
54
+ delta?: string;
55
+ name?: string;
56
+ }
57
+ interface AGUIToolCallStartEvent extends AGUIBaseEvent {
58
+ type: "TOOL_CALL_START";
59
+ toolCallId: string;
60
+ toolCallName: string;
61
+ parentMessageId?: string;
62
+ }
63
+ interface AGUIToolCallArgsEvent extends AGUIBaseEvent {
64
+ type: "TOOL_CALL_ARGS";
65
+ toolCallId: string;
66
+ delta: string;
67
+ }
68
+ interface AGUIToolCallEndEvent extends AGUIBaseEvent {
69
+ type: "TOOL_CALL_END";
70
+ toolCallId: string;
71
+ }
72
+ interface AGUIToolCallChunkEvent extends AGUIBaseEvent {
73
+ type: "TOOL_CALL_CHUNK";
74
+ toolCallId?: string;
75
+ toolCallName?: string;
76
+ parentMessageId?: string;
77
+ delta?: string;
78
+ }
79
+ interface AGUIToolCallResultEvent extends AGUIBaseEvent {
80
+ type: "TOOL_CALL_RESULT";
81
+ messageId: string;
82
+ toolCallId: string;
83
+ content: string;
84
+ role?: "tool";
85
+ }
86
+ interface AGUIStateSnapshotEvent extends AGUIBaseEvent {
87
+ type: "STATE_SNAPSHOT";
88
+ snapshot: unknown;
89
+ }
90
+ interface AGUIStateDeltaEvent extends AGUIBaseEvent {
91
+ type: "STATE_DELTA";
92
+ delta: unknown[];
93
+ }
94
+ interface AGUIMessagesSnapshotEvent extends AGUIBaseEvent {
95
+ type: "MESSAGES_SNAPSHOT";
96
+ messages: AGUIMessage[];
97
+ }
98
+ interface AGUIActivitySnapshotEvent extends AGUIBaseEvent {
99
+ type: "ACTIVITY_SNAPSHOT";
100
+ messageId: string;
101
+ activityType: string;
102
+ content: Record<string, unknown>;
103
+ replace?: boolean;
104
+ }
105
+ interface AGUIActivityDeltaEvent extends AGUIBaseEvent {
106
+ type: "ACTIVITY_DELTA";
107
+ messageId: string;
108
+ activityType: string;
109
+ patch: unknown[];
110
+ }
111
+ interface AGUIReasoningStartEvent extends AGUIBaseEvent {
112
+ type: "REASONING_START";
113
+ messageId: string;
114
+ }
115
+ interface AGUIReasoningMessageStartEvent extends AGUIBaseEvent {
116
+ type: "REASONING_MESSAGE_START";
117
+ messageId: string;
118
+ role: "reasoning";
119
+ }
120
+ interface AGUIReasoningMessageContentEvent extends AGUIBaseEvent {
121
+ type: "REASONING_MESSAGE_CONTENT";
122
+ messageId: string;
123
+ delta: string;
124
+ }
125
+ interface AGUIReasoningMessageEndEvent extends AGUIBaseEvent {
126
+ type: "REASONING_MESSAGE_END";
127
+ messageId: string;
128
+ }
129
+ interface AGUIReasoningMessageChunkEvent extends AGUIBaseEvent {
130
+ type: "REASONING_MESSAGE_CHUNK";
131
+ messageId?: string;
132
+ delta?: string;
133
+ }
134
+ interface AGUIReasoningEndEvent extends AGUIBaseEvent {
135
+ type: "REASONING_END";
136
+ messageId: string;
137
+ }
138
+ type AGUIReasoningEncryptedValueSubtype = "tool-call" | "message";
139
+ interface AGUIReasoningEncryptedValueEvent extends AGUIBaseEvent {
140
+ type: "REASONING_ENCRYPTED_VALUE";
141
+ subtype: AGUIReasoningEncryptedValueSubtype;
142
+ entityId: string;
143
+ encryptedValue: string;
144
+ }
145
+ interface AGUIRawEvent extends AGUIBaseEvent {
146
+ type: "RAW";
147
+ event: unknown;
148
+ source?: string;
149
+ }
150
+ interface AGUICustomEvent extends AGUIBaseEvent {
151
+ type: "CUSTOM";
152
+ name: string;
153
+ value: unknown;
154
+ }
155
+ interface AGUIThinkingStartEvent extends AGUIBaseEvent {
156
+ type: "THINKING_START";
157
+ title?: string;
158
+ }
159
+ interface AGUIThinkingEndEvent extends AGUIBaseEvent {
160
+ type: "THINKING_END";
161
+ }
162
+ interface AGUIThinkingTextMessageStartEvent extends AGUIBaseEvent {
163
+ type: "THINKING_TEXT_MESSAGE_START";
164
+ }
165
+ interface AGUIThinkingTextMessageContentEvent extends AGUIBaseEvent {
166
+ type: "THINKING_TEXT_MESSAGE_CONTENT";
167
+ delta: string;
168
+ }
169
+ interface AGUIThinkingTextMessageEndEvent extends AGUIBaseEvent {
170
+ type: "THINKING_TEXT_MESSAGE_END";
171
+ }
172
+ type AGUIEvent = AGUIRunStartedEvent | AGUIRunFinishedEvent | AGUIRunErrorEvent | AGUIStepStartedEvent | AGUIStepFinishedEvent | AGUITextMessageStartEvent | AGUITextMessageContentEvent | AGUITextMessageEndEvent | AGUITextMessageChunkEvent | AGUIToolCallStartEvent | AGUIToolCallArgsEvent | AGUIToolCallEndEvent | AGUIToolCallChunkEvent | AGUIToolCallResultEvent | AGUIStateSnapshotEvent | AGUIStateDeltaEvent | AGUIMessagesSnapshotEvent | AGUIActivitySnapshotEvent | AGUIActivityDeltaEvent | AGUIReasoningStartEvent | AGUIReasoningMessageStartEvent | AGUIReasoningMessageContentEvent | AGUIReasoningMessageEndEvent | AGUIReasoningMessageChunkEvent | AGUIReasoningEndEvent | AGUIReasoningEncryptedValueEvent | AGUIRawEvent | AGUICustomEvent | AGUIThinkingStartEvent | AGUIThinkingEndEvent | AGUIThinkingTextMessageStartEvent | AGUIThinkingTextMessageContentEvent | AGUIThinkingTextMessageEndEvent;
173
+ interface AGUIRunAgentInput {
174
+ threadId?: string;
175
+ runId?: string;
176
+ parentRunId?: string;
177
+ state?: unknown;
178
+ messages?: AGUIMessage[];
179
+ tools?: AGUIToolDefinition[];
180
+ context?: Array<{
181
+ description: string;
182
+ value: string;
183
+ }>;
184
+ forwardedProps?: unknown;
185
+ }
186
+ interface AGUIToolCall {
187
+ id: string;
188
+ type: "function";
189
+ function: {
190
+ name: string;
191
+ arguments: string;
192
+ };
193
+ encryptedValue?: string;
194
+ }
195
+ interface AGUIMessage {
196
+ id?: string;
197
+ role: string;
198
+ content?: string;
199
+ name?: string;
200
+ toolCallId?: string;
201
+ toolCalls?: AGUIToolCall[];
202
+ }
203
+ interface AGUIToolDefinition {
204
+ name: string;
205
+ description?: string;
206
+ parameters?: unknown;
207
+ }
208
+ interface AGUIFixtureMatch {
209
+ message?: string | RegExp;
210
+ toolName?: string;
211
+ stateKey?: string;
212
+ predicate?: (input: AGUIRunAgentInput) => boolean;
213
+ }
214
+ interface AGUIFixture {
215
+ match: AGUIFixtureMatch;
216
+ events: AGUIEvent[];
217
+ delayMs?: number;
218
+ }
219
+ interface AGUIMockOptions {
220
+ port?: number;
221
+ host?: string;
222
+ }
223
+ interface AGUIRecordConfig {
224
+ upstream: string;
225
+ fixturePath?: string;
226
+ proxyOnly?: boolean;
227
+ }
228
+ //# sourceMappingURL=agui-types.d.ts.map
229
+ //#endregion
230
+ export { AGUIActivityDeltaEvent, AGUIActivitySnapshotEvent, AGUIEvent, AGUIEventType, AGUIFixture, AGUIFixtureMatch, AGUIMessage, AGUIMessagesSnapshotEvent, AGUIMockOptions, AGUIRecordConfig, AGUIRunAgentInput, AGUIRunErrorEvent, AGUIRunFinishedEvent, AGUIRunStartedEvent, AGUIStateDeltaEvent, AGUIStateSnapshotEvent, AGUITextMessageChunkEvent, AGUITextMessageContentEvent, AGUITextMessageEndEvent, AGUITextMessageStartEvent, AGUIToolCall, AGUIToolCallArgsEvent, AGUIToolCallEndEvent, AGUIToolCallResultEvent, AGUIToolCallStartEvent, AGUIToolDefinition };
231
+ //# sourceMappingURL=agui-types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agui-types.d.cts","names":[],"sources":["../src/agui-types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ //#region src/agui-types.d.ts
2
+ type AGUIEventType = "RUN_STARTED" | "RUN_FINISHED" | "RUN_ERROR" | "STEP_STARTED" | "STEP_FINISHED" | "TEXT_MESSAGE_START" | "TEXT_MESSAGE_CONTENT" | "TEXT_MESSAGE_END" | "TEXT_MESSAGE_CHUNK" | "TOOL_CALL_START" | "TOOL_CALL_ARGS" | "TOOL_CALL_END" | "TOOL_CALL_CHUNK" | "TOOL_CALL_RESULT" | "STATE_SNAPSHOT" | "STATE_DELTA" | "MESSAGES_SNAPSHOT" | "ACTIVITY_SNAPSHOT" | "ACTIVITY_DELTA" | "REASONING_START" | "REASONING_MESSAGE_START" | "REASONING_MESSAGE_CONTENT" | "REASONING_MESSAGE_END" | "REASONING_MESSAGE_CHUNK" | "REASONING_END" | "REASONING_ENCRYPTED_VALUE" | "RAW" | "CUSTOM" | "THINKING_START" | "THINKING_END" | "THINKING_TEXT_MESSAGE_START" | "THINKING_TEXT_MESSAGE_CONTENT" | "THINKING_TEXT_MESSAGE_END";
3
+ interface AGUIBaseEvent {
4
+ type: AGUIEventType;
5
+ timestamp?: number;
6
+ rawEvent?: unknown;
7
+ }
8
+ interface AGUIRunStartedEvent extends AGUIBaseEvent {
9
+ type: "RUN_STARTED";
10
+ threadId: string;
11
+ runId: string;
12
+ parentRunId?: string;
13
+ input?: AGUIRunAgentInput;
14
+ }
15
+ interface AGUIRunFinishedEvent extends AGUIBaseEvent {
16
+ type: "RUN_FINISHED";
17
+ threadId: string;
18
+ runId: string;
19
+ result?: unknown;
20
+ }
21
+ interface AGUIRunErrorEvent extends AGUIBaseEvent {
22
+ type: "RUN_ERROR";
23
+ message: string;
24
+ code?: string;
25
+ }
26
+ interface AGUIStepStartedEvent extends AGUIBaseEvent {
27
+ type: "STEP_STARTED";
28
+ stepName: string;
29
+ }
30
+ interface AGUIStepFinishedEvent extends AGUIBaseEvent {
31
+ type: "STEP_FINISHED";
32
+ stepName: string;
33
+ }
34
+ type AGUITextMessageRole = "developer" | "system" | "assistant" | "user";
35
+ interface AGUITextMessageStartEvent extends AGUIBaseEvent {
36
+ type: "TEXT_MESSAGE_START";
37
+ messageId: string;
38
+ role: AGUITextMessageRole;
39
+ name?: string;
40
+ }
41
+ interface AGUITextMessageContentEvent extends AGUIBaseEvent {
42
+ type: "TEXT_MESSAGE_CONTENT";
43
+ messageId: string;
44
+ delta: string;
45
+ }
46
+ interface AGUITextMessageEndEvent extends AGUIBaseEvent {
47
+ type: "TEXT_MESSAGE_END";
48
+ messageId: string;
49
+ }
50
+ interface AGUITextMessageChunkEvent extends AGUIBaseEvent {
51
+ type: "TEXT_MESSAGE_CHUNK";
52
+ messageId?: string;
53
+ role?: AGUITextMessageRole;
54
+ delta?: string;
55
+ name?: string;
56
+ }
57
+ interface AGUIToolCallStartEvent extends AGUIBaseEvent {
58
+ type: "TOOL_CALL_START";
59
+ toolCallId: string;
60
+ toolCallName: string;
61
+ parentMessageId?: string;
62
+ }
63
+ interface AGUIToolCallArgsEvent extends AGUIBaseEvent {
64
+ type: "TOOL_CALL_ARGS";
65
+ toolCallId: string;
66
+ delta: string;
67
+ }
68
+ interface AGUIToolCallEndEvent extends AGUIBaseEvent {
69
+ type: "TOOL_CALL_END";
70
+ toolCallId: string;
71
+ }
72
+ interface AGUIToolCallChunkEvent extends AGUIBaseEvent {
73
+ type: "TOOL_CALL_CHUNK";
74
+ toolCallId?: string;
75
+ toolCallName?: string;
76
+ parentMessageId?: string;
77
+ delta?: string;
78
+ }
79
+ interface AGUIToolCallResultEvent extends AGUIBaseEvent {
80
+ type: "TOOL_CALL_RESULT";
81
+ messageId: string;
82
+ toolCallId: string;
83
+ content: string;
84
+ role?: "tool";
85
+ }
86
+ interface AGUIStateSnapshotEvent extends AGUIBaseEvent {
87
+ type: "STATE_SNAPSHOT";
88
+ snapshot: unknown;
89
+ }
90
+ interface AGUIStateDeltaEvent extends AGUIBaseEvent {
91
+ type: "STATE_DELTA";
92
+ delta: unknown[];
93
+ }
94
+ interface AGUIMessagesSnapshotEvent extends AGUIBaseEvent {
95
+ type: "MESSAGES_SNAPSHOT";
96
+ messages: AGUIMessage[];
97
+ }
98
+ interface AGUIActivitySnapshotEvent extends AGUIBaseEvent {
99
+ type: "ACTIVITY_SNAPSHOT";
100
+ messageId: string;
101
+ activityType: string;
102
+ content: Record<string, unknown>;
103
+ replace?: boolean;
104
+ }
105
+ interface AGUIActivityDeltaEvent extends AGUIBaseEvent {
106
+ type: "ACTIVITY_DELTA";
107
+ messageId: string;
108
+ activityType: string;
109
+ patch: unknown[];
110
+ }
111
+ interface AGUIReasoningStartEvent extends AGUIBaseEvent {
112
+ type: "REASONING_START";
113
+ messageId: string;
114
+ }
115
+ interface AGUIReasoningMessageStartEvent extends AGUIBaseEvent {
116
+ type: "REASONING_MESSAGE_START";
117
+ messageId: string;
118
+ role: "reasoning";
119
+ }
120
+ interface AGUIReasoningMessageContentEvent extends AGUIBaseEvent {
121
+ type: "REASONING_MESSAGE_CONTENT";
122
+ messageId: string;
123
+ delta: string;
124
+ }
125
+ interface AGUIReasoningMessageEndEvent extends AGUIBaseEvent {
126
+ type: "REASONING_MESSAGE_END";
127
+ messageId: string;
128
+ }
129
+ interface AGUIReasoningMessageChunkEvent extends AGUIBaseEvent {
130
+ type: "REASONING_MESSAGE_CHUNK";
131
+ messageId?: string;
132
+ delta?: string;
133
+ }
134
+ interface AGUIReasoningEndEvent extends AGUIBaseEvent {
135
+ type: "REASONING_END";
136
+ messageId: string;
137
+ }
138
+ type AGUIReasoningEncryptedValueSubtype = "tool-call" | "message";
139
+ interface AGUIReasoningEncryptedValueEvent extends AGUIBaseEvent {
140
+ type: "REASONING_ENCRYPTED_VALUE";
141
+ subtype: AGUIReasoningEncryptedValueSubtype;
142
+ entityId: string;
143
+ encryptedValue: string;
144
+ }
145
+ interface AGUIRawEvent extends AGUIBaseEvent {
146
+ type: "RAW";
147
+ event: unknown;
148
+ source?: string;
149
+ }
150
+ interface AGUICustomEvent extends AGUIBaseEvent {
151
+ type: "CUSTOM";
152
+ name: string;
153
+ value: unknown;
154
+ }
155
+ interface AGUIThinkingStartEvent extends AGUIBaseEvent {
156
+ type: "THINKING_START";
157
+ title?: string;
158
+ }
159
+ interface AGUIThinkingEndEvent extends AGUIBaseEvent {
160
+ type: "THINKING_END";
161
+ }
162
+ interface AGUIThinkingTextMessageStartEvent extends AGUIBaseEvent {
163
+ type: "THINKING_TEXT_MESSAGE_START";
164
+ }
165
+ interface AGUIThinkingTextMessageContentEvent extends AGUIBaseEvent {
166
+ type: "THINKING_TEXT_MESSAGE_CONTENT";
167
+ delta: string;
168
+ }
169
+ interface AGUIThinkingTextMessageEndEvent extends AGUIBaseEvent {
170
+ type: "THINKING_TEXT_MESSAGE_END";
171
+ }
172
+ type AGUIEvent = AGUIRunStartedEvent | AGUIRunFinishedEvent | AGUIRunErrorEvent | AGUIStepStartedEvent | AGUIStepFinishedEvent | AGUITextMessageStartEvent | AGUITextMessageContentEvent | AGUITextMessageEndEvent | AGUITextMessageChunkEvent | AGUIToolCallStartEvent | AGUIToolCallArgsEvent | AGUIToolCallEndEvent | AGUIToolCallChunkEvent | AGUIToolCallResultEvent | AGUIStateSnapshotEvent | AGUIStateDeltaEvent | AGUIMessagesSnapshotEvent | AGUIActivitySnapshotEvent | AGUIActivityDeltaEvent | AGUIReasoningStartEvent | AGUIReasoningMessageStartEvent | AGUIReasoningMessageContentEvent | AGUIReasoningMessageEndEvent | AGUIReasoningMessageChunkEvent | AGUIReasoningEndEvent | AGUIReasoningEncryptedValueEvent | AGUIRawEvent | AGUICustomEvent | AGUIThinkingStartEvent | AGUIThinkingEndEvent | AGUIThinkingTextMessageStartEvent | AGUIThinkingTextMessageContentEvent | AGUIThinkingTextMessageEndEvent;
173
+ interface AGUIRunAgentInput {
174
+ threadId?: string;
175
+ runId?: string;
176
+ parentRunId?: string;
177
+ state?: unknown;
178
+ messages?: AGUIMessage[];
179
+ tools?: AGUIToolDefinition[];
180
+ context?: Array<{
181
+ description: string;
182
+ value: string;
183
+ }>;
184
+ forwardedProps?: unknown;
185
+ }
186
+ interface AGUIToolCall {
187
+ id: string;
188
+ type: "function";
189
+ function: {
190
+ name: string;
191
+ arguments: string;
192
+ };
193
+ encryptedValue?: string;
194
+ }
195
+ interface AGUIMessage {
196
+ id?: string;
197
+ role: string;
198
+ content?: string;
199
+ name?: string;
200
+ toolCallId?: string;
201
+ toolCalls?: AGUIToolCall[];
202
+ }
203
+ interface AGUIToolDefinition {
204
+ name: string;
205
+ description?: string;
206
+ parameters?: unknown;
207
+ }
208
+ interface AGUIFixtureMatch {
209
+ message?: string | RegExp;
210
+ toolName?: string;
211
+ stateKey?: string;
212
+ predicate?: (input: AGUIRunAgentInput) => boolean;
213
+ }
214
+ interface AGUIFixture {
215
+ match: AGUIFixtureMatch;
216
+ events: AGUIEvent[];
217
+ delayMs?: number;
218
+ }
219
+ interface AGUIMockOptions {
220
+ port?: number;
221
+ host?: string;
222
+ }
223
+ interface AGUIRecordConfig {
224
+ upstream: string;
225
+ fixturePath?: string;
226
+ proxyOnly?: boolean;
227
+ }
228
+ //# sourceMappingURL=agui-types.d.ts.map
229
+ //#endregion
230
+ export { AGUIActivityDeltaEvent, AGUIActivitySnapshotEvent, AGUIEvent, AGUIEventType, AGUIFixture, AGUIFixtureMatch, AGUIMessage, AGUIMessagesSnapshotEvent, AGUIMockOptions, AGUIRecordConfig, AGUIRunAgentInput, AGUIRunErrorEvent, AGUIRunFinishedEvent, AGUIRunStartedEvent, AGUIStateDeltaEvent, AGUIStateSnapshotEvent, AGUITextMessageChunkEvent, AGUITextMessageContentEvent, AGUITextMessageEndEvent, AGUITextMessageStartEvent, AGUIToolCall, AGUIToolCallArgsEvent, AGUIToolCallEndEvent, AGUIToolCallResultEvent, AGUIToolCallStartEvent, AGUIToolDefinition };
231
+ //# sourceMappingURL=agui-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agui-types.d.ts","names":[],"sources":["../src/agui-types.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/cli.cjs CHANGED
@@ -3,6 +3,7 @@ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
3
3
  const require_fixture_loader = require('./fixture-loader.cjs');
4
4
  const require_logger = require('./logger.cjs');
5
5
  const require_server = require('./server.cjs');
6
+ const require_agui_mock = require('./agui-mock.cjs');
6
7
  const require_watcher = require('./watcher.cjs');
7
8
  let node_util = require("node:util");
8
9
  let node_path = require("node:path");
@@ -33,6 +34,9 @@ Options:
33
34
  --provider-azure <url> Upstream URL for Azure OpenAI
34
35
  --provider-ollama <url> Upstream URL for Ollama
35
36
  --provider-cohere <url> Upstream URL for Cohere
37
+ --agui-record Enable AG-UI recording (proxy unmatched AG-UI requests)
38
+ --agui-upstream <url> Upstream AG-UI agent URL (used with --agui-record)
39
+ --agui-proxy-only AG-UI proxy mode: forward without saving
36
40
  --chaos-drop <rate> Probability (0-1) of dropping requests with 500
37
41
  --chaos-malformed <rate> Probability (0-1) of returning malformed JSON
38
42
  --chaos-disconnect <rate> Probability (0-1) of destroying connection
@@ -102,6 +106,15 @@ const { values } = (0, node_util.parseArgs)({
102
106
  "provider-azure": { type: "string" },
103
107
  "provider-ollama": { type: "string" },
104
108
  "provider-cohere": { type: "string" },
109
+ "agui-record": {
110
+ type: "boolean",
111
+ default: false
112
+ },
113
+ "agui-upstream": { type: "string" },
114
+ "agui-proxy-only": {
115
+ type: "boolean",
116
+ default: false
117
+ },
105
118
  "chaos-drop": { type: "string" },
106
119
  "chaos-malformed": { type: "string" },
107
120
  "chaos-disconnect": { type: "string" },
@@ -200,6 +213,23 @@ if (values.record || values["proxy-only"]) {
200
213
  proxyOnly: values["proxy-only"]
201
214
  };
202
215
  }
216
+ let aguiMount;
217
+ if (values["agui-record"] || values["agui-proxy-only"]) {
218
+ if (!values["agui-upstream"]) {
219
+ console.error("Error: --agui-record/--agui-proxy-only requires --agui-upstream");
220
+ process.exit(1);
221
+ }
222
+ const agui = new require_agui_mock.AGUIMock();
223
+ agui.enableRecording({
224
+ upstream: values["agui-upstream"],
225
+ fixturePath: (0, node_path.resolve)(fixturePath, "agui-recorded"),
226
+ proxyOnly: values["agui-proxy-only"]
227
+ });
228
+ aguiMount = {
229
+ path: "/agui",
230
+ handler: agui
231
+ };
232
+ }
203
233
  async function main() {
204
234
  let isDir;
205
235
  let fixtures;
@@ -234,6 +264,7 @@ async function main() {
234
264
  process.exit(1);
235
265
  }
236
266
  }
267
+ const mounts = aguiMount ? [aguiMount] : void 0;
237
268
  const instance = await require_server.createServer(fixtures, {
238
269
  port,
239
270
  host,
@@ -244,7 +275,7 @@ async function main() {
244
275
  metrics: values.metrics,
245
276
  record,
246
277
  strict: values.strict
247
- });
278
+ }, mounts);
248
279
  logger.info(`aimock server listening on ${instance.url}`);
249
280
  let watcher = null;
250
281
  if (watchMode) {
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["Logger","loadFixturesFromDir","loadFixtureFile","validateFixtures","createServer","watchFixtures"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createServer } from \"./server.js\";\nimport { loadFixtureFile, loadFixturesFromDir, validateFixtures } from \"./fixture-loader.js\";\nimport { Logger, type LogLevel } from \"./logger.js\";\nimport { watchFixtures } from \"./watcher.js\";\nimport type { ChaosConfig, RecordConfig } from \"./types.js\";\n\nconst HELP = `\nUsage: llmock [options]\n\nOptions:\n -p, --port <number> Port to listen on (default: 4010)\n -h, --host <string> Host to bind to (default: 127.0.0.1)\n -f, --fixtures <path> Path to fixtures directory or file (default: ./fixtures)\n -l, --latency <ms> Latency in ms between SSE chunks (default: 0)\n -c, --chunk-size <chars> Chunk size in characters (default: 20)\n -w, --watch Watch fixture path for changes and reload\n --log-level <level> Log verbosity: silent, info, debug (default: info)\n --validate-on-load Validate fixture schemas at startup\n --metrics Enable Prometheus metrics at GET /metrics\n --record Record mode: proxy unmatched requests and save fixtures\n --proxy-only Proxy mode: forward unmatched requests without saving\n --strict Strict mode: fail on unmatched requests\n --provider-openai <url> Upstream URL for OpenAI (used with --record)\n --provider-anthropic <url> Upstream URL for Anthropic\n --provider-gemini <url> Upstream URL for Gemini\n --provider-vertexai <url> Upstream URL for Vertex AI\n --provider-bedrock <url> Upstream URL for Bedrock\n --provider-azure <url> Upstream URL for Azure OpenAI\n --provider-ollama <url> Upstream URL for Ollama\n --provider-cohere <url> Upstream URL for Cohere\n --chaos-drop <rate> Probability (0-1) of dropping requests with 500\n --chaos-malformed <rate> Probability (0-1) of returning malformed JSON\n --chaos-disconnect <rate> Probability (0-1) of destroying connection\n --help Show this help message\n`.trim();\n\nconst { values } = parseArgs({\n options: {\n port: { type: \"string\", short: \"p\", default: \"4010\" },\n host: { type: \"string\", short: \"h\", default: \"127.0.0.1\" },\n fixtures: { type: \"string\", short: \"f\", default: \"./fixtures\" },\n latency: { type: \"string\", short: \"l\", default: \"0\" },\n \"chunk-size\": { type: \"string\", short: \"c\", default: \"20\" },\n watch: { type: \"boolean\", short: \"w\", default: false },\n \"log-level\": { type: \"string\", default: \"info\" },\n \"validate-on-load\": { type: \"boolean\", default: false },\n metrics: { type: \"boolean\", default: false },\n record: { type: \"boolean\", default: false },\n \"proxy-only\": { type: \"boolean\", default: false },\n strict: { type: \"boolean\", default: false },\n \"provider-openai\": { type: \"string\" },\n \"provider-anthropic\": { type: \"string\" },\n \"provider-gemini\": { type: \"string\" },\n \"provider-vertexai\": { type: \"string\" },\n \"provider-bedrock\": { type: \"string\" },\n \"provider-azure\": { type: \"string\" },\n \"provider-ollama\": { type: \"string\" },\n \"provider-cohere\": { type: \"string\" },\n \"chaos-drop\": { type: \"string\" },\n \"chaos-malformed\": { type: \"string\" },\n \"chaos-disconnect\": { type: \"string\" },\n help: { type: \"boolean\", default: false },\n },\n strict: true,\n});\n\nif (values.help) {\n console.log(HELP);\n process.exit(0);\n}\n\nconst port = Number(values.port);\nconst host = values.host!;\nconst latency = Number(values.latency);\nconst chunkSize = Number(values[\"chunk-size\"]);\nconst fixturePath = resolve(values.fixtures!);\nconst watchMode = values.watch!;\nconst validateOnLoad = values[\"validate-on-load\"]!;\nconst logLevelStr = values[\"log-level\"]!;\n\nif (![\"silent\", \"info\", \"debug\"].includes(logLevelStr)) {\n console.error(`Invalid log-level: ${logLevelStr} (must be silent, info, or debug)`);\n process.exit(1);\n}\nconst logLevel = logLevelStr as LogLevel;\n\nif (Number.isNaN(port) || port < 0 || port > 65535) {\n console.error(`Invalid port: ${values.port}`);\n process.exit(1);\n}\n\nif (Number.isNaN(latency) || latency < 0) {\n console.error(`Invalid latency: ${values.latency}`);\n process.exit(1);\n}\n\nif (Number.isNaN(chunkSize) || chunkSize < 1) {\n console.error(`Invalid chunk-size: ${values[\"chunk-size\"]}`);\n process.exit(1);\n}\n\nconst logger = new Logger(logLevel);\n\n// Parse chaos config from CLI flags\nlet chaos: ChaosConfig | undefined;\n{\n const dropStr = values[\"chaos-drop\"];\n const malformedStr = values[\"chaos-malformed\"];\n const disconnectStr = values[\"chaos-disconnect\"];\n\n if (dropStr !== undefined || malformedStr !== undefined || disconnectStr !== undefined) {\n chaos = {};\n if (dropStr !== undefined) {\n const val = parseFloat(dropStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-drop: ${dropStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.dropRate = val;\n }\n if (malformedStr !== undefined) {\n const val = parseFloat(malformedStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-malformed: ${malformedStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.malformedRate = val;\n }\n if (disconnectStr !== undefined) {\n const val = parseFloat(disconnectStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-disconnect: ${disconnectStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.disconnectRate = val;\n }\n }\n}\n\n// Parse record/proxy config from CLI flags\nlet record: RecordConfig | undefined;\nif (values.record || values[\"proxy-only\"]) {\n const providers: RecordConfig[\"providers\"] = {};\n if (values[\"provider-openai\"]) providers.openai = values[\"provider-openai\"];\n if (values[\"provider-anthropic\"]) providers.anthropic = values[\"provider-anthropic\"];\n if (values[\"provider-gemini\"]) providers.gemini = values[\"provider-gemini\"];\n if (values[\"provider-vertexai\"]) providers.vertexai = values[\"provider-vertexai\"];\n if (values[\"provider-bedrock\"]) providers.bedrock = values[\"provider-bedrock\"];\n if (values[\"provider-azure\"]) providers.azure = values[\"provider-azure\"];\n if (values[\"provider-ollama\"]) providers.ollama = values[\"provider-ollama\"];\n if (values[\"provider-cohere\"]) providers.cohere = values[\"provider-cohere\"];\n\n if (Object.keys(providers).length === 0) {\n console.error(\n `Error: --${values[\"proxy-only\"] ? \"proxy-only\" : \"record\"} requires at least one --provider-* flag`,\n );\n process.exit(1);\n }\n\n record = {\n providers,\n fixturePath: resolve(fixturePath, \"recorded\"),\n proxyOnly: values[\"proxy-only\"],\n };\n}\n\nasync function main() {\n // Load fixtures from path (detect file vs directory)\n let isDir: boolean;\n let fixtures;\n try {\n const stat = statSync(fixturePath);\n isDir = stat.isDirectory();\n if (isDir) {\n fixtures = loadFixturesFromDir(fixturePath, logger);\n } else {\n fixtures = loadFixtureFile(fixturePath, logger);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.error(`Fixtures path not found: ${fixturePath}`);\n } else {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Failed to load fixtures from ${fixturePath}: ${msg}`);\n }\n process.exit(1);\n }\n\n if (fixtures.length === 0) {\n if (validateOnLoad || values.strict) {\n console.error(\"Error: No fixtures loaded and validation/strict mode is enabled — aborting.\");\n process.exit(1);\n }\n console.warn(\"Warning: No fixtures loaded. The server will return 404 for all requests.\");\n }\n\n logger.info(`Loaded ${fixtures.length} fixture(s) from ${fixturePath}`);\n\n // Validate fixtures if requested\n if (validateOnLoad) {\n const results = validateFixtures(fixtures);\n const errors = results.filter((r) => r.severity === \"error\");\n const warnings = results.filter((r) => r.severity === \"warning\");\n\n for (const w of warnings) {\n logger.warn(`Fixture ${w.fixtureIndex}: ${w.message}`);\n }\n for (const e of errors) {\n logger.error(`Fixture ${e.fixtureIndex}: ${e.message}`);\n }\n\n if (errors.length > 0) {\n console.error(`Validation failed: ${errors.length} error(s), ${warnings.length} warning(s)`);\n process.exit(1);\n }\n }\n\n const instance = await createServer(fixtures, {\n port,\n host,\n latency,\n chunkSize,\n logLevel,\n chaos,\n metrics: values.metrics,\n record,\n strict: values.strict,\n });\n\n logger.info(`aimock server listening on ${instance.url}`);\n\n // Start file watcher if requested\n let watcher: { close: () => void } | null = null;\n if (watchMode) {\n const loadFn = isDir!\n ? () => loadFixturesFromDir(fixturePath, logger)\n : () => loadFixtureFile(fixturePath, logger);\n\n watcher = watchFixtures(fixturePath, fixtures, loadFn, {\n logger,\n validate: validateOnLoad,\n validateFn: validateFixtures,\n });\n logger.info(`Watching ${fixturePath} for changes`);\n }\n\n function shutdown() {\n logger.info(\"Shutting down...\");\n if (watcher) watcher.close();\n instance.server.close(() => {\n process.exit(0);\n });\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.cjs","names":["Logger","AGUIMock","loadFixturesFromDir","loadFixtureFile","validateFixtures","createServer","watchFixtures"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createServer } from \"./server.js\";\nimport { loadFixtureFile, loadFixturesFromDir, validateFixtures } from \"./fixture-loader.js\";\nimport { Logger, type LogLevel } from \"./logger.js\";\nimport { watchFixtures } from \"./watcher.js\";\nimport { AGUIMock } from \"./agui-mock.js\";\nimport type { ChaosConfig, RecordConfig } from \"./types.js\";\n\nconst HELP = `\nUsage: llmock [options]\n\nOptions:\n -p, --port <number> Port to listen on (default: 4010)\n -h, --host <string> Host to bind to (default: 127.0.0.1)\n -f, --fixtures <path> Path to fixtures directory or file (default: ./fixtures)\n -l, --latency <ms> Latency in ms between SSE chunks (default: 0)\n -c, --chunk-size <chars> Chunk size in characters (default: 20)\n -w, --watch Watch fixture path for changes and reload\n --log-level <level> Log verbosity: silent, info, debug (default: info)\n --validate-on-load Validate fixture schemas at startup\n --metrics Enable Prometheus metrics at GET /metrics\n --record Record mode: proxy unmatched requests and save fixtures\n --proxy-only Proxy mode: forward unmatched requests without saving\n --strict Strict mode: fail on unmatched requests\n --provider-openai <url> Upstream URL for OpenAI (used with --record)\n --provider-anthropic <url> Upstream URL for Anthropic\n --provider-gemini <url> Upstream URL for Gemini\n --provider-vertexai <url> Upstream URL for Vertex AI\n --provider-bedrock <url> Upstream URL for Bedrock\n --provider-azure <url> Upstream URL for Azure OpenAI\n --provider-ollama <url> Upstream URL for Ollama\n --provider-cohere <url> Upstream URL for Cohere\n --agui-record Enable AG-UI recording (proxy unmatched AG-UI requests)\n --agui-upstream <url> Upstream AG-UI agent URL (used with --agui-record)\n --agui-proxy-only AG-UI proxy mode: forward without saving\n --chaos-drop <rate> Probability (0-1) of dropping requests with 500\n --chaos-malformed <rate> Probability (0-1) of returning malformed JSON\n --chaos-disconnect <rate> Probability (0-1) of destroying connection\n --help Show this help message\n`.trim();\n\nconst { values } = parseArgs({\n options: {\n port: { type: \"string\", short: \"p\", default: \"4010\" },\n host: { type: \"string\", short: \"h\", default: \"127.0.0.1\" },\n fixtures: { type: \"string\", short: \"f\", default: \"./fixtures\" },\n latency: { type: \"string\", short: \"l\", default: \"0\" },\n \"chunk-size\": { type: \"string\", short: \"c\", default: \"20\" },\n watch: { type: \"boolean\", short: \"w\", default: false },\n \"log-level\": { type: \"string\", default: \"info\" },\n \"validate-on-load\": { type: \"boolean\", default: false },\n metrics: { type: \"boolean\", default: false },\n record: { type: \"boolean\", default: false },\n \"proxy-only\": { type: \"boolean\", default: false },\n strict: { type: \"boolean\", default: false },\n \"provider-openai\": { type: \"string\" },\n \"provider-anthropic\": { type: \"string\" },\n \"provider-gemini\": { type: \"string\" },\n \"provider-vertexai\": { type: \"string\" },\n \"provider-bedrock\": { type: \"string\" },\n \"provider-azure\": { type: \"string\" },\n \"provider-ollama\": { type: \"string\" },\n \"provider-cohere\": { type: \"string\" },\n \"agui-record\": { type: \"boolean\", default: false },\n \"agui-upstream\": { type: \"string\" },\n \"agui-proxy-only\": { type: \"boolean\", default: false },\n \"chaos-drop\": { type: \"string\" },\n \"chaos-malformed\": { type: \"string\" },\n \"chaos-disconnect\": { type: \"string\" },\n help: { type: \"boolean\", default: false },\n },\n strict: true,\n});\n\nif (values.help) {\n console.log(HELP);\n process.exit(0);\n}\n\nconst port = Number(values.port);\nconst host = values.host!;\nconst latency = Number(values.latency);\nconst chunkSize = Number(values[\"chunk-size\"]);\nconst fixturePath = resolve(values.fixtures!);\nconst watchMode = values.watch!;\nconst validateOnLoad = values[\"validate-on-load\"]!;\nconst logLevelStr = values[\"log-level\"]!;\n\nif (![\"silent\", \"info\", \"debug\"].includes(logLevelStr)) {\n console.error(`Invalid log-level: ${logLevelStr} (must be silent, info, or debug)`);\n process.exit(1);\n}\nconst logLevel = logLevelStr as LogLevel;\n\nif (Number.isNaN(port) || port < 0 || port > 65535) {\n console.error(`Invalid port: ${values.port}`);\n process.exit(1);\n}\n\nif (Number.isNaN(latency) || latency < 0) {\n console.error(`Invalid latency: ${values.latency}`);\n process.exit(1);\n}\n\nif (Number.isNaN(chunkSize) || chunkSize < 1) {\n console.error(`Invalid chunk-size: ${values[\"chunk-size\"]}`);\n process.exit(1);\n}\n\nconst logger = new Logger(logLevel);\n\n// Parse chaos config from CLI flags\nlet chaos: ChaosConfig | undefined;\n{\n const dropStr = values[\"chaos-drop\"];\n const malformedStr = values[\"chaos-malformed\"];\n const disconnectStr = values[\"chaos-disconnect\"];\n\n if (dropStr !== undefined || malformedStr !== undefined || disconnectStr !== undefined) {\n chaos = {};\n if (dropStr !== undefined) {\n const val = parseFloat(dropStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-drop: ${dropStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.dropRate = val;\n }\n if (malformedStr !== undefined) {\n const val = parseFloat(malformedStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-malformed: ${malformedStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.malformedRate = val;\n }\n if (disconnectStr !== undefined) {\n const val = parseFloat(disconnectStr);\n if (isNaN(val) || val < 0 || val > 1) {\n console.error(`Invalid chaos-disconnect: ${disconnectStr} (must be 0-1)`);\n process.exit(1);\n }\n chaos.disconnectRate = val;\n }\n }\n}\n\n// Parse record/proxy config from CLI flags\nlet record: RecordConfig | undefined;\nif (values.record || values[\"proxy-only\"]) {\n const providers: RecordConfig[\"providers\"] = {};\n if (values[\"provider-openai\"]) providers.openai = values[\"provider-openai\"];\n if (values[\"provider-anthropic\"]) providers.anthropic = values[\"provider-anthropic\"];\n if (values[\"provider-gemini\"]) providers.gemini = values[\"provider-gemini\"];\n if (values[\"provider-vertexai\"]) providers.vertexai = values[\"provider-vertexai\"];\n if (values[\"provider-bedrock\"]) providers.bedrock = values[\"provider-bedrock\"];\n if (values[\"provider-azure\"]) providers.azure = values[\"provider-azure\"];\n if (values[\"provider-ollama\"]) providers.ollama = values[\"provider-ollama\"];\n if (values[\"provider-cohere\"]) providers.cohere = values[\"provider-cohere\"];\n\n if (Object.keys(providers).length === 0) {\n console.error(\n `Error: --${values[\"proxy-only\"] ? \"proxy-only\" : \"record\"} requires at least one --provider-* flag`,\n );\n process.exit(1);\n }\n\n record = {\n providers,\n fixturePath: resolve(fixturePath, \"recorded\"),\n proxyOnly: values[\"proxy-only\"],\n };\n}\n\n// Parse AG-UI record/proxy config from CLI flags\nlet aguiMount: { path: string; handler: AGUIMock } | undefined;\nif (values[\"agui-record\"] || values[\"agui-proxy-only\"]) {\n if (!values[\"agui-upstream\"]) {\n console.error(\"Error: --agui-record/--agui-proxy-only requires --agui-upstream\");\n process.exit(1);\n }\n const agui = new AGUIMock();\n agui.enableRecording({\n upstream: values[\"agui-upstream\"],\n fixturePath: resolve(fixturePath, \"agui-recorded\"),\n proxyOnly: values[\"agui-proxy-only\"],\n });\n aguiMount = { path: \"/agui\", handler: agui };\n}\n\nasync function main() {\n // Load fixtures from path (detect file vs directory)\n let isDir: boolean;\n let fixtures;\n try {\n const stat = statSync(fixturePath);\n isDir = stat.isDirectory();\n if (isDir) {\n fixtures = loadFixturesFromDir(fixturePath, logger);\n } else {\n fixtures = loadFixtureFile(fixturePath, logger);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n console.error(`Fixtures path not found: ${fixturePath}`);\n } else {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Failed to load fixtures from ${fixturePath}: ${msg}`);\n }\n process.exit(1);\n }\n\n if (fixtures.length === 0) {\n if (validateOnLoad || values.strict) {\n console.error(\"Error: No fixtures loaded and validation/strict mode is enabled — aborting.\");\n process.exit(1);\n }\n console.warn(\"Warning: No fixtures loaded. The server will return 404 for all requests.\");\n }\n\n logger.info(`Loaded ${fixtures.length} fixture(s) from ${fixturePath}`);\n\n // Validate fixtures if requested\n if (validateOnLoad) {\n const results = validateFixtures(fixtures);\n const errors = results.filter((r) => r.severity === \"error\");\n const warnings = results.filter((r) => r.severity === \"warning\");\n\n for (const w of warnings) {\n logger.warn(`Fixture ${w.fixtureIndex}: ${w.message}`);\n }\n for (const e of errors) {\n logger.error(`Fixture ${e.fixtureIndex}: ${e.message}`);\n }\n\n if (errors.length > 0) {\n console.error(`Validation failed: ${errors.length} error(s), ${warnings.length} warning(s)`);\n process.exit(1);\n }\n }\n\n const mounts = aguiMount ? [aguiMount] : undefined;\n\n const instance = await createServer(\n fixtures,\n {\n port,\n host,\n latency,\n chunkSize,\n logLevel,\n chaos,\n metrics: values.metrics,\n record,\n strict: values.strict,\n },\n mounts,\n );\n\n logger.info(`aimock server listening on ${instance.url}`);\n\n // Start file watcher if requested\n let watcher: { close: () => void } | null = null;\n if (watchMode) {\n const loadFn = isDir!\n ? () => loadFixturesFromDir(fixturePath, logger)\n : () => loadFixtureFile(fixturePath, logger);\n\n watcher = watchFixtures(fixturePath, fixtures, loadFn, {\n logger,\n validate: validateOnLoad,\n validateFn: validateFixtures,\n });\n logger.info(`Watching ${fixturePath} for changes`);\n }\n\n function shutdown() {\n logger.info(\"Shutting down...\");\n if (watcher) watcher.close();\n instance.server.close(() => {\n process.exit(0);\n });\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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"}