@aramisfa/openclaw-a2a-outbound 0.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/LICENSE +21 -0
- package/README.md +80 -0
- package/dist/ajv-validator.d.ts +6 -0
- package/dist/ajv-validator.d.ts.map +1 -0
- package/dist/ajv-validator.js +28 -0
- package/dist/ajv-validator.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +204 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +111 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +19 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +19 -0
- package/dist/logging.js.map +1 -0
- package/dist/plugin-config.d.ts +5 -0
- package/dist/plugin-config.d.ts.map +1 -0
- package/dist/plugin-config.js +89 -0
- package/dist/plugin-config.js.map +1 -0
- package/dist/result-shape.d.ts +36 -0
- package/dist/result-shape.d.ts.map +1 -0
- package/dist/result-shape.js +83 -0
- package/dist/result-shape.js.map +1 -0
- package/dist/schemas.d.ts +665 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +247 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sdk-client-pool.d.ts +34 -0
- package/dist/sdk-client-pool.d.ts.map +1 -0
- package/dist/sdk-client-pool.js +120 -0
- package/dist/sdk-client-pool.js.map +1 -0
- package/dist/service.d.ts +21 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +143 -0
- package/dist/service.js.map +1 -0
- package/openclaw.plugin.json +61 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OpenClaw contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @aramisfa/openclaw-a2a-outbound
|
|
2
|
+
|
|
3
|
+
Native OpenClaw outbound A2A delegation plugin.
|
|
4
|
+
|
|
5
|
+
This package registers three optional tools in OpenClaw:
|
|
6
|
+
|
|
7
|
+
- `a2a_delegate`
|
|
8
|
+
- `a2a_task_status`
|
|
9
|
+
- `a2a_task_cancel`
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @aramisfa/openclaw-a2a-outbound
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
- Node.js `>=22.12.0`
|
|
20
|
+
- OpenClaw `2026.3.2`
|
|
21
|
+
|
|
22
|
+
## OpenClaw Plugin Config
|
|
23
|
+
|
|
24
|
+
`@aramisfa/openclaw-a2a-outbound` is disabled by default. Enable it in your plugin config:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"enabled": true,
|
|
29
|
+
"defaults": {
|
|
30
|
+
"timeoutMs": 120000,
|
|
31
|
+
"cardPath": "/.well-known/agent-card.json",
|
|
32
|
+
"preferredTransports": ["JSONRPC", "HTTP+JSON"],
|
|
33
|
+
"serviceParameters": {}
|
|
34
|
+
},
|
|
35
|
+
"policy": {
|
|
36
|
+
"acceptedOutputModes": [],
|
|
37
|
+
"normalizeBaseUrl": true,
|
|
38
|
+
"enforceSupportedTransports": true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Validation Errors
|
|
44
|
+
|
|
45
|
+
Tool input validation is powered by [Ajv](https://ajv.js.org/) in strict mode. When validation fails, the error envelope contains native Ajv error objects:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"ok": false,
|
|
50
|
+
"operation": "a2a_delegate",
|
|
51
|
+
"error": {
|
|
52
|
+
"code": "VALIDATION_ERROR",
|
|
53
|
+
"message": "a2a_delegate input validation failed",
|
|
54
|
+
"details": {
|
|
55
|
+
"source": "ajv",
|
|
56
|
+
"tool": "a2a_delegate",
|
|
57
|
+
"errors": [
|
|
58
|
+
{
|
|
59
|
+
"keyword": "required",
|
|
60
|
+
"instancePath": "/request/message",
|
|
61
|
+
"params": { "missingProperty": "kind" }
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The `error.details.errors` array contains Ajv `ErrorObject` entries. See the [Ajv error documentation](https://ajv.js.org/api.html#error-objects) for the full shape.
|
|
70
|
+
|
|
71
|
+
## Development
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pnpm build
|
|
75
|
+
pnpm test
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## License
|
|
79
|
+
|
|
80
|
+
MIT
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import type { ErrorObject } from "ajv";
|
|
3
|
+
export type { ErrorObject } from "ajv";
|
|
4
|
+
export declare function createA2AOutboundAjv(): InstanceType<typeof Ajv>;
|
|
5
|
+
export declare function toValidationError(toolName: string, errors: ErrorObject[]): never;
|
|
6
|
+
//# sourceMappingURL=ajv-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajv-validator.d.ts","sourceRoot":"","sources":["../src/ajv-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAIvC,YAAY,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC,wBAAgB,oBAAoB,IAAI,YAAY,CAAC,OAAO,GAAG,CAAC,CAkB/D;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EAAE,GACpB,KAAK,CAUP"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import _addFormats from "ajv-formats";
|
|
3
|
+
import { A2AOutboundError, ERROR_CODES } from "./errors.js";
|
|
4
|
+
export function createA2AOutboundAjv() {
|
|
5
|
+
const ajv = new Ajv({
|
|
6
|
+
allErrors: true,
|
|
7
|
+
strict: true,
|
|
8
|
+
strictSchema: true,
|
|
9
|
+
strictTypes: true,
|
|
10
|
+
strictTuples: true,
|
|
11
|
+
strictRequired: false,
|
|
12
|
+
strictNumbers: true,
|
|
13
|
+
allowUnionTypes: false,
|
|
14
|
+
coerceTypes: false,
|
|
15
|
+
useDefaults: false,
|
|
16
|
+
removeAdditional: false,
|
|
17
|
+
});
|
|
18
|
+
_addFormats(ajv);
|
|
19
|
+
return ajv;
|
|
20
|
+
}
|
|
21
|
+
export function toValidationError(toolName, errors) {
|
|
22
|
+
throw new A2AOutboundError(ERROR_CODES.VALIDATION_ERROR, `${toolName} input validation failed`, {
|
|
23
|
+
source: "ajv",
|
|
24
|
+
tool: toolName,
|
|
25
|
+
errors,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ajv-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajv-validator.js","sourceRoot":"","sources":["../src/ajv-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QAClB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,KAAK;QACtB,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;IAEF,WAAkE,CAAC,GAAG,CAAC,CAAC;IAEzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,MAAqB;IAErB,MAAM,IAAI,gBAAgB,CACxB,WAAW,CAAC,gBAAgB,EAC5B,GAAG,QAAQ,0BAA0B,EACrC;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,QAAQ;QACd,MAAM;KACP,CACF,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { OpenClawPluginConfigSchema } from "openclaw/plugin-sdk";
|
|
2
|
+
import { type A2ATransport } from "./constants.js";
|
|
3
|
+
export interface A2AOutboundDefaultsConfig {
|
|
4
|
+
timeoutMs: number;
|
|
5
|
+
cardPath: string;
|
|
6
|
+
preferredTransports: A2ATransport[];
|
|
7
|
+
serviceParameters: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface A2AOutboundPolicyConfig {
|
|
10
|
+
acceptedOutputModes: string[];
|
|
11
|
+
normalizeBaseUrl: boolean;
|
|
12
|
+
enforceSupportedTransports: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface A2AOutboundPluginConfig {
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
defaults: A2AOutboundDefaultsConfig;
|
|
17
|
+
policy: A2AOutboundPolicyConfig;
|
|
18
|
+
}
|
|
19
|
+
export declare const A2A_OUTBOUND_DEFAULT_CONFIG: A2AOutboundPluginConfig;
|
|
20
|
+
export declare const A2A_OUTBOUND_CONFIG_JSON_SCHEMA: NonNullable<OpenClawPluginConfigSchema["jsonSchema"]>;
|
|
21
|
+
export declare const A2A_OUTBOUND_CONFIG_UI_HINTS: NonNullable<OpenClawPluginConfigSchema["uiHints"]>;
|
|
22
|
+
export declare function parseA2AOutboundPluginConfig(input: unknown): A2AOutboundPluginConfig;
|
|
23
|
+
export declare const A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA: OpenClawPluginConfigSchema;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0BAA0B,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,uBAAuB,CAAC;CACjC;AAED,eAAO,MAAM,2BAA2B,EAAE,uBAazC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,WAAW,CACvD,0BAA0B,CAAC,YAAY,CAAC,CAyDzC,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,WAAW,CACpD,0BAA0B,CAAC,SAAS,CAAC,CA0CtC,CAAC;AAuFF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,uBAAuB,CA4CzB;AAED,eAAO,MAAM,mCAAmC,EAAE,0BAO/C,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { ALL_TRANSPORTS, SUPPORTED_TRANSPORTS, } from "./constants.js";
|
|
2
|
+
export const A2A_OUTBOUND_DEFAULT_CONFIG = {
|
|
3
|
+
enabled: false,
|
|
4
|
+
defaults: {
|
|
5
|
+
timeoutMs: 120000,
|
|
6
|
+
cardPath: "/.well-known/agent-card.json",
|
|
7
|
+
preferredTransports: [...SUPPORTED_TRANSPORTS],
|
|
8
|
+
serviceParameters: {},
|
|
9
|
+
},
|
|
10
|
+
policy: {
|
|
11
|
+
acceptedOutputModes: [],
|
|
12
|
+
normalizeBaseUrl: true,
|
|
13
|
+
enforceSupportedTransports: true,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export const A2A_OUTBOUND_CONFIG_JSON_SCHEMA = {
|
|
17
|
+
type: "object",
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
properties: {
|
|
20
|
+
enabled: {
|
|
21
|
+
type: "boolean",
|
|
22
|
+
default: A2A_OUTBOUND_DEFAULT_CONFIG.enabled,
|
|
23
|
+
},
|
|
24
|
+
defaults: {
|
|
25
|
+
type: "object",
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
properties: {
|
|
28
|
+
timeoutMs: {
|
|
29
|
+
type: "integer",
|
|
30
|
+
minimum: 1,
|
|
31
|
+
default: A2A_OUTBOUND_DEFAULT_CONFIG.defaults.timeoutMs,
|
|
32
|
+
},
|
|
33
|
+
cardPath: {
|
|
34
|
+
type: "string",
|
|
35
|
+
default: A2A_OUTBOUND_DEFAULT_CONFIG.defaults.cardPath,
|
|
36
|
+
},
|
|
37
|
+
preferredTransports: {
|
|
38
|
+
type: "array",
|
|
39
|
+
items: {
|
|
40
|
+
type: "string",
|
|
41
|
+
enum: [...ALL_TRANSPORTS],
|
|
42
|
+
},
|
|
43
|
+
default: [...A2A_OUTBOUND_DEFAULT_CONFIG.defaults.preferredTransports],
|
|
44
|
+
},
|
|
45
|
+
serviceParameters: {
|
|
46
|
+
type: "object",
|
|
47
|
+
additionalProperties: { type: "string" },
|
|
48
|
+
default: { ...A2A_OUTBOUND_DEFAULT_CONFIG.defaults.serviceParameters },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
policy: {
|
|
53
|
+
type: "object",
|
|
54
|
+
additionalProperties: false,
|
|
55
|
+
properties: {
|
|
56
|
+
acceptedOutputModes: {
|
|
57
|
+
type: "array",
|
|
58
|
+
items: { type: "string" },
|
|
59
|
+
default: [...A2A_OUTBOUND_DEFAULT_CONFIG.policy.acceptedOutputModes],
|
|
60
|
+
},
|
|
61
|
+
normalizeBaseUrl: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
default: A2A_OUTBOUND_DEFAULT_CONFIG.policy.normalizeBaseUrl,
|
|
64
|
+
},
|
|
65
|
+
enforceSupportedTransports: {
|
|
66
|
+
type: "boolean",
|
|
67
|
+
default: A2A_OUTBOUND_DEFAULT_CONFIG.policy.enforceSupportedTransports,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
export const A2A_OUTBOUND_CONFIG_UI_HINTS = {
|
|
74
|
+
enabled: {
|
|
75
|
+
label: "Enable A2A Outbound",
|
|
76
|
+
help: "Registers outbound A2A delegation tools when enabled.",
|
|
77
|
+
},
|
|
78
|
+
"defaults.timeoutMs": {
|
|
79
|
+
label: "Default Timeout (ms)",
|
|
80
|
+
help: "Fallback request timeout for delegated A2A operations.",
|
|
81
|
+
advanced: true,
|
|
82
|
+
},
|
|
83
|
+
"defaults.cardPath": {
|
|
84
|
+
label: "Agent Card Path",
|
|
85
|
+
help: "Path used to discover the remote agent card.",
|
|
86
|
+
advanced: true,
|
|
87
|
+
placeholder: "/.well-known/agent-card.json",
|
|
88
|
+
},
|
|
89
|
+
"defaults.preferredTransports": {
|
|
90
|
+
label: "Preferred Transports",
|
|
91
|
+
help: "Ordered transport preference when connecting to peers.",
|
|
92
|
+
advanced: true,
|
|
93
|
+
},
|
|
94
|
+
"defaults.serviceParameters": {
|
|
95
|
+
label: "Default Service Parameters",
|
|
96
|
+
help: "Default headers or provider-specific request parameters.",
|
|
97
|
+
advanced: true,
|
|
98
|
+
},
|
|
99
|
+
"policy.acceptedOutputModes": {
|
|
100
|
+
label: "Accepted Output Modes",
|
|
101
|
+
help: "Allowed response media types for outbound client requests.",
|
|
102
|
+
advanced: true,
|
|
103
|
+
},
|
|
104
|
+
"policy.normalizeBaseUrl": {
|
|
105
|
+
label: "Normalize Base URL",
|
|
106
|
+
help: "Normalizes target URLs before client resolution.",
|
|
107
|
+
advanced: true,
|
|
108
|
+
},
|
|
109
|
+
"policy.enforceSupportedTransports": {
|
|
110
|
+
label: "Enforce Supported Transports",
|
|
111
|
+
help: "Rejects targets requesting transports unsupported by this build.",
|
|
112
|
+
advanced: true,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
function cloneConfig(config) {
|
|
116
|
+
return {
|
|
117
|
+
enabled: config.enabled,
|
|
118
|
+
defaults: {
|
|
119
|
+
timeoutMs: config.defaults.timeoutMs,
|
|
120
|
+
cardPath: config.defaults.cardPath,
|
|
121
|
+
preferredTransports: [...config.defaults.preferredTransports],
|
|
122
|
+
serviceParameters: { ...config.defaults.serviceParameters },
|
|
123
|
+
},
|
|
124
|
+
policy: {
|
|
125
|
+
acceptedOutputModes: [...config.policy.acceptedOutputModes],
|
|
126
|
+
normalizeBaseUrl: config.policy.normalizeBaseUrl,
|
|
127
|
+
enforceSupportedTransports: config.policy.enforceSupportedTransports,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function isPlainObject(value) {
|
|
132
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
133
|
+
}
|
|
134
|
+
function normalizeStringArray(value, fallback = []) {
|
|
135
|
+
if (!Array.isArray(value)) {
|
|
136
|
+
return [...fallback];
|
|
137
|
+
}
|
|
138
|
+
const normalized = [];
|
|
139
|
+
for (const entry of value) {
|
|
140
|
+
if (typeof entry !== "string" || entry.trim() === "") {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!normalized.includes(entry)) {
|
|
144
|
+
normalized.push(entry);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return normalized;
|
|
148
|
+
}
|
|
149
|
+
function normalizeTransports(value, fallback) {
|
|
150
|
+
const normalized = normalizeStringArray(value).filter((entry) => ALL_TRANSPORTS.includes(entry));
|
|
151
|
+
return normalized.length > 0 ? normalized : [...fallback];
|
|
152
|
+
}
|
|
153
|
+
function normalizeStringMap(value, fallback = {}) {
|
|
154
|
+
if (!isPlainObject(value)) {
|
|
155
|
+
return { ...fallback };
|
|
156
|
+
}
|
|
157
|
+
const normalized = {};
|
|
158
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
159
|
+
if (typeof entry === "string") {
|
|
160
|
+
normalized[key] = entry;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return normalized;
|
|
164
|
+
}
|
|
165
|
+
function readBoolean(value, fallback) {
|
|
166
|
+
return typeof value === "boolean" ? value : fallback;
|
|
167
|
+
}
|
|
168
|
+
function readPositiveInteger(value, fallback) {
|
|
169
|
+
return Number.isInteger(value) && value > 0
|
|
170
|
+
? value
|
|
171
|
+
: fallback;
|
|
172
|
+
}
|
|
173
|
+
export function parseA2AOutboundPluginConfig(input) {
|
|
174
|
+
if (!isPlainObject(input)) {
|
|
175
|
+
return cloneConfig(A2A_OUTBOUND_DEFAULT_CONFIG);
|
|
176
|
+
}
|
|
177
|
+
const rawDefaults = isPlainObject(input.defaults) ? input.defaults : {};
|
|
178
|
+
const rawPolicy = isPlainObject(input.policy) ? input.policy : {};
|
|
179
|
+
return {
|
|
180
|
+
enabled: readBoolean(input.enabled, A2A_OUTBOUND_DEFAULT_CONFIG.enabled),
|
|
181
|
+
defaults: {
|
|
182
|
+
timeoutMs: readPositiveInteger(rawDefaults.timeoutMs, A2A_OUTBOUND_DEFAULT_CONFIG.defaults.timeoutMs),
|
|
183
|
+
cardPath: typeof rawDefaults.cardPath === "string" &&
|
|
184
|
+
rawDefaults.cardPath.trim() !== ""
|
|
185
|
+
? rawDefaults.cardPath
|
|
186
|
+
: A2A_OUTBOUND_DEFAULT_CONFIG.defaults.cardPath,
|
|
187
|
+
preferredTransports: normalizeTransports(rawDefaults.preferredTransports, A2A_OUTBOUND_DEFAULT_CONFIG.defaults.preferredTransports),
|
|
188
|
+
serviceParameters: normalizeStringMap(rawDefaults.serviceParameters, A2A_OUTBOUND_DEFAULT_CONFIG.defaults.serviceParameters),
|
|
189
|
+
},
|
|
190
|
+
policy: {
|
|
191
|
+
acceptedOutputModes: normalizeStringArray(rawPolicy.acceptedOutputModes, A2A_OUTBOUND_DEFAULT_CONFIG.policy.acceptedOutputModes),
|
|
192
|
+
normalizeBaseUrl: readBoolean(rawPolicy.normalizeBaseUrl, A2A_OUTBOUND_DEFAULT_CONFIG.policy.normalizeBaseUrl),
|
|
193
|
+
enforceSupportedTransports: readBoolean(rawPolicy.enforceSupportedTransports, A2A_OUTBOUND_DEFAULT_CONFIG.policy.enforceSupportedTransports),
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export const A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA = {
|
|
198
|
+
parse(value) {
|
|
199
|
+
return parseA2AOutboundPluginConfig(value);
|
|
200
|
+
},
|
|
201
|
+
jsonSchema: A2A_OUTBOUND_CONFIG_JSON_SCHEMA,
|
|
202
|
+
uiHints: A2A_OUTBOUND_CONFIG_UI_HINTS,
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,oBAAoB,GAErB,MAAM,gBAAgB,CAAC;AAqBxB,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,8BAA8B;QACxC,mBAAmB,EAAE,CAAC,GAAG,oBAAoB,CAAC;QAC9C,iBAAiB,EAAE,EAAE;KACtB;IACD,MAAM,EAAE;QACN,mBAAmB,EAAE,EAAE;QACvB,gBAAgB,EAAE,IAAI;QACtB,0BAA0B,EAAE,IAAI;KACjC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAExC;IACF,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,2BAA2B,CAAC,OAAO;SAC7C;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,2BAA2B,CAAC,QAAQ,CAAC,SAAS;iBACxD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,2BAA2B,CAAC,QAAQ,CAAC,QAAQ;iBACvD;gBACD,mBAAmB,EAAE;oBACnB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC;qBAC1B;oBACD,OAAO,EAAE,CAAC,GAAG,2BAA2B,CAAC,QAAQ,CAAC,mBAAmB,CAAC;iBACvE;gBACD,iBAAiB,EAAE;oBACjB,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxC,OAAO,EAAE,EAAE,GAAG,2BAA2B,CAAC,QAAQ,CAAC,iBAAiB,EAAE;iBACvE;aACF;SACF;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,mBAAmB,EAAE;oBACnB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,OAAO,EAAE,CAAC,GAAG,2BAA2B,CAAC,MAAM,CAAC,mBAAmB,CAAC;iBACrE;gBACD,gBAAgB,EAAE;oBAChB,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,2BAA2B,CAAC,MAAM,CAAC,gBAAgB;iBAC7D;gBACD,0BAA0B,EAAE;oBAC1B,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,2BAA2B,CAAC,MAAM,CAAC,0BAA0B;iBACvE;aACF;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAErC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,uDAAuD;KAC9D;IACD,oBAAoB,EAAE;QACpB,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,wDAAwD;QAC9D,QAAQ,EAAE,IAAI;KACf;IACD,mBAAmB,EAAE;QACnB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,8CAA8C;QACpD,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,8BAA8B;KAC5C;IACD,8BAA8B,EAAE;QAC9B,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,wDAAwD;QAC9D,QAAQ,EAAE,IAAI;KACf;IACD,4BAA4B,EAAE;QAC5B,KAAK,EAAE,4BAA4B;QACnC,IAAI,EAAE,0DAA0D;QAChE,QAAQ,EAAE,IAAI;KACf;IACD,4BAA4B,EAAE;QAC5B,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,4DAA4D;QAClE,QAAQ,EAAE,IAAI;KACf;IACD,yBAAyB,EAAE;QACzB,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,kDAAkD;QACxD,QAAQ,EAAE,IAAI;KACf;IACD,mCAAmC,EAAE;QACnC,KAAK,EAAE,8BAA8B;QACrC,IAAI,EAAE,kEAAkE;QACxE,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,MAA+B;IAClD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE;YACR,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;YACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAClC,mBAAmB,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC7D,iBAAiB,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE;SAC5D;QACD,MAAM,EAAE;YACN,mBAAmB,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAC3D,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;YAChD,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,0BAA0B;SACrE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc,EACd,WAAqB,EAAE;IAEvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAc,EACd,QAAwB;IAExB,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,MAAM,CACnD,CAAC,KAAK,EAAyB,EAAE,CAC/B,cAAc,CAAC,QAAQ,CAAC,KAAqB,CAAC,CACjD,CAAC;IAEF,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc,EACd,WAAmC,EAAE;IAErC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,QAAiB;IACpD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,QAAgB;IAC3D,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC;QACrD,CAAC,CAAE,KAAgB;QACnB,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAc;IAEd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,CAAC,OAAO,CAAC;QACxE,QAAQ,EAAE;YACR,SAAS,EAAE,mBAAmB,CAC5B,WAAW,CAAC,SAAS,EACrB,2BAA2B,CAAC,QAAQ,CAAC,SAAS,CAC/C;YACD,QAAQ,EACN,OAAO,WAAW,CAAC,QAAQ,KAAK,QAAQ;gBACxC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBAChC,CAAC,CAAC,WAAW,CAAC,QAAQ;gBACtB,CAAC,CAAC,2BAA2B,CAAC,QAAQ,CAAC,QAAQ;YACnD,mBAAmB,EAAE,mBAAmB,CACtC,WAAW,CAAC,mBAAmB,EAC/B,2BAA2B,CAAC,QAAQ,CAAC,mBAAmB,CACzD;YACD,iBAAiB,EAAE,kBAAkB,CACnC,WAAW,CAAC,iBAAiB,EAC7B,2BAA2B,CAAC,QAAQ,CAAC,iBAAiB,CACvD;SACF;QACD,MAAM,EAAE;YACN,mBAAmB,EAAE,oBAAoB,CACvC,SAAS,CAAC,mBAAmB,EAC7B,2BAA2B,CAAC,MAAM,CAAC,mBAAmB,CACvD;YACD,gBAAgB,EAAE,WAAW,CAC3B,SAAS,CAAC,gBAAgB,EAC1B,2BAA2B,CAAC,MAAM,CAAC,gBAAgB,CACpD;YACD,0BAA0B,EAAE,WAAW,CACrC,SAAS,CAAC,0BAA0B,EACpC,2BAA2B,CAAC,MAAM,CAAC,0BAA0B,CAC9D;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAC9C;IACE,KAAK,CAAC,KAAc;QAClB,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,UAAU,EAAE,+BAA+B;IAC3C,OAAO,EAAE,4BAA4B;CACtC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const PLUGIN_ID = "a2a-outbound";
|
|
2
|
+
export declare const ALL_TRANSPORTS: readonly ["JSONRPC", "HTTP+JSON", "GRPC"];
|
|
3
|
+
export declare const SUPPORTED_TRANSPORTS: readonly ["JSONRPC", "HTTP+JSON"];
|
|
4
|
+
export type A2ATransport = (typeof ALL_TRANSPORTS)[number];
|
|
5
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,eAAO,MAAM,cAAc,2CAA4C,CAAC;AACxE,eAAO,MAAM,oBAAoB,mCAAoC,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,WAAW,CAAU,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const ERROR_CODES: {
|
|
2
|
+
readonly VALIDATION_ERROR: "VALIDATION_ERROR";
|
|
3
|
+
readonly A2A_SDK_ERROR: "A2A_SDK_ERROR";
|
|
4
|
+
readonly INTERNAL_ERROR: "INTERNAL_ERROR";
|
|
5
|
+
};
|
|
6
|
+
export type A2AOutboundErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];
|
|
7
|
+
export interface ToolError {
|
|
8
|
+
code: A2AOutboundErrorCode | string;
|
|
9
|
+
message: string;
|
|
10
|
+
details?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare class A2AOutboundError extends Error {
|
|
13
|
+
readonly code: A2AOutboundErrorCode;
|
|
14
|
+
readonly details?: unknown;
|
|
15
|
+
constructor(code: A2AOutboundErrorCode, message: string, details?: unknown, options?: ErrorOptions);
|
|
16
|
+
}
|
|
17
|
+
export declare function isA2AOutboundError(value: unknown): value is A2AOutboundError;
|
|
18
|
+
export declare function toToolError(error: unknown, fallbackCode?: A2AOutboundErrorCode): ToolError;
|
|
19
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAC9B,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAEpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAGzB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE,YAAY;CAOzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAqED,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,YAAY,GAAE,oBAAiD,GAC9D,SAAS,CA+CX"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export const ERROR_CODES = {
|
|
2
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
3
|
+
A2A_SDK_ERROR: "A2A_SDK_ERROR",
|
|
4
|
+
INTERNAL_ERROR: "INTERNAL_ERROR",
|
|
5
|
+
};
|
|
6
|
+
export class A2AOutboundError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
details;
|
|
9
|
+
constructor(code, message, details, options) {
|
|
10
|
+
super(message, options);
|
|
11
|
+
this.name = "A2AOutboundError";
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.details = details;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function isA2AOutboundError(value) {
|
|
17
|
+
return value instanceof A2AOutboundError;
|
|
18
|
+
}
|
|
19
|
+
function compactStack(stack) {
|
|
20
|
+
if (!stack) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const maxLines = 10;
|
|
24
|
+
const maxChars = 1600;
|
|
25
|
+
const lines = stack.split("\n").slice(0, maxLines);
|
|
26
|
+
const preview = lines.join("\n");
|
|
27
|
+
if (preview.length <= maxChars) {
|
|
28
|
+
return preview;
|
|
29
|
+
}
|
|
30
|
+
return `${preview.slice(0, maxChars)}…`;
|
|
31
|
+
}
|
|
32
|
+
function summarizeUnknown(value) {
|
|
33
|
+
if (value === null || value === undefined) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === "string" ||
|
|
37
|
+
typeof value === "number" ||
|
|
38
|
+
typeof value === "boolean") {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
if (typeof value === "bigint") {
|
|
42
|
+
return `${value}n`;
|
|
43
|
+
}
|
|
44
|
+
if (value instanceof Error) {
|
|
45
|
+
return {
|
|
46
|
+
name: value.name,
|
|
47
|
+
message: value.message,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
return {
|
|
52
|
+
type: "array",
|
|
53
|
+
length: value.length,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (typeof value === "object") {
|
|
57
|
+
return {
|
|
58
|
+
type: "object",
|
|
59
|
+
keys: Object.keys(value).slice(0, 20),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return String(value);
|
|
63
|
+
}
|
|
64
|
+
function isAbortOrTimeoutError(error) {
|
|
65
|
+
if (!error || typeof error !== "object") {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const name = String(error.name ?? "");
|
|
69
|
+
return name === "AbortError" || name === "TimeoutError";
|
|
70
|
+
}
|
|
71
|
+
export function toToolError(error, fallbackCode = ERROR_CODES.INTERNAL_ERROR) {
|
|
72
|
+
if (isA2AOutboundError(error)) {
|
|
73
|
+
return {
|
|
74
|
+
code: error.code,
|
|
75
|
+
message: error.message,
|
|
76
|
+
...(error.details !== undefined ? { details: error.details } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (isAbortOrTimeoutError(error)) {
|
|
80
|
+
return {
|
|
81
|
+
code: ERROR_CODES.A2A_SDK_ERROR,
|
|
82
|
+
message: "request timed out",
|
|
83
|
+
details: {
|
|
84
|
+
hint: "Increase request.timeoutMs or plugin defaults.timeoutMs.",
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (error instanceof Error) {
|
|
89
|
+
const details = {
|
|
90
|
+
errorName: error.name,
|
|
91
|
+
};
|
|
92
|
+
const stack = compactStack(error.stack);
|
|
93
|
+
if (stack !== undefined) {
|
|
94
|
+
details.stack = stack;
|
|
95
|
+
}
|
|
96
|
+
const cause = summarizeUnknown(error.cause);
|
|
97
|
+
if (cause !== undefined) {
|
|
98
|
+
details.cause = cause;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
code: fallbackCode,
|
|
102
|
+
message: error.message,
|
|
103
|
+
details,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
code: fallbackCode,
|
|
108
|
+
message: String(error),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type OpenClawPluginApi, type OpenClawPluginConfigSchema } from "openclaw/plugin-sdk";
|
|
2
|
+
declare function registerTools(api: OpenClawPluginApi): void;
|
|
3
|
+
export declare const id = "a2a-outbound";
|
|
4
|
+
export declare const plugin: {
|
|
5
|
+
id: string;
|
|
6
|
+
configSchema: OpenClawPluginConfigSchema;
|
|
7
|
+
register: typeof registerTools;
|
|
8
|
+
};
|
|
9
|
+
export default plugin;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAChC,MAAM,qBAAqB,CAAC;AAgB7B,iBAAS,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAyCnD;AAED,eAAO,MAAM,EAAE,iBAAY,CAAC;AAE5B,eAAO,MAAM,MAAM;;;;CAIO,CAAC;AAE3B,eAAe,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsonResult, } from "openclaw/plugin-sdk";
|
|
2
|
+
import { PLUGIN_ID } from "./constants.js";
|
|
3
|
+
import { A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA, } from "./config.js";
|
|
4
|
+
import { log } from "./logging.js";
|
|
5
|
+
import { TOOL_DEFINITIONS } from "./schemas.js";
|
|
6
|
+
import { buildService } from "./service.js";
|
|
7
|
+
function registerTools(api) {
|
|
8
|
+
const config = A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA.parse?.(api.pluginConfig ?? {});
|
|
9
|
+
if (config.enabled !== true) {
|
|
10
|
+
log(api.logger, "info", "a2a.plugin.disabled", { pluginId: PLUGIN_ID });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const service = buildService({
|
|
14
|
+
config: api.pluginConfig,
|
|
15
|
+
logger: api.logger,
|
|
16
|
+
});
|
|
17
|
+
const delegateTool = {
|
|
18
|
+
...TOOL_DEFINITIONS.a2a_delegate,
|
|
19
|
+
execute: async (input) => jsonResult(await service.delegate(input)),
|
|
20
|
+
};
|
|
21
|
+
const statusTool = {
|
|
22
|
+
...TOOL_DEFINITIONS.a2a_task_status,
|
|
23
|
+
execute: async (input) => jsonResult(await service.status(input)),
|
|
24
|
+
};
|
|
25
|
+
const cancelTool = {
|
|
26
|
+
...TOOL_DEFINITIONS.a2a_task_cancel,
|
|
27
|
+
execute: async (input) => jsonResult(await service.cancel(input)),
|
|
28
|
+
};
|
|
29
|
+
api.registerTool(delegateTool, { optional: true });
|
|
30
|
+
api.registerTool(statusTool, { optional: true });
|
|
31
|
+
api.registerTool(cancelTool, { optional: true });
|
|
32
|
+
log(api.logger, "info", "a2a.plugin.loaded", {
|
|
33
|
+
pluginId: PLUGIN_ID,
|
|
34
|
+
tools: Object.keys(TOOL_DEFINITIONS),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export const id = PLUGIN_ID;
|
|
38
|
+
export const plugin = {
|
|
39
|
+
id: PLUGIN_ID,
|
|
40
|
+
configSchema: A2A_OUTBOUND_OPENCLAW_CONFIG_SCHEMA,
|
|
41
|
+
register: registerTools,
|
|
42
|
+
};
|
|
43
|
+
export default plugin;
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAIX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,mCAAmC,GAEpC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C,SAAS,aAAa,CAAC,GAAsB;IAC3C,MAAM,MAAM,GAAG,mCAAmC,CAAC,KAAK,EAAE,CACxD,GAAG,CAAC,YAAY,IAAI,EAAE,CACI,CAAC;IAE7B,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,YAAY;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAiB;QACjC,GAAG,gBAAgB,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,CAChC,UAAU,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAC5C,CAAC;IAEF,MAAM,UAAU,GAAiB;QAC/B,GAAG,gBAAgB,CAAC,eAAe;QACnC,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3E,CAAC;IAEF,MAAM,UAAU,GAAiB;QAC/B,GAAG,gBAAgB,CAAC,eAAe;QACnC,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3E,CAAC;IAEF,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE;QAC3C,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;AAE5B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAE,SAAS;IACb,YAAY,EAAE,mCAAmC;IACjD,QAAQ,EAAE,aAAa;CACC,CAAC;AAE3B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type LoggerLike = {
|
|
2
|
+
debug?: (message: string) => void;
|
|
3
|
+
info?: (message: string) => void;
|
|
4
|
+
warn?: (message: string) => void;
|
|
5
|
+
error?: (message: string) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function log(logger: LoggerLike | undefined, level: "debug" | "info" | "warn" | "error", event: string, fields?: Record<string, unknown>): void;
|
|
8
|
+
export type TraceSpan = {
|
|
9
|
+
setAttribute?: (name: string, value: unknown) => void;
|
|
10
|
+
recordException?: (error: unknown) => void;
|
|
11
|
+
end?: () => void;
|
|
12
|
+
};
|
|
13
|
+
export type TracerLike = {
|
|
14
|
+
startSpan?: (name: string, options?: {
|
|
15
|
+
attributes?: Record<string, unknown>;
|
|
16
|
+
}) => TraceSpan;
|
|
17
|
+
};
|
|
18
|
+
export declare function startSpan(tracer: TracerLike | undefined, name: string, attributes?: Record<string, unknown>): TraceSpan;
|
|
19
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,wBAAgB,GAAG,CACjB,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAC1C,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAUN;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAC/C,SAAS,CAAC;CAChB,CAAC;AAEF,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACvC,SAAS,CAUX"}
|