@qodo/sdk 0.1.0
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/LICENSE +118 -0
- package/README.md +121 -0
- package/dist/api/agent.d.ts +69 -0
- package/dist/api/agent.d.ts.map +1 -0
- package/dist/api/agent.js +1034 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/analytics.d.ts +43 -0
- package/dist/api/analytics.d.ts.map +1 -0
- package/dist/api/analytics.js +163 -0
- package/dist/api/analytics.js.map +1 -0
- package/dist/api/http.d.ts +5 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +59 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/taskTracking.d.ts +54 -0
- package/dist/api/taskTracking.d.ts.map +1 -0
- package/dist/api/taskTracking.js +208 -0
- package/dist/api/taskTracking.js.map +1 -0
- package/dist/api/types.d.ts +92 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/utils.d.ts +8 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/api/utils.js +54 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/websocket.d.ts +74 -0
- package/dist/api/websocket.d.ts.map +1 -0
- package/dist/api/websocket.js +685 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/auth/index.d.ts +25 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +85 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/clients/index.d.ts +8 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +7 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/info/InfoClient.d.ts +37 -0
- package/dist/clients/info/InfoClient.d.ts.map +1 -0
- package/dist/clients/info/InfoClient.js +69 -0
- package/dist/clients/info/InfoClient.js.map +1 -0
- package/dist/clients/info/index.d.ts +4 -0
- package/dist/clients/info/index.d.ts.map +1 -0
- package/dist/clients/info/index.js +2 -0
- package/dist/clients/info/index.js.map +1 -0
- package/dist/clients/info/types.d.ts +21 -0
- package/dist/clients/info/types.d.ts.map +1 -0
- package/dist/clients/info/types.js +2 -0
- package/dist/clients/info/types.js.map +1 -0
- package/dist/clients/sessions/SessionsClient.d.ts +34 -0
- package/dist/clients/sessions/SessionsClient.d.ts.map +1 -0
- package/dist/clients/sessions/SessionsClient.js +71 -0
- package/dist/clients/sessions/SessionsClient.js.map +1 -0
- package/dist/clients/sessions/index.d.ts +4 -0
- package/dist/clients/sessions/index.d.ts.map +1 -0
- package/dist/clients/sessions/index.js +2 -0
- package/dist/clients/sessions/index.js.map +1 -0
- package/dist/clients/sessions/types.d.ts +20 -0
- package/dist/clients/sessions/types.d.ts.map +1 -0
- package/dist/clients/sessions/types.js +2 -0
- package/dist/clients/sessions/types.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +43 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +472 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/urlConfig.d.ts +15 -0
- package/dist/config/urlConfig.d.ts.map +1 -0
- package/dist/config/urlConfig.js +75 -0
- package/dist/config/urlConfig.js.map +1 -0
- package/dist/constants/errors.d.ts +2 -0
- package/dist/constants/errors.d.ts.map +1 -0
- package/dist/constants/errors.js +2 -0
- package/dist/constants/errors.js.map +1 -0
- package/dist/constants/index.d.ts +7 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +11 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/tools.d.ts +4 -0
- package/dist/constants/tools.d.ts.map +1 -0
- package/dist/constants/tools.js +4 -0
- package/dist/constants/tools.js.map +1 -0
- package/dist/constants/versions.d.ts +2 -0
- package/dist/constants/versions.d.ts.map +1 -0
- package/dist/constants/versions.js +2 -0
- package/dist/constants/versions.js.map +1 -0
- package/dist/context/buildUserContext.d.ts +18 -0
- package/dist/context/buildUserContext.d.ts.map +1 -0
- package/dist/context/buildUserContext.js +34 -0
- package/dist/context/buildUserContext.js.map +1 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/messageManager.d.ts +42 -0
- package/dist/context/messageManager.d.ts.map +1 -0
- package/dist/context/messageManager.js +322 -0
- package/dist/context/messageManager.js.map +1 -0
- package/dist/context/taskFocus.d.ts +2 -0
- package/dist/context/taskFocus.d.ts.map +1 -0
- package/dist/context/taskFocus.js +26 -0
- package/dist/context/taskFocus.js.map +1 -0
- package/dist/context/userInput.d.ts +3 -0
- package/dist/context/userInput.d.ts.map +1 -0
- package/dist/context/userInput.js +20 -0
- package/dist/context/userInput.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/MCPManager.d.ts +125 -0
- package/dist/mcp/MCPManager.d.ts.map +1 -0
- package/dist/mcp/MCPManager.js +616 -0
- package/dist/mcp/MCPManager.js.map +1 -0
- package/dist/mcp/approvedTools.d.ts +4 -0
- package/dist/mcp/approvedTools.d.ts.map +1 -0
- package/dist/mcp/approvedTools.js +19 -0
- package/dist/mcp/approvedTools.js.map +1 -0
- package/dist/mcp/baseServer.d.ts +75 -0
- package/dist/mcp/baseServer.d.ts.map +1 -0
- package/dist/mcp/baseServer.js +107 -0
- package/dist/mcp/baseServer.js.map +1 -0
- package/dist/mcp/builtinServers.d.ts +15 -0
- package/dist/mcp/builtinServers.d.ts.map +1 -0
- package/dist/mcp/builtinServers.js +155 -0
- package/dist/mcp/builtinServers.js.map +1 -0
- package/dist/mcp/dynamicBEServer.d.ts +20 -0
- package/dist/mcp/dynamicBEServer.d.ts.map +1 -0
- package/dist/mcp/dynamicBEServer.js +52 -0
- package/dist/mcp/dynamicBEServer.js.map +1 -0
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +24 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcpInitialization.d.ts +2 -0
- package/dist/mcp/mcpInitialization.d.ts.map +1 -0
- package/dist/mcp/mcpInitialization.js +56 -0
- package/dist/mcp/mcpInitialization.js.map +1 -0
- package/dist/mcp/servers/filesystem.d.ts +75 -0
- package/dist/mcp/servers/filesystem.d.ts.map +1 -0
- package/dist/mcp/servers/filesystem.js +992 -0
- package/dist/mcp/servers/filesystem.js.map +1 -0
- package/dist/mcp/servers/gerrit.d.ts +19 -0
- package/dist/mcp/servers/gerrit.d.ts.map +1 -0
- package/dist/mcp/servers/gerrit.js +515 -0
- package/dist/mcp/servers/gerrit.js.map +1 -0
- package/dist/mcp/servers/git.d.ts +18 -0
- package/dist/mcp/servers/git.d.ts.map +1 -0
- package/dist/mcp/servers/git.js +441 -0
- package/dist/mcp/servers/git.js.map +1 -0
- package/dist/mcp/servers/ripgrep.d.ts +34 -0
- package/dist/mcp/servers/ripgrep.d.ts.map +1 -0
- package/dist/mcp/servers/ripgrep.js +517 -0
- package/dist/mcp/servers/ripgrep.js.map +1 -0
- package/dist/mcp/servers/shell.d.ts +20 -0
- package/dist/mcp/servers/shell.d.ts.map +1 -0
- package/dist/mcp/servers/shell.js +603 -0
- package/dist/mcp/servers/shell.js.map +1 -0
- package/dist/mcp/serversRegistry.d.ts +55 -0
- package/dist/mcp/serversRegistry.d.ts.map +1 -0
- package/dist/mcp/serversRegistry.js +410 -0
- package/dist/mcp/serversRegistry.js.map +1 -0
- package/dist/mcp/toolProcessor.d.ts +42 -0
- package/dist/mcp/toolProcessor.d.ts.map +1 -0
- package/dist/mcp/toolProcessor.js +200 -0
- package/dist/mcp/toolProcessor.js.map +1 -0
- package/dist/mcp/types.d.ts +29 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/parser/index.d.ts +72 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +967 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/types.d.ts +153 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +6 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/parser/utils.d.ts +18 -0
- package/dist/parser/utils.d.ts.map +1 -0
- package/dist/parser/utils.js +64 -0
- package/dist/parser/utils.js.map +1 -0
- package/dist/sdk/QodoSDK.d.ts +152 -0
- package/dist/sdk/QodoSDK.d.ts.map +1 -0
- package/dist/sdk/QodoSDK.js +786 -0
- package/dist/sdk/QodoSDK.js.map +1 -0
- package/dist/sdk/bootstrap.d.ts +16 -0
- package/dist/sdk/bootstrap.d.ts.map +1 -0
- package/dist/sdk/bootstrap.js +21 -0
- package/dist/sdk/bootstrap.js.map +1 -0
- package/dist/sdk/builders.d.ts +54 -0
- package/dist/sdk/builders.d.ts.map +1 -0
- package/dist/sdk/builders.js +117 -0
- package/dist/sdk/builders.js.map +1 -0
- package/dist/sdk/defaults.d.ts +11 -0
- package/dist/sdk/defaults.d.ts.map +1 -0
- package/dist/sdk/defaults.js +39 -0
- package/dist/sdk/defaults.js.map +1 -0
- package/dist/sdk/discovery.d.ts +2 -0
- package/dist/sdk/discovery.d.ts.map +1 -0
- package/dist/sdk/discovery.js +25 -0
- package/dist/sdk/discovery.js.map +1 -0
- package/dist/sdk/events.d.ts +168 -0
- package/dist/sdk/events.d.ts.map +1 -0
- package/dist/sdk/events.js +52 -0
- package/dist/sdk/events.js.map +1 -0
- package/dist/sdk/index.d.ts +17 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +17 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/runner/AgentRunner.d.ts +22 -0
- package/dist/sdk/runner/AgentRunner.d.ts.map +1 -0
- package/dist/sdk/runner/AgentRunner.js +222 -0
- package/dist/sdk/runner/AgentRunner.js.map +1 -0
- package/dist/sdk/runner/finalize.d.ts +9 -0
- package/dist/sdk/runner/finalize.d.ts.map +1 -0
- package/dist/sdk/runner/finalize.js +115 -0
- package/dist/sdk/runner/finalize.js.map +1 -0
- package/dist/sdk/runner/formats.d.ts +7 -0
- package/dist/sdk/runner/formats.d.ts.map +1 -0
- package/dist/sdk/runner/formats.js +91 -0
- package/dist/sdk/runner/formats.js.map +1 -0
- package/dist/sdk/runner/index.d.ts +9 -0
- package/dist/sdk/runner/index.d.ts.map +1 -0
- package/dist/sdk/runner/index.js +9 -0
- package/dist/sdk/runner/index.js.map +1 -0
- package/dist/sdk/runner/progress.d.ts +3 -0
- package/dist/sdk/runner/progress.d.ts.map +1 -0
- package/dist/sdk/runner/progress.js +16 -0
- package/dist/sdk/runner/progress.js.map +1 -0
- package/dist/sdk/schemas.d.ts +50 -0
- package/dist/sdk/schemas.d.ts.map +1 -0
- package/dist/sdk/schemas.js +145 -0
- package/dist/sdk/schemas.js.map +1 -0
- package/dist/session/SessionContext.d.ts +86 -0
- package/dist/session/SessionContext.d.ts.map +1 -0
- package/dist/session/SessionContext.js +395 -0
- package/dist/session/SessionContext.js.map +1 -0
- package/dist/session/environment.d.ts +42 -0
- package/dist/session/environment.d.ts.map +1 -0
- package/dist/session/environment.js +27 -0
- package/dist/session/environment.js.map +1 -0
- package/dist/session/history.d.ts +3 -0
- package/dist/session/history.d.ts.map +1 -0
- package/dist/session/history.js +67 -0
- package/dist/session/history.js.map +1 -0
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +9 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/serverData.d.ts +38 -0
- package/dist/session/serverData.d.ts.map +1 -0
- package/dist/session/serverData.js +241 -0
- package/dist/session/serverData.js.map +1 -0
- package/dist/tracking/Tracker.d.ts +55 -0
- package/dist/tracking/Tracker.d.ts.map +1 -0
- package/dist/tracking/Tracker.js +217 -0
- package/dist/tracking/Tracker.js.map +1 -0
- package/dist/tracking/index.d.ts +8 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/schemas.d.ts +292 -0
- package/dist/tracking/schemas.d.ts.map +1 -0
- package/dist/tracking/schemas.js +91 -0
- package/dist/tracking/schemas.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/extractSetFlags.d.ts +6 -0
- package/dist/utils/extractSetFlags.d.ts.map +1 -0
- package/dist/utils/extractSetFlags.js +16 -0
- package/dist/utils/extractSetFlags.js.map +1 -0
- package/dist/utils/formatTimeAgo.d.ts +2 -0
- package/dist/utils/formatTimeAgo.d.ts.map +1 -0
- package/dist/utils/formatTimeAgo.js +20 -0
- package/dist/utils/formatTimeAgo.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/machineId.d.ts +14 -0
- package/dist/utils/machineId.d.ts.map +1 -0
- package/dist/utils/machineId.js +66 -0
- package/dist/utils/machineId.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +22 -0
- package/dist/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/pathUtils.js +54 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
import { loadConfigFromFile, loadConfigFromString, normalizeConfigObject, validateCommandArgs, validateConfig, validateMode } from "../parser/index.js";
|
|
4
|
+
import { transformOutputSchema } from "../parser/utils.js";
|
|
5
|
+
import fssync from 'fs';
|
|
6
|
+
import toml from 'toml';
|
|
7
|
+
import * as yaml from 'yaml';
|
|
8
|
+
import { isUrl } from './urlConfig.js';
|
|
9
|
+
import { getCurrentEnvironment, getGlobalEnvironment } from '../session/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Detects the configuration file format based on file extension
|
|
12
|
+
*/
|
|
13
|
+
function detectConfigFormat(filePath) {
|
|
14
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
15
|
+
if (ext === '.yaml' || ext === '.yml') {
|
|
16
|
+
return 'yaml';
|
|
17
|
+
}
|
|
18
|
+
return 'toml'; // Default to TOML for backward compatibility
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parses a configuration string based on format
|
|
22
|
+
*/
|
|
23
|
+
function parseConfigByFormat(configString, format) {
|
|
24
|
+
try {
|
|
25
|
+
if (format === 'yaml') {
|
|
26
|
+
return yaml.parse(configString);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return toml.parse(configString);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw new Error(`Failed to parse ${format.toUpperCase()} configuration: ${error.message}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// --- AGENT IMPORTS UTILITY ---
|
|
37
|
+
export function getImportedAgents(agentConfigPath) {
|
|
38
|
+
const cwd = process.cwd();
|
|
39
|
+
// Try to find agent config file (TOML or YAML)
|
|
40
|
+
let filePath = agentConfigPath;
|
|
41
|
+
if (!filePath) {
|
|
42
|
+
// Check for agent.toml first (backward compatibility)
|
|
43
|
+
if (fssync.existsSync(path.join(cwd, 'agent.toml'))) {
|
|
44
|
+
filePath = path.join(cwd, 'agent.toml');
|
|
45
|
+
}
|
|
46
|
+
else if (fssync.existsSync(path.join(cwd, 'agent.yaml'))) {
|
|
47
|
+
filePath = path.join(cwd, 'agent.yaml');
|
|
48
|
+
}
|
|
49
|
+
else if (fssync.existsSync(path.join(cwd, 'agent.yml'))) {
|
|
50
|
+
filePath = path.join(cwd, 'agent.yml');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!fssync.existsSync(filePath))
|
|
57
|
+
return [];
|
|
58
|
+
const content = fssync.readFileSync(filePath, 'utf-8');
|
|
59
|
+
const format = detectConfigFormat(filePath);
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = parseConfigByFormat(content, format);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const imports = parsed.imports || [];
|
|
68
|
+
// Extract agent names and config paths from "agents/NAME.toml" or "agents/NAME.yaml"
|
|
69
|
+
return imports
|
|
70
|
+
.map((imp) => {
|
|
71
|
+
const tomlMatch = imp.match(/agents\/(.+)\.toml/);
|
|
72
|
+
const yamlMatch = imp.match(/agents\/(.+)\.(yaml|yml)/);
|
|
73
|
+
const match = tomlMatch || yamlMatch;
|
|
74
|
+
return match ? { name: match[1], configPath: path.join(cwd, imp) } : null;
|
|
75
|
+
})
|
|
76
|
+
.filter(Boolean);
|
|
77
|
+
}
|
|
78
|
+
export class ConfigManager {
|
|
79
|
+
// NOTE: We no longer rely on the static instance directly; instead, we
|
|
80
|
+
// store the active instance on the current EnvironmentServices. The static
|
|
81
|
+
// property is kept only as a fallback for very early global initialization
|
|
82
|
+
// before AsyncLocalStorage is in play.
|
|
83
|
+
static instance;
|
|
84
|
+
agentConfigPath;
|
|
85
|
+
isExplicitAgentFile;
|
|
86
|
+
config;
|
|
87
|
+
validationResults = {
|
|
88
|
+
valid: true, errors: []
|
|
89
|
+
};
|
|
90
|
+
constructor(agentConfigPath, isFileContent = false) {
|
|
91
|
+
this.agentConfigPath = agentConfigPath;
|
|
92
|
+
this.isExplicitAgentFile = isFileContent || !!agentConfigPath;
|
|
93
|
+
}
|
|
94
|
+
static async init(agentConfig, isFileContent = false) {
|
|
95
|
+
const env = getCurrentEnvironment();
|
|
96
|
+
const globalEnv = getGlobalEnvironment();
|
|
97
|
+
// For non-global environments (e.g. in-process SDK clients), keep a
|
|
98
|
+
// completely independent ConfigManager instance per environment so that
|
|
99
|
+
// different QodoClient instances can load different agent configs in the
|
|
100
|
+
// same Node process without stepping on each other.
|
|
101
|
+
if (env !== globalEnv) {
|
|
102
|
+
let instance = env.configManager;
|
|
103
|
+
if (!instance) {
|
|
104
|
+
const pathArg = !isFileContent && typeof agentConfig === 'string' ? agentConfig : undefined;
|
|
105
|
+
instance = new ConfigManager(pathArg, isFileContent);
|
|
106
|
+
env.configManager = instance;
|
|
107
|
+
}
|
|
108
|
+
await instance.loadConfig(isFileContent ? agentConfig : undefined);
|
|
109
|
+
return instance;
|
|
110
|
+
}
|
|
111
|
+
// Global (CLI/webapp) path: preserve legacy singleton behavior so
|
|
112
|
+
// existing apps continue to see a single shared ConfigManager.
|
|
113
|
+
let instance = ConfigManager.instance;
|
|
114
|
+
if (!instance) {
|
|
115
|
+
const pathArg = !isFileContent && typeof agentConfig === 'string' ? agentConfig : undefined;
|
|
116
|
+
instance = new ConfigManager(pathArg, isFileContent);
|
|
117
|
+
ConfigManager.instance = instance;
|
|
118
|
+
if (!globalEnv.configManager) {
|
|
119
|
+
globalEnv.configManager = instance;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
await instance.loadConfig(isFileContent ? agentConfig : undefined);
|
|
123
|
+
return instance;
|
|
124
|
+
}
|
|
125
|
+
static getInstance() {
|
|
126
|
+
const env = getCurrentEnvironment();
|
|
127
|
+
const globalEnv = getGlobalEnvironment();
|
|
128
|
+
// Non-global environments must have been initialized explicitly via
|
|
129
|
+
// ConfigManager.init() under their AsyncLocalStorage context.
|
|
130
|
+
if (env !== globalEnv) {
|
|
131
|
+
const instance = env.configManager;
|
|
132
|
+
if (!instance) {
|
|
133
|
+
throw new Error("ConfigManager not initialized for this environment. Call ConfigManager.init() first");
|
|
134
|
+
}
|
|
135
|
+
return instance;
|
|
136
|
+
}
|
|
137
|
+
if (!ConfigManager.instance) {
|
|
138
|
+
throw new Error("ConfigManager not initialized. Call ConfigManager.init() first");
|
|
139
|
+
}
|
|
140
|
+
return ConfigManager.instance;
|
|
141
|
+
}
|
|
142
|
+
hasConfig() {
|
|
143
|
+
return !!this.config;
|
|
144
|
+
}
|
|
145
|
+
hasExplicitAgentFile() {
|
|
146
|
+
return this.isExplicitAgentFile;
|
|
147
|
+
}
|
|
148
|
+
validateConfig(commandName, customArgs, shouldValidateArgs = true) {
|
|
149
|
+
if (!this.config || !this.config.commands || Object.keys(this.config.commands).length === 0 || !commandName) {
|
|
150
|
+
return this.validationResults;
|
|
151
|
+
}
|
|
152
|
+
this.validationResults = validateConfig(this.config, commandName);
|
|
153
|
+
// If the config is invalid or no custom args to validate, return current results
|
|
154
|
+
if (!this.validationResults.valid || !customArgs) {
|
|
155
|
+
return this.validationResults;
|
|
156
|
+
}
|
|
157
|
+
// Now validate the command arguments
|
|
158
|
+
if (!this.config.commands[commandName]) {
|
|
159
|
+
return this.validationResults;
|
|
160
|
+
}
|
|
161
|
+
if (shouldValidateArgs) {
|
|
162
|
+
const argsValidation = validateCommandArgs(this.config.commands[commandName], customArgs);
|
|
163
|
+
// Merge the validation results
|
|
164
|
+
if (!argsValidation.valid) {
|
|
165
|
+
this.validationResults = {
|
|
166
|
+
valid: false,
|
|
167
|
+
errors: [
|
|
168
|
+
...this.validationResults.errors,
|
|
169
|
+
...argsValidation.errors
|
|
170
|
+
]
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return this.validationResults;
|
|
175
|
+
}
|
|
176
|
+
async findNearestAgentConfig() {
|
|
177
|
+
// Start with the current working directory
|
|
178
|
+
let currentDir = process.cwd();
|
|
179
|
+
const rootDir = path.parse(currentDir).root;
|
|
180
|
+
// Keep traversing up until we reach the root directory
|
|
181
|
+
while (currentDir !== rootDir) {
|
|
182
|
+
// Check for agent config files in order of preference: .toml, .yaml, .yml
|
|
183
|
+
const configPaths = [
|
|
184
|
+
path.join(currentDir, 'agent.toml'),
|
|
185
|
+
path.join(currentDir, 'agent.yaml'),
|
|
186
|
+
path.join(currentDir, 'agent.yml')
|
|
187
|
+
];
|
|
188
|
+
for (const configPath of configPaths) {
|
|
189
|
+
try {
|
|
190
|
+
// Check if the file exists and is readable
|
|
191
|
+
await fs.access(configPath, fs.constants.R_OK);
|
|
192
|
+
// If we reach here, the file exists and is readable
|
|
193
|
+
return configPath;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// No config file found in current directory, move up to parent directory
|
|
199
|
+
currentDir = path.dirname(currentDir);
|
|
200
|
+
}
|
|
201
|
+
// Check the root directory as our final attempt
|
|
202
|
+
const rootConfigPaths = [
|
|
203
|
+
path.join(rootDir, 'agent.toml'),
|
|
204
|
+
path.join(rootDir, 'agent.yaml'),
|
|
205
|
+
path.join(rootDir, 'agent.yml')
|
|
206
|
+
];
|
|
207
|
+
for (const rootConfigPath of rootConfigPaths) {
|
|
208
|
+
try {
|
|
209
|
+
await fs.access(rootConfigPath, fs.constants.R_OK);
|
|
210
|
+
return rootConfigPath;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// No agent config file found in any parent directory
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
async getAgentConfigPath() {
|
|
219
|
+
if (this.agentConfigPath) {
|
|
220
|
+
// For URLs, we'll validate it can be loaded when loadConfig is called
|
|
221
|
+
if (isUrl(this.agentConfigPath)) {
|
|
222
|
+
console.log(`Using agent config from URL: ${this.agentConfigPath}`);
|
|
223
|
+
return this.agentConfigPath;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// Handle local file path
|
|
227
|
+
try {
|
|
228
|
+
await fs.access(this.agentConfigPath, fs.constants.R_OK);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
console.error(`Error: Agent config file not found or not readable: ${this.agentConfigPath}`);
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
return this.agentConfigPath;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Find the nearest agent.toml file to the current working directory
|
|
238
|
+
const agentConfigPath = await this.findNearestAgentConfig();
|
|
239
|
+
if (!agentConfigPath) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
return agentConfigPath;
|
|
243
|
+
}
|
|
244
|
+
async loadConfig(agentContentOrObject) {
|
|
245
|
+
const agentConfigPath = await this.getAgentConfigPath();
|
|
246
|
+
if (!agentContentOrObject && !agentConfigPath) {
|
|
247
|
+
console.warn("No agent configuration file (agent.toml, agent.yaml, or agent.yml) found in the current directory or any parent directory.");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (agentContentOrObject) {
|
|
251
|
+
if (typeof agentContentOrObject === 'string') {
|
|
252
|
+
// Load from string content
|
|
253
|
+
this.config = await loadConfigFromString(agentContentOrObject);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Normalize provided object (same normalization as file/string parsing)
|
|
257
|
+
// IMPORTANT: normalizeConfigObject clones the input, so we do not mutate the user's object.
|
|
258
|
+
this.config = normalizeConfigObject(agentContentOrObject);
|
|
259
|
+
// Ensure default execution strategy for SDK object path is 'act' if not provided
|
|
260
|
+
if (!this.config.execution_strategy) {
|
|
261
|
+
this.config.execution_strategy = 'act';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (agentConfigPath) {
|
|
266
|
+
// Load from file
|
|
267
|
+
this.config = await loadConfigFromFile(agentConfigPath);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
getMCPServers() {
|
|
271
|
+
if (!this.config) {
|
|
272
|
+
return {};
|
|
273
|
+
}
|
|
274
|
+
return this.config.mcpServers || {};
|
|
275
|
+
}
|
|
276
|
+
getGeneralInstructions() {
|
|
277
|
+
if (!this.config) {
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
return this.config.instructions;
|
|
281
|
+
}
|
|
282
|
+
getSystemPrompt() {
|
|
283
|
+
if (!this.config) {
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
return this.config.system_prompt;
|
|
287
|
+
}
|
|
288
|
+
listCommands() {
|
|
289
|
+
if (!this.config) {
|
|
290
|
+
return [];
|
|
291
|
+
}
|
|
292
|
+
if (!this.validationResults.valid) {
|
|
293
|
+
throw new Error("Config is invalid");
|
|
294
|
+
}
|
|
295
|
+
if (!this.config.commands) {
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
return Object.keys(this.config.commands);
|
|
299
|
+
}
|
|
300
|
+
getSingleCommand() {
|
|
301
|
+
const commands = this.listCommands();
|
|
302
|
+
return commands.length === 1 ? commands[0] : null;
|
|
303
|
+
}
|
|
304
|
+
getValidationResult() {
|
|
305
|
+
return this.validationResults;
|
|
306
|
+
}
|
|
307
|
+
// Expose raw merged config when needed for read-only checks (e.g., disable_mcp)
|
|
308
|
+
getRawConfig() {
|
|
309
|
+
return this.config;
|
|
310
|
+
}
|
|
311
|
+
// New: list modes
|
|
312
|
+
listModes() {
|
|
313
|
+
if (!this.config?.modes)
|
|
314
|
+
return [];
|
|
315
|
+
return Object.keys(this.config.modes);
|
|
316
|
+
}
|
|
317
|
+
// New: fetch a mode with inheritance applied (top-level fallbacks)
|
|
318
|
+
getModeConfig(modeName) {
|
|
319
|
+
const mode = this.config?.modes?.[modeName];
|
|
320
|
+
if (!mode)
|
|
321
|
+
return undefined;
|
|
322
|
+
// Clone to avoid mutating original
|
|
323
|
+
const merged = JSON.parse(JSON.stringify(mode));
|
|
324
|
+
// Inherit top-level defaults when missing
|
|
325
|
+
if (this.config?.model && merged.model == null)
|
|
326
|
+
merged.model = this.config.model;
|
|
327
|
+
if (this.config?.available_tools && merged.available_tools == null)
|
|
328
|
+
merged.available_tools = this.config.available_tools;
|
|
329
|
+
if (this.config?.ignore_tools && merged.ignore_tools == null)
|
|
330
|
+
merged.ignore_tools = this.config.ignore_tools;
|
|
331
|
+
if (this.config?.output_schema && merged.output_schema == null)
|
|
332
|
+
merged.output_schema = this.config.output_schema;
|
|
333
|
+
if (this.config?.exit_expression && merged.exit_expression == null)
|
|
334
|
+
merged.exit_expression = this.config.exit_expression;
|
|
335
|
+
if (this.config?.execution_strategy && merged.execution_strategy == null)
|
|
336
|
+
merged.execution_strategy = this.config.execution_strategy;
|
|
337
|
+
// Inherit top-level disable_mcp flag when not explicitly set on the mode
|
|
338
|
+
if (merged.disable_mcp == null && this.config?.disable_mcp === true) {
|
|
339
|
+
merged.disable_mcp = true;
|
|
340
|
+
}
|
|
341
|
+
// Merge mcpServers
|
|
342
|
+
const topMcpServers = (this.config?.mcpServers || {});
|
|
343
|
+
const modeMcpServersRaw = (merged.mcpServers || {});
|
|
344
|
+
let modeMcpServers;
|
|
345
|
+
try {
|
|
346
|
+
modeMcpServers = typeof modeMcpServersRaw === 'string' ? JSON.parse(modeMcpServersRaw) : modeMcpServersRaw;
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
modeMcpServers = {};
|
|
350
|
+
}
|
|
351
|
+
merged.mcpServers = { ...topMcpServers, ...(modeMcpServers || {}) };
|
|
352
|
+
return merged;
|
|
353
|
+
}
|
|
354
|
+
// New: resolve mode into a pseudo-command to reuse pipeline
|
|
355
|
+
resolveModeAsCommand(modeName) {
|
|
356
|
+
const mode = this.getModeConfig(modeName);
|
|
357
|
+
if (!mode) {
|
|
358
|
+
throw new Error(`Mode not found: ${modeName}`);
|
|
359
|
+
}
|
|
360
|
+
// Convert to CommandConfig
|
|
361
|
+
return {
|
|
362
|
+
name: modeName,
|
|
363
|
+
description: mode.description,
|
|
364
|
+
instructions: mode.instructions, // IMPORTANT: keep as instructions
|
|
365
|
+
available_tools: mode.available_tools,
|
|
366
|
+
ignore_tools: mode.ignore_tools,
|
|
367
|
+
model: mode.model,
|
|
368
|
+
mcpServers: mode.mcpServers,
|
|
369
|
+
output_schema: typeof mode.output_schema === 'string' ? transformOutputSchema(mode.output_schema, modeName) : mode.output_schema,
|
|
370
|
+
exit_expression: mode.exit_expression,
|
|
371
|
+
execution_strategy: mode.execution_strategy ?? 'act',
|
|
372
|
+
chat_message: mode.chat_message,
|
|
373
|
+
permissions: mode.permissions || 'rwx', // default same as commands
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
// Validate a mode by name (to be used after MCP init)
|
|
377
|
+
validateModeName(modeName) {
|
|
378
|
+
if (!this.config) {
|
|
379
|
+
return { valid: false, errors: [{ path: 'config', message: 'No configuration loaded' }] };
|
|
380
|
+
}
|
|
381
|
+
return validateMode(this.config, modeName);
|
|
382
|
+
}
|
|
383
|
+
getCommandConfig(commandName) {
|
|
384
|
+
// If commands are missing/empty, synthesize a default command that inherits
|
|
385
|
+
// top-level fields. This enables prompt-first SDK usage without requiring
|
|
386
|
+
// users to define commands.default just to call prompt().
|
|
387
|
+
const hasCommands = !!(this.config?.commands && Object.keys(this.config.commands).length > 0);
|
|
388
|
+
// Check for configured commands first; otherwise use an empty base.
|
|
389
|
+
const rawCommandConfig = hasCommands
|
|
390
|
+
? (this.config.commands[commandName] || { mcpServers: {} })
|
|
391
|
+
: { mcpServers: {} };
|
|
392
|
+
// Clone to prevent accidental mutation of the stored config object.
|
|
393
|
+
// IMPORTANT: keep SDK runtime metadata (command.__sdk) which may contain
|
|
394
|
+
// non-serializable values (e.g. Zod schemas).
|
|
395
|
+
const preservedSdkMeta = rawCommandConfig?.__sdk;
|
|
396
|
+
const commandConfig = JSON.parse(JSON.stringify(rawCommandConfig));
|
|
397
|
+
if (preservedSdkMeta) {
|
|
398
|
+
commandConfig.__sdk = preservedSdkMeta;
|
|
399
|
+
}
|
|
400
|
+
if (commandConfig?.mcpServers) {
|
|
401
|
+
try {
|
|
402
|
+
commandConfig.mcpServers = typeof commandConfig.mcpServers === 'string' ? JSON.parse(commandConfig.mcpServers) : commandConfig?.mcpServers;
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
throw new Error(`Error parsing MCP servers from the "${commandName}" config: ${error instanceof Error ? error.message : String(error)}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (commandConfig?.output_schema) {
|
|
409
|
+
commandConfig.output_schema = typeof commandConfig.output_schema === "string" ? transformOutputSchema(commandConfig.output_schema, commandName) : commandConfig.output_schema;
|
|
410
|
+
}
|
|
411
|
+
if (this.config?.model) {
|
|
412
|
+
commandConfig.model = commandConfig.model ?? this.config.model;
|
|
413
|
+
}
|
|
414
|
+
if (this.config?.available_tools) {
|
|
415
|
+
commandConfig.available_tools = commandConfig.available_tools ?? this.config.available_tools;
|
|
416
|
+
}
|
|
417
|
+
if (this.config?.ignore_tools) {
|
|
418
|
+
commandConfig.ignore_tools = commandConfig.ignore_tools ?? this.config.ignore_tools;
|
|
419
|
+
}
|
|
420
|
+
// Inherit top-level disable_mcp flag when not explicitly set on the command
|
|
421
|
+
if (commandConfig.disable_mcp == null && this.config?.disable_mcp === true) {
|
|
422
|
+
commandConfig.disable_mcp = true;
|
|
423
|
+
}
|
|
424
|
+
if (this.config?.output_schema) {
|
|
425
|
+
commandConfig.output_schema = commandConfig.output_schema ?? this.config.output_schema;
|
|
426
|
+
if (typeof commandConfig.output_schema === 'string') {
|
|
427
|
+
commandConfig.output_schema = transformOutputSchema(commandConfig.output_schema, commandName);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (this.config?.exit_expression) {
|
|
431
|
+
commandConfig.exit_expression = commandConfig.exit_expression ?? this.config.exit_expression;
|
|
432
|
+
}
|
|
433
|
+
if (this.config?.execution_strategy) {
|
|
434
|
+
commandConfig.execution_strategy = commandConfig.execution_strategy ?? this.config.execution_strategy;
|
|
435
|
+
}
|
|
436
|
+
if (!commandConfig.execution_strategy) {
|
|
437
|
+
if (commandConfig.instructions) {
|
|
438
|
+
// If instructions are present, default to "plan" strategy
|
|
439
|
+
commandConfig.execution_strategy = "plan";
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
// If no instructions, default to "act" strategy
|
|
443
|
+
commandConfig.execution_strategy = "act";
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
if (commandConfig.instructions) {
|
|
447
|
+
commandConfig.name = commandName;
|
|
448
|
+
}
|
|
449
|
+
// Set default permissions if not specified
|
|
450
|
+
if (!commandConfig.permissions) {
|
|
451
|
+
commandConfig.permissions = 'rwx'; // Default to full permissions
|
|
452
|
+
}
|
|
453
|
+
return commandConfig;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Cleanup method (kept for compatibility but no longer needed)
|
|
457
|
+
*/
|
|
458
|
+
async cleanup() {
|
|
459
|
+
// No cleanup needed anymore as we don't use temp files
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Static cleanup method for the singleton instance
|
|
463
|
+
*/
|
|
464
|
+
static async cleanup() {
|
|
465
|
+
const env = getCurrentEnvironment();
|
|
466
|
+
const instance = env.configManager ?? ConfigManager.instance;
|
|
467
|
+
if (instance) {
|
|
468
|
+
await instance.cleanup();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=ConfigManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a string is a URL
|
|
3
|
+
*/
|
|
4
|
+
export declare function isUrl(path: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Converts GitHub file URLs to raw GitHub URLs
|
|
7
|
+
* Example: https://github.com/user/repo/blob/main/file.toml -> https://raw.githubusercontent.com/user/repo/refs/heads/main/file.toml
|
|
8
|
+
*/
|
|
9
|
+
export declare function convertGithubToRawUrl(url: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Loads config content from a file path or URL
|
|
12
|
+
* Returns the content as a string
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadConfigContent(pathOrUrl: string): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=urlConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlConfig.d.ts","sourceRoot":"","sources":["../../src/config/urlConfig.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa3C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC1E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a string is a URL
|
|
5
|
+
*/
|
|
6
|
+
export function isUrl(path) {
|
|
7
|
+
try {
|
|
8
|
+
// Check for Windows absolute paths (e.g., C:\, D:\, etc.)
|
|
9
|
+
if (process.platform === 'win32' && /^[a-zA-Z]:[\\\/]/.test(path)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const url = new URL(path);
|
|
13
|
+
// Only consider http(s) and file protocols as valid URLs for config loading
|
|
14
|
+
return ['http:', 'https:', 'file:'].includes(url.protocol);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Converts GitHub file URLs to raw GitHub URLs
|
|
22
|
+
* Example: https://github.com/user/repo/blob/main/file.toml -> https://raw.githubusercontent.com/user/repo/refs/heads/main/file.toml
|
|
23
|
+
*/
|
|
24
|
+
export function convertGithubToRawUrl(url) {
|
|
25
|
+
const githubRegex = /^https:\/\/github\.com\/([^\/]+)\/([^\/]+)\/blob\/([^\/]+)\/(.+)$/;
|
|
26
|
+
const match = url.match(githubRegex);
|
|
27
|
+
if (match) {
|
|
28
|
+
const [, owner, repo, branch, filePath] = match;
|
|
29
|
+
return `https://raw.githubusercontent.com/${owner}/${repo}/refs/heads/${branch}/${filePath}`;
|
|
30
|
+
}
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Loads config content from a file path or URL
|
|
35
|
+
* Returns the content as a string
|
|
36
|
+
*/
|
|
37
|
+
export async function loadConfigContent(pathOrUrl) {
|
|
38
|
+
try {
|
|
39
|
+
if (isUrl(pathOrUrl)) {
|
|
40
|
+
// Convert GitHub URLs to raw URLs
|
|
41
|
+
const rawUrl = convertGithubToRawUrl(pathOrUrl);
|
|
42
|
+
const response = await axios.get(rawUrl, {
|
|
43
|
+
responseType: 'text',
|
|
44
|
+
timeout: 30000, // 30 second timeout
|
|
45
|
+
maxContentLength: 10 * 1024 * 1024, // 10MB limit
|
|
46
|
+
maxBodyLength: 10 * 1024 * 1024, // 10MB limit
|
|
47
|
+
});
|
|
48
|
+
return response.data;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Read local file
|
|
52
|
+
return await fs.readFile(pathOrUrl, 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (isUrl(pathOrUrl)) {
|
|
57
|
+
if (error.code === 'ECONNABORTED') {
|
|
58
|
+
throw new Error(`Timeout downloading config file from URL: ${pathOrUrl}`);
|
|
59
|
+
}
|
|
60
|
+
else if (error.response) {
|
|
61
|
+
throw new Error(`Failed to download config file from URL: ${pathOrUrl}. HTTP ${error.response.status}: ${error.response.statusText}`);
|
|
62
|
+
}
|
|
63
|
+
else if (error.request) {
|
|
64
|
+
throw new Error(`Network error downloading config file from URL: ${pathOrUrl}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw new Error(`Error downloading config file from URL: ${pathOrUrl}. ${error.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new Error(`Failed to read file: ${pathOrUrl}. ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=urlConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlConfig.js","sourceRoot":"","sources":["../../src/config/urlConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/constants/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,6EAA6E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/constants/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,0EAA0E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|