proofscan 0.10.62 → 0.11.1
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.ja.md +1 -0
- package/README.md +2 -0
- package/dist/a2a/agent-card.d.ts +2 -0
- package/dist/a2a/agent-card.d.ts.map +1 -1
- package/dist/a2a/agent-card.js +2 -2
- package/dist/a2a/agent-card.js.map +1 -1
- package/dist/a2a/client.d.ts +74 -12
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +228 -29
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/normalizer.d.ts +4 -0
- package/dist/a2a/normalizer.d.ts.map +1 -1
- package/dist/a2a/normalizer.js +7 -4
- package/dist/a2a/normalizer.js.map +1 -1
- package/dist/a2a/session-manager.d.ts +81 -0
- package/dist/a2a/session-manager.d.ts.map +1 -0
- package/dist/a2a/session-manager.js +176 -0
- package/dist/a2a/session-manager.js.map +1 -0
- package/dist/a2a/types.d.ts +60 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +35 -10
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +12 -10
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/connectors.js +2 -2
- package/dist/commands/connectors.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/plans.js +1 -1
- package/dist/commands/plans.js.map +1 -1
- package/dist/commands/record.js +5 -4
- package/dist/commands/record.js.map +1 -1
- package/dist/commands/rpc.d.ts.map +1 -1
- package/dist/commands/rpc.js +90 -28
- package/dist/commands/rpc.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +8 -10
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +11 -10
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/sessions.js +2 -2
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/summary.d.ts.map +1 -1
- package/dist/commands/summary.js +4 -2
- package/dist/commands/summary.js.map +1 -1
- package/dist/commands/task.d.ts +14 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +520 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +68 -21
- package/dist/db/connection.js.map +1 -1
- package/dist/db/events-store.d.ts +307 -8
- package/dist/db/events-store.d.ts.map +1 -1
- package/dist/db/events-store.js +620 -26
- package/dist/db/events-store.js.map +1 -1
- package/dist/db/proofs-store.d.ts +8 -1
- package/dist/db/proofs-store.d.ts.map +1 -1
- package/dist/db/proofs-store.js +18 -8
- package/dist/db/proofs-store.js.map +1 -1
- package/dist/db/schema.d.ts +15 -3
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +150 -5
- package/dist/db/schema.js.map +1 -1
- package/dist/db/tool-analysis.d.ts +15 -3
- package/dist/db/tool-analysis.d.ts.map +1 -1
- package/dist/db/tool-analysis.js +35 -17
- package/dist/db/tool-analysis.js.map +1 -1
- package/dist/db/types.d.ts +64 -1
- package/dist/db/types.d.ts.map +1 -1
- package/dist/filter/fields.d.ts.map +1 -1
- package/dist/filter/fields.js +22 -0
- package/dist/filter/fields.js.map +1 -1
- package/dist/filter/parser.js +2 -2
- package/dist/filter/parser.js.map +1 -1
- package/dist/filter/types.d.ts +1 -1
- package/dist/filter/types.d.ts.map +1 -1
- package/dist/html/analytics.test.ts +682 -0
- package/dist/html/analytics.ts +499 -0
- package/dist/html/browser.ts +39 -0
- package/dist/html/index.ts +97 -0
- package/dist/html/rpc-inspector.test.ts +529 -0
- package/dist/html/rpc-inspector.ts +1700 -0
- package/dist/html/templates.js +4 -4
- package/dist/html/templates.js.map +1 -1
- package/dist/html/templates.test.ts +861 -0
- package/dist/html/templates.ts +3163 -0
- package/dist/html/trace-viewer.html +624 -0
- package/dist/html/types.d.ts +3 -3
- package/dist/html/types.d.ts.map +1 -1
- package/dist/html/types.ts +491 -0
- package/dist/html/utils.ts +107 -0
- package/dist/monitor/data/connectors.d.ts.map +1 -1
- package/dist/monitor/data/connectors.js +113 -8
- package/dist/monitor/data/connectors.js.map +1 -1
- package/dist/monitor/data/popl.js +2 -2
- package/dist/monitor/data/popl.js.map +1 -1
- package/dist/monitor/routes/api.js +2 -2
- package/dist/monitor/routes/api.js.map +1 -1
- package/dist/monitor/routes/connectors.js +15 -15
- package/dist/monitor/routes/connectors.js.map +1 -1
- package/dist/monitor/routes/popl.js +5 -5
- package/dist/monitor/routes/popl.js.map +1 -1
- package/dist/monitor/templates/components.js +2 -2
- package/dist/monitor/templates/components.js.map +1 -1
- package/dist/monitor/templates/popl.js +4 -4
- package/dist/monitor/templates/popl.js.map +1 -1
- package/dist/monitor/types.d.ts +2 -2
- package/dist/monitor/types.d.ts.map +1 -1
- package/dist/proxy/bridge-utils.d.ts +41 -0
- package/dist/proxy/bridge-utils.d.ts.map +1 -0
- package/dist/proxy/bridge-utils.js +60 -0
- package/dist/proxy/bridge-utils.js.map +1 -0
- package/dist/proxy/ipc-client.d.ts.map +1 -1
- package/dist/proxy/ipc-client.js +1 -2
- package/dist/proxy/ipc-client.js.map +1 -1
- package/dist/proxy/ipc-server.d.ts.map +1 -1
- package/dist/proxy/ipc-server.js +4 -2
- package/dist/proxy/ipc-server.js.map +1 -1
- package/dist/proxy/mcp-server.d.ts +31 -0
- package/dist/proxy/mcp-server.d.ts.map +1 -1
- package/dist/proxy/mcp-server.js +393 -4
- package/dist/proxy/mcp-server.js.map +1 -1
- package/dist/proxy/types.d.ts +95 -0
- package/dist/proxy/types.d.ts.map +1 -1
- package/dist/secrets/management.d.ts +2 -2
- package/dist/secrets/management.d.ts.map +1 -1
- package/dist/secrets/management.js +7 -7
- package/dist/secrets/management.js.map +1 -1
- package/dist/shell/completer.d.ts.map +1 -1
- package/dist/shell/completer.js +16 -0
- package/dist/shell/completer.js.map +1 -1
- package/dist/shell/context-applicator.d.ts.map +1 -1
- package/dist/shell/context-applicator.js +32 -0
- package/dist/shell/context-applicator.js.map +1 -1
- package/dist/shell/filter-mappers.d.ts +5 -1
- package/dist/shell/filter-mappers.d.ts.map +1 -1
- package/dist/shell/filter-mappers.js +12 -0
- package/dist/shell/filter-mappers.js.map +1 -1
- package/dist/shell/find-command.js +13 -13
- package/dist/shell/find-command.js.map +1 -1
- package/dist/shell/inscribe-commands.js +5 -5
- package/dist/shell/inscribe-commands.js.map +1 -1
- package/dist/shell/pager/less-pager.d.ts +1 -1
- package/dist/shell/pager/less-pager.d.ts.map +1 -1
- package/dist/shell/pager/less-pager.js +5 -2
- package/dist/shell/pager/less-pager.js.map +1 -1
- package/dist/shell/pager/more-pager.d.ts +1 -1
- package/dist/shell/pager/more-pager.d.ts.map +1 -1
- package/dist/shell/pager/more-pager.js +3 -2
- package/dist/shell/pager/more-pager.js.map +1 -1
- package/dist/shell/pager/renderer.d.ts.map +1 -1
- package/dist/shell/pager/renderer.js +66 -15
- package/dist/shell/pager/renderer.js.map +1 -1
- package/dist/shell/pager/types.d.ts +5 -2
- package/dist/shell/pager/types.d.ts.map +1 -1
- package/dist/shell/pager/utils.d.ts +5 -2
- package/dist/shell/pager/utils.d.ts.map +1 -1
- package/dist/shell/pager/utils.js +14 -17
- package/dist/shell/pager/utils.js.map +1 -1
- package/dist/shell/pipeline-types.d.ts +12 -4
- package/dist/shell/pipeline-types.d.ts.map +1 -1
- package/dist/shell/ref-commands.js +7 -7
- package/dist/shell/ref-commands.js.map +1 -1
- package/dist/shell/ref-resolver.d.ts +15 -15
- package/dist/shell/ref-resolver.d.ts.map +1 -1
- package/dist/shell/ref-resolver.js +34 -20
- package/dist/shell/ref-resolver.js.map +1 -1
- package/dist/shell/repl.d.ts +25 -0
- package/dist/shell/repl.d.ts.map +1 -1
- package/dist/shell/repl.js +285 -51
- package/dist/shell/repl.js.map +1 -1
- package/dist/shell/router-commands.d.ts +30 -0
- package/dist/shell/router-commands.d.ts.map +1 -1
- package/dist/shell/router-commands.js +1011 -62
- package/dist/shell/router-commands.js.map +1 -1
- package/dist/shell/selector.d.ts +1 -1
- package/dist/shell/selector.d.ts.map +1 -1
- package/dist/shell/selector.js +1 -1
- package/dist/shell/selector.js.map +1 -1
- package/dist/shell/types.d.ts.map +1 -1
- package/dist/shell/types.js +3 -1
- package/dist/shell/types.js.map +1 -1
- package/dist/shell/where-command.d.ts.map +1 -1
- package/dist/shell/where-command.js +19 -3
- package/dist/shell/where-command.js.map +1 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +7 -1
- package/dist/utils/output.js.map +1 -1
- package/package.json +2 -2
package/README.ja.md
CHANGED
|
@@ -24,6 +24,7 @@ proofscan は MCP (Model Context Protocol) サーバー通信の完全な可視
|
|
|
24
24
|
- 🐚 **[シェルモードガイド](docs/SHELL.ja.md)** - 対話型シェルと @参照
|
|
25
25
|
- 🎭 **[プロキシガイド](docs/PROXY.ja.md)** - MCP プロキシサーバードキュメント
|
|
26
26
|
- 📦 **[POPL ガイド](docs/POPL.ja.md)** - 公開可能証明台帳
|
|
27
|
+
- 🖥️ **[MCP Apps UI](docs/MCP_APPS.ja.md)** - インタラクティブトレースビューア
|
|
27
28
|
- 🔧 **[API ドキュメント](docs/API.ja.md)** - 開発者向け TypeScript API
|
|
28
29
|
|
|
29
30
|
## インストール
|
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ proofscan provides complete visibility into MCP (Model Context Protocol) server
|
|
|
30
30
|
| 📦 **Catalog** | Search and install MCP servers from registry |
|
|
31
31
|
| 📈 **Analyze** | Tool usage analysis across sessions |
|
|
32
32
|
| 📝 **Plans** | Validation plans for automated testing |
|
|
33
|
+
| 🖥️ **MCP Apps** | Interactive trace viewer UI in Claude Desktop |
|
|
33
34
|
| 🌍 **i18n** | Multi-language support (English, 日本語) |
|
|
34
35
|
|
|
35
36
|
## Quick Links
|
|
@@ -41,6 +42,7 @@ proofscan provides complete visibility into MCP (Model Context Protocol) server
|
|
|
41
42
|
- 🎭 **[Proxy Guide](docs/PROXY.md)** ([日本語](docs/PROXY.ja.md)) – MCP proxy server
|
|
42
43
|
- 📦 **[POPL Guide](docs/POPL.md)** ([日本語](docs/POPL.ja.md)) – Public Observable Proof Ledger
|
|
43
44
|
- 🔧 **[MCP Server Setup](docs/MCP_SERVER_SETUP_GUIDE.md)** ([日本語](docs/MCP_SERVER_SETUP_GUIDE.ja.md)) – Setting up MCP servers
|
|
45
|
+
- 🖥️ **[MCP Apps UI](docs/MCP_APPS.md)** ([日本語](docs/MCP_APPS.ja.md)) – Interactive trace viewer UI
|
|
44
46
|
|
|
45
47
|
### For Developers
|
|
46
48
|
|
package/dist/a2a/agent-card.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import type { AgentCard } from './types.js';
|
|
|
7
7
|
export interface FetchAgentCardOptions {
|
|
8
8
|
timeout?: number;
|
|
9
9
|
headers?: Record<string, string>;
|
|
10
|
+
/** Allow private/local URLs (development only) */
|
|
11
|
+
allowLocal?: boolean;
|
|
10
12
|
}
|
|
11
13
|
export interface FetchAgentCardResult {
|
|
12
14
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-card.d.ts","sourceRoot":"","sources":["../../src/a2a/agent-card.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-card.d.ts","sourceRoot":"","sources":["../../src/a2a/agent-card.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiDjD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4BzD;AASD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA4H/B"}
|
package/dist/a2a/agent-card.js
CHANGED
|
@@ -111,7 +111,7 @@ function computeHash(body) {
|
|
|
111
111
|
* @returns FetchAgentCardResult with parsed AgentCard or error
|
|
112
112
|
*/
|
|
113
113
|
export async function fetchAgentCard(url, options = {}) {
|
|
114
|
-
const { timeout = 10000, headers = {} } = options;
|
|
114
|
+
const { timeout = 10000, headers = {}, allowLocal = false } = options;
|
|
115
115
|
const agentCardUrl = normalizeAgentCardUrl(url);
|
|
116
116
|
// Validate URL format
|
|
117
117
|
try {
|
|
@@ -124,7 +124,7 @@ export async function fetchAgentCard(url, options = {}) {
|
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
126
|
// SSRF protection: Block private and local URLs
|
|
127
|
-
if (isPrivateUrl(agentCardUrl)) {
|
|
127
|
+
if (isPrivateUrl(agentCardUrl) && !allowLocal) {
|
|
128
128
|
return {
|
|
129
129
|
ok: false,
|
|
130
130
|
error: 'Private or local URLs are not allowed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-card.js","sourceRoot":"","sources":["../../src/a2a/agent-card.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-card.js","sourceRoot":"","sources":["../../src/a2a/agent-card.ts"],"names":[],"mappings":"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"}
|
package/dist/a2a/client.d.ts
CHANGED
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
* A2A Client
|
|
3
3
|
*
|
|
4
4
|
* Client for sending messages to A2A agents via JSON-RPC 2.0.
|
|
5
|
-
* Implements message/send, tasks/get, and tasks/cancel operations.
|
|
5
|
+
* Implements message/send, tasks/get, tasks/list, and tasks/cancel operations.
|
|
6
6
|
*
|
|
7
7
|
* Phase 4 - Client Implementation
|
|
8
|
+
* Phase 2 - Task Management (getTask, listTasks, cancelTask)
|
|
9
|
+
* Phase 2.4 - Task DB event recording
|
|
8
10
|
*/
|
|
9
|
-
import type { AgentCard, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, StreamMessageResult, A2AMessage, A2ATask } from './types.js';
|
|
10
|
-
|
|
11
|
+
import type { AgentCard, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, StreamMessageResult, A2AMessage, A2ATask, Task, ListTasksParams, ListTasksResponse, AgentCapabilities } from './types.js';
|
|
12
|
+
import type { EventsStore } from '../db/events-store.js';
|
|
13
|
+
export type { A2AMessage, A2ATask, Task, ListTasksParams, ListTasksResponse } from './types.js';
|
|
11
14
|
export interface SendMessageOptions {
|
|
12
15
|
timeout?: number;
|
|
13
16
|
headers?: Record<string, string>;
|
|
@@ -30,6 +33,29 @@ export interface StreamMessageOptions {
|
|
|
30
33
|
onError?: (error: string) => void;
|
|
31
34
|
signal?: AbortSignal;
|
|
32
35
|
}
|
|
36
|
+
export interface GetTaskOptions {
|
|
37
|
+
historyLength?: number;
|
|
38
|
+
headers?: Record<string, string>;
|
|
39
|
+
timeout?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface GetTaskResult {
|
|
42
|
+
ok: boolean;
|
|
43
|
+
task?: Task;
|
|
44
|
+
error?: string;
|
|
45
|
+
statusCode?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface CancelTaskResult {
|
|
48
|
+
ok: boolean;
|
|
49
|
+
task?: Task;
|
|
50
|
+
error?: string;
|
|
51
|
+
statusCode?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ListTasksResult {
|
|
54
|
+
ok: boolean;
|
|
55
|
+
response?: ListTasksResponse;
|
|
56
|
+
error?: string;
|
|
57
|
+
statusCode?: number;
|
|
58
|
+
}
|
|
33
59
|
/**
|
|
34
60
|
* A2A Client for sending messages to agents
|
|
35
61
|
*/
|
|
@@ -37,27 +63,48 @@ export declare class A2AClient {
|
|
|
37
63
|
private baseUrl;
|
|
38
64
|
private defaultHeaders;
|
|
39
65
|
private agentCard;
|
|
66
|
+
private allowLocal;
|
|
67
|
+
private eventsStore?;
|
|
40
68
|
constructor(agentCard: AgentCard, options?: {
|
|
41
69
|
headers?: Record<string, string>;
|
|
70
|
+
allowLocal?: boolean;
|
|
71
|
+
eventsStore?: EventsStore;
|
|
42
72
|
});
|
|
73
|
+
/**
|
|
74
|
+
* Get EventsStore instance (Phase 2.4)
|
|
75
|
+
* @private
|
|
76
|
+
*/
|
|
77
|
+
private getEventsStore;
|
|
43
78
|
/**
|
|
44
79
|
* Send a message to the agent
|
|
45
80
|
* POST /message/send (JSON-RPC 2.0)
|
|
46
81
|
*/
|
|
47
82
|
sendMessage(message: string | A2AMessage, options?: SendMessageOptions): Promise<SendMessageResult>;
|
|
48
83
|
/**
|
|
49
|
-
* Get task
|
|
50
|
-
* POST /
|
|
84
|
+
* Get task by ID (Phase 2 - A2A Protocol Compliant)
|
|
85
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
86
|
+
*
|
|
87
|
+
* @param taskId - The task ID to retrieve
|
|
88
|
+
* @param options - Optional: historyLength, headers, timeout
|
|
89
|
+
* @returns Promise<GetTaskResult> with task or error
|
|
90
|
+
*/
|
|
91
|
+
getTask(taskId: string, options?: GetTaskOptions): Promise<GetTaskResult>;
|
|
92
|
+
/**
|
|
93
|
+
* List tasks with optional filters (Phase 2)
|
|
94
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
95
|
+
*
|
|
96
|
+
* @param params - Optional: contextId, status, pageSize, pageToken, includeArtifacts
|
|
97
|
+
* @returns Promise<ListTasksResult> with tasks list or error
|
|
51
98
|
*/
|
|
52
|
-
|
|
99
|
+
listTasks(params?: ListTasksParams): Promise<ListTasksResult>;
|
|
53
100
|
/**
|
|
54
|
-
* Cancel a task
|
|
55
|
-
* POST /
|
|
101
|
+
* Cancel a task (Phase 2 - A2A Protocol Compliant)
|
|
102
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
103
|
+
*
|
|
104
|
+
* @param taskId - The task ID to cancel
|
|
105
|
+
* @returns Promise<CancelTaskResult> with canceled task or error
|
|
56
106
|
*/
|
|
57
|
-
cancelTask(taskId: string): Promise<
|
|
58
|
-
ok: boolean;
|
|
59
|
-
error?: string;
|
|
60
|
-
}>;
|
|
107
|
+
cancelTask(taskId: string): Promise<CancelTaskResult>;
|
|
61
108
|
/**
|
|
62
109
|
* Stream message to agent
|
|
63
110
|
* POST /message/stream (JSON-RPC 2.0 + SSE response)
|
|
@@ -104,4 +151,19 @@ export declare function createA2AClient(configDir: string, agentId: string): Pro
|
|
|
104
151
|
ok: false;
|
|
105
152
|
error: string;
|
|
106
153
|
}>;
|
|
154
|
+
/**
|
|
155
|
+
* Probe agent capabilities (Phase 2.5)
|
|
156
|
+
*
|
|
157
|
+
* Detects agent capabilities by:
|
|
158
|
+
* 1. Checking Agent Card capabilities field (if present)
|
|
159
|
+
* 2. Probing tasks/list endpoint to detect task support
|
|
160
|
+
*
|
|
161
|
+
* Note: Streaming capability is only detected from Agent Card, not probed,
|
|
162
|
+
* because SSE probing is more complex and unreliable.
|
|
163
|
+
*
|
|
164
|
+
* @param agentCard - The agent's Agent Card
|
|
165
|
+
* @param _allowLocal - Reserved for future use (URL validation)
|
|
166
|
+
* @returns Promise<AgentCapabilities> with detected capabilities
|
|
167
|
+
*/
|
|
168
|
+
export declare function probeCapabilities(agentCard: AgentCard, _allowLocal?: boolean): Promise<AgentCapabilities>;
|
|
107
169
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/a2a/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAe,qBAAqB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhN,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAwBhG,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAc;gBAGhC,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B;IAmBH;;;OAGG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC;IAgJ7B;;;;;;;OAOG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgGnF;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA8FnE;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8E3D;;;OAGG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC;IAoI/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAgCjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,OAAO,CAAC,SAAS;IA4BjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAiB3B;AAQD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAC/B,CA6DA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,EACpB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAsD5B"}
|
package/dist/a2a/client.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* A2A Client
|
|
3
3
|
*
|
|
4
4
|
* Client for sending messages to A2A agents via JSON-RPC 2.0.
|
|
5
|
-
* Implements message/send, tasks/get, and tasks/cancel operations.
|
|
5
|
+
* Implements message/send, tasks/get, tasks/list, and tasks/cancel operations.
|
|
6
6
|
*
|
|
7
7
|
* Phase 4 - Client Implementation
|
|
8
|
+
* Phase 2 - Task Management (getTask, listTasks, cancelTask)
|
|
9
|
+
* Phase 2.4 - Task DB event recording
|
|
8
10
|
*/
|
|
9
11
|
import { randomUUID } from 'crypto';
|
|
10
12
|
import { isPrivateUrl } from './agent-card.js';
|
|
@@ -18,11 +20,15 @@ export class A2AClient {
|
|
|
18
20
|
baseUrl;
|
|
19
21
|
defaultHeaders;
|
|
20
22
|
agentCard;
|
|
23
|
+
allowLocal;
|
|
24
|
+
eventsStore; // Phase 2.4: Optional events store for task event recording
|
|
21
25
|
constructor(agentCard, options) {
|
|
22
26
|
this.agentCard = agentCard;
|
|
23
27
|
this.baseUrl = agentCard.url.replace(/\/$/, '');
|
|
28
|
+
this.allowLocal = options?.allowLocal ?? false;
|
|
29
|
+
this.eventsStore = options?.eventsStore; // Phase 2.4
|
|
24
30
|
// SSRF protection: Block private URLs in constructor
|
|
25
|
-
if (isPrivateUrl(this.baseUrl)) {
|
|
31
|
+
if (isPrivateUrl(this.baseUrl) && !this.allowLocal) {
|
|
26
32
|
throw new Error('Private or local URLs are not allowed');
|
|
27
33
|
}
|
|
28
34
|
this.defaultHeaders = {
|
|
@@ -31,16 +37,24 @@ export class A2AClient {
|
|
|
31
37
|
...options?.headers,
|
|
32
38
|
};
|
|
33
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Get EventsStore instance (Phase 2.4)
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
getEventsStore() {
|
|
45
|
+
return this.eventsStore;
|
|
46
|
+
}
|
|
34
47
|
/**
|
|
35
48
|
* Send a message to the agent
|
|
36
49
|
* POST /message/send (JSON-RPC 2.0)
|
|
37
50
|
*/
|
|
38
51
|
async sendMessage(message, options = {}) {
|
|
39
52
|
const { timeout = 30000, headers = {}, blocking = false } = options;
|
|
40
|
-
// Convert string message to A2AMessage
|
|
53
|
+
// Convert string message to A2AMessage with unique messageId
|
|
54
|
+
const messageId = randomUUID();
|
|
41
55
|
const a2aMessage = typeof message === 'string'
|
|
42
|
-
? { role: 'user', parts: [{ text: message }] }
|
|
43
|
-
: message;
|
|
56
|
+
? { role: 'user', parts: [{ text: message }], messageId }
|
|
57
|
+
: { ...message, messageId: message.messageId ?? messageId };
|
|
44
58
|
// Build JSON-RPC request with unique ID
|
|
45
59
|
const requestId = randomUUID();
|
|
46
60
|
const request = {
|
|
@@ -57,13 +71,13 @@ export class A2AClient {
|
|
|
57
71
|
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
58
72
|
try {
|
|
59
73
|
// SSRF protection (defense-in-depth): Double-check URL even though constructor validates
|
|
60
|
-
if (isPrivateUrl(this.baseUrl)) {
|
|
74
|
+
if (isPrivateUrl(this.baseUrl) && !this.allowLocal) {
|
|
61
75
|
return {
|
|
62
76
|
ok: false,
|
|
63
77
|
error: 'Private or local URLs are not allowed',
|
|
64
78
|
};
|
|
65
79
|
}
|
|
66
|
-
const response = await fetch(
|
|
80
|
+
const response = await fetch(this.baseUrl, {
|
|
67
81
|
method: 'POST',
|
|
68
82
|
headers: { ...this.defaultHeaders, ...headers },
|
|
69
83
|
body: JSON.stringify(request),
|
|
@@ -163,26 +177,34 @@ export class A2AClient {
|
|
|
163
177
|
}
|
|
164
178
|
}
|
|
165
179
|
/**
|
|
166
|
-
* Get task
|
|
167
|
-
* POST /
|
|
180
|
+
* Get task by ID (Phase 2 - A2A Protocol Compliant)
|
|
181
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
182
|
+
*
|
|
183
|
+
* @param taskId - The task ID to retrieve
|
|
184
|
+
* @param options - Optional: historyLength, headers, timeout
|
|
185
|
+
* @returns Promise<GetTaskResult> with task or error
|
|
168
186
|
*/
|
|
169
|
-
async getTask(taskId) {
|
|
187
|
+
async getTask(taskId, options = {}) {
|
|
188
|
+
const { historyLength, headers = {}, timeout = 30000 } = options;
|
|
170
189
|
const requestId = randomUUID();
|
|
171
190
|
const request = {
|
|
172
191
|
jsonrpc: '2.0',
|
|
173
192
|
id: requestId,
|
|
174
193
|
method: 'tasks/get',
|
|
175
194
|
params: {
|
|
176
|
-
|
|
195
|
+
id: taskId,
|
|
196
|
+
...(historyLength !== undefined && { historyLength }),
|
|
177
197
|
},
|
|
178
198
|
};
|
|
199
|
+
const controller = new AbortController();
|
|
200
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
179
201
|
try {
|
|
180
|
-
const response = await fetch(
|
|
202
|
+
const response = await fetch(this.baseUrl, {
|
|
181
203
|
method: 'POST',
|
|
182
|
-
headers: this.defaultHeaders,
|
|
204
|
+
headers: { ...this.defaultHeaders, ...headers },
|
|
183
205
|
body: JSON.stringify(request),
|
|
206
|
+
signal: controller.signal,
|
|
184
207
|
});
|
|
185
|
-
// Validate Content-Type
|
|
186
208
|
const contentType = response.headers.get('content-type');
|
|
187
209
|
if (!contentType?.includes('application/json')) {
|
|
188
210
|
return {
|
|
@@ -192,7 +214,6 @@ export class A2AClient {
|
|
|
192
214
|
};
|
|
193
215
|
}
|
|
194
216
|
const responseText = await response.text();
|
|
195
|
-
// Validate response size
|
|
196
217
|
if (responseText.length > MAX_RESPONSE_SIZE) {
|
|
197
218
|
return {
|
|
198
219
|
ok: false,
|
|
@@ -228,6 +249,105 @@ export class A2AClient {
|
|
|
228
249
|
const task = this.parseTask(responseData.result);
|
|
229
250
|
return { ok: true, task };
|
|
230
251
|
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof Error) {
|
|
254
|
+
if (error.name === 'AbortError') {
|
|
255
|
+
return {
|
|
256
|
+
ok: false,
|
|
257
|
+
error: `Request timeout after ${timeout}ms`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
ok: false,
|
|
262
|
+
error: error.message,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
ok: false,
|
|
267
|
+
error: String(error),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
clearTimeout(timeoutId);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* List tasks with optional filters (Phase 2)
|
|
276
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
277
|
+
*
|
|
278
|
+
* @param params - Optional: contextId, status, pageSize, pageToken, includeArtifacts
|
|
279
|
+
* @returns Promise<ListTasksResult> with tasks list or error
|
|
280
|
+
*/
|
|
281
|
+
async listTasks(params) {
|
|
282
|
+
const requestId = randomUUID();
|
|
283
|
+
const request = {
|
|
284
|
+
jsonrpc: '2.0',
|
|
285
|
+
id: requestId,
|
|
286
|
+
method: 'tasks/list',
|
|
287
|
+
params: (params || {}),
|
|
288
|
+
};
|
|
289
|
+
try {
|
|
290
|
+
const response = await fetch(this.baseUrl, {
|
|
291
|
+
method: 'POST',
|
|
292
|
+
headers: this.defaultHeaders,
|
|
293
|
+
body: JSON.stringify(request),
|
|
294
|
+
});
|
|
295
|
+
const contentType = response.headers.get('content-type');
|
|
296
|
+
if (!contentType?.includes('application/json')) {
|
|
297
|
+
return {
|
|
298
|
+
ok: false,
|
|
299
|
+
statusCode: response.status,
|
|
300
|
+
error: `Expected JSON response, got ${contentType || 'unknown'}`,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const responseText = await response.text();
|
|
304
|
+
if (responseText.length > MAX_RESPONSE_SIZE) {
|
|
305
|
+
return {
|
|
306
|
+
ok: false,
|
|
307
|
+
statusCode: response.status,
|
|
308
|
+
error: `Response too large: ${responseText.length} bytes (max ${MAX_RESPONSE_SIZE})`,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
let responseData;
|
|
312
|
+
try {
|
|
313
|
+
responseData = JSON.parse(responseText);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return {
|
|
317
|
+
ok: false,
|
|
318
|
+
statusCode: response.status,
|
|
319
|
+
error: `Invalid JSON response: ${responseText.slice(0, 200)}`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
if (responseData.error) {
|
|
323
|
+
return {
|
|
324
|
+
ok: false,
|
|
325
|
+
statusCode: response.status,
|
|
326
|
+
error: `${responseData.error.code}: ${responseData.error.message}`,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
if (!responseData.result) {
|
|
330
|
+
return {
|
|
331
|
+
ok: false,
|
|
332
|
+
statusCode: response.status,
|
|
333
|
+
error: 'No result in response',
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const result = responseData.result;
|
|
337
|
+
const tasks = [];
|
|
338
|
+
if (Array.isArray(result.tasks)) {
|
|
339
|
+
for (const taskData of result.tasks) {
|
|
340
|
+
tasks.push(this.parseTask(taskData));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
const listResponse = {
|
|
344
|
+
tasks,
|
|
345
|
+
nextPageToken: result.nextPageToken ? String(result.nextPageToken) : '',
|
|
346
|
+
pageSize: typeof result.pageSize === 'number' ? result.pageSize : 50,
|
|
347
|
+
totalSize: typeof result.totalSize === 'number' ? result.totalSize : undefined,
|
|
348
|
+
};
|
|
349
|
+
return { ok: true, response: listResponse };
|
|
350
|
+
}
|
|
231
351
|
catch (error) {
|
|
232
352
|
if (error instanceof Error) {
|
|
233
353
|
return {
|
|
@@ -242,8 +362,11 @@ export class A2AClient {
|
|
|
242
362
|
}
|
|
243
363
|
}
|
|
244
364
|
/**
|
|
245
|
-
* Cancel a task
|
|
246
|
-
* POST /
|
|
365
|
+
* Cancel a task (Phase 2 - A2A Protocol Compliant)
|
|
366
|
+
* POST /a2a (JSON-RPC 2.0)
|
|
367
|
+
*
|
|
368
|
+
* @param taskId - The task ID to cancel
|
|
369
|
+
* @returns Promise<CancelTaskResult> with canceled task or error
|
|
247
370
|
*/
|
|
248
371
|
async cancelTask(taskId) {
|
|
249
372
|
const requestId = randomUUID();
|
|
@@ -252,28 +375,28 @@ export class A2AClient {
|
|
|
252
375
|
id: requestId,
|
|
253
376
|
method: 'tasks/cancel',
|
|
254
377
|
params: {
|
|
255
|
-
|
|
378
|
+
id: taskId,
|
|
256
379
|
},
|
|
257
380
|
};
|
|
258
381
|
try {
|
|
259
|
-
const response = await fetch(
|
|
382
|
+
const response = await fetch(this.baseUrl, {
|
|
260
383
|
method: 'POST',
|
|
261
384
|
headers: this.defaultHeaders,
|
|
262
385
|
body: JSON.stringify(request),
|
|
263
386
|
});
|
|
264
|
-
// Validate Content-Type
|
|
265
387
|
const contentType = response.headers.get('content-type');
|
|
266
388
|
if (!contentType?.includes('application/json')) {
|
|
267
389
|
return {
|
|
268
390
|
ok: false,
|
|
391
|
+
statusCode: response.status,
|
|
269
392
|
error: `Expected JSON response, got ${contentType || 'unknown'}`,
|
|
270
393
|
};
|
|
271
394
|
}
|
|
272
395
|
const responseText = await response.text();
|
|
273
|
-
// Validate response size
|
|
274
396
|
if (responseText.length > MAX_RESPONSE_SIZE) {
|
|
275
397
|
return {
|
|
276
398
|
ok: false,
|
|
399
|
+
statusCode: response.status,
|
|
277
400
|
error: `Response too large: ${responseText.length} bytes (max ${MAX_RESPONSE_SIZE})`,
|
|
278
401
|
};
|
|
279
402
|
}
|
|
@@ -284,15 +407,22 @@ export class A2AClient {
|
|
|
284
407
|
catch {
|
|
285
408
|
return {
|
|
286
409
|
ok: false,
|
|
410
|
+
statusCode: response.status,
|
|
287
411
|
error: `Invalid JSON response: ${responseText.slice(0, 200)}`,
|
|
288
412
|
};
|
|
289
413
|
}
|
|
290
414
|
if (responseData.error) {
|
|
291
415
|
return {
|
|
292
416
|
ok: false,
|
|
417
|
+
statusCode: response.status,
|
|
293
418
|
error: `${responseData.error.code}: ${responseData.error.message}`,
|
|
294
419
|
};
|
|
295
420
|
}
|
|
421
|
+
// Parse the canceled task from response
|
|
422
|
+
if (responseData.result) {
|
|
423
|
+
const task = this.parseTask(responseData.result);
|
|
424
|
+
return { ok: true, task };
|
|
425
|
+
}
|
|
296
426
|
return { ok: true };
|
|
297
427
|
}
|
|
298
428
|
catch (error) {
|
|
@@ -334,7 +464,7 @@ export class A2AClient {
|
|
|
334
464
|
}
|
|
335
465
|
try {
|
|
336
466
|
// SSRF protection (defense-in-depth)
|
|
337
|
-
if (isPrivateUrl(this.baseUrl)) {
|
|
467
|
+
if (isPrivateUrl(this.baseUrl) && !this.allowLocal) {
|
|
338
468
|
return {
|
|
339
469
|
ok: false,
|
|
340
470
|
error: 'Private or local URLs are not allowed',
|
|
@@ -435,9 +565,11 @@ export class A2AClient {
|
|
|
435
565
|
updatedAt: data.updatedAt ? String(data.updatedAt) : undefined,
|
|
436
566
|
contextId: data.contextId ? String(data.contextId) : undefined,
|
|
437
567
|
};
|
|
438
|
-
// Parse messages
|
|
439
|
-
|
|
440
|
-
|
|
568
|
+
// Parse messages (A2A uses 'history' field, some agents use 'messages')
|
|
569
|
+
const messageList = Array.isArray(data.history) ? data.history :
|
|
570
|
+
Array.isArray(data.messages) ? data.messages : [];
|
|
571
|
+
if (messageList.length > 0) {
|
|
572
|
+
task.messages = messageList.map(msg => this.parseMessage(msg));
|
|
441
573
|
}
|
|
442
574
|
// Parse artifacts
|
|
443
575
|
if (Array.isArray(data.artifacts)) {
|
|
@@ -460,7 +592,8 @@ export class A2AClient {
|
|
|
460
592
|
}
|
|
461
593
|
const obj = data;
|
|
462
594
|
const message = {
|
|
463
|
-
|
|
595
|
+
// A2A protocol uses 'agent' for assistant responses
|
|
596
|
+
role: (obj.role === 'assistant' || obj.role === 'agent') ? 'assistant' : 'user',
|
|
464
597
|
parts: [],
|
|
465
598
|
metadata: obj.metadata,
|
|
466
599
|
contextId: obj.contextId ? String(obj.contextId) : undefined,
|
|
@@ -629,7 +762,7 @@ export async function createA2AClient(configDir, agentId) {
|
|
|
629
762
|
}
|
|
630
763
|
else {
|
|
631
764
|
// Fetch fresh agent card
|
|
632
|
-
const fetchResult = await fetchAgentCard(config.url);
|
|
765
|
+
const fetchResult = await fetchAgentCard(config.url, { allowLocal: config.allow_local ?? false });
|
|
633
766
|
if (!fetchResult.ok || !fetchResult.agentCard) {
|
|
634
767
|
return {
|
|
635
768
|
ok: false,
|
|
@@ -648,8 +781,74 @@ export async function createA2AClient(configDir, agentId) {
|
|
|
648
781
|
expiresAt,
|
|
649
782
|
});
|
|
650
783
|
}
|
|
651
|
-
// Create client
|
|
652
|
-
const client = new A2AClient(agentCard);
|
|
784
|
+
// Create client with allowLocal from config
|
|
785
|
+
const client = new A2AClient(agentCard, { allowLocal: config.allow_local ?? false });
|
|
653
786
|
return { ok: true, client, agentCard };
|
|
654
787
|
}
|
|
788
|
+
/**
|
|
789
|
+
* Probe agent capabilities (Phase 2.5)
|
|
790
|
+
*
|
|
791
|
+
* Detects agent capabilities by:
|
|
792
|
+
* 1. Checking Agent Card capabilities field (if present)
|
|
793
|
+
* 2. Probing tasks/list endpoint to detect task support
|
|
794
|
+
*
|
|
795
|
+
* Note: Streaming capability is only detected from Agent Card, not probed,
|
|
796
|
+
* because SSE probing is more complex and unreliable.
|
|
797
|
+
*
|
|
798
|
+
* @param agentCard - The agent's Agent Card
|
|
799
|
+
* @param _allowLocal - Reserved for future use (URL validation)
|
|
800
|
+
* @returns Promise<AgentCapabilities> with detected capabilities
|
|
801
|
+
*/
|
|
802
|
+
export async function probeCapabilities(agentCard, _allowLocal = false) {
|
|
803
|
+
// Default capabilities (all false)
|
|
804
|
+
const capabilities = {
|
|
805
|
+
tasks: false,
|
|
806
|
+
streaming: false,
|
|
807
|
+
};
|
|
808
|
+
// First, check Agent Card capabilities field (if present)
|
|
809
|
+
// This is the authoritative source if provided by the agent
|
|
810
|
+
if (agentCard.capabilities) {
|
|
811
|
+
if (agentCard.capabilities.streaming !== undefined) {
|
|
812
|
+
capabilities.streaming = agentCard.capabilities.streaming;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
// Probe tasks/list endpoint
|
|
816
|
+
try {
|
|
817
|
+
const response = await fetch(agentCard.url, {
|
|
818
|
+
method: 'POST',
|
|
819
|
+
headers: {
|
|
820
|
+
'Content-Type': 'application/json',
|
|
821
|
+
},
|
|
822
|
+
body: JSON.stringify({
|
|
823
|
+
jsonrpc: '2.0',
|
|
824
|
+
id: 'probe-tasks',
|
|
825
|
+
method: 'tasks/list',
|
|
826
|
+
params: {},
|
|
827
|
+
}),
|
|
828
|
+
signal: AbortSignal.timeout(5000), // 5 second timeout for probe
|
|
829
|
+
});
|
|
830
|
+
// Check for successful JSON-RPC response
|
|
831
|
+
// A 200 with { "error": { "code": -32601, ... } } means method not found
|
|
832
|
+
if (response.ok) {
|
|
833
|
+
try {
|
|
834
|
+
const data = await response.json();
|
|
835
|
+
// Only set tasks=true if we get a result (not a JSON-RPC error)
|
|
836
|
+
if (data.result !== undefined && !data.error) {
|
|
837
|
+
capabilities.tasks = true;
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
catch {
|
|
841
|
+
// If we can't parse JSON, assume tasks not supported
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
catch {
|
|
846
|
+
// On network error or timeout, assume tasks not supported (keep false)
|
|
847
|
+
}
|
|
848
|
+
// Note: We don't probe message/stream here because:
|
|
849
|
+
// 1. It's more complex (SSE)
|
|
850
|
+
// 2. The Agent Card capabilities field is the preferred source
|
|
851
|
+
// 3. Most A2A agents that support tasks also support streaming
|
|
852
|
+
return capabilities;
|
|
853
|
+
}
|
|
655
854
|
//# sourceMappingURL=client.js.map
|