@redonvn/open-claw-sdk 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/dist/chunk-VZE5THET.js +380 -0
- package/dist/chunk-VZE5THET.js.map +1 -0
- package/dist/cli.cjs +466 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +559 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +168 -0
- package/dist/index.d.ts +168 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/docs/DOCS.md +342 -0
- package/docs/docs-json.json +392611 -0
- package/package.json +43 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
2
|
+
type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
3
|
+
type JsonObject = {
|
|
4
|
+
[key: string]: JsonValue | undefined;
|
|
5
|
+
};
|
|
6
|
+
type HttpMethod = "get" | "post" | "put" | "patch" | "delete" | "options" | "head";
|
|
7
|
+
type OpenApiSchemaObject = {
|
|
8
|
+
$ref?: string;
|
|
9
|
+
type?: string | string[] | undefined;
|
|
10
|
+
format?: string | undefined;
|
|
11
|
+
title?: string | undefined;
|
|
12
|
+
description?: string | undefined;
|
|
13
|
+
nullable?: boolean | undefined;
|
|
14
|
+
default?: JsonValue | undefined;
|
|
15
|
+
enum?: JsonPrimitive[] | undefined;
|
|
16
|
+
items?: OpenApiSchemaObject | undefined;
|
|
17
|
+
properties?: Record<string, OpenApiSchemaObject> | undefined;
|
|
18
|
+
required?: string[] | undefined;
|
|
19
|
+
oneOf?: OpenApiSchemaObject[] | undefined;
|
|
20
|
+
anyOf?: OpenApiSchemaObject[] | undefined;
|
|
21
|
+
allOf?: OpenApiSchemaObject[] | undefined;
|
|
22
|
+
additionalProperties?: boolean | OpenApiSchemaObject | undefined;
|
|
23
|
+
};
|
|
24
|
+
type OpenApiParameterObject = {
|
|
25
|
+
name: string;
|
|
26
|
+
in: "path" | "query" | "header" | "cookie";
|
|
27
|
+
required?: boolean | undefined;
|
|
28
|
+
description?: string | undefined;
|
|
29
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
30
|
+
};
|
|
31
|
+
type OpenApiRequestBodyObject = {
|
|
32
|
+
required?: boolean | undefined;
|
|
33
|
+
description?: string | undefined;
|
|
34
|
+
content?: Record<string, {
|
|
35
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
36
|
+
}> | undefined;
|
|
37
|
+
};
|
|
38
|
+
type OpenApiResponseObject = {
|
|
39
|
+
description?: string | undefined;
|
|
40
|
+
content?: Record<string, {
|
|
41
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
42
|
+
}> | undefined;
|
|
43
|
+
};
|
|
44
|
+
type OpenApiOperationObject = {
|
|
45
|
+
operationId?: string | undefined;
|
|
46
|
+
summary?: string | undefined;
|
|
47
|
+
description?: string | undefined;
|
|
48
|
+
tags?: string[] | undefined;
|
|
49
|
+
parameters?: OpenApiParameterObject[] | undefined;
|
|
50
|
+
requestBody?: OpenApiRequestBodyObject | undefined;
|
|
51
|
+
responses?: Record<string, OpenApiResponseObject> | undefined;
|
|
52
|
+
};
|
|
53
|
+
type OpenApiPathItemObject = Record<string, OpenApiOperationObject> & {
|
|
54
|
+
parameters?: OpenApiParameterObject[];
|
|
55
|
+
};
|
|
56
|
+
type OpenApiDocument = {
|
|
57
|
+
openapi: string;
|
|
58
|
+
info?: {
|
|
59
|
+
title?: string | undefined;
|
|
60
|
+
description?: string | undefined;
|
|
61
|
+
version?: string | undefined;
|
|
62
|
+
} | undefined;
|
|
63
|
+
servers?: Array<{
|
|
64
|
+
url: string;
|
|
65
|
+
description?: string | undefined;
|
|
66
|
+
}> | undefined;
|
|
67
|
+
paths: Record<string, OpenApiPathItemObject>;
|
|
68
|
+
components?: {
|
|
69
|
+
schemas?: Record<string, OpenApiSchemaObject> | undefined;
|
|
70
|
+
} | undefined;
|
|
71
|
+
};
|
|
72
|
+
type JsonSchema = {
|
|
73
|
+
type?: string | string[] | undefined;
|
|
74
|
+
description?: string | undefined;
|
|
75
|
+
default?: JsonValue | undefined;
|
|
76
|
+
enum?: JsonPrimitive[] | undefined;
|
|
77
|
+
properties?: Record<string, JsonSchema> | undefined;
|
|
78
|
+
required?: string[] | undefined;
|
|
79
|
+
items?: JsonSchema | undefined;
|
|
80
|
+
oneOf?: JsonSchema[] | undefined;
|
|
81
|
+
anyOf?: JsonSchema[] | undefined;
|
|
82
|
+
allOf?: JsonSchema[] | undefined;
|
|
83
|
+
additionalProperties?: boolean | JsonSchema | undefined;
|
|
84
|
+
};
|
|
85
|
+
type OpenClawToolDefinition = {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
method: Uppercase<HttpMethod>;
|
|
89
|
+
path: string;
|
|
90
|
+
operationId: string;
|
|
91
|
+
parameters: JsonSchema;
|
|
92
|
+
tags: string[];
|
|
93
|
+
};
|
|
94
|
+
type OpenClawPluginCatalog = {
|
|
95
|
+
pluginId: string;
|
|
96
|
+
pluginName: string;
|
|
97
|
+
description: string;
|
|
98
|
+
serverUrl?: string | undefined;
|
|
99
|
+
optional?: boolean | undefined;
|
|
100
|
+
tools: OpenClawToolDefinition[];
|
|
101
|
+
};
|
|
102
|
+
type ConvertOpenApiOptions = {
|
|
103
|
+
pluginId: string;
|
|
104
|
+
pluginName?: string | undefined;
|
|
105
|
+
toolPrefix?: string | undefined;
|
|
106
|
+
optional?: boolean | undefined;
|
|
107
|
+
includeHeaders?: boolean | undefined;
|
|
108
|
+
defaultServerUrl?: string | undefined;
|
|
109
|
+
};
|
|
110
|
+
type PluginRuntimeConfig = {
|
|
111
|
+
baseUrl?: string | undefined;
|
|
112
|
+
bearerToken?: string | undefined;
|
|
113
|
+
apiKey?: string | undefined;
|
|
114
|
+
apiKeyHeader?: string | undefined;
|
|
115
|
+
defaultHeaders?: Record<string, string> | undefined;
|
|
116
|
+
timeoutMs?: number | undefined;
|
|
117
|
+
};
|
|
118
|
+
type OpenClawApiLike = {
|
|
119
|
+
config?: {
|
|
120
|
+
plugins?: {
|
|
121
|
+
entries?: Record<string, {
|
|
122
|
+
config?: PluginRuntimeConfig;
|
|
123
|
+
}>;
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
registerTool: (definition: {
|
|
127
|
+
name: string;
|
|
128
|
+
description: string;
|
|
129
|
+
parameters: JsonSchema;
|
|
130
|
+
execute: (id: string, params: unknown) => Promise<{
|
|
131
|
+
content: Array<{
|
|
132
|
+
type: "text";
|
|
133
|
+
text: string;
|
|
134
|
+
}>;
|
|
135
|
+
}>;
|
|
136
|
+
}, options?: {
|
|
137
|
+
optional?: boolean;
|
|
138
|
+
}) => void;
|
|
139
|
+
};
|
|
140
|
+
type CreatePluginFactoryOptions = {
|
|
141
|
+
timeoutMs?: number;
|
|
142
|
+
};
|
|
143
|
+
type GeneratePluginOptions = ConvertOpenApiOptions & {
|
|
144
|
+
input: string;
|
|
145
|
+
outDir: string;
|
|
146
|
+
};
|
|
147
|
+
type GeneratedPluginFiles = {
|
|
148
|
+
manifestPath: string;
|
|
149
|
+
indexPath: string;
|
|
150
|
+
catalogPath: string;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
declare const renderPluginManifest: (catalog: OpenClawPluginCatalog) => string;
|
|
154
|
+
declare const renderPluginModule: (catalog: OpenClawPluginCatalog) => string;
|
|
155
|
+
declare const renderCatalogFile: (catalog: OpenClawPluginCatalog) => string;
|
|
156
|
+
declare const writeGeneratedPlugin: (catalog: OpenClawPluginCatalog, outDir: string) => Promise<GeneratedPluginFiles>;
|
|
157
|
+
declare const generatePluginFromOpenApi: (options: GeneratePluginOptions) => Promise<{
|
|
158
|
+
catalog: OpenClawPluginCatalog;
|
|
159
|
+
files: GeneratedPluginFiles;
|
|
160
|
+
}>;
|
|
161
|
+
|
|
162
|
+
declare const loadOpenApiDocument: (source: string) => Promise<OpenApiDocument>;
|
|
163
|
+
declare const openApiSchemaToJsonSchema: (schema: OpenApiSchemaObject | undefined, document: OpenApiDocument, seen?: Set<string>) => JsonSchema;
|
|
164
|
+
declare const convertOpenApiToTools: (document: OpenApiDocument, options: ConvertOpenApiOptions) => OpenClawPluginCatalog;
|
|
165
|
+
|
|
166
|
+
declare const createOpenApiPlugin: (catalog: OpenClawPluginCatalog, options?: CreatePluginFactoryOptions) => (api: OpenClawApiLike) => void;
|
|
167
|
+
|
|
168
|
+
export { type ConvertOpenApiOptions, type CreatePluginFactoryOptions, type GeneratePluginOptions, type GeneratedPluginFiles, type HttpMethod, type JsonObject, type JsonPrimitive, type JsonSchema, type JsonValue, type OpenApiDocument, type OpenApiOperationObject, type OpenApiParameterObject, type OpenApiPathItemObject, type OpenApiRequestBodyObject, type OpenApiResponseObject, type OpenApiSchemaObject, type OpenClawApiLike, type OpenClawPluginCatalog, type OpenClawToolDefinition, type PluginRuntimeConfig, convertOpenApiToTools, createOpenApiPlugin, generatePluginFromOpenApi, loadOpenApiDocument, openApiSchemaToJsonSchema, renderCatalogFile, renderPluginManifest, renderPluginModule, writeGeneratedPlugin };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
2
|
+
type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
3
|
+
type JsonObject = {
|
|
4
|
+
[key: string]: JsonValue | undefined;
|
|
5
|
+
};
|
|
6
|
+
type HttpMethod = "get" | "post" | "put" | "patch" | "delete" | "options" | "head";
|
|
7
|
+
type OpenApiSchemaObject = {
|
|
8
|
+
$ref?: string;
|
|
9
|
+
type?: string | string[] | undefined;
|
|
10
|
+
format?: string | undefined;
|
|
11
|
+
title?: string | undefined;
|
|
12
|
+
description?: string | undefined;
|
|
13
|
+
nullable?: boolean | undefined;
|
|
14
|
+
default?: JsonValue | undefined;
|
|
15
|
+
enum?: JsonPrimitive[] | undefined;
|
|
16
|
+
items?: OpenApiSchemaObject | undefined;
|
|
17
|
+
properties?: Record<string, OpenApiSchemaObject> | undefined;
|
|
18
|
+
required?: string[] | undefined;
|
|
19
|
+
oneOf?: OpenApiSchemaObject[] | undefined;
|
|
20
|
+
anyOf?: OpenApiSchemaObject[] | undefined;
|
|
21
|
+
allOf?: OpenApiSchemaObject[] | undefined;
|
|
22
|
+
additionalProperties?: boolean | OpenApiSchemaObject | undefined;
|
|
23
|
+
};
|
|
24
|
+
type OpenApiParameterObject = {
|
|
25
|
+
name: string;
|
|
26
|
+
in: "path" | "query" | "header" | "cookie";
|
|
27
|
+
required?: boolean | undefined;
|
|
28
|
+
description?: string | undefined;
|
|
29
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
30
|
+
};
|
|
31
|
+
type OpenApiRequestBodyObject = {
|
|
32
|
+
required?: boolean | undefined;
|
|
33
|
+
description?: string | undefined;
|
|
34
|
+
content?: Record<string, {
|
|
35
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
36
|
+
}> | undefined;
|
|
37
|
+
};
|
|
38
|
+
type OpenApiResponseObject = {
|
|
39
|
+
description?: string | undefined;
|
|
40
|
+
content?: Record<string, {
|
|
41
|
+
schema?: OpenApiSchemaObject | undefined;
|
|
42
|
+
}> | undefined;
|
|
43
|
+
};
|
|
44
|
+
type OpenApiOperationObject = {
|
|
45
|
+
operationId?: string | undefined;
|
|
46
|
+
summary?: string | undefined;
|
|
47
|
+
description?: string | undefined;
|
|
48
|
+
tags?: string[] | undefined;
|
|
49
|
+
parameters?: OpenApiParameterObject[] | undefined;
|
|
50
|
+
requestBody?: OpenApiRequestBodyObject | undefined;
|
|
51
|
+
responses?: Record<string, OpenApiResponseObject> | undefined;
|
|
52
|
+
};
|
|
53
|
+
type OpenApiPathItemObject = Record<string, OpenApiOperationObject> & {
|
|
54
|
+
parameters?: OpenApiParameterObject[];
|
|
55
|
+
};
|
|
56
|
+
type OpenApiDocument = {
|
|
57
|
+
openapi: string;
|
|
58
|
+
info?: {
|
|
59
|
+
title?: string | undefined;
|
|
60
|
+
description?: string | undefined;
|
|
61
|
+
version?: string | undefined;
|
|
62
|
+
} | undefined;
|
|
63
|
+
servers?: Array<{
|
|
64
|
+
url: string;
|
|
65
|
+
description?: string | undefined;
|
|
66
|
+
}> | undefined;
|
|
67
|
+
paths: Record<string, OpenApiPathItemObject>;
|
|
68
|
+
components?: {
|
|
69
|
+
schemas?: Record<string, OpenApiSchemaObject> | undefined;
|
|
70
|
+
} | undefined;
|
|
71
|
+
};
|
|
72
|
+
type JsonSchema = {
|
|
73
|
+
type?: string | string[] | undefined;
|
|
74
|
+
description?: string | undefined;
|
|
75
|
+
default?: JsonValue | undefined;
|
|
76
|
+
enum?: JsonPrimitive[] | undefined;
|
|
77
|
+
properties?: Record<string, JsonSchema> | undefined;
|
|
78
|
+
required?: string[] | undefined;
|
|
79
|
+
items?: JsonSchema | undefined;
|
|
80
|
+
oneOf?: JsonSchema[] | undefined;
|
|
81
|
+
anyOf?: JsonSchema[] | undefined;
|
|
82
|
+
allOf?: JsonSchema[] | undefined;
|
|
83
|
+
additionalProperties?: boolean | JsonSchema | undefined;
|
|
84
|
+
};
|
|
85
|
+
type OpenClawToolDefinition = {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
method: Uppercase<HttpMethod>;
|
|
89
|
+
path: string;
|
|
90
|
+
operationId: string;
|
|
91
|
+
parameters: JsonSchema;
|
|
92
|
+
tags: string[];
|
|
93
|
+
};
|
|
94
|
+
type OpenClawPluginCatalog = {
|
|
95
|
+
pluginId: string;
|
|
96
|
+
pluginName: string;
|
|
97
|
+
description: string;
|
|
98
|
+
serverUrl?: string | undefined;
|
|
99
|
+
optional?: boolean | undefined;
|
|
100
|
+
tools: OpenClawToolDefinition[];
|
|
101
|
+
};
|
|
102
|
+
type ConvertOpenApiOptions = {
|
|
103
|
+
pluginId: string;
|
|
104
|
+
pluginName?: string | undefined;
|
|
105
|
+
toolPrefix?: string | undefined;
|
|
106
|
+
optional?: boolean | undefined;
|
|
107
|
+
includeHeaders?: boolean | undefined;
|
|
108
|
+
defaultServerUrl?: string | undefined;
|
|
109
|
+
};
|
|
110
|
+
type PluginRuntimeConfig = {
|
|
111
|
+
baseUrl?: string | undefined;
|
|
112
|
+
bearerToken?: string | undefined;
|
|
113
|
+
apiKey?: string | undefined;
|
|
114
|
+
apiKeyHeader?: string | undefined;
|
|
115
|
+
defaultHeaders?: Record<string, string> | undefined;
|
|
116
|
+
timeoutMs?: number | undefined;
|
|
117
|
+
};
|
|
118
|
+
type OpenClawApiLike = {
|
|
119
|
+
config?: {
|
|
120
|
+
plugins?: {
|
|
121
|
+
entries?: Record<string, {
|
|
122
|
+
config?: PluginRuntimeConfig;
|
|
123
|
+
}>;
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
registerTool: (definition: {
|
|
127
|
+
name: string;
|
|
128
|
+
description: string;
|
|
129
|
+
parameters: JsonSchema;
|
|
130
|
+
execute: (id: string, params: unknown) => Promise<{
|
|
131
|
+
content: Array<{
|
|
132
|
+
type: "text";
|
|
133
|
+
text: string;
|
|
134
|
+
}>;
|
|
135
|
+
}>;
|
|
136
|
+
}, options?: {
|
|
137
|
+
optional?: boolean;
|
|
138
|
+
}) => void;
|
|
139
|
+
};
|
|
140
|
+
type CreatePluginFactoryOptions = {
|
|
141
|
+
timeoutMs?: number;
|
|
142
|
+
};
|
|
143
|
+
type GeneratePluginOptions = ConvertOpenApiOptions & {
|
|
144
|
+
input: string;
|
|
145
|
+
outDir: string;
|
|
146
|
+
};
|
|
147
|
+
type GeneratedPluginFiles = {
|
|
148
|
+
manifestPath: string;
|
|
149
|
+
indexPath: string;
|
|
150
|
+
catalogPath: string;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
declare const renderPluginManifest: (catalog: OpenClawPluginCatalog) => string;
|
|
154
|
+
declare const renderPluginModule: (catalog: OpenClawPluginCatalog) => string;
|
|
155
|
+
declare const renderCatalogFile: (catalog: OpenClawPluginCatalog) => string;
|
|
156
|
+
declare const writeGeneratedPlugin: (catalog: OpenClawPluginCatalog, outDir: string) => Promise<GeneratedPluginFiles>;
|
|
157
|
+
declare const generatePluginFromOpenApi: (options: GeneratePluginOptions) => Promise<{
|
|
158
|
+
catalog: OpenClawPluginCatalog;
|
|
159
|
+
files: GeneratedPluginFiles;
|
|
160
|
+
}>;
|
|
161
|
+
|
|
162
|
+
declare const loadOpenApiDocument: (source: string) => Promise<OpenApiDocument>;
|
|
163
|
+
declare const openApiSchemaToJsonSchema: (schema: OpenApiSchemaObject | undefined, document: OpenApiDocument, seen?: Set<string>) => JsonSchema;
|
|
164
|
+
declare const convertOpenApiToTools: (document: OpenApiDocument, options: ConvertOpenApiOptions) => OpenClawPluginCatalog;
|
|
165
|
+
|
|
166
|
+
declare const createOpenApiPlugin: (catalog: OpenClawPluginCatalog, options?: CreatePluginFactoryOptions) => (api: OpenClawApiLike) => void;
|
|
167
|
+
|
|
168
|
+
export { type ConvertOpenApiOptions, type CreatePluginFactoryOptions, type GeneratePluginOptions, type GeneratedPluginFiles, type HttpMethod, type JsonObject, type JsonPrimitive, type JsonSchema, type JsonValue, type OpenApiDocument, type OpenApiOperationObject, type OpenApiParameterObject, type OpenApiPathItemObject, type OpenApiRequestBodyObject, type OpenApiResponseObject, type OpenApiSchemaObject, type OpenClawApiLike, type OpenClawPluginCatalog, type OpenClawToolDefinition, type PluginRuntimeConfig, convertOpenApiToTools, createOpenApiPlugin, generatePluginFromOpenApi, loadOpenApiDocument, openApiSchemaToJsonSchema, renderCatalogFile, renderPluginManifest, renderPluginModule, writeGeneratedPlugin };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {
|
|
2
|
+
convertOpenApiToTools,
|
|
3
|
+
generatePluginFromOpenApi,
|
|
4
|
+
loadOpenApiDocument,
|
|
5
|
+
openApiSchemaToJsonSchema,
|
|
6
|
+
renderCatalogFile,
|
|
7
|
+
renderPluginManifest,
|
|
8
|
+
renderPluginModule,
|
|
9
|
+
writeGeneratedPlugin
|
|
10
|
+
} from "./chunk-VZE5THET.js";
|
|
11
|
+
|
|
12
|
+
// src/runtime.ts
|
|
13
|
+
var encodeQueryValue = (value) => {
|
|
14
|
+
if (value === null) {
|
|
15
|
+
return "null";
|
|
16
|
+
}
|
|
17
|
+
if (typeof value === "string") {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
};
|
|
25
|
+
var applyPathParams = (pathTemplate, pathParams) => pathTemplate.replace(/\{([^}]+)\}/g, (_, key) => {
|
|
26
|
+
const raw = pathParams?.[key];
|
|
27
|
+
if (raw === void 0 || raw === null) {
|
|
28
|
+
throw new Error(`Missing required path parameter: ${key}`);
|
|
29
|
+
}
|
|
30
|
+
return encodeURIComponent(String(raw));
|
|
31
|
+
});
|
|
32
|
+
var appendQueryParams = (url, query) => {
|
|
33
|
+
if (!query) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const [key, value] of Object.entries(query)) {
|
|
37
|
+
if (value === void 0) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
for (const item of value) {
|
|
42
|
+
url.searchParams.append(key, encodeQueryValue(item));
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
url.searchParams.set(key, encodeQueryValue(value));
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var resolvePluginConfig = (api, pluginId) => api.config?.plugins?.entries?.[pluginId]?.config ?? {};
|
|
50
|
+
var buildHeaders = (runtimeConfig, requestHeaders, hasBody) => {
|
|
51
|
+
const headers = new Headers();
|
|
52
|
+
for (const [key, value] of Object.entries(runtimeConfig.defaultHeaders ?? {})) {
|
|
53
|
+
headers.set(key, value);
|
|
54
|
+
}
|
|
55
|
+
if (runtimeConfig.bearerToken) {
|
|
56
|
+
headers.set("authorization", `Bearer ${runtimeConfig.bearerToken}`);
|
|
57
|
+
} else if (runtimeConfig.apiKey) {
|
|
58
|
+
headers.set(runtimeConfig.apiKeyHeader ?? "x-api-key", runtimeConfig.apiKey);
|
|
59
|
+
}
|
|
60
|
+
for (const [key, value] of Object.entries(requestHeaders ?? {})) {
|
|
61
|
+
if (value !== void 0 && value !== null) {
|
|
62
|
+
headers.set(key, String(value));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (hasBody && !headers.has("content-type")) {
|
|
66
|
+
headers.set("content-type", "application/json");
|
|
67
|
+
}
|
|
68
|
+
return headers;
|
|
69
|
+
};
|
|
70
|
+
var parseResponse = async (response) => {
|
|
71
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
72
|
+
if (contentType.includes("application/json")) {
|
|
73
|
+
return response.json();
|
|
74
|
+
}
|
|
75
|
+
return response.text();
|
|
76
|
+
};
|
|
77
|
+
var formatToolResult = (payload) => ({
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: typeof payload === "string" ? payload : JSON.stringify(payload, null, 2)
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
});
|
|
85
|
+
var createOpenApiPlugin = (catalog, options) => {
|
|
86
|
+
return function register(api) {
|
|
87
|
+
for (const tool of catalog.tools) {
|
|
88
|
+
api.registerTool(
|
|
89
|
+
{
|
|
90
|
+
name: tool.name,
|
|
91
|
+
description: tool.description,
|
|
92
|
+
parameters: tool.parameters,
|
|
93
|
+
execute: async (_id, params) => {
|
|
94
|
+
const runtimeConfig = resolvePluginConfig(api, catalog.pluginId);
|
|
95
|
+
const baseUrl = runtimeConfig.baseUrl ?? catalog.serverUrl;
|
|
96
|
+
if (!baseUrl) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Missing baseUrl for plugin ${catalog.pluginId}. Set plugins.entries.${catalog.pluginId}.config.baseUrl.`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
const input = params ?? {};
|
|
102
|
+
const finalUrl = new URL(
|
|
103
|
+
applyPathParams(tool.path, input.path),
|
|
104
|
+
baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`
|
|
105
|
+
);
|
|
106
|
+
appendQueryParams(finalUrl, input.query);
|
|
107
|
+
const controller = new AbortController();
|
|
108
|
+
const timeoutMs = runtimeConfig.timeoutMs ?? options?.timeoutMs;
|
|
109
|
+
const timeout = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : void 0;
|
|
110
|
+
try {
|
|
111
|
+
const hasBody = input.body !== void 0;
|
|
112
|
+
const requestInit = {
|
|
113
|
+
method: tool.method,
|
|
114
|
+
headers: buildHeaders(runtimeConfig, input.headers, hasBody),
|
|
115
|
+
signal: controller.signal
|
|
116
|
+
};
|
|
117
|
+
if (hasBody) {
|
|
118
|
+
requestInit.body = JSON.stringify(input.body);
|
|
119
|
+
}
|
|
120
|
+
const response = await fetch(finalUrl, requestInit);
|
|
121
|
+
const payload = await parseResponse(response);
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
return formatToolResult({
|
|
124
|
+
ok: false,
|
|
125
|
+
status: response.status,
|
|
126
|
+
statusText: response.statusText,
|
|
127
|
+
data: payload
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return formatToolResult(payload);
|
|
131
|
+
} finally {
|
|
132
|
+
if (timeout) {
|
|
133
|
+
clearTimeout(timeout);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
{ optional: catalog.optional ?? true }
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
export {
|
|
144
|
+
convertOpenApiToTools,
|
|
145
|
+
createOpenApiPlugin,
|
|
146
|
+
generatePluginFromOpenApi,
|
|
147
|
+
loadOpenApiDocument,
|
|
148
|
+
openApiSchemaToJsonSchema,
|
|
149
|
+
renderCatalogFile,
|
|
150
|
+
renderPluginManifest,
|
|
151
|
+
renderPluginModule,
|
|
152
|
+
writeGeneratedPlugin
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts"],"sourcesContent":["import { CreatePluginFactoryOptions, OpenClawApiLike, OpenClawPluginCatalog, PluginRuntimeConfig } from \"./types\";\n\nconst encodeQueryValue = (value: unknown): string => {\n if (value === null) {\n return \"null\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n};\n\nconst applyPathParams = (pathTemplate: string, pathParams: Record<string, unknown> | undefined): string =>\n pathTemplate.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const raw = pathParams?.[key];\n\n if (raw === undefined || raw === null) {\n throw new Error(`Missing required path parameter: ${key}`);\n }\n\n return encodeURIComponent(String(raw));\n });\n\nconst appendQueryParams = (url: URL, query: Record<string, unknown> | undefined): void => {\n if (!query) {\n return;\n }\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n url.searchParams.append(key, encodeQueryValue(item));\n }\n continue;\n }\n\n url.searchParams.set(key, encodeQueryValue(value));\n }\n};\n\nconst resolvePluginConfig = (api: OpenClawApiLike, pluginId: string): PluginRuntimeConfig =>\n api.config?.plugins?.entries?.[pluginId]?.config ?? {};\n\nconst buildHeaders = (\n runtimeConfig: PluginRuntimeConfig,\n requestHeaders: Record<string, unknown> | undefined,\n hasBody: boolean\n): Headers => {\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(runtimeConfig.defaultHeaders ?? {})) {\n headers.set(key, value);\n }\n\n if (runtimeConfig.bearerToken) {\n headers.set(\"authorization\", `Bearer ${runtimeConfig.bearerToken}`);\n } else if (runtimeConfig.apiKey) {\n headers.set(runtimeConfig.apiKeyHeader ?? \"x-api-key\", runtimeConfig.apiKey);\n }\n\n for (const [key, value] of Object.entries(requestHeaders ?? {})) {\n if (value !== undefined && value !== null) {\n headers.set(key, String(value));\n }\n }\n\n if (hasBody && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return headers;\n};\n\nconst parseResponse = async (response: Response): Promise<unknown> => {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n\n return response.text();\n};\n\nconst formatToolResult = (payload: unknown): { content: Array<{ type: \"text\"; text: string }> } => ({\n content: [\n {\n type: \"text\",\n text: typeof payload === \"string\" ? payload : JSON.stringify(payload, null, 2)\n }\n ]\n});\n\nexport const createOpenApiPlugin = (\n catalog: OpenClawPluginCatalog,\n options?: CreatePluginFactoryOptions\n) => {\n return function register(api: OpenClawApiLike): void {\n for (const tool of catalog.tools) {\n api.registerTool(\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n execute: async (_id, params) => {\n const runtimeConfig = resolvePluginConfig(api, catalog.pluginId);\n const baseUrl = runtimeConfig.baseUrl ?? catalog.serverUrl;\n\n if (!baseUrl) {\n throw new Error(\n `Missing baseUrl for plugin ${catalog.pluginId}. Set plugins.entries.${catalog.pluginId}.config.baseUrl.`\n );\n }\n\n const input = (params ?? {}) as {\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n body?: unknown;\n };\n\n const finalUrl = new URL(\n applyPathParams(tool.path, input.path),\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`\n );\n\n appendQueryParams(finalUrl, input.query);\n\n const controller = new AbortController();\n const timeoutMs = runtimeConfig.timeoutMs ?? options?.timeoutMs;\n const timeout = timeoutMs\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined;\n\n try {\n const hasBody = input.body !== undefined;\n const requestInit: RequestInit = {\n method: tool.method,\n headers: buildHeaders(runtimeConfig, input.headers, hasBody),\n signal: controller.signal\n };\n\n if (hasBody) {\n requestInit.body = JSON.stringify(input.body);\n }\n\n const response = await fetch(finalUrl, requestInit);\n\n const payload = await parseResponse(response);\n\n if (!response.ok) {\n return formatToolResult({\n ok: false,\n status: response.status,\n statusText: response.statusText,\n data: payload\n });\n }\n\n return formatToolResult(payload);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n }\n },\n { optional: catalog.optional ?? true }\n );\n }\n };\n};\n"],"mappings":"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","names":[]}
|