@aramisfa/openclaw-a2a-outbound 4.0.0 → 4.1.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 CHANGED
@@ -1,8 +1,20 @@
1
1
  # @aramisfa/openclaw-a2a-outbound
2
2
 
3
- Native OpenClaw outbound A2A delegation plugin.
3
+ OpenClaw outbound A2A delegation plugin with a zero-config local onboarding CLI.
4
4
 
5
- This package registers exactly one optional OpenClaw tool, `remote_agent`. The tool exposes five actions: `list_targets`, `send`, `watch`, `status`, and `cancel`.
5
+ ```bash
6
+ openclaw plugins install @aramisfa/openclaw-a2a-outbound
7
+ openclaw a2a demo run
8
+ ```
9
+
10
+ `openclaw a2a demo run` starts the packaged local demo peer, configures a temporary `local-demo` target in memory, exercises `list_targets`, task-bearing `send`, `watch`, `status`, and continuation replay, then prints the returned `summary.continuation`.
11
+
12
+ This package registers:
13
+
14
+ - the `openclaw a2a` CLI family for demos and diagnostics
15
+ - one optional OpenClaw tool, `remote_agent`, with actions `list_targets`, `send`, `watch`, `status`, and `cancel`
16
+
17
+ For a raw payload walkthrough, see [../../docs/quickstart.md](../../docs/quickstart.md).
6
18
 
7
19
  ## Installation
8
20
 
@@ -36,7 +48,19 @@ The ClawHub skill is an optional guided setup helper for installing, enabling, c
36
48
  ## Requirements
37
49
 
38
50
  - Node.js `>=22.12.0`
39
- - OpenClaw `2026.3.2`
51
+ - OpenClaw `2026.4.15`
52
+
53
+ ## CLI
54
+
55
+ ```bash
56
+ openclaw a2a demo run [--json] [--write-continuation <path>]
57
+ openclaw a2a demo serve [--port <port>] [--json]
58
+ openclaw a2a doctor [--alias <alias>] [--json]
59
+ ```
60
+
61
+ - `demo run`: self-contained first-success path.
62
+ - `demo serve`: long-lived local peer that prints exact config commands and raw `remote_agent` payloads.
63
+ - `doctor`: read-only install/config/target/card diagnostics for real targets.
40
64
 
41
65
  ## OpenClaw Plugin Config
42
66
 
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ configSchema: import("openclaw/plugin-sdk/plugin-entry").OpenClawPluginConfigSchema;
6
+ register: NonNullable<import("openclaw/plugin-sdk/plugin-entry").OpenClawPluginDefinition["register"]>;
7
+ } & Pick<import("openclaw/plugin-sdk/plugin-entry").OpenClawPluginDefinition, "kind" | "reload" | "nodeHostCommands" | "securityAuditCollectors">;
8
+ export default _default;
9
+ //# sourceMappingURL=cli-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-metadata.d.ts","sourceRoot":"","sources":["../src/cli-metadata.ts"],"names":[],"mappings":";;;;;;;AAQA,wBA6BG"}
@@ -0,0 +1,29 @@
1
+ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
2
+ import { registerA2ACli } from "./cli.js";
3
+ import { A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA, } from "./config.js";
4
+ import { PLUGIN_ID } from "./constants.js";
5
+ export default definePluginEntry({
6
+ id: PLUGIN_ID,
7
+ name: "External A2A Delegation CLI Metadata",
8
+ description: "Registers the OpenClaw a2a CLI during command discovery.",
9
+ configSchema: A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA,
10
+ register(api) {
11
+ const config = A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA.parse?.(api.pluginConfig ?? {});
12
+ api.registerCli?.(({ program }) => {
13
+ registerA2ACli(program, {
14
+ pluginConfig: config,
15
+ rootConfig: api.config,
16
+ });
17
+ }, {
18
+ commands: ["a2a"],
19
+ descriptors: [
20
+ {
21
+ name: "a2a",
22
+ description: "A2A outbound demo and diagnostics",
23
+ hasSubcommands: true,
24
+ },
25
+ ],
26
+ });
27
+ },
28
+ });
29
+ //# sourceMappingURL=cli-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-metadata.js","sourceRoot":"","sources":["../src/cli-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,mCAAmC,GAEpC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,eAAe,iBAAiB,CAAC;IAC/B,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,sCAAsC;IAC5C,WAAW,EAAE,0DAA0D;IACvE,YAAY,EAAE,mCAAmC;IACjD,QAAQ,CAAC,GAAG;QACV,MAAM,MAAM,GAAG,mCAAmC,CAAC,KAAK,EAAE,CACxD,GAAG,CAAC,YAAY,IAAI,EAAE,CACI,CAAC;QAE7B,GAAG,CAAC,WAAW,EAAE,CACf,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;YACpC,cAAc,CAAC,OAA+C,EAAE;gBAC9D,YAAY,EAAE,MAAM;gBACpB,UAAU,EAAE,GAAG,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,QAAQ,EAAE,CAAC,KAAK,CAAC;YACjB,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,mCAAmC;oBAChD,cAAc,EAAE,IAAI;iBACrB;aACF;SACF,CACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ import { LOCAL_DEMO_ALIAS, type StartedDemoPeer } from "./demo-peer.js";
2
+ import type { A2AOutboundPluginConfig } from "./config.js";
3
+ import type { RemoteAgentSummary } from "./result-shape.js";
4
+ type CliCommand = {
5
+ description(value: string): CliCommand;
6
+ command(value: string): CliCommand;
7
+ argument?(flags: string, description?: string): CliCommand;
8
+ option(flags: string, description?: string, defaultValue?: unknown): CliCommand;
9
+ action(handler: (opts: CommandOptions) => unknown): CliCommand;
10
+ };
11
+ type CliProgram = {
12
+ command(value: string): CliCommand;
13
+ };
14
+ type RegisterA2ACliOptions = {
15
+ pluginConfig: A2AOutboundPluginConfig;
16
+ rootConfig?: unknown;
17
+ };
18
+ type CommandOptions = Record<string, unknown>;
19
+ export type DemoRunOptions = {
20
+ writeContinuation?: string;
21
+ };
22
+ export type DemoRunStep = {
23
+ name: "list_targets" | "send" | "watch" | "status" | "continuation_send";
24
+ ok: boolean;
25
+ summary?: RemoteAgentSummary;
26
+ error?: unknown;
27
+ };
28
+ export type DemoRunResult = {
29
+ ok: boolean;
30
+ peer: {
31
+ base_url: string;
32
+ agent_card_url: string;
33
+ json_rpc_url: string;
34
+ };
35
+ alias: typeof LOCAL_DEMO_ALIAS;
36
+ steps: DemoRunStep[];
37
+ continuation?: NonNullable<RemoteAgentSummary["continuation"]>;
38
+ continuation_path?: string;
39
+ };
40
+ export type DemoServeInstructions = {
41
+ base_url: string;
42
+ agent_card_url: string;
43
+ json_rpc_url: string;
44
+ commands: {
45
+ configure_target: string;
46
+ };
47
+ remote_agent_payloads: {
48
+ list_targets: Record<string, unknown>;
49
+ send: Record<string, unknown>;
50
+ watch: Record<string, unknown>;
51
+ status: Record<string, unknown>;
52
+ continuation_replay: Record<string, unknown>;
53
+ };
54
+ };
55
+ export type DoctorCheck = {
56
+ name: "plugin_cli_loaded" | "plugins_global_enabled" | "plugin_entry_enabled" | "plugin_config_enabled" | "target_present" | "agent_card_reachable";
57
+ status: "pass" | "fail" | "warn";
58
+ message: string;
59
+ details?: Record<string, unknown>;
60
+ };
61
+ export type DoctorResult = {
62
+ ok: boolean;
63
+ alias: string;
64
+ checks: DoctorCheck[];
65
+ };
66
+ export declare function buildDemoServeInstructions(peer: Pick<StartedDemoPeer, "baseUrl" | "cardUrl" | "jsonRpcUrl">): DemoServeInstructions;
67
+ export declare function runDemoRun(options?: DemoRunOptions): Promise<DemoRunResult>;
68
+ export declare function runDoctor(params: {
69
+ alias?: string;
70
+ pluginConfig: A2AOutboundPluginConfig;
71
+ rootConfig?: unknown;
72
+ }): Promise<DoctorResult>;
73
+ export declare function registerA2ACli(program: CliProgram, options: RegisterA2ACliOptions): void;
74
+ export declare const DEMO_SERVE_PATHS: {
75
+ readonly agentCardPath: "/.well-known/agent-card.json";
76
+ readonly jsonRpcPath: "/a2a/jsonrpc";
77
+ };
78
+ export {};
79
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,gBAAgB,EAGhB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAiB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,KAAK,UAAU,GAAG;IAChB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IACnC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAChF,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,GAAG,UAAU,CAAC;CAChE,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CACpC,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,uBAAuB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,mBAAmB,CAAC;IACzE,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,OAAO,gBAAgB,CAAC;IAC/B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QACR,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,qBAAqB,EAAE;QACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EACA,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAgKF,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,GAChE,qBAAqB,CAiDvB;AAED,wBAAsB,UAAU,CAC9B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA6GxB;AAoED,wBAAsB,SAAS,CAAC,MAAM,EAAE;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,uBAAuB,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiFxB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CAwFN;AAED,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,464 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { A2AOutboundService } from "./service.js";
3
+ import { DEMO_AGENT_CARD_PATH, DEMO_JSON_RPC_PATH, LOCAL_DEMO_ALIAS, createDemoOutboundConfig, startDemoPeerServer, } from "./demo-peer.js";
4
+ import { PLUGIN_ID } from "./constants.js";
5
+ function isRecord(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ function asErrorObject(error) {
9
+ if (error instanceof Error) {
10
+ return {
11
+ name: error.name,
12
+ message: error.message,
13
+ };
14
+ }
15
+ return {
16
+ message: String(error),
17
+ };
18
+ }
19
+ function assertSuccess(step, result) {
20
+ if (result.ok !== true) {
21
+ throw new Error(`${step} failed: ${result.error.message}`);
22
+ }
23
+ return result;
24
+ }
25
+ function shellQuote(value) {
26
+ return `'${value.replaceAll("'", "'\\''")}'`;
27
+ }
28
+ function continuationPlaceholder(baseUrl) {
29
+ return {
30
+ target: {
31
+ target_url: new URL("/", baseUrl).toString(),
32
+ card_path: DEMO_AGENT_CARD_PATH,
33
+ preferred_transports: ["JSONRPC", "HTTP+JSON"],
34
+ target_alias: LOCAL_DEMO_ALIAS,
35
+ },
36
+ task: {
37
+ task_id: "<summary.continuation.task.task_id>",
38
+ task_handle: "<summary.continuation.task.task_handle>",
39
+ },
40
+ conversation: {
41
+ context_id: "<summary.continuation.conversation.context_id>",
42
+ can_send: true,
43
+ },
44
+ };
45
+ }
46
+ function printHumanDemoRun(result) {
47
+ console.log("OpenClaw A2A local demo");
48
+ console.log(`Peer: ${result.peer.base_url}`);
49
+ console.log(`Agent card: ${result.peer.agent_card_url}`);
50
+ console.log(`JSON-RPC: ${result.peer.json_rpc_url}`);
51
+ console.log("");
52
+ for (const step of result.steps) {
53
+ const label = step.ok ? "[ok]" : "[fail]";
54
+ const summaryText = step.summary?.message_text ??
55
+ (step.summary?.targets ? `${step.summary.targets.length} target(s)` : "");
56
+ console.log(`${label} ${step.name}${summaryText ? ` - ${summaryText}` : ""}`);
57
+ }
58
+ if (result.continuation !== undefined) {
59
+ console.log("");
60
+ console.log("Persist this summary.continuation for follow-up:");
61
+ console.log(JSON.stringify(result.continuation, null, 2));
62
+ }
63
+ if (result.continuation_path !== undefined) {
64
+ console.log("");
65
+ console.log(`Continuation written to ${result.continuation_path}`);
66
+ }
67
+ }
68
+ function printHumanServeInstructions(instructions) {
69
+ console.log("OpenClaw A2A local demo peer");
70
+ console.log(`Base URL: ${instructions.base_url}`);
71
+ console.log(`Agent card: ${instructions.agent_card_url}`);
72
+ console.log(`JSON-RPC: ${instructions.json_rpc_url}`);
73
+ console.log("");
74
+ console.log("Configure OpenClaw outbound:");
75
+ console.log(instructions.commands.configure_target);
76
+ console.log("");
77
+ console.log("remote_agent payloads:");
78
+ for (const [name, payload] of Object.entries(instructions.remote_agent_payloads)) {
79
+ console.log("");
80
+ console.log(`${name}:`);
81
+ console.log(JSON.stringify(payload, null, 2));
82
+ }
83
+ }
84
+ function printHumanDoctor(result) {
85
+ console.log(`OpenClaw A2A doctor (${result.alias})`);
86
+ for (const check of result.checks) {
87
+ console.log(`[${check.status}] ${check.name}: ${check.message}`);
88
+ }
89
+ }
90
+ function parsePort(value) {
91
+ if (value === undefined || value === null || value === "") {
92
+ return undefined;
93
+ }
94
+ const parsed = Number(value);
95
+ if (!Number.isInteger(parsed) || parsed < 0 || parsed > 65535) {
96
+ throw new Error(`invalid port: ${String(value)}`);
97
+ }
98
+ return parsed;
99
+ }
100
+ function outputResult(value, json) {
101
+ if (json) {
102
+ console.log(JSON.stringify(value, null, 2));
103
+ }
104
+ }
105
+ async function runCommand(json, run, printHuman) {
106
+ try {
107
+ const result = await run();
108
+ if (json) {
109
+ outputResult(result, true);
110
+ }
111
+ else if (printHuman) {
112
+ printHuman(result);
113
+ }
114
+ }
115
+ catch (error) {
116
+ process.exitCode = 1;
117
+ if (json) {
118
+ console.log(JSON.stringify({
119
+ ok: false,
120
+ error: asErrorObject(error),
121
+ }, null, 2));
122
+ return;
123
+ }
124
+ console.error(error instanceof Error ? error.message : String(error));
125
+ }
126
+ }
127
+ export function buildDemoServeInstructions(peer) {
128
+ const config = createDemoOutboundConfig(peer.baseUrl);
129
+ const configJson = JSON.stringify(config);
130
+ const continuation = continuationPlaceholder(peer.baseUrl);
131
+ return {
132
+ base_url: peer.baseUrl,
133
+ agent_card_url: peer.cardUrl,
134
+ json_rpc_url: peer.jsonRpcUrl,
135
+ commands: {
136
+ configure_target: `openclaw config set plugins.entries.openclaw-a2a-outbound.config ${shellQuote(configJson)} --strict-json`,
137
+ },
138
+ remote_agent_payloads: {
139
+ list_targets: {
140
+ action: "list_targets",
141
+ },
142
+ send: {
143
+ action: "send",
144
+ target_alias: LOCAL_DEMO_ALIAS,
145
+ task_requirement: "required",
146
+ parts: [
147
+ {
148
+ kind: "text",
149
+ text: "Create a durable demo task.",
150
+ },
151
+ ],
152
+ },
153
+ watch: {
154
+ action: "watch",
155
+ continuation,
156
+ },
157
+ status: {
158
+ action: "status",
159
+ continuation,
160
+ },
161
+ continuation_replay: {
162
+ action: "send",
163
+ continuation,
164
+ parts: [
165
+ {
166
+ kind: "text",
167
+ text: "Continue from the persisted continuation.",
168
+ },
169
+ ],
170
+ },
171
+ },
172
+ };
173
+ }
174
+ export async function runDemoRun(options = {}) {
175
+ const peer = await startDemoPeerServer();
176
+ try {
177
+ const service = new A2AOutboundService({
178
+ parsedConfig: createDemoOutboundConfig(peer.baseUrl),
179
+ });
180
+ const steps = [];
181
+ const listTargets = await service.execute({ action: "list_targets" });
182
+ const listTargetsSuccess = assertSuccess("list_targets", listTargets);
183
+ steps.push({
184
+ name: "list_targets",
185
+ ok: true,
186
+ summary: listTargetsSuccess.summary,
187
+ });
188
+ const send = await service.execute({
189
+ action: "send",
190
+ target_alias: LOCAL_DEMO_ALIAS,
191
+ task_requirement: "required",
192
+ message_id: "demo-message-0001",
193
+ parts: [
194
+ {
195
+ kind: "text",
196
+ text: "Create a durable demo task and return a continuation.",
197
+ },
198
+ ],
199
+ });
200
+ const sendSuccess = assertSuccess("send", send);
201
+ steps.push({
202
+ name: "send",
203
+ ok: true,
204
+ summary: sendSuccess.summary,
205
+ });
206
+ const continuation = sendSuccess.summary.continuation;
207
+ if (continuation === undefined) {
208
+ throw new Error("demo send did not return summary.continuation");
209
+ }
210
+ const watch = await service.execute({
211
+ action: "watch",
212
+ continuation,
213
+ });
214
+ const watchSuccess = assertSuccess("watch", watch);
215
+ steps.push({
216
+ name: "watch",
217
+ ok: true,
218
+ summary: watchSuccess.summary,
219
+ });
220
+ const status = await service.execute({
221
+ action: "status",
222
+ continuation,
223
+ });
224
+ const statusSuccess = assertSuccess("status", status);
225
+ steps.push({
226
+ name: "status",
227
+ ok: true,
228
+ summary: statusSuccess.summary,
229
+ });
230
+ const continuationSend = await service.execute({
231
+ action: "send",
232
+ continuation,
233
+ message_id: "demo-message-0002",
234
+ parts: [
235
+ {
236
+ kind: "text",
237
+ text: "Continue from the persisted continuation and close the loop.",
238
+ },
239
+ ],
240
+ });
241
+ const continuationSendSuccess = assertSuccess("continuation_send", continuationSend);
242
+ steps.push({
243
+ name: "continuation_send",
244
+ ok: true,
245
+ summary: continuationSendSuccess.summary,
246
+ });
247
+ if (options.writeContinuation !== undefined) {
248
+ await writeFile(options.writeContinuation, `${JSON.stringify(continuation, null, 2)}\n`, "utf8");
249
+ }
250
+ return {
251
+ ok: true,
252
+ peer: {
253
+ base_url: peer.baseUrl,
254
+ agent_card_url: peer.cardUrl,
255
+ json_rpc_url: peer.jsonRpcUrl,
256
+ },
257
+ alias: LOCAL_DEMO_ALIAS,
258
+ steps,
259
+ continuation,
260
+ ...(options.writeContinuation !== undefined
261
+ ? { continuation_path: options.writeContinuation }
262
+ : {}),
263
+ };
264
+ }
265
+ finally {
266
+ await peer.close();
267
+ }
268
+ }
269
+ function readPluginEntry(rootConfig) {
270
+ if (!isRecord(rootConfig)) {
271
+ return undefined;
272
+ }
273
+ const plugins = rootConfig.plugins;
274
+ if (!isRecord(plugins)) {
275
+ return undefined;
276
+ }
277
+ const entries = plugins.entries;
278
+ if (!isRecord(entries)) {
279
+ return undefined;
280
+ }
281
+ const entry = entries[PLUGIN_ID];
282
+ return isRecord(entry) ? entry : undefined;
283
+ }
284
+ function pluginsGloballyEnabled(rootConfig) {
285
+ return !(isRecord(rootConfig) &&
286
+ isRecord(rootConfig.plugins) &&
287
+ rootConfig.plugins.enabled === false);
288
+ }
289
+ async function probeAgentCard(target) {
290
+ try {
291
+ const response = await fetch(new URL(target.cardPath, target.baseUrl), {
292
+ signal: AbortSignal.timeout(5_000),
293
+ });
294
+ if (!response.ok) {
295
+ return {
296
+ ok: false,
297
+ error: `HTTP ${response.status}`,
298
+ };
299
+ }
300
+ const card = (await response.json());
301
+ if (!isRecord(card) || typeof card.name !== "string") {
302
+ return {
303
+ ok: false,
304
+ error: "agent card response is not a valid object with name",
305
+ };
306
+ }
307
+ return {
308
+ ok: true,
309
+ card,
310
+ };
311
+ }
312
+ catch (error) {
313
+ return {
314
+ ok: false,
315
+ error: error instanceof Error ? error.message : String(error),
316
+ };
317
+ }
318
+ }
319
+ export async function runDoctor(params) {
320
+ const alias = params.alias ?? LOCAL_DEMO_ALIAS;
321
+ const checks = [
322
+ {
323
+ name: "plugin_cli_loaded",
324
+ status: "pass",
325
+ message: `${PLUGIN_ID} registered this command family`,
326
+ },
327
+ {
328
+ name: "plugins_global_enabled",
329
+ status: pluginsGloballyEnabled(params.rootConfig) ? "pass" : "fail",
330
+ message: pluginsGloballyEnabled(params.rootConfig)
331
+ ? "plugins.enabled does not disable plugin loading"
332
+ : "plugins.enabled=false disables plugin loading",
333
+ },
334
+ ];
335
+ const pluginEntry = readPluginEntry(params.rootConfig);
336
+ const pluginEntryEnabled = pluginEntry?.enabled !== false;
337
+ checks.push({
338
+ name: "plugin_entry_enabled",
339
+ status: pluginEntryEnabled ? "pass" : "fail",
340
+ message: pluginEntryEnabled
341
+ ? `plugins.entries.${PLUGIN_ID}.enabled is not false`
342
+ : `plugins.entries.${PLUGIN_ID}.enabled=false`,
343
+ });
344
+ checks.push({
345
+ name: "plugin_config_enabled",
346
+ status: params.pluginConfig.enabled === true ? "pass" : "fail",
347
+ message: params.pluginConfig.enabled === true
348
+ ? `${PLUGIN_ID} config.enabled=true`
349
+ : `${PLUGIN_ID} config.enabled is not true`,
350
+ });
351
+ const target = params.pluginConfig.targets.find((entry) => entry.alias === alias);
352
+ checks.push({
353
+ name: "target_present",
354
+ status: target !== undefined ? "pass" : "fail",
355
+ message: target !== undefined
356
+ ? `target alias "${alias}" is configured`
357
+ : `target alias "${alias}" is not configured`,
358
+ });
359
+ if (target !== undefined) {
360
+ const cardProbe = await probeAgentCard({
361
+ baseUrl: target.baseUrl,
362
+ cardPath: target.cardPath,
363
+ });
364
+ checks.push({
365
+ name: "agent_card_reachable",
366
+ status: cardProbe.ok ? "pass" : "fail",
367
+ message: cardProbe.ok
368
+ ? `agent card reachable at ${new URL(target.cardPath, target.baseUrl).toString()}`
369
+ : `agent card unreachable: ${cardProbe.error}`,
370
+ ...(cardProbe.ok
371
+ ? {
372
+ details: {
373
+ name: cardProbe.card.name,
374
+ protocolVersion: cardProbe.card.protocolVersion,
375
+ },
376
+ }
377
+ : {}),
378
+ });
379
+ }
380
+ else {
381
+ checks.push({
382
+ name: "agent_card_reachable",
383
+ status: "fail",
384
+ message: "no target to probe",
385
+ });
386
+ }
387
+ return {
388
+ ok: checks.every((check) => check.status !== "fail"),
389
+ alias,
390
+ checks,
391
+ };
392
+ }
393
+ export function registerA2ACli(program, options) {
394
+ const a2a = program.command("a2a").description("A2A outbound demo and diagnostics");
395
+ const demo = a2a.command("demo").description("Run local A2A onboarding demos");
396
+ demo
397
+ .command("run")
398
+ .description("Run a zero-config local outbound A2A demo")
399
+ .option("--json", "Output machine-readable JSON", false)
400
+ .option("--write-continuation <path>", "Write the first summary.continuation JSON to a file")
401
+ .action(async (opts) => {
402
+ await runCommand(Boolean(opts.json), () => runDemoRun({
403
+ ...(typeof opts.writeContinuation === "string"
404
+ ? { writeContinuation: opts.writeContinuation }
405
+ : {}),
406
+ }), printHumanDemoRun);
407
+ });
408
+ demo
409
+ .command("serve")
410
+ .description("Serve the deterministic local A2A demo peer")
411
+ .option("--port <port>", "Port to bind; defaults to an ephemeral port")
412
+ .option("--json", "Output machine-readable JSON", false)
413
+ .action(async (opts) => {
414
+ await runCommand(Boolean(opts.json), async () => {
415
+ const peer = await startDemoPeerServer({
416
+ port: parsePort(opts.port),
417
+ });
418
+ const instructions = buildDemoServeInstructions(peer);
419
+ const shutdown = async () => {
420
+ await peer.close();
421
+ };
422
+ process.once("SIGINT", () => {
423
+ void shutdown().finally(() => {
424
+ process.exit(0);
425
+ });
426
+ });
427
+ process.once("SIGTERM", () => {
428
+ void shutdown().finally(() => {
429
+ process.exit(0);
430
+ });
431
+ });
432
+ if (Boolean(opts.json)) {
433
+ console.log(JSON.stringify(instructions, null, 2));
434
+ }
435
+ else {
436
+ printHumanServeInstructions(instructions);
437
+ }
438
+ await new Promise(() => { });
439
+ });
440
+ });
441
+ a2a
442
+ .command("doctor")
443
+ .description("Validate outbound A2A plugin config and target reachability")
444
+ .option("--alias <alias>", "Target alias to inspect", LOCAL_DEMO_ALIAS)
445
+ .option("--json", "Output machine-readable JSON", false)
446
+ .action(async (opts) => {
447
+ await runCommand(Boolean(opts.json), async () => {
448
+ const result = await runDoctor({
449
+ alias: typeof opts.alias === "string" ? opts.alias : LOCAL_DEMO_ALIAS,
450
+ pluginConfig: options.pluginConfig,
451
+ rootConfig: options.rootConfig,
452
+ });
453
+ if (!result.ok) {
454
+ process.exitCode = 1;
455
+ }
456
+ return result;
457
+ }, printHumanDoctor);
458
+ });
459
+ }
460
+ export const DEMO_SERVE_PATHS = {
461
+ agentCardPath: DEMO_AGENT_CARD_PATH,
462
+ jsonRpcPath: DEMO_JSON_RPC_PATH,
463
+ };
464
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Task } from "@a2a-js/sdk";
2
+ import type { A2AOutboundPluginConfig } from "./config.js";
3
+ export declare const LOCAL_DEMO_ALIAS: "local-demo";
4
+ export declare const DEMO_AGENT_CARD_PATH: "/.well-known/agent-card.json";
5
+ export declare const DEMO_JSON_RPC_PATH: "/a2a/jsonrpc";
6
+ export declare const DEMO_PROTOCOL_VERSION: "0.3.0";
7
+ export declare const DEMO_AGENT_NAME: "OpenClaw A2A Local Demo Peer";
8
+ export type DemoPeerSnapshot = {
9
+ taskCount: number;
10
+ tasks: Task[];
11
+ };
12
+ export type StartedDemoPeer = {
13
+ baseUrl: string;
14
+ cardUrl: string;
15
+ jsonRpcUrl: string;
16
+ close(): Promise<void>;
17
+ snapshot(): DemoPeerSnapshot;
18
+ };
19
+ export type StartDemoPeerOptions = {
20
+ host?: string;
21
+ port?: number;
22
+ };
23
+ export declare function createDemoOutboundConfig(baseUrl: string): A2AOutboundPluginConfig;
24
+ export declare function startDemoPeerServer(options?: StartDemoPeerOptions): Promise<StartedDemoPeer>;
25
+ //# sourceMappingURL=demo-peer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-peer.d.ts","sourceRoot":"","sources":["../src/demo-peer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,IAAI,EAKL,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,eAAO,MAAM,gBAAgB,EAAG,YAAqB,CAAC;AACtD,eAAO,MAAM,oBAAoB,EAAG,8BAAuC,CAAC;AAC5E,eAAO,MAAM,kBAAkB,EAAG,cAAuB,CAAC;AAC1D,eAAO,MAAM,qBAAqB,EAAG,OAAgB,CAAC;AACtD,eAAO,MAAM,eAAe,EAAG,8BAAuC,CAAC;AAuCvE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,IAAI,gBAAgB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AA8cF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAmCjF;AAED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC,CA6F1B"}
@@ -0,0 +1,487 @@
1
+ import { createServer } from "node:http";
2
+ export const LOCAL_DEMO_ALIAS = "local-demo";
3
+ export const DEMO_AGENT_CARD_PATH = "/.well-known/agent-card.json";
4
+ export const DEMO_JSON_RPC_PATH = "/a2a/jsonrpc";
5
+ export const DEMO_PROTOCOL_VERSION = "0.3.0";
6
+ export const DEMO_AGENT_NAME = "OpenClaw A2A Local Demo Peer";
7
+ const MAX_REQUEST_BYTES = 1024 * 1024;
8
+ const FIXED_TIMESTAMP = "2026-01-01T00:00:00.000Z";
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function textFromParts(parts) {
13
+ return parts
14
+ .flatMap((part) => part.kind === "text" && typeof part.text === "string" ? [part.text] : [])
15
+ .join("\n\n");
16
+ }
17
+ function jsonRpcId(value) {
18
+ return typeof value === "string" || typeof value === "number" || value === null
19
+ ? value
20
+ : null;
21
+ }
22
+ function jsonRpcSuccess(id, result) {
23
+ return {
24
+ jsonrpc: "2.0",
25
+ id,
26
+ result,
27
+ };
28
+ }
29
+ function jsonRpcFailure(id, code, message, data) {
30
+ return {
31
+ jsonrpc: "2.0",
32
+ id,
33
+ error: {
34
+ code,
35
+ message,
36
+ ...(data !== undefined ? { data } : {}),
37
+ },
38
+ };
39
+ }
40
+ function formatSseEvent(response) {
41
+ return `data: ${JSON.stringify(response)}\n\n`;
42
+ }
43
+ function cloneTask(task) {
44
+ return structuredClone(task);
45
+ }
46
+ function cloneMessage(message) {
47
+ return structuredClone(message);
48
+ }
49
+ function cloneArtifact(artifact) {
50
+ return structuredClone(artifact);
51
+ }
52
+ async function readRequestBody(req) {
53
+ const chunks = [];
54
+ let total = 0;
55
+ for await (const chunk of req) {
56
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
57
+ total += buffer.byteLength;
58
+ if (total > MAX_REQUEST_BYTES) {
59
+ throw new Error(`request body exceeds ${MAX_REQUEST_BYTES} bytes`);
60
+ }
61
+ chunks.push(buffer);
62
+ }
63
+ return Buffer.concat(chunks);
64
+ }
65
+ function writeJson(res, statusCode, body) {
66
+ res.writeHead(statusCode, {
67
+ "content-type": "application/json; charset=utf-8",
68
+ });
69
+ res.end(JSON.stringify(body, null, 2));
70
+ }
71
+ function writeText(res, statusCode, body) {
72
+ res.writeHead(statusCode, {
73
+ "content-type": "text/plain; charset=utf-8",
74
+ });
75
+ res.end(body);
76
+ }
77
+ function isMessage(value) {
78
+ return (isRecord(value) &&
79
+ value.kind === "message" &&
80
+ typeof value.messageId === "string" &&
81
+ Array.isArray(value.parts));
82
+ }
83
+ function readSendMessage(params) {
84
+ return isRecord(params) && isMessage(params.message) ? params.message : undefined;
85
+ }
86
+ function readTaskId(params) {
87
+ return isRecord(params) && typeof params.id === "string" ? params.id : undefined;
88
+ }
89
+ function taskStatusUpdate(task, final) {
90
+ return {
91
+ kind: "status-update",
92
+ taskId: task.id,
93
+ contextId: task.contextId,
94
+ status: {
95
+ state: task.status.state,
96
+ ...(task.status.message !== undefined
97
+ ? { message: cloneMessage(task.status.message) }
98
+ : {}),
99
+ timestamp: FIXED_TIMESTAMP,
100
+ },
101
+ final,
102
+ };
103
+ }
104
+ function artifactUpdate(task) {
105
+ const artifact = task.artifacts?.[0];
106
+ if (!artifact) {
107
+ return undefined;
108
+ }
109
+ return {
110
+ kind: "artifact-update",
111
+ taskId: task.id,
112
+ contextId: task.contextId,
113
+ artifact: cloneArtifact(artifact),
114
+ append: false,
115
+ lastChunk: true,
116
+ };
117
+ }
118
+ function terminalState(state) {
119
+ return (state === "completed" ||
120
+ state === "failed" ||
121
+ state === "canceled" ||
122
+ state === "rejected");
123
+ }
124
+ class DemoPeerRuntime {
125
+ baseUrl;
126
+ tasks = new Map();
127
+ taskSeq = 0;
128
+ contextSeq = 0;
129
+ messageSeq = 0;
130
+ artifactSeq = 0;
131
+ constructor(baseUrl) {
132
+ this.baseUrl = baseUrl;
133
+ }
134
+ snapshot() {
135
+ return {
136
+ taskCount: this.tasks.size,
137
+ tasks: [...this.tasks.values()].map((record) => cloneTask(record.task)),
138
+ };
139
+ }
140
+ agentCard() {
141
+ const baseUrl = this.baseUrl();
142
+ const jsonRpcUrl = new URL(DEMO_JSON_RPC_PATH, baseUrl).toString();
143
+ return {
144
+ name: DEMO_AGENT_NAME,
145
+ description: "Deterministic local A2A peer for OpenClaw outbound onboarding.",
146
+ protocolVersion: DEMO_PROTOCOL_VERSION,
147
+ version: "1.0.0",
148
+ url: jsonRpcUrl,
149
+ preferredTransport: "JSONRPC",
150
+ capabilities: {
151
+ streaming: true,
152
+ pushNotifications: false,
153
+ stateTransitionHistory: true,
154
+ },
155
+ defaultInputModes: ["text/plain", "application/json"],
156
+ defaultOutputModes: ["text/plain", "application/json"],
157
+ additionalInterfaces: [
158
+ {
159
+ transport: "JSONRPC",
160
+ url: jsonRpcUrl,
161
+ },
162
+ ],
163
+ skills: [
164
+ {
165
+ id: "demo-delegation",
166
+ name: "Demo Delegation",
167
+ description: "Returns deterministic direct replies, task results, and continuation-friendly task snapshots.",
168
+ tags: ["demo", "delegation", "continuation"],
169
+ examples: [
170
+ "Create a durable demo task.",
171
+ "Continue from the persisted continuation.",
172
+ ],
173
+ inputModes: ["text/plain", "application/json"],
174
+ outputModes: ["text/plain", "application/json"],
175
+ },
176
+ ],
177
+ };
178
+ }
179
+ directReply(message) {
180
+ const contextId = message.contextId ?? `demo-context-direct-${++this.contextSeq}`;
181
+ const inboundText = textFromParts(message.parts) || "empty prompt";
182
+ return {
183
+ kind: "message",
184
+ messageId: `demo-agent-message-${++this.messageSeq}`,
185
+ role: "agent",
186
+ contextId,
187
+ ...(message.taskId !== undefined ? { taskId: message.taskId } : {}),
188
+ parts: [
189
+ {
190
+ kind: "text",
191
+ text: `Demo peer direct reply: ${inboundText}`,
192
+ },
193
+ ],
194
+ };
195
+ }
196
+ taskReply(message) {
197
+ const existing = message.taskId !== undefined ? this.tasks.get(message.taskId) : undefined;
198
+ const taskId = message.taskId ?? `demo-task-${++this.taskSeq}`;
199
+ const contextId = message.contextId ?? existing?.task.contextId ?? `demo-context-${++this.contextSeq}`;
200
+ const turn = (existing?.turn ?? 0) + 1;
201
+ const inboundText = textFromParts(message.parts) || "empty prompt";
202
+ const cancelable = /\bcancelable\b/i.test(inboundText);
203
+ const resumed = existing !== undefined || message.taskId !== undefined;
204
+ const statusState = cancelable ? "working" : "completed";
205
+ const artifactText = resumed
206
+ ? `Demo peer resumed ${taskId} from persisted continuation. Received: ${inboundText}`
207
+ : cancelable
208
+ ? `Demo peer started cancelable task ${taskId}.`
209
+ : `Demo peer completed durable task ${taskId}. Received: ${inboundText}`;
210
+ const artifact = {
211
+ artifactId: `demo-artifact-${++this.artifactSeq}`,
212
+ name: resumed ? "continuation-result" : "demo-result",
213
+ parts: [
214
+ {
215
+ kind: "text",
216
+ text: artifactText,
217
+ },
218
+ ],
219
+ };
220
+ const agentMessage = {
221
+ kind: "message",
222
+ messageId: `demo-agent-message-${++this.messageSeq}`,
223
+ role: "agent",
224
+ contextId,
225
+ taskId,
226
+ parts: [
227
+ {
228
+ kind: "text",
229
+ text: artifactText,
230
+ },
231
+ ],
232
+ };
233
+ const history = [
234
+ ...(existing?.task.history?.map(cloneMessage) ?? []),
235
+ cloneMessage(message),
236
+ cloneMessage(agentMessage),
237
+ ];
238
+ const task = {
239
+ kind: "task",
240
+ id: taskId,
241
+ contextId,
242
+ status: {
243
+ state: statusState,
244
+ message: cloneMessage(agentMessage),
245
+ timestamp: FIXED_TIMESTAMP,
246
+ },
247
+ artifacts: [artifact],
248
+ history,
249
+ metadata: {
250
+ demo: true,
251
+ turn,
252
+ },
253
+ };
254
+ this.tasks.set(taskId, {
255
+ turn,
256
+ task,
257
+ });
258
+ return cloneTask(task);
259
+ }
260
+ sendMessage(params) {
261
+ const message = readSendMessage(params);
262
+ if (!message) {
263
+ throw jsonRpcFailure(null, -32602, "message is required");
264
+ }
265
+ const text = textFromParts(message.parts);
266
+ return /\bdirect\b/i.test(text) ? this.directReply(message) : this.taskReply(message);
267
+ }
268
+ streamMessage(params) {
269
+ const result = this.sendMessage(params);
270
+ if (result.kind === "message") {
271
+ return [result];
272
+ }
273
+ return this.taskEvents(result);
274
+ }
275
+ getTask(params) {
276
+ const taskId = readTaskId(params);
277
+ if (!taskId) {
278
+ throw jsonRpcFailure(null, -32602, "task id is required");
279
+ }
280
+ const record = this.tasks.get(taskId);
281
+ if (!record) {
282
+ throw jsonRpcFailure(null, -32001, `task not found: ${taskId}`, {
283
+ taskId,
284
+ });
285
+ }
286
+ return cloneTask(record.task);
287
+ }
288
+ cancelTask(params) {
289
+ const taskId = readTaskId(params);
290
+ if (!taskId) {
291
+ throw jsonRpcFailure(null, -32602, "task id is required");
292
+ }
293
+ const record = this.tasks.get(taskId);
294
+ if (!record) {
295
+ throw jsonRpcFailure(null, -32001, `task not found: ${taskId}`, {
296
+ taskId,
297
+ });
298
+ }
299
+ if (terminalState(record.task.status.state)) {
300
+ return cloneTask(record.task);
301
+ }
302
+ const canceledMessage = {
303
+ kind: "message",
304
+ messageId: `demo-agent-message-${++this.messageSeq}`,
305
+ role: "agent",
306
+ contextId: record.task.contextId,
307
+ taskId: record.task.id,
308
+ parts: [
309
+ {
310
+ kind: "text",
311
+ text: `Demo peer canceled ${record.task.id}.`,
312
+ },
313
+ ],
314
+ };
315
+ const canceledTask = {
316
+ ...cloneTask(record.task),
317
+ status: {
318
+ state: "canceled",
319
+ message: canceledMessage,
320
+ timestamp: FIXED_TIMESTAMP,
321
+ },
322
+ history: [...(record.task.history?.map(cloneMessage) ?? []), canceledMessage],
323
+ };
324
+ this.tasks.set(taskId, {
325
+ turn: record.turn,
326
+ task: canceledTask,
327
+ });
328
+ return cloneTask(canceledTask);
329
+ }
330
+ resubscribe(params) {
331
+ return this.taskEvents(this.getTask(params));
332
+ }
333
+ taskEvents(task) {
334
+ const events = [cloneTask(task)];
335
+ const artifact = artifactUpdate(task);
336
+ if (artifact !== undefined) {
337
+ events.push(artifact);
338
+ }
339
+ events.push(taskStatusUpdate(task, terminalState(task.status.state)));
340
+ return events;
341
+ }
342
+ }
343
+ function isJsonRpcFailure(value) {
344
+ return isRecord(value) && isRecord(value.error) && typeof value.error.code === "number";
345
+ }
346
+ function rpcResult(runtime, request) {
347
+ switch (request.method) {
348
+ case "message/send":
349
+ return runtime.sendMessage(request.params);
350
+ case "tasks/get":
351
+ return runtime.getTask(request.params);
352
+ case "tasks/cancel":
353
+ return runtime.cancelTask(request.params);
354
+ case "agent/getAuthenticatedExtendedCard":
355
+ return runtime.agentCard();
356
+ default:
357
+ throw jsonRpcFailure(jsonRpcId(request.id), -32601, `method not found: ${String(request.method)}`);
358
+ }
359
+ }
360
+ function rpcStream(runtime, request) {
361
+ switch (request.method) {
362
+ case "message/stream":
363
+ return runtime.streamMessage(request.params);
364
+ case "tasks/resubscribe":
365
+ return runtime.resubscribe(request.params);
366
+ default:
367
+ throw jsonRpcFailure(jsonRpcId(request.id), -32601, `method not found: ${String(request.method)}`);
368
+ }
369
+ }
370
+ function parseJsonRpcRequest(body) {
371
+ const parsed = JSON.parse(body.toString("utf8"));
372
+ if (!isRecord(parsed) || parsed.jsonrpc !== "2.0" || typeof parsed.method !== "string") {
373
+ throw jsonRpcFailure(null, -32600, "invalid JSON-RPC request");
374
+ }
375
+ return parsed;
376
+ }
377
+ export function createDemoOutboundConfig(baseUrl) {
378
+ return {
379
+ enabled: true,
380
+ defaults: {
381
+ timeoutMs: 30_000,
382
+ cardPath: DEMO_AGENT_CARD_PATH,
383
+ preferredTransports: ["JSONRPC", "HTTP+JSON"],
384
+ serviceParameters: {},
385
+ },
386
+ targets: [
387
+ {
388
+ alias: LOCAL_DEMO_ALIAS,
389
+ baseUrl,
390
+ description: "Deterministic local A2A demo peer.",
391
+ tags: ["demo", "local"],
392
+ cardPath: DEMO_AGENT_CARD_PATH,
393
+ preferredTransports: ["JSONRPC", "HTTP+JSON"],
394
+ examples: [
395
+ "Create a durable demo task.",
396
+ "Continue from the persisted continuation.",
397
+ ],
398
+ default: true,
399
+ },
400
+ ],
401
+ taskHandles: {
402
+ ttlMs: 86_400_000,
403
+ maxEntries: 100,
404
+ },
405
+ policy: {
406
+ acceptedOutputModes: ["text/plain", "application/json"],
407
+ normalizeBaseUrl: true,
408
+ enforceSupportedTransports: true,
409
+ allowTargetUrlOverride: false,
410
+ },
411
+ };
412
+ }
413
+ export async function startDemoPeerServer(options = {}) {
414
+ const host = options.host ?? "127.0.0.1";
415
+ let baseUrl = "";
416
+ const runtime = new DemoPeerRuntime(() => baseUrl);
417
+ const server = createServer((req, res) => {
418
+ void (async () => {
419
+ const url = new URL(req.url ?? "/", "http://127.0.0.1");
420
+ if (req.method === "GET" && url.pathname === DEMO_AGENT_CARD_PATH) {
421
+ writeJson(res, 200, runtime.agentCard());
422
+ return;
423
+ }
424
+ if (req.method !== "POST" || url.pathname !== DEMO_JSON_RPC_PATH) {
425
+ writeText(res, 404, "not found");
426
+ return;
427
+ }
428
+ const body = await readRequestBody(req);
429
+ const request = parseJsonRpcRequest(body);
430
+ const id = jsonRpcId(request.id);
431
+ if (request.method === "message/stream" || request.method === "tasks/resubscribe") {
432
+ res.writeHead(200, {
433
+ "content-type": "text/event-stream",
434
+ "cache-control": "no-cache",
435
+ connection: "keep-alive",
436
+ "x-accel-buffering": "no",
437
+ });
438
+ for (const event of rpcStream(runtime, request)) {
439
+ res.write(formatSseEvent(jsonRpcSuccess(id, event)));
440
+ }
441
+ res.end();
442
+ return;
443
+ }
444
+ writeJson(res, 200, jsonRpcSuccess(id, rpcResult(runtime, request)));
445
+ })().catch((error) => {
446
+ const failure = isJsonRpcFailure(error)
447
+ ? error
448
+ : jsonRpcFailure(null, error instanceof SyntaxError ? -32700 : -32603, error instanceof Error ? error.message : String(error));
449
+ if (!res.headersSent) {
450
+ writeJson(res, error instanceof SyntaxError ? 400 : 500, failure);
451
+ return;
452
+ }
453
+ if (!res.writableEnded) {
454
+ res.write(formatSseEvent(failure));
455
+ res.end();
456
+ }
457
+ });
458
+ });
459
+ await new Promise((resolve, reject) => {
460
+ server.once("error", reject);
461
+ server.listen(options.port ?? 0, host, () => {
462
+ server.off("error", reject);
463
+ resolve();
464
+ });
465
+ });
466
+ const address = server.address();
467
+ if (!address || typeof address === "string") {
468
+ throw new Error("failed to bind demo peer server");
469
+ }
470
+ baseUrl = `http://${host}:${address.port}`;
471
+ return {
472
+ baseUrl,
473
+ cardUrl: new URL(DEMO_AGENT_CARD_PATH, baseUrl).toString(),
474
+ jsonRpcUrl: new URL(DEMO_JSON_RPC_PATH, baseUrl).toString(),
475
+ close: () => new Promise((resolve, reject) => {
476
+ server.close((error) => {
477
+ if (error) {
478
+ reject(error);
479
+ return;
480
+ }
481
+ resolve();
482
+ });
483
+ }),
484
+ snapshot: () => runtime.snapshot(),
485
+ };
486
+ }
487
+ //# sourceMappingURL=demo-peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-peer.js","sourceRoot":"","sources":["../src/demo-peer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AA4D7B,iBAAS,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAoDnD;AAED,eAAO,MAAM,EAAE,0BAAY,CAAC;AAE5B,eAAO,MAAM,MAAM;;;;CAIO,CAAC;AAE3B,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AA6D7B,iBAAS,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAuEnD;AAED,eAAO,MAAM,EAAE,0BAAY,CAAC;AAE5B,eAAO,MAAM,MAAM;;;;CAIO,CAAC;AAE3B,eAAe,MAAM,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { jsonResult } from "openclaw/plugin-sdk/core";
2
2
  import { PLUGIN_ID } from "./constants.js";
3
3
  import { A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA, } from "./config.js";
4
+ import { registerA2ACli } from "./cli.js";
4
5
  import { log } from "./logging.js";
5
6
  import { buildRemoteAgentToolDefinition } from "./schemas.js";
6
7
  import { buildService } from "./service.js";
@@ -34,6 +35,21 @@ function resolveExecuteArgs(args) {
34
35
  }
35
36
  function registerTools(api) {
36
37
  const config = A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA.parse?.(api.pluginConfig ?? {});
38
+ api.registerCli?.(({ program }) => {
39
+ registerA2ACli(program, {
40
+ pluginConfig: config,
41
+ rootConfig: api.config,
42
+ });
43
+ }, {
44
+ commands: ["a2a"],
45
+ descriptors: [
46
+ {
47
+ name: "a2a",
48
+ description: "A2A outbound demo and diagnostics",
49
+ hasSubcommands: true,
50
+ },
51
+ ],
52
+ });
37
53
  if (api.registrationMode !== "full") {
38
54
  log(api.logger, "debug", "a2a.plugin.registration.deferred", {
39
55
  pluginId: PLUGIN_ID,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "id": "openclaw-a2a-outbound",
3
3
  "name": "External A2A Delegation",
4
- "version": "4.0.0",
4
+ "version": "4.1.0",
5
5
  "entry": "./dist/index.js",
6
- "description": "Delegate requests to external A2A agents and manage delegated tasks.",
6
+ "description": "Delegate to A2A agents from OpenClaw with remote_agent plus a zero-config local demo CLI.",
7
7
  "skills": [
8
8
  "./skills"
9
9
  ],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aramisfa/openclaw-a2a-outbound",
3
- "version": "4.0.0",
4
- "description": "Outbound A2A delegation plugin for OpenClaw agents",
3
+ "version": "4.1.0",
4
+ "description": "OpenClaw outbound A2A delegation plugin with a zero-config local demo CLI",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -17,7 +17,10 @@
17
17
  "a2a",
18
18
  "agent-to-agent",
19
19
  "delegation",
20
- "agent"
20
+ "agent",
21
+ "a2a-cli",
22
+ "local-demo",
23
+ "continuation"
21
24
  ],
22
25
  "type": "module",
23
26
  "main": "./dist/index.js",
@@ -27,6 +30,11 @@
27
30
  "types": "./dist/index.d.ts",
28
31
  "import": "./dist/index.js",
29
32
  "default": "./dist/index.js"
33
+ },
34
+ "./demo-peer": {
35
+ "types": "./dist/demo-peer.d.ts",
36
+ "import": "./dist/demo-peer.js",
37
+ "default": "./dist/demo-peer.js"
30
38
  }
31
39
  },
32
40
  "files": [