@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.
- package/README.md +362 -166
- package/dist/lib/agents/index.generated.d.ts +1 -21
- package/dist/lib/agents/index.generated.d.ts.map +1 -1
- package/dist/lib/agents/index.generated.js +0 -28
- package/dist/lib/agents/index.generated.js.map +1 -1
- package/dist/lib/core/ADCPClient.d.ts +66 -0
- package/dist/lib/core/ADCPClient.d.ts.map +1 -1
- package/dist/lib/core/ADCPClient.js +160 -11
- package/dist/lib/core/ADCPClient.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts +16 -0
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +20 -0
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/core/AsyncHandler.d.ts +137 -0
- package/dist/lib/core/AsyncHandler.d.ts.map +1 -0
- package/dist/lib/core/AsyncHandler.js +133 -0
- package/dist/lib/core/AsyncHandler.js.map +1 -0
- package/dist/lib/core/ResponseValidator.d.ts +60 -0
- package/dist/lib/core/ResponseValidator.d.ts.map +1 -0
- package/dist/lib/core/ResponseValidator.js +250 -0
- package/dist/lib/core/ResponseValidator.js.map +1 -0
- package/dist/lib/core/TaskEventTypes.d.ts +220 -0
- package/dist/lib/core/TaskEventTypes.d.ts.map +1 -0
- package/dist/lib/core/TaskEventTypes.js +80 -0
- package/dist/lib/core/TaskEventTypes.js.map +1 -0
- package/dist/lib/core/TaskExecutor.d.ts +7 -1
- package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
- package/dist/lib/core/TaskExecutor.js +50 -4
- package/dist/lib/core/TaskExecutor.js.map +1 -1
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/types/core.generated.d.ts +2 -18
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/tools.generated.d.ts +2 -215
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/types/tools.generated.js.map +1 -1
- 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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"}
|