@copilotkit/aimock 1.9.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 (64) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +17 -17
  4. package/dist/agui-handler.cjs +340 -0
  5. package/dist/agui-handler.cjs.map +1 -0
  6. package/dist/agui-handler.d.cts +96 -0
  7. package/dist/agui-handler.d.cts.map +1 -0
  8. package/dist/agui-handler.d.ts +96 -0
  9. package/dist/agui-handler.d.ts.map +1 -0
  10. package/dist/agui-handler.js +326 -0
  11. package/dist/agui-handler.js.map +1 -0
  12. package/dist/agui-mock.cjs +190 -0
  13. package/dist/agui-mock.cjs.map +1 -0
  14. package/dist/agui-mock.d.cts +50 -0
  15. package/dist/agui-mock.d.cts.map +1 -0
  16. package/dist/agui-mock.d.ts +50 -0
  17. package/dist/agui-mock.d.ts.map +1 -0
  18. package/dist/agui-mock.js +188 -0
  19. package/dist/agui-mock.js.map +1 -0
  20. package/dist/agui-recorder.cjs +153 -0
  21. package/dist/agui-recorder.cjs.map +1 -0
  22. package/dist/agui-recorder.d.cts +19 -0
  23. package/dist/agui-recorder.d.cts.map +1 -0
  24. package/dist/agui-recorder.d.ts +19 -0
  25. package/dist/agui-recorder.d.ts.map +1 -0
  26. package/dist/agui-recorder.js +147 -0
  27. package/dist/agui-recorder.js.map +1 -0
  28. package/dist/agui-types.d.cts +231 -0
  29. package/dist/agui-types.d.cts.map +1 -0
  30. package/dist/agui-types.d.ts +231 -0
  31. package/dist/agui-types.d.ts.map +1 -0
  32. package/dist/cli.cjs +42 -5
  33. package/dist/cli.cjs.map +1 -1
  34. package/dist/cli.js +42 -5
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config-loader.cjs +19 -0
  37. package/dist/config-loader.cjs.map +1 -1
  38. package/dist/config-loader.d.cts +16 -0
  39. package/dist/config-loader.d.cts.map +1 -1
  40. package/dist/config-loader.d.ts +16 -0
  41. package/dist/config-loader.d.ts.map +1 -1
  42. package/dist/config-loader.js +19 -0
  43. package/dist/config-loader.js.map +1 -1
  44. package/dist/index.cjs +19 -0
  45. package/dist/index.d.cts +5 -1
  46. package/dist/index.d.ts +5 -1
  47. package/dist/index.js +4 -1
  48. package/dist/recorder.cjs +23 -21
  49. package/dist/recorder.cjs.map +1 -1
  50. package/dist/recorder.js +23 -21
  51. package/dist/recorder.js.map +1 -1
  52. package/dist/suite.cjs +8 -0
  53. package/dist/suite.cjs.map +1 -1
  54. package/dist/suite.d.cts +4 -0
  55. package/dist/suite.d.cts.map +1 -1
  56. package/dist/suite.d.ts +4 -0
  57. package/dist/suite.d.ts.map +1 -1
  58. package/dist/suite.js +8 -0
  59. package/dist/suite.js.map +1 -1
  60. package/dist/types.d.cts +2 -0
  61. package/dist/types.d.cts.map +1 -1
  62. package/dist/types.d.ts +2 -0
  63. package/dist/types.d.ts.map +1 -1
  64. 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");
@@ -22,7 +23,8 @@ Options:
22
23
  --log-level <level> Log verbosity: silent, info, debug (default: info)
23
24
  --validate-on-load Validate fixture schemas at startup
24
25
  --metrics Enable Prometheus metrics at GET /metrics
25
- --record Record mode: proxy unmatched requests to real APIs
26
+ --record Record mode: proxy unmatched requests and save fixtures
27
+ --proxy-only Proxy mode: forward unmatched requests without saving
26
28
  --strict Strict mode: fail on unmatched requests
27
29
  --provider-openai <url> Upstream URL for OpenAI (used with --record)
28
30
  --provider-anthropic <url> Upstream URL for Anthropic
@@ -32,6 +34,9 @@ Options:
32
34
  --provider-azure <url> Upstream URL for Azure OpenAI
33
35
  --provider-ollama <url> Upstream URL for Ollama
34
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
35
40
  --chaos-drop <rate> Probability (0-1) of dropping requests with 500
36
41
  --chaos-malformed <rate> Probability (0-1) of returning malformed JSON
37
42
  --chaos-disconnect <rate> Probability (0-1) of destroying connection
@@ -85,6 +90,10 @@ const { values } = (0, node_util.parseArgs)({
85
90
  type: "boolean",
86
91
  default: false
87
92
  },
93
+ "proxy-only": {
94
+ type: "boolean",
95
+ default: false
96
+ },
88
97
  strict: {
89
98
  type: "boolean",
90
99
  default: false
@@ -97,6 +106,15 @@ const { values } = (0, node_util.parseArgs)({
97
106
  "provider-azure": { type: "string" },
98
107
  "provider-ollama": { type: "string" },
99
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
+ },
100
118
  "chaos-drop": { type: "string" },
101
119
  "chaos-malformed": { type: "string" },
102
120
  "chaos-disconnect": { type: "string" },
@@ -175,7 +193,7 @@ let chaos;
175
193
  }
176
194
  }
177
195
  let record;
178
- if (values.record) {
196
+ if (values.record || values["proxy-only"]) {
179
197
  const providers = {};
180
198
  if (values["provider-openai"]) providers.openai = values["provider-openai"];
181
199
  if (values["provider-anthropic"]) providers.anthropic = values["provider-anthropic"];
@@ -186,12 +204,30 @@ if (values.record) {
186
204
  if (values["provider-ollama"]) providers.ollama = values["provider-ollama"];
187
205
  if (values["provider-cohere"]) providers.cohere = values["provider-cohere"];
188
206
  if (Object.keys(providers).length === 0) {
189
- console.error("Error: --record requires at least one --provider-* flag");
207
+ console.error(`Error: --${values["proxy-only"] ? "proxy-only" : "record"} requires at least one --provider-* flag`);
190
208
  process.exit(1);
191
209
  }
192
210
  record = {
193
211
  providers,
194
- fixturePath: (0, node_path.resolve)(fixturePath, "recorded")
212
+ fixturePath: (0, node_path.resolve)(fixturePath, "recorded"),
213
+ proxyOnly: values["proxy-only"]
214
+ };
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
195
231
  };
196
232
  }
197
233
  async function main() {
@@ -228,6 +264,7 @@ async function main() {
228
264
  process.exit(1);
229
265
  }
230
266
  }
267
+ const mounts = aguiMount ? [aguiMount] : void 0;
231
268
  const instance = await require_server.createServer(fixtures, {
232
269
  port,
233
270
  host,
@@ -238,7 +275,7 @@ async function main() {
238
275
  metrics: values.metrics,
239
276
  record,
240
277
  strict: values.strict
241
- });
278
+ }, mounts);
242
279
  logger.info(`aimock server listening on ${instance.url}`);
243
280
  let watcher = null;
244
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 to real APIs\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 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 config from CLI flags\nlet record: RecordConfig | undefined;\nif (values.record) {\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(\"Error: --record requires at least one --provider-* flag\");\n process.exit(1);\n }\n\n record = { providers, fixturePath: resolve(fixturePath, \"recorded\") };\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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"}