agents-library 0.1.0 → 0.1.2
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 +178 -0
- package/dist/base-agent.d.ts +10 -8
- package/dist/base-agent.d.ts.map +1 -1
- package/dist/base-agent.js +30 -26
- package/dist/base-agent.js.map +1 -1
- package/dist/base-bot.d.ts +0 -0
- package/dist/base-bot.d.ts.map +0 -0
- package/dist/base-bot.js +5 -5
- package/dist/base-bot.js.map +1 -1
- package/dist/common/result.d.ts +0 -0
- package/dist/common/result.d.ts.map +0 -0
- package/dist/common/result.js +0 -0
- package/dist/common/result.js.map +0 -0
- package/dist/common/types.d.ts +0 -0
- package/dist/common/types.d.ts.map +0 -0
- package/dist/common/types.js +0 -0
- package/dist/common/types.js.map +0 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/kadi-event-publisher.d.ts +0 -0
- package/dist/kadi-event-publisher.d.ts.map +0 -0
- package/dist/kadi-event-publisher.js +1 -1
- package/dist/kadi-event-publisher.js.map +1 -1
- package/dist/memory/arcadedb-adapter.d.ts +8 -0
- package/dist/memory/arcadedb-adapter.d.ts.map +1 -1
- package/dist/memory/arcadedb-adapter.js +8 -0
- package/dist/memory/arcadedb-adapter.js.map +1 -1
- package/dist/memory/entity-extractor.d.ts +110 -0
- package/dist/memory/entity-extractor.d.ts.map +1 -0
- package/dist/memory/entity-extractor.js +259 -0
- package/dist/memory/entity-extractor.js.map +1 -0
- package/dist/memory/file-storage-adapter.d.ts +0 -0
- package/dist/memory/file-storage-adapter.d.ts.map +0 -0
- package/dist/memory/file-storage-adapter.js +0 -0
- package/dist/memory/file-storage-adapter.js.map +0 -0
- package/dist/memory/memory-service.d.ts +123 -13
- package/dist/memory/memory-service.d.ts.map +1 -1
- package/dist/memory/memory-service.js +428 -72
- package/dist/memory/memory-service.js.map +1 -1
- package/dist/memory/types.d.ts +0 -0
- package/dist/memory/types.d.ts.map +0 -0
- package/dist/memory/types.js +0 -0
- package/dist/memory/types.js.map +0 -0
- package/dist/producer-tool-utils.d.ts +0 -0
- package/dist/producer-tool-utils.d.ts.map +0 -0
- package/dist/producer-tool-utils.js +16 -16
- package/dist/producer-tool-utils.js.map +1 -1
- package/dist/providers/anthropic-provider.d.ts +0 -0
- package/dist/providers/anthropic-provider.d.ts.map +0 -0
- package/dist/providers/anthropic-provider.js +0 -0
- package/dist/providers/anthropic-provider.js.map +0 -0
- package/dist/providers/model-manager-provider.d.ts +0 -0
- package/dist/providers/model-manager-provider.d.ts.map +0 -0
- package/dist/providers/model-manager-provider.js +0 -0
- package/dist/providers/model-manager-provider.js.map +0 -0
- package/dist/providers/provider-manager.d.ts +0 -0
- package/dist/providers/provider-manager.d.ts.map +1 -1
- package/dist/providers/provider-manager.js +6 -2
- package/dist/providers/provider-manager.js.map +1 -1
- package/dist/providers/types.d.ts +0 -0
- package/dist/providers/types.d.ts.map +0 -0
- package/dist/providers/types.js +0 -0
- package/dist/providers/types.js.map +0 -0
- package/dist/shadow-agent-factory.d.ts +23 -97
- package/dist/shadow-agent-factory.d.ts.map +1 -1
- package/dist/shadow-agent-factory.js +116 -306
- package/dist/shadow-agent-factory.js.map +1 -1
- package/dist/types/agent-config.d.ts +62 -1
- package/dist/types/agent-config.d.ts.map +1 -1
- package/dist/types/agent-config.js +0 -0
- package/dist/types/agent-config.js.map +0 -0
- package/dist/types/event-schemas.d.ts +194 -0
- package/dist/types/event-schemas.d.ts.map +1 -1
- package/dist/types/event-schemas.js +77 -2
- package/dist/types/event-schemas.js.map +1 -1
- package/dist/types/tool-schemas.d.ts +0 -0
- package/dist/types/tool-schemas.d.ts.map +0 -0
- package/dist/types/tool-schemas.js +0 -0
- package/dist/types/tool-schemas.js.map +0 -0
- package/dist/utils/config.d.ts +48 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +163 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +26 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path-utils.d.ts +22 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +51 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/read-config.d.ts +43 -0
- package/dist/utils/read-config.d.ts.map +1 -0
- package/dist/utils/read-config.js +97 -0
- package/dist/utils/read-config.js.map +1 -0
- package/dist/utils/timer.d.ts +0 -0
- package/dist/utils/timer.d.ts.map +0 -0
- package/dist/utils/timer.js +0 -0
- package/dist/utils/timer.js.map +0 -0
- package/dist/utils/vault.d.ts +29 -0
- package/dist/utils/vault.d.ts.map +1 -0
- package/dist/utils/vault.js +79 -0
- package/dist/utils/vault.js.map +1 -0
- package/dist/worker-agent-factory.d.ts +37 -38
- package/dist/worker-agent-factory.d.ts.map +1 -1
- package/dist/worker-agent-factory.js +355 -212
- package/dist/worker-agent-factory.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared TOML config loader for KĀDI agents.
|
|
3
|
+
*
|
|
4
|
+
* Loads non-secret configuration from `config.toml` and injects into
|
|
5
|
+
* `process.env` (existing env vars take precedence).
|
|
6
|
+
*
|
|
7
|
+
* Walk-up discovery: searches from CWD upward until it finds config.toml.
|
|
8
|
+
*
|
|
9
|
+
* Professor's paradigm:
|
|
10
|
+
* secrets.toml → encrypted vault (committed)
|
|
11
|
+
* config.toml → non-secret settings (committed)
|
|
12
|
+
* .env → optional local override (NOT committed)
|
|
13
|
+
*
|
|
14
|
+
* Resolution order: process.env > .env (dotenv) > config.toml > defaults
|
|
15
|
+
*
|
|
16
|
+
* @module utils/config
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
19
|
+
import { resolve, dirname, join } from 'node:path';
|
|
20
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
21
|
+
const CONFIG_FILENAME = 'config.toml';
|
|
22
|
+
const TAG = '[config]';
|
|
23
|
+
// ── TOML key → env var mapping ───────────────────────────────────────
|
|
24
|
+
//
|
|
25
|
+
// Flat mapping from TOML dotted paths to env var names.
|
|
26
|
+
// Only mapped keys are injected into process.env.
|
|
27
|
+
const TOML_TO_ENV = {
|
|
28
|
+
'broker.url': 'KADI_BROKER_URL',
|
|
29
|
+
'broker.networks': 'KADI_NETWORK',
|
|
30
|
+
'broker.remote.url': 'KADI_BROKER_URL_2',
|
|
31
|
+
'broker.remote.networks': 'KADI_NETWORK_2',
|
|
32
|
+
'bot.tool_timeout_ms': 'BOT_TOOL_TIMEOUT_MS',
|
|
33
|
+
'bot.slack.enabled': 'ENABLE_SLACK_BOT',
|
|
34
|
+
'bot.slack.user_id': 'SLACK_BOT_USER_ID',
|
|
35
|
+
'bot.discord.enabled': 'ENABLE_DISCORD_BOT',
|
|
36
|
+
'bot.discord.user_id': 'DISCORD_BOT_USER_ID',
|
|
37
|
+
'memory.data_path': 'MEMORY_DATA_PATH',
|
|
38
|
+
};
|
|
39
|
+
// ── Walk-up discovery ────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Walk up from `startDir` to filesystem root looking for config.toml.
|
|
42
|
+
*/
|
|
43
|
+
export function findConfigFile(startDir) {
|
|
44
|
+
let dir = resolve(startDir);
|
|
45
|
+
while (true) {
|
|
46
|
+
const candidate = join(dir, CONFIG_FILENAME);
|
|
47
|
+
if (existsSync(candidate))
|
|
48
|
+
return candidate;
|
|
49
|
+
const parent = dirname(dir);
|
|
50
|
+
if (parent === dir)
|
|
51
|
+
break; // reached root
|
|
52
|
+
dir = parent;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function parseSimpleToml(content) {
|
|
57
|
+
const result = {};
|
|
58
|
+
let currentSection = '';
|
|
59
|
+
for (const rawLine of content.split('\n')) {
|
|
60
|
+
const line = rawLine.trim();
|
|
61
|
+
// Skip comments and blank lines
|
|
62
|
+
if (!line || line.startsWith('#'))
|
|
63
|
+
continue;
|
|
64
|
+
// Section header: [broker] or [broker.remote]
|
|
65
|
+
const sectionMatch = line.match(/^\[([a-zA-Z0-9._-]+)\]$/);
|
|
66
|
+
if (sectionMatch) {
|
|
67
|
+
currentSection = sectionMatch[1];
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Key = value
|
|
71
|
+
const kvMatch = line.match(/^([a-zA-Z0-9_-]+)\s*=\s*(.+)$/);
|
|
72
|
+
if (!kvMatch)
|
|
73
|
+
continue;
|
|
74
|
+
const key = kvMatch[1];
|
|
75
|
+
const rawValue = kvMatch[2].trim();
|
|
76
|
+
const fullKey = currentSection ? `${currentSection}.${key}` : key;
|
|
77
|
+
// Parse value
|
|
78
|
+
result[fullKey] = parseTomlValue(rawValue);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function parseTomlValue(raw) {
|
|
83
|
+
// Boolean
|
|
84
|
+
if (raw === 'true')
|
|
85
|
+
return true;
|
|
86
|
+
if (raw === 'false')
|
|
87
|
+
return false;
|
|
88
|
+
// Number (integer or float)
|
|
89
|
+
if (/^-?\d+(\.\d+)?$/.test(raw))
|
|
90
|
+
return Number(raw);
|
|
91
|
+
// String (quoted)
|
|
92
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) ||
|
|
93
|
+
(raw.startsWith("'") && raw.endsWith("'"))) {
|
|
94
|
+
return raw.slice(1, -1);
|
|
95
|
+
}
|
|
96
|
+
// Array of strings: ["a", "b", "c"]
|
|
97
|
+
if (raw.startsWith('[') && raw.endsWith(']')) {
|
|
98
|
+
const inner = raw.slice(1, -1).trim();
|
|
99
|
+
if (!inner)
|
|
100
|
+
return [];
|
|
101
|
+
return inner.split(',').map(s => {
|
|
102
|
+
const trimmed = s.trim();
|
|
103
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
104
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
105
|
+
return trimmed.slice(1, -1);
|
|
106
|
+
}
|
|
107
|
+
return trimmed;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Bare string (unquoted)
|
|
111
|
+
return raw;
|
|
112
|
+
}
|
|
113
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
114
|
+
/**
|
|
115
|
+
* Load config.toml and inject mapped values into process.env.
|
|
116
|
+
*
|
|
117
|
+
* - Walks up from `startDir` (default: CWD) to find config.toml
|
|
118
|
+
* - Only injects keys defined in TOML_TO_ENV mapping
|
|
119
|
+
* - Existing env vars are NOT overwritten (env > config.toml)
|
|
120
|
+
* - Array values are joined with commas (e.g. networks)
|
|
121
|
+
*
|
|
122
|
+
* @param startDir - Directory to start searching from (default: process.cwd())
|
|
123
|
+
* @returns Info about what was loaded
|
|
124
|
+
*/
|
|
125
|
+
export function loadConfig(startDir) {
|
|
126
|
+
const configPath = findConfigFile(startDir || process.cwd());
|
|
127
|
+
if (!configPath) {
|
|
128
|
+
return { configPath: null, injectedCount: 0 };
|
|
129
|
+
}
|
|
130
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
131
|
+
const parsed = parseSimpleToml(content);
|
|
132
|
+
let injectedCount = 0;
|
|
133
|
+
for (const [tomlKey, envKey] of Object.entries(TOML_TO_ENV)) {
|
|
134
|
+
// Skip if env var already set (env takes precedence)
|
|
135
|
+
if (process.env[envKey])
|
|
136
|
+
continue;
|
|
137
|
+
const value = parsed[tomlKey];
|
|
138
|
+
if (value === undefined || value === null)
|
|
139
|
+
continue;
|
|
140
|
+
// Convert to string for process.env
|
|
141
|
+
if (Array.isArray(value)) {
|
|
142
|
+
process.env[envKey] = value.join(',');
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
process.env[envKey] = String(value);
|
|
146
|
+
}
|
|
147
|
+
injectedCount++;
|
|
148
|
+
}
|
|
149
|
+
if (injectedCount > 0) {
|
|
150
|
+
console.log(`${TAG} Loaded ${injectedCount} settings from ${configPath}`);
|
|
151
|
+
}
|
|
152
|
+
return { configPath, injectedCount };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Register additional TOML key → env var mappings.
|
|
156
|
+
*
|
|
157
|
+
* Allows agents to extend the default mapping with agent-specific keys
|
|
158
|
+
* before calling loadConfig().
|
|
159
|
+
*/
|
|
160
|
+
export function registerConfigMapping(mappings) {
|
|
161
|
+
Object.assign(TOML_TO_ENV, mappings);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -20,15 +20,25 @@
|
|
|
20
20
|
*
|
|
21
21
|
* @module logger
|
|
22
22
|
*/
|
|
23
|
+
/**
|
|
24
|
+
* Set the minimum log level. Messages below this level are suppressed.
|
|
25
|
+
* Hierarchy: debug < info < warn < error
|
|
26
|
+
*/
|
|
27
|
+
export declare function setLogLevel(level: string): void;
|
|
23
28
|
/**
|
|
24
29
|
* Module name constants for structured logging
|
|
25
30
|
* All use kebab-case for consistency with KĀDI naming conventions
|
|
26
31
|
*/
|
|
27
|
-
export declare
|
|
32
|
+
export declare let MODULE_AGENT: string;
|
|
28
33
|
export declare const MODULE_SLACK_BOT: "slack-bot";
|
|
29
34
|
export declare const MODULE_DISCORD_BOT: "discord-bot";
|
|
30
35
|
export declare const MODULE_TASK_HANDLER: "task-handler";
|
|
31
36
|
export declare const MODULE_TOOLS: "tools";
|
|
37
|
+
/**
|
|
38
|
+
* Set the MODULE_AGENT tag to the agent's ID.
|
|
39
|
+
* Call once at startup so all files importing MODULE_AGENT get the right name.
|
|
40
|
+
*/
|
|
41
|
+
export declare function setAgentTag(name: string): void;
|
|
32
42
|
/**
|
|
33
43
|
* UnrealLogger class for Unreal Engine-style structured logging
|
|
34
44
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;GAGG;AACH,eAAO,IAAI,YAAY,EAAuB,MAAM,CAAC;AACrD,eAAO,MAAM,gBAAgB,EAAG,WAAoB,CAAC;AACrD,eAAO,MAAM,kBAAkB,EAAG,aAAsB,CAAC;AACzD,eAAO,MAAM,mBAAmB,EAAG,cAAuB,CAAC;AAC3D,eAAO,MAAM,YAAY,EAAG,OAAgB,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAoBD;;;;;;;;;;;GAWG;AACH,cAAM,MAAM;IACR;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAkBrB;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAQ5E;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAQ5E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAmBrG;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;CAOhF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -20,15 +20,32 @@
|
|
|
20
20
|
*
|
|
21
21
|
* @module logger
|
|
22
22
|
*/
|
|
23
|
+
// ── Log level filtering ──────────────────────────────────────────────
|
|
24
|
+
const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
25
|
+
let currentLevel = LEVELS.info;
|
|
26
|
+
/**
|
|
27
|
+
* Set the minimum log level. Messages below this level are suppressed.
|
|
28
|
+
* Hierarchy: debug < info < warn < error
|
|
29
|
+
*/
|
|
30
|
+
export function setLogLevel(level) {
|
|
31
|
+
currentLevel = LEVELS[level.toLowerCase()] ?? LEVELS.info;
|
|
32
|
+
}
|
|
23
33
|
/**
|
|
24
34
|
* Module name constants for structured logging
|
|
25
35
|
* All use kebab-case for consistency with KĀDI naming conventions
|
|
26
36
|
*/
|
|
27
|
-
export
|
|
37
|
+
export let MODULE_AGENT = 'template-agent';
|
|
28
38
|
export const MODULE_SLACK_BOT = 'slack-bot';
|
|
29
39
|
export const MODULE_DISCORD_BOT = 'discord-bot';
|
|
30
40
|
export const MODULE_TASK_HANDLER = 'task-handler';
|
|
31
41
|
export const MODULE_TOOLS = 'tools';
|
|
42
|
+
/**
|
|
43
|
+
* Set the MODULE_AGENT tag to the agent's ID.
|
|
44
|
+
* Call once at startup so all files importing MODULE_AGENT get the right name.
|
|
45
|
+
*/
|
|
46
|
+
export function setAgentTag(name) {
|
|
47
|
+
MODULE_AGENT = name;
|
|
48
|
+
}
|
|
32
49
|
/**
|
|
33
50
|
* ANSI Color Codes for Terminal Output
|
|
34
51
|
*
|
|
@@ -123,6 +140,8 @@ class Logger {
|
|
|
123
140
|
* @param data - Optional data to log (will be logged on separate line)
|
|
124
141
|
*/
|
|
125
142
|
info(module, message, elapsedTime, data) {
|
|
143
|
+
if (currentLevel > LEVELS.info)
|
|
144
|
+
return;
|
|
126
145
|
console.log(this.formatMessage(module, 'Info', message, elapsedTime, COLORS.CYAN));
|
|
127
146
|
if (data) {
|
|
128
147
|
console.log(data);
|
|
@@ -139,6 +158,8 @@ class Logger {
|
|
|
139
158
|
* @param data - Optional data to log
|
|
140
159
|
*/
|
|
141
160
|
warn(module, message, elapsedTime, data) {
|
|
161
|
+
if (currentLevel > LEVELS.warn)
|
|
162
|
+
return;
|
|
142
163
|
console.warn(this.formatMessage(module, 'Warning', message, elapsedTime, COLORS.YELLOW));
|
|
143
164
|
if (data) {
|
|
144
165
|
console.warn(data);
|
|
@@ -156,6 +177,8 @@ class Logger {
|
|
|
156
177
|
* @param data - Optional additional data to log
|
|
157
178
|
*/
|
|
158
179
|
error(module, message, elapsedTime, error, data) {
|
|
180
|
+
if (currentLevel > LEVELS.error)
|
|
181
|
+
return;
|
|
159
182
|
console.error(this.formatMessage(module, 'Error', message, elapsedTime, COLORS.RED));
|
|
160
183
|
if (error instanceof Error) {
|
|
161
184
|
if (error.stack) {
|
|
@@ -183,6 +206,8 @@ class Logger {
|
|
|
183
206
|
* @param data - Optional data to log
|
|
184
207
|
*/
|
|
185
208
|
debug(module, message, elapsedTime, data) {
|
|
209
|
+
if (currentLevel > LEVELS.debug)
|
|
210
|
+
return;
|
|
186
211
|
console.log(this.formatMessage(module, 'Debug', message, elapsedTime, COLORS.GRAY));
|
|
187
212
|
if (data) {
|
|
188
213
|
console.log(data);
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform path utilities for WSL/Windows interop.
|
|
3
|
+
*
|
|
4
|
+
* When git worktrees are created on Windows, the `.git` file stores
|
|
5
|
+
* Windows-style paths (e.g. `C:/GitHub/...`). If the agent later runs
|
|
6
|
+
* inside WSL, those paths must be translated to `/mnt/c/GitHub/...`.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Detect whether the current process is running inside WSL.
|
|
10
|
+
* Uses `/proc/version` which contains "microsoft" or "WSL" on WSL distros.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isWsl(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Convert a Windows-style path to a WSL path when running inside WSL.
|
|
15
|
+
*
|
|
16
|
+
* `C:/GitHub/foo` → `/mnt/c/GitHub/foo`
|
|
17
|
+
* `D:\Projects\bar` → `/mnt/d/Projects/bar`
|
|
18
|
+
*
|
|
19
|
+
* If not running in WSL, or the path is already POSIX, returns as-is.
|
|
20
|
+
*/
|
|
21
|
+
export declare function toNativePath(p: string): string;
|
|
22
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;GAGG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAgB/B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAU9C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform path utilities for WSL/Windows interop.
|
|
3
|
+
*
|
|
4
|
+
* When git worktrees are created on Windows, the `.git` file stores
|
|
5
|
+
* Windows-style paths (e.g. `C:/GitHub/...`). If the agent later runs
|
|
6
|
+
* inside WSL, those paths must be translated to `/mnt/c/GitHub/...`.
|
|
7
|
+
*/
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import fs from 'fs';
|
|
10
|
+
/** Cached result — true when running inside WSL. */
|
|
11
|
+
let _isWsl = null;
|
|
12
|
+
/**
|
|
13
|
+
* Detect whether the current process is running inside WSL.
|
|
14
|
+
* Uses `/proc/version` which contains "microsoft" or "WSL" on WSL distros.
|
|
15
|
+
*/
|
|
16
|
+
export function isWsl() {
|
|
17
|
+
if (_isWsl !== null)
|
|
18
|
+
return _isWsl;
|
|
19
|
+
if (os.platform() !== 'linux') {
|
|
20
|
+
_isWsl = false;
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const procVersion = fs.readFileSync('/proc/version', 'utf-8').toLowerCase();
|
|
25
|
+
_isWsl = procVersion.includes('microsoft') || procVersion.includes('wsl');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
_isWsl = false;
|
|
29
|
+
}
|
|
30
|
+
return _isWsl;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert a Windows-style path to a WSL path when running inside WSL.
|
|
34
|
+
*
|
|
35
|
+
* `C:/GitHub/foo` → `/mnt/c/GitHub/foo`
|
|
36
|
+
* `D:\Projects\bar` → `/mnt/d/Projects/bar`
|
|
37
|
+
*
|
|
38
|
+
* If not running in WSL, or the path is already POSIX, returns as-is.
|
|
39
|
+
*/
|
|
40
|
+
export function toNativePath(p) {
|
|
41
|
+
if (!isWsl())
|
|
42
|
+
return p;
|
|
43
|
+
// Match drive letter: C:/ or C:\ (case-insensitive)
|
|
44
|
+
const match = p.match(/^([A-Za-z]):[/\\](.*)/);
|
|
45
|
+
if (!match)
|
|
46
|
+
return p;
|
|
47
|
+
const drive = match[1].toLowerCase();
|
|
48
|
+
const rest = match[2].replace(/\\/g, '/');
|
|
49
|
+
return `/mnt/${drive}/${rest}`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,oDAAoD;AACpD,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAEnC,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,KAAK,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5E,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IAEvB,oDAAoD;IACpD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed config reader for KĀDI agents.
|
|
3
|
+
*
|
|
4
|
+
* Returns a `Config` wrapper around the parsed config.toml with typed
|
|
5
|
+
* accessors that throw on missing or wrong-type values.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const cfg = readConfig();
|
|
9
|
+
* const url = cfg.string('broker.url'); // throws if missing
|
|
10
|
+
* const nets = cfg.strings('broker.networks'); // throws if missing
|
|
11
|
+
* if (cfg.has('broker.remote.url')) { ... } // optional check
|
|
12
|
+
*
|
|
13
|
+
* @module utils/read-config
|
|
14
|
+
*/
|
|
15
|
+
export declare class Config {
|
|
16
|
+
private data;
|
|
17
|
+
readonly path: string;
|
|
18
|
+
constructor(data: Record<string, unknown>, path: string);
|
|
19
|
+
/** Check if a key exists. */
|
|
20
|
+
has(key: string): boolean;
|
|
21
|
+
/** Get raw value. Returns undefined if missing. */
|
|
22
|
+
get(key: string): unknown;
|
|
23
|
+
/** Get a string value. Throws if missing or wrong type. */
|
|
24
|
+
string(key: string): string;
|
|
25
|
+
/** Get a string array. Throws if missing or wrong type. */
|
|
26
|
+
strings(key: string): string[];
|
|
27
|
+
/** Get a boolean. Throws if missing or wrong type. */
|
|
28
|
+
bool(key: string): boolean;
|
|
29
|
+
/** Get a number. Throws if missing or wrong type. */
|
|
30
|
+
number(key: string): number;
|
|
31
|
+
private require;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Walk up from CWD to find config.toml, parse it, return a Config instance.
|
|
35
|
+
* Throws if config.toml is not found.
|
|
36
|
+
*/
|
|
37
|
+
export declare function readConfig(startDir?: string): Config;
|
|
38
|
+
/**
|
|
39
|
+
* Read a specific TOML file by path and return a Config instance.
|
|
40
|
+
* Unlike readConfig(), this does not walk up directories — it reads the exact file.
|
|
41
|
+
*/
|
|
42
|
+
export declare function readConfigFile(filePath: string): Config;
|
|
43
|
+
//# sourceMappingURL=read-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-config.d.ts","sourceRoot":"","sources":["../../src/utils/read-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,qBAAa,MAAM;IACjB,OAAO,CAAC,IAAI,CAA0B;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM;IAKvD,6BAA6B;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,mDAAmD;IACnD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,2DAA2D;IAC3D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAU3B,2DAA2D;IAC3D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAU9B,sDAAsD;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU1B,qDAAqD;IACrD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAY3B,OAAO,CAAC,OAAO;CAShB;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIvD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed config reader for KĀDI agents.
|
|
3
|
+
*
|
|
4
|
+
* Returns a `Config` wrapper around the parsed config.toml with typed
|
|
5
|
+
* accessors that throw on missing or wrong-type values.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const cfg = readConfig();
|
|
9
|
+
* const url = cfg.string('broker.url'); // throws if missing
|
|
10
|
+
* const nets = cfg.strings('broker.networks'); // throws if missing
|
|
11
|
+
* if (cfg.has('broker.remote.url')) { ... } // optional check
|
|
12
|
+
*
|
|
13
|
+
* @module utils/read-config
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { findConfigFile, parseSimpleToml } from './config.js';
|
|
17
|
+
// ── Config class ─────────────────────────────────────────────────────
|
|
18
|
+
export class Config {
|
|
19
|
+
data;
|
|
20
|
+
path;
|
|
21
|
+
constructor(data, path) {
|
|
22
|
+
this.data = data;
|
|
23
|
+
this.path = path;
|
|
24
|
+
}
|
|
25
|
+
/** Check if a key exists. */
|
|
26
|
+
has(key) {
|
|
27
|
+
return this.data[key] !== undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Get raw value. Returns undefined if missing. */
|
|
30
|
+
get(key) {
|
|
31
|
+
return this.data[key];
|
|
32
|
+
}
|
|
33
|
+
/** Get a string value. Throws if missing or wrong type. */
|
|
34
|
+
string(key) {
|
|
35
|
+
const value = this.require(key);
|
|
36
|
+
if (typeof value !== 'string') {
|
|
37
|
+
throw new Error(`Config key '${key}' in ${this.path} is ${typeof value}, expected string`);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/** Get a string array. Throws if missing or wrong type. */
|
|
42
|
+
strings(key) {
|
|
43
|
+
const value = this.require(key);
|
|
44
|
+
if (!Array.isArray(value)) {
|
|
45
|
+
throw new Error(`Config key '${key}' in ${this.path} is ${typeof value}, expected string[]`);
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
/** Get a boolean. Throws if missing or wrong type. */
|
|
50
|
+
bool(key) {
|
|
51
|
+
const value = this.require(key);
|
|
52
|
+
if (typeof value !== 'boolean') {
|
|
53
|
+
throw new Error(`Config key '${key}' in ${this.path} is ${typeof value}, expected boolean`);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
/** Get a number. Throws if missing or wrong type. */
|
|
58
|
+
number(key) {
|
|
59
|
+
const value = this.require(key);
|
|
60
|
+
if (typeof value !== 'number') {
|
|
61
|
+
throw new Error(`Config key '${key}' in ${this.path} is ${typeof value}, expected number`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
// ── Internal ─────────────────────────────────────────────────────
|
|
66
|
+
require(key) {
|
|
67
|
+
const value = this.data[key];
|
|
68
|
+
if (value === undefined) {
|
|
69
|
+
throw new Error(`Missing required config key '${key}' in ${this.path}`);
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Walk up from CWD to find config.toml, parse it, return a Config instance.
|
|
77
|
+
* Throws if config.toml is not found.
|
|
78
|
+
*/
|
|
79
|
+
export function readConfig(startDir) {
|
|
80
|
+
const configPath = findConfigFile(startDir || process.cwd());
|
|
81
|
+
if (!configPath) {
|
|
82
|
+
throw new Error(`config.toml not found. Searched upward from: ${startDir || process.cwd()}`);
|
|
83
|
+
}
|
|
84
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
85
|
+
const data = parseSimpleToml(content);
|
|
86
|
+
return new Config(data, configPath);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Read a specific TOML file by path and return a Config instance.
|
|
90
|
+
* Unlike readConfig(), this does not walk up directories — it reads the exact file.
|
|
91
|
+
*/
|
|
92
|
+
export function readConfigFile(filePath) {
|
|
93
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
94
|
+
const data = parseSimpleToml(content);
|
|
95
|
+
return new Config(data, filePath);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=read-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-config.js","sourceRoot":"","sources":["../../src/utils/read-config.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/timer.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/utils/timer.js
CHANGED
|
File without changes
|
package/dist/utils/timer.js.map
CHANGED
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared vault credential loader for KĀDI agents.
|
|
3
|
+
*
|
|
4
|
+
* Loads credentials from one or more vaults specified in config.toml:
|
|
5
|
+
* [secrets]
|
|
6
|
+
* VAULTS = ["anthropic", "model-manager"]
|
|
7
|
+
* KEYS = ["ANTHROPIC_API_KEY", "MODEL_MANAGER_BASE_URL", "MODEL_MANAGER_API_KEY"]
|
|
8
|
+
*
|
|
9
|
+
* Falls back to the hardcoded defaults if config.toml is missing or
|
|
10
|
+
* has no [secrets] section.
|
|
11
|
+
*
|
|
12
|
+
* @module utils/vault
|
|
13
|
+
*/
|
|
14
|
+
export type VaultCredentials = Record<string, string>;
|
|
15
|
+
/** @deprecated Use VaultCredentials instead */
|
|
16
|
+
export type ModelManagerCredentials = VaultCredentials;
|
|
17
|
+
/**
|
|
18
|
+
* Load credentials from configured vaults.
|
|
19
|
+
*
|
|
20
|
+
* Reads [secrets] VAULTS and KEYS from config.toml.
|
|
21
|
+
* For each key, tries each vault in order until found.
|
|
22
|
+
*
|
|
23
|
+
* Returns empty object if vault or secret-ability is unavailable
|
|
24
|
+
* (graceful degradation).
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadVaultCredentials(): Promise<VaultCredentials>;
|
|
27
|
+
/** @deprecated Use loadVaultCredentials instead */
|
|
28
|
+
export declare const loadModelManagerCredentials: typeof loadVaultCredentials;
|
|
29
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/utils/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD,+CAA+C;AAC/C,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AAIvD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAkDtE;AAED,mDAAmD;AACnD,eAAO,MAAM,2BAA2B,6BAAuB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared vault credential loader for KĀDI agents.
|
|
3
|
+
*
|
|
4
|
+
* Loads credentials from one or more vaults specified in config.toml:
|
|
5
|
+
* [secrets]
|
|
6
|
+
* VAULTS = ["anthropic", "model-manager"]
|
|
7
|
+
* KEYS = ["ANTHROPIC_API_KEY", "MODEL_MANAGER_BASE_URL", "MODEL_MANAGER_API_KEY"]
|
|
8
|
+
*
|
|
9
|
+
* Falls back to the hardcoded defaults if config.toml is missing or
|
|
10
|
+
* has no [secrets] section.
|
|
11
|
+
*
|
|
12
|
+
* @module utils/vault
|
|
13
|
+
*/
|
|
14
|
+
import { readConfig } from './read-config.js';
|
|
15
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
16
|
+
const DEFAULT_VAULTS = ['model-manager'];
|
|
17
|
+
const DEFAULT_KEYS = [
|
|
18
|
+
'MODEL_MANAGER_BASE_URL',
|
|
19
|
+
'MODEL_MANAGER_API_KEY',
|
|
20
|
+
'ANTHROPIC_API_KEY',
|
|
21
|
+
];
|
|
22
|
+
const TAG = '[vault]';
|
|
23
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Load credentials from configured vaults.
|
|
26
|
+
*
|
|
27
|
+
* Reads [secrets] VAULTS and KEYS from config.toml.
|
|
28
|
+
* For each key, tries each vault in order until found.
|
|
29
|
+
*
|
|
30
|
+
* Returns empty object if vault or secret-ability is unavailable
|
|
31
|
+
* (graceful degradation).
|
|
32
|
+
*/
|
|
33
|
+
export async function loadVaultCredentials() {
|
|
34
|
+
const credentials = {};
|
|
35
|
+
// Resolve vault names and keys from config.toml
|
|
36
|
+
let vaultNames;
|
|
37
|
+
let vaultKeys;
|
|
38
|
+
try {
|
|
39
|
+
const cfg = readConfig();
|
|
40
|
+
vaultNames = cfg.has('secrets.VAULTS') ? cfg.strings('secrets.VAULTS') : DEFAULT_VAULTS;
|
|
41
|
+
vaultKeys = cfg.has('secrets.KEYS') ? cfg.strings('secrets.KEYS') : DEFAULT_KEYS;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
vaultNames = DEFAULT_VAULTS;
|
|
45
|
+
vaultKeys = DEFAULT_KEYS;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const { KadiClient } = await import('@kadi.build/core');
|
|
49
|
+
const tmpClient = new KadiClient({ name: 'vault-loader', version: '1.0.0' });
|
|
50
|
+
const secrets = await tmpClient.loadNative('secret-ability');
|
|
51
|
+
// For each key, try each vault in order until found
|
|
52
|
+
for (const key of vaultKeys) {
|
|
53
|
+
for (const vault of vaultNames) {
|
|
54
|
+
try {
|
|
55
|
+
const result = await secrets.invoke('get', { vault, key });
|
|
56
|
+
if (result?.value) {
|
|
57
|
+
credentials[key] = result.value;
|
|
58
|
+
break; // Found — skip remaining vaults for this key
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Key not in this vault — try next
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await secrets.disconnect();
|
|
67
|
+
const loaded = Object.keys(credentials).length;
|
|
68
|
+
if (loaded > 0) {
|
|
69
|
+
console.log(`${TAG} Loaded ${loaded}/${vaultKeys.length} credentials from vaults: ${vaultNames.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.warn(`${TAG} secret-ability unavailable — using env vars only (${err?.message ?? err})`);
|
|
74
|
+
}
|
|
75
|
+
return credentials;
|
|
76
|
+
}
|
|
77
|
+
/** @deprecated Use loadVaultCredentials instead */
|
|
78
|
+
export const loadModelManagerCredentials = loadVaultCredentials;
|
|
79
|
+
//# sourceMappingURL=vault.js.map
|