@ai-support-agent/cli 0.0.1

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +159 -0
  4. package/dist/agent-runner.d.ts +21 -0
  5. package/dist/agent-runner.d.ts.map +1 -0
  6. package/dist/agent-runner.js +251 -0
  7. package/dist/agent-runner.js.map +1 -0
  8. package/dist/api-client.d.ts +14 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +112 -0
  11. package/dist/api-client.js.map +1 -0
  12. package/dist/auth-server.d.ts +12 -0
  13. package/dist/auth-server.d.ts.map +1 -0
  14. package/dist/auth-server.js +151 -0
  15. package/dist/auth-server.js.map +1 -0
  16. package/dist/command-executor.d.ts +3 -0
  17. package/dist/command-executor.d.ts.map +1 -0
  18. package/dist/command-executor.js +306 -0
  19. package/dist/command-executor.js.map +1 -0
  20. package/dist/config-manager.d.ts +18 -0
  21. package/dist/config-manager.d.ts.map +1 -0
  22. package/dist/config-manager.js +175 -0
  23. package/dist/config-manager.js.map +1 -0
  24. package/dist/constants.d.ts +30 -0
  25. package/dist/constants.d.ts.map +1 -0
  26. package/dist/constants.js +50 -0
  27. package/dist/constants.js.map +1 -0
  28. package/dist/i18n.d.ts +3 -0
  29. package/dist/i18n.d.ts.map +1 -0
  30. package/dist/i18n.js +109 -0
  31. package/dist/i18n.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +214 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/locales/en.json +78 -0
  37. package/dist/locales/ja.json +78 -0
  38. package/dist/locales/locales/en.json +78 -0
  39. package/dist/locales/locales/ja.json +78 -0
  40. package/dist/logger.d.ts +9 -0
  41. package/dist/logger.d.ts.map +1 -0
  42. package/dist/logger.js +41 -0
  43. package/dist/logger.js.map +1 -0
  44. package/dist/types.d.ts +82 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +3 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/utils.d.ts +5 -0
  49. package/dist/utils.d.ts.map +1 -0
  50. package/dist/utils.js +32 -0
  51. package/dist/utils.js.map +1 -0
  52. package/package.json +51 -0
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startAuthServer = startAuthServer;
37
+ const crypto = __importStar(require("crypto"));
38
+ const http = __importStar(require("http"));
39
+ const constants_1 = require("./constants");
40
+ const i18n_1 = require("./i18n");
41
+ const utils_1 = require("./utils");
42
+ function startAuthServer(port, allowedOrigin) {
43
+ return new Promise((resolve, reject) => {
44
+ const nonce = crypto.randomBytes(32).toString('hex');
45
+ let nonceUsed = false;
46
+ let callbackResolve = null;
47
+ let callbackReject = null;
48
+ let timeoutId = null;
49
+ const server = http.createServer((req, res) => {
50
+ // CORS headers
51
+ res.setHeader('Access-Control-Allow-Origin', allowedOrigin ?? 'http://127.0.0.1');
52
+ res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
53
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
54
+ if (req.method === 'OPTIONS') {
55
+ res.writeHead(204);
56
+ res.end();
57
+ return;
58
+ }
59
+ if (req.method === 'POST' && req.url === '/callback') {
60
+ let body = '';
61
+ let bodySize = 0;
62
+ req.on('data', (chunk) => {
63
+ bodySize += chunk.length;
64
+ if (bodySize > constants_1.MAX_AUTH_BODY_SIZE) {
65
+ res.writeHead(413, { 'Content-Type': 'application/json' });
66
+ res.end(JSON.stringify({ error: 'Request body too large' }));
67
+ req.destroy();
68
+ return;
69
+ }
70
+ body += chunk.toString();
71
+ });
72
+ req.on('end', () => {
73
+ if (bodySize > constants_1.MAX_AUTH_BODY_SIZE)
74
+ return;
75
+ try {
76
+ const data = JSON.parse(body);
77
+ const token = (0, utils_1.parseString)(data.token);
78
+ if (!token) {
79
+ res.writeHead(400, { 'Content-Type': 'application/json' });
80
+ res.end(JSON.stringify({ error: 'Missing token' }));
81
+ return;
82
+ }
83
+ const nonceValid = typeof data.nonce === 'string'
84
+ && data.nonce.length === nonce.length
85
+ && crypto.timingSafeEqual(Buffer.from(data.nonce), Buffer.from(nonce));
86
+ if (!nonceValid) {
87
+ res.writeHead(403, { 'Content-Type': 'application/json' });
88
+ res.end(JSON.stringify({ error: 'Invalid nonce' }));
89
+ return;
90
+ }
91
+ if (nonceUsed) {
92
+ res.writeHead(400, { 'Content-Type': 'application/json' });
93
+ res.end(JSON.stringify({ error: 'Nonce already used' }));
94
+ return;
95
+ }
96
+ nonceUsed = true;
97
+ res.writeHead(200, { 'Content-Type': 'application/json' });
98
+ res.end(JSON.stringify({ success: true }));
99
+ if (callbackResolve) {
100
+ callbackResolve({
101
+ token,
102
+ apiUrl: (0, utils_1.parseString)(data.apiUrl) ?? undefined,
103
+ projectCode: (0, utils_1.parseString)(data.projectCode) ?? undefined,
104
+ });
105
+ }
106
+ }
107
+ catch {
108
+ res.writeHead(400, { 'Content-Type': 'application/json' });
109
+ res.end(JSON.stringify({ error: 'Invalid request body' }));
110
+ }
111
+ });
112
+ return;
113
+ }
114
+ res.writeHead(404);
115
+ res.end();
116
+ });
117
+ const listenPort = port ?? 0; // 0 = OS auto-assign
118
+ server.listen(listenPort, '127.0.0.1', () => {
119
+ const addr = server.address();
120
+ if (!addr || typeof addr === 'string') {
121
+ reject(new Error('Failed to start auth server'));
122
+ return;
123
+ }
124
+ const serverUrl = `http://127.0.0.1:${addr.port}`;
125
+ const stop = () => {
126
+ if (timeoutId) {
127
+ clearTimeout(timeoutId);
128
+ }
129
+ server.close();
130
+ };
131
+ const waitForCallback = () => {
132
+ return new Promise((res, rej) => {
133
+ callbackResolve = res;
134
+ callbackReject = rej;
135
+ timeoutId = setTimeout(() => {
136
+ rej(new Error((0, i18n_1.t)('auth.timeout')));
137
+ server.close();
138
+ }, constants_1.AUTH_TIMEOUT);
139
+ });
140
+ };
141
+ resolve({ url: serverUrl, nonce, waitForCallback, stop });
142
+ });
143
+ server.on('error', (error) => {
144
+ reject(error);
145
+ if (callbackReject) {
146
+ callbackReject(error);
147
+ }
148
+ });
149
+ });
150
+ }
151
+ //# sourceMappingURL=auth-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-server.js","sourceRoot":"","sources":["../src/auth-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentCommandType, CommandResult } from './types';
2
+ export declare function executeCommand(type: AgentCommandType, payload: Record<string, unknown>): Promise<CommandResult>;
3
+ //# sourceMappingURL=command-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../src/command-executor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAMd,MAAM,SAAS,CAAA;AA2FhB,wBAAsB,cAAc,CAClC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.executeCommand = executeCommand;
37
+ const child_process_1 = require("child_process");
38
+ const fs = __importStar(require("fs"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
41
+ const constants_1 = require("./constants");
42
+ const logger_1 = require("./logger");
43
+ const utils_1 = require("./utils");
44
+ const BLOCKED_COMMAND_PATTERNS = [
45
+ /\brm\s+-rf\s+\/(?!\w)/,
46
+ /\bmkfs\b/,
47
+ /\bdd\s+.*of=\/dev\//,
48
+ />\s*\/dev\/sd[a-z]/,
49
+ /:\(\)\s*\{.*\};\s*:/,
50
+ ];
51
+ const BLOCKED_PATH_PREFIXES = [
52
+ '/etc/', '/proc/', '/sys/', '/dev/',
53
+ // macOS: /etc → /private/etc, etc.
54
+ '/private/etc/', '/private/var/db/',
55
+ ];
56
+ function getSensitiveHomePaths() {
57
+ const home = os.homedir();
58
+ return ['.ssh', '.aws', '.gnupg', '.config/gcloud'].map((dir) => path.join(home, dir) + '/');
59
+ }
60
+ const ALLOWED_SIGNALS = new Set([
61
+ 'SIGTERM', 'SIGUSR1', 'SIGUSR2', 'SIGINT', 'SIGHUP',
62
+ ]);
63
+ const SAFE_ENV_KEYS = [
64
+ 'PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'LC_ALL', 'LC_MESSAGES',
65
+ 'TERM', 'TMPDIR', 'TMP', 'TEMP', 'NODE_ENV',
66
+ // Windows
67
+ 'SystemRoot', 'USERPROFILE', 'APPDATA', 'PATHEXT', 'COMSPEC',
68
+ ];
69
+ function buildSafeEnv() {
70
+ const env = {};
71
+ for (const key of SAFE_ENV_KEYS) {
72
+ if (process.env[key] !== undefined)
73
+ env[key] = process.env[key];
74
+ }
75
+ return env;
76
+ }
77
+ function validateCommand(command) {
78
+ for (const pattern of BLOCKED_COMMAND_PATTERNS) {
79
+ if (pattern.test(command)) {
80
+ return `Blocked dangerous command pattern: ${pattern}`;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ async function validateFilePath(filePath) {
86
+ let resolved;
87
+ try {
88
+ resolved = await fs.promises.realpath(filePath);
89
+ }
90
+ catch {
91
+ // File does not exist yet (e.g. file_write new file) — resolve parent directory
92
+ const parentDir = path.dirname(path.resolve(filePath));
93
+ try {
94
+ const realParent = await fs.promises.realpath(parentDir);
95
+ resolved = path.join(realParent, path.basename(filePath));
96
+ }
97
+ catch {
98
+ resolved = path.resolve(filePath);
99
+ }
100
+ }
101
+ const allBlocked = [...BLOCKED_PATH_PREFIXES, ...getSensitiveHomePaths()];
102
+ for (const prefix of allBlocked) {
103
+ const prefixWithoutSlash = prefix.replace(/\/$/, '');
104
+ if (resolved === prefixWithoutSlash || resolved.startsWith(prefix)) {
105
+ return `Access denied: ${prefix} paths are blocked`;
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ async function resolveAndValidatePath(payload, defaultPath) {
111
+ const filePath = (0, utils_1.parseString)(payload.path) ?? defaultPath ?? null;
112
+ if (!filePath) {
113
+ return { success: false, error: 'No file path specified' };
114
+ }
115
+ const pathError = await validateFilePath(filePath);
116
+ if (pathError) {
117
+ return { success: false, error: pathError };
118
+ }
119
+ return filePath;
120
+ }
121
+ async function executeCommand(type, payload) {
122
+ try {
123
+ switch (type) {
124
+ case 'execute_command':
125
+ return await executeShellCommand(payload);
126
+ case 'file_read':
127
+ return await fileRead(payload);
128
+ case 'file_write':
129
+ return await fileWrite(payload);
130
+ case 'file_list':
131
+ return await fileList(payload);
132
+ case 'process_list':
133
+ return await processList();
134
+ case 'process_kill':
135
+ return await processKill(payload);
136
+ default:
137
+ return { success: false, error: `Unknown command type: ${type}` };
138
+ }
139
+ }
140
+ catch (error) {
141
+ const message = (0, utils_1.getErrorMessage)(error);
142
+ logger_1.logger.error(`Command execution failed: ${message}`);
143
+ return { success: false, error: message };
144
+ }
145
+ }
146
+ async function executeShellCommand(payload) {
147
+ const command = (0, utils_1.parseString)(payload.command);
148
+ if (!command) {
149
+ return { success: false, error: 'No command specified' };
150
+ }
151
+ const validationError = validateCommand(command);
152
+ if (validationError) {
153
+ return { success: false, error: validationError };
154
+ }
155
+ const rawTimeout = (0, utils_1.parseNumber)(payload.timeout) ?? constants_1.CMD_DEFAULT_TIMEOUT;
156
+ if (rawTimeout < 1 || rawTimeout > constants_1.MAX_CMD_TIMEOUT) {
157
+ return { success: false, error: `Timeout must be between 1 and ${constants_1.MAX_CMD_TIMEOUT}ms` };
158
+ }
159
+ const timeout = rawTimeout;
160
+ const cwd = (0, utils_1.parseString)(payload.cwd) ?? os.homedir();
161
+ const cwdError = await validateFilePath(cwd);
162
+ if (cwdError) {
163
+ return { success: false, error: cwdError };
164
+ }
165
+ return new Promise((resolve) => {
166
+ let resolved = false;
167
+ const shellCmd = os.platform() === 'win32' ? 'cmd.exe' : '/bin/sh';
168
+ const shellArgs = os.platform() === 'win32' ? ['/c', command] : ['-c', command];
169
+ const proc = (0, child_process_1.spawn)(shellCmd, shellArgs, {
170
+ cwd,
171
+ env: buildSafeEnv(),
172
+ });
173
+ let stdout = '';
174
+ let stderr = '';
175
+ let outputSize = 0;
176
+ const timer = setTimeout(() => {
177
+ if (!resolved) {
178
+ resolved = true;
179
+ proc.kill('SIGKILL');
180
+ resolve({ success: false, error: `Command timed out after ${timeout}ms` });
181
+ }
182
+ }, timeout);
183
+ proc.stdout?.on('data', (data) => {
184
+ outputSize += data.length;
185
+ if (outputSize <= constants_1.MAX_OUTPUT_SIZE) {
186
+ stdout += data.toString();
187
+ }
188
+ });
189
+ proc.stderr?.on('data', (data) => {
190
+ outputSize += data.length;
191
+ if (outputSize <= constants_1.MAX_OUTPUT_SIZE) {
192
+ stderr += data.toString();
193
+ }
194
+ });
195
+ proc.on('close', (code) => {
196
+ clearTimeout(timer);
197
+ if (resolved)
198
+ return;
199
+ resolved = true;
200
+ const truncated = outputSize > constants_1.MAX_OUTPUT_SIZE;
201
+ const suffix = truncated ? '\n... [output truncated]' : '';
202
+ if (code === 0) {
203
+ resolve({ success: true, data: stdout + suffix });
204
+ }
205
+ else {
206
+ resolve({
207
+ success: false,
208
+ data: stdout + suffix,
209
+ error: stderr || `Process exited with code ${code}`,
210
+ });
211
+ }
212
+ });
213
+ proc.on('error', (err) => {
214
+ clearTimeout(timer);
215
+ if (resolved)
216
+ return;
217
+ resolved = true;
218
+ let errorMessage = err.message;
219
+ if (err.code === 'ENOENT') {
220
+ errorMessage = `Command not found: ${shellCmd}`;
221
+ }
222
+ else if (err.code === 'EACCES') {
223
+ errorMessage = `Permission denied: ${shellCmd}`;
224
+ }
225
+ resolve({ success: false, error: errorMessage });
226
+ });
227
+ });
228
+ }
229
+ async function fileRead(payload) {
230
+ const pathOrError = await resolveAndValidatePath(payload);
231
+ if (typeof pathOrError !== 'string')
232
+ return pathOrError;
233
+ const filePath = pathOrError;
234
+ const stat = await fs.promises.stat(filePath);
235
+ if (stat.size > constants_1.MAX_FILE_READ_SIZE) {
236
+ return {
237
+ success: false,
238
+ error: `File too large: ${stat.size} bytes (limit: ${constants_1.MAX_FILE_READ_SIZE} bytes)`,
239
+ };
240
+ }
241
+ const content = await fs.promises.readFile(filePath, 'utf-8');
242
+ return { success: true, data: content };
243
+ }
244
+ async function fileWrite(payload) {
245
+ const pathOrError = await resolveAndValidatePath(payload);
246
+ if (typeof pathOrError !== 'string')
247
+ return pathOrError;
248
+ const filePath = pathOrError;
249
+ const content = typeof payload.content === 'string' ? payload.content : null;
250
+ if (content === null) {
251
+ return { success: false, error: 'No content specified' };
252
+ }
253
+ if (content.length > constants_1.MAX_FILE_WRITE_SIZE) {
254
+ return { success: false, error: `Content too large: ${content.length} bytes (limit: ${constants_1.MAX_FILE_WRITE_SIZE} bytes)` };
255
+ }
256
+ if (payload.createDirectories) {
257
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
258
+ }
259
+ await fs.promises.writeFile(filePath, content, 'utf-8');
260
+ return { success: true, data: `Written to ${filePath}` };
261
+ }
262
+ async function fileList(payload) {
263
+ const pathOrError = await resolveAndValidatePath(payload, '.');
264
+ if (typeof pathOrError !== 'string')
265
+ return pathOrError;
266
+ const dirPath = pathOrError;
267
+ const allEntries = await fs.promises.readdir(dirPath, { withFileTypes: true });
268
+ const truncated = allEntries.length > constants_1.MAX_DIR_ENTRIES;
269
+ const entries = allEntries.slice(0, constants_1.MAX_DIR_ENTRIES);
270
+ const items = await Promise.all(entries.map(async (entry) => {
271
+ const fullPath = path.join(dirPath, entry.name);
272
+ const type = entry.isDirectory() ? 'directory' : 'file';
273
+ try {
274
+ const stat = await fs.promises.lstat(fullPath);
275
+ return { name: entry.name, type, size: stat.size, modified: stat.mtime.toISOString() };
276
+ }
277
+ catch {
278
+ return { name: entry.name, type, size: 0, modified: '' };
279
+ }
280
+ }));
281
+ return { success: true, data: { items, truncated, total: allEntries.length } };
282
+ }
283
+ function processList() {
284
+ const command = os.platform() === 'win32'
285
+ ? 'tasklist /fo csv /nh'
286
+ : 'ps aux';
287
+ return executeShellCommand({ command, timeout: constants_1.PROCESS_LIST_TIMEOUT });
288
+ }
289
+ async function processKill(payload) {
290
+ const pid = (0, utils_1.parseNumber)(payload.pid);
291
+ if (!pid || pid < 1 || !Number.isInteger(pid)) {
292
+ return { success: false, error: 'Invalid PID: must be a positive integer' };
293
+ }
294
+ const signal = (0, utils_1.parseString)(payload.signal) ?? 'SIGTERM';
295
+ if (!ALLOWED_SIGNALS.has(signal)) {
296
+ return { success: false, error: `Signal not allowed: ${signal}. Allowed: ${[...ALLOWED_SIGNALS].join(', ')}` };
297
+ }
298
+ try {
299
+ process.kill(pid, signal);
300
+ return { success: true, data: `Sent ${signal} to PID ${pid}` };
301
+ }
302
+ catch (error) {
303
+ return { success: false, error: (0, utils_1.getErrorMessage)(error) };
304
+ }
305
+ }
306
+ //# sourceMappingURL=command-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../src/command-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AgentConfig, ProjectRegistration } from './types';
2
+ export declare function loadConfig(): AgentConfig | null;
3
+ export declare function saveConfig(config: Partial<AgentConfig>): void;
4
+ export declare function getOrCreateAgentId(): string;
5
+ export declare function clearConfig(): void;
6
+ /**
7
+ * Add a project (upsert by projectCode)
8
+ */
9
+ export declare function addProject(registration: ProjectRegistration): void;
10
+ /**
11
+ * Remove a project by code
12
+ */
13
+ export declare function removeProject(projectCode: string): boolean;
14
+ /**
15
+ * Get registered project list
16
+ */
17
+ export declare function getProjectList(config: AgentConfig): ProjectRegistration[];
18
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../src/config-manager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAqB,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAgDlF,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAa/C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAoB7D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAYlE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,GAClB,mBAAmB,EAAE,CAEvB"}