adp-agent 0.2.1 → 0.2.3
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 +492 -67
- package/README.zh.md +565 -0
- package/dist/src/mcp-server.js +2 -2
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/start-mcp.js +5 -5
- package/dist/start-mcp.js.map +1 -1
- package/dist/start-relay.d.ts +1 -0
- package/dist/start-relay.js +1 -0
- package/dist/start-relay.js.map +1 -1
- package/package.json +4 -2
- package/skill/SKILL.md +195 -3
package/dist/start-mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-mcp.js","sourceRoot":"","sources":["../start-mcp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"start-mcp.js","sourceRoot":"","sources":["../start-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/start-relay.d.ts
CHANGED
package/dist/start-relay.js
CHANGED
package/dist/start-relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-relay.js","sourceRoot":"","sources":["../start-relay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start-relay.js","sourceRoot":"","sources":["../start-relay.ts"],"names":[],"mappings":";;;AAEA,uCAAoC;AAEpC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,SAAS,CAAC;AAC/E,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3H,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAC5I,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AACzI,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC;AACrI,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;AAEzI,MAAM,KAAK,GAAG,IAAI,aAAK,CAAC;IACtB,IAAI;IACJ,IAAI;IACJ,cAAc;IACd,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,kBAAkB;CACnB,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC;;;;UAIF,IAAI,IAAI,IAAI;;gBAEN,mBAAmB,GAAG,IAAI,gBAAgB,kBAAkB,GAAG,IAAI;oBAC/D,eAAe,GAAG,QAAQ,OAAO,kBAAkB;;CAEtE,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adp-agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Agent Discovery Protocol (ADP) - discover, query, and ping agents via MCP / OpenClaw",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
|
-
"adp": "dist/start-mcp.js"
|
|
8
|
+
"adp-agent": "dist/start-mcp.js",
|
|
9
|
+
"adp-registry": "dist/start-registry.js",
|
|
10
|
+
"adp-relay": "dist/start-relay.js"
|
|
9
11
|
},
|
|
10
12
|
"files": [
|
|
11
13
|
"dist/",
|
package/skill/SKILL.md
CHANGED
|
@@ -353,10 +353,12 @@ await server.start();
|
|
|
353
353
|
|
|
354
354
|
### Pattern 5: Webhook Mode (for non-WebSocket frameworks)
|
|
355
355
|
|
|
356
|
-
For agent frameworks that don't support WebSocket, use ADP's webhook communication mode.
|
|
356
|
+
For agent frameworks that don't support WebSocket, use ADP's webhook communication mode. Webhooks are ideal for long-running async tasks where the result is delivered later.
|
|
357
|
+
|
|
358
|
+
#### 5.1 Configure Gateway with Webhook
|
|
357
359
|
|
|
358
360
|
```typescript
|
|
359
|
-
import { Gateway, loadOrCreateIdentity } from 'adp-agent';
|
|
361
|
+
import { Gateway, loadOrCreateIdentity, signEnvelope, canonicalize, generateMessageId } from 'adp-agent';
|
|
360
362
|
|
|
361
363
|
const { identity } = loadOrCreateIdentity('myapp', 'webhook-agent', 'WebhookAgent');
|
|
362
364
|
|
|
@@ -365,9 +367,199 @@ const gateway = new Gateway({
|
|
|
365
367
|
secretKey: identity.secretKey,
|
|
366
368
|
agentId: identity.agentId,
|
|
367
369
|
displayName: 'Webhook Agent',
|
|
368
|
-
capabilities: [
|
|
370
|
+
capabilities: [
|
|
371
|
+
'adp:ping',
|
|
372
|
+
'adp:capability.query',
|
|
373
|
+
{
|
|
374
|
+
capability: 'custom:video.generate',
|
|
375
|
+
description: 'Generate video (async task)',
|
|
376
|
+
async: true,
|
|
377
|
+
preferredMode: 'webhook',
|
|
378
|
+
},
|
|
379
|
+
],
|
|
369
380
|
communication: {
|
|
370
381
|
mode: 'webhook',
|
|
382
|
+
webhook: {
|
|
383
|
+
enabled: true,
|
|
384
|
+
url: 'https://my-agent.example.com/webhook/adp',
|
|
385
|
+
secret: 'your-webhook-secret',
|
|
386
|
+
timeout: 30000,
|
|
387
|
+
retry: {
|
|
388
|
+
maxAttempts: 3,
|
|
389
|
+
backoffMs: 1000,
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
customHandlers: {
|
|
394
|
+
'custom:video.generate': async (ws, envelope) => {
|
|
395
|
+
const params = envelope.params as { prompt?: string; duration?: number };
|
|
396
|
+
|
|
397
|
+
console.log('Starting video generation...');
|
|
398
|
+
|
|
399
|
+
// Simulate async work
|
|
400
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
401
|
+
|
|
402
|
+
const reply = signEnvelope({
|
|
403
|
+
protocol: 'adp/0.2',
|
|
404
|
+
id: generateMessageId(),
|
|
405
|
+
from: identity.agentId,
|
|
406
|
+
to: envelope.from,
|
|
407
|
+
action: 'custom:video.generate',
|
|
408
|
+
params: {
|
|
409
|
+
task_id: envelope.params?.task_id,
|
|
410
|
+
status: 'COMPLETED',
|
|
411
|
+
result: {
|
|
412
|
+
video_url: 'https://cdn.example.com/video.mp4',
|
|
413
|
+
thumbnail_url: 'https://cdn.example.com/thumb.jpg',
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
reply_to: envelope.id,
|
|
417
|
+
timestamp: new Date().toISOString(),
|
|
418
|
+
}, identity.secretKey, canonicalize);
|
|
419
|
+
|
|
420
|
+
ws.send(JSON.stringify(reply));
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
#### 5.2 Receive Webhook Callbacks
|
|
427
|
+
|
|
428
|
+
Your agent framework needs an HTTP endpoint to receive webhook callbacks:
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
import * as http from 'http';
|
|
432
|
+
import { WebhookClient, WebhookPayload, WebhookEvent } from 'adp-agent';
|
|
433
|
+
|
|
434
|
+
interface WebhookPayload {
|
|
435
|
+
event: WebhookEvent;
|
|
436
|
+
task_id: string;
|
|
437
|
+
agent_id: string;
|
|
438
|
+
timestamp: string;
|
|
439
|
+
signature: string;
|
|
440
|
+
data: {
|
|
441
|
+
result?: unknown;
|
|
442
|
+
error?: { code: string; message: string };
|
|
443
|
+
progress?: { current: number; total: number; message: string };
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function startWebhookServer(port: number) {
|
|
448
|
+
const server = http.createServer((req, res) => {
|
|
449
|
+
if (req.method === 'POST' && req.url === '/webhook/adp') {
|
|
450
|
+
let body = '';
|
|
451
|
+
req.on('data', chunk => { body += chunk.toString(); });
|
|
452
|
+
req.on('end', () => {
|
|
453
|
+
try {
|
|
454
|
+
const payload = JSON.parse(body) as WebhookPayload;
|
|
455
|
+
|
|
456
|
+
console.log(`Received webhook: ${payload.event}`);
|
|
457
|
+
console.log(`Task ID: ${payload.task_id}`);
|
|
458
|
+
console.log(`Data:`, payload.data);
|
|
459
|
+
|
|
460
|
+
// Handle different event types
|
|
461
|
+
switch (payload.event) {
|
|
462
|
+
case 'task.completed':
|
|
463
|
+
console.log('Task completed successfully!');
|
|
464
|
+
break;
|
|
465
|
+
case 'task.failed':
|
|
466
|
+
console.error('Task failed:', payload.data.error);
|
|
467
|
+
break;
|
|
468
|
+
case 'task.progress':
|
|
469
|
+
console.log('Task progress:', payload.data.progress);
|
|
470
|
+
break;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
474
|
+
res.end(JSON.stringify({ status: 'ok' }));
|
|
475
|
+
} catch (error) {
|
|
476
|
+
console.error('Failed to parse webhook:', error);
|
|
477
|
+
res.writeHead(400);
|
|
478
|
+
res.end('Invalid JSON');
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
} else {
|
|
482
|
+
res.writeHead(404);
|
|
483
|
+
res.end();
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
server.listen(port, () => {
|
|
488
|
+
console.log(`Webhook server listening on port ${port}`);
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
startWebhookServer(8080);
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
#### 5.3 Verify Webhook Signatures
|
|
496
|
+
|
|
497
|
+
For security, always verify webhook signatures:
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
import { WebhookClient, WebhookPayload } from 'adp-agent';
|
|
501
|
+
import { loadIdentity } from 'adp-agent';
|
|
502
|
+
|
|
503
|
+
function verifyWebhook(payload: WebhookPayload, agentId: string): boolean {
|
|
504
|
+
// Load the sender's public key from their agent ID
|
|
505
|
+
const identity = loadIdentity('namespace', 'agent-name', 'tag');
|
|
506
|
+
if (!identity) {
|
|
507
|
+
console.error('Unknown agent');
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
const isValid = WebhookClient.verifyWebhookSignature(payload, identity.publicKey);
|
|
512
|
+
|
|
513
|
+
if (!isValid) {
|
|
514
|
+
console.error('Invalid webhook signature!');
|
|
515
|
+
return false;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
console.log('Webhook signature verified');
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Usage in webhook handler:
|
|
523
|
+
const payload = JSON.parse(body) as WebhookPayload;
|
|
524
|
+
if (verifyWebhook(payload, payload.agent_id)) {
|
|
525
|
+
// Process the webhook
|
|
526
|
+
}
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
#### 5.4 Webhook Events
|
|
530
|
+
|
|
531
|
+
| Event | Description | Data Structure |
|
|
532
|
+
|-------|-------------|----------------|
|
|
533
|
+
| `task.completed` | Task finished successfully | `{ result: T }` |
|
|
534
|
+
| `task.failed` | Task failed with error | `{ error: { code, message } }` |
|
|
535
|
+
| `task.progress` | Task progress update | `{ progress: { current, total, message } }` |
|
|
536
|
+
|
|
537
|
+
#### 5.5 Hybrid Mode (WebSocket + Webhook)
|
|
538
|
+
|
|
539
|
+
Use hybrid mode for best of both worlds — sync responses via WebSocket, async callbacks via webhook:
|
|
540
|
+
|
|
541
|
+
```typescript
|
|
542
|
+
const gateway = new Gateway({
|
|
543
|
+
port: 9900,
|
|
544
|
+
secretKey: identity.secretKey,
|
|
545
|
+
agentId: identity.agentId,
|
|
546
|
+
displayName: 'Hybrid Agent',
|
|
547
|
+
capabilities: [
|
|
548
|
+
{
|
|
549
|
+
capability: 'custom:quick.action',
|
|
550
|
+
description: 'Fast sync action',
|
|
551
|
+
async: false,
|
|
552
|
+
preferredMode: 'websocket',
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
capability: 'custom:long.task',
|
|
556
|
+
description: 'Long async task',
|
|
557
|
+
async: true,
|
|
558
|
+
preferredMode: 'webhook',
|
|
559
|
+
},
|
|
560
|
+
],
|
|
561
|
+
communication: {
|
|
562
|
+
mode: 'hybrid',
|
|
371
563
|
webhook: {
|
|
372
564
|
enabled: true,
|
|
373
565
|
url: 'https://my-agent.example.com/webhook/adp',
|