@nexagent-cli/cli 0.2.4 → 0.3.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/README.md +2 -2
- package/dist/agent/loop.d.ts +0 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +0 -10
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +167 -0
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +7 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +273 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp.d.ts +7 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +99 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +1 -16
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +5 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/wizard.d.ts.map +1 -1
- package/dist/config/wizard.js.map +1 -1
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js.map +1 -1
- package/dist/db/session-store.d.ts.map +1 -1
- package/dist/db/session-store.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/providers/anthropic.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.js.map +1 -1
- package/dist/llm/providers/google.d.ts.map +1 -1
- package/dist/llm/providers/google.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/llm/providers/openai.d.ts.map +1 -1
- package/dist/llm/providers/openai.js +8 -0
- package/dist/llm/providers/openai.js.map +1 -1
- package/dist/llm/router.d.ts.map +1 -1
- package/dist/llm/router.js +2 -0
- package/dist/llm/router.js.map +1 -1
- package/dist/mcp/catalog.d.ts +11 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +114 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/installer.d.ts +13 -0
- package/dist/mcp/installer.d.ts.map +1 -0
- package/dist/mcp/installer.js +92 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/registry.d.ts +13 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +81 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/types.d.ts +44 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/manager.js.map +1 -1
- package/dist/orchestrator/index.d.ts +36 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +118 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/types.d.ts +73 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +5 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/worker.d.ts +2 -0
- package/dist/orchestrator/worker.d.ts.map +1 -0
- package/dist/orchestrator/worker.js +158 -0
- package/dist/orchestrator/worker.js.map +1 -0
- package/dist/safety/gate.d.ts.map +1 -1
- package/dist/safety/gate.js.map +1 -1
- package/dist/tools/file-delete.d.ts.map +1 -1
- package/dist/tools/file-delete.js.map +1 -1
- package/dist/tools/file-edit.d.ts.map +1 -1
- package/dist/tools/file-edit.js.map +1 -1
- package/dist/tools/file-list.d.ts.map +1 -1
- package/dist/tools/file-list.js.map +1 -1
- package/dist/tools/file-read.d.ts.map +1 -1
- package/dist/tools/file-read.js.map +1 -1
- package/dist/tools/file-search.d.ts.map +1 -1
- package/dist/tools/file-search.js.map +1 -1
- package/dist/tools/file-write.d.ts.map +1 -1
- package/dist/tools/file-write.js.map +1 -1
- package/dist/tools/memory-read.d.ts.map +1 -1
- package/dist/tools/memory-read.js.map +1 -1
- package/dist/tools/memory-write.d.ts.map +1 -1
- package/dist/tools/memory-write.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell-exec.d.ts.map +1 -1
- package/dist/tools/shell-exec.js.map +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js.map +1 -1
- package/dist/ui/ChatApp.d.ts +8 -1
- package/dist/ui/ChatApp.d.ts.map +1 -1
- package/dist/ui/ChatApp.js +60 -3
- package/dist/ui/ChatApp.js.map +1 -1
- package/dist/ui/ConfirmDialog.d.ts.map +1 -1
- package/dist/ui/ConfirmDialog.js.map +1 -1
- package/dist/ui/InputBar.d.ts +1 -0
- package/dist/ui/InputBar.d.ts.map +1 -1
- package/dist/ui/InputBar.js +38 -6
- package/dist/ui/InputBar.js.map +1 -1
- package/dist/ui/MessageList.d.ts.map +1 -1
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/Spinner.d.ts.map +1 -1
- package/dist/ui/Spinner.js.map +1 -1
- package/dist/ui/StatusBar.d.ts +3 -1
- package/dist/ui/StatusBar.d.ts.map +1 -1
- package/dist/ui/StatusBar.js +18 -3
- package/dist/ui/StatusBar.js.map +1 -1
- package/dist/ui/ToolPanel.d.ts.map +1 -1
- package/dist/ui/ToolPanel.js.map +1 -1
- package/dist/ui/quick-commands.d.ts +9 -0
- package/dist/ui/quick-commands.d.ts.map +1 -0
- package/dist/ui/quick-commands.js +32 -0
- package/dist/ui/quick-commands.js.map +1 -0
- package/dist/ui/splash.d.ts +3 -0
- package/dist/ui/splash.d.ts.map +1 -0
- package/dist/ui/splash.js +34 -0
- package/dist/ui/splash.js.map +1 -0
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js.map +1 -1
- package/package.json +33 -33
- package/dist/subagents/orchestrator.d.ts +0 -20
- package/dist/subagents/orchestrator.d.ts.map +0 -1
- package/dist/subagents/orchestrator.js +0 -151
- package/dist/subagents/orchestrator.js.map +0 -1
- package/proxy-server.mjs +0 -272
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MCP Catalog — remote / local catalog loading and search
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
const BUILT_IN_TOOLS = [
|
|
6
|
+
{
|
|
7
|
+
id: 'fetch',
|
|
8
|
+
name: 'Fetch',
|
|
9
|
+
description: 'HTTP fetch tool for retrieving web content',
|
|
10
|
+
version: '1.0.0',
|
|
11
|
+
author: 'NexAgent',
|
|
12
|
+
license: 'MIT',
|
|
13
|
+
entryPoint: 'index.js',
|
|
14
|
+
configSchema: { type: 'object', properties: {}, required: [] },
|
|
15
|
+
permissions: ['network'],
|
|
16
|
+
downloadUrl: 'https://example.com/mcp/fetch-1.0.0.tgz',
|
|
17
|
+
checksum: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'github',
|
|
21
|
+
name: 'GitHub',
|
|
22
|
+
description: 'Interact with the GitHub API',
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
author: 'NexAgent',
|
|
25
|
+
license: 'MIT',
|
|
26
|
+
entryPoint: 'index.js',
|
|
27
|
+
configSchema: { type: 'object', properties: {}, required: [] },
|
|
28
|
+
permissions: ['network'],
|
|
29
|
+
downloadUrl: 'https://example.com/mcp/github-1.0.0.tgz',
|
|
30
|
+
checksum: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'filesystem',
|
|
34
|
+
name: 'Filesystem',
|
|
35
|
+
description: 'Read and write local files',
|
|
36
|
+
version: '1.0.0',
|
|
37
|
+
author: 'NexAgent',
|
|
38
|
+
license: 'MIT',
|
|
39
|
+
entryPoint: 'index.js',
|
|
40
|
+
configSchema: { type: 'object', properties: {}, required: [] },
|
|
41
|
+
permissions: ['filesystem'],
|
|
42
|
+
downloadUrl: 'https://example.com/mcp/filesystem-1.0.0.tgz',
|
|
43
|
+
checksum: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'browser',
|
|
47
|
+
name: 'Browser',
|
|
48
|
+
description: 'Headless browser automation',
|
|
49
|
+
version: '1.0.0',
|
|
50
|
+
author: 'NexAgent',
|
|
51
|
+
license: 'MIT',
|
|
52
|
+
entryPoint: 'index.js',
|
|
53
|
+
configSchema: { type: 'object', properties: {}, required: [] },
|
|
54
|
+
permissions: ['network', 'filesystem'],
|
|
55
|
+
downloadUrl: 'https://example.com/mcp/browser-1.0.0.tgz',
|
|
56
|
+
checksum: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'sqlite',
|
|
60
|
+
name: 'SQLite',
|
|
61
|
+
description: 'Query SQLite databases',
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
author: 'NexAgent',
|
|
64
|
+
license: 'MIT',
|
|
65
|
+
entryPoint: 'index.js',
|
|
66
|
+
configSchema: { type: 'object', properties: {}, required: [] },
|
|
67
|
+
permissions: ['filesystem'],
|
|
68
|
+
downloadUrl: 'https://example.com/mcp/sqlite-1.0.0.tgz',
|
|
69
|
+
checksum: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
export class McpCatalog {
|
|
73
|
+
entries;
|
|
74
|
+
constructor() {
|
|
75
|
+
this.entries = [...BUILT_IN_TOOLS];
|
|
76
|
+
}
|
|
77
|
+
async fetchRemote(url) {
|
|
78
|
+
const response = await fetch(url);
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
throw new Error(`Failed to fetch catalog from ${url}: ${response.status} ${response.statusText}`);
|
|
81
|
+
}
|
|
82
|
+
const data = (await response.json());
|
|
83
|
+
this.entries = data;
|
|
84
|
+
}
|
|
85
|
+
loadLocal(path) {
|
|
86
|
+
const raw = readFileSync(path, 'utf-8');
|
|
87
|
+
const data = JSON.parse(raw);
|
|
88
|
+
this.entries = data;
|
|
89
|
+
}
|
|
90
|
+
search(query) {
|
|
91
|
+
const lower = query.toLowerCase();
|
|
92
|
+
const scored = this.entries.map((entry) => {
|
|
93
|
+
const nameIdx = entry.name.toLowerCase().indexOf(lower);
|
|
94
|
+
const descIdx = entry.description.toLowerCase().indexOf(lower);
|
|
95
|
+
let score = 0;
|
|
96
|
+
if (nameIdx !== -1)
|
|
97
|
+
score += 100 - nameIdx;
|
|
98
|
+
if (descIdx !== -1)
|
|
99
|
+
score += 10 - descIdx;
|
|
100
|
+
return { entry, score };
|
|
101
|
+
});
|
|
102
|
+
return scored
|
|
103
|
+
.filter((s) => s.score > 0)
|
|
104
|
+
.sort((a, b) => b.score - a.score)
|
|
105
|
+
.map((s) => s.entry);
|
|
106
|
+
}
|
|
107
|
+
get(id) {
|
|
108
|
+
return this.entries.find((e) => e.id === id);
|
|
109
|
+
}
|
|
110
|
+
getAll() {
|
|
111
|
+
return [...this.entries];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/mcp/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MCP Module — barrel export
|
|
3
|
+
// ============================================================
|
|
4
|
+
export * from './types.js';
|
|
5
|
+
export * from './catalog.js';
|
|
6
|
+
export * from './registry.js';
|
|
7
|
+
export * from './installer.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAE/D,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpCatalog } from './catalog.js';
|
|
2
|
+
import { McpRegistry } from './registry.js';
|
|
3
|
+
import type { McpCatalogEntry, McpSandboxResult } from './types.js';
|
|
4
|
+
export declare class McpInstaller {
|
|
5
|
+
private registry;
|
|
6
|
+
private catalog;
|
|
7
|
+
constructor(registry: McpRegistry, catalog: McpCatalog);
|
|
8
|
+
download(entry: McpCatalogEntry, destDir: string): Promise<void>;
|
|
9
|
+
validate(_entry: McpCatalogEntry, _dir: string): boolean;
|
|
10
|
+
sandboxRun(toolId: string, args: string[], timeoutMs?: number): Promise<McpSandboxResult>;
|
|
11
|
+
uninstall(toolId: string): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/mcp/installer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;gBADP,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,UAAU;IAGvB,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAMlD,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,SAAQ,GAChB,OAAO,CAAC,gBAAgB,CAAC;IAgE5B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAWhC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MCP Installer — download, validate, sandbox, and uninstall
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
export class McpInstaller {
|
|
8
|
+
registry;
|
|
9
|
+
catalog;
|
|
10
|
+
constructor(registry, catalog) {
|
|
11
|
+
this.registry = registry;
|
|
12
|
+
this.catalog = catalog;
|
|
13
|
+
}
|
|
14
|
+
async download(entry, destDir) {
|
|
15
|
+
if (!existsSync(destDir)) {
|
|
16
|
+
mkdirSync(destDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
const placeholder = join(destDir, 'placeholder.txt');
|
|
19
|
+
writeFileSync(placeholder, `Placeholder for ${entry.name} v${entry.version}\n`, 'utf-8');
|
|
20
|
+
console.log(`[McpInstaller] Downloaded stub for ${entry.id} to ${destDir}`);
|
|
21
|
+
}
|
|
22
|
+
validate(_entry, _dir) {
|
|
23
|
+
console.log(`[McpInstaller] Validating checksum (stub)`);
|
|
24
|
+
// Stub: real implementation would hash artifacts and compare with entry.checksum
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
async sandboxRun(toolId, args, timeoutMs = 30000) {
|
|
28
|
+
const record = this.registry.get(toolId);
|
|
29
|
+
const entry = this.catalog.get(toolId);
|
|
30
|
+
if (!record) {
|
|
31
|
+
throw new Error(`Tool ${toolId} is not installed`);
|
|
32
|
+
}
|
|
33
|
+
if (!entry) {
|
|
34
|
+
throw new Error(`Tool ${toolId} not found in catalog`);
|
|
35
|
+
}
|
|
36
|
+
if (!record.enabled) {
|
|
37
|
+
throw new Error(`Tool ${toolId} is disabled`);
|
|
38
|
+
}
|
|
39
|
+
const scriptPath = join(record.path, entry.entryPoint);
|
|
40
|
+
if (!existsSync(scriptPath)) {
|
|
41
|
+
throw new Error(`Entry point ${scriptPath} does not exist`);
|
|
42
|
+
}
|
|
43
|
+
const isNodeScript = scriptPath.endsWith('.js');
|
|
44
|
+
const command = isNodeScript ? 'node' : scriptPath;
|
|
45
|
+
const commandArgs = isNodeScript ? [scriptPath, ...args] : args;
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const child = spawn(command, commandArgs, {
|
|
48
|
+
cwd: record.path,
|
|
49
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
50
|
+
});
|
|
51
|
+
let stdout = '';
|
|
52
|
+
let stderr = '';
|
|
53
|
+
let timedOut = false;
|
|
54
|
+
const timer = setTimeout(() => {
|
|
55
|
+
timedOut = true;
|
|
56
|
+
child.kill('SIGTERM');
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
if (!child.killed) {
|
|
59
|
+
child.kill('SIGKILL');
|
|
60
|
+
}
|
|
61
|
+
}, 5000);
|
|
62
|
+
}, timeoutMs);
|
|
63
|
+
child.stdout?.on('data', (chunk) => {
|
|
64
|
+
stdout += chunk.toString();
|
|
65
|
+
});
|
|
66
|
+
child.stderr?.on('data', (chunk) => {
|
|
67
|
+
stderr += chunk.toString();
|
|
68
|
+
});
|
|
69
|
+
child.on('error', (err) => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
reject(err);
|
|
72
|
+
});
|
|
73
|
+
child.on('close', (code) => {
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
const exitCode = code ?? (timedOut ? 1 : 0);
|
|
76
|
+
resolve({ stdout, stderr, exitCode, artifacts: [] });
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
uninstall(toolId) {
|
|
81
|
+
const record = this.registry.get(toolId);
|
|
82
|
+
if (!record) {
|
|
83
|
+
throw new Error(`Tool ${toolId} is not installed`);
|
|
84
|
+
}
|
|
85
|
+
if (existsSync(record.path)) {
|
|
86
|
+
rmSync(record.path, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
this.registry.uninstall(toolId);
|
|
89
|
+
console.log(`[McpInstaller] Uninstalled ${toolId}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/mcp/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpCatalogEntry, McpInstallRecord } from './types.js';
|
|
2
|
+
export declare class McpRegistry {
|
|
3
|
+
private data;
|
|
4
|
+
constructor();
|
|
5
|
+
list(): McpInstallRecord[];
|
|
6
|
+
get(id: string): McpInstallRecord | undefined;
|
|
7
|
+
install(entry: McpCatalogEntry): void;
|
|
8
|
+
uninstall(id: string): void;
|
|
9
|
+
enable(id: string): void;
|
|
10
|
+
disable(id: string): void;
|
|
11
|
+
isInstalled(id: string): boolean;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA6BpE,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAe;;IAM3B,IAAI,IAAI,gBAAgB,EAAE;IAI1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI7C,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAoBrC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASzB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAGjC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MCP Registry — local installation metadata persistence
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
const REGISTRY_DIR = join(homedir(), '.nexagent');
|
|
8
|
+
const REGISTRY_PATH = join(REGISTRY_DIR, 'mcp-registry.json');
|
|
9
|
+
function ensureDir(dir) {
|
|
10
|
+
if (!existsSync(dir)) {
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function readRegistry() {
|
|
15
|
+
ensureDir(REGISTRY_DIR);
|
|
16
|
+
if (!existsSync(REGISTRY_PATH)) {
|
|
17
|
+
return { tools: [] };
|
|
18
|
+
}
|
|
19
|
+
const raw = readFileSync(REGISTRY_PATH, 'utf-8');
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
function writeRegistry(data) {
|
|
23
|
+
ensureDir(REGISTRY_DIR);
|
|
24
|
+
writeFileSync(REGISTRY_PATH, JSON.stringify(data, null, 2), 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
export class McpRegistry {
|
|
27
|
+
data;
|
|
28
|
+
constructor() {
|
|
29
|
+
this.data = readRegistry();
|
|
30
|
+
}
|
|
31
|
+
list() {
|
|
32
|
+
return [...this.data.tools];
|
|
33
|
+
}
|
|
34
|
+
get(id) {
|
|
35
|
+
return this.data.tools.find((t) => t.id === id);
|
|
36
|
+
}
|
|
37
|
+
install(entry) {
|
|
38
|
+
if (this.isInstalled(entry.id)) {
|
|
39
|
+
throw new Error(`Tool ${entry.id} is already installed`);
|
|
40
|
+
}
|
|
41
|
+
console.log(`[McpRegistry] Would download ${entry.name} from ${entry.downloadUrl}`);
|
|
42
|
+
const record = {
|
|
43
|
+
id: entry.id,
|
|
44
|
+
version: entry.version,
|
|
45
|
+
installedAt: new Date().toISOString(),
|
|
46
|
+
path: join(REGISTRY_DIR, 'mcp', entry.id),
|
|
47
|
+
config: {},
|
|
48
|
+
enabled: true,
|
|
49
|
+
};
|
|
50
|
+
this.data.tools.push(record);
|
|
51
|
+
writeRegistry(this.data);
|
|
52
|
+
}
|
|
53
|
+
uninstall(id) {
|
|
54
|
+
const idx = this.data.tools.findIndex((t) => t.id === id);
|
|
55
|
+
if (idx === -1) {
|
|
56
|
+
throw new Error(`Tool ${id} is not installed`);
|
|
57
|
+
}
|
|
58
|
+
this.data.tools.splice(idx, 1);
|
|
59
|
+
writeRegistry(this.data);
|
|
60
|
+
}
|
|
61
|
+
enable(id) {
|
|
62
|
+
const tool = this.get(id);
|
|
63
|
+
if (!tool) {
|
|
64
|
+
throw new Error(`Tool ${id} is not installed`);
|
|
65
|
+
}
|
|
66
|
+
tool.enabled = true;
|
|
67
|
+
writeRegistry(this.data);
|
|
68
|
+
}
|
|
69
|
+
disable(id) {
|
|
70
|
+
const tool = this.get(id);
|
|
71
|
+
if (!tool) {
|
|
72
|
+
throw new Error(`Tool ${id} is not installed`);
|
|
73
|
+
}
|
|
74
|
+
tool.enabled = false;
|
|
75
|
+
writeRegistry(this.data);
|
|
76
|
+
}
|
|
77
|
+
isInstalled(id) {
|
|
78
|
+
return this.data.tools.some((t) => t.id === id);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Lightweight JSON-schema-ish descriptor for a tool's config */
|
|
2
|
+
export interface McpConfigSchema {
|
|
3
|
+
type: 'object';
|
|
4
|
+
properties: Record<string, {
|
|
5
|
+
type: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
default?: unknown;
|
|
8
|
+
}>;
|
|
9
|
+
required?: string[];
|
|
10
|
+
}
|
|
11
|
+
/** Base definition of an MCP tool */
|
|
12
|
+
export interface McpToolDefinition {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
version: string;
|
|
17
|
+
author: string;
|
|
18
|
+
license: string;
|
|
19
|
+
entryPoint: string;
|
|
20
|
+
configSchema: McpConfigSchema;
|
|
21
|
+
permissions: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Catalog entry adds distribution metadata */
|
|
24
|
+
export interface McpCatalogEntry extends McpToolDefinition {
|
|
25
|
+
downloadUrl: string;
|
|
26
|
+
checksum: string;
|
|
27
|
+
}
|
|
28
|
+
/** Record of an installed tool in the local registry */
|
|
29
|
+
export interface McpInstallRecord {
|
|
30
|
+
id: string;
|
|
31
|
+
version: string;
|
|
32
|
+
installedAt: string;
|
|
33
|
+
path: string;
|
|
34
|
+
config: Record<string, unknown>;
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** Result of a sandboxed tool execution */
|
|
38
|
+
export interface McpSandboxResult {
|
|
39
|
+
stdout: string;
|
|
40
|
+
stderr: string;
|
|
41
|
+
exitCode: number;
|
|
42
|
+
artifacts: string[];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAIA,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,+DAA+D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAS5F,qBAAa,aAAa;IAEtB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS;gBADT,EAAE,EAAS,QAAQ,CAAC,QAAQ,EAC5B,SAAS,EAAE,MAAM;IAGrB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDhE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO7C,WAAW,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;IA8BvF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAKhD,OAAO,CAAC,eAAe,UAAQ,GAAG,WAAW,EAAE;IAQ/C,OAAO,CAAC,UAAU;CAanB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SubagentTask, SubagentJob, SubagentResult, ReviewDecision } from './types.js';
|
|
2
|
+
/** Event emitter interface compatible with AgentEventEmitter */
|
|
3
|
+
interface EventBus {
|
|
4
|
+
emit(event: string, data: unknown): void;
|
|
5
|
+
}
|
|
6
|
+
export declare class SubagentOrchestrator {
|
|
7
|
+
private jobs;
|
|
8
|
+
private events;
|
|
9
|
+
private defaultProvider;
|
|
10
|
+
private defaultModel;
|
|
11
|
+
private apiKey?;
|
|
12
|
+
private baseUrl?;
|
|
13
|
+
constructor(options: {
|
|
14
|
+
events: EventBus;
|
|
15
|
+
defaultProvider?: string;
|
|
16
|
+
defaultModel?: string;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
baseUrl?: string;
|
|
19
|
+
});
|
|
20
|
+
/** Spawn a new background subagent */
|
|
21
|
+
spawn(task: SubagentTask): SubagentJob;
|
|
22
|
+
/** Abort a running subagent */
|
|
23
|
+
abort(jobId: string): boolean;
|
|
24
|
+
/** Send a review decision back to a subagent (for retry loops) */
|
|
25
|
+
review(jobId: string, decision: ReviewDecision, feedback?: string): boolean;
|
|
26
|
+
/** List all active (non-finished) jobs */
|
|
27
|
+
listActive(): SubagentJob[];
|
|
28
|
+
/** Get a specific job by ID */
|
|
29
|
+
get(jobId: string): SubagentJob | undefined;
|
|
30
|
+
/** Get result of a finished job */
|
|
31
|
+
getResult(jobId: string): SubagentResult | undefined;
|
|
32
|
+
/** Dispose all workers */
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
35
|
+
export * from './types.js';
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EAEd,cAAc,EAEf,MAAM,YAAY,CAAC;AAKpB,gEAAgE;AAChE,UAAU,QAAQ;IAChB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1C;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,OAAO,EAAE;QACnB,MAAM,EAAE,QAAQ,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;IAQD,sCAAsC;IACtC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW;IA6DtC,+BAA+B;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ7B,kEAAkE;IAClE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAQ3E,0CAA0C;IAC1C,UAAU,IAAI,WAAW,EAAE;IAM3B,+BAA+B;IAC/B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI3C,mCAAmC;IACnC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIpD,0BAA0B;IAC1B,OAAO,IAAI,IAAI;CAMhB;AAED,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Subagent Orchestrator
|
|
3
|
+
// Manages background worker_threads for delegated tasks.
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { Worker } from 'node:worker_threads';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { dirname, join } from 'node:path';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
export class SubagentOrchestrator {
|
|
11
|
+
jobs = new Map();
|
|
12
|
+
events;
|
|
13
|
+
defaultProvider;
|
|
14
|
+
defaultModel;
|
|
15
|
+
apiKey;
|
|
16
|
+
baseUrl;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.events = options.events;
|
|
19
|
+
this.defaultProvider = options.defaultProvider ?? 'proxy';
|
|
20
|
+
this.defaultModel = options.defaultModel ?? 'gpt-4o';
|
|
21
|
+
this.apiKey = options.apiKey;
|
|
22
|
+
this.baseUrl = options.baseUrl;
|
|
23
|
+
}
|
|
24
|
+
/** Spawn a new background subagent */
|
|
25
|
+
spawn(task) {
|
|
26
|
+
const workerPath = join(__dirname, 'worker.js');
|
|
27
|
+
const worker = new Worker(workerPath, {
|
|
28
|
+
workerData: {
|
|
29
|
+
task,
|
|
30
|
+
provider: task.provider ?? this.defaultProvider,
|
|
31
|
+
model: task.model ?? this.defaultModel,
|
|
32
|
+
apiKey: this.apiKey,
|
|
33
|
+
baseUrl: this.baseUrl,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const job = {
|
|
37
|
+
task,
|
|
38
|
+
status: 'queued',
|
|
39
|
+
worker,
|
|
40
|
+
startTime: Date.now(),
|
|
41
|
+
progress: [],
|
|
42
|
+
};
|
|
43
|
+
this.jobs.set(task.id, job);
|
|
44
|
+
worker.on('message', (msg) => {
|
|
45
|
+
switch (msg.type) {
|
|
46
|
+
case 'progress': {
|
|
47
|
+
job.status = msg.data.status;
|
|
48
|
+
job.progress.push(msg.data);
|
|
49
|
+
this.events.emit('subagent:progress', msg.data);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 'result': {
|
|
53
|
+
job.status = msg.data.status === 'success' ? 'reviewing' : msg.data.status;
|
|
54
|
+
job.result = msg.data;
|
|
55
|
+
this.events.emit('subagent:done', msg.data);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'error': {
|
|
59
|
+
job.status = 'error';
|
|
60
|
+
this.events.emit('subagent:error', { jobId: task.id, error: msg.error });
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
worker.on('error', (err) => {
|
|
66
|
+
job.status = 'error';
|
|
67
|
+
this.events.emit('subagent:error', { jobId: task.id, error: err.message });
|
|
68
|
+
});
|
|
69
|
+
worker.on('exit', (code) => {
|
|
70
|
+
if (code !== 0 && job.status !== 'success' && job.status !== 'error' && job.status !== 'aborted') {
|
|
71
|
+
job.status = 'error';
|
|
72
|
+
this.events.emit('subagent:error', { jobId: task.id, error: `Worker exited with code ${code}` });
|
|
73
|
+
}
|
|
74
|
+
this.jobs.delete(task.id);
|
|
75
|
+
});
|
|
76
|
+
this.events.emit('subagent:spawn', { jobId: task.id, task: task.task });
|
|
77
|
+
return job;
|
|
78
|
+
}
|
|
79
|
+
/** Abort a running subagent */
|
|
80
|
+
abort(jobId) {
|
|
81
|
+
const job = this.jobs.get(jobId);
|
|
82
|
+
if (!job)
|
|
83
|
+
return false;
|
|
84
|
+
job.worker.postMessage({ type: 'abort' });
|
|
85
|
+
job.status = 'aborted';
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
/** Send a review decision back to a subagent (for retry loops) */
|
|
89
|
+
review(jobId, decision, feedback) {
|
|
90
|
+
const job = this.jobs.get(jobId);
|
|
91
|
+
if (!job)
|
|
92
|
+
return false;
|
|
93
|
+
job.worker.postMessage({ type: 'review', decision, feedback });
|
|
94
|
+
job.status = decision === 'retry' ? 'running' : decision === 'apply' ? 'success' : 'aborted';
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/** List all active (non-finished) jobs */
|
|
98
|
+
listActive() {
|
|
99
|
+
return Array.from(this.jobs.values()).filter(j => j.status !== 'success' && j.status !== 'error' && j.status !== 'aborted');
|
|
100
|
+
}
|
|
101
|
+
/** Get a specific job by ID */
|
|
102
|
+
get(jobId) {
|
|
103
|
+
return this.jobs.get(jobId);
|
|
104
|
+
}
|
|
105
|
+
/** Get result of a finished job */
|
|
106
|
+
getResult(jobId) {
|
|
107
|
+
return this.jobs.get(jobId)?.result;
|
|
108
|
+
}
|
|
109
|
+
/** Dispose all workers */
|
|
110
|
+
dispose() {
|
|
111
|
+
for (const job of this.jobs.values()) {
|
|
112
|
+
job.worker.terminate().catch(() => { });
|
|
113
|
+
}
|
|
114
|
+
this.jobs.clear();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export * from './types.js';
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"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"}
|