@easynet/agent-tool 1.0.61 → 1.0.63
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/api/adapters/LangChainToolsHub.d.ts.map +1 -1
- package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -1
- package/dist/api/main.cjs +29 -13
- package/dist/api/main.d.ts +34 -0
- package/dist/api/main.d.ts.map +1 -1
- package/dist/api/main.js +2 -2
- package/dist/api/runtimeFromConfig.d.ts +2 -5
- package/dist/api/runtimeFromConfig.d.ts.map +1 -1
- package/dist/api/runtimeFromConfig.helpers.d.ts +12 -0
- package/dist/api/runtimeFromConfig.helpers.d.ts.map +1 -0
- package/dist/build.cjs +1 -0
- package/dist/build.js +1 -0
- package/dist/chunk-DEDDPMBU.js +3 -0
- package/dist/chunk-DEDDPMBU.js.map +1 -0
- package/dist/chunk-FWWN4D2F.js +3 -0
- package/dist/chunk-FWWN4D2F.js.map +1 -0
- package/dist/chunk-ICHSEIZN.cjs +4 -0
- package/dist/chunk-ICHSEIZN.cjs.map +1 -0
- package/dist/{chunk-HK4GTFTQ.cjs → chunk-M2GEHWPN.cjs} +41 -40
- package/dist/chunk-M2GEHWPN.cjs.map +1 -0
- package/dist/chunk-NKYFYALQ.js +181 -0
- package/dist/chunk-NKYFYALQ.js.map +1 -0
- package/dist/chunk-NOGGIM7B.cjs +4 -0
- package/dist/chunk-NOGGIM7B.cjs.map +1 -0
- package/dist/chunk-R55NXJIH.cjs +184 -0
- package/dist/chunk-R55NXJIH.cjs.map +1 -0
- package/dist/{chunk-NVT4X4CB.js → chunk-RJAF5XY6.js} +40 -39
- package/dist/chunk-RJAF5XY6.js.map +1 -0
- package/dist/{chunk-ZH5MH3AK.cjs → chunk-U67QDQFQ.cjs} +73 -41
- package/dist/chunk-U67QDQFQ.cjs.map +1 -0
- package/dist/chunk-WO4LZKPQ.cjs +359 -0
- package/dist/chunk-WO4LZKPQ.cjs.map +1 -0
- package/dist/chunk-YL6RC7HQ.cjs +4 -0
- package/dist/chunk-YL6RC7HQ.cjs.map +1 -0
- package/dist/chunk-YLWTSNTT.js +3 -0
- package/dist/chunk-YLWTSNTT.js.map +1 -0
- package/dist/{chunk-QPKBEU64.js → chunk-YMHUDRYE.js} +59 -31
- package/dist/chunk-YMHUDRYE.js.map +1 -0
- package/dist/chunk-YPGF5Y2Y.js +341 -0
- package/dist/chunk-YPGF5Y2Y.js.map +1 -0
- package/dist/core/index.cjs +1 -0
- package/dist/core/index.js +1 -0
- package/dist/core/runtime.cjs +1 -0
- package/dist/core/runtime.js +1 -0
- package/dist/extension.cjs +54 -355
- package/dist/extension.cjs.map +1 -1
- package/dist/extension.js +3 -339
- package/dist/extension.js.map +1 -1
- package/dist/index.cjs +96 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +50 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -7
- package/dist/index.js.map +1 -1
- package/dist/security.cjs +11 -178
- package/dist/security.cjs.map +1 -1
- package/dist/security.js +2 -179
- package/dist/security.js.map +1 -1
- package/dist/utils/cli/help.d.ts +2 -0
- package/dist/utils/cli/help.d.ts.map +1 -0
- package/dist/utils/cli/index.cjs +95 -73
- package/dist/utils/cli/index.cjs.map +1 -1
- package/dist/utils/cli/index.d.ts.map +1 -1
- package/dist/utils/cli/index.js +84 -62
- package/dist/utils/cli/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-HK4GTFTQ.cjs.map +0 -1
- package/dist/chunk-NVT4X4CB.js.map +0 -1
- package/dist/chunk-QPKBEU64.js.map +0 -1
- package/dist/chunk-ZH5MH3AK.cjs.map +0 -1
|
@@ -1,28 +1,48 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkM2GEHWPN_cjs = require('./chunk-M2GEHWPN.cjs');
|
|
4
4
|
var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
|
|
5
5
|
var chunkOG5ZSXQ5_cjs = require('./chunk-OG5ZSXQ5.cjs');
|
|
6
6
|
var tools = require('@langchain/core/tools');
|
|
7
7
|
var agentCommon = require('@easynet/agent-common');
|
|
8
8
|
|
|
9
|
-
function
|
|
9
|
+
function getArgsSchemaIfWrapped(inputSchema) {
|
|
10
10
|
const s = inputSchema;
|
|
11
|
-
if (s?.type !== "object" || !s.properties || typeof s.properties !== "object") return
|
|
11
|
+
if (s?.type !== "object" || !s.properties || typeof s.properties !== "object") return null;
|
|
12
12
|
const args = s.properties.args;
|
|
13
|
-
|
|
13
|
+
if (args != null && typeof args === "object" && args.type === "object" && args.properties != null) {
|
|
14
|
+
return args;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function hasArgsWrapper(inputSchema) {
|
|
19
|
+
return getArgsSchemaIfWrapped(inputSchema) !== null;
|
|
14
20
|
}
|
|
15
21
|
function schemaForLangChain(inputSchema) {
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const wrapped = getArgsSchemaIfWrapped(inputSchema);
|
|
23
|
+
if (wrapped !== null) return wrapped;
|
|
24
|
+
return inputSchema;
|
|
25
|
+
}
|
|
26
|
+
function buildIntent(toolName, inputSchema, args) {
|
|
27
|
+
return {
|
|
28
|
+
tool: toolName,
|
|
29
|
+
args: hasArgsWrapper(inputSchema) ? { args } : args,
|
|
30
|
+
purpose: chunkOG5ZSXQ5_cjs.LANGCHAIN_KIND
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function normalizeArgs(args) {
|
|
34
|
+
return agentCommon.stripNullishObjectFields(args ?? {});
|
|
35
|
+
}
|
|
36
|
+
function serializeToolResult(result) {
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
return typeof result.result === "string" ? result.result : JSON.stringify(result.result);
|
|
24
39
|
}
|
|
25
|
-
|
|
40
|
+
const err = result.error;
|
|
41
|
+
const message = err?.message ?? "Tool failed";
|
|
42
|
+
const details = err?.details;
|
|
43
|
+
return JSON.stringify(
|
|
44
|
+
details != null ? { error: message, details } : { error: message }
|
|
45
|
+
);
|
|
26
46
|
}
|
|
27
47
|
var DEFAULT_CTX_FACTORY = () => ({
|
|
28
48
|
requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
@@ -71,23 +91,11 @@ var LangChainToolsHub = class {
|
|
|
71
91
|
description: spec.description ?? `Tool: ${spec.name}`,
|
|
72
92
|
schema,
|
|
73
93
|
func: async (args) => {
|
|
74
|
-
const
|
|
75
|
-
const intent =
|
|
76
|
-
tool: spec.name,
|
|
77
|
-
args: hasArgsWrapper(enriched.inputSchema) ? { args: flat } : flat,
|
|
78
|
-
purpose: chunkOG5ZSXQ5_cjs.LANGCHAIN_KIND
|
|
79
|
-
};
|
|
94
|
+
const normalizedArgs = normalizeArgs(args);
|
|
95
|
+
const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);
|
|
80
96
|
const ctx = ctxFactory();
|
|
81
97
|
const result = await runtime.invoke(intent, ctx);
|
|
82
|
-
|
|
83
|
-
return typeof result.result === "string" ? result.result : JSON.stringify(result.result);
|
|
84
|
-
}
|
|
85
|
-
const err = result.error;
|
|
86
|
-
const message = err?.message ?? "Tool failed";
|
|
87
|
-
const details = err?.details;
|
|
88
|
-
return JSON.stringify(
|
|
89
|
-
details != null ? { error: message, details } : { error: message }
|
|
90
|
-
);
|
|
98
|
+
return serializeToolResult(result);
|
|
91
99
|
}
|
|
92
100
|
});
|
|
93
101
|
}
|
|
@@ -110,10 +118,10 @@ function mergeHostLists(a, b) {
|
|
|
110
118
|
function runtimeOptionsFromConfig(opts) {
|
|
111
119
|
const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };
|
|
112
120
|
if (opts.configFilePath) {
|
|
113
|
-
const toolConfig =
|
|
121
|
+
const toolConfig = chunkM2GEHWPN_cjs.loadToolConfig(opts.configFilePath);
|
|
114
122
|
const updates = {};
|
|
115
123
|
if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
|
|
116
|
-
updates.sandboxRoot =
|
|
124
|
+
updates.sandboxRoot = chunkM2GEHWPN_cjs.resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);
|
|
117
125
|
}
|
|
118
126
|
if (typeof toolConfig.enableSandboxValidation === "boolean") {
|
|
119
127
|
updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
|
|
@@ -136,7 +144,7 @@ function runtimeOptionsFromConfig(opts) {
|
|
|
136
144
|
const packageDefaults = { ...coreTools.packageDefaults };
|
|
137
145
|
if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {
|
|
138
146
|
for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {
|
|
139
|
-
const prefix = descriptor.startsWith("file:") ?
|
|
147
|
+
const prefix = descriptor.startsWith("file:") ? chunkM2GEHWPN_cjs.fileDescriptorToPackagePrefix(descriptor) : chunkM2GEHWPN_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
|
|
140
148
|
if (!prefix) continue;
|
|
141
149
|
const pkgDefaults = pkgConfig?.defaults != null && typeof pkgConfig.defaults === "object" && !Array.isArray(pkgConfig.defaults) ? pkgConfig.defaults : {};
|
|
142
150
|
if (Object.keys(pkgDefaults).length > 0) {
|
|
@@ -166,18 +174,18 @@ function runtimeOptionsFromConfig(opts) {
|
|
|
166
174
|
function createAgentTools(options) {
|
|
167
175
|
const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
|
|
168
176
|
const runtimeOpts = runtimeOptionsFromConfig(opts);
|
|
169
|
-
const { runtime } =
|
|
177
|
+
const { runtime } = chunkM2GEHWPN_cjs.createRuntimeFromConfigSync(runtimeOpts);
|
|
170
178
|
const hub = new LangChainToolsHub(runtime);
|
|
171
179
|
if (opts.configFilePath) {
|
|
172
|
-
const toolConfig =
|
|
180
|
+
const toolConfig = chunkM2GEHWPN_cjs.loadToolConfig(opts.configFilePath);
|
|
173
181
|
const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
|
|
174
182
|
if (names.length > 0) {
|
|
175
183
|
const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
|
|
176
|
-
const allBarePackages = names.every((n) =>
|
|
184
|
+
const allBarePackages = names.every((n) => chunkM2GEHWPN_cjs.isBarePackageDescriptor(String(n)));
|
|
177
185
|
if (allBarePackages) {
|
|
178
186
|
return hub.getLangChainTools();
|
|
179
187
|
}
|
|
180
|
-
const expanded =
|
|
188
|
+
const expanded = chunkM2GEHWPN_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
|
|
181
189
|
return hub.getLangChainToolsForNames(expanded);
|
|
182
190
|
}
|
|
183
191
|
}
|
|
@@ -185,25 +193,49 @@ function createAgentTools(options) {
|
|
|
185
193
|
}
|
|
186
194
|
async function createLangChainToolsAsync(options = {}) {
|
|
187
195
|
const runtimeOpts = runtimeOptionsFromConfig(options);
|
|
188
|
-
const { runtime } = await
|
|
196
|
+
const { runtime } = await chunkM2GEHWPN_cjs.createRuntimeFromConfig(runtimeOpts);
|
|
189
197
|
const hub = new LangChainToolsHub(runtime);
|
|
190
198
|
if (options.configFilePath) {
|
|
191
|
-
const toolConfig =
|
|
199
|
+
const toolConfig = chunkM2GEHWPN_cjs.loadToolConfig(options.configFilePath);
|
|
192
200
|
const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
|
|
193
201
|
if (names.length > 0) {
|
|
194
202
|
const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
|
|
195
|
-
const allBarePackages = names.every((n) =>
|
|
203
|
+
const allBarePackages = names.every((n) => chunkM2GEHWPN_cjs.isBarePackageDescriptor(String(n)));
|
|
196
204
|
if (allBarePackages) {
|
|
197
205
|
return hub.getLangChainTools();
|
|
198
206
|
}
|
|
199
|
-
const expanded =
|
|
207
|
+
const expanded = chunkM2GEHWPN_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
|
|
200
208
|
return hub.getLangChainToolsForNames(expanded);
|
|
201
209
|
}
|
|
202
210
|
}
|
|
203
211
|
return hub.getLangChainTools();
|
|
204
212
|
}
|
|
205
213
|
|
|
214
|
+
// src/api/main.ts
|
|
215
|
+
var langchainApi = {
|
|
216
|
+
createAgentTools,
|
|
217
|
+
createLangChainToolsAsync
|
|
218
|
+
};
|
|
219
|
+
var runtimeApi = {
|
|
220
|
+
createRuntimeFromConfig: chunkM2GEHWPN_cjs.createRuntimeFromConfig,
|
|
221
|
+
createRuntimeFromConfigSync: chunkM2GEHWPN_cjs.createRuntimeFromConfigSync
|
|
222
|
+
};
|
|
223
|
+
var mcpApi = {
|
|
224
|
+
createMCPServer: chunkM2GEHWPN_cjs.createMCPServer,
|
|
225
|
+
runMCPServerOverStdio: chunkM2GEHWPN_cjs.runMCPServerOverStdio,
|
|
226
|
+
createMCPStreamableHttpHandler: chunkM2GEHWPN_cjs.createMCPStreamableHttpHandler,
|
|
227
|
+
createMCPServerStreamableHttp: chunkM2GEHWPN_cjs.createMCPServerStreamableHttp
|
|
228
|
+
};
|
|
229
|
+
var openApi = {
|
|
230
|
+
createOpenAPIServer: chunkM2GEHWPN_cjs.createHttpService,
|
|
231
|
+
createHttpService: chunkM2GEHWPN_cjs.createHttpService
|
|
232
|
+
};
|
|
233
|
+
|
|
206
234
|
exports.createAgentTools = createAgentTools;
|
|
207
235
|
exports.createLangChainToolsAsync = createLangChainToolsAsync;
|
|
208
|
-
|
|
209
|
-
|
|
236
|
+
exports.langchainApi = langchainApi;
|
|
237
|
+
exports.mcpApi = mcpApi;
|
|
238
|
+
exports.openApi = openApi;
|
|
239
|
+
exports.runtimeApi = runtimeApi;
|
|
240
|
+
//# sourceMappingURL=chunk-U67QDQFQ.cjs.map
|
|
241
|
+
//# sourceMappingURL=chunk-U67QDQFQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts","../src/api/main.ts"],"names":["LANGCHAIN_KIND","stripNullishObjectFields","enrichSpecWithCanonicalSchema","DynamicStructuredTool","loadToolConfig","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","createRuntimeFromConfig","createMCPServer","runMCPServerOverStdio","createMCPStreamableHttpHandler","createMCPServerStreamableHttp","createHttpService"],"mappings":"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","file":"chunk-U67QDQFQ.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() which loads from tools.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolResult } from \"../../core/types/ToolResult.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema wraps all params in a single \"args\" object (manifest convention),\n * returns that inner args schema; otherwise returns null.\n */\nfunction getArgsSchemaIfWrapped(inputSchema: object): Record<string, unknown> | null {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return null;\n const args = (s.properties as Record<string, unknown>).args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n return getArgsSchemaIfWrapped(inputSchema) !== null;\n}\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } } },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const wrapped = getArgsSchemaIfWrapped(inputSchema);\n if (wrapped !== null) return wrapped;\n return inputSchema as Record<string, unknown>;\n}\n\nfunction buildIntent(\n toolName: string,\n inputSchema: object,\n args: Record<string, unknown>,\n): ToolIntent {\n return {\n tool: toolName,\n args: hasArgsWrapper(inputSchema) ? { args } : args,\n purpose: LANGCHAIN_KIND,\n };\n}\n\nfunction normalizeArgs(args: Record<string, unknown> | undefined): Record<string, unknown> {\n return stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n}\n\nfunction serializeToolResult(result: ToolResult): string {\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const normalizedArgs = normalizeArgs(args);\n const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n return serializeToolResult(result);\n },\n });\n }\n}\n","/**\n * Create LangChain tools from config (sync or async). Uses PTCRuntime + registry\n * and exposes tools via LangChainToolsHub. All invokes go through PTC Intent.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { createRuntimeFromConfigSync, createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to tool.yaml; when set, only tools listed there are returned; sandboxedPath from it is used as sandboxRoot */\n configFilePath?: string;\n /** Project path for async loading (use createLangChainToolsAsync) */\n projectPath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction runtimeOptionsFromConfig(opts: CreateAgentToolsOptions): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n const flatOverrides: Record<string, Record<string, unknown>> = { ...coreTools.toolOverrides };\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) {\n return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Create LangChain tools synchronously. When configFilePath is set, returns only\n * tools listed in that file (and that exist in the registry). If tool.yaml has\n * sandboxedPath, fs tools can only access that directory.\n */\nexport function createAgentTools(\n options?: CreateAgentToolsOptions | string\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const runtimeOpts = runtimeOptionsFromConfig(opts);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n\n/**\n * Create LangChain tools asynchronously. Use when projectPath is set to load\n * tools from the project before building the tool list.\n */\nexport async function createLangChainToolsAsync(\n options: CreateAgentToolsOptions = {}\n): Promise<StructuredToolInterface[]> {\n const runtimeOpts = runtimeOptionsFromConfig(options);\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (options.configFilePath) {\n const toolConfig = loadToolConfig(options.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n","/**\n * Public API: three create functions (config-driven) + runtime.\n *\n * 1. createLangChainTools(config?) → LangChain tools (createReactAgent / AgentExecutor)\n * 2. createMCPServer(runtime | config, options?) → MCP server (stdio, Cursor / Claude)\n * 3. createOpenAPIServer(runtime | config, options?) → HTTP + OpenAPI/Swagger (GET /tools, POST /invoke)\n *\n * All tool invokes go through PTC Intent (runtime.invoke(intent, ctx)) for policy, budget, observability.\n * Use createRuntimeFromConfig(config) when you need the runtime for multiple servers.\n */\n\nexport { createAgentTools, createLangChainToolsAsync } from \"./createAgentTools.js\";\nexport type { CreateAgentToolsOptions } from \"./createAgentTools.js\";\n\nexport { createHttpService } from \"./expose/openapiHttp.js\";\nexport type {\n CreateHttpServiceOptions,\n HttpServiceResult,\n OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\n/** Alias: OpenAPI server with Swagger support */\nexport { createHttpService as createOpenAPIServer } from \"./expose/openapiHttp.js\";\n\nexport {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} from \"./expose/mcpServer.js\";\nexport type {\n MCPServerOptions,\n MCPServerResult,\n MCPStreamableHttpHandler,\n MCPServerStreamableHttpResult,\n CreateMCPServerStreamableHttpOptions,\n} from \"./expose/mcpServer.js\";\n\nexport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"./runtimeFromConfig.js\";\nexport type { CreateRuntimeOptions, CreateRuntimeResult } from \"./runtimeFromConfig.js\";\n\nexport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nexport type { PTCRuntimeConfig } from \"../core/runtime/PTCRuntime.js\";\n\nimport { createAgentTools, createLangChainToolsAsync } from \"./createAgentTools.js\";\nimport { createHttpService } from \"./expose/openapiHttp.js\";\nimport {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} from \"./expose/mcpServer.js\";\nimport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"./runtimeFromConfig.js\";\n\n/**\n * Facade: grouped API for lower import complexity in callers.\n */\nexport const langchainApi = {\n createAgentTools,\n createLangChainToolsAsync,\n} as const;\n\n/**\n * Facade: grouped runtime creation helpers.\n */\nexport const runtimeApi = {\n createRuntimeFromConfig,\n createRuntimeFromConfigSync,\n} as const;\n\n/**\n * Facade: grouped MCP server helpers.\n */\nexport const mcpApi = {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} as const;\n\n/**\n * Facade: grouped OpenAPI/HTTP helpers.\n */\nexport const openApi = {\n createOpenAPIServer: createHttpService,\n createHttpService,\n} as const;\n"]}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJNIWNSCQ_cjs = require('./chunk-JNIWNSCQ.cjs');
|
|
4
|
+
var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
|
|
5
|
+
var async_hooks = require('async_hooks');
|
|
6
|
+
var path6 = require('path');
|
|
7
|
+
var url = require('url');
|
|
8
|
+
var fs = require('fs');
|
|
9
|
+
var yaml = require('js-yaml');
|
|
10
|
+
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var path6__default = /*#__PURE__*/_interopDefault(path6);
|
|
14
|
+
var yaml__default = /*#__PURE__*/_interopDefault(yaml);
|
|
15
|
+
|
|
16
|
+
function createContextRunner() {
|
|
17
|
+
const storage = new async_hooks.AsyncLocalStorage();
|
|
18
|
+
return {
|
|
19
|
+
runWith(ctx, fn) {
|
|
20
|
+
return storage.run(ctx, fn);
|
|
21
|
+
},
|
|
22
|
+
getContext() {
|
|
23
|
+
const ctx = storage.getStore();
|
|
24
|
+
if (ctx === void 0) {
|
|
25
|
+
throw new Error("Extension context not set; invoke only through the extension adapter.");
|
|
26
|
+
}
|
|
27
|
+
return ctx;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function unwrapArgsForHandler(spec, args) {
|
|
32
|
+
if (args == null || typeof args !== "object" || Array.isArray(args)) return args;
|
|
33
|
+
const s = spec.inputSchema;
|
|
34
|
+
if (s?.type !== "object" || !s.properties || typeof s.properties !== "object") return args;
|
|
35
|
+
const props = s.properties;
|
|
36
|
+
const argsProp = props.args;
|
|
37
|
+
if (argsProp != null && typeof argsProp === "object" && argsProp.type === "object" && argsProp.properties != null) {
|
|
38
|
+
const obj = args;
|
|
39
|
+
if (Object.keys(obj).length === 1 && "args" in obj && typeof obj.args === "object" && obj.args !== null) {
|
|
40
|
+
return obj.args;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return args;
|
|
44
|
+
}
|
|
45
|
+
function createDynamicImportAdapter(options) {
|
|
46
|
+
const { kind, packageRoot, getExtensionContext, contextRunner } = options;
|
|
47
|
+
return {
|
|
48
|
+
kind,
|
|
49
|
+
async invoke(spec, args, execCtx) {
|
|
50
|
+
const meta = spec._meta;
|
|
51
|
+
const sourcePath = meta?.sourcePath;
|
|
52
|
+
const exportName = meta?.exportName;
|
|
53
|
+
if (!sourcePath || !exportName) {
|
|
54
|
+
throw new Error(`Extension tool ${spec.name} missing _meta.sourcePath or _meta.exportName`);
|
|
55
|
+
}
|
|
56
|
+
const defaultArgs = meta?.defaultArgs ?? {};
|
|
57
|
+
const mergedArgs = Object.keys(defaultArgs).length === 0 ? args : { ...defaultArgs, ...args };
|
|
58
|
+
const handlerArgs = unwrapArgsForHandler(spec, mergedArgs);
|
|
59
|
+
const resolvedPackageRoot = meta?.packageRoot ?? packageRoot;
|
|
60
|
+
const modulePath = path6__default.default.join(resolvedPackageRoot, `${sourcePath}.js`);
|
|
61
|
+
const mod = await import(url.pathToFileURL(modulePath).href);
|
|
62
|
+
const handler = mod[exportName];
|
|
63
|
+
if (typeof handler !== "function") {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Extension tool ${spec.name}: export "${exportName}" from ${sourcePath} is not a function`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
const ctx = getExtensionContext(execCtx, spec, mergedArgs);
|
|
69
|
+
const output = await contextRunner.runWith(ctx, () => handler(handlerArgs));
|
|
70
|
+
return {
|
|
71
|
+
result: { result: output.result, evidence: output.evidence },
|
|
72
|
+
raw: { evidence: output.evidence }
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function loadToolYaml(packageRoot, sourcePath) {
|
|
78
|
+
const dir = path6__default.default.dirname(sourcePath);
|
|
79
|
+
const base = path6__default.default.basename(sourcePath);
|
|
80
|
+
const dirPath = path6__default.default.join(packageRoot, dir);
|
|
81
|
+
const yamlPath = fs.existsSync(path6__default.default.join(dirPath, `${base}.tool.yaml`)) ? path6__default.default.join(dirPath, `${base}.tool.yaml`) : path6__default.default.join(dirPath, `${base}.example.yaml`);
|
|
82
|
+
if (!fs.existsSync(yamlPath)) return void 0;
|
|
83
|
+
try {
|
|
84
|
+
const raw = fs.readFileSync(yamlPath, "utf-8");
|
|
85
|
+
const data = yaml__default.default.load(raw);
|
|
86
|
+
if (data == null || typeof data !== "object" || Array.isArray(data)) return void 0;
|
|
87
|
+
const obj = data;
|
|
88
|
+
const toolBlock = obj?.tool;
|
|
89
|
+
const arr = toolBlock?.list;
|
|
90
|
+
if (!Array.isArray(arr)) return void 0;
|
|
91
|
+
const defaults = toolBlock?.defaults != null && typeof toolBlock.defaults === "object" && !Array.isArray(toolBlock.defaults) ? toolBlock.defaults : {};
|
|
92
|
+
const item = arr.find(
|
|
93
|
+
(e) => e != null && typeof e === "object" && e.name === base
|
|
94
|
+
);
|
|
95
|
+
if (!item || typeof item !== "object") return void 0;
|
|
96
|
+
const { name: _n, ...rest } = item;
|
|
97
|
+
const merged = { ...defaults, ...rest };
|
|
98
|
+
if (Object.keys(merged).length === 0) return void 0;
|
|
99
|
+
return merged;
|
|
100
|
+
} catch {
|
|
101
|
+
return void 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/api/extension/registerFromManifest.ts
|
|
106
|
+
function loadExtensionManifest(manifestPathOrDir) {
|
|
107
|
+
const p = path6__default.default.resolve(manifestPathOrDir);
|
|
108
|
+
let manifestPath;
|
|
109
|
+
if (fs.existsSync(p) && fs.statSync(p).isFile()) {
|
|
110
|
+
manifestPath = p;
|
|
111
|
+
} else {
|
|
112
|
+
const inDir = path6__default.default.join(p, "core-tools-manifest.json");
|
|
113
|
+
const inDist = path6__default.default.join(p, "dist", "core-tools-manifest.json");
|
|
114
|
+
manifestPath = fs.existsSync(inDir) ? inDir : inDist;
|
|
115
|
+
}
|
|
116
|
+
const raw = fs.readFileSync(manifestPath, "utf-8");
|
|
117
|
+
const parsed = JSON.parse(raw);
|
|
118
|
+
if (Array.isArray(parsed)) {
|
|
119
|
+
return { entries: parsed };
|
|
120
|
+
}
|
|
121
|
+
return { kind: parsed.kind, entries: parsed.tools ?? [] };
|
|
122
|
+
}
|
|
123
|
+
function registerToolsFromManifest(registry, options) {
|
|
124
|
+
const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;
|
|
125
|
+
const loaded = loadExtensionManifest(manifestPathOrDir);
|
|
126
|
+
const kind = kindOpt ?? loaded.kind ?? "extension";
|
|
127
|
+
const entries = loaded.entries;
|
|
128
|
+
const onlySet = only?.length ? new Set(only) : null;
|
|
129
|
+
const registered = [];
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const toolName = entry.name ?? (entry.coreName != null ? entry.coreName.replace(/^[^/]+\//, "").replace(/^src\./, "") : entry.sourcePath.replace(/^src\//, "").replace(/\//g, "."));
|
|
132
|
+
let spec = chunkQEJF3KDV_cjs.createToolSpec({
|
|
133
|
+
name: toolName,
|
|
134
|
+
kind,
|
|
135
|
+
description: entry.description,
|
|
136
|
+
inputSchema: entry.inputSchema,
|
|
137
|
+
outputSchema: entry.outputSchema,
|
|
138
|
+
capabilities: [],
|
|
139
|
+
sideEffect: entry.sideEffect
|
|
140
|
+
});
|
|
141
|
+
if (onlySet && !onlySet.has(spec.name)) continue;
|
|
142
|
+
if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const defaultArgs = packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : void 0;
|
|
146
|
+
spec = {
|
|
147
|
+
...spec,
|
|
148
|
+
_meta: {
|
|
149
|
+
...spec._meta,
|
|
150
|
+
sourcePath: entry.sourcePath,
|
|
151
|
+
exportName: entry.exportName,
|
|
152
|
+
shortName: toolName,
|
|
153
|
+
...packageRoot != null && { packageRoot },
|
|
154
|
+
...defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
registry.register(spec);
|
|
158
|
+
registered.push(spec);
|
|
159
|
+
}
|
|
160
|
+
return registered;
|
|
161
|
+
}
|
|
162
|
+
function resolveExtensionPackageRoot(metaUrlOrPath) {
|
|
163
|
+
const dir = metaUrlOrPath.startsWith("file:") ? path6__default.default.dirname(url.fileURLToPath(metaUrlOrPath)) : path6__default.default.resolve(metaUrlOrPath);
|
|
164
|
+
const dist = path6__default.default.join(dir, "dist");
|
|
165
|
+
return fs.existsSync(dist) ? dist : dir;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/api/extension/registerExtension.ts
|
|
169
|
+
function registerExtension(registry, options) {
|
|
170
|
+
const { packagePath, kind: kindOpt, config, getContextRunner, only, namePrefixes } = options;
|
|
171
|
+
const packageRoot = resolveExtensionPackageRoot(packagePath);
|
|
172
|
+
const contextRunner = getContextRunner();
|
|
173
|
+
const loaded = loadExtensionManifest(packagePath);
|
|
174
|
+
const kind = kindOpt ?? loaded.kind ?? "extension";
|
|
175
|
+
registerToolsFromManifest(registry, {
|
|
176
|
+
manifestPathOrDir: packagePath,
|
|
177
|
+
kind,
|
|
178
|
+
only,
|
|
179
|
+
namePrefixes,
|
|
180
|
+
packageRoot
|
|
181
|
+
});
|
|
182
|
+
const adapter = createDynamicImportAdapter({
|
|
183
|
+
kind,
|
|
184
|
+
packageRoot,
|
|
185
|
+
getExtensionContext: (execCtx, spec, mergedArgs) => {
|
|
186
|
+
const defaultArgs = spec._meta?.defaultArgs ?? {};
|
|
187
|
+
const baseConfig = config !== void 0 ? config : {};
|
|
188
|
+
const toolOverrides = baseConfig?.toolOverrides;
|
|
189
|
+
const shortName = spec._meta?.shortName ?? spec.name;
|
|
190
|
+
const prefixWithVersion = shortName && spec.name.endsWith(shortName) && spec.name.length > shortName.length ? spec.name.slice(0, spec.name.length - shortName.length - 1) : "";
|
|
191
|
+
const parts = prefixWithVersion ? prefixWithVersion.split(".") : [];
|
|
192
|
+
const packageScopedKey = parts.length > 1 ? `${parts.slice(0, -1).join(".")}::${shortName}` : "";
|
|
193
|
+
const perTool = toolOverrides?.[spec.name] ?? (packageScopedKey ? toolOverrides?.[packageScopedKey] : void 0) ?? toolOverrides?.[shortName] ?? {};
|
|
194
|
+
const packagePrefix = parts.length > 1 ? parts.slice(0, -1).join(".") : "";
|
|
195
|
+
const packageDefaults = baseConfig?.packageDefaults;
|
|
196
|
+
const packageDefaultsForPkg = (packagePrefix && packageDefaults?.[packagePrefix]) ?? (prefixWithVersion && packageDefaults?.[prefixWithVersion]) ?? {};
|
|
197
|
+
const baseWithoutOverrides = { ...baseConfig };
|
|
198
|
+
delete baseWithoutOverrides.toolOverrides;
|
|
199
|
+
delete baseWithoutOverrides.packageDefaults;
|
|
200
|
+
const resolvedConfig = {
|
|
201
|
+
...defaultArgs,
|
|
202
|
+
...baseWithoutOverrides,
|
|
203
|
+
...packageDefaultsForPkg,
|
|
204
|
+
...perTool,
|
|
205
|
+
...mergedArgs ?? {}
|
|
206
|
+
};
|
|
207
|
+
return { execCtx, config: resolvedConfig };
|
|
208
|
+
},
|
|
209
|
+
contextRunner: {
|
|
210
|
+
runWith(ctx, fn) {
|
|
211
|
+
return contextRunner.runWith(ctx, fn);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
return adapter;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// src/api/extension/createExtension.ts
|
|
219
|
+
function resolvePackagePath(options) {
|
|
220
|
+
if (options.packagePath != null && options.packagePath !== "") return options.packagePath;
|
|
221
|
+
if (options.importMeta?.url) return path6__default.default.dirname(url.fileURLToPath(options.importMeta.url));
|
|
222
|
+
throw new Error("createExtension: provide packagePath or importMeta");
|
|
223
|
+
}
|
|
224
|
+
function createExtension(options) {
|
|
225
|
+
const packagePath = resolvePackagePath(options);
|
|
226
|
+
const kind = options.kind;
|
|
227
|
+
const buildConfig = "buildConfig" in options ? options.buildConfig : void 0;
|
|
228
|
+
const contextRunner = createContextRunner();
|
|
229
|
+
return {
|
|
230
|
+
register(registry, userConfigOrOpts, opts) {
|
|
231
|
+
const config = buildConfig ? buildConfig(userConfigOrOpts) : userConfigOrOpts;
|
|
232
|
+
return registerExtension(registry, {
|
|
233
|
+
packagePath,
|
|
234
|
+
kind,
|
|
235
|
+
config,
|
|
236
|
+
getContextRunner: () => contextRunner,
|
|
237
|
+
only: opts?.only ?? userConfigOrOpts?.only,
|
|
238
|
+
namePrefixes: opts?.namePrefixes ?? userConfigOrOpts?.namePrefixes
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
getContext() {
|
|
242
|
+
return contextRunner.getContext();
|
|
243
|
+
},
|
|
244
|
+
runWith(ctx, fn) {
|
|
245
|
+
return contextRunner.runWith(ctx, fn);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function copyToolYamlRecursive(srcDir, destDir) {
|
|
250
|
+
if (!fs.existsSync(srcDir)) return 0;
|
|
251
|
+
let copied = 0;
|
|
252
|
+
for (const e of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
253
|
+
const srcPath = path6__default.default.join(srcDir, e.name);
|
|
254
|
+
const destPath = path6__default.default.join(destDir, e.name);
|
|
255
|
+
if (e.isFile() && (e.name.endsWith(".tool.yaml") || e.name.endsWith(".example.yaml"))) {
|
|
256
|
+
if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
|
|
257
|
+
fs.copyFileSync(srcPath, destPath);
|
|
258
|
+
copied++;
|
|
259
|
+
} else if (e.isDirectory()) {
|
|
260
|
+
copied += copyToolYamlRecursive(srcPath, destPath);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return copied;
|
|
264
|
+
}
|
|
265
|
+
function generateExtensionManifest(projectRoot = process.cwd(), options = {}) {
|
|
266
|
+
const root = path6__default.default.resolve(projectRoot);
|
|
267
|
+
const outDir = path6__default.default.resolve(options.outDir ?? path6__default.default.join(root, "dist"));
|
|
268
|
+
const kind = options.kind ?? "core";
|
|
269
|
+
const { specs, errors } = chunkJNIWNSCQ_cjs.scanForTools({
|
|
270
|
+
projectPath: root,
|
|
271
|
+
include: options.include ?? ["**/*.ts"],
|
|
272
|
+
tsconfigPath: options.tsconfigPath
|
|
273
|
+
});
|
|
274
|
+
if (errors.length > 0) {
|
|
275
|
+
console.warn("generateExtensionManifest: scan errors", errors);
|
|
276
|
+
}
|
|
277
|
+
const entries = specs.map((spec) => {
|
|
278
|
+
const sourcePathNoExt = (spec.sourcePath ?? "").replace(/\.(ts|tsx)$/i, "");
|
|
279
|
+
const pathBasedName = sourcePathNoExt.replace(/^src\//, "").replace(/\//g, ".");
|
|
280
|
+
const name = spec.exportName ?? pathBasedName;
|
|
281
|
+
const sideEffect = spec._meta?.hitl?.sideEffect ?? "none";
|
|
282
|
+
return {
|
|
283
|
+
name,
|
|
284
|
+
description: spec.description ?? sourcePathNoExt,
|
|
285
|
+
inputSchema: spec.inputSchema ?? { type: "object", additionalProperties: true },
|
|
286
|
+
outputSchema: spec.outputSchema ?? { type: "object", additionalProperties: true },
|
|
287
|
+
sourcePath: sourcePathNoExt,
|
|
288
|
+
exportName: spec.exportName ?? "",
|
|
289
|
+
sideEffect
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });
|
|
293
|
+
const manifestPath = path6__default.default.join(outDir, "core-tools-manifest.json");
|
|
294
|
+
fs.writeFileSync(
|
|
295
|
+
manifestPath,
|
|
296
|
+
JSON.stringify({ kind, tools: entries }, null, 2),
|
|
297
|
+
"utf-8"
|
|
298
|
+
);
|
|
299
|
+
let toolYamlCopied = 0;
|
|
300
|
+
const copyDirs = options.copyToolYamlDirs;
|
|
301
|
+
if (copyDirs?.length) {
|
|
302
|
+
for (const d of copyDirs) {
|
|
303
|
+
const srcDir = path6__default.default.join(root, d);
|
|
304
|
+
const destDir = path6__default.default.join(outDir, d);
|
|
305
|
+
try {
|
|
306
|
+
toolYamlCopied += copyToolYamlRecursive(srcDir, destDir);
|
|
307
|
+
} catch {
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return { manifestPath, toolsCount: entries.length, toolYamlCopied };
|
|
312
|
+
}
|
|
313
|
+
function generateManifest(projectRoot = process.cwd(), options = {}) {
|
|
314
|
+
const { manifestPath, toolsCount, toolYamlCopied } = generateExtensionManifest(projectRoot, {
|
|
315
|
+
include: ["src/**/*.ts"],
|
|
316
|
+
copyToolYamlDirs: ["src"],
|
|
317
|
+
...options
|
|
318
|
+
});
|
|
319
|
+
console.log(`Wrote ${toolsCount} tools to ${path6__default.default.relative(projectRoot, manifestPath)}`);
|
|
320
|
+
if (toolYamlCopied > 0) console.log(`Copied ${toolYamlCopied} .tool.yaml/.example.yaml file(s) to dist`);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// src/api/extension/overrideWithConfig.ts
|
|
324
|
+
function overrideWithConfig(defaults, config) {
|
|
325
|
+
const c = config != null && typeof config === "object" && !Array.isArray(config) ? config : {};
|
|
326
|
+
const out = { ...defaults };
|
|
327
|
+
for (const key of Object.keys(defaults)) {
|
|
328
|
+
if (key in c && c[key] !== void 0) {
|
|
329
|
+
out[key] = c[key];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return out;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// src/api/extension/groupPrefix.ts
|
|
336
|
+
function getGroupNamePrefixes(options) {
|
|
337
|
+
const { groups, only, groupPrefixMap } = options;
|
|
338
|
+
const onlySet = only?.length ? new Set(only) : null;
|
|
339
|
+
const namePrefixes = !onlySet && groups?.length ? groups.map((g) => groupPrefixMap[g]).filter((x) => x != null) : void 0;
|
|
340
|
+
return {
|
|
341
|
+
...onlySet ? { only: Array.from(onlySet) } : {},
|
|
342
|
+
...namePrefixes?.length ? { namePrefixes } : {}
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
exports.createContextRunner = createContextRunner;
|
|
347
|
+
exports.createDynamicImportAdapter = createDynamicImportAdapter;
|
|
348
|
+
exports.createExtension = createExtension;
|
|
349
|
+
exports.generateExtensionManifest = generateExtensionManifest;
|
|
350
|
+
exports.generateManifest = generateManifest;
|
|
351
|
+
exports.getGroupNamePrefixes = getGroupNamePrefixes;
|
|
352
|
+
exports.loadExtensionManifest = loadExtensionManifest;
|
|
353
|
+
exports.loadToolYaml = loadToolYaml;
|
|
354
|
+
exports.overrideWithConfig = overrideWithConfig;
|
|
355
|
+
exports.registerExtension = registerExtension;
|
|
356
|
+
exports.registerToolsFromManifest = registerToolsFromManifest;
|
|
357
|
+
exports.resolveExtensionPackageRoot = resolveExtensionPackageRoot;
|
|
358
|
+
//# sourceMappingURL=chunk-WO4LZKPQ.cjs.map
|
|
359
|
+
//# sourceMappingURL=chunk-WO4LZKPQ.cjs.map
|