@easynet/agent-tool-hub 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -0
- package/dist/N8nLocalAdapter-6RKQJXJP.js +4 -0
- package/dist/N8nLocalAdapter-6RKQJXJP.js.map +1 -0
- package/dist/N8nLocalAdapter-MDWME5ZG.cjs +13 -0
- package/dist/N8nLocalAdapter-MDWME5ZG.cjs.map +1 -0
- package/dist/chunk-57LVNNHL.js +19 -0
- package/dist/chunk-57LVNNHL.js.map +1 -0
- package/dist/chunk-6QTWECRD.cjs +23 -0
- package/dist/chunk-6QTWECRD.cjs.map +1 -0
- package/dist/chunk-HPDQEW2P.js +5251 -0
- package/dist/chunk-HPDQEW2P.js.map +1 -0
- package/dist/chunk-MHEFFZBB.js +134 -0
- package/dist/chunk-MHEFFZBB.js.map +1 -0
- package/dist/chunk-NTTBDQUF.cjs +118 -0
- package/dist/chunk-NTTBDQUF.cjs.map +1 -0
- package/dist/chunk-TIKHPRMB.cjs +5313 -0
- package/dist/chunk-TIKHPRMB.cjs.map +1 -0
- package/dist/chunk-X53WXBKX.cjs +136 -0
- package/dist/chunk-X53WXBKX.cjs.map +1 -0
- package/dist/chunk-YSYEED4K.js +114 -0
- package/dist/chunk-YSYEED4K.js.map +1 -0
- package/dist/cli.cjs +194 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +10 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +186 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +592 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +552 -0
- package/dist/index.d.ts +552 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/toolhub-runtime-CQkP4QVW.d.cts +1564 -0
- package/dist/toolhub-runtime-CQkP4QVW.d.ts +1564 -0
- package/dist/toolhub-runtime.cjs +30 -0
- package/dist/toolhub-runtime.cjs.map +1 -0
- package/dist/toolhub-runtime.d.cts +4 -0
- package/dist/toolhub-runtime.d.ts +4 -0
- package/dist/toolhub-runtime.js +5 -0
- package/dist/toolhub-runtime.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createLogger, sanitizeForLog, summarizeForLog } from './chunk-YSYEED4K.js';
|
|
2
|
+
import { N8nLocal } from '@easynet/n8n-local';
|
|
3
|
+
|
|
4
|
+
var N8nLocalAdapter = class {
|
|
5
|
+
kind = "n8n";
|
|
6
|
+
instance;
|
|
7
|
+
autoStart;
|
|
8
|
+
startPromise;
|
|
9
|
+
workflowMap = /* @__PURE__ */ new Map();
|
|
10
|
+
// toolName -> workflowId
|
|
11
|
+
logger;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
if (process.env.N8N_START_HTTP_SERVER === void 0) {
|
|
14
|
+
const start = options.startHttpServer ?? false;
|
|
15
|
+
process.env.N8N_START_HTTP_SERVER = start ? "true" : "false";
|
|
16
|
+
}
|
|
17
|
+
process.env.DB_TYPE = "sqlite";
|
|
18
|
+
if (options.sqliteDatabase) {
|
|
19
|
+
process.env.DB_SQLITE_DATABASE = options.sqliteDatabase;
|
|
20
|
+
} else if (!process.env.DB_SQLITE_DATABASE) {
|
|
21
|
+
process.env.DB_SQLITE_DATABASE = "database.sqlite";
|
|
22
|
+
}
|
|
23
|
+
if (options.dataFolder) {
|
|
24
|
+
process.env.N8N_DATA_FOLDER = options.dataFolder;
|
|
25
|
+
}
|
|
26
|
+
this.instance = options.instance ?? new N8nLocal();
|
|
27
|
+
this.autoStart = options.autoStart ?? true;
|
|
28
|
+
this.logger = createLogger({ ...options.debug, prefix: "N8nLocalAdapter" });
|
|
29
|
+
}
|
|
30
|
+
async listTools() {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
async invoke(spec, args, _ctx) {
|
|
34
|
+
if (this.logger.isEnabled("debug")) {
|
|
35
|
+
this.logger.debug("invoke.start", {
|
|
36
|
+
tool: spec.name,
|
|
37
|
+
args: this.logger.options.includeArgs ? sanitizeForLog(args) : void 0
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await this.ensureStarted();
|
|
42
|
+
const workflowId = await this.ensureWorkflowImported(spec);
|
|
43
|
+
const result = await this.instance.runWorkflow(workflowId, args);
|
|
44
|
+
if (this.logger.isEnabled("debug")) {
|
|
45
|
+
this.logger.debug("invoke.ok", {
|
|
46
|
+
tool: spec.name,
|
|
47
|
+
workflowId,
|
|
48
|
+
result: this.logger.options.includeResults ? summarizeForLog(result) : void 0
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return { result, raw: result };
|
|
52
|
+
} catch (error) {
|
|
53
|
+
this.logger.warn("invoke.error", {
|
|
54
|
+
tool: spec.name,
|
|
55
|
+
message: error instanceof Error ? error.message : String(error)
|
|
56
|
+
});
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async stop() {
|
|
61
|
+
this.logger.info("n8nlocal.stop", {});
|
|
62
|
+
await this.instance.stop();
|
|
63
|
+
}
|
|
64
|
+
async start() {
|
|
65
|
+
if (!this.startPromise) {
|
|
66
|
+
this.startPromise = this.instance.start();
|
|
67
|
+
}
|
|
68
|
+
this.logger.info("n8nlocal.start", {});
|
|
69
|
+
await this.startPromise;
|
|
70
|
+
}
|
|
71
|
+
async syncWorkflows(specs) {
|
|
72
|
+
this.logger.info("n8nlocal.sync.start", { count: specs.length });
|
|
73
|
+
await this.ensureStarted();
|
|
74
|
+
const workflows = await this.instance.workflow.listWorkflows();
|
|
75
|
+
const byId = new Map(workflows.map((wf) => [String(wf.id), wf]));
|
|
76
|
+
const byName = new Map(workflows.map((wf) => [String(wf.name), wf]));
|
|
77
|
+
for (const spec of specs) {
|
|
78
|
+
if (spec.kind !== "n8n") continue;
|
|
79
|
+
const normalized = this.normalizeWorkflow(this.getWorkflowDefinition(spec), spec);
|
|
80
|
+
const id = String(normalized.id);
|
|
81
|
+
const name = String(normalized.name);
|
|
82
|
+
const existing = byId.get(id) ?? byName.get(name);
|
|
83
|
+
if (existing) {
|
|
84
|
+
const updated = await this.instance.workflow.updateWorkflow(existing.id, normalized);
|
|
85
|
+
this.workflowMap.set(spec.name, String(updated.id));
|
|
86
|
+
} else {
|
|
87
|
+
const imported = await this.instance.workflow.importWorkflow(normalized);
|
|
88
|
+
this.workflowMap.set(spec.name, String(imported.id));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.logger.info("n8nlocal.sync.done", { count: specs.length });
|
|
92
|
+
}
|
|
93
|
+
async ensureStarted() {
|
|
94
|
+
if (!this.autoStart) {
|
|
95
|
+
throw new Error("n8n-local instance not started. Call start() or enable autoStart.");
|
|
96
|
+
}
|
|
97
|
+
if (!this.startPromise) {
|
|
98
|
+
this.startPromise = this.instance.start();
|
|
99
|
+
}
|
|
100
|
+
await this.startPromise;
|
|
101
|
+
}
|
|
102
|
+
async ensureWorkflowImported(spec) {
|
|
103
|
+
const cached = this.workflowMap.get(spec.name);
|
|
104
|
+
if (cached) return cached;
|
|
105
|
+
const workflowDef = this.getWorkflowDefinition(spec);
|
|
106
|
+
const normalized = this.normalizeWorkflow(workflowDef, spec);
|
|
107
|
+
const imported = await this.instance.workflow.importWorkflow(normalized);
|
|
108
|
+
const workflowId = String(imported.id);
|
|
109
|
+
this.workflowMap.set(spec.name, workflowId);
|
|
110
|
+
return workflowId;
|
|
111
|
+
}
|
|
112
|
+
getWorkflowDefinition(spec) {
|
|
113
|
+
if (spec.impl && typeof spec.impl === "object") {
|
|
114
|
+
return spec.impl;
|
|
115
|
+
}
|
|
116
|
+
throw new Error(`n8n workflow definition missing for tool: ${spec.name}`);
|
|
117
|
+
}
|
|
118
|
+
normalizeWorkflow(workflow, spec) {
|
|
119
|
+
const normalized = { ...workflow };
|
|
120
|
+
if (!normalized.id) {
|
|
121
|
+
normalized.id = spec.resourceId ?? spec.name;
|
|
122
|
+
}
|
|
123
|
+
if (!normalized.name) {
|
|
124
|
+
normalized.name = spec.name;
|
|
125
|
+
}
|
|
126
|
+
if (!normalized.nodes) normalized.nodes = [];
|
|
127
|
+
if (!normalized.connections) normalized.connections = {};
|
|
128
|
+
return normalized;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export { N8nLocalAdapter };
|
|
133
|
+
//# sourceMappingURL=chunk-MHEFFZBB.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-MHEFFZBB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/N8nLocalAdapter.ts"],"names":[],"mappings":"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","file":"chunk-MHEFFZBB.js","sourcesContent":["import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport { N8nLocal } from \"@easynet/n8n-local\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\nexport interface N8nLocalAdapterOptions {\n /** Reuse an existing N8nLocal instance */\n instance?: N8nLocal;\n /** Auto-start n8n-local on first invoke (default: true) */\n autoStart?: boolean;\n /** Whether to start the internal HTTP server (default: false) */\n startHttpServer?: boolean;\n /** SQLite database file path (default: \"database.sqlite\") */\n sqliteDatabase?: string;\n /** Optional data folder for workflow sync */\n dataFolder?: string;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * Adapter for n8n-local (embedded) workflow execution.\n * Uses in-process instance, no HTTP API calls.\n */\nexport class N8nLocalAdapter implements ToolAdapter {\n readonly kind = \"n8n\" as const;\n private readonly instance: N8nLocal;\n private readonly autoStart: boolean;\n private startPromise?: Promise<void>;\n private readonly workflowMap = new Map<string, string>(); // toolName -> workflowId\n private readonly logger: Logger;\n\n constructor(options: N8nLocalAdapterOptions = {}) {\n if (process.env.N8N_START_HTTP_SERVER === undefined) {\n const start = options.startHttpServer ?? false;\n process.env.N8N_START_HTTP_SERVER = start ? \"true\" : \"false\";\n }\n process.env.DB_TYPE = \"sqlite\";\n if (options.sqliteDatabase) {\n process.env.DB_SQLITE_DATABASE = options.sqliteDatabase;\n } else if (!process.env.DB_SQLITE_DATABASE) {\n process.env.DB_SQLITE_DATABASE = \"database.sqlite\";\n }\n if (options.dataFolder) {\n process.env.N8N_DATA_FOLDER = options.dataFolder;\n }\n\n this.instance = options.instance ?? new N8nLocal();\n this.autoStart = options.autoStart ?? true;\n this.logger = createLogger({ ...options.debug, prefix: \"N8nLocalAdapter\" });\n }\n\n async listTools(): Promise<ToolSpec[]> {\n return [];\n }\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n try {\n await this.ensureStarted();\n const workflowId = await this.ensureWorkflowImported(spec);\n const result = await this.instance.runWorkflow(workflowId, args);\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n workflowId,\n result: this.logger.options.includeResults\n ? summarizeForLog(result)\n : undefined,\n });\n }\n\n return { result, raw: result };\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n this.logger.info(\"n8nlocal.stop\", {});\n await this.instance.stop();\n }\n\n async start(): Promise<void> {\n if (!this.startPromise) {\n this.startPromise = this.instance.start();\n }\n this.logger.info(\"n8nlocal.start\", {});\n await this.startPromise;\n }\n\n async syncWorkflows(specs: ToolSpec[]): Promise<void> {\n this.logger.info(\"n8nlocal.sync.start\", { count: specs.length });\n await this.ensureStarted();\n const workflows = await this.instance.workflow.listWorkflows();\n const byId = new Map(workflows.map((wf: any) => [String(wf.id), wf]));\n const byName = new Map(workflows.map((wf: any) => [String(wf.name), wf]));\n\n for (const spec of specs) {\n if (spec.kind !== \"n8n\") continue;\n const normalized = this.normalizeWorkflow(this.getWorkflowDefinition(spec), spec);\n const id = String(normalized.id);\n const name = String(normalized.name);\n const existing = byId.get(id) ?? byName.get(name);\n\n if (existing) {\n const updated = await this.instance.workflow.updateWorkflow(existing.id, normalized as any);\n this.workflowMap.set(spec.name, String(updated.id));\n } else {\n const imported = await this.instance.workflow.importWorkflow(normalized as any);\n this.workflowMap.set(spec.name, String(imported.id));\n }\n }\n this.logger.info(\"n8nlocal.sync.done\", { count: specs.length });\n }\n\n private async ensureStarted(): Promise<void> {\n if (!this.autoStart) {\n throw new Error(\"n8n-local instance not started. Call start() or enable autoStart.\");\n }\n\n if (!this.startPromise) {\n this.startPromise = this.instance.start();\n }\n await this.startPromise;\n }\n\n private async ensureWorkflowImported(spec: ToolSpec): Promise<string> {\n const cached = this.workflowMap.get(spec.name);\n if (cached) return cached;\n\n const workflowDef = this.getWorkflowDefinition(spec);\n const normalized = this.normalizeWorkflow(workflowDef, spec);\n const imported = await this.instance.workflow.importWorkflow(normalized as any);\n const workflowId = String(imported.id);\n this.workflowMap.set(spec.name, workflowId);\n return workflowId;\n }\n\n private getWorkflowDefinition(spec: ToolSpec): Record<string, unknown> {\n if (spec.impl && typeof spec.impl === \"object\") {\n return spec.impl as Record<string, unknown>;\n }\n throw new Error(`n8n workflow definition missing for tool: ${spec.name}`);\n }\n\n private normalizeWorkflow(\n workflow: Record<string, unknown>,\n spec: ToolSpec,\n ): Record<string, unknown> {\n const normalized = { ...workflow };\n if (!normalized.id) {\n normalized.id = spec.resourceId ?? spec.name;\n }\n if (!normalized.name) {\n normalized.name = spec.name;\n }\n if (!normalized.nodes) normalized.nodes = [];\n if (!normalized.connections) normalized.connections = {};\n return normalized;\n }\n}\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/observability/Logger.ts
|
|
4
|
+
var LEVEL_ORDER = {
|
|
5
|
+
silent: 0,
|
|
6
|
+
error: 1,
|
|
7
|
+
warn: 2,
|
|
8
|
+
info: 3,
|
|
9
|
+
debug: 4,
|
|
10
|
+
trace: 5
|
|
11
|
+
};
|
|
12
|
+
function createLogger(options = {}) {
|
|
13
|
+
const resolved = resolveDebugOptions(options);
|
|
14
|
+
const log = (level, message, meta) => {
|
|
15
|
+
if (!resolved.enabled) return;
|
|
16
|
+
if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;
|
|
17
|
+
const prefix = `[${resolved.prefix}]`;
|
|
18
|
+
const levelTag = `[${level.toUpperCase()}]`;
|
|
19
|
+
const metaText = meta ? ` ${safeStringify(meta, 1e3)}` : "";
|
|
20
|
+
switch (level) {
|
|
21
|
+
case "error":
|
|
22
|
+
console.error(`${prefix} ${levelTag} ${message}${metaText}`);
|
|
23
|
+
break;
|
|
24
|
+
case "warn":
|
|
25
|
+
console.warn(`${prefix} ${levelTag} ${message}${metaText}`);
|
|
26
|
+
break;
|
|
27
|
+
case "info":
|
|
28
|
+
console.info(`${prefix} ${levelTag} ${message}${metaText}`);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
console.log(`${prefix} ${levelTag} ${message}${metaText}`);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
options: resolved,
|
|
37
|
+
isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],
|
|
38
|
+
error: (message, meta) => log("error", message, meta),
|
|
39
|
+
warn: (message, meta) => log("warn", message, meta),
|
|
40
|
+
info: (message, meta) => log("info", message, meta),
|
|
41
|
+
debug: (message, meta) => log("debug", message, meta),
|
|
42
|
+
trace: (message, meta) => log("trace", message, meta)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function resolveDebugOptions(options = {}) {
|
|
46
|
+
const envLevel = parseEnvLogLevel();
|
|
47
|
+
const enabledFromEnv = envLevel !== void 0 && envLevel !== "silent";
|
|
48
|
+
const enabled = options.enabled ?? enabledFromEnv ?? false;
|
|
49
|
+
const level = options.level ?? envLevel ?? (enabled ? "debug" : "silent");
|
|
50
|
+
return {
|
|
51
|
+
enabled,
|
|
52
|
+
level,
|
|
53
|
+
includeArgs: options.includeArgs ?? false,
|
|
54
|
+
includeResults: options.includeResults ?? false,
|
|
55
|
+
includeRaw: options.includeRaw ?? false,
|
|
56
|
+
logEvents: options.logEvents ?? false,
|
|
57
|
+
prefix: options.prefix ?? "agent-tool-hub"
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function sanitizeForLog(value, maxLen = 500) {
|
|
61
|
+
const str = safeStringify(value, maxLen);
|
|
62
|
+
return str.replace(
|
|
63
|
+
/"(password|token|secret|key|auth)":\s*"[^"]*"/gi,
|
|
64
|
+
'"$1":"[REDACTED]"'
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function summarizeForLog(value, maxLen = 200) {
|
|
68
|
+
if (value === null) return "null";
|
|
69
|
+
if (value === void 0) return "undefined";
|
|
70
|
+
if (typeof value === "string") {
|
|
71
|
+
return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;
|
|
72
|
+
}
|
|
73
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
74
|
+
return String(value);
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
return `Array(${value.length})`;
|
|
78
|
+
}
|
|
79
|
+
if (typeof value === "object") {
|
|
80
|
+
const keys = Object.keys(value);
|
|
81
|
+
const shown = keys.slice(0, 5).join(", ");
|
|
82
|
+
return `Object(keys: ${shown}${keys.length > 5 ? ", ..." : ""})`;
|
|
83
|
+
}
|
|
84
|
+
return String(value);
|
|
85
|
+
}
|
|
86
|
+
function safeStringify(value, maxLen) {
|
|
87
|
+
try {
|
|
88
|
+
const json = JSON.stringify(value);
|
|
89
|
+
if (!json) return String(value);
|
|
90
|
+
return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;
|
|
91
|
+
} catch {
|
|
92
|
+
const fallback = String(value);
|
|
93
|
+
return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function parseEnvLogLevel() {
|
|
97
|
+
const raw = process.env.TOOLHUB_LOG_LEVEL ?? process.env.TOOLHUB_DEBUG ?? process.env.DEBUG;
|
|
98
|
+
if (!raw) return void 0;
|
|
99
|
+
const value = raw.trim().toLowerCase();
|
|
100
|
+
if (!value || value === "0" || value === "false" || value === "off") {
|
|
101
|
+
return "silent";
|
|
102
|
+
}
|
|
103
|
+
if (value.includes("trace")) return "trace";
|
|
104
|
+
if (value.includes("debug") || value === "1" || value === "true" || value === "yes") {
|
|
105
|
+
return "debug";
|
|
106
|
+
}
|
|
107
|
+
if (value.includes("info")) return "info";
|
|
108
|
+
if (value.includes("warn")) return "warn";
|
|
109
|
+
if (value.includes("error")) return "error";
|
|
110
|
+
if (value.includes("silent")) return "silent";
|
|
111
|
+
return "debug";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
exports.createLogger = createLogger;
|
|
115
|
+
exports.sanitizeForLog = sanitizeForLog;
|
|
116
|
+
exports.summarizeForLog = summarizeForLog;
|
|
117
|
+
//# sourceMappingURL=chunk-NTTBDQUF.cjs.map
|
|
118
|
+
//# sourceMappingURL=chunk-NTTBDQUF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/observability/Logger.ts"],"names":[],"mappings":"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","file":"chunk-NTTBDQUF.cjs","sourcesContent":["export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DebugOptions {\n enabled?: boolean;\n level?: LogLevel;\n includeArgs?: boolean;\n includeResults?: boolean;\n includeRaw?: boolean;\n logEvents?: boolean;\n prefix?: string;\n}\n\nexport interface ResolvedDebugOptions {\n enabled: boolean;\n level: LogLevel;\n includeArgs: boolean;\n includeResults: boolean;\n includeRaw: boolean;\n logEvents: boolean;\n prefix: string;\n}\n\nexport interface Logger {\n options: ResolvedDebugOptions;\n isEnabled(level: LogLevel): boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n trace(message: string, meta?: Record<string, unknown>): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nexport function createLogger(options: DebugOptions = {}): Logger {\n const resolved = resolveDebugOptions(options);\n\n const log = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (!resolved.enabled) return;\n if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;\n\n const prefix = `[${resolved.prefix}]`;\n const levelTag = `[${level.toUpperCase()}]`;\n const metaText = meta ? ` ${safeStringify(meta, 1000)}` : \"\";\n\n switch (level) {\n case \"error\":\n console.error(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"warn\":\n console.warn(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"info\":\n console.info(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n default:\n console.log(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n }\n };\n\n return {\n options: resolved,\n isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],\n error: (message, meta) => log(\"error\", message, meta),\n warn: (message, meta) => log(\"warn\", message, meta),\n info: (message, meta) => log(\"info\", message, meta),\n debug: (message, meta) => log(\"debug\", message, meta),\n trace: (message, meta) => log(\"trace\", message, meta),\n };\n}\n\nexport function resolveDebugOptions(options: DebugOptions = {}): ResolvedDebugOptions {\n const envLevel = parseEnvLogLevel();\n const enabledFromEnv = envLevel !== undefined && envLevel !== \"silent\";\n const enabled = options.enabled ?? enabledFromEnv ?? false;\n const level =\n options.level ?? envLevel ?? (enabled ? \"debug\" : \"silent\");\n\n return {\n enabled,\n level,\n includeArgs: options.includeArgs ?? false,\n includeResults: options.includeResults ?? false,\n includeRaw: options.includeRaw ?? false,\n logEvents: options.logEvents ?? false,\n prefix: options.prefix ?? \"agent-tool-hub\",\n };\n}\n\nexport function sanitizeForLog(value: unknown, maxLen = 500): string {\n const str = safeStringify(value, maxLen);\n return str.replace(\n /\"(password|token|secret|key|auth)\":\\s*\"[^\"]*\"/gi,\n \"\\\"$1\\\":\\\"[REDACTED]\\\"\",\n );\n}\n\nexport function summarizeForLog(value: unknown, maxLen = 200): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n const shown = keys.slice(0, 5).join(\", \");\n return `Object(keys: ${shown}${keys.length > 5 ? \", ...\" : \"\"})`;\n }\n return String(value);\n}\n\nfunction safeStringify(value: unknown, maxLen: number): string {\n try {\n const json = JSON.stringify(value);\n if (!json) return String(value);\n return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;\n } catch {\n const fallback = String(value);\n return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;\n }\n}\n\nfunction parseEnvLogLevel(): LogLevel | undefined {\n const raw =\n process.env.TOOLHUB_LOG_LEVEL ??\n process.env.TOOLHUB_DEBUG ??\n process.env.DEBUG;\n\n if (!raw) return undefined;\n const value = raw.trim().toLowerCase();\n if (!value || value === \"0\" || value === \"false\" || value === \"off\") {\n return \"silent\";\n }\n if (value.includes(\"trace\")) return \"trace\";\n if (value.includes(\"debug\") || value === \"1\" || value === \"true\" || value === \"yes\") {\n return \"debug\";\n }\n if (value.includes(\"info\")) return \"info\";\n if (value.includes(\"warn\")) return \"warn\";\n if (value.includes(\"error\")) return \"error\";\n if (value.includes(\"silent\")) return \"silent\";\n return \"debug\";\n}\n"]}
|