nexus-mcp-agent 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +56 -0
- package/README.md +74 -0
- package/dist/core/config.d.ts +46 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +68 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/logger.d.ts +7 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/registry.d.ts +21 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +52 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/server.d.ts +12 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +120 -0
- package/dist/core/server.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/agents/index.d.ts +18 -0
- package/dist/tools/agents/index.d.ts.map +1 -0
- package/dist/tools/agents/index.js +134 -0
- package/dist/tools/agents/index.js.map +1 -0
- package/dist/tools/automation/index.d.ts +4 -0
- package/dist/tools/automation/index.d.ts.map +1 -0
- package/dist/tools/automation/index.js +95 -0
- package/dist/tools/automation/index.js.map +1 -0
- package/dist/tools/filesystem/index.d.ts +4 -0
- package/dist/tools/filesystem/index.d.ts.map +1 -0
- package/dist/tools/filesystem/index.js +261 -0
- package/dist/tools/filesystem/index.js.map +1 -0
- package/dist/tools/git/index.d.ts +4 -0
- package/dist/tools/git/index.d.ts.map +1 -0
- package/dist/tools/git/index.js +177 -0
- package/dist/tools/git/index.js.map +1 -0
- package/dist/tools/memory/index.d.ts +4 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +178 -0
- package/dist/tools/memory/index.js.map +1 -0
- package/dist/tools/system/index.d.ts +4 -0
- package/dist/tools/system/index.d.ts.map +1 -0
- package/dist/tools/system/index.js +121 -0
- package/dist/tools/system/index.js.map +1 -0
- package/dist/tools/terminal/index.d.ts +4 -0
- package/dist/tools/terminal/index.d.ts.map +1 -0
- package/dist/tools/terminal/index.js +86 -0
- package/dist/tools/terminal/index.js.map +1 -0
- package/dist/tools/web/index.d.ts +4 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +193 -0
- package/dist/tools/web/index.js.map +1 -0
- package/docs/SECURITY.md +31 -0
- package/mcp-config.json +9 -0
- package/package.json +65 -0
- package/scripts/setup.js +102 -0
- package/src/core/config.ts +138 -0
- package/src/core/logger.ts +61 -0
- package/src/core/registry.ts +72 -0
- package/src/core/server.ts +144 -0
- package/src/index.ts +46 -0
- package/src/tools/agents/index.ts +172 -0
- package/src/tools/automation/index.ts +127 -0
- package/src/tools/filesystem/index.ts +303 -0
- package/src/tools/git/index.ts +201 -0
- package/src/tools/memory/index.ts +204 -0
- package/src/tools/system/index.ts +140 -0
- package/src/tools/terminal/index.ts +105 -0
- package/src/tools/web/index.ts +224 -0
- package/tsconfig.json +30 -0
package/.env.example
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# === NEXUS - Autonomous AI Ecosystem ===
|
|
2
|
+
# Copy this file to .env and fill in your values
|
|
3
|
+
# NEXUS works without any API keys by default (DuckDuckGo search, Ollama local LLM)
|
|
4
|
+
|
|
5
|
+
# --- LLM Providers (optional - NEXUS works without these) ---
|
|
6
|
+
OPENAI_API_KEY=
|
|
7
|
+
ANTHROPIC_API_KEY=
|
|
8
|
+
OLLAMA_BASE_URL=http://localhost:11434
|
|
9
|
+
|
|
10
|
+
# --- Default LLM Provider ---
|
|
11
|
+
# Options: openai, anthropic, ollama
|
|
12
|
+
DEFAULT_LLM_PROVIDER=ollama
|
|
13
|
+
DEFAULT_LLM_MODEL=llama3
|
|
14
|
+
|
|
15
|
+
# --- Web Search (optional - DuckDuckGo used by default, no key needed) ---
|
|
16
|
+
BRAVE_SEARCH_API_KEY=
|
|
17
|
+
DEFAULT_SEARCH_PROVIDER=duckduckgo
|
|
18
|
+
|
|
19
|
+
# --- Vector Database ---
|
|
20
|
+
# Options: chroma-local, chroma-remote, sqlite-vss
|
|
21
|
+
VECTOR_DB=chroma-local
|
|
22
|
+
CHROMA_URL=http://localhost:8000
|
|
23
|
+
CHROMA_COLLECTION=nexus_memory
|
|
24
|
+
|
|
25
|
+
# --- State Database ---
|
|
26
|
+
STATE_DB_PATH=./data/state.sqlite
|
|
27
|
+
|
|
28
|
+
# --- Directories ---
|
|
29
|
+
WORKSPACE_DIR=./workspace
|
|
30
|
+
DATA_DIR=./data
|
|
31
|
+
LOGS_DIR=./logs
|
|
32
|
+
SKILLS_DIR=./skills
|
|
33
|
+
|
|
34
|
+
# --- Security ---
|
|
35
|
+
# Allowed directories for file operations (comma-separated)
|
|
36
|
+
ALLOWED_DIRS=./workspace
|
|
37
|
+
# Shell command restrictions (comma-separated blocked commands)
|
|
38
|
+
BLOCKED_COMMANDS=rm -rf /,format,mkfs,dd if=/dev/zero
|
|
39
|
+
# Enable audit logging
|
|
40
|
+
AUDIT_LOG_ENABLED=true
|
|
41
|
+
|
|
42
|
+
# --- Automation ---
|
|
43
|
+
# Enable cron scheduler
|
|
44
|
+
CRON_ENABLED=true
|
|
45
|
+
# Enable file watcher
|
|
46
|
+
WATCHER_ENABLED=true
|
|
47
|
+
|
|
48
|
+
# --- Logging ---
|
|
49
|
+
# Options: debug, info, warn, error
|
|
50
|
+
LOG_LEVEL=info
|
|
51
|
+
|
|
52
|
+
# --- Browser ---
|
|
53
|
+
# Headless mode for Playwright
|
|
54
|
+
BROWSER_HEADLESS=true
|
|
55
|
+
# Browser timeout (ms)
|
|
56
|
+
BROWSER_TIMEOUT=30000
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# NEXUS - Autonomous AI Agent MCP Server
|
|
2
|
+
|
|
3
|
+
**NEXUS** is an MCP (Model Context Protocol) server for autonomous AI agents. No API keys required — works out of the box.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run directly with npx (no install needed)
|
|
9
|
+
npx -y @seydi/nexus
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Or add to your MCP client config:
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"mcpServers": {
|
|
17
|
+
"nexus": {
|
|
18
|
+
"command": "npx",
|
|
19
|
+
"args": ["-y", "@seydi/nexus"],
|
|
20
|
+
"env": {}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Local Development
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
git clone <this-repo>
|
|
30
|
+
cd nexus
|
|
31
|
+
npm install
|
|
32
|
+
npm run build
|
|
33
|
+
npm start
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Available Tools (40+)
|
|
37
|
+
|
|
38
|
+
### Web
|
|
39
|
+
`web_search` `web_browse` `web_scrape` `api_call`
|
|
40
|
+
|
|
41
|
+
### Filesystem
|
|
42
|
+
`fs_read` `fs_write` `fs_delete` `fs_list` `fs_search` `fs_move` `fs_copy`
|
|
43
|
+
|
|
44
|
+
### Terminal
|
|
45
|
+
`shell_exec` `process_list` `system_info`
|
|
46
|
+
|
|
47
|
+
### Memory
|
|
48
|
+
`memory_store` `memory_search` `memory_get` `memory_forget` `memory_list`
|
|
49
|
+
|
|
50
|
+
### Git
|
|
51
|
+
`git_status` `git_diff` `git_log` `git_commit` `git_push` `git_pull` `git_branch`
|
|
52
|
+
|
|
53
|
+
### Automation
|
|
54
|
+
`cron_add` `cron_list` `cron_remove` `cron_toggle`
|
|
55
|
+
|
|
56
|
+
### Agents
|
|
57
|
+
`agent_create` `agent_list` `agent_get` `agent_delete` `agent_templates`
|
|
58
|
+
|
|
59
|
+
### System
|
|
60
|
+
`system_info_full` `config_get` `config_set` `env_read` `ping`
|
|
61
|
+
|
|
62
|
+
## Zero Config
|
|
63
|
+
|
|
64
|
+
NEXUS works with zero configuration:
|
|
65
|
+
- **Search**: DuckDuckGo (no API key)
|
|
66
|
+
- **LLM**: Ollama (local, no API key)
|
|
67
|
+
- **Memory**: In-memory fallback (no ChromaDB needed)
|
|
68
|
+
- **Browser**: Playwright (bundled)
|
|
69
|
+
|
|
70
|
+
Optional API keys (OpenAI, Anthropic, Brave) can be set via `.env` for enhanced capabilities.
|
|
71
|
+
|
|
72
|
+
## License
|
|
73
|
+
|
|
74
|
+
MIT
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface NexusConfig {
|
|
2
|
+
llm: {
|
|
3
|
+
provider: 'openai' | 'anthropic' | 'ollama';
|
|
4
|
+
model: string;
|
|
5
|
+
openaiApiKey?: string;
|
|
6
|
+
anthropicApiKey?: string;
|
|
7
|
+
ollamaUrl: string;
|
|
8
|
+
};
|
|
9
|
+
search: {
|
|
10
|
+
provider: 'brave' | 'google' | 'duckduckgo';
|
|
11
|
+
braveApiKey?: string;
|
|
12
|
+
};
|
|
13
|
+
vector: {
|
|
14
|
+
type: 'chroma-local' | 'chroma-remote' | 'sqlite-vss';
|
|
15
|
+
chromaUrl: string;
|
|
16
|
+
collection: string;
|
|
17
|
+
};
|
|
18
|
+
state: {
|
|
19
|
+
dbPath: string;
|
|
20
|
+
};
|
|
21
|
+
paths: {
|
|
22
|
+
workspace: string;
|
|
23
|
+
data: string;
|
|
24
|
+
logs: string;
|
|
25
|
+
skills: string;
|
|
26
|
+
};
|
|
27
|
+
security: {
|
|
28
|
+
allowedDirs: string[];
|
|
29
|
+
blockedCommands: string[];
|
|
30
|
+
auditLogEnabled: boolean;
|
|
31
|
+
};
|
|
32
|
+
automation: {
|
|
33
|
+
cronEnabled: boolean;
|
|
34
|
+
watcherEnabled: boolean;
|
|
35
|
+
};
|
|
36
|
+
logging: {
|
|
37
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
38
|
+
};
|
|
39
|
+
browser: {
|
|
40
|
+
headless: boolean;
|
|
41
|
+
timeout: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export declare const nexusConfig: NexusConfig;
|
|
45
|
+
export declare function validateConfig(): string[];
|
|
46
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAE1B,GAAG,EAAE;QACH,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC5C,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAGF,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;QAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,YAAY,CAAC;QACtD,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IAGF,UAAU,EAAE;QACV,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IAGF,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;KAC5C,CAAC;IAGF,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAYD,eAAO,MAAM,WAAW,EAAE,WAkDzB,CAAC;AAEF,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
// Load .env file
|
|
5
|
+
const envPath = process.env.NEXUS_CONFIG || resolve(process.cwd(), '.env');
|
|
6
|
+
if (existsSync(envPath)) {
|
|
7
|
+
config({ path: envPath });
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
config();
|
|
11
|
+
}
|
|
12
|
+
function parseBool(val, defaultVal) {
|
|
13
|
+
if (!val)
|
|
14
|
+
return defaultVal;
|
|
15
|
+
return val.toLowerCase() === 'true' || val === '1';
|
|
16
|
+
}
|
|
17
|
+
function parseList(val) {
|
|
18
|
+
if (!val)
|
|
19
|
+
return [];
|
|
20
|
+
return val.split(',').map(s => s.trim()).filter(Boolean);
|
|
21
|
+
}
|
|
22
|
+
export const nexusConfig = {
|
|
23
|
+
llm: {
|
|
24
|
+
provider: process.env.DEFAULT_LLM_PROVIDER || 'openai',
|
|
25
|
+
model: process.env.DEFAULT_LLM_MODEL || 'gpt-4o',
|
|
26
|
+
openaiApiKey: process.env.OPENAI_API_KEY,
|
|
27
|
+
anthropicApiKey: process.env.ANTHROPIC_API_KEY,
|
|
28
|
+
ollamaUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
|
|
29
|
+
},
|
|
30
|
+
search: {
|
|
31
|
+
provider: process.env.DEFAULT_SEARCH_PROVIDER || 'duckduckgo',
|
|
32
|
+
braveApiKey: process.env.BRAVE_SEARCH_API_KEY,
|
|
33
|
+
},
|
|
34
|
+
vector: {
|
|
35
|
+
type: process.env.VECTOR_DB || 'chroma-local',
|
|
36
|
+
chromaUrl: process.env.CHROMA_URL || 'http://localhost:8000',
|
|
37
|
+
collection: process.env.CHROMA_COLLECTION || 'nexus_memory',
|
|
38
|
+
},
|
|
39
|
+
state: {
|
|
40
|
+
dbPath: process.env.STATE_DB_PATH || './data/state.sqlite',
|
|
41
|
+
},
|
|
42
|
+
paths: {
|
|
43
|
+
workspace: process.env.WORKSPACE_DIR || './workspace',
|
|
44
|
+
data: process.env.DATA_DIR || './data',
|
|
45
|
+
logs: process.env.LOGS_DIR || './logs',
|
|
46
|
+
skills: process.env.SKILLS_DIR || './skills',
|
|
47
|
+
},
|
|
48
|
+
security: {
|
|
49
|
+
allowedDirs: parseList(process.env.ALLOWED_DIRS) || ['./workspace'],
|
|
50
|
+
blockedCommands: parseList(process.env.BLOCKED_COMMANDS) || ['rm -rf /'],
|
|
51
|
+
auditLogEnabled: parseBool(process.env.AUDIT_LOG_ENABLED, true),
|
|
52
|
+
},
|
|
53
|
+
automation: {
|
|
54
|
+
cronEnabled: parseBool(process.env.CRON_ENABLED, true),
|
|
55
|
+
watcherEnabled: parseBool(process.env.WATCHER_ENABLED, true),
|
|
56
|
+
},
|
|
57
|
+
logging: {
|
|
58
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
59
|
+
},
|
|
60
|
+
browser: {
|
|
61
|
+
headless: parseBool(process.env.BROWSER_HEADLESS, true),
|
|
62
|
+
timeout: parseInt(process.env.BROWSER_TIMEOUT || '30000', 10),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export function validateConfig() {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
export declare const logger: pino.Logger<never, boolean>;
|
|
3
|
+
export type Logger = typeof logger;
|
|
4
|
+
export declare function createContextLogger(context: string): Logger;
|
|
5
|
+
export declare const auditLogger: pino.Logger<never, boolean>;
|
|
6
|
+
export declare function logAudit(event: string, details: Record<string, any>): void;
|
|
7
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAcxB,eAAO,MAAM,MAAM,6BAqBjB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAGnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAGD,eAAO,MAAM,WAAW,6BAStB,CAAC;AAEH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI1E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { mkdirSync, existsSync } from 'fs';
|
|
4
|
+
import { nexusConfig } from './config.js';
|
|
5
|
+
// Ensure logs directory exists
|
|
6
|
+
const logsDir = resolve(nexusConfig.paths.logs);
|
|
7
|
+
if (!existsSync(logsDir)) {
|
|
8
|
+
mkdirSync(logsDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
const logFile = resolve(logsDir, `nexus-${new Date().toISOString().split('T')[0]}.log`);
|
|
11
|
+
// Create logger with both console and file transport
|
|
12
|
+
export const logger = pino({
|
|
13
|
+
level: nexusConfig.logging.level,
|
|
14
|
+
transport: {
|
|
15
|
+
targets: [
|
|
16
|
+
{
|
|
17
|
+
target: 'pino-pretty',
|
|
18
|
+
options: {
|
|
19
|
+
colorize: true,
|
|
20
|
+
translateTime: 'SYS:standard',
|
|
21
|
+
ignore: 'pid,hostname',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
target: 'pino/file',
|
|
26
|
+
options: {
|
|
27
|
+
destination: logFile,
|
|
28
|
+
mkdir: true,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
// Create child logger with context
|
|
35
|
+
export function createContextLogger(context) {
|
|
36
|
+
return logger.child({ context });
|
|
37
|
+
}
|
|
38
|
+
// Audit logger for security-sensitive operations
|
|
39
|
+
export const auditLogger = pino({
|
|
40
|
+
level: 'info',
|
|
41
|
+
transport: {
|
|
42
|
+
target: 'pino/file',
|
|
43
|
+
options: {
|
|
44
|
+
destination: resolve(logsDir, 'audit.log'),
|
|
45
|
+
mkdir: true,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
export function logAudit(event, details) {
|
|
50
|
+
if (nexusConfig.security.auditLogEnabled) {
|
|
51
|
+
auditLogger.info({ event, ...details, timestamp: new Date().toISOString() }, event);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,+BAA+B;AAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAExF,qDAAqD;AACrD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;IAChC,SAAS,EAAE;QACT,OAAO,EAAE;YACP;gBACE,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,cAAc;oBAC7B,MAAM,EAAE,cAAc;iBACvB;aACF;YACD;gBACE,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE;oBACP,WAAW,EAAE,OAAO;oBACpB,KAAK,EAAE,IAAI;iBACZ;aACF;SACF;KACF;CACF,CAAC,CAAC;AAIH,mCAAmC;AACnC,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM;IACb,SAAS,EAAE;QACT,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE;YACP,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;YAC1C,KAAK,EAAE,IAAI;SACZ;KACF;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,OAA4B;IAClE,IAAI,WAAW,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACzC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ToolMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
category: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters?: any;
|
|
6
|
+
handler: (params: any) => Promise<any>;
|
|
7
|
+
requiresConfirmation?: boolean;
|
|
8
|
+
sideEffects?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class ToolRegistry {
|
|
11
|
+
private tools;
|
|
12
|
+
register(tool: ToolMetadata): void;
|
|
13
|
+
get(name: string): ToolMetadata | undefined;
|
|
14
|
+
has(name: string): boolean;
|
|
15
|
+
list(): ToolMetadata[];
|
|
16
|
+
listByCategory(category: string): ToolMetadata[];
|
|
17
|
+
getCategories(): string[];
|
|
18
|
+
getToolCount(): number;
|
|
19
|
+
execute(name: string, params: any): Promise<any>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAwC;IAErD,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQlC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,YAAY,EAAE;IAItB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE;IAIhD,aAAa,IAAI,MAAM,EAAE;IAMzB,YAAY,IAAI,MAAM;IAIhB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAoBvD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createContextLogger } from './logger.js';
|
|
2
|
+
const log = createContextLogger('registry');
|
|
3
|
+
export class ToolRegistry {
|
|
4
|
+
tools = new Map();
|
|
5
|
+
register(tool) {
|
|
6
|
+
if (this.tools.has(tool.name)) {
|
|
7
|
+
log.warn(`Tool ${tool.name} already registered, overwriting`);
|
|
8
|
+
}
|
|
9
|
+
this.tools.set(tool.name, tool);
|
|
10
|
+
log.debug(`Registered tool: ${tool.name} (${tool.category})`);
|
|
11
|
+
}
|
|
12
|
+
get(name) {
|
|
13
|
+
return this.tools.get(name);
|
|
14
|
+
}
|
|
15
|
+
has(name) {
|
|
16
|
+
return this.tools.has(name);
|
|
17
|
+
}
|
|
18
|
+
list() {
|
|
19
|
+
return Array.from(this.tools.values());
|
|
20
|
+
}
|
|
21
|
+
listByCategory(category) {
|
|
22
|
+
return this.list().filter(t => t.category === category);
|
|
23
|
+
}
|
|
24
|
+
getCategories() {
|
|
25
|
+
const categories = new Set();
|
|
26
|
+
this.tools.forEach(t => categories.add(t.category));
|
|
27
|
+
return Array.from(categories);
|
|
28
|
+
}
|
|
29
|
+
getToolCount() {
|
|
30
|
+
return this.tools.size;
|
|
31
|
+
}
|
|
32
|
+
async execute(name, params) {
|
|
33
|
+
const tool = this.tools.get(name);
|
|
34
|
+
if (!tool) {
|
|
35
|
+
throw new Error(`Tool not found: ${name}`);
|
|
36
|
+
}
|
|
37
|
+
log.info({ params }, `Executing tool: ${name}`);
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
const result = await tool.handler(params);
|
|
41
|
+
const duration = Date.now() - startTime;
|
|
42
|
+
log.info({ duration }, `Tool ${name} completed`);
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const duration = Date.now() - startTime;
|
|
47
|
+
log.error({ error, duration }, `Tool ${name} failed`);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAY5C,MAAM,OAAO,YAAY;IACf,KAAK,GAA8B,IAAI,GAAG,EAAE,CAAC;IAErD,QAAQ,CAAC,IAAkB;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,kCAAkC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa;QACX,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAW;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class NexusServer {
|
|
2
|
+
private server;
|
|
3
|
+
private registry;
|
|
4
|
+
private transport;
|
|
5
|
+
constructor();
|
|
6
|
+
initialize(): Promise<void>;
|
|
7
|
+
private registerResources;
|
|
8
|
+
private registerPrompts;
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAkBA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAqC;;IAYhD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,eAAe;IAuCjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createContextLogger } from './logger.js';
|
|
4
|
+
import { nexusConfig, validateConfig } from './config.js';
|
|
5
|
+
import { ToolRegistry } from './registry.js';
|
|
6
|
+
// Import tool modules
|
|
7
|
+
import { registerWebTools } from '../tools/web/index.js';
|
|
8
|
+
import { registerFilesystemTools } from '../tools/filesystem/index.js';
|
|
9
|
+
import { registerTerminalTools } from '../tools/terminal/index.js';
|
|
10
|
+
import { registerGitTools } from '../tools/git/index.js';
|
|
11
|
+
import { registerMemoryTools } from '../tools/memory/index.js';
|
|
12
|
+
import { registerAutomationTools } from '../tools/automation/index.js';
|
|
13
|
+
import { registerAgentTools } from '../tools/agents/index.js';
|
|
14
|
+
import { registerSystemTools } from '../tools/system/index.js';
|
|
15
|
+
const log = createContextLogger('server');
|
|
16
|
+
export class NexusServer {
|
|
17
|
+
server;
|
|
18
|
+
registry;
|
|
19
|
+
transport = null;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.server = new McpServer({
|
|
22
|
+
name: 'NEXUS',
|
|
23
|
+
version: '0.1.0',
|
|
24
|
+
description: 'Autonomous AI Agent Ecosystem - Self-empowered MCP Server',
|
|
25
|
+
});
|
|
26
|
+
this.registry = new ToolRegistry();
|
|
27
|
+
}
|
|
28
|
+
async initialize() {
|
|
29
|
+
log.info('Initializing NEXUS server...');
|
|
30
|
+
// Validate configuration
|
|
31
|
+
const warnings = validateConfig();
|
|
32
|
+
warnings.forEach(w => log.warn(w));
|
|
33
|
+
// Register all tool categories
|
|
34
|
+
log.info('Registering tools...');
|
|
35
|
+
registerWebTools(this.server, this.registry);
|
|
36
|
+
registerFilesystemTools(this.server, this.registry);
|
|
37
|
+
registerTerminalTools(this.server, this.registry);
|
|
38
|
+
registerGitTools(this.server, this.registry);
|
|
39
|
+
registerMemoryTools(this.server, this.registry);
|
|
40
|
+
registerAutomationTools(this.server, this.registry);
|
|
41
|
+
registerAgentTools(this.server, this.registry);
|
|
42
|
+
registerSystemTools(this.server, this.registry);
|
|
43
|
+
const toolCount = this.registry.getToolCount();
|
|
44
|
+
log.info(`Registered ${toolCount} tools`);
|
|
45
|
+
// Register resources
|
|
46
|
+
this.registerResources();
|
|
47
|
+
// Register prompts
|
|
48
|
+
this.registerPrompts();
|
|
49
|
+
}
|
|
50
|
+
registerResources() {
|
|
51
|
+
// System info resource
|
|
52
|
+
this.server.resource('system-info', 'nexus://system/info', async (uri) => ({
|
|
53
|
+
contents: [{
|
|
54
|
+
uri: uri.href,
|
|
55
|
+
text: JSON.stringify({
|
|
56
|
+
name: 'NEXUS',
|
|
57
|
+
version: '0.1.0',
|
|
58
|
+
uptime: process.uptime(),
|
|
59
|
+
memory: process.memoryUsage(),
|
|
60
|
+
config: {
|
|
61
|
+
llmProvider: nexusConfig.llm.provider,
|
|
62
|
+
llmModel: nexusConfig.llm.model,
|
|
63
|
+
searchProvider: nexusConfig.search.provider,
|
|
64
|
+
vectorDb: nexusConfig.vector.type,
|
|
65
|
+
toolCount: this.registry.getToolCount(),
|
|
66
|
+
},
|
|
67
|
+
}, null, 2),
|
|
68
|
+
}],
|
|
69
|
+
}));
|
|
70
|
+
log.info('Registered resources');
|
|
71
|
+
}
|
|
72
|
+
registerPrompts() {
|
|
73
|
+
// System prompt for autonomous agent
|
|
74
|
+
this.server.prompt('autonomous-agent', 'System prompt for autonomous operation', () => ({
|
|
75
|
+
messages: [{
|
|
76
|
+
role: 'user',
|
|
77
|
+
content: {
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: `You are NEXUS, an autonomous AI agent with full system access.
|
|
80
|
+
|
|
81
|
+
You have the following capabilities:
|
|
82
|
+
- Web research (search, browse, scrape)
|
|
83
|
+
- File system operations (read, write, search)
|
|
84
|
+
- Terminal access (execute commands, spawn processes)
|
|
85
|
+
- Git operations
|
|
86
|
+
- Persistent memory (store and recall information)
|
|
87
|
+
- Task scheduling (cron jobs, workflows)
|
|
88
|
+
- Multi-agent orchestration
|
|
89
|
+
|
|
90
|
+
Guidelines:
|
|
91
|
+
1. Always verify your actions before executing
|
|
92
|
+
2. Log all significant operations
|
|
93
|
+
3. Store important discoveries in memory
|
|
94
|
+
4. Use sub-agents for complex parallel tasks
|
|
95
|
+
5. Respect security boundaries
|
|
96
|
+
6. Ask for confirmation on destructive operations
|
|
97
|
+
|
|
98
|
+
Current workspace: ${nexusConfig.paths.workspace}
|
|
99
|
+
Allowed directories: ${nexusConfig.security.allowedDirs.join(', ')}`,
|
|
100
|
+
},
|
|
101
|
+
}],
|
|
102
|
+
}));
|
|
103
|
+
log.info('Registered prompts');
|
|
104
|
+
}
|
|
105
|
+
async start() {
|
|
106
|
+
log.info('Starting MCP server on stdio...');
|
|
107
|
+
this.transport = new StdioServerTransport();
|
|
108
|
+
await this.server.connect(this.transport);
|
|
109
|
+
log.info('NEXUS server is running');
|
|
110
|
+
}
|
|
111
|
+
async stop() {
|
|
112
|
+
log.info('Stopping NEXUS server...');
|
|
113
|
+
if (this.transport) {
|
|
114
|
+
await this.transport.close();
|
|
115
|
+
}
|
|
116
|
+
await this.server.close();
|
|
117
|
+
log.info('NEXUS server stopped');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { NexusServer } from './core/server.js';
|
|
3
|
+
import { createContextLogger } from './core/logger.js';
|
|
4
|
+
const log = createContextLogger('main');
|
|
5
|
+
async function main() {
|
|
6
|
+
log.info('🧠NEXUS - Autonomous AI Agent Ecosystem');
|
|
7
|
+
log.info('========================================');
|
|
8
|
+
const server = new NexusServer();
|
|
9
|
+
// Handle graceful shutdown
|
|
10
|
+
process.on('SIGINT', async () => {
|
|
11
|
+
log.info('Received SIGINT, shutting down...');
|
|
12
|
+
await server.stop();
|
|
13
|
+
process.exit(0);
|
|
14
|
+
});
|
|
15
|
+
process.on('SIGTERM', async () => {
|
|
16
|
+
log.info('Received SIGTERM, shutting down...');
|
|
17
|
+
await server.stop();
|
|
18
|
+
process.exit(0);
|
|
19
|
+
});
|
|
20
|
+
process.on('uncaughtException', (error) => {
|
|
21
|
+
log.fatal({ error }, 'Uncaught exception');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
});
|
|
24
|
+
process.on('unhandledRejection', (reason) => {
|
|
25
|
+
log.fatal({ reason }, 'Unhandled rejection');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
await server.initialize();
|
|
30
|
+
await server.start();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
log.fatal({ error }, 'Failed to start NEXUS server');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
main();
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAExC,KAAK,UAAU,IAAI;IACjB,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ToolRegistry } from '../../core/registry.js';
|
|
3
|
+
export interface Agent {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
role: string;
|
|
7
|
+
systemPrompt: string;
|
|
8
|
+
skills: string[];
|
|
9
|
+
tools: string[];
|
|
10
|
+
status: 'idle' | 'running' | 'completed' | 'error';
|
|
11
|
+
createdAt: number;
|
|
12
|
+
lastActive?: number;
|
|
13
|
+
}
|
|
14
|
+
declare const agentTemplates: Record<string, Partial<Agent>>;
|
|
15
|
+
declare const agents: Map<string, Agent>;
|
|
16
|
+
export declare function registerAgentTools(server: McpServer, registry: ToolRegistry): void;
|
|
17
|
+
export { agents, agentTemplates };
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKtD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAoClD,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAa,CAAC;AA0E7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAqClF;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC"}
|