@botbotgo/kit 1.0.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/config/build/build.sh +182 -0
- package/config/build/tsconfig.dts.json +34 -0
- package/config/build/tsup.config.ts +19 -0
- package/config/build/vitest.config.ts +29 -0
- package/config/tool.yaml +11 -0
- package/dist/agent-context.d.ts +3 -0
- package/dist/agent-context.d.ts.map +1 -0
- package/dist/api/adapters/LangChainToolsHub.d.ts +35 -0
- package/dist/api/adapters/LangChainToolsHub.d.ts.map +1 -0
- package/dist/api/createAgentTools.d.ts +52 -0
- package/dist/api/createAgentTools.d.ts.map +1 -0
- package/dist/api/expose/extension-init/index.d.ts +3 -0
- package/dist/api/expose/extension-init/index.d.ts.map +1 -0
- package/dist/api/expose/extension-init/initExtension.d.ts +21 -0
- package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
- package/dist/api/expose/index.d.ts +16 -0
- package/dist/api/expose/index.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/build.d.ts +21 -0
- package/dist/api/expose/mcp-build/build.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/generator.d.ts +15 -0
- package/dist/api/expose/mcp-build/generator.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/index.d.ts +8 -0
- package/dist/api/expose/mcp-build/index.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/init.d.ts +17 -0
- package/dist/api/expose/mcp-build/init.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/run.d.ts +17 -0
- package/dist/api/expose/mcp-build/run.d.ts.map +1 -0
- package/dist/api/expose/mcp-build/types.d.ts +25 -0
- package/dist/api/expose/mcp-build/types.d.ts.map +1 -0
- package/dist/api/expose/mcpServer.d.ts +74 -0
- package/dist/api/expose/mcpServer.d.ts.map +1 -0
- package/dist/api/expose/openapi.d.ts +23 -0
- package/dist/api/expose/openapi.d.ts.map +1 -0
- package/dist/api/expose/openapiHttp.d.ts +51 -0
- package/dist/api/expose/openapiHttp.d.ts.map +1 -0
- package/dist/api/extension/contextRunner.d.ts +10 -0
- package/dist/api/extension/contextRunner.d.ts.map +1 -0
- package/dist/api/extension/createExtension.d.ts +38 -0
- package/dist/api/extension/createExtension.d.ts.map +1 -0
- package/dist/api/extension/dynamicImportAdapter.d.ts +25 -0
- package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -0
- package/dist/api/extension/generateExtensionManifest.d.ts +29 -0
- package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -0
- package/dist/api/extension/index.d.ts +23 -0
- package/dist/api/extension/index.d.ts.map +1 -0
- package/dist/api/extension/loadToolYaml.d.ts +7 -0
- package/dist/api/extension/loadToolYaml.d.ts.map +1 -0
- package/dist/api/extension/overrideWithConfig.d.ts +2 -0
- package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
- package/dist/api/extension/registerExtension.d.ts +32 -0
- package/dist/api/extension/registerExtension.d.ts.map +1 -0
- package/dist/api/extension/registerFromManifest.d.ts +43 -0
- package/dist/api/extension/registerFromManifest.d.ts.map +1 -0
- package/dist/api/extension/resolvePackageRoot.d.ts +2 -0
- package/dist/api/extension/resolvePackageRoot.d.ts.map +1 -0
- package/dist/api/extension/support/groupPrefix.d.ts +21 -0
- package/dist/api/extension/support/groupPrefix.d.ts.map +1 -0
- package/dist/api/extension/support/types.d.ts +15 -0
- package/dist/api/extension/support/types.d.ts.map +1 -0
- package/dist/api/register-tools.d.ts +17 -0
- package/dist/api/register-tools.d.ts.map +1 -0
- package/dist/api/resolveAgentSkillRoots.d.ts +7 -0
- package/dist/api/resolveAgentSkillRoots.d.ts.map +1 -0
- package/dist/api/runtimeFromConfig.d.ts +20 -0
- package/dist/api/runtimeFromConfig.d.ts.map +1 -0
- package/dist/api/runtimeFromConfig.helpers.d.ts +12 -0
- package/dist/api/runtimeFromConfig.helpers.d.ts.map +1 -0
- package/dist/api/runtimeFromConfig.types.d.ts +37 -0
- package/dist/api/runtimeFromConfig.types.d.ts.map +1 -0
- package/dist/build.cjs +30 -0
- package/dist/build.cjs.map +1 -0
- package/dist/build.d.ts +13 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +5 -0
- package/dist/build.js.map +1 -0
- package/dist/canonicalCoreSchemas-PHGTNPN5.js +3 -0
- package/dist/canonicalCoreSchemas-PHGTNPN5.js.map +1 -0
- package/dist/canonicalCoreSchemas-TY7NCWCC.cjs +16 -0
- package/dist/canonicalCoreSchemas-TY7NCWCC.cjs.map +1 -0
- package/dist/chunk-4OOTCNR7.js +324 -0
- package/dist/chunk-4OOTCNR7.js.map +1 -0
- package/dist/chunk-AGLGFQUW.cjs +259 -0
- package/dist/chunk-AGLGFQUW.cjs.map +1 -0
- package/dist/chunk-AZUXVVGV.cjs +1073 -0
- package/dist/chunk-AZUXVVGV.cjs.map +1 -0
- package/dist/chunk-BDUSB6GT.js +520 -0
- package/dist/chunk-BDUSB6GT.js.map +1 -0
- package/dist/chunk-BNIE2IKZ.cjs +100 -0
- package/dist/chunk-BNIE2IKZ.cjs.map +1 -0
- package/dist/chunk-BTHDNP3C.cjs +350 -0
- package/dist/chunk-BTHDNP3C.cjs.map +1 -0
- package/dist/chunk-GGFAGLDC.js +1049 -0
- package/dist/chunk-GGFAGLDC.js.map +1 -0
- package/dist/chunk-ITX6A2BT.js +92 -0
- package/dist/chunk-ITX6A2BT.js.map +1 -0
- package/dist/chunk-IVL4TBFB.js +248 -0
- package/dist/chunk-IVL4TBFB.js.map +1 -0
- package/dist/chunk-JW4EMVTE.cjs +553 -0
- package/dist/chunk-JW4EMVTE.cjs.map +1 -0
- package/dist/chunk-LNVK4GO7.cjs +3043 -0
- package/dist/chunk-LNVK4GO7.cjs.map +1 -0
- package/dist/chunk-NTWOVFEY.js +16 -0
- package/dist/chunk-NTWOVFEY.js.map +1 -0
- package/dist/chunk-P5XFA3MW.js +3013 -0
- package/dist/chunk-P5XFA3MW.js.map +1 -0
- package/dist/chunk-UUNG3GL3.cjs +19 -0
- package/dist/chunk-UUNG3GL3.cjs.map +1 -0
- package/dist/core/registry/ToolRegistry.d.ts +68 -0
- package/dist/core/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/core/runtime/Budget.d.ts +63 -0
- package/dist/core/runtime/Budget.d.ts.map +1 -0
- package/dist/core/runtime/Evidence.d.ts +19 -0
- package/dist/core/runtime/Evidence.d.ts.map +1 -0
- package/dist/core/runtime/PTCRuntime.d.ts +124 -0
- package/dist/core/runtime/PTCRuntime.d.ts.map +1 -0
- package/dist/core/runtime/PTCRuntimeObservability.d.ts +26 -0
- package/dist/core/runtime/PTCRuntimeObservability.d.ts.map +1 -0
- package/dist/core/runtime/PTCRuntimePipeline.d.ts +69 -0
- package/dist/core/runtime/PTCRuntimePipeline.d.ts.map +1 -0
- package/dist/core/runtime/PolicyEngine.d.ts +67 -0
- package/dist/core/runtime/PolicyEngine.d.ts.map +1 -0
- package/dist/core/runtime/Retry.d.ts +33 -0
- package/dist/core/runtime/Retry.d.ts.map +1 -0
- package/dist/core/runtime/SchemaValidator.d.ts +42 -0
- package/dist/core/runtime/SchemaValidator.d.ts.map +1 -0
- package/dist/core/runtime/toolObservation.d.ts +7 -0
- package/dist/core/runtime/toolObservation.d.ts.map +1 -0
- package/dist/core/types/Events.d.ts +99 -0
- package/dist/core/types/Events.d.ts.map +1 -0
- package/dist/core/types/ToolIntent.d.ts +40 -0
- package/dist/core/types/ToolIntent.d.ts.map +1 -0
- package/dist/core/types/ToolResult.d.ts +44 -0
- package/dist/core/types/ToolResult.d.ts.map +1 -0
- package/dist/core/types/ToolSpec.d.ts +116 -0
- package/dist/core/types/ToolSpec.d.ts.map +1 -0
- package/dist/core/types/ToolTypeHandler.d.ts +88 -0
- package/dist/core/types/ToolTypeHandler.d.ts.map +1 -0
- package/dist/core/types/index.d.ts +7 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/index.cjs +399 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +394 -0
- package/dist/index.js.map +1 -0
- package/dist/observability/EventLog.d.ts +60 -0
- package/dist/observability/EventLog.d.ts.map +1 -0
- package/dist/observability/Logger.d.ts +33 -0
- package/dist/observability/Logger.d.ts.map +1 -0
- package/dist/observability/Metrics.d.ts +70 -0
- package/dist/observability/Metrics.d.ts.map +1 -0
- package/dist/observability/Tracing.d.ts +69 -0
- package/dist/observability/Tracing.d.ts.map +1 -0
- package/dist/sdk.cjs +493 -0
- package/dist/sdk.cjs.map +1 -0
- package/dist/sdk.d.ts +17 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +443 -0
- package/dist/sdk.js.map +1 -0
- package/dist/security/sandbox.d.ts +10 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/ssrf.d.ts +24 -0
- package/dist/security/ssrf.d.ts.map +1 -0
- package/dist/templates/mcp-server.js +48 -0
- package/dist/templates/n8n-invoker.js +11 -0
- package/dist/templates/skill-invoker.js +11 -0
- package/dist/templates/tool-index.js +9 -0
- package/dist/tools/discoveryFactory.d.ts +117 -0
- package/dist/tools/discoveryFactory.d.ts.map +1 -0
- package/dist/tools/function/index.d.ts +10 -0
- package/dist/tools/function/index.d.ts.map +1 -0
- package/dist/tools/function/scanner.d.ts +29 -0
- package/dist/tools/function/scanner.d.ts.map +1 -0
- package/dist/tools/function/schemaFromTs.d.ts +16 -0
- package/dist/tools/function/schemaFromTs.d.ts.map +1 -0
- package/dist/tools/function/types.d.ts +20 -0
- package/dist/tools/function/types.d.ts.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/langchain/LangChainLoader.d.ts +7 -0
- package/dist/tools/langchain/LangChainLoader.d.ts.map +1 -0
- package/dist/tools/langchain/directoryApply.d.ts +5 -0
- package/dist/tools/langchain/directoryApply.d.ts.map +1 -0
- package/dist/tools/langchain/directoryLoad.d.ts +13 -0
- package/dist/tools/langchain/directoryLoad.d.ts.map +1 -0
- package/dist/tools/langchain/index.d.ts +3 -0
- package/dist/tools/langchain/index.d.ts.map +1 -0
- package/dist/tools/langchain/scanner.d.ts +8 -0
- package/dist/tools/langchain/scanner.d.ts.map +1 -0
- package/dist/tools/langchain/types.d.ts +5 -0
- package/dist/tools/langchain/types.d.ts.map +1 -0
- package/dist/tools/mcp/MCPClientAdapter.d.ts +34 -0
- package/dist/tools/mcp/MCPClientAdapter.d.ts.map +1 -0
- package/dist/tools/mcp/MCPLoader.d.ts +8 -0
- package/dist/tools/mcp/MCPLoader.d.ts.map +1 -0
- package/dist/tools/mcp/MCPProcessManager.d.ts +29 -0
- package/dist/tools/mcp/MCPProcessManager.d.ts.map +1 -0
- package/dist/tools/mcp/connectMCP.d.ts +47 -0
- package/dist/tools/mcp/connectMCP.d.ts.map +1 -0
- package/dist/tools/mcp/directoryApply.d.ts +10 -0
- package/dist/tools/mcp/directoryApply.d.ts.map +1 -0
- package/dist/tools/mcp/index.d.ts +16 -0
- package/dist/tools/mcp/index.d.ts.map +1 -0
- package/dist/tools/mcp/mcpSpecToToolSpec.d.ts +8 -0
- package/dist/tools/mcp/mcpSpecToToolSpec.d.ts.map +1 -0
- package/dist/tools/mcp/registerMCPTools.d.ts +24 -0
- package/dist/tools/mcp/registerMCPTools.d.ts.map +1 -0
- package/dist/tools/mcp/scanner.d.ts +8 -0
- package/dist/tools/mcp/scanner.d.ts.map +1 -0
- package/dist/tools/mcp/support/types.d.ts +3 -0
- package/dist/tools/mcp/support/types.d.ts.map +1 -0
- package/dist/tools/n8n/N8nLoader.d.ts +25 -0
- package/dist/tools/n8n/N8nLoader.d.ts.map +1 -0
- package/dist/tools/n8n/directoryApply.d.ts +10 -0
- package/dist/tools/n8n/directoryApply.d.ts.map +1 -0
- package/dist/tools/n8n/index.d.ts +6 -0
- package/dist/tools/n8n/index.d.ts.map +1 -0
- package/dist/tools/n8n/scanN8n.d.ts +20 -0
- package/dist/tools/n8n/scanN8n.d.ts.map +1 -0
- package/dist/tools/n8n/types.d.ts +18 -0
- package/dist/tools/n8n/types.d.ts.map +1 -0
- package/dist/tools/scanPackage.d.ts +42 -0
- package/dist/tools/scanPackage.d.ts.map +1 -0
- package/dist/tools/skill/SkillLoader.d.ts +20 -0
- package/dist/tools/skill/SkillLoader.d.ts.map +1 -0
- package/dist/tools/skill/SkillManifest.d.ts +79 -0
- package/dist/tools/skill/SkillManifest.d.ts.map +1 -0
- package/dist/tools/skill/SkillMdParser.d.ts +31 -0
- package/dist/tools/skill/SkillMdParser.d.ts.map +1 -0
- package/dist/tools/skill/directoryApply.d.ts +10 -0
- package/dist/tools/skill/directoryApply.d.ts.map +1 -0
- package/dist/tools/skill/index.d.ts +8 -0
- package/dist/tools/skill/index.d.ts.map +1 -0
- package/dist/tools/skill/scanSkill.d.ts +20 -0
- package/dist/tools/skill/scanSkill.d.ts.map +1 -0
- package/dist/tools/skill/types.d.ts +19 -0
- package/dist/tools/skill/types.d.ts.map +1 -0
- package/dist/tools/util/canonicalCoreSchemas.d.ts +15 -0
- package/dist/tools/util/canonicalCoreSchemas.d.ts.map +1 -0
- package/dist/tools/util/index.d.ts +13 -0
- package/dist/tools/util/index.d.ts.map +1 -0
- package/dist/tools/util/resolveEntry.d.ts +6 -0
- package/dist/tools/util/resolveEntry.d.ts.map +1 -0
- package/dist/tools/util/scanUtil.d.ts +9 -0
- package/dist/tools/util/scanUtil.d.ts.map +1 -0
- package/dist/tools/util/toolConfig.d.ts +38 -0
- package/dist/tools/util/toolConfig.d.ts.map +1 -0
- package/dist/tools/util/toolDescriptor.d.ts +117 -0
- package/dist/tools/util/toolDescriptor.d.ts.map +1 -0
- 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 +700 -0
- package/dist/utils/cli/index.cjs.map +1 -0
- package/dist/utils/cli/index.d.ts +9 -0
- package/dist/utils/cli/index.d.ts.map +1 -0
- package/dist/utils/cli/index.js +677 -0
- package/dist/utils/cli/index.js.map +1 -0
- package/dist/utils/cli/toolRuntime.d.ts +19 -0
- package/dist/utils/cli/toolRuntime.d.ts.map +1 -0
- package/dist/utils/log.d.ts +2 -0
- package/dist/utils/log.d.ts.map +1 -0
- package/dist/utils/npmCache.d.ts +11 -0
- package/dist/utils/npmCache.d.ts.map +1 -0
- package/dist/utils/npmVersion.d.ts +10 -0
- package/dist/utils/npmVersion.d.ts.map +1 -0
- package/dist/utils/overrideWithConfig.d.ts +2 -0
- package/dist/utils/overrideWithConfig.d.ts.map +1 -0
- package/package.json +125 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import './chunk-ITX6A2BT.js';
|
|
2
|
+
import { loadToolConfig, getPathSourceDescriptors, createRuntimeFromConfig, isBarePackageDescriptor, expandToolDescriptorsToRegistryNames, resolveSandboxedPath, toToolObservationText, parseNpmDescriptor, resolveLatestVersionFromRegistry, getCacheBaseFromToolConfig, ensurePackageInCache, parseToolPath, npmDescriptorToPackagePrefix, fileDescriptorToPackagePrefix } from './chunk-P5XFA3MW.js';
|
|
3
|
+
import { LANGCHAIN_KIND } from './chunk-GGFAGLDC.js';
|
|
4
|
+
import './chunk-IVL4TBFB.js';
|
|
5
|
+
import './chunk-BDUSB6GT.js';
|
|
6
|
+
import { enrichSpecWithCanonicalSchema } from './chunk-NTWOVFEY.js';
|
|
7
|
+
import { AgentContextTokens, createAgentContext } from '@botbotgo/common';
|
|
8
|
+
import { deepMerge, stripNullishObjectFields } from '@botbotgo/common/utils';
|
|
9
|
+
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { dirname, resolve, isAbsolute, join } from 'path';
|
|
12
|
+
import { existsSync, statSync, readFileSync } from 'fs';
|
|
13
|
+
import { createRequire } from 'module';
|
|
14
|
+
|
|
15
|
+
function getArgsSchemaIfWrapped(inputSchema) {
|
|
16
|
+
const s = inputSchema;
|
|
17
|
+
if (s?.type !== "object" || !s.properties || typeof s.properties !== "object") return null;
|
|
18
|
+
const args = s.properties.args;
|
|
19
|
+
if (args != null && typeof args === "object" && args.type === "object" && args.properties != null) {
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function hasArgsWrapper(inputSchema) {
|
|
25
|
+
return getArgsSchemaIfWrapped(inputSchema) !== null;
|
|
26
|
+
}
|
|
27
|
+
function schemaForLangChain(inputSchema) {
|
|
28
|
+
const wrapped = getArgsSchemaIfWrapped(inputSchema);
|
|
29
|
+
if (wrapped !== null) return wrapped;
|
|
30
|
+
return inputSchema;
|
|
31
|
+
}
|
|
32
|
+
function buildIntent(toolName, inputSchema, args) {
|
|
33
|
+
return {
|
|
34
|
+
tool: toolName,
|
|
35
|
+
args: hasArgsWrapper(inputSchema) ? { args } : args,
|
|
36
|
+
purpose: LANGCHAIN_KIND
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function normalizeArgs(args) {
|
|
40
|
+
return stripNullishObjectFields(args ?? {});
|
|
41
|
+
}
|
|
42
|
+
var DEFAULT_CTX_FACTORY = () => ({
|
|
43
|
+
requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
44
|
+
taskId: `task-${Date.now()}`,
|
|
45
|
+
permissions: [
|
|
46
|
+
"read:web",
|
|
47
|
+
"read:fs",
|
|
48
|
+
"write:fs",
|
|
49
|
+
"read:db",
|
|
50
|
+
"write:db",
|
|
51
|
+
"network",
|
|
52
|
+
"workflow",
|
|
53
|
+
"danger:destructive"
|
|
54
|
+
]
|
|
55
|
+
});
|
|
56
|
+
var LangChainToolsHub = class {
|
|
57
|
+
constructor(runtime, ctxFactory = DEFAULT_CTX_FACTORY) {
|
|
58
|
+
this.runtime = runtime;
|
|
59
|
+
this.ctxFactory = ctxFactory;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns all registered tools as LangChain StructuredTool[].
|
|
63
|
+
* Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).
|
|
64
|
+
*/
|
|
65
|
+
getLangChainTools() {
|
|
66
|
+
const registry = this.runtime.getRegistry();
|
|
67
|
+
const specs = registry.snapshot();
|
|
68
|
+
const modelToolNames = this.buildModelToolNames(specs);
|
|
69
|
+
return specs.map((spec) => this.specToLangChainTool(spec, modelToolNames.get(spec.name) ?? spec.name));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns LangChain tools for a subset of tools (by name or query).
|
|
73
|
+
*/
|
|
74
|
+
getLangChainToolsForNames(toolNames) {
|
|
75
|
+
const registry = this.runtime.getRegistry();
|
|
76
|
+
const set = new Set(toolNames);
|
|
77
|
+
const specs = registry.snapshot().filter((s) => set.has(s.name));
|
|
78
|
+
const modelToolNames = this.buildModelToolNames(specs);
|
|
79
|
+
return specs.map((spec) => this.specToLangChainTool(spec, modelToolNames.get(spec.name) ?? spec.name));
|
|
80
|
+
}
|
|
81
|
+
buildModelToolNames(specs) {
|
|
82
|
+
const preferred = specs.map((spec) => {
|
|
83
|
+
const shortName = spec._meta?.shortName;
|
|
84
|
+
return {
|
|
85
|
+
spec,
|
|
86
|
+
preferredName: typeof shortName === "string" && shortName.trim().length > 0 ? shortName.trim() : spec.name
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
const counts = /* @__PURE__ */ new Map();
|
|
90
|
+
for (const item of preferred) {
|
|
91
|
+
counts.set(item.preferredName, (counts.get(item.preferredName) ?? 0) + 1);
|
|
92
|
+
}
|
|
93
|
+
return new Map(
|
|
94
|
+
preferred.map(({ spec, preferredName }) => [
|
|
95
|
+
spec.name,
|
|
96
|
+
(counts.get(preferredName) ?? 0) === 1 ? preferredName : spec.name
|
|
97
|
+
])
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
specToLangChainTool(spec, modelToolName) {
|
|
101
|
+
const runtime = this.runtime;
|
|
102
|
+
const ctxFactory = this.ctxFactory;
|
|
103
|
+
const enriched = enrichSpecWithCanonicalSchema(spec);
|
|
104
|
+
const schema = schemaForLangChain(enriched.inputSchema);
|
|
105
|
+
return new DynamicStructuredTool({
|
|
106
|
+
name: modelToolName,
|
|
107
|
+
description: spec.description ?? `Tool: ${modelToolName}`,
|
|
108
|
+
schema,
|
|
109
|
+
func: async (args) => {
|
|
110
|
+
const normalizedArgs = normalizeArgs(args);
|
|
111
|
+
const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);
|
|
112
|
+
const ctx = ctxFactory();
|
|
113
|
+
const result = await runtime.invoke(intent, ctx);
|
|
114
|
+
return toToolObservationText(result, { includeFeedbackMarker: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var DEFAULT_CONTEXT_KEY = "__botbotgo_agent_default_context__";
|
|
120
|
+
function isAgentContext(value) {
|
|
121
|
+
return typeof value === "object" && value !== null && typeof value.get === "function" && typeof value.set === "function" && typeof value.has === "function";
|
|
122
|
+
}
|
|
123
|
+
function getDefaultAgentContext() {
|
|
124
|
+
const store = globalThis;
|
|
125
|
+
const existing = store[DEFAULT_CONTEXT_KEY];
|
|
126
|
+
if (isAgentContext(existing)) return existing;
|
|
127
|
+
const created = createAgentContext();
|
|
128
|
+
store[DEFAULT_CONTEXT_KEY] = created;
|
|
129
|
+
return created;
|
|
130
|
+
}
|
|
131
|
+
function renderModelText(output) {
|
|
132
|
+
if (typeof output === "string") return output;
|
|
133
|
+
if (output && typeof output === "object") {
|
|
134
|
+
const content = output.content;
|
|
135
|
+
if (typeof content === "string") return content;
|
|
136
|
+
if (Array.isArray(content)) {
|
|
137
|
+
return content.map((part) => {
|
|
138
|
+
if (typeof part === "string") return part;
|
|
139
|
+
if (part && typeof part === "object" && typeof part.text === "string") {
|
|
140
|
+
return String(part.text);
|
|
141
|
+
}
|
|
142
|
+
return "";
|
|
143
|
+
}).join("").trim();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return String(output ?? "");
|
|
147
|
+
}
|
|
148
|
+
function createDefaultModelHubFromAgentContext() {
|
|
149
|
+
const ctx = getDefaultAgentContext();
|
|
150
|
+
const chatModel = ctx.tryGet(AgentContextTokens.ChatModel);
|
|
151
|
+
const embedModel = ctx.tryGet(AgentContextTokens.EmbedModel);
|
|
152
|
+
if (!chatModel && !embedModel) return void 0;
|
|
153
|
+
return {
|
|
154
|
+
async chat({ prompt, model }) {
|
|
155
|
+
if (!chatModel) throw new Error("Tool modelHub.chat requested but AgentContext ChatModel is not registered");
|
|
156
|
+
const output = await chatModel.invoke(prompt);
|
|
157
|
+
return {
|
|
158
|
+
text: renderModelText(output),
|
|
159
|
+
...model ? { model } : {}
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
async embed({ input, model }) {
|
|
163
|
+
if (!embedModel) throw new Error("Tool modelHub.embed requested but AgentContext EmbedModel is not registered");
|
|
164
|
+
const vectors = Array.isArray(input) ? await embedModel.embedDocuments?.(input) : [await embedModel.embedQuery?.(input)];
|
|
165
|
+
const normalized = Array.isArray(vectors) ? vectors.filter((item) => Array.isArray(item)) : [];
|
|
166
|
+
return {
|
|
167
|
+
vectors: normalized,
|
|
168
|
+
...model ? { model } : {}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function withDefaultToolServices(opts) {
|
|
174
|
+
const existingCoreTools = opts.coreTools ?? {};
|
|
175
|
+
const existingServices = existingCoreTools.services ?? {};
|
|
176
|
+
if ("modelHub" in existingServices && existingServices.modelHub != null) {
|
|
177
|
+
return opts;
|
|
178
|
+
}
|
|
179
|
+
const modelHub = createDefaultModelHubFromAgentContext();
|
|
180
|
+
if (!modelHub) return opts;
|
|
181
|
+
return {
|
|
182
|
+
...opts,
|
|
183
|
+
coreTools: {
|
|
184
|
+
...existingCoreTools,
|
|
185
|
+
services: {
|
|
186
|
+
...existingServices,
|
|
187
|
+
modelHub
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function mergeHostLists(a, b) {
|
|
193
|
+
const seen = /* @__PURE__ */ new Set();
|
|
194
|
+
const out = [];
|
|
195
|
+
for (const list of [a ?? [], b ?? []]) {
|
|
196
|
+
for (const h of list) {
|
|
197
|
+
if (!seen.has(h)) {
|
|
198
|
+
seen.add(h);
|
|
199
|
+
out.push(h);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
function resolveEmbeddedToolConfigPath() {
|
|
206
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
207
|
+
const candidates = [
|
|
208
|
+
resolve(moduleDir, "../../config/tool.yaml"),
|
|
209
|
+
// src/api -> config
|
|
210
|
+
resolve(moduleDir, "../config/tool.yaml"),
|
|
211
|
+
// dist/* -> config
|
|
212
|
+
resolve(process.cwd(), "config/tool.yaml")
|
|
213
|
+
// fallback for local app runtime
|
|
214
|
+
];
|
|
215
|
+
for (const candidate of candidates) {
|
|
216
|
+
if (existsSync(candidate)) return candidate;
|
|
217
|
+
}
|
|
218
|
+
return candidates[0];
|
|
219
|
+
}
|
|
220
|
+
var EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();
|
|
221
|
+
function loadMergedToolConfig(overridePath) {
|
|
222
|
+
const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);
|
|
223
|
+
if (!overridePath) return baseConfig;
|
|
224
|
+
const overrideConfig = loadToolConfig(overridePath);
|
|
225
|
+
return deepMerge({}, baseConfig, overrideConfig);
|
|
226
|
+
}
|
|
227
|
+
function flattenSourceGroupedToolConfig(sources) {
|
|
228
|
+
const flat = {};
|
|
229
|
+
for (const [descriptor, toolMap] of Object.entries(sources ?? {})) {
|
|
230
|
+
if (descriptor === "self") {
|
|
231
|
+
for (const [toolName, toolConfig] of Object.entries(toolMap)) {
|
|
232
|
+
flat[toolName] = toolConfig;
|
|
233
|
+
}
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const packagePrefix = descriptor.startsWith("npm:") ? npmDescriptorToPackagePrefix(descriptor) : descriptor.startsWith("file:") ? fileDescriptorToPackagePrefix(descriptor) : "";
|
|
237
|
+
for (const [toolName, toolConfig] of Object.entries(toolMap)) {
|
|
238
|
+
flat[packagePrefix ? `${packagePrefix}::${toolName}` : toolName] = toolConfig;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return flat;
|
|
242
|
+
}
|
|
243
|
+
function buildConfiguredToolSelections(toolConfig) {
|
|
244
|
+
return getPathSourceDescriptors(toolConfig);
|
|
245
|
+
}
|
|
246
|
+
function runtimeOptionsFromConfig(opts, toolConfig, configPathForResolve, extensionEmbeddedDefaults) {
|
|
247
|
+
const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };
|
|
248
|
+
{
|
|
249
|
+
const updates = {};
|
|
250
|
+
if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
|
|
251
|
+
updates.sandboxRoot = resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);
|
|
252
|
+
}
|
|
253
|
+
if (typeof toolConfig.enableSandboxValidation === "boolean") {
|
|
254
|
+
updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
|
|
255
|
+
} else if (coreTools.enableSandboxValidation == null) {
|
|
256
|
+
updates.enableSandboxValidation = false;
|
|
257
|
+
}
|
|
258
|
+
updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);
|
|
259
|
+
updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);
|
|
260
|
+
if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {
|
|
261
|
+
updates.blockedCidrs = toolConfig.blockedCidrs;
|
|
262
|
+
} else if (coreTools.blockedCidrs?.length) {
|
|
263
|
+
updates.blockedCidrs = coreTools.blockedCidrs;
|
|
264
|
+
}
|
|
265
|
+
let hasToolDefaults = false;
|
|
266
|
+
const flatOverrides = {
|
|
267
|
+
...extensionEmbeddedDefaults,
|
|
268
|
+
...coreTools.toolOverrides
|
|
269
|
+
};
|
|
270
|
+
if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;
|
|
271
|
+
const configuredToolOverrides = flattenSourceGroupedToolConfig(toolConfig.tools);
|
|
272
|
+
if (Object.keys(configuredToolOverrides).length > 0) {
|
|
273
|
+
Object.assign(flatOverrides, configuredToolOverrides);
|
|
274
|
+
hasToolDefaults = true;
|
|
275
|
+
}
|
|
276
|
+
if (hasToolDefaults) {
|
|
277
|
+
updates.toolOverrides = flatOverrides;
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };
|
|
280
|
+
}
|
|
281
|
+
return { ...opts, coreTools };
|
|
282
|
+
}
|
|
283
|
+
async function createLangChainAgentToolsAsync(options) {
|
|
284
|
+
const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
|
|
285
|
+
const configPathForResolve = opts.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;
|
|
286
|
+
const mergedToolConfig = loadMergedToolConfig(opts.configFilePath);
|
|
287
|
+
const runtimeOpts = runtimeOptionsFromConfig(
|
|
288
|
+
withDefaultToolServices(opts),
|
|
289
|
+
mergedToolConfig,
|
|
290
|
+
configPathForResolve,
|
|
291
|
+
{}
|
|
292
|
+
);
|
|
293
|
+
const { runtime } = await createRuntimeFromConfig(runtimeOpts);
|
|
294
|
+
const hub = new LangChainToolsHub(runtime);
|
|
295
|
+
const names = buildConfiguredToolSelections(mergedToolConfig);
|
|
296
|
+
if (names.length > 0) {
|
|
297
|
+
const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
|
|
298
|
+
const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));
|
|
299
|
+
if (allBarePackages) return hub.getLangChainTools();
|
|
300
|
+
return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));
|
|
301
|
+
}
|
|
302
|
+
return hub.getLangChainTools();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/api/register-tools.ts
|
|
306
|
+
async function createAgentTools(configPathOrOptions) {
|
|
307
|
+
const options = typeof configPathOrOptions === "string" ? { configFilePath: configPathOrOptions } : configPathOrOptions;
|
|
308
|
+
const tools = await createLangChainAgentToolsAsync(options);
|
|
309
|
+
getDefaultAgentContext().set(AgentContextTokens.Tools, tools);
|
|
310
|
+
return tools;
|
|
311
|
+
}
|
|
312
|
+
function resolveSkillDirectory(root, skillPath) {
|
|
313
|
+
const candidate = resolve(root, skillPath);
|
|
314
|
+
if (!existsSync(candidate) || !statSync(candidate).isDirectory()) return null;
|
|
315
|
+
return candidate;
|
|
316
|
+
}
|
|
317
|
+
function getInstalledPackageVersionFromRequire(packageName, req) {
|
|
318
|
+
try {
|
|
319
|
+
const pkgJsonPath = req.resolve(`${packageName}/package.json`);
|
|
320
|
+
const json = readFileSync(pkgJsonPath, "utf-8");
|
|
321
|
+
const pkg = JSON.parse(json);
|
|
322
|
+
return pkg.version ?? null;
|
|
323
|
+
} catch {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function resolveFileDescriptorRoot(descriptor, configFilePath) {
|
|
328
|
+
const parsed = parseToolPath(descriptor.trim());
|
|
329
|
+
if (!parsed || parsed.protocol !== "file") return null;
|
|
330
|
+
const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
|
|
331
|
+
const configDir = dirname(localPath);
|
|
332
|
+
const pathPart = `${parsed.scope}/${parsed.packageWithVersion}`;
|
|
333
|
+
const resolvedPath = resolve(configDir, pathPart);
|
|
334
|
+
if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;
|
|
335
|
+
return resolvedPath;
|
|
336
|
+
}
|
|
337
|
+
function resolveNpmDescriptorRoot(descriptor, configFilePath) {
|
|
338
|
+
const parsed = parseNpmDescriptor(descriptor.trim());
|
|
339
|
+
if (!parsed) return null;
|
|
340
|
+
const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
|
|
341
|
+
const configDir = dirname(localPath);
|
|
342
|
+
const packageJsonPath = (() => {
|
|
343
|
+
let dir = resolve(configDir);
|
|
344
|
+
while (true) {
|
|
345
|
+
const pkg = join(dir, "package.json");
|
|
346
|
+
if (existsSync(pkg)) return pkg;
|
|
347
|
+
const parent = dirname(dir);
|
|
348
|
+
if (parent === dir) return null;
|
|
349
|
+
dir = parent;
|
|
350
|
+
}
|
|
351
|
+
})();
|
|
352
|
+
const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;
|
|
353
|
+
const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;
|
|
354
|
+
if (configRequire) {
|
|
355
|
+
try {
|
|
356
|
+
const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
|
|
357
|
+
const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
|
|
358
|
+
const resolvedVersion = requested ?? installed ?? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd });
|
|
359
|
+
if (installed === resolvedVersion) {
|
|
360
|
+
return dirname(configRequire.resolve(`${parsed.packageName}/package.json`));
|
|
361
|
+
}
|
|
362
|
+
} catch {
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
const cacheBase = getCacheBaseFromToolConfig(localPath);
|
|
366
|
+
const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];
|
|
367
|
+
for (const opts of cacheOptions) {
|
|
368
|
+
try {
|
|
369
|
+
const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
|
|
370
|
+
return cacheDir;
|
|
371
|
+
} catch {
|
|
372
|
+
if (cacheBase && "cacheBase" in opts) continue;
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
function resolveDescriptorRoot(descriptor, configFilePath) {
|
|
379
|
+
if (descriptor.startsWith("npm:")) return resolveNpmDescriptorRoot(descriptor, configFilePath);
|
|
380
|
+
if (descriptor.startsWith("file:")) return resolveFileDescriptorRoot(descriptor, configFilePath);
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
function resolveAgentSkillRoots(options) {
|
|
384
|
+
const config = loadToolConfig(options.configFilePath);
|
|
385
|
+
const skillPath = options.skillPath ?? config.skillPath ?? "skills";
|
|
386
|
+
const descriptors = getPathSourceDescriptors(config);
|
|
387
|
+
const roots = descriptors.map((descriptor) => resolveDescriptorRoot(descriptor, options.configFilePath)).filter((value) => typeof value === "string").map((root) => resolveSkillDirectory(root, skillPath)).filter((value) => typeof value === "string");
|
|
388
|
+
return [...new Set(roots)];
|
|
389
|
+
}
|
|
390
|
+
var resolveAgentSkillRootsFromToolConfig = resolveAgentSkillRoots;
|
|
391
|
+
|
|
392
|
+
export { createAgentTools, resolveAgentSkillRoots, resolveAgentSkillRootsFromToolConfig };
|
|
393
|
+
//# sourceMappingURL=index.js.map
|
|
394
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/agent-context.ts","../src/api/createAgentTools.ts","../src/api/register-tools.ts","../src/api/resolveAgentSkillRoots.ts"],"names":["AgentContextTokens","resolve","existsSync","dirname"],"mappings":"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","file":"index.js","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() from @botbotgo/kit, which loads from tool.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 \"@botbotgo/common/utils\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.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\";\nimport { toToolObservationText } from \"../../core/runtime/toolObservation.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\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 const modelToolNames = this.buildModelToolNames(specs);\n return specs.map((spec) => this.specToLangChainTool(spec, modelToolNames.get(spec.name) ?? spec.name));\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 const modelToolNames = this.buildModelToolNames(specs);\n return specs.map((spec) => this.specToLangChainTool(spec, modelToolNames.get(spec.name) ?? spec.name));\n }\n\n private buildModelToolNames(specs: ToolSpec[]): Map<string, string> {\n const preferred = specs.map((spec) => {\n const shortName = (spec._meta as { shortName?: string } | undefined)?.shortName;\n return {\n spec,\n preferredName: typeof shortName === \"string\" && shortName.trim().length > 0\n ? shortName.trim()\n : spec.name,\n };\n });\n const counts = new Map<string, number>();\n for (const item of preferred) {\n counts.set(item.preferredName, (counts.get(item.preferredName) ?? 0) + 1);\n }\n return new Map(\n preferred.map(({ spec, preferredName }) => [\n spec.name,\n (counts.get(preferredName) ?? 0) === 1 ? preferredName : spec.name,\n ]),\n );\n }\n\n private specToLangChainTool(spec: ToolSpec, modelToolName: string): 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: modelToolName,\n description: spec.description ?? `Tool: ${modelToolName}`,\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 toToolObservationText(result, { includeFeedbackMarker: true });\n },\n });\n }\n}\n","import { createAgentContext, type AgentContext } from \"@botbotgo/common\";\n\nconst DEFAULT_CONTEXT_KEY = \"__botbotgo_agent_default_context__\";\n\nfunction isAgentContext(value: unknown): value is AgentContext {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as AgentContext).get === \"function\" &&\n typeof (value as AgentContext).set === \"function\" &&\n typeof (value as AgentContext).has === \"function\"\n );\n}\n\nexport function getDefaultAgentContext(): AgentContext {\n const store = globalThis as Record<string, unknown>;\n const existing = store[DEFAULT_CONTEXT_KEY];\n if (isAgentContext(existing)) return existing;\n\n const created = createAgentContext();\n store[DEFAULT_CONTEXT_KEY] = created;\n return created;\n}\n","/**\n * Standalone tool creation functions. Each function:\n * - Uses the embedded config/tool.yaml as the default base.\n * - If a configFilePath is provided, merges it on top of the default.\n * - If no options are provided at all, behaves as if only the embedded default is used.\n *\n * Public module API uses createAgentTools() in register-tools.ts.\n * This file keeps internal builders for LangChain / MCP / OpenAPI outputs.\n */\n\nimport { loadToolConfig, resolveSandboxedPath, getPathSourceDescriptors } from \"../tools/util/toolConfig.js\";\nimport type { ToolYamlShape } from \"../tools/util/toolConfig.js\";\nimport { loadExtensionManifest } from \"./extension/registerFromManifest.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n fileDescriptorToPackagePrefix,\n npmDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { deepMerge } from \"@botbotgo/common/utils\";\nimport { createRuntimeFromConfigSync, loadAllExtensionsFromToolYamlSync } from \"./runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions, LoadedExtension } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport { createMCPServer, type MCPServerOptions, type McpServer } from \"./expose/mcpServer.js\";\nimport {\n createOpenAPIHttpServer,\n type OpenAPIExpressApp,\n type OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { getDefaultAgentContext } from \"../agent-context.js\";\nimport { AgentContextTokens } from \"@botbotgo/common\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to an override tool.yaml; its values are merged on top of the embedded default config/tool.yaml */\n configFilePath?: string;\n}\n\ntype ChatModelLike = { invoke: (input: unknown) => Promise<unknown> };\ntype EmbeddingModelLike = {\n embedDocuments?: (texts: string[]) => Promise<number[][]>;\n embedQuery?: (text: string) => Promise<number[]>;\n};\n\nfunction renderModelText(output: unknown): string {\n if (typeof output === \"string\") return output;\n if (output && typeof output === \"object\") {\n const content = (output as { content?: unknown }).content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (part && typeof part === \"object\" && typeof (part as { text?: unknown }).text === \"string\") {\n return String((part as { text: string }).text);\n }\n return \"\";\n })\n .join(\"\")\n .trim();\n }\n }\n return String(output ?? \"\");\n}\n\nfunction createDefaultModelHubFromAgentContext():\n | {\n chat: (input: { prompt: string; model?: string }) => Promise<{ text: string; model?: string }>;\n embed: (input: { input: string | string[]; model?: string }) => Promise<{ vectors: number[][]; model?: string }>;\n }\n | undefined {\n const ctx = getDefaultAgentContext();\n const chatModel = ctx.tryGet<ChatModelLike>(AgentContextTokens.ChatModel);\n const embedModel = ctx.tryGet<EmbeddingModelLike>(AgentContextTokens.EmbedModel);\n if (!chatModel && !embedModel) return undefined;\n\n return {\n async chat({ prompt, model }) {\n if (!chatModel) throw new Error(\"Tool modelHub.chat requested but AgentContext ChatModel is not registered\");\n const output = await chatModel.invoke(prompt);\n return {\n text: renderModelText(output),\n ...(model ? { model } : {}),\n };\n },\n async embed({ input, model }) {\n if (!embedModel) throw new Error(\"Tool modelHub.embed requested but AgentContext EmbedModel is not registered\");\n const vectors = Array.isArray(input)\n ? await embedModel.embedDocuments?.(input)\n : [await embedModel.embedQuery?.(input)];\n const normalized = Array.isArray(vectors)\n ? vectors.filter((item): item is number[] => Array.isArray(item))\n : [];\n return {\n vectors: normalized,\n ...(model ? { model } : {}),\n };\n },\n };\n}\n\nfunction withDefaultToolServices(opts: CreateAgentToolsOptions): CreateAgentToolsOptions {\n const existingCoreTools = opts.coreTools ?? {};\n const existingServices = existingCoreTools.services ?? {};\n if (\"modelHub\" in existingServices && existingServices.modelHub != null) {\n return opts;\n }\n\n const modelHub = createDefaultModelHubFromAgentContext();\n if (!modelHub) return opts;\n\n return {\n ...opts,\n coreTools: {\n ...existingCoreTools,\n services: {\n ...existingServices,\n modelHub,\n },\n },\n };\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 resolveEmbeddedToolConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../../config/tool.yaml\"), // src/api -> config\n resolve(moduleDir, \"../config/tool.yaml\"), // dist/* -> config\n resolve(process.cwd(), \"config/tool.yaml\"), // fallback for local app runtime\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]!;\n}\n\nconst EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();\n\n/**\n * For each loaded extension, load its embedded config/tool.yaml (layer 2) and collect\n * the per-tool config into a flat map. Later entries in the list win over earlier ones.\n *\n * Security constraint: each extension's embedded config may only set defaults for tools\n * that belong to that extension (verified against its own manifest). Keys that reference\n * tools from other extensions or global config fields are silently ignored.\n */\nfunction collectExtensionEmbeddedDefaults(\n exts: LoadedExtension[],\n): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const ext of exts) {\n // Prefer dist/config/tool.yaml (published package); fall back to config/tool.yaml (local dev).\n const configPath =\n [resolve(ext.packageRoot, \"dist/config/tool.yaml\"), resolve(ext.packageRoot, \"config/tool.yaml\")].find(\n existsSync,\n ) ?? \"\";\n if (!configPath) continue;\n try {\n const toolConfigs = loadToolConfig(configPath).tools?.self ?? {};\n if (Object.keys(toolConfigs).length === 0) continue;\n\n // Build the set of short names this extension owns from its manifest.\n // Include both the explicit name field and the dot-path derived from sourcePath\n // (e.g. \"listDir\" and \"fs.listDir\" for src/fs/listDir) so that config keys in\n // either format are accepted.\n const manifest = loadExtensionManifest(ext.packageRoot);\n const ownToolNames = new Set<string>();\n for (const e of manifest.entries) {\n if (e.name) ownToolNames.add(e.name);\n if (e.sourcePath) {\n ownToolNames.add(e.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n }\n }\n\n for (const [k, v] of Object.entries(toolConfigs)) {\n // Only allow keys that are short names of tools this extension registers.\n if (ownToolNames.has(k)) {\n merged[k] = v;\n }\n }\n } catch {\n // skip malformed extension config or missing manifest\n }\n }\n return merged;\n}\n\nfunction loadMergedToolConfig(overridePath?: string): ToolYamlShape {\n const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);\n if (!overridePath) return baseConfig;\n const overrideConfig = loadToolConfig(overridePath);\n return deepMerge({} as ToolYamlShape, baseConfig, overrideConfig);\n}\n\nfunction flattenSourceGroupedToolConfig(\n sources: ToolYamlShape[\"tools\"] | undefined,\n): Record<string, Record<string, unknown>> {\n const flat: Record<string, Record<string, unknown>> = {};\n for (const [descriptor, toolMap] of Object.entries(sources ?? {})) {\n if (descriptor === \"self\") {\n for (const [toolName, toolConfig] of Object.entries(toolMap)) {\n flat[toolName] = toolConfig;\n }\n continue;\n }\n const packagePrefix = descriptor.startsWith(\"npm:\")\n ? npmDescriptorToPackagePrefix(descriptor)\n : descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : \"\";\n for (const [toolName, toolConfig] of Object.entries(toolMap)) {\n flat[packagePrefix ? `${packagePrefix}::${toolName}` : toolName] = toolConfig;\n }\n }\n return flat;\n}\n\nfunction buildConfiguredToolSelections(toolConfig: ToolYamlShape): string[] {\n return getPathSourceDescriptors(toolConfig);\n}\n\nfunction runtimeOptionsFromConfig(\n opts: CreateAgentToolsOptions,\n toolConfig: ToolYamlShape,\n configPathForResolve: string,\n extensionEmbeddedDefaults: Record<string, Record<string, unknown>>,\n): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n {\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(configPathForResolve, 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 // Priority (low → high): extension embedded (layer 2) < programmatic coreTools < app tool config\n const flatOverrides: Record<string, Record<string, unknown>> = {\n ...extensionEmbeddedDefaults,\n ...coreTools.toolOverrides,\n };\n if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;\n const configuredToolOverrides = flattenSourceGroupedToolConfig(toolConfig.tools);\n if (Object.keys(configuredToolOverrides).length > 0) {\n Object.assign(flatOverrides, configuredToolOverrides);\n hasToolDefaults = true;\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Build a ready-to-use runtime + hub from options.\n * - No options → embedded default config/tool.yaml only.\n * - options.configFilePath → override merged on top of embedded default.\n */\nfunction buildRuntimeAndHub(options: CreateAgentToolsOptions = {}): {\n runtime: ReturnType<typeof createRuntimeFromConfigSync>[\"runtime\"];\n hub: LangChainToolsHub;\n mergedToolConfig: ToolYamlShape;\n} {\n const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(options.configFilePath);\n // Collect layer-2 defaults from each extension's embedded config/tool.yaml.\n // loadAllExtensionsFromToolYamlSync is cheap here (require() is cached by Node.js).\n const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(\n loadAllExtensionsFromToolYamlSync(configPathForResolve),\n );\n const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n return { runtime, hub, mergedToolConfig };\n}\n\n/**\n * Internal: create LangChain tools from config/runtime.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - All other CreateAgentToolsOptions (coreTools, etc.) are applied as programmatic overrides.\n *\n * @example\n * Internal helper consumed by createAgentTools().\n */\nexport function createLangChainAgentTools(\n options?: CreateAgentToolsOptions | string,\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(withDefaultToolServices(opts));\n\n const names = buildConfiguredToolSelections(mergedToolConfig);\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) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\nexport async function createLangChainAgentToolsAsync(\n options?: CreateAgentToolsOptions | string,\n): Promise<StructuredToolInterface[]> {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const configPathForResolve = opts.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(opts.configFilePath);\n const runtimeOpts = runtimeOptionsFromConfig(\n withDefaultToolServices(opts),\n mergedToolConfig,\n configPathForResolve,\n {},\n );\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n const names = buildConfiguredToolSelections(mergedToolConfig);\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) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\n/**\n * Internal: create an MCP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.mcp → passed to the MCP server (name, version, execContextFactory).\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createMcpServer(\n options?: (CreateAgentToolsOptions & MCPServerOptions) | string,\n): Promise<McpServer> {\n const opts: CreateAgentToolsOptions & MCPServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: MCPServerOptions = {\n name: opts.name ?? mergedToolConfig.mcp?.name,\n version: opts.version ?? mergedToolConfig.mcp?.version,\n execContextFactory: opts.execContextFactory,\n };\n const { server } = await createMCPServer(runtime, serverOpts);\n return server;\n}\n\n/**\n * Internal: create an OpenAPI / Swagger HTTP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.port, host, basePath → passed to the HTTP server; tool.yaml openapi: section provides defaults.\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createOpenAPIServer(\n options?: (CreateAgentToolsOptions & OpenAPIHttpServerOptions) | string,\n): Promise<OpenAPIExpressApp> {\n const opts: CreateAgentToolsOptions & OpenAPIHttpServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: OpenAPIHttpServerOptions = {\n host: opts.host ?? mergedToolConfig.openapi?.host,\n port: opts.port ?? mergedToolConfig.openapi?.port,\n basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,\n execContextFactory: opts.execContextFactory,\n };\n return createOpenAPIHttpServer(runtime, serverOpts);\n}\n","import { AgentContextTokens } from \"@botbotgo/common\";\nimport {\n createLangChainAgentToolsAsync,\n type CreateAgentToolsOptions,\n} from \"./createAgentTools.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { getDefaultAgentContext } from \"../agent-context.js\";\n\nexport interface CreateAgentToolsModuleOptions extends CreateAgentToolsOptions {}\n\n/**\n * Preferred async tool initializer for application bootstrap.\n *\n * Sets:\n * - AgentContextTokens.Tools → StructuredToolInterface[]\n *\n * @example\n * ```ts\n * await createAgentTools(\"config/tool.yaml\");\n * ```\n */\nexport async function createAgentTools(\n configPathOrOptions?: string | CreateAgentToolsModuleOptions,\n): Promise<StructuredToolInterface[]> {\n const options =\n typeof configPathOrOptions === \"string\"\n ? { configFilePath: configPathOrOptions }\n : configPathOrOptions;\n const tools = await createLangChainAgentToolsAsync(options);\n getDefaultAgentContext().set(AgentContextTokens.Tools, tools);\n return tools;\n}\n","import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { loadToolConfig, getCacheBaseFromToolConfig, getPathSourceDescriptors } from \"../tools/util/toolConfig.js\";\nimport { ensurePackageInCache, resolveLatestVersionFromRegistry } from \"../utils/npmCache.js\";\nimport { parseNpmDescriptor } from \"./runtimeFromConfig.helpers.js\";\nimport { parseToolPath } from \"../tools/util/toolDescriptor.js\";\n\nexport interface ResolveAgentSkillRootsOptions {\n configFilePath: string;\n skillPath?: string;\n}\n\nfunction resolveSkillDirectory(root: string, skillPath: string): string | null {\n const candidate = resolve(root, skillPath);\n if (!existsSync(candidate) || !statSync(candidate).isDirectory()) return null;\n return candidate;\n}\n\nfunction getInstalledPackageVersionFromRequire(packageName: string, req: NodeRequire): string | null {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction resolveFileDescriptorRoot(descriptor: string, configFilePath: string): string | null {\n const parsed = parseToolPath(descriptor.trim());\n if (!parsed || parsed.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const pathPart = `${parsed.scope}/${parsed.packageWithVersion}`;\n const resolvedPath = resolve(configDir, pathPart);\n if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n return resolvedPath;\n}\n\nfunction resolveNpmDescriptorRoot(descriptor: string, configFilePath: string): string | null {\n const parsed = parseNpmDescriptor(descriptor.trim());\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = (() => {\n let dir = resolve(configDir);\n while (true) {\n const pkg = join(dir, \"package.json\");\n if (existsSync(pkg)) return pkg;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n })();\n const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;\n const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;\n\n if (configRequire) {\n try {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion = requested ?? installed ?? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd });\n if (installed === resolvedVersion) {\n return dirname(configRequire.resolve(`${parsed.packageName}/package.json`));\n }\n } catch {\n // fall through to cache\n }\n }\n\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];\n for (const opts of cacheOptions) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts as Parameters<typeof ensurePackageInCache>[2]);\n return cacheDir;\n } catch {\n if (cacheBase && \"cacheBase\" in opts) continue;\n break;\n }\n }\n return null;\n}\n\nfunction resolveDescriptorRoot(descriptor: string, configFilePath: string): string | null {\n if (descriptor.startsWith(\"npm:\")) return resolveNpmDescriptorRoot(descriptor, configFilePath);\n if (descriptor.startsWith(\"file:\")) return resolveFileDescriptorRoot(descriptor, configFilePath);\n return null;\n}\n\nexport function resolveAgentSkillRoots(options: ResolveAgentSkillRootsOptions): string[] {\n const config = loadToolConfig(options.configFilePath);\n const skillPath = options.skillPath ?? config.skillPath ?? \"skills\";\n const descriptors = getPathSourceDescriptors(config);\n const roots = descriptors\n .map((descriptor) => resolveDescriptorRoot(descriptor, options.configFilePath))\n .filter((value): value is string => typeof value === \"string\")\n .map((root) => resolveSkillDirectory(root, skillPath))\n .filter((value): value is string => typeof value === \"string\");\n return [...new Set(roots)];\n}\n\nexport const resolveAgentSkillRootsFromToolConfig = resolveAgentSkillRoots;\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AnyToolEvent, ToolEventType } from "../core/types/Events.js";
|
|
2
|
+
/**
|
|
3
|
+
* Event log entry with sequence number.
|
|
4
|
+
*/
|
|
5
|
+
export interface LogEntry {
|
|
6
|
+
seq: number;
|
|
7
|
+
event: AnyToolEvent;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Event log listener type.
|
|
11
|
+
*/
|
|
12
|
+
export type EventListener = (entry: LogEntry) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Append-only event log for tool invocations.
|
|
15
|
+
* Supports in-memory storage with configurable max size and event subscriptions.
|
|
16
|
+
*/
|
|
17
|
+
export declare class EventLog {
|
|
18
|
+
private readonly entries;
|
|
19
|
+
private seq;
|
|
20
|
+
private readonly maxEntries;
|
|
21
|
+
private readonly emitter;
|
|
22
|
+
constructor(options?: {
|
|
23
|
+
maxEntries?: number;
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Append an event to the log.
|
|
27
|
+
*/
|
|
28
|
+
append(event: AnyToolEvent): LogEntry;
|
|
29
|
+
/**
|
|
30
|
+
* Subscribe to all events.
|
|
31
|
+
*/
|
|
32
|
+
on(listener: EventListener): () => void;
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to events of a specific type.
|
|
35
|
+
*/
|
|
36
|
+
onType(type: ToolEventType, listener: EventListener): () => void;
|
|
37
|
+
/**
|
|
38
|
+
* Query events by filter.
|
|
39
|
+
*/
|
|
40
|
+
query(filter: {
|
|
41
|
+
type?: ToolEventType;
|
|
42
|
+
toolName?: string;
|
|
43
|
+
requestId?: string;
|
|
44
|
+
since?: number;
|
|
45
|
+
limit?: number;
|
|
46
|
+
}): LogEntry[];
|
|
47
|
+
/**
|
|
48
|
+
* Get all entries.
|
|
49
|
+
*/
|
|
50
|
+
getAll(): readonly LogEntry[];
|
|
51
|
+
/**
|
|
52
|
+
* Get entry count.
|
|
53
|
+
*/
|
|
54
|
+
get size(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Clear all entries (for testing).
|
|
57
|
+
*/
|
|
58
|
+
clear(): void;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=EventLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventLog.d.ts","sourceRoot":"","sources":["../../src/observability/EventLog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEtD;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAIjD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ;IAiBrC;;OAEG;IACH,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAKvC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAKhE;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QACZ,IAAI,CAAC,EAAE,aAAa,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,QAAQ,EAAE;IAsBd;;OAEG;IACH,MAAM,IAAI,SAAS,QAAQ,EAAE;IAI7B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export { summarizeForLog } from "../utils/log.js";
|
|
2
|
+
export type LogLevel = "silent" | "error" | "warn" | "info" | "debug" | "trace";
|
|
3
|
+
export interface DebugOptions {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
level?: LogLevel;
|
|
6
|
+
includeArgs?: boolean;
|
|
7
|
+
includeResults?: boolean;
|
|
8
|
+
includeRaw?: boolean;
|
|
9
|
+
logEvents?: boolean;
|
|
10
|
+
prefix?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolvedDebugOptions {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
level: LogLevel;
|
|
15
|
+
includeArgs: boolean;
|
|
16
|
+
includeResults: boolean;
|
|
17
|
+
includeRaw: boolean;
|
|
18
|
+
logEvents: boolean;
|
|
19
|
+
prefix: string;
|
|
20
|
+
}
|
|
21
|
+
export interface Logger {
|
|
22
|
+
options: ResolvedDebugOptions;
|
|
23
|
+
isEnabled(level: LogLevel): boolean;
|
|
24
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
25
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
26
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
27
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
28
|
+
trace(message: string, meta?: Record<string, unknown>): void;
|
|
29
|
+
}
|
|
30
|
+
export declare function createLogger(options?: DebugOptions): Logger;
|
|
31
|
+
export declare function resolveDebugOptions(options?: DebugOptions): ResolvedDebugOptions;
|
|
32
|
+
export declare function sanitizeForLog(value: unknown, maxLen?: number): string;
|
|
33
|
+
//# sourceMappingURL=Logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/observability/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IACpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAWD,wBAAgB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,CAoC/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,YAAiB,GAAG,oBAAoB,CAgBpF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,MAAM,CAMnE"}
|