@adcp/client 0.2.4 → 0.4.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 (40) hide show
  1. package/README.md +362 -166
  2. package/dist/lib/agents/index.generated.d.ts +1 -21
  3. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  4. package/dist/lib/agents/index.generated.js +0 -28
  5. package/dist/lib/agents/index.generated.js.map +1 -1
  6. package/dist/lib/core/ADCPClient.d.ts +66 -0
  7. package/dist/lib/core/ADCPClient.d.ts.map +1 -1
  8. package/dist/lib/core/ADCPClient.js +160 -11
  9. package/dist/lib/core/ADCPClient.js.map +1 -1
  10. package/dist/lib/core/AgentClient.d.ts +16 -0
  11. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  12. package/dist/lib/core/AgentClient.js +20 -0
  13. package/dist/lib/core/AgentClient.js.map +1 -1
  14. package/dist/lib/core/AsyncHandler.d.ts +137 -0
  15. package/dist/lib/core/AsyncHandler.d.ts.map +1 -0
  16. package/dist/lib/core/AsyncHandler.js +133 -0
  17. package/dist/lib/core/AsyncHandler.js.map +1 -0
  18. package/dist/lib/core/ResponseValidator.d.ts +60 -0
  19. package/dist/lib/core/ResponseValidator.d.ts.map +1 -0
  20. package/dist/lib/core/ResponseValidator.js +250 -0
  21. package/dist/lib/core/ResponseValidator.js.map +1 -0
  22. package/dist/lib/core/TaskEventTypes.d.ts +220 -0
  23. package/dist/lib/core/TaskEventTypes.d.ts.map +1 -0
  24. package/dist/lib/core/TaskEventTypes.js +80 -0
  25. package/dist/lib/core/TaskEventTypes.js.map +1 -0
  26. package/dist/lib/core/TaskExecutor.d.ts +7 -1
  27. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  28. package/dist/lib/core/TaskExecutor.js +50 -4
  29. package/dist/lib/core/TaskExecutor.js.map +1 -1
  30. package/dist/lib/index.d.ts +5 -0
  31. package/dist/lib/index.d.ts.map +1 -1
  32. package/dist/lib/index.js +9 -1
  33. package/dist/lib/index.js.map +1 -1
  34. package/dist/lib/types/core.generated.d.ts +2 -18
  35. package/dist/lib/types/core.generated.d.ts.map +1 -1
  36. package/dist/lib/types/core.generated.js +1 -1
  37. package/dist/lib/types/tools.generated.d.ts +2 -215
  38. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  39. package/dist/lib/types/tools.generated.js.map +1 -1
  40. package/package.json +5 -3
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Structured async handler for AdCP webhook responses
3
+ * Provides type-safe callbacks for each AdCP tool completion
4
+ */
5
+ import type { GetProductsResponse, ListCreativeFormatsResponse, CreateMediaBuyResponse, UpdateMediaBuyResponse, SyncCreativesResponse, ListCreativesResponse, GetMediaBuyDeliveryResponse, ListAuthorizedPropertiesResponse, ProvidePerformanceFeedbackResponse, GetSignalsResponse, ActivateSignalResponse } from '../types/tools.generated';
6
+ /**
7
+ * Metadata provided with webhook responses
8
+ */
9
+ export interface WebhookMetadata {
10
+ /** Client-provided operation ID */
11
+ operation_id: string;
12
+ /** Server's context ID */
13
+ context_id?: string;
14
+ /** Server's task ID */
15
+ task_id?: string;
16
+ /** Agent ID */
17
+ agent_id: string;
18
+ /** Task type/tool name */
19
+ task_type: string;
20
+ /** Task status (completed, failed, needs_input, working, etc) */
21
+ status?: string;
22
+ /** Error message if status is failed */
23
+ error?: string;
24
+ /** Timestamp */
25
+ timestamp: string;
26
+ }
27
+ /**
28
+ * Metadata for agent-initiated notifications
29
+ * Same as WebhookMetadata but includes notification-specific fields
30
+ */
31
+ export interface NotificationMetadata extends WebhookMetadata {
32
+ /** Notification type */
33
+ notification_type: 'scheduled' | 'final' | 'delayed';
34
+ /** Sequence number of this notification */
35
+ sequence_number?: number;
36
+ /** When next notification is expected (not present for 'final') */
37
+ next_expected_at?: string;
38
+ }
39
+ /**
40
+ * Media buy delivery notification payload (PR #81)
41
+ * Agent-initiated periodic reporting, not tied to any client operation
42
+ */
43
+ export interface MediaBuyDeliveryNotification {
44
+ /** Type of notification */
45
+ notification_type: 'scheduled' | 'final' | 'delayed';
46
+ /** Sequential notification number (starts at 1) */
47
+ sequence_number?: number;
48
+ /** When next notification is expected (omitted for 'final') */
49
+ next_expected_at?: string;
50
+ /** Reporting period for this notification */
51
+ reporting_period?: {
52
+ start: string;
53
+ end: string;
54
+ };
55
+ /** Currency used for financial metrics */
56
+ currency?: string;
57
+ /** Array of media buy deliveries being reported */
58
+ media_buy_deliveries?: Array<{
59
+ media_buy_id: string;
60
+ impressions?: number;
61
+ clicks?: number;
62
+ spend?: number;
63
+ conversions?: number;
64
+ [key: string]: any;
65
+ }>;
66
+ }
67
+ /**
68
+ * Activity event for logging/observability
69
+ */
70
+ export interface Activity {
71
+ type: 'protocol_request' | 'protocol_response' | 'status_change' | 'webhook_received';
72
+ operation_id: string;
73
+ agent_id: string;
74
+ context_id?: string;
75
+ task_id?: string;
76
+ task_type: string;
77
+ status?: string;
78
+ payload?: any;
79
+ timestamp: string;
80
+ }
81
+ /**
82
+ * Configuration for async handler with typed callbacks
83
+ */
84
+ export interface AsyncHandlerConfig {
85
+ onGetProductsStatusChange?: (response: GetProductsResponse, metadata: WebhookMetadata) => void | Promise<void>;
86
+ onListCreativeFormatsStatusChange?: (response: ListCreativeFormatsResponse, metadata: WebhookMetadata) => void | Promise<void>;
87
+ onCreateMediaBuyStatusChange?: (response: CreateMediaBuyResponse, metadata: WebhookMetadata) => void | Promise<void>;
88
+ onUpdateMediaBuyStatusChange?: (response: UpdateMediaBuyResponse, metadata: WebhookMetadata) => void | Promise<void>;
89
+ onSyncCreativesStatusChange?: (response: SyncCreativesResponse, metadata: WebhookMetadata) => void | Promise<void>;
90
+ onListCreativesStatusChange?: (response: ListCreativesResponse, metadata: WebhookMetadata) => void | Promise<void>;
91
+ onGetMediaBuyDeliveryStatusChange?: (response: GetMediaBuyDeliveryResponse, metadata: WebhookMetadata) => void | Promise<void>;
92
+ onListAuthorizedPropertiesStatusChange?: (response: ListAuthorizedPropertiesResponse, metadata: WebhookMetadata) => void | Promise<void>;
93
+ onProvidePerformanceFeedbackStatusChange?: (response: ProvidePerformanceFeedbackResponse, metadata: WebhookMetadata) => void | Promise<void>;
94
+ onGetSignalsStatusChange?: (response: GetSignalsResponse, metadata: WebhookMetadata) => void | Promise<void>;
95
+ onActivateSignalStatusChange?: (response: ActivateSignalResponse, metadata: WebhookMetadata) => void | Promise<void>;
96
+ onTaskStatusChange?: (response: any, metadata: WebhookMetadata) => void | Promise<void>;
97
+ onActivity?: (activity: Activity) => void | Promise<void>;
98
+ onMediaBuyDeliveryNotification?: (notification: MediaBuyDeliveryNotification, metadata: NotificationMetadata) => void | Promise<void>;
99
+ }
100
+ /**
101
+ * Webhook payload structure
102
+ */
103
+ export interface WebhookPayload {
104
+ operation_id: string;
105
+ context_id?: string;
106
+ task_id?: string;
107
+ task_type: string;
108
+ status: string;
109
+ result?: any;
110
+ error?: string;
111
+ message?: string;
112
+ timestamp?: string;
113
+ }
114
+ /**
115
+ * Async handler class
116
+ */
117
+ export declare class AsyncHandler {
118
+ private config;
119
+ constructor(config: AsyncHandlerConfig);
120
+ /**
121
+ * Handle incoming webhook payload (both task completions and notifications)
122
+ */
123
+ handleWebhook(payload: WebhookPayload, agentId?: string): Promise<void>;
124
+ /**
125
+ * Handle task completion - route to specific handler
126
+ */
127
+ private handleCompletion;
128
+ /**
129
+ * Emit activity event
130
+ */
131
+ private emitActivity;
132
+ }
133
+ /**
134
+ * Factory function to create async handler
135
+ */
136
+ export declare function createAsyncHandler(config: AsyncHandlerConfig): AsyncHandler;
137
+ //# sourceMappingURL=AsyncHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncHandler.d.ts","sourceRoot":"","sources":["../../../src/lib/core/AsyncHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * Structured async handler for AdCP webhook responses
4
+ * Provides type-safe callbacks for each AdCP tool completion
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AsyncHandler = void 0;
8
+ exports.createAsyncHandler = createAsyncHandler;
9
+ /**
10
+ * Async handler class
11
+ */
12
+ class AsyncHandler {
13
+ config;
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Handle incoming webhook payload (both task completions and notifications)
19
+ */
20
+ async handleWebhook(payload, agentId) {
21
+ const metadata = {
22
+ operation_id: payload.operation_id,
23
+ context_id: payload.context_id,
24
+ task_id: payload.task_id,
25
+ agent_id: agentId || 'unknown',
26
+ task_type: payload.task_type,
27
+ status: payload.status,
28
+ error: payload.error,
29
+ timestamp: payload.timestamp || new Date().toISOString()
30
+ };
31
+ // Emit activity
32
+ await this.emitActivity({
33
+ type: 'webhook_received',
34
+ operation_id: metadata.operation_id,
35
+ agent_id: metadata.agent_id,
36
+ context_id: metadata.context_id,
37
+ task_id: metadata.task_id,
38
+ task_type: metadata.task_type,
39
+ status: payload.status,
40
+ payload: payload.result,
41
+ timestamp: metadata.timestamp
42
+ });
43
+ // Check if this is a notification (media_buy_delivery with notification_type)
44
+ // Notifications are treated like status updates for an ongoing "get delivery report" operation
45
+ // The operation_id (from URL) groups all reports for the same agent + month
46
+ if (payload.task_type === 'media_buy_delivery' &&
47
+ payload.result &&
48
+ typeof payload.result === 'object' &&
49
+ 'notification_type' in payload.result) {
50
+ const notificationPayload = payload.result;
51
+ // Build notification metadata
52
+ // operation_id comes from webhook URL and was lazily generated from agent + month
53
+ const notificationMetadata = {
54
+ ...metadata,
55
+ notification_type: notificationPayload.notification_type,
56
+ sequence_number: notificationPayload.sequence_number,
57
+ next_expected_at: notificationPayload.next_expected_at
58
+ };
59
+ await this.config.onMediaBuyDeliveryNotification?.(notificationPayload, notificationMetadata);
60
+ return;
61
+ }
62
+ // All status changes go through the specific handler
63
+ // The handler receives metadata with status and can act accordingly
64
+ await this.handleCompletion(payload.task_type, payload.result, metadata);
65
+ }
66
+ /**
67
+ * Handle task completion - route to specific handler
68
+ */
69
+ async handleCompletion(taskType, result, metadata) {
70
+ let handler;
71
+ // Route to specific handler based on task type
72
+ switch (taskType) {
73
+ case 'get_products':
74
+ handler = this.config.onGetProductsStatusChange;
75
+ break;
76
+ case 'list_creative_formats':
77
+ handler = this.config.onListCreativeFormatsStatusChange;
78
+ break;
79
+ case 'create_media_buy':
80
+ handler = this.config.onCreateMediaBuyStatusChange;
81
+ break;
82
+ case 'update_media_buy':
83
+ handler = this.config.onUpdateMediaBuyStatusChange;
84
+ break;
85
+ case 'sync_creatives':
86
+ handler = this.config.onSyncCreativesStatusChange;
87
+ break;
88
+ case 'list_creatives':
89
+ handler = this.config.onListCreativesStatusChange;
90
+ break;
91
+ case 'get_media_buy_delivery':
92
+ handler = this.config.onGetMediaBuyDeliveryStatusChange;
93
+ break;
94
+ case 'list_authorized_properties':
95
+ handler = this.config.onListAuthorizedPropertiesStatusChange;
96
+ break;
97
+ case 'provide_performance_feedback':
98
+ handler = this.config.onProvidePerformanceFeedbackStatusChange;
99
+ break;
100
+ case 'get_signals':
101
+ handler = this.config.onGetSignalsStatusChange;
102
+ break;
103
+ case 'activate_signal':
104
+ handler = this.config.onActivateSignalStatusChange;
105
+ break;
106
+ }
107
+ // Call specific handler if configured, otherwise fallback to generic handler
108
+ const handlerToCall = handler || this.config.onTaskStatusChange;
109
+ if (handlerToCall) {
110
+ try {
111
+ await handlerToCall(result, metadata);
112
+ }
113
+ catch (error) {
114
+ // Log error but don't crash webhook processing
115
+ console.error(`Error in handler for task ${taskType}:`, error);
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Emit activity event
121
+ */
122
+ async emitActivity(activity) {
123
+ await this.config.onActivity?.(activity);
124
+ }
125
+ }
126
+ exports.AsyncHandler = AsyncHandler;
127
+ /**
128
+ * Factory function to create async handler
129
+ */
130
+ function createAsyncHandler(config) {
131
+ return new AsyncHandler(config);
132
+ }
133
+ //# sourceMappingURL=AsyncHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncHandler.js","sourceRoot":"","sources":["../../../src/lib/core/AsyncHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Response validator for agent responses
3
+ *
4
+ * Validates that agent responses match expected structures for both
5
+ * MCP and A2A protocols, helping catch issues early in development.
6
+ */
7
+ export interface ValidationResult {
8
+ valid: boolean;
9
+ errors: string[];
10
+ warnings: string[];
11
+ protocol?: 'mcp' | 'a2a' | 'unknown';
12
+ }
13
+ export interface ValidationOptions {
14
+ /** Enable strict mode - fail on warnings */
15
+ strict?: boolean;
16
+ /** Expected data fields (e.g., ['products'] for get_products) */
17
+ expectedFields?: string[];
18
+ /** Allow empty responses */
19
+ allowEmpty?: boolean;
20
+ }
21
+ export declare class ResponseValidator {
22
+ /**
23
+ * Validate an agent response structure
24
+ */
25
+ validate(response: any, toolName?: string, options?: ValidationOptions): ValidationResult;
26
+ /**
27
+ * Validate MCP response structure
28
+ */
29
+ private validateMCPResponse;
30
+ /**
31
+ * Validate A2A response structure
32
+ */
33
+ private validateA2AResponse;
34
+ /**
35
+ * Validate expected fields are present in the response
36
+ */
37
+ private validateExpectedFields;
38
+ /**
39
+ * Validate response is not empty
40
+ */
41
+ private validateNotEmpty;
42
+ /**
43
+ * Tool-specific validation rules
44
+ */
45
+ private validateToolResponse;
46
+ /**
47
+ * Get expected fields for a given tool
48
+ */
49
+ private getExpectedFieldsForTool;
50
+ /**
51
+ * Quick validation helper - returns true if valid, throws if invalid
52
+ */
53
+ validateOrThrow(response: any, toolName?: string, options?: ValidationOptions): void;
54
+ /**
55
+ * Check if a response looks like a valid protocol response
56
+ */
57
+ isValidProtocolResponse(response: any): boolean;
58
+ }
59
+ export declare const responseValidator: ResponseValidator;
60
+ //# sourceMappingURL=ResponseValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseValidator.d.ts","sourceRoot":"","sources":["../../../src/lib/core/ResponseValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4BAA4B;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,gBAAgB;IA2C7F;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+D3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAQxF;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO;CAsBhD;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ /**
3
+ * Response validator for agent responses
4
+ *
5
+ * Validates that agent responses match expected structures for both
6
+ * MCP and A2A protocols, helping catch issues early in development.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.responseValidator = exports.ResponseValidator = void 0;
10
+ class ResponseValidator {
11
+ /**
12
+ * Validate an agent response structure
13
+ */
14
+ validate(response, toolName, options = {}) {
15
+ const errors = [];
16
+ const warnings = [];
17
+ let protocol = 'unknown';
18
+ if (!response) {
19
+ errors.push('Response is null or undefined');
20
+ return { valid: false, errors, warnings, protocol };
21
+ }
22
+ // Detect protocol
23
+ // A2A responses have either result.artifacts or error at top level
24
+ if (response.result || response.error || response.jsonrpc) {
25
+ protocol = 'a2a';
26
+ this.validateA2AResponse(response, errors, warnings);
27
+ }
28
+ else if (response.structuredContent || response.content) {
29
+ protocol = 'mcp';
30
+ this.validateMCPResponse(response, errors, warnings);
31
+ }
32
+ else if (response.data) {
33
+ warnings.push('Response has data field but unknown protocol');
34
+ }
35
+ else {
36
+ warnings.push('Response does not match MCP or A2A structure');
37
+ }
38
+ // Check for expected fields if provided
39
+ if (options.expectedFields && options.expectedFields.length > 0) {
40
+ this.validateExpectedFields(response, options.expectedFields, protocol, errors, warnings);
41
+ }
42
+ // Check for empty responses
43
+ if (!options.allowEmpty) {
44
+ this.validateNotEmpty(response, protocol, warnings);
45
+ }
46
+ // Tool-specific validation
47
+ if (toolName) {
48
+ this.validateToolResponse(response, toolName, protocol, errors, warnings);
49
+ }
50
+ const valid = errors.length === 0 && (!options.strict || warnings.length === 0);
51
+ return { valid, errors, warnings, protocol };
52
+ }
53
+ /**
54
+ * Validate MCP response structure
55
+ */
56
+ validateMCPResponse(response, errors, warnings) {
57
+ // Check for error indicator
58
+ if (response.isError === true) {
59
+ errors.push('MCP response indicates error (isError: true)');
60
+ }
61
+ // Validate structuredContent if present
62
+ if (response.structuredContent) {
63
+ if (typeof response.structuredContent !== 'object') {
64
+ errors.push('MCP structuredContent must be an object');
65
+ }
66
+ }
67
+ // Validate content array if present
68
+ if (response.content) {
69
+ if (!Array.isArray(response.content)) {
70
+ errors.push('MCP content must be an array');
71
+ }
72
+ else {
73
+ response.content.forEach((item, index) => {
74
+ if (!item.type) {
75
+ warnings.push(`MCP content[${index}] missing type field`);
76
+ }
77
+ });
78
+ }
79
+ }
80
+ // Should have either content or structuredContent
81
+ if (!response.content && !response.structuredContent) {
82
+ warnings.push('MCP response has neither content nor structuredContent');
83
+ }
84
+ }
85
+ /**
86
+ * Validate A2A response structure
87
+ */
88
+ validateA2AResponse(response, errors, warnings) {
89
+ // Check for JSON-RPC error
90
+ if (response.error) {
91
+ const errorMsg = response.error.message || JSON.stringify(response.error);
92
+ errors.push(`A2A JSON-RPC error: ${errorMsg}`);
93
+ return;
94
+ }
95
+ // Validate result structure
96
+ if (!response.result) {
97
+ errors.push('A2A response missing result field');
98
+ return;
99
+ }
100
+ // Validate artifacts
101
+ if (!response.result.artifacts) {
102
+ errors.push('A2A response missing result.artifacts field');
103
+ return;
104
+ }
105
+ if (!Array.isArray(response.result.artifacts)) {
106
+ errors.push('A2A result.artifacts must be an array');
107
+ return;
108
+ }
109
+ if (response.result.artifacts.length === 0) {
110
+ warnings.push('A2A artifacts array is empty');
111
+ return;
112
+ }
113
+ // Validate first artifact structure
114
+ const firstArtifact = response.result.artifacts[0];
115
+ if (!firstArtifact.parts) {
116
+ errors.push('A2A artifact missing parts field');
117
+ return;
118
+ }
119
+ if (!Array.isArray(firstArtifact.parts)) {
120
+ errors.push('A2A artifact.parts must be an array');
121
+ return;
122
+ }
123
+ if (firstArtifact.parts.length === 0) {
124
+ warnings.push('A2A artifact parts array is empty');
125
+ return;
126
+ }
127
+ // Validate first part
128
+ const firstPart = firstArtifact.parts[0];
129
+ if (!firstPart.kind && !firstPart.type) {
130
+ warnings.push('A2A part missing kind/type field');
131
+ }
132
+ if (!firstPart.data) {
133
+ warnings.push('A2A part missing data field');
134
+ }
135
+ // Validate artifact metadata
136
+ if (!firstArtifact.artifactId && !firstArtifact.artifact_id) {
137
+ warnings.push('A2A artifact missing artifactId');
138
+ }
139
+ }
140
+ /**
141
+ * Validate expected fields are present in the response
142
+ */
143
+ validateExpectedFields(response, expectedFields, protocol, errors, warnings) {
144
+ let data;
145
+ // Extract data based on protocol
146
+ if (protocol === 'mcp') {
147
+ data = response.structuredContent;
148
+ }
149
+ else if (protocol === 'a2a') {
150
+ data = response.result?.artifacts?.[0]?.parts?.[0]?.data;
151
+ }
152
+ else {
153
+ data = response.data || response;
154
+ }
155
+ if (!data) {
156
+ errors.push('Cannot validate fields: no data extracted');
157
+ return;
158
+ }
159
+ // Check each expected field
160
+ expectedFields.forEach(field => {
161
+ if (!(field in data)) {
162
+ errors.push(`Missing expected field: ${field}`);
163
+ }
164
+ else if (Array.isArray(data[field]) && data[field].length === 0) {
165
+ warnings.push(`Field ${field} is an empty array`);
166
+ }
167
+ });
168
+ }
169
+ /**
170
+ * Validate response is not empty
171
+ */
172
+ validateNotEmpty(response, protocol, warnings) {
173
+ if (protocol === 'mcp' && response.structuredContent) {
174
+ const keys = Object.keys(response.structuredContent);
175
+ if (keys.length === 0) {
176
+ warnings.push('MCP structuredContent is empty object');
177
+ }
178
+ }
179
+ if (protocol === 'a2a' && response.result?.artifacts?.[0]?.parts?.[0]?.data) {
180
+ const data = response.result.artifacts[0].parts[0].data;
181
+ const keys = Object.keys(data);
182
+ if (keys.length === 0) {
183
+ warnings.push('A2A data is empty object');
184
+ }
185
+ }
186
+ }
187
+ /**
188
+ * Tool-specific validation rules
189
+ */
190
+ validateToolResponse(response, toolName, protocol, errors, warnings) {
191
+ const expectedFields = this.getExpectedFieldsForTool(toolName);
192
+ if (expectedFields.length > 0) {
193
+ this.validateExpectedFields(response, expectedFields, protocol, errors, warnings);
194
+ }
195
+ }
196
+ /**
197
+ * Get expected fields for a given tool
198
+ */
199
+ getExpectedFieldsForTool(toolName) {
200
+ const fieldMap = {
201
+ get_products: ['products'],
202
+ list_creative_formats: ['formats'],
203
+ list_creatives: ['creatives'],
204
+ create_media_buy: ['media_buy_id'],
205
+ update_media_buy: ['success'],
206
+ sync_creatives: ['synced_creatives'],
207
+ get_media_buy_delivery: ['delivery'],
208
+ list_authorized_properties: ['properties'],
209
+ provide_performance_feedback: ['success'],
210
+ get_signals: ['signals'],
211
+ activate_signal: ['success']
212
+ };
213
+ return fieldMap[toolName] || [];
214
+ }
215
+ /**
216
+ * Quick validation helper - returns true if valid, throws if invalid
217
+ */
218
+ validateOrThrow(response, toolName, options = {}) {
219
+ const result = this.validate(response, toolName, options);
220
+ if (!result.valid) {
221
+ const errorMsg = result.errors.join('; ');
222
+ throw new Error(`Response validation failed: ${errorMsg}`);
223
+ }
224
+ }
225
+ /**
226
+ * Check if a response looks like a valid protocol response
227
+ */
228
+ isValidProtocolResponse(response) {
229
+ if (!response || typeof response !== 'object') {
230
+ return false;
231
+ }
232
+ // MCP indicators
233
+ if (response.structuredContent || response.content) {
234
+ return true;
235
+ }
236
+ // A2A indicators
237
+ if (response.result?.artifacts) {
238
+ return true;
239
+ }
240
+ // Generic data response
241
+ if (response.data) {
242
+ return true;
243
+ }
244
+ return false;
245
+ }
246
+ }
247
+ exports.ResponseValidator = ResponseValidator;
248
+ // Export singleton instance
249
+ exports.responseValidator = new ResponseValidator();
250
+ //# sourceMappingURL=ResponseValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseValidator.js","sourceRoot":"","sources":["../../../src/lib/core/ResponseValidator.ts"],"names":[],"mappings":"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"}