@redonvn/open-claw-sdk 0.1.4 → 0.1.6
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-6QQXCYPZ.js → chunk-ANYWXU4Y.js} +26 -2
- package/dist/chunk-ANYWXU4Y.js.map +1 -0
- package/dist/cli.cjs +25 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +67 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +43 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-6QQXCYPZ.js.map +0 -1
|
@@ -70,10 +70,31 @@ var loadOpenApiDocument = async (source) => {
|
|
|
70
70
|
return document;
|
|
71
71
|
};
|
|
72
72
|
var resolveRefName = (ref) => ref.split("/").pop() ?? "UnknownSchema";
|
|
73
|
+
var isReferenceObject = (value) => Boolean(value && "$ref" in value);
|
|
73
74
|
var resolveSchemaRef = (document, ref) => {
|
|
74
75
|
const schemaName = resolveRefName(ref);
|
|
75
76
|
return document.components?.schemas?.[schemaName];
|
|
76
77
|
};
|
|
78
|
+
var resolveParameterRef = (document, ref) => {
|
|
79
|
+
const parameterName = resolveRefName(ref);
|
|
80
|
+
return document.components?.parameters?.[parameterName];
|
|
81
|
+
};
|
|
82
|
+
var resolveParameterObject = (document, parameter, seen = /* @__PURE__ */ new Set()) => {
|
|
83
|
+
if (!isReferenceObject(parameter)) {
|
|
84
|
+
return parameter;
|
|
85
|
+
}
|
|
86
|
+
if (seen.has(parameter.$ref)) {
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
const resolved = resolveParameterRef(document, parameter.$ref);
|
|
90
|
+
if (!resolved) {
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
93
|
+
const nextSeen = new Set(seen);
|
|
94
|
+
nextSeen.add(parameter.$ref);
|
|
95
|
+
return resolveParameterObject(document, resolved, nextSeen);
|
|
96
|
+
};
|
|
97
|
+
var normalizeParameters = (document, parameters) => (parameters ?? []).map((parameter) => resolveParameterObject(document, parameter)).filter((parameter) => Boolean(parameter));
|
|
77
98
|
var openApiSchemaToJsonSchema = (schema, document, seen = /* @__PURE__ */ new Set()) => {
|
|
78
99
|
if (!schema) {
|
|
79
100
|
return { type: "object", additionalProperties: true };
|
|
@@ -295,7 +316,10 @@ var convertOpenApiToTools = (document, options) => {
|
|
|
295
316
|
if (!operation) {
|
|
296
317
|
continue;
|
|
297
318
|
}
|
|
298
|
-
const parameters = dedupeParameters(
|
|
319
|
+
const parameters = dedupeParameters(
|
|
320
|
+
normalizeParameters(document, pathItem.parameters),
|
|
321
|
+
normalizeParameters(document, operation.parameters)
|
|
322
|
+
);
|
|
299
323
|
const pathParameters = parameters.filter((parameter) => parameter.in === "path");
|
|
300
324
|
const queryParameters = parameters.filter((parameter) => parameter.in === "query");
|
|
301
325
|
const headerParameters = parameters.filter(
|
|
@@ -441,4 +465,4 @@ export {
|
|
|
441
465
|
writeGeneratedPlugin,
|
|
442
466
|
generatePluginFromOpenApi
|
|
443
467
|
};
|
|
444
|
-
//# sourceMappingURL=chunk-
|
|
468
|
+
//# sourceMappingURL=chunk-ANYWXU4Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/openapi.ts","../src/utils.ts","../src/generator.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst isReferenceObject = (\n value: OpenApiParameterObject | OpenApiReferenceObject | undefined\n): value is OpenApiReferenceObject => Boolean(value && \"$ref\" in value);\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nconst resolveParameterRef = (\n document: OpenApiDocument,\n ref: string\n): OpenApiParameterObject | undefined => {\n const parameterName = resolveRefName(ref);\n return document.components?.parameters?.[parameterName];\n};\n\nconst resolveParameterObject = (\n document: OpenApiDocument,\n parameter: OpenApiParameterObject | OpenApiReferenceObject,\n seen = new Set<string>()\n): OpenApiParameterObject | undefined => {\n if (!isReferenceObject(parameter)) {\n return parameter;\n }\n\n if (seen.has(parameter.$ref)) {\n return undefined;\n }\n\n const resolved = resolveParameterRef(document, parameter.$ref);\n if (!resolved) {\n return undefined;\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(parameter.$ref);\n return resolveParameterObject(document, resolved, nextSeen);\n};\n\nconst normalizeParameters = (\n document: OpenApiDocument,\n parameters: Array<OpenApiParameterObject | OpenApiReferenceObject> | undefined\n): OpenApiParameterObject[] =>\n (parameters ?? [])\n .map((parameter) => resolveParameterObject(document, parameter))\n .filter((parameter): parameter is OpenApiParameterObject => Boolean(parameter));\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(\n normalizeParameters(document, pathItem.parameters),\n normalizeParameters(document, operation.parameters)\n );\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n"],"mappings":";AAAA,SAAS,YAAY,UAAU;;;ACExB,IAAM,eAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,qBAAqB,CAAC,UACjC,MACG,KAAK,EACL,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,YAAY,EAAE,EACtB,QAAQ,UAAU,GAAG,EACrB,YAAY,KAAK;AAEf,IAAM,cAAc,CAAC,UAC1B,MACG,MAAM,eAAe,EACrB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AAEN,IAAM,gBAAgB,CAAC,YAAgC,YAA4B;AACxF,QAAM,OAAO,mBAAmB,OAAO;AACvC,QAAM,SAAS,mBAAmB,cAAc,EAAE;AAClD,SAAO,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AACxC;AAEO,IAAM,mBAAmB,CAAC,QAAoBA,OAAc,gBAAiC;AAClG,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO,mBAAmB,WAAW;AAAA,EACvC;AAEA,QAAM,WAAWA,MACd,QAAQ,gBAAgB,OAAO,EAC/B,QAAQ,QAAQ,GAAG;AAEtB,SAAO,mBAAmB,GAAG,MAAM,IAAI,QAAQ,EAAE;AACnD;AAEO,IAAM,oBAAoB,CAC/B,YAEA,UAAU,kBAAkB,GAAG,UAC/B,UAAU,oBAAoB,GAAG,UACjC,OAAO,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG;AAE5B,IAAM,mBAAmB,CAC9B,WACA,mBAC6B;AAC7B,QAAM,QAAQ,oBAAI,IAAoC;AAEtD,aAAW,SAAS,CAAC,GAAI,aAAa,CAAC,GAAI,GAAI,kBAAkB,CAAC,CAAE,GAAG;AACrE,UAAM,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK;AAAA,EAC9C;AAEA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAC3B;AAEO,IAAM,gBAAgB,CAAoC,UAAgB;AAC/E,QAAM,SAAS,CAAC;AAEhB,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,SAAS,QAAW;AACtB,aAAO,GAAc,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,WAC/B;AAAA,EACE,WACI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,KAC5D,OAAO,YAAY,OAAO,SAAS,SAAS,KAC7C,OAAO,QACP,OAAO,SACP,OAAO,SACP,OAAO;AACb;;;ADtEF,IAAM,YAAY,CAAC,UAA2B,gBAAgB,KAAK,KAAK;AAExE,IAAM,UAAU,OAAO,QAAiC;AACtD,QAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,wCAAwC,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC1G;AAEA,SAAO,SAAS,KAAK;AACvB;AAEO,IAAM,sBAAsB,OAAO,WAA6C;AACrF,QAAM,MAAM,UAAU,MAAM,IACxB,MAAM,QAAQ,MAAM,IACpB,MAAM,GAAG,SAAS,QAAQ,MAAM;AAEpC,QAAM,WAAW,KAAK,MAAM,GAAG;AAE/B,MAAI,CAAC,SAAS,WAAW,CAAC,SAAS,OAAO;AACxC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO;AACT;AAIA,IAAM,iBAAiB,CAAC,QAAwB,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AAExE,IAAM,oBAAoB,CACxB,UACoC,QAAQ,SAAS,UAAU,KAAK;AAEtE,IAAM,mBAAmB,CACvB,UACA,QACsD;AACtD,QAAM,aAAa,eAAe,GAAG;AACrC,SAAO,SAAS,YAAY,UAAU,UAAU;AAClD;AAEA,IAAM,sBAAsB,CAC1B,UACA,QACuC;AACvC,QAAM,gBAAgB,eAAe,GAAG;AACxC,SAAO,SAAS,YAAY,aAAa,aAAa;AACxD;AAEA,IAAM,yBAAyB,CAC7B,UACA,WACA,OAAO,oBAAI,IAAY,MACgB;AACvC,MAAI,CAAC,kBAAkB,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,IAAI,UAAU,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBAAoB,UAAU,UAAU,IAAI;AAC7D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,WAAS,IAAI,UAAU,IAAI;AAC3B,SAAO,uBAAuB,UAAU,UAAU,QAAQ;AAC5D;AAEA,IAAM,sBAAsB,CAC1B,UACA,gBAEC,cAAc,CAAC,GACb,IAAI,CAAC,cAAc,uBAAuB,UAAU,SAAS,CAAC,EAC9D,OAAO,CAAC,cAAmD,QAAQ,SAAS,CAAC;AAE3E,IAAM,4BAA4B,CACvC,QACA,UACA,OAAO,oBAAI,IAAY,MACR;AACf,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,MAAM,UAAU,sBAAsB,KAAK;AAAA,EACtD;AAEA,MAAI,OAAO,MAAM;AACf,QAAI,KAAK,IAAI,OAAO,IAAI,GAAG;AACzB,aAAO,EAAE,MAAM,UAAU,sBAAsB,KAAK;AAAA,IACtD;AAEA,UAAM,WAAW,iBAAiB,UAAU,OAAO,IAAI;AAEvD,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,MAAM,UAAU,sBAAsB,KAAK;AAAA,IACtD;AAEA,UAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,aAAS,IAAI,OAAO,IAAI;AACxB,WAAO,0BAA0B,UAAU,UAAU,QAAQ;AAAA,EAC/D;AAEA,QAAM,aAAyB,cAAc;AAAA,IAC3C,MAAM,MAAM,QAAQ,OAAO,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO;AAAA,IAC7D,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,MAAM,OAAO,OAAO,CAAC,GAAG,OAAO,IAAI,IAAI;AAAA,EACzC,CAAC;AAED,MAAI,OAAO,OAAO,QAAQ;AACxB,eAAW,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS,0BAA0B,MAAM,UAAU,IAAI,CAAC;AAAA,EAC/F;AAEA,MAAI,OAAO,OAAO,QAAQ;AACxB,eAAW,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS,0BAA0B,MAAM,UAAU,IAAI,CAAC;AAAA,EAC/F;AAEA,MAAI,OAAO,OAAO,QAAQ;AACxB,eAAW,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS,0BAA0B,MAAM,UAAU,IAAI,CAAC;AAAA,EAC/F;AAEA,MAAI,OAAO,OAAO;AAChB,eAAW,QAAQ,0BAA0B,OAAO,OAAO,UAAU,IAAI;AAAA,EAC3E;AAEA,MAAI,OAAO,YAAY;AACrB,eAAW,aAAa,OAAO;AAAA,MAC7B,OAAO,QAAQ,OAAO,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACtD;AAAA,QACA,0BAA0B,OAAO,UAAU,IAAI;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,QAAQ;AAC3B,eAAW,WAAW,CAAC,GAAG,OAAO,QAAQ;AAAA,EAC3C;AAEA,MAAI,OAAO,yBAAyB,QAAW;AAC7C,eAAW,uBACT,OAAO,yBAAyB,QAAQ,OAAO,yBAAyB,QACpE,OAAO,uBACP,0BAA0B,OAAO,sBAAsB,UAAU,IAAI;AAAA,EAC7E;AAEA,MAAI,OAAO,UAAU;AACnB,UAAM,cAAc,WAAW;AAE/B,QAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,iBAAW,OAAO,YAAY,SAAS,MAAM,IAAI,cAAc,CAAC,GAAG,aAAa,MAAM;AAAA,IACxF,WAAW,aAAa;AACtB,iBAAW,OAAO,gBAAgB,SAAS,SAAS,CAAC,aAAa,MAAM;AAAA,IAC1E,OAAO;AACL,iBAAW,OAAO,CAAC,UAAU,MAAM;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,WAA4C;AAClE,QAAM,OAAO,QAAQ;AAErB,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAEA,SAAO,QAAQ,QAAQ,cAAc,QAAQ,oBAAoB;AACnE;AAEA,IAAM,gBAAgB,CAAC,WAA4C;AACjE,QAAM,OAAO,QAAQ;AAErB,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAEA,SAAO,QAAQ,QAAQ,KAAK;AAC9B;AAEA,IAAM,mBAAmB,CAAC,MAA8B,UACtD,KAAK,UAAU,QAAQ,IAAI,MAAM,KAAK,UAAU,SAAS,IAAI;AAE/D,IAAM,8BAA8B,CAAC,WAAmC;AACtE,MAAI,OAAO,OAAO,QAAQ;AACxB,UAAM,qBAAqB,OAAO,MAAM,IAAI,2BAA2B;AACvE,UAAM,gBAAgB,mBAAmB,KAAK,CAAC,SAAS,eAAe,IAAI,CAAC;AAC5E,UAAM,eAAe,mBAAmB,KAAK,CAAC,SAAS,cAAc,IAAI,CAAC;AAE1E,QACE,iBACA,cAAc,SACd,iBAAiB,eAAe,aAAa,KAAK,GAClD;AAGA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,QAAQ;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,OAAO,MAAM,IAAI,2BAA2B;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,QAAQ;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,OAAO,MAAM,IAAI,2BAA2B;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,4BAA4B,OAAO,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,OAAO;AAAA,QACjB,OAAO,QAAQ,OAAO,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,4BAA4B,KAAK,CAAC,CAAC;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAC5B,aACA,YACA,aACmE;AACnE,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,aAAW,aAAa,YAAY;AAClC,eAAW,UAAU,IAAI,IAAI,cAAc;AAAA,MACzC,GAAG,0BAA0B,UAAU,QAAQ,QAAQ;AAAA,MACvD,aAAa,UAAU,eAAe,UAAU,QAAQ;AAAA,IAC1D,CAAC;AAED,QAAI,UAAU,UAAU;AACtB,eAAS,KAAK,UAAU,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,SAAS,SAAS;AAAA,IAC5B,QAAQ,cAAc;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,SAAS,SAAS,WAAW;AAAA,MACvC,sBAAsB;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,IAAM,sBAAsB,CAC1B,UACAC,OACA,WACA,SACA,gBACA,iBACA,qBACe;AACf,QAAM,oBAAoB,kBAAkB,UAAU,aAAa,OAAO;AAC1E,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,QAAM,WAAW;AAAA,IACf,sBAAsB,QAAQ,gBAAgB,QAAQ;AAAA,IACtD,sBAAsB,SAAS,iBAAiB,QAAQ;AAAA,IACxD,QAAQ,iBAAiB,sBAAsB,WAAW,kBAAkB,QAAQ,IAAI;AAAA,EAC1F,EAAE,OAAO,CAAC,UAA4E,QAAQ,KAAK,CAAC;AAEpG,aAAW,WAAW,UAAU;AAC9B,QAAI,iBAAiB,QAAQ,MAAM,GAAG;AACpC,iBAAW,QAAQ,IAAI,IAAI,QAAQ;AACnC,UAAI,QAAQ,UAAU;AACpB,iBAAS,KAAK,QAAQ,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB;AACrB,eAAW,OAAO,4BAA4B,0BAA0B,mBAAmB,QAAQ,CAAC;AACpG,QAAI,UAAU,aAAa,UAAU;AACnC,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,cAAc;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,IACA,UAAU,SAAS,SAAS,WAAW;AAAA,IACvC,sBAAsB;AAAA,IACtB,aAAa,GAAG,UAAU,WAAW,UAAU,eAAe,GAAGA,KAAI,UAAU;AAAA,EACjF,CAAC;AACH;AAEA,IAAM,uBAAuB,CAACA,OAAc,QAAgB,cAA8C;AACxG,QAAM,UAAU,UAAU,SAAS,KAAK;AACxC,QAAM,cAAc,UAAU,aAAa,KAAK;AAEhD,MAAI,WAAW,eAAe,gBAAgB,SAAS;AACrD,WAAO,GAAG,OAAO,KAAK,WAAW;AAAA,EACnC;AAEA,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,OAAO,YAAY,CAAC,IAAIA,KAAI;AACxC;AAEA,IAAM,sBAAsB,CAC1B,UACAA,OACA,QACA,WACA,SACA,gBACA,iBACA,qBAC2B;AAC3B,QAAM,cAAc,iBAAiB,QAAQA,OAAM,UAAU,WAAW;AAExE,SAAO;AAAA,IACL,MAAM,cAAc,QAAQ,YAAY,WAAW;AAAA,IACnD,aAAa,qBAAqBA,OAAM,QAAQ,SAAS;AAAA,IACzD,QAAQ,OAAO,YAAY;AAAA,IAC3B,MAAAA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,UAAU,QAAQ,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,wBAAwB,CACnC,UACA,YAC0B;AAC1B,QAAM,QAAkC,CAAC;AAEzC,aAAW,CAACA,OAAM,QAAQ,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AAC7D,eAAW,UAAU,cAAc;AACjC,YAAM,YAAY,SAAS,MAAM;AAEjC,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,YAAM,aAAa;AAAA,QACjB,oBAAoB,UAAU,SAAS,UAAU;AAAA,QACjD,oBAAoB,UAAU,UAAU,UAAU;AAAA,MACpD;AACA,YAAM,iBAAiB,WAAW,OAAO,CAAC,cAAc,UAAU,OAAO,MAAM;AAC/E,YAAM,kBAAkB,WAAW,OAAO,CAAC,cAAc,UAAU,OAAO,OAAO;AACjF,YAAM,mBAAmB,WAAW;AAAA,QAClC,CAAC,cACC,UAAU,OAAO,YACjB,CAAC,kBAAkB,IAAI,UAAU,KAAK,YAAY,CAAC;AAAA,MACvD;AAEA,YAAM;AAAA,QACJ;AAAA,UACE;AAAA,UACAA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAE/D,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ,cAAc,YAAY,QAAQ,QAAQ;AAAA,IAC9D,SAAS,QAAQ;AAAA,IACjB,aACE,SAAS,MAAM,aAAa,KAAK,KACjC,sCAAsC,SAAS,MAAM,SAAS,QAAQ,QAAQ;AAAA,IAChF,WAAW,QAAQ,oBAAoB,SAAS,UAAU,CAAC,GAAG;AAAA,IAC9D,UAAU,QAAQ,YAAY;AAAA,IAC9B;AAAA,EACF;AACF;;;AExcA,SAAS,YAAYC,WAAU;AAC/B,OAAO,UAAU;AASjB,IAAM,YAAY,CAAC,UAA2B,KAAK,UAAU,OAAO,MAAM,CAAC;AAEpE,IAAM,uBAAuB,CAAC,YACnC,GAAG,UAAU;AAAA,EACX,IAAI,QAAQ;AAAA,EACZ,MAAM,QAAQ;AAAA,EACd,SAAS,QAAQ,WAAW;AAAA,EAC5B,aAAa,QAAQ;AAAA,EACrB,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,sBAAsB;AAAA,IACtB,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,sBAAsB;AAAA,UACpB,MAAM;AAAA,QACR;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,OAAO;AAAA,MACP,aAAa,QAAQ,aAAa;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC,CAAC;AAAA;AAEG,IAAM,qBAAqB,CAAC,YACjC;AAAA;AAAA,yBAEuB,UAAU,OAAO,CAAC;AAAA;AAAA;AAAA;AAKpC,IAAM,oBAAoB,CAAC,YAChC,GAAG,UAAU,OAAO,CAAC;AAAA;AAEvB,IAAM,YAAY,OAAO,YAAmC;AAC1D,QAAMC,IAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C;AAEO,IAAM,uBAAuB,OAClC,SACA,WACkC;AAClC,QAAM,UAAU,MAAM;AAEtB,QAAM,eAAe,KAAK,KAAK,QAAQ,sBAAsB;AAC7D,QAAM,YAAY,KAAK,KAAK,QAAQ,UAAU;AAC9C,QAAM,cAAc,KAAK,KAAK,QAAQ,mBAAmB;AAEzD,QAAM,QAAQ,IAAI;AAAA,IAChBA,IAAG,UAAU,cAAc,qBAAqB,OAAO,GAAG,MAAM;AAAA,IAChEA,IAAG,UAAU,WAAW,mBAAmB,OAAO,GAAG,MAAM;AAAA,IAC3DA,IAAG,UAAU,aAAa,kBAAkB,OAAO,GAAG,MAAM;AAAA,EAC9D,CAAC;AAED,SAAO,EAAE,cAAc,WAAW,YAAY;AAChD;AAEO,IAAM,4BAA4B,OACvC,YAC6E;AAC7E,QAAM,WAAW,MAAM,oBAAoB,QAAQ,KAAK;AACxD,QAAM,iBAAwC;AAAA,IAC5C,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,QAAQ;AAAA,IACxB,kBAAkB,QAAQ;AAAA,EAC5B;AACA,QAAM,UAAU,sBAAsB,UAAU,cAAc;AAC9D,QAAM,QAAQ,MAAM,qBAAqB,SAAS,QAAQ,MAAM;AAEhE,SAAO,EAAE,SAAS,MAAM;AAC1B;","names":["path","path","fs","fs"]}
|
package/dist/cli.cjs
CHANGED
|
@@ -99,10 +99,31 @@ var loadOpenApiDocument = async (source) => {
|
|
|
99
99
|
return document;
|
|
100
100
|
};
|
|
101
101
|
var resolveRefName = (ref) => ref.split("/").pop() ?? "UnknownSchema";
|
|
102
|
+
var isReferenceObject = (value) => Boolean(value && "$ref" in value);
|
|
102
103
|
var resolveSchemaRef = (document, ref) => {
|
|
103
104
|
const schemaName = resolveRefName(ref);
|
|
104
105
|
return document.components?.schemas?.[schemaName];
|
|
105
106
|
};
|
|
107
|
+
var resolveParameterRef = (document, ref) => {
|
|
108
|
+
const parameterName = resolveRefName(ref);
|
|
109
|
+
return document.components?.parameters?.[parameterName];
|
|
110
|
+
};
|
|
111
|
+
var resolveParameterObject = (document, parameter, seen = /* @__PURE__ */ new Set()) => {
|
|
112
|
+
if (!isReferenceObject(parameter)) {
|
|
113
|
+
return parameter;
|
|
114
|
+
}
|
|
115
|
+
if (seen.has(parameter.$ref)) {
|
|
116
|
+
return void 0;
|
|
117
|
+
}
|
|
118
|
+
const resolved = resolveParameterRef(document, parameter.$ref);
|
|
119
|
+
if (!resolved) {
|
|
120
|
+
return void 0;
|
|
121
|
+
}
|
|
122
|
+
const nextSeen = new Set(seen);
|
|
123
|
+
nextSeen.add(parameter.$ref);
|
|
124
|
+
return resolveParameterObject(document, resolved, nextSeen);
|
|
125
|
+
};
|
|
126
|
+
var normalizeParameters = (document, parameters) => (parameters ?? []).map((parameter) => resolveParameterObject(document, parameter)).filter((parameter) => Boolean(parameter));
|
|
106
127
|
var openApiSchemaToJsonSchema = (schema, document, seen = /* @__PURE__ */ new Set()) => {
|
|
107
128
|
if (!schema) {
|
|
108
129
|
return { type: "object", additionalProperties: true };
|
|
@@ -324,7 +345,10 @@ var convertOpenApiToTools = (document, options) => {
|
|
|
324
345
|
if (!operation) {
|
|
325
346
|
continue;
|
|
326
347
|
}
|
|
327
|
-
const parameters = dedupeParameters(
|
|
348
|
+
const parameters = dedupeParameters(
|
|
349
|
+
normalizeParameters(document, pathItem.parameters),
|
|
350
|
+
normalizeParameters(document, operation.parameters)
|
|
351
|
+
);
|
|
328
352
|
const pathParameters = parameters.filter((parameter) => parameter.in === "path");
|
|
329
353
|
const queryParameters = parameters.filter((parameter) => parameter.in === "query");
|
|
330
354
|
const headerParameters = parameters.filter(
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generator.ts","../src/openapi.ts","../src/utils.ts","../src/cli.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n","import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(pathItem.parameters, operation.parameters);\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","#!/usr/bin/env node\nimport { generatePluginFromOpenApi } from \"./generator\";\nimport { GeneratePluginOptions } from \"./types\";\n\nconst printUsage = (): void => {\n console.log(\"Usage: open-claw-sdk generate --input=<openapi.json> --outDir=<dir> --pluginId=<id> [options]\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" --pluginName=<name> Human-readable plugin name\");\n console.log(\" --toolPrefix=<prefix> Prefix added to every tool name\");\n console.log(\" --defaultServerUrl=<url> Override OpenAPI server URL\");\n console.log(\" --includeHeaders=true Include non-auth header params in tool schema\");\n console.log(\" --optional=false Register tools as required instead of opt-in\");\n};\n\nconst parseArgs = (argv: string[]): Record<string, string> => {\n const output: Record<string, string> = {};\n\n for (const item of argv) {\n if (!item.startsWith(\"--\")) {\n continue;\n }\n\n const [rawKey, ...rest] = item.slice(2).split(\"=\");\n if (!rawKey) {\n continue;\n }\n output[rawKey] = rest.length ? rest.join(\"=\") : \"true\";\n }\n\n return output;\n};\n\nconst parseBoolean = (value: string | undefined, defaultValue: boolean): boolean => {\n if (value === undefined) {\n return defaultValue;\n }\n\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase());\n};\n\nconst toGenerateOptions = (args: Record<string, string>): GeneratePluginOptions => {\n const input = args.input;\n const outDir = args.outDir;\n const pluginId = args.pluginId;\n\n if (!input || !outDir || !pluginId) {\n throw new Error(\"Missing required arguments: --input, --outDir, --pluginId\");\n }\n\n return {\n input,\n outDir,\n pluginId,\n pluginName: args.pluginName,\n toolPrefix: args.toolPrefix,\n defaultServerUrl: args.defaultServerUrl,\n includeHeaders: parseBoolean(args.includeHeaders, false),\n optional: parseBoolean(args.optional, true)\n };\n};\n\nconst main = async (): Promise<void> => {\n const command = process.argv[2];\n\n if (!command || command === \"help\" || command === \"--help\" || command === \"-h\") {\n printUsage();\n return;\n }\n\n if (command !== \"generate\") {\n throw new Error(`Unknown command: ${command}`);\n }\n\n const options = toGenerateOptions(parseArgs(process.argv.slice(3)));\n const { catalog, files } = await generatePluginFromOpenApi(options);\n\n console.log(`Generated ${catalog.tools.length} tools for plugin ${catalog.pluginId}`);\n console.log(`Manifest: ${files.manifestPath}`);\n console.log(`Module: ${files.indexPath}`);\n console.log(`Catalog: ${files.catalogPath}`);\n};\n\nmain().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["import_node_fs","path","fs","path","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/generator.ts","../src/openapi.ts","../src/utils.ts","../src/cli.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n","import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst isReferenceObject = (\n value: OpenApiParameterObject | OpenApiReferenceObject | undefined\n): value is OpenApiReferenceObject => Boolean(value && \"$ref\" in value);\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nconst resolveParameterRef = (\n document: OpenApiDocument,\n ref: string\n): OpenApiParameterObject | undefined => {\n const parameterName = resolveRefName(ref);\n return document.components?.parameters?.[parameterName];\n};\n\nconst resolveParameterObject = (\n document: OpenApiDocument,\n parameter: OpenApiParameterObject | OpenApiReferenceObject,\n seen = new Set<string>()\n): OpenApiParameterObject | undefined => {\n if (!isReferenceObject(parameter)) {\n return parameter;\n }\n\n if (seen.has(parameter.$ref)) {\n return undefined;\n }\n\n const resolved = resolveParameterRef(document, parameter.$ref);\n if (!resolved) {\n return undefined;\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(parameter.$ref);\n return resolveParameterObject(document, resolved, nextSeen);\n};\n\nconst normalizeParameters = (\n document: OpenApiDocument,\n parameters: Array<OpenApiParameterObject | OpenApiReferenceObject> | undefined\n): OpenApiParameterObject[] =>\n (parameters ?? [])\n .map((parameter) => resolveParameterObject(document, parameter))\n .filter((parameter): parameter is OpenApiParameterObject => Boolean(parameter));\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(\n normalizeParameters(document, pathItem.parameters),\n normalizeParameters(document, operation.parameters)\n );\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","#!/usr/bin/env node\nimport { generatePluginFromOpenApi } from \"./generator\";\nimport { GeneratePluginOptions } from \"./types\";\n\nconst printUsage = (): void => {\n console.log(\"Usage: open-claw-sdk generate --input=<openapi.json> --outDir=<dir> --pluginId=<id> [options]\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" --pluginName=<name> Human-readable plugin name\");\n console.log(\" --toolPrefix=<prefix> Prefix added to every tool name\");\n console.log(\" --defaultServerUrl=<url> Override OpenAPI server URL\");\n console.log(\" --includeHeaders=true Include non-auth header params in tool schema\");\n console.log(\" --optional=false Register tools as required instead of opt-in\");\n};\n\nconst parseArgs = (argv: string[]): Record<string, string> => {\n const output: Record<string, string> = {};\n\n for (const item of argv) {\n if (!item.startsWith(\"--\")) {\n continue;\n }\n\n const [rawKey, ...rest] = item.slice(2).split(\"=\");\n if (!rawKey) {\n continue;\n }\n output[rawKey] = rest.length ? rest.join(\"=\") : \"true\";\n }\n\n return output;\n};\n\nconst parseBoolean = (value: string | undefined, defaultValue: boolean): boolean => {\n if (value === undefined) {\n return defaultValue;\n }\n\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase());\n};\n\nconst toGenerateOptions = (args: Record<string, string>): GeneratePluginOptions => {\n const input = args.input;\n const outDir = args.outDir;\n const pluginId = args.pluginId;\n\n if (!input || !outDir || !pluginId) {\n throw new Error(\"Missing required arguments: --input, --outDir, --pluginId\");\n }\n\n return {\n input,\n outDir,\n pluginId,\n pluginName: args.pluginName,\n toolPrefix: args.toolPrefix,\n defaultServerUrl: args.defaultServerUrl,\n includeHeaders: parseBoolean(args.includeHeaders, false),\n optional: parseBoolean(args.optional, true)\n };\n};\n\nconst main = async (): Promise<void> => {\n const command = process.argv[2];\n\n if (!command || command === \"help\" || command === \"--help\" || command === \"-h\") {\n printUsage();\n return;\n }\n\n if (command !== \"generate\") {\n throw new Error(`Unknown command: ${command}`);\n }\n\n const options = toGenerateOptions(parseArgs(process.argv.slice(3)));\n const { catalog, files } = await generatePluginFromOpenApi(options);\n\n console.log(`Generated ${catalog.tools.length} tools for plugin ${catalog.pluginId}`);\n console.log(`Manifest: ${files.manifestPath}`);\n console.log(`Module: ${files.indexPath}`);\n console.log(`Catalog: ${files.catalogPath}`);\n};\n\nmain().catch((error) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["import_node_fs","path","fs","path","fs","path"]}
|
package/dist/cli.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -118,10 +118,31 @@ var loadOpenApiDocument = async (source) => {
|
|
|
118
118
|
return document;
|
|
119
119
|
};
|
|
120
120
|
var resolveRefName = (ref) => ref.split("/").pop() ?? "UnknownSchema";
|
|
121
|
+
var isReferenceObject = (value) => Boolean(value && "$ref" in value);
|
|
121
122
|
var resolveSchemaRef = (document, ref) => {
|
|
122
123
|
const schemaName = resolveRefName(ref);
|
|
123
124
|
return document.components?.schemas?.[schemaName];
|
|
124
125
|
};
|
|
126
|
+
var resolveParameterRef = (document, ref) => {
|
|
127
|
+
const parameterName = resolveRefName(ref);
|
|
128
|
+
return document.components?.parameters?.[parameterName];
|
|
129
|
+
};
|
|
130
|
+
var resolveParameterObject = (document, parameter, seen = /* @__PURE__ */ new Set()) => {
|
|
131
|
+
if (!isReferenceObject(parameter)) {
|
|
132
|
+
return parameter;
|
|
133
|
+
}
|
|
134
|
+
if (seen.has(parameter.$ref)) {
|
|
135
|
+
return void 0;
|
|
136
|
+
}
|
|
137
|
+
const resolved = resolveParameterRef(document, parameter.$ref);
|
|
138
|
+
if (!resolved) {
|
|
139
|
+
return void 0;
|
|
140
|
+
}
|
|
141
|
+
const nextSeen = new Set(seen);
|
|
142
|
+
nextSeen.add(parameter.$ref);
|
|
143
|
+
return resolveParameterObject(document, resolved, nextSeen);
|
|
144
|
+
};
|
|
145
|
+
var normalizeParameters = (document, parameters) => (parameters ?? []).map((parameter) => resolveParameterObject(document, parameter)).filter((parameter) => Boolean(parameter));
|
|
125
146
|
var openApiSchemaToJsonSchema = (schema, document, seen = /* @__PURE__ */ new Set()) => {
|
|
126
147
|
if (!schema) {
|
|
127
148
|
return { type: "object", additionalProperties: true };
|
|
@@ -343,7 +364,10 @@ var convertOpenApiToTools = (document, options) => {
|
|
|
343
364
|
if (!operation) {
|
|
344
365
|
continue;
|
|
345
366
|
}
|
|
346
|
-
const parameters = dedupeParameters(
|
|
367
|
+
const parameters = dedupeParameters(
|
|
368
|
+
normalizeParameters(document, pathItem.parameters),
|
|
369
|
+
normalizeParameters(document, operation.parameters)
|
|
370
|
+
);
|
|
347
371
|
const pathParameters = parameters.filter((parameter) => parameter.in === "path");
|
|
348
372
|
const queryParameters = parameters.filter((parameter) => parameter.in === "query");
|
|
349
373
|
const headerParameters = parameters.filter(
|
|
@@ -478,6 +502,29 @@ var generatePluginFromOpenApi = async (options) => {
|
|
|
478
502
|
};
|
|
479
503
|
|
|
480
504
|
// src/runtime.ts
|
|
505
|
+
var debugFilter = process.env.OPEN_CLAW_PLUGIN_DEBUG?.trim();
|
|
506
|
+
var shouldDebugTool = (toolName) => {
|
|
507
|
+
if (!debugFilter) {
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
if (debugFilter === "1" || debugFilter === "*" || debugFilter.toLowerCase() === "all") {
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
return toolName.includes(debugFilter);
|
|
514
|
+
};
|
|
515
|
+
var debugLog = (toolName, stage, payload) => {
|
|
516
|
+
if (!shouldDebugTool(toolName)) {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
console.info(`[openapi-plugin-debug] ${toolName} ${stage}: ${JSON.stringify(payload, null, 2)}`);
|
|
520
|
+
};
|
|
521
|
+
var headersToObject = (headers) => {
|
|
522
|
+
const result = {};
|
|
523
|
+
headers.forEach((value, key) => {
|
|
524
|
+
result[key] = value;
|
|
525
|
+
});
|
|
526
|
+
return result;
|
|
527
|
+
};
|
|
481
528
|
var encodeQueryValue = (value) => {
|
|
482
529
|
if (value === null) {
|
|
483
530
|
return "null";
|
|
@@ -691,6 +738,12 @@ var createOpenApiPlugin = (catalog, options) => {
|
|
|
691
738
|
const bodySchema = tool.parameters.properties?.body;
|
|
692
739
|
const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);
|
|
693
740
|
if (bodyValidationErrors.length > 0) {
|
|
741
|
+
debugLog(tool.name, "invalid-input", {
|
|
742
|
+
url: finalUrl.toString(),
|
|
743
|
+
method: tool.method,
|
|
744
|
+
errors: bodyValidationErrors,
|
|
745
|
+
body: normalizedBody
|
|
746
|
+
});
|
|
694
747
|
return formatToolResult({
|
|
695
748
|
ok: false,
|
|
696
749
|
status: 400,
|
|
@@ -704,8 +757,21 @@ var createOpenApiPlugin = (catalog, options) => {
|
|
|
704
757
|
}
|
|
705
758
|
requestInit.body = JSON.stringify(normalizedBody);
|
|
706
759
|
}
|
|
760
|
+
debugLog(tool.name, "request", {
|
|
761
|
+
url: finalUrl.toString(),
|
|
762
|
+
method: tool.method,
|
|
763
|
+
headers: headersToObject(requestInit.headers),
|
|
764
|
+
body: hasBody ? normalizedBody : void 0
|
|
765
|
+
});
|
|
707
766
|
const response = await fetch(finalUrl, requestInit);
|
|
708
767
|
const payload = await parseResponse(response);
|
|
768
|
+
debugLog(tool.name, "response", {
|
|
769
|
+
url: finalUrl.toString(),
|
|
770
|
+
status: response.status,
|
|
771
|
+
statusText: response.statusText,
|
|
772
|
+
ok: response.ok,
|
|
773
|
+
data: payload
|
|
774
|
+
});
|
|
709
775
|
if (!response.ok) {
|
|
710
776
|
return formatToolResult({
|
|
711
777
|
ok: false,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/generator.ts","../src/openapi.ts","../src/utils.ts","../src/runtime.ts"],"sourcesContent":["export * from \"./generator\";\nexport * from \"./openapi\";\nexport * from \"./runtime\";\nexport * from \"./types\";\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n","import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(pathItem.parameters, operation.parameters);\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","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 createRequestUrl = (baseUrl: string, requestPath: string): URL => {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(/\\/+$/, \"\");\n const normalizedRequestPath = requestPath.startsWith(\"/\") ? requestPath : `/${requestPath}`;\n\n url.pathname = `${normalizedBasePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\");\n\n return url;\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\nconst isJsonLikeString = (value: string): boolean => {\n const trimmed = value.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n};\n\nconst normalizeJsonBody = (value: unknown): unknown => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (!isJsonLikeString(value)) {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n};\n\nconst schemaMatchesType = (schemaType: string | string[] | undefined, value: unknown): boolean => {\n if (!schemaType) {\n return true;\n }\n\n const allowed = Array.isArray(schemaType) ? schemaType : [schemaType];\n\n return allowed.some((type) => {\n if (type === \"null\") {\n return value === null;\n }\n\n if (type === \"array\") {\n return Array.isArray(value);\n }\n\n if (type === \"object\") {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n\n return typeof value === type;\n });\n};\n\nconst validateAgainstSchema = (value: unknown, schema: any, path = \"body\"): string[] => {\n if (!schema) {\n return [];\n }\n\n const errors: string[] = [];\n\n if (schema.oneOf?.length) {\n const matches = schema.oneOf.filter((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (matches.length !== 1) {\n errors.push(`${path} must match exactly one allowed shape`);\n }\n return errors;\n }\n\n if (schema.anyOf?.length) {\n const matches = schema.anyOf.some((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (!matches) {\n errors.push(`${path} must match at least one allowed shape`);\n }\n return errors;\n }\n\n if (schema.allOf?.length) {\n for (const variant of schema.allOf) {\n errors.push(...validateAgainstSchema(value, variant, path));\n }\n return errors;\n }\n\n if (!schemaMatchesType(schema.type, value)) {\n const expected = Array.isArray(schema.type) ? schema.type.join(\"|\") : schema.type;\n errors.push(`${path} must be of type ${expected}`);\n return errors;\n }\n\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path} must be one of: ${schema.enum.join(\", \")}`);\n }\n\n if (Array.isArray(value)) {\n if (schema.items) {\n value.forEach((item, index) => {\n errors.push(...validateAgainstSchema(item, schema.items, `${path}[${index}]`));\n });\n }\n return errors;\n }\n\n if (typeof value === \"object\" && value !== null) {\n const objectValue = value as Record<string, unknown>;\n const properties = schema.properties ?? {};\n const required = schema.required ?? [];\n\n for (const key of required) {\n if (objectValue[key] === undefined) {\n errors.push(`${path}.${key} is required`);\n }\n }\n\n for (const [key, childValue] of Object.entries(objectValue)) {\n const childSchema = properties[key];\n\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n errors.push(`${path}.${key} is not allowed`);\n } else if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n errors.push(...validateAgainstSchema(childValue, schema.additionalProperties, `${path}.${key}`));\n }\n continue;\n }\n\n errors.push(...validateAgainstSchema(childValue, childSchema, `${path}.${key}`));\n }\n }\n\n return errors;\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 = createRequestUrl(baseUrl, applyPathParams(tool.path, input.path));\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 normalizedBody = normalizeJsonBody(input.body);\n const hasBody = normalizedBody !== 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 const bodySchema = tool.parameters.properties?.body;\n const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);\n\n if (bodyValidationErrors.length > 0) {\n return formatToolResult({\n ok: false,\n status: 400,\n statusText: \"INVALID_TOOL_INPUT\",\n data: {\n message: \"Tool input body does not match the generated schema.\",\n errors: bodyValidationErrors,\n received: normalizedBody\n }\n });\n }\n\n requestInit.body = JSON.stringify(normalizedBody);\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":["import_node_fs","path","fs","path","fs","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/generator.ts","../src/openapi.ts","../src/utils.ts","../src/runtime.ts"],"sourcesContent":["export * from \"./generator\";\nexport * from \"./openapi\";\nexport * from \"./runtime\";\nexport * from \"./types\";\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n","import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst isReferenceObject = (\n value: OpenApiParameterObject | OpenApiReferenceObject | undefined\n): value is OpenApiReferenceObject => Boolean(value && \"$ref\" in value);\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nconst resolveParameterRef = (\n document: OpenApiDocument,\n ref: string\n): OpenApiParameterObject | undefined => {\n const parameterName = resolveRefName(ref);\n return document.components?.parameters?.[parameterName];\n};\n\nconst resolveParameterObject = (\n document: OpenApiDocument,\n parameter: OpenApiParameterObject | OpenApiReferenceObject,\n seen = new Set<string>()\n): OpenApiParameterObject | undefined => {\n if (!isReferenceObject(parameter)) {\n return parameter;\n }\n\n if (seen.has(parameter.$ref)) {\n return undefined;\n }\n\n const resolved = resolveParameterRef(document, parameter.$ref);\n if (!resolved) {\n return undefined;\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(parameter.$ref);\n return resolveParameterObject(document, resolved, nextSeen);\n};\n\nconst normalizeParameters = (\n document: OpenApiDocument,\n parameters: Array<OpenApiParameterObject | OpenApiReferenceObject> | undefined\n): OpenApiParameterObject[] =>\n (parameters ?? [])\n .map((parameter) => resolveParameterObject(document, parameter))\n .filter((parameter): parameter is OpenApiParameterObject => Boolean(parameter));\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(\n normalizeParameters(document, pathItem.parameters),\n normalizeParameters(document, operation.parameters)\n );\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","import { CreatePluginFactoryOptions, OpenClawApiLike, OpenClawPluginCatalog, PluginRuntimeConfig } from \"./types\";\n\nconst debugFilter = process.env.OPEN_CLAW_PLUGIN_DEBUG?.trim();\n\nconst shouldDebugTool = (toolName: string): boolean => {\n if (!debugFilter) {\n return false;\n }\n\n if (debugFilter === \"1\" || debugFilter === \"*\" || debugFilter.toLowerCase() === \"all\") {\n return true;\n }\n\n return toolName.includes(debugFilter);\n};\n\nconst debugLog = (toolName: string, stage: string, payload: unknown): void => {\n if (!shouldDebugTool(toolName)) {\n return;\n }\n\n console.info(`[openapi-plugin-debug] ${toolName} ${stage}: ${JSON.stringify(payload, null, 2)}`);\n};\n\nconst headersToObject = (headers: Headers): Record<string, string> => {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n};\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 createRequestUrl = (baseUrl: string, requestPath: string): URL => {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(/\\/+$/, \"\");\n const normalizedRequestPath = requestPath.startsWith(\"/\") ? requestPath : `/${requestPath}`;\n\n url.pathname = `${normalizedBasePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\");\n\n return url;\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\nconst isJsonLikeString = (value: string): boolean => {\n const trimmed = value.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n};\n\nconst normalizeJsonBody = (value: unknown): unknown => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (!isJsonLikeString(value)) {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n};\n\nconst schemaMatchesType = (schemaType: string | string[] | undefined, value: unknown): boolean => {\n if (!schemaType) {\n return true;\n }\n\n const allowed = Array.isArray(schemaType) ? schemaType : [schemaType];\n\n return allowed.some((type) => {\n if (type === \"null\") {\n return value === null;\n }\n\n if (type === \"array\") {\n return Array.isArray(value);\n }\n\n if (type === \"object\") {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n\n return typeof value === type;\n });\n};\n\nconst validateAgainstSchema = (value: unknown, schema: any, path = \"body\"): string[] => {\n if (!schema) {\n return [];\n }\n\n const errors: string[] = [];\n\n if (schema.oneOf?.length) {\n const matches = schema.oneOf.filter((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (matches.length !== 1) {\n errors.push(`${path} must match exactly one allowed shape`);\n }\n return errors;\n }\n\n if (schema.anyOf?.length) {\n const matches = schema.anyOf.some((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (!matches) {\n errors.push(`${path} must match at least one allowed shape`);\n }\n return errors;\n }\n\n if (schema.allOf?.length) {\n for (const variant of schema.allOf) {\n errors.push(...validateAgainstSchema(value, variant, path));\n }\n return errors;\n }\n\n if (!schemaMatchesType(schema.type, value)) {\n const expected = Array.isArray(schema.type) ? schema.type.join(\"|\") : schema.type;\n errors.push(`${path} must be of type ${expected}`);\n return errors;\n }\n\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path} must be one of: ${schema.enum.join(\", \")}`);\n }\n\n if (Array.isArray(value)) {\n if (schema.items) {\n value.forEach((item, index) => {\n errors.push(...validateAgainstSchema(item, schema.items, `${path}[${index}]`));\n });\n }\n return errors;\n }\n\n if (typeof value === \"object\" && value !== null) {\n const objectValue = value as Record<string, unknown>;\n const properties = schema.properties ?? {};\n const required = schema.required ?? [];\n\n for (const key of required) {\n if (objectValue[key] === undefined) {\n errors.push(`${path}.${key} is required`);\n }\n }\n\n for (const [key, childValue] of Object.entries(objectValue)) {\n const childSchema = properties[key];\n\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n errors.push(`${path}.${key} is not allowed`);\n } else if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n errors.push(...validateAgainstSchema(childValue, schema.additionalProperties, `${path}.${key}`));\n }\n continue;\n }\n\n errors.push(...validateAgainstSchema(childValue, childSchema, `${path}.${key}`));\n }\n }\n\n return errors;\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 = createRequestUrl(baseUrl, applyPathParams(tool.path, input.path));\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 normalizedBody = normalizeJsonBody(input.body);\n const hasBody = normalizedBody !== 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 const bodySchema = tool.parameters.properties?.body;\n const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);\n\n if (bodyValidationErrors.length > 0) {\n debugLog(tool.name, \"invalid-input\", {\n url: finalUrl.toString(),\n method: tool.method,\n errors: bodyValidationErrors,\n body: normalizedBody\n });\n return formatToolResult({\n ok: false,\n status: 400,\n statusText: \"INVALID_TOOL_INPUT\",\n data: {\n message: \"Tool input body does not match the generated schema.\",\n errors: bodyValidationErrors,\n received: normalizedBody\n }\n });\n }\n\n requestInit.body = JSON.stringify(normalizedBody);\n }\n\n debugLog(tool.name, \"request\", {\n url: finalUrl.toString(),\n method: tool.method,\n headers: headersToObject(requestInit.headers as Headers),\n body: hasBody ? normalizedBody : undefined\n });\n\n const response = await fetch(finalUrl, requestInit);\n\n const payload = await parseResponse(response);\n\n debugLog(tool.name, \"response\", {\n url: finalUrl.toString(),\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n data: payload\n });\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":["import_node_fs","path","fs","path","fs","path","path"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -28,6 +28,9 @@ type OpenApiParameterObject = {
|
|
|
28
28
|
description?: string | undefined;
|
|
29
29
|
schema?: OpenApiSchemaObject | undefined;
|
|
30
30
|
};
|
|
31
|
+
type OpenApiReferenceObject = {
|
|
32
|
+
$ref: string;
|
|
33
|
+
};
|
|
31
34
|
type OpenApiRequestBodyObject = {
|
|
32
35
|
required?: boolean | undefined;
|
|
33
36
|
description?: string | undefined;
|
|
@@ -46,12 +49,12 @@ type OpenApiOperationObject = {
|
|
|
46
49
|
summary?: string | undefined;
|
|
47
50
|
description?: string | undefined;
|
|
48
51
|
tags?: string[] | undefined;
|
|
49
|
-
parameters?: OpenApiParameterObject
|
|
52
|
+
parameters?: Array<OpenApiParameterObject | OpenApiReferenceObject> | undefined;
|
|
50
53
|
requestBody?: OpenApiRequestBodyObject | undefined;
|
|
51
54
|
responses?: Record<string, OpenApiResponseObject> | undefined;
|
|
52
55
|
};
|
|
53
56
|
type OpenApiPathItemObject = Record<string, OpenApiOperationObject> & {
|
|
54
|
-
parameters?: OpenApiParameterObject
|
|
57
|
+
parameters?: Array<OpenApiParameterObject | OpenApiReferenceObject>;
|
|
55
58
|
};
|
|
56
59
|
type OpenApiDocument = {
|
|
57
60
|
openapi: string;
|
|
@@ -66,6 +69,7 @@ type OpenApiDocument = {
|
|
|
66
69
|
}> | undefined;
|
|
67
70
|
paths: Record<string, OpenApiPathItemObject>;
|
|
68
71
|
components?: {
|
|
72
|
+
parameters?: Record<string, OpenApiParameterObject> | undefined;
|
|
69
73
|
schemas?: Record<string, OpenApiSchemaObject> | undefined;
|
|
70
74
|
} | undefined;
|
|
71
75
|
};
|
|
@@ -167,4 +171,4 @@ declare const convertOpenApiToTools: (document: OpenApiDocument, options: Conver
|
|
|
167
171
|
|
|
168
172
|
declare const createOpenApiPlugin: (catalog: OpenClawPluginCatalog, options?: CreatePluginFactoryOptions) => (api: OpenClawApiLike) => void;
|
|
169
173
|
|
|
170
|
-
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 };
|
|
174
|
+
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 OpenApiReferenceObject, 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
CHANGED
|
@@ -28,6 +28,9 @@ type OpenApiParameterObject = {
|
|
|
28
28
|
description?: string | undefined;
|
|
29
29
|
schema?: OpenApiSchemaObject | undefined;
|
|
30
30
|
};
|
|
31
|
+
type OpenApiReferenceObject = {
|
|
32
|
+
$ref: string;
|
|
33
|
+
};
|
|
31
34
|
type OpenApiRequestBodyObject = {
|
|
32
35
|
required?: boolean | undefined;
|
|
33
36
|
description?: string | undefined;
|
|
@@ -46,12 +49,12 @@ type OpenApiOperationObject = {
|
|
|
46
49
|
summary?: string | undefined;
|
|
47
50
|
description?: string | undefined;
|
|
48
51
|
tags?: string[] | undefined;
|
|
49
|
-
parameters?: OpenApiParameterObject
|
|
52
|
+
parameters?: Array<OpenApiParameterObject | OpenApiReferenceObject> | undefined;
|
|
50
53
|
requestBody?: OpenApiRequestBodyObject | undefined;
|
|
51
54
|
responses?: Record<string, OpenApiResponseObject> | undefined;
|
|
52
55
|
};
|
|
53
56
|
type OpenApiPathItemObject = Record<string, OpenApiOperationObject> & {
|
|
54
|
-
parameters?: OpenApiParameterObject
|
|
57
|
+
parameters?: Array<OpenApiParameterObject | OpenApiReferenceObject>;
|
|
55
58
|
};
|
|
56
59
|
type OpenApiDocument = {
|
|
57
60
|
openapi: string;
|
|
@@ -66,6 +69,7 @@ type OpenApiDocument = {
|
|
|
66
69
|
}> | undefined;
|
|
67
70
|
paths: Record<string, OpenApiPathItemObject>;
|
|
68
71
|
components?: {
|
|
72
|
+
parameters?: Record<string, OpenApiParameterObject> | undefined;
|
|
69
73
|
schemas?: Record<string, OpenApiSchemaObject> | undefined;
|
|
70
74
|
} | undefined;
|
|
71
75
|
};
|
|
@@ -167,4 +171,4 @@ declare const convertOpenApiToTools: (document: OpenApiDocument, options: Conver
|
|
|
167
171
|
|
|
168
172
|
declare const createOpenApiPlugin: (catalog: OpenClawPluginCatalog, options?: CreatePluginFactoryOptions) => (api: OpenClawApiLike) => void;
|
|
169
173
|
|
|
170
|
-
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 };
|
|
174
|
+
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 OpenApiReferenceObject, 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
CHANGED
|
@@ -7,9 +7,32 @@ import {
|
|
|
7
7
|
renderPluginManifest,
|
|
8
8
|
renderPluginModule,
|
|
9
9
|
writeGeneratedPlugin
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ANYWXU4Y.js";
|
|
11
11
|
|
|
12
12
|
// src/runtime.ts
|
|
13
|
+
var debugFilter = process.env.OPEN_CLAW_PLUGIN_DEBUG?.trim();
|
|
14
|
+
var shouldDebugTool = (toolName) => {
|
|
15
|
+
if (!debugFilter) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (debugFilter === "1" || debugFilter === "*" || debugFilter.toLowerCase() === "all") {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
return toolName.includes(debugFilter);
|
|
22
|
+
};
|
|
23
|
+
var debugLog = (toolName, stage, payload) => {
|
|
24
|
+
if (!shouldDebugTool(toolName)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.info(`[openapi-plugin-debug] ${toolName} ${stage}: ${JSON.stringify(payload, null, 2)}`);
|
|
28
|
+
};
|
|
29
|
+
var headersToObject = (headers) => {
|
|
30
|
+
const result = {};
|
|
31
|
+
headers.forEach((value, key) => {
|
|
32
|
+
result[key] = value;
|
|
33
|
+
});
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
13
36
|
var encodeQueryValue = (value) => {
|
|
14
37
|
if (value === null) {
|
|
15
38
|
return "null";
|
|
@@ -223,6 +246,12 @@ var createOpenApiPlugin = (catalog, options) => {
|
|
|
223
246
|
const bodySchema = tool.parameters.properties?.body;
|
|
224
247
|
const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);
|
|
225
248
|
if (bodyValidationErrors.length > 0) {
|
|
249
|
+
debugLog(tool.name, "invalid-input", {
|
|
250
|
+
url: finalUrl.toString(),
|
|
251
|
+
method: tool.method,
|
|
252
|
+
errors: bodyValidationErrors,
|
|
253
|
+
body: normalizedBody
|
|
254
|
+
});
|
|
226
255
|
return formatToolResult({
|
|
227
256
|
ok: false,
|
|
228
257
|
status: 400,
|
|
@@ -236,8 +265,21 @@ var createOpenApiPlugin = (catalog, options) => {
|
|
|
236
265
|
}
|
|
237
266
|
requestInit.body = JSON.stringify(normalizedBody);
|
|
238
267
|
}
|
|
268
|
+
debugLog(tool.name, "request", {
|
|
269
|
+
url: finalUrl.toString(),
|
|
270
|
+
method: tool.method,
|
|
271
|
+
headers: headersToObject(requestInit.headers),
|
|
272
|
+
body: hasBody ? normalizedBody : void 0
|
|
273
|
+
});
|
|
239
274
|
const response = await fetch(finalUrl, requestInit);
|
|
240
275
|
const payload = await parseResponse(response);
|
|
276
|
+
debugLog(tool.name, "response", {
|
|
277
|
+
url: finalUrl.toString(),
|
|
278
|
+
status: response.status,
|
|
279
|
+
statusText: response.statusText,
|
|
280
|
+
ok: response.ok,
|
|
281
|
+
data: payload
|
|
282
|
+
});
|
|
241
283
|
if (!response.ok) {
|
|
242
284
|
return formatToolResult({
|
|
243
285
|
ok: false,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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 createRequestUrl = (baseUrl: string, requestPath: string): URL => {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(/\\/+$/, \"\");\n const normalizedRequestPath = requestPath.startsWith(\"/\") ? requestPath : `/${requestPath}`;\n\n url.pathname = `${normalizedBasePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\");\n\n return url;\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\nconst isJsonLikeString = (value: string): boolean => {\n const trimmed = value.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n};\n\nconst normalizeJsonBody = (value: unknown): unknown => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (!isJsonLikeString(value)) {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n};\n\nconst schemaMatchesType = (schemaType: string | string[] | undefined, value: unknown): boolean => {\n if (!schemaType) {\n return true;\n }\n\n const allowed = Array.isArray(schemaType) ? schemaType : [schemaType];\n\n return allowed.some((type) => {\n if (type === \"null\") {\n return value === null;\n }\n\n if (type === \"array\") {\n return Array.isArray(value);\n }\n\n if (type === \"object\") {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n\n return typeof value === type;\n });\n};\n\nconst validateAgainstSchema = (value: unknown, schema: any, path = \"body\"): string[] => {\n if (!schema) {\n return [];\n }\n\n const errors: string[] = [];\n\n if (schema.oneOf?.length) {\n const matches = schema.oneOf.filter((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (matches.length !== 1) {\n errors.push(`${path} must match exactly one allowed shape`);\n }\n return errors;\n }\n\n if (schema.anyOf?.length) {\n const matches = schema.anyOf.some((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (!matches) {\n errors.push(`${path} must match at least one allowed shape`);\n }\n return errors;\n }\n\n if (schema.allOf?.length) {\n for (const variant of schema.allOf) {\n errors.push(...validateAgainstSchema(value, variant, path));\n }\n return errors;\n }\n\n if (!schemaMatchesType(schema.type, value)) {\n const expected = Array.isArray(schema.type) ? schema.type.join(\"|\") : schema.type;\n errors.push(`${path} must be of type ${expected}`);\n return errors;\n }\n\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path} must be one of: ${schema.enum.join(\", \")}`);\n }\n\n if (Array.isArray(value)) {\n if (schema.items) {\n value.forEach((item, index) => {\n errors.push(...validateAgainstSchema(item, schema.items, `${path}[${index}]`));\n });\n }\n return errors;\n }\n\n if (typeof value === \"object\" && value !== null) {\n const objectValue = value as Record<string, unknown>;\n const properties = schema.properties ?? {};\n const required = schema.required ?? [];\n\n for (const key of required) {\n if (objectValue[key] === undefined) {\n errors.push(`${path}.${key} is required`);\n }\n }\n\n for (const [key, childValue] of Object.entries(objectValue)) {\n const childSchema = properties[key];\n\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n errors.push(`${path}.${key} is not allowed`);\n } else if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n errors.push(...validateAgainstSchema(childValue, schema.additionalProperties, `${path}.${key}`));\n }\n continue;\n }\n\n errors.push(...validateAgainstSchema(childValue, childSchema, `${path}.${key}`));\n }\n }\n\n return errors;\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 = createRequestUrl(baseUrl, applyPathParams(tool.path, input.path));\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 normalizedBody = normalizeJsonBody(input.body);\n const hasBody = normalizedBody !== 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 const bodySchema = tool.parameters.properties?.body;\n const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);\n\n if (bodyValidationErrors.length > 0) {\n return formatToolResult({\n ok: false,\n status: 400,\n statusText: \"INVALID_TOOL_INPUT\",\n data: {\n message: \"Tool input body does not match the generated schema.\",\n errors: bodyValidationErrors,\n received: normalizedBody\n }\n });\n }\n\n requestInit.body = JSON.stringify(normalizedBody);\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts"],"sourcesContent":["import { CreatePluginFactoryOptions, OpenClawApiLike, OpenClawPluginCatalog, PluginRuntimeConfig } from \"./types\";\n\nconst debugFilter = process.env.OPEN_CLAW_PLUGIN_DEBUG?.trim();\n\nconst shouldDebugTool = (toolName: string): boolean => {\n if (!debugFilter) {\n return false;\n }\n\n if (debugFilter === \"1\" || debugFilter === \"*\" || debugFilter.toLowerCase() === \"all\") {\n return true;\n }\n\n return toolName.includes(debugFilter);\n};\n\nconst debugLog = (toolName: string, stage: string, payload: unknown): void => {\n if (!shouldDebugTool(toolName)) {\n return;\n }\n\n console.info(`[openapi-plugin-debug] ${toolName} ${stage}: ${JSON.stringify(payload, null, 2)}`);\n};\n\nconst headersToObject = (headers: Headers): Record<string, string> => {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n};\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 createRequestUrl = (baseUrl: string, requestPath: string): URL => {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(/\\/+$/, \"\");\n const normalizedRequestPath = requestPath.startsWith(\"/\") ? requestPath : `/${requestPath}`;\n\n url.pathname = `${normalizedBasePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\");\n\n return url;\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\nconst isJsonLikeString = (value: string): boolean => {\n const trimmed = value.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n};\n\nconst normalizeJsonBody = (value: unknown): unknown => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (!isJsonLikeString(value)) {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n};\n\nconst schemaMatchesType = (schemaType: string | string[] | undefined, value: unknown): boolean => {\n if (!schemaType) {\n return true;\n }\n\n const allowed = Array.isArray(schemaType) ? schemaType : [schemaType];\n\n return allowed.some((type) => {\n if (type === \"null\") {\n return value === null;\n }\n\n if (type === \"array\") {\n return Array.isArray(value);\n }\n\n if (type === \"object\") {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n\n return typeof value === type;\n });\n};\n\nconst validateAgainstSchema = (value: unknown, schema: any, path = \"body\"): string[] => {\n if (!schema) {\n return [];\n }\n\n const errors: string[] = [];\n\n if (schema.oneOf?.length) {\n const matches = schema.oneOf.filter((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (matches.length !== 1) {\n errors.push(`${path} must match exactly one allowed shape`);\n }\n return errors;\n }\n\n if (schema.anyOf?.length) {\n const matches = schema.anyOf.some((variant: any) => validateAgainstSchema(value, variant, path).length === 0);\n if (!matches) {\n errors.push(`${path} must match at least one allowed shape`);\n }\n return errors;\n }\n\n if (schema.allOf?.length) {\n for (const variant of schema.allOf) {\n errors.push(...validateAgainstSchema(value, variant, path));\n }\n return errors;\n }\n\n if (!schemaMatchesType(schema.type, value)) {\n const expected = Array.isArray(schema.type) ? schema.type.join(\"|\") : schema.type;\n errors.push(`${path} must be of type ${expected}`);\n return errors;\n }\n\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path} must be one of: ${schema.enum.join(\", \")}`);\n }\n\n if (Array.isArray(value)) {\n if (schema.items) {\n value.forEach((item, index) => {\n errors.push(...validateAgainstSchema(item, schema.items, `${path}[${index}]`));\n });\n }\n return errors;\n }\n\n if (typeof value === \"object\" && value !== null) {\n const objectValue = value as Record<string, unknown>;\n const properties = schema.properties ?? {};\n const required = schema.required ?? [];\n\n for (const key of required) {\n if (objectValue[key] === undefined) {\n errors.push(`${path}.${key} is required`);\n }\n }\n\n for (const [key, childValue] of Object.entries(objectValue)) {\n const childSchema = properties[key];\n\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n errors.push(`${path}.${key} is not allowed`);\n } else if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n errors.push(...validateAgainstSchema(childValue, schema.additionalProperties, `${path}.${key}`));\n }\n continue;\n }\n\n errors.push(...validateAgainstSchema(childValue, childSchema, `${path}.${key}`));\n }\n }\n\n return errors;\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 = createRequestUrl(baseUrl, applyPathParams(tool.path, input.path));\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 normalizedBody = normalizeJsonBody(input.body);\n const hasBody = normalizedBody !== 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 const bodySchema = tool.parameters.properties?.body;\n const bodyValidationErrors = validateAgainstSchema(normalizedBody, bodySchema);\n\n if (bodyValidationErrors.length > 0) {\n debugLog(tool.name, \"invalid-input\", {\n url: finalUrl.toString(),\n method: tool.method,\n errors: bodyValidationErrors,\n body: normalizedBody\n });\n return formatToolResult({\n ok: false,\n status: 400,\n statusText: \"INVALID_TOOL_INPUT\",\n data: {\n message: \"Tool input body does not match the generated schema.\",\n errors: bodyValidationErrors,\n received: normalizedBody\n }\n });\n }\n\n requestInit.body = JSON.stringify(normalizedBody);\n }\n\n debugLog(tool.name, \"request\", {\n url: finalUrl.toString(),\n method: tool.method,\n headers: headersToObject(requestInit.headers as Headers),\n body: hasBody ? normalizedBody : undefined\n });\n\n const response = await fetch(finalUrl, requestInit);\n\n const payload = await parseResponse(response);\n\n debugLog(tool.name, \"response\", {\n url: finalUrl.toString(),\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n data: payload\n });\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":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/openapi.ts","../src/utils.ts","../src/generator.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport {\n ConvertOpenApiOptions,\n JsonSchema,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenClawPluginCatalog,\n OpenClawToolDefinition\n} from \"./types\";\nimport {\n AUTH_HEADER_NAMES,\n HTTP_METHODS,\n buildOperationId,\n buildToolName,\n compactObject,\n dedupeParameters,\n hasSchemaContent,\n pickContentSchema,\n toTitleCase\n} from \"./utils\";\n\nconst isHttpUrl = (value: string): boolean => /^https?:\\/\\//i.test(value);\n\nconst readUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Unable to load OpenAPI document from ${url}: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n};\n\nexport const loadOpenApiDocument = async (source: string): Promise<OpenApiDocument> => {\n const raw = isHttpUrl(source)\n ? await readUrl(source)\n : await fs.readFile(source, \"utf8\");\n\n const document = JSON.parse(raw) as OpenApiDocument;\n\n if (!document.openapi || !document.paths) {\n throw new Error(\"Invalid OpenAPI document: missing `openapi` or `paths`.\");\n }\n\n return document;\n};\n\nconst cloneJsonSchema = (value: JsonSchema): JsonSchema => JSON.parse(JSON.stringify(value)) as JsonSchema;\n\nconst resolveRefName = (ref: string): string => ref.split(\"/\").pop() ?? \"UnknownSchema\";\n\nconst resolveSchemaRef = (\n document: OpenApiDocument,\n ref: string\n): import(\"./types\").OpenApiSchemaObject | undefined => {\n const schemaName = resolveRefName(ref);\n return document.components?.schemas?.[schemaName];\n};\n\nexport const openApiSchemaToJsonSchema = (\n schema: import(\"./types\").OpenApiSchemaObject | undefined,\n document: OpenApiDocument,\n seen = new Set<string>()\n): JsonSchema => {\n if (!schema) {\n return { type: \"object\", additionalProperties: true };\n }\n\n if (schema.$ref) {\n if (seen.has(schema.$ref)) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const resolved = resolveSchemaRef(document, schema.$ref);\n\n if (!resolved) {\n return { type: \"object\", additionalProperties: true };\n }\n\n const nextSeen = new Set(seen);\n nextSeen.add(schema.$ref);\n return openApiSchemaToJsonSchema(resolved, document, nextSeen);\n }\n\n const jsonSchema: JsonSchema = compactObject({\n type: Array.isArray(schema.type) ? [...schema.type] : schema.type,\n description: schema.description,\n default: schema.default,\n enum: schema.enum ? [...schema.enum] : undefined\n });\n\n if (schema.oneOf?.length) {\n jsonSchema.oneOf = schema.oneOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.anyOf?.length) {\n jsonSchema.anyOf = schema.anyOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.allOf?.length) {\n jsonSchema.allOf = schema.allOf.map((item) => openApiSchemaToJsonSchema(item, document, seen));\n }\n\n if (schema.items) {\n jsonSchema.items = openApiSchemaToJsonSchema(schema.items, document, seen);\n }\n\n if (schema.properties) {\n jsonSchema.properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n openApiSchemaToJsonSchema(value, document, seen)\n ])\n );\n }\n\n if (schema.required?.length) {\n jsonSchema.required = [...schema.required];\n }\n\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties =\n schema.additionalProperties === true || schema.additionalProperties === false\n ? schema.additionalProperties\n : openApiSchemaToJsonSchema(schema.additionalProperties, document, seen);\n }\n\n if (schema.nullable) {\n const currentType = jsonSchema.type;\n\n if (Array.isArray(currentType)) {\n jsonSchema.type = currentType.includes(\"null\") ? currentType : [...currentType, \"null\"];\n } else if (currentType) {\n jsonSchema.type = currentType === \"null\" ? \"null\" : [currentType, \"null\"];\n } else {\n jsonSchema.type = [\"object\", \"null\"];\n }\n }\n\n return jsonSchema;\n};\n\nconst isObjectSchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"object\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"object\");\n }\n\n return Boolean(schema?.properties || schema?.additionalProperties);\n};\n\nconst isArraySchema = (schema: JsonSchema | undefined): boolean => {\n const type = schema?.type;\n\n if (type === \"array\") {\n return true;\n }\n\n if (Array.isArray(type)) {\n return type.includes(\"array\");\n }\n\n return Boolean(schema?.items);\n};\n\nconst jsonSchemasEqual = (left: JsonSchema | undefined, right: JsonSchema | undefined): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nconst normalizeBodySchemaForAgent = (schema: JsonSchema): JsonSchema => {\n if (schema.oneOf?.length) {\n const normalizedVariants = schema.oneOf.map(normalizeBodySchemaForAgent);\n const objectVariant = normalizedVariants.find((item) => isObjectSchema(item));\n const arrayVariant = normalizedVariants.find((item) => isArraySchema(item));\n\n if (\n objectVariant &&\n arrayVariant?.items &&\n jsonSchemasEqual(objectVariant, arrayVariant.items)\n ) {\n // AI-facing tools are much more reliable when a request body has one clear object shape.\n // When OpenAPI exposes \"single object OR array of same object\", prefer the single-object form.\n return objectVariant;\n }\n\n return {\n ...schema,\n oneOf: normalizedVariants\n };\n }\n\n if (schema.anyOf?.length) {\n return {\n ...schema,\n anyOf: schema.anyOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.allOf?.length) {\n return {\n ...schema,\n allOf: schema.allOf.map(normalizeBodySchemaForAgent)\n };\n }\n\n if (schema.items) {\n return {\n ...schema,\n items: normalizeBodySchemaForAgent(schema.items)\n };\n }\n\n if (schema.properties) {\n return {\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeBodySchemaForAgent(value)])\n )\n };\n }\n\n return schema;\n};\n\nconst buildParameterSection = (\n sectionName: string,\n parameters: import(\"./types\").OpenApiParameterObject[],\n document: OpenApiDocument\n): { name: string; schema: JsonSchema; required: boolean } | null => {\n if (!parameters.length) {\n return null;\n }\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const parameter of parameters) {\n properties[parameter.name] = compactObject({\n ...openApiSchemaToJsonSchema(parameter.schema, document),\n description: parameter.description ?? parameter.schema?.description\n });\n\n if (parameter.required) {\n required.push(parameter.name);\n }\n }\n\n return {\n name: sectionName,\n required: required.length > 0,\n schema: compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false\n })\n };\n};\n\nconst buildToolParameters = (\n document: OpenApiDocument,\n path: string,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): JsonSchema => {\n const requestBodySchema = pickContentSchema(operation.requestBody?.content);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const sections = [\n buildParameterSection(\"path\", pathParameters, document),\n buildParameterSection(\"query\", queryParameters, document),\n options.includeHeaders ? buildParameterSection(\"headers\", headerParameters, document) : null\n ].filter((value): value is { name: string; schema: JsonSchema; required: boolean } => Boolean(value));\n\n for (const section of sections) {\n if (hasSchemaContent(section.schema)) {\n properties[section.name] = section.schema;\n if (section.required) {\n required.push(section.name);\n }\n }\n }\n\n if (requestBodySchema) {\n properties.body = normalizeBodySchemaForAgent(openApiSchemaToJsonSchema(requestBodySchema, document));\n if (operation.requestBody?.required) {\n required.push(\"body\");\n }\n }\n\n return compactObject({\n type: \"object\",\n properties,\n required: required.length ? required : undefined,\n additionalProperties: false,\n description: `${operation.summary ?? operation.operationId ?? `${path} request`} tool arguments`\n });\n};\n\nconst buildToolDescription = (path: string, method: string, operation: OpenApiOperationObject): string => {\n const summary = operation.summary?.trim();\n const description = operation.description?.trim();\n\n if (summary && description && description !== summary) {\n return `${summary}. ${description}`;\n }\n\n if (summary) {\n return summary;\n }\n\n if (description) {\n return description;\n }\n\n return `${method.toUpperCase()} ${path}`;\n};\n\nconst buildToolDefinition = (\n document: OpenApiDocument,\n path: string,\n method: import(\"./types\").HttpMethod,\n operation: OpenApiOperationObject,\n options: ConvertOpenApiOptions,\n pathParameters: import(\"./types\").OpenApiParameterObject[],\n queryParameters: import(\"./types\").OpenApiParameterObject[],\n headerParameters: import(\"./types\").OpenApiParameterObject[]\n): OpenClawToolDefinition => {\n const operationId = buildOperationId(method, path, operation.operationId);\n\n return {\n name: buildToolName(options.toolPrefix, operationId),\n description: buildToolDescription(path, method, operation),\n method: method.toUpperCase() as Uppercase<typeof method>,\n path,\n operationId,\n parameters: buildToolParameters(\n document,\n path,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n ),\n tags: operation.tags ?? []\n };\n};\n\nexport const convertOpenApiToTools = (\n document: OpenApiDocument,\n options: ConvertOpenApiOptions\n): OpenClawPluginCatalog => {\n const tools: OpenClawToolDefinition[] = [];\n\n for (const [path, pathItem] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n\n if (!operation) {\n continue;\n }\n\n const parameters = dedupeParameters(pathItem.parameters, operation.parameters);\n const pathParameters = parameters.filter((parameter) => parameter.in === \"path\");\n const queryParameters = parameters.filter((parameter) => parameter.in === \"query\");\n const headerParameters = parameters.filter(\n (parameter) =>\n parameter.in === \"header\" &&\n !AUTH_HEADER_NAMES.has(parameter.name.toLowerCase())\n );\n\n tools.push(\n buildToolDefinition(\n document,\n path,\n method,\n operation,\n options,\n pathParameters,\n queryParameters,\n headerParameters\n )\n );\n }\n }\n\n tools.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n pluginId: options.pluginId,\n pluginName: options.pluginName ?? toTitleCase(options.pluginId),\n version: options.pluginVersion,\n description:\n document.info?.description?.trim() ??\n `Generated OpenClaw tool plugin for ${document.info?.title ?? options.pluginId}`,\n serverUrl: options.defaultServerUrl ?? document.servers?.[0]?.url,\n optional: options.optional ?? true,\n tools\n };\n};\n","import { HttpMethod, JsonSchema, OpenApiParameterObject } from \"./types\";\n\nexport const HTTP_METHODS: HttpMethod[] = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"options\",\n \"head\"\n];\n\nexport const AUTH_HEADER_NAMES = new Set([\n \"authorization\",\n \"x-api-key\",\n \"api-key\",\n \"dt-jwt\"\n]);\n\nexport const sanitizeIdentifier = (value: string): string =>\n value\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase() || \"tool\";\n\nexport const toTitleCase = (value: string): string =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\nexport const buildToolName = (toolPrefix: string | undefined, rawName: string): string => {\n const base = sanitizeIdentifier(rawName);\n const prefix = sanitizeIdentifier(toolPrefix ?? \"\");\n return prefix ? `${prefix}_${base}` : base;\n};\n\nexport const buildOperationId = (method: HttpMethod, path: string, operationId?: string): string => {\n if (operationId?.trim()) {\n return sanitizeIdentifier(operationId);\n }\n\n const pathPart = path\n .replace(/\\{([^}]+)\\}/g, \"by_$1\")\n .replace(/\\/+/g, \"_\");\n\n return sanitizeIdentifier(`${method}_${pathPart}`);\n};\n\nexport const pickContentSchema = (\n content: Record<string, { schema?: import(\"./types\").OpenApiSchemaObject | undefined }> | undefined\n): import(\"./types\").OpenApiSchemaObject | undefined =>\n content?.[\"application/json\"]?.schema ??\n content?.[\"application/*+json\"]?.schema ??\n Object.values(content ?? {})[0]?.schema;\n\nexport const dedupeParameters = (\n pathLevel: OpenApiParameterObject[] | undefined,\n operationLevel: OpenApiParameterObject[] | undefined\n): OpenApiParameterObject[] => {\n const byKey = new Map<string, OpenApiParameterObject>();\n\n for (const param of [...(pathLevel ?? []), ...(operationLevel ?? [])]) {\n byKey.set(`${param.in}:${param.name}`, param);\n }\n\n return [...byKey.values()];\n};\n\nexport const compactObject = <T extends Record<string, unknown>>(value: T): T => {\n const output = {} as T;\n\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) {\n output[key as keyof T] = item as T[keyof T];\n }\n }\n\n return output;\n};\n\nexport const hasSchemaContent = (schema: JsonSchema | undefined): boolean =>\n Boolean(\n schema &&\n ((schema.properties && Object.keys(schema.properties).length > 0) ||\n (schema.required && schema.required.length > 0) ||\n schema.type ||\n schema.oneOf ||\n schema.anyOf ||\n schema.allOf)\n );\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n ConvertOpenApiOptions,\n GeneratedPluginFiles,\n GeneratePluginOptions,\n OpenClawPluginCatalog\n} from \"./types\";\nimport { convertOpenApiToTools, loadOpenApiDocument } from \"./openapi\";\n\nconst serialize = (value: unknown): string => JSON.stringify(value, null, 2);\n\nexport const renderPluginManifest = (catalog: OpenClawPluginCatalog): string =>\n `${serialize({\n id: catalog.pluginId,\n name: catalog.pluginName,\n version: catalog.version ?? \"0.1.0\",\n description: catalog.description,\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n baseUrl: {\n type: \"string\",\n description: \"Base URL of the target HTTP API\"\n },\n bearerToken: {\n type: \"string\",\n description: \"Bearer token used for Authorization header\"\n },\n apiKey: {\n type: \"string\",\n description: \"Static API key for the upstream API\"\n },\n apiKeyHeader: {\n type: \"string\",\n description: \"Header name used when apiKey is set\",\n default: \"x-api-key\"\n },\n timeoutMs: {\n type: \"number\",\n description: \"Timeout in milliseconds for outbound tool calls\"\n },\n defaultHeaders: {\n type: \"object\",\n additionalProperties: {\n type: \"string\"\n },\n description: \"Additional headers added to every request\"\n }\n }\n },\n uiHints: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: catalog.serverUrl ?? \"https://api.example.com\"\n },\n bearerToken: {\n label: \"Bearer Token\",\n sensitive: true\n },\n apiKey: {\n label: \"API Key\",\n sensitive: true\n },\n apiKeyHeader: {\n label: \"API Key Header\"\n },\n timeoutMs: {\n label: \"Timeout (ms)\"\n }\n }\n })}\\n`;\n\nexport const renderPluginModule = (catalog: OpenClawPluginCatalog): string =>\n `import { createOpenApiPlugin } from \"@redonvn/open-claw-sdk\";\n\nexport const catalog = ${serialize(catalog)} as const;\n\nexport default createOpenApiPlugin(catalog);\n`;\n\nexport const renderCatalogFile = (catalog: OpenClawPluginCatalog): string =>\n `${serialize(catalog)}\\n`;\n\nconst ensureDir = async (dirPath: string): Promise<void> => {\n await fs.mkdir(dirPath, { recursive: true });\n};\n\nexport const writeGeneratedPlugin = async (\n catalog: OpenClawPluginCatalog,\n outDir: string\n): Promise<GeneratedPluginFiles> => {\n await ensureDir(outDir);\n\n const manifestPath = path.join(outDir, \"openclaw.plugin.json\");\n const indexPath = path.join(outDir, \"index.ts\");\n const catalogPath = path.join(outDir, \"tool-catalog.json\");\n\n await Promise.all([\n fs.writeFile(manifestPath, renderPluginManifest(catalog), \"utf8\"),\n fs.writeFile(indexPath, renderPluginModule(catalog), \"utf8\"),\n fs.writeFile(catalogPath, renderCatalogFile(catalog), \"utf8\")\n ]);\n\n return { manifestPath, indexPath, catalogPath };\n};\n\nexport const generatePluginFromOpenApi = async (\n options: GeneratePluginOptions\n): Promise<{ catalog: OpenClawPluginCatalog; files: GeneratedPluginFiles }> => {\n const document = await loadOpenApiDocument(options.input);\n const convertOptions: ConvertOpenApiOptions = {\n pluginId: options.pluginId,\n pluginName: options.pluginName,\n pluginVersion: options.pluginVersion,\n toolPrefix: options.toolPrefix,\n optional: options.optional,\n includeHeaders: options.includeHeaders,\n defaultServerUrl: options.defaultServerUrl\n };\n const catalog = convertOpenApiToTools(document, convertOptions);\n const files = await writeGeneratedPlugin(catalog, options.outDir);\n\n return { catalog, files };\n};\n"],"mappings":"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","names":["path","path","fs","fs"]}
|