@ericnunes/frame-code-cli 0.0.2 → 0.0.3
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/dist/agent-runtime/index.js +0 -1
- package/dist/agent-runtime/registry/AgentRegistry.js +108 -36
- package/dist/agent-runtime/registry/index.js +1 -11
- package/dist/app/cli.js +3 -5
- package/dist/cli/commands/autonomous.js +8 -6
- package/dist/cli/commands/interactive.js +63 -146
- package/dist/cli/commands/memory.js +247 -76
- package/dist/content/agents/README.md +36 -32
- package/dist/content/agents/architect.md +1 -1
- package/dist/content/agents/builder.md +10 -14
- package/dist/content/agents/code-agent.md +1 -95
- package/dist/index.js +0 -6
- package/dist/infrastructure/config/config.js +40 -0
- package/dist/tools/index.js +0 -2
- package/dist/tools/registry/ToolInitializer.js +15 -55
- package/dist/tools/registry/index.js +1 -7
- package/package.json +11 -23
- package/dist/agent-runtime/AgentFacade.js +0 -33
- package/dist/agent-runtime/context/hooks/compressionHook.js +0 -56
- package/dist/agent-runtime/context/hooks/index.js +0 -5
- package/dist/agent-runtime/context/project-rules/loader.js +0 -72
- package/dist/agent-runtime/context/system-prompts/index.js +0 -5
- package/dist/agent-runtime/context/system-prompts/loader.js +0 -88
- package/dist/agent-runtime/flows/templates/ReactAgentFlow.js +0 -49
- package/dist/agent-runtime/registry/agentParser.js +0 -515
- package/dist/agent-runtime/registry/enums/agentType.enum.js +0 -8
- package/dist/agent-runtime/registry/interfaces/agentDependencies.interface.js +0 -2
- package/dist/agent-runtime/registry/interfaces/agentRegistry.interface.js +0 -2
- package/dist/app/bootstrap.js +0 -22
- package/dist/app/index.js +0 -9
- package/dist/cli/commands/index.js +0 -11
- package/dist/cli/commands/multi-agent.js +0 -131
- package/dist/cli/index.js +0 -18
- package/dist/cli/input/images/imageInput.js +0 -77
- package/dist/cli/input/images/readImageAttachment.js +0 -56
- package/dist/cli/input/index.js +0 -14
- package/dist/infrastructure/compression/CompressionManager.js +0 -315
- package/dist/infrastructure/compression/LLMCompressionService.js +0 -211
- package/dist/infrastructure/compression/index.js +0 -11
- package/dist/infrastructure/compression/promptBuilder.js +0 -132
- package/dist/infrastructure/config/agentConfig.interface.js +0 -2
- package/dist/infrastructure/config/agentConfig.js +0 -134
- package/dist/infrastructure/logging/index.js +0 -5
- package/dist/infrastructure/logging/logger.interface.js +0 -2
- package/dist/infrastructure/logging/raw-output-logger.js +0 -35
- package/dist/infrastructure/skills/index.js +0 -5
- package/dist/infrastructure/skills/loader.js +0 -104
- package/dist/infrastructure/telemetry/index.js +0 -9
- package/dist/infrastructure/telemetry/telemetry.interface.js +0 -2
- package/dist/infrastructure/telemetry/telemetryConfig.js +0 -30
- package/dist/infrastructure/telemetry/traceEventFormatter.js +0 -90
- package/dist/infrastructure/telemetry/traceSinkConsole.js +0 -17
- package/dist/scripts/_validate/telemetry-autonomous.js +0 -23
- package/dist/scripts/_validate/telemetry-multi-agent.js +0 -50
- package/dist/scripts/_validate/test-agents-md-dynamic-dir.js +0 -104
- package/dist/scripts/_validate/test-agents-md-injection.js +0 -125
- package/dist/scripts/_validate/test-agents-md-loader.js +0 -71
- package/dist/scripts/_validate/test-agents-md-priority.js +0 -121
- package/dist/scripts/_validate/test-chrome-mcp-agent.js +0 -89
- package/dist/tools/mcp/discoverer.js +0 -95
- package/dist/tools/mcp/index.js +0 -9
- package/dist/tools/mcp/loader.js +0 -36
- package/dist/tools/mcp/mcpConfig.interface.js +0 -2
- package/dist/tools/mcp/mcpMetadata.js +0 -2
- package/dist/tools/mcp/register.js +0 -269
- package/dist/tools/native/capabilities.js +0 -155
- package/dist/tools/native/file-outline.js +0 -301
- package/dist/tools/native/index.js +0 -20
- package/dist/tools/native/list-directory.js +0 -148
- package/dist/tools/native/read-image.js +0 -140
- package/dist/tools/registry/toolFilter.js +0 -52
- package/dist/tools/registry/toolRegistry.interface.js +0 -2
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const registry_1 = require("../../agent-runtime/registry");
|
|
5
|
-
const frame_agent_sdk_1 = require("@ericnunes/frame-agent-sdk");
|
|
6
|
-
const tools_1 = require("../../tools");
|
|
7
|
-
const config_1 = require("../../infrastructure/config");
|
|
8
|
-
const telemetry_1 = require("../../infrastructure/telemetry");
|
|
9
|
-
async function testChromeMcpAgent() {
|
|
10
|
-
try {
|
|
11
|
-
console.log('╔══════════════════════════════════════════════════════╗');
|
|
12
|
-
console.log('║ TESTE DO AGENTE CHROME MCP ║');
|
|
13
|
-
console.log('╚══════════════════════════════════════════════════════╝');
|
|
14
|
-
console.log('');
|
|
15
|
-
await (0, config_1.loadConfig)();
|
|
16
|
-
console.log('Inicializando ferramentas...');
|
|
17
|
-
await (0, tools_1.initializeTools)();
|
|
18
|
-
console.log('✅ Ferramentas inicializadas');
|
|
19
|
-
console.log('');
|
|
20
|
-
console.log('Inicializando agente Chrome MCP...');
|
|
21
|
-
const { trace, telemetry } = (0, telemetry_1.createCliTelemetry)();
|
|
22
|
-
const registry = registry_1.AgentRegistry.getInstance();
|
|
23
|
-
const graph = await registry.createEngine('chrome-mcp-agent', {
|
|
24
|
-
trace,
|
|
25
|
-
telemetry,
|
|
26
|
-
});
|
|
27
|
-
console.log('✅ Agente inicializado');
|
|
28
|
-
console.log('');
|
|
29
|
-
const testTask = 'Navegue para https://example.com e tire um screenshot da página';
|
|
30
|
-
console.log('📝 Tarefa de teste:');
|
|
31
|
-
console.log(` "${testTask}"`);
|
|
32
|
-
console.log('');
|
|
33
|
-
console.log('⏳ Executando...');
|
|
34
|
-
console.log('');
|
|
35
|
-
const initialState = {
|
|
36
|
-
messages: [{ role: 'user', content: testTask }],
|
|
37
|
-
data: {},
|
|
38
|
-
status: frame_agent_sdk_1.GraphStatus.RUNNING
|
|
39
|
-
};
|
|
40
|
-
const result = await graph.execute(initialState);
|
|
41
|
-
console.log('');
|
|
42
|
-
console.log('═══════════════════════════════════════════════════════');
|
|
43
|
-
console.log('📊 RESULTADO');
|
|
44
|
-
console.log('═══════════════════════════════════════════════════════');
|
|
45
|
-
console.log('');
|
|
46
|
-
console.log(`Status: ${result.status}`);
|
|
47
|
-
console.log('');
|
|
48
|
-
const lastToolCall = result.state.lastToolCall;
|
|
49
|
-
if (lastToolCall?.toolName === 'final_answer') {
|
|
50
|
-
const answer = lastToolCall?.params?.answer;
|
|
51
|
-
if (typeof answer === 'string' && answer.trim().length > 0) {
|
|
52
|
-
console.log('🤖 Resposta do Agente:');
|
|
53
|
-
console.log(answer);
|
|
54
|
-
console.log('');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const lastAssistantMessage = result.state.messages
|
|
58
|
-
.filter((msg) => msg.role === 'assistant')
|
|
59
|
-
.pop();
|
|
60
|
-
if (lastAssistantMessage && !lastToolCall?.toolName) {
|
|
61
|
-
console.log('🤖 Resposta do Agente:');
|
|
62
|
-
console.log(lastAssistantMessage.content);
|
|
63
|
-
console.log('');
|
|
64
|
-
}
|
|
65
|
-
if (result.state.logs && result.state.logs.length > 0) {
|
|
66
|
-
console.log('📋 Logs:');
|
|
67
|
-
result.state.logs.forEach((log) => {
|
|
68
|
-
console.log(` - ${log}`);
|
|
69
|
-
});
|
|
70
|
-
console.log('');
|
|
71
|
-
}
|
|
72
|
-
if (result.status === frame_agent_sdk_1.GraphStatus.ERROR) {
|
|
73
|
-
console.log('❌ Erro na execução');
|
|
74
|
-
console.log(result.state.logs?.join('\n') || 'Erro desconhecido');
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
|
-
console.log('✅ Teste concluído com sucesso!');
|
|
78
|
-
console.log('');
|
|
79
|
-
console.log('═══════════════════════════════════════════════════════');
|
|
80
|
-
process.exit(0);
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
console.error('');
|
|
84
|
-
console.error('❌ Erro no teste:');
|
|
85
|
-
console.error(error);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
testChromeMcpAgent();
|
|
@@ -1,95 +0,0 @@
|
|
|
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.discoverMcpTools = discoverMcpTools;
|
|
37
|
-
exports.loadUserCodeMcpConfigs = loadUserCodeMcpConfigs;
|
|
38
|
-
const fs = __importStar(require("fs"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const frame_agent_sdk_1 = require("@ericnunes/frame-agent-sdk");
|
|
41
|
-
const logger_1 = require("../../infrastructure/logging/logger");
|
|
42
|
-
async function discoverMcpTools(config) {
|
|
43
|
-
const mcp = new frame_agent_sdk_1.MCPBase(config);
|
|
44
|
-
try {
|
|
45
|
-
logger_1.logger.debug(`[McpDiscover] Conectando ao MCP ${config.id} (${config.name})...`);
|
|
46
|
-
await mcp.connect();
|
|
47
|
-
logger_1.logger.debug(`[McpDiscover] Descobrindo ferramentas do MCP ${config.id}...`);
|
|
48
|
-
const tools = await mcp.createTools();
|
|
49
|
-
const result = tools.map(t => ({
|
|
50
|
-
name: t.name,
|
|
51
|
-
description: t.description
|
|
52
|
-
}));
|
|
53
|
-
logger_1.logger.info(`[McpDiscover] MCP "${config.name}" descoberto com ${result.length} ferramentas`);
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
logger_1.logger.error(`[McpDiscover] Erro ao descobrir ferramentas do MCP ${config.id}:`, error);
|
|
58
|
-
throw new Error(`Falha ao descobrir ferramentas do MCP "${config.name}": ${error.message}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function loadUserCodeMcpConfigs() {
|
|
62
|
-
const mcpJsonPath = path.join(process.cwd(), '.code/mcp.json');
|
|
63
|
-
if (!fs.existsSync(mcpJsonPath)) {
|
|
64
|
-
return [];
|
|
65
|
-
}
|
|
66
|
-
try {
|
|
67
|
-
const content = fs.readFileSync(mcpJsonPath, 'utf-8');
|
|
68
|
-
const config = JSON.parse(content);
|
|
69
|
-
return (config.mcps || []).map((entry) => {
|
|
70
|
-
const configEntry = {
|
|
71
|
-
...entry,
|
|
72
|
-
mcp: entry.mcp || {}
|
|
73
|
-
};
|
|
74
|
-
if (entry.command) {
|
|
75
|
-
configEntry.command = expandEnvInString(entry.command);
|
|
76
|
-
}
|
|
77
|
-
if (entry.args) {
|
|
78
|
-
configEntry.args = entry.args.map(arg => expandEnvInString(arg));
|
|
79
|
-
}
|
|
80
|
-
return configEntry;
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
logger_1.logger.error('[McpDiscoverer] Erro ao carregar .code/mcp.json:', error);
|
|
85
|
-
return [];
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
function expandEnvInString(value) {
|
|
89
|
-
return value.replace(/\$\{([^:}]+)(?::-([^}]*))?\}/g, (_, varName, defaultValue) => {
|
|
90
|
-
if (varName in process.env) {
|
|
91
|
-
return process.env[varName] || '';
|
|
92
|
-
}
|
|
93
|
-
return defaultValue !== undefined ? defaultValue : '';
|
|
94
|
-
});
|
|
95
|
-
}
|
package/dist/tools/mcp/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.McpLoader = exports.discoverMcpTools = exports.registerMcpTools = void 0;
|
|
4
|
-
var register_1 = require("./register");
|
|
5
|
-
Object.defineProperty(exports, "registerMcpTools", { enumerable: true, get: function () { return register_1.registerMcpTools; } });
|
|
6
|
-
var discoverer_1 = require("./discoverer");
|
|
7
|
-
Object.defineProperty(exports, "discoverMcpTools", { enumerable: true, get: function () { return discoverer_1.discoverMcpTools; } });
|
|
8
|
-
var loader_1 = require("./loader");
|
|
9
|
-
Object.defineProperty(exports, "McpLoader", { enumerable: true, get: function () { return loader_1.McpLoader; } });
|
package/dist/tools/mcp/loader.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.McpLoader = void 0;
|
|
4
|
-
const discoverer_1 = require("./discoverer");
|
|
5
|
-
class McpLoader {
|
|
6
|
-
constructor() {
|
|
7
|
-
const userConfigs = (0, discoverer_1.loadUserCodeMcpConfigs)();
|
|
8
|
-
this.configs = [...userConfigs];
|
|
9
|
-
}
|
|
10
|
-
loadAllMcpConfigs() {
|
|
11
|
-
return this.configs
|
|
12
|
-
.filter(config => config.name !== undefined)
|
|
13
|
-
.map(config => ({
|
|
14
|
-
id: config.id,
|
|
15
|
-
name: config.name,
|
|
16
|
-
namespace: config.namespace || 'default',
|
|
17
|
-
type: 'mcp',
|
|
18
|
-
config,
|
|
19
|
-
registered: config.mcp?.enable !== false,
|
|
20
|
-
visible: config.mcp?.excludeFromList !== true
|
|
21
|
-
}));
|
|
22
|
-
}
|
|
23
|
-
loadVisibleMcpConfigs() {
|
|
24
|
-
return this.loadAllMcpConfigs().filter(m => m.visible);
|
|
25
|
-
}
|
|
26
|
-
loadRegisteredMcpConfigs() {
|
|
27
|
-
return this.loadAllMcpConfigs().filter(m => m.registered);
|
|
28
|
-
}
|
|
29
|
-
getMcpById(id) {
|
|
30
|
-
return this.loadAllMcpConfigs().find(m => m.id === id);
|
|
31
|
-
}
|
|
32
|
-
getMcpByNamespace(namespace) {
|
|
33
|
-
return this.loadAllMcpConfigs().filter(m => m.namespace === namespace);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.McpLoader = McpLoader;
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.registerMcpTools = registerMcpTools;
|
|
4
|
-
exports.registerChromeMcp = registerChromeMcp;
|
|
5
|
-
exports.isChromeMcpRunning = isChromeMcpRunning;
|
|
6
|
-
exports.startChromeMcp = startChromeMcp;
|
|
7
|
-
exports.isGitHubMcpRunning = isGitHubMcpRunning;
|
|
8
|
-
exports.startGitHubMcp = startGitHubMcp;
|
|
9
|
-
exports.isQdrantMcpRunning = isQdrantMcpRunning;
|
|
10
|
-
exports.startQdrantMcp = startQdrantMcp;
|
|
11
|
-
exports.stopQdrantMcp = stopQdrantMcp;
|
|
12
|
-
exports.registerQdrantMcp = registerQdrantMcp;
|
|
13
|
-
exports.isNeo4jMcpRunning = isNeo4jMcpRunning;
|
|
14
|
-
exports.startNeo4jMcp = startNeo4jMcp;
|
|
15
|
-
exports.stopNeo4jMcp = stopNeo4jMcp;
|
|
16
|
-
exports.registerNeo4jMcp = registerNeo4jMcp;
|
|
17
|
-
const frame_agent_sdk_1 = require("@ericnunes/frame-agent-sdk");
|
|
18
|
-
const logger_1 = require("../../infrastructure/logging/logger");
|
|
19
|
-
const loader_1 = require("./loader");
|
|
20
|
-
function getMcpConfigById(id) {
|
|
21
|
-
const loader = new loader_1.McpLoader();
|
|
22
|
-
const metadata = loader.getMcpById(id);
|
|
23
|
-
return metadata?.config;
|
|
24
|
-
}
|
|
25
|
-
async function registerMcpTools() {
|
|
26
|
-
const loader = new loader_1.McpLoader();
|
|
27
|
-
const configs = loader.loadRegisteredMcpConfigs();
|
|
28
|
-
let registeredCount = 0;
|
|
29
|
-
let skippedCount = 0;
|
|
30
|
-
for (const metadata of configs) {
|
|
31
|
-
const config = metadata.config;
|
|
32
|
-
if (!metadata.registered) {
|
|
33
|
-
logger_1.logger.info(`[registerMcpTools] MCP "${metadata.name}" (${metadata.id}) NÃO registrado (enable=false).`);
|
|
34
|
-
skippedCount++;
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
await registerSingleMcp(config, config.name || config.id);
|
|
39
|
-
registeredCount++;
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
logger_1.logger.error(`[registerMcpTools] Erro ao registrar MCP "${metadata.name}":`, error);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
logger_1.logger.info(`[registerMcpTools] ${registeredCount} MCPs registrados, ${skippedCount} pulados.`);
|
|
46
|
-
}
|
|
47
|
-
async function registerSingleMcp(config, name) {
|
|
48
|
-
const mcp = new frame_agent_sdk_1.MCPBase(config);
|
|
49
|
-
try {
|
|
50
|
-
logger_1.logger.info(`Conectando ao MCP ${config.id} (${name})...`);
|
|
51
|
-
await mcp.connect();
|
|
52
|
-
logger_1.logger.info(`Criando ferramentas para ${name}...`);
|
|
53
|
-
const tools = await mcp.createTools({
|
|
54
|
-
alias: {}
|
|
55
|
-
});
|
|
56
|
-
const aliasMap = {};
|
|
57
|
-
tools.forEach((tool) => {
|
|
58
|
-
const fullName = tool.name;
|
|
59
|
-
const shortName = fullName.replace(`mcp:${config.namespace}/`, '');
|
|
60
|
-
aliasMap[fullName] = shortName;
|
|
61
|
-
});
|
|
62
|
-
const toolsWithAlias = await mcp.createTools({ alias: aliasMap });
|
|
63
|
-
logger_1.logger.info(`Ferramentas criadas para ${name}: ${toolsWithAlias.length}`);
|
|
64
|
-
if (!toolsWithAlias.length) {
|
|
65
|
-
logger_1.logger.warn(`Nenhuma ferramenta MCP encontrada para ${name}`);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
logger_1.logger.info(`Registrando ${toolsWithAlias.length} ferramentas para ${name}...`);
|
|
69
|
-
toolsWithAlias.forEach((tool) => {
|
|
70
|
-
logger_1.logger.info(`Registrando ferramenta: ${tool.name}`);
|
|
71
|
-
tool._mcpNamespace = config.namespace;
|
|
72
|
-
tool._mcpId = config.id;
|
|
73
|
-
frame_agent_sdk_1.toolRegistry.register(tool);
|
|
74
|
-
logger_1.logger.debug(`Registrada ferramenta MCP (${name}): ${tool.name}`);
|
|
75
|
-
});
|
|
76
|
-
logger_1.logger.info(`✅ ${toolsWithAlias.length} ferramentas MCP registradas (${name}): ${toolsWithAlias.map((t) => t.name).join(', ')}`);
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
logger_1.logger.error(`❌ Falha crítica ao registrar ferramentas MCP (${name}): ${error.message}`);
|
|
80
|
-
logger_1.logger.debug('Stack trace:', error.stack);
|
|
81
|
-
if (error.code === 'ECONNREFUSED') {
|
|
82
|
-
logger_1.logger.error(`Verifique se o container Docker está rodando para ${name}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async function registerChromeMcp() {
|
|
87
|
-
const config = getMcpConfigById('chrome-devtools');
|
|
88
|
-
if (!config) {
|
|
89
|
-
throw new Error('Chrome MCP not found in .code/mcp.json');
|
|
90
|
-
}
|
|
91
|
-
await registerSingleMcp(config, config.name || config.id);
|
|
92
|
-
}
|
|
93
|
-
async function isChromeMcpRunning() {
|
|
94
|
-
try {
|
|
95
|
-
const config = getMcpConfigById('chrome-devtools');
|
|
96
|
-
if (!config)
|
|
97
|
-
return false;
|
|
98
|
-
const containerName = config.container || config.capabilities?.['docker-container'] || 'chrome-devtools-mcp-server';
|
|
99
|
-
const { execSync } = require('child_process');
|
|
100
|
-
execSync(`docker ps --filter name=${containerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
101
|
-
logger_1.logger.debug(`Container ${containerName} está rodando`);
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
logger_1.logger.debug(`Container chrome-devtools-mcp-server não está rodando`);
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
async function startChromeMcp() {
|
|
110
|
-
try {
|
|
111
|
-
const { execSync } = require('child_process');
|
|
112
|
-
const composePath = 'docker/chrome-mcp/docker-compose.yml';
|
|
113
|
-
logger_1.logger.info('Iniciando Chrome MCP via Docker Compose...');
|
|
114
|
-
execSync(`docker-compose -f ${composePath} up -d`, { stdio: 'inherit' });
|
|
115
|
-
logger_1.logger.info('Aguardando Chrome MCP inicializar...');
|
|
116
|
-
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
117
|
-
logger_1.logger.info('✅ Chrome MCP iniciado com sucesso');
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
logger_1.logger.error(`❌ Falha ao iniciar Chrome MCP: ${error.message}`);
|
|
121
|
-
throw error;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
async function isGitHubMcpRunning() {
|
|
125
|
-
try {
|
|
126
|
-
const config = getMcpConfigById('github-official');
|
|
127
|
-
if (!config)
|
|
128
|
-
return false;
|
|
129
|
-
const containerName = config.container || 'github-mcp-server';
|
|
130
|
-
const { execSync } = require('child_process');
|
|
131
|
-
execSync(`docker ps --filter name=${containerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
132
|
-
logger_1.logger.debug(`Container ${containerName} está rodando`);
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
logger_1.logger.debug(`Container github-mcp-server não está rodando`);
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
async function startGitHubMcp() {
|
|
141
|
-
try {
|
|
142
|
-
const config = getMcpConfigById('github-official');
|
|
143
|
-
if (!config) {
|
|
144
|
-
throw new Error('GitHub MCP not found in .code/mcp.json');
|
|
145
|
-
}
|
|
146
|
-
const { execSync } = require('child_process');
|
|
147
|
-
logger_1.logger.info('Iniciando GitHub MCP via Docker...');
|
|
148
|
-
const command = `docker ${(config.args || []).join(' ')}`;
|
|
149
|
-
execSync(command, { stdio: 'inherit' });
|
|
150
|
-
logger_1.logger.info('✅ GitHub MCP iniciado com sucesso');
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
logger_1.logger.error(`❌ Falha ao iniciar GitHub MCP: ${error.message}`);
|
|
154
|
-
throw error;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
async function isQdrantMcpRunning() {
|
|
158
|
-
try {
|
|
159
|
-
const config = getMcpConfigById('qdrant-official');
|
|
160
|
-
if (!config)
|
|
161
|
-
return false;
|
|
162
|
-
const mcpContainerName = config.container || 'frame-qdrant-mcp-server';
|
|
163
|
-
const dbContainerName = 'frame-qdrant-db';
|
|
164
|
-
const { execSync } = require('child_process');
|
|
165
|
-
execSync(`docker ps --filter name=${dbContainerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
166
|
-
execSync(`docker ps --filter name=${mcpContainerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
167
|
-
logger_1.logger.debug(`Containers Qdrant (${dbContainerName}) e MCP (${mcpContainerName}) estão rodando`);
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
logger_1.logger.debug(`Containers Qdrant MCP não estão rodando`);
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
async function startQdrantMcp() {
|
|
176
|
-
try {
|
|
177
|
-
const { execSync } = require('child_process');
|
|
178
|
-
const composePath = 'docker/qdrant-mcp/docker-compose.yml';
|
|
179
|
-
logger_1.logger.info('Iniciando Qdrant MCP via Docker Compose...');
|
|
180
|
-
execSync(`docker-compose -f ${composePath} up -d --build`, { stdio: 'inherit' });
|
|
181
|
-
logger_1.logger.info('Aguardando Qdrant e MCP Server inicializarem...');
|
|
182
|
-
await new Promise(resolve => setTimeout(resolve, 15000));
|
|
183
|
-
if (await isQdrantMcpRunning()) {
|
|
184
|
-
logger_1.logger.info('✅ Qdrant MCP iniciado com sucesso');
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
throw new Error('Containers não iniciaram corretamente');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
catch (error) {
|
|
191
|
-
logger_1.logger.error(`❌ Falha ao iniciar Qdrant MCP: ${error.message}`);
|
|
192
|
-
throw error;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
async function stopQdrantMcp() {
|
|
196
|
-
try {
|
|
197
|
-
const { execSync } = require('child_process');
|
|
198
|
-
const composePath = 'docker/qdrant-mcp/docker-compose.yml';
|
|
199
|
-
logger_1.logger.info('Parando Qdrant MCP via Docker Compose...');
|
|
200
|
-
execSync(`docker-compose -f ${composePath} down`, { stdio: 'inherit' });
|
|
201
|
-
logger_1.logger.info('✅ Qdrant MCP parado com sucesso');
|
|
202
|
-
}
|
|
203
|
-
catch (error) {
|
|
204
|
-
logger_1.logger.error(`❌ Falha ao parar Qdrant MCP: ${error.message}`);
|
|
205
|
-
throw error;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
async function registerQdrantMcp() {
|
|
209
|
-
const config = getMcpConfigById('qdrant-official');
|
|
210
|
-
if (!config) {
|
|
211
|
-
throw new Error('Qdrant MCP not found in .code/mcp.json');
|
|
212
|
-
}
|
|
213
|
-
await registerSingleMcp(config, config.name || config.id);
|
|
214
|
-
}
|
|
215
|
-
async function isNeo4jMcpRunning() {
|
|
216
|
-
try {
|
|
217
|
-
const { execSync } = require('child_process');
|
|
218
|
-
const dbContainerName = 'frame-neo4j-db';
|
|
219
|
-
const mcpContainerName = 'frame-neo4j-mcp-server';
|
|
220
|
-
execSync(`docker ps --filter name=${dbContainerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
221
|
-
execSync(`docker ps --filter name=${mcpContainerName} --format "{{.Names}}"`, { stdio: 'pipe' });
|
|
222
|
-
logger_1.logger.debug(`Containers Neo4j (${dbContainerName}) e MCP (${mcpContainerName}) estão rodando`);
|
|
223
|
-
return true;
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
logger_1.logger.debug(`Containers Neo4j MCP não estão rodando`);
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
async function startNeo4jMcp() {
|
|
231
|
-
try {
|
|
232
|
-
const { execSync } = require('child_process');
|
|
233
|
-
const composePath = 'docker/neo4j-mcp/docker-compose.yml';
|
|
234
|
-
logger_1.logger.info('Iniciando Neo4j MCP via Docker Compose...');
|
|
235
|
-
execSync(`docker-compose -f ${composePath} up -d --build`, { stdio: 'inherit' });
|
|
236
|
-
logger_1.logger.info('Aguardando Neo4j e MCP Server inicializarem...');
|
|
237
|
-
await new Promise(resolve => setTimeout(resolve, 30000));
|
|
238
|
-
if (await isNeo4jMcpRunning()) {
|
|
239
|
-
logger_1.logger.info('✅ Neo4j MCP iniciado com sucesso');
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
throw new Error('Containers não iniciaram corretamente');
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
logger_1.logger.error(`❌ Falha ao iniciar Neo4j MCP: ${error.message}`);
|
|
247
|
-
throw error;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
async function stopNeo4jMcp() {
|
|
251
|
-
try {
|
|
252
|
-
const { execSync } = require('child_process');
|
|
253
|
-
const composePath = 'docker/neo4j-mcp/docker-compose.yml';
|
|
254
|
-
logger_1.logger.info('Parando Neo4j MCP via Docker Compose...');
|
|
255
|
-
execSync(`docker-compose -f ${composePath} down`, { stdio: 'inherit' });
|
|
256
|
-
logger_1.logger.info('✅ Neo4j MCP parado com sucesso');
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
logger_1.logger.error(`❌ Falha ao parar Neo4j MCP: ${error.message}`);
|
|
260
|
-
throw error;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
async function registerNeo4jMcp() {
|
|
264
|
-
const config = getMcpConfigById('neo4j-official');
|
|
265
|
-
if (!config) {
|
|
266
|
-
throw new Error('Neo4j MCP not found in .code/mcp.json');
|
|
267
|
-
}
|
|
268
|
-
await registerSingleMcp(config, config.name || config.id);
|
|
269
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
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.enableCapabilityTool = exports.listCapabilitiesTool = void 0;
|
|
37
|
-
const frame_agent_sdk_1 = require("@ericnunes/frame-agent-sdk");
|
|
38
|
-
const skills_1 = require("../../infrastructure/skills");
|
|
39
|
-
const mcp_1 = require("../mcp");
|
|
40
|
-
const mcp_2 = require("../mcp");
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
|
-
const logger_1 = require("../../infrastructure/logging/logger");
|
|
43
|
-
class ListCapabilitiesSchema {
|
|
44
|
-
}
|
|
45
|
-
ListCapabilitiesSchema.schemaProperties = {
|
|
46
|
-
query: { type: 'string', required: false, description: 'Termo de busca (nome ou description)' }
|
|
47
|
-
};
|
|
48
|
-
exports.listCapabilitiesTool = new class extends frame_agent_sdk_1.ToolBase {
|
|
49
|
-
constructor() {
|
|
50
|
-
super(...arguments);
|
|
51
|
-
this.name = 'list_capabilities';
|
|
52
|
-
this.description = 'Lista Skills e MCPs disponíveis no sistema. Use para descobrir novas capacidades.';
|
|
53
|
-
this.parameterSchema = ListCapabilitiesSchema;
|
|
54
|
-
}
|
|
55
|
-
async execute(params) {
|
|
56
|
-
const query = params.query?.toLowerCase();
|
|
57
|
-
const skillLoader = new skills_1.SkillLoader();
|
|
58
|
-
const skills = skillLoader.loadAllSkills().map(s => ({
|
|
59
|
-
name: s.name,
|
|
60
|
-
description: s.description,
|
|
61
|
-
type: 'skill',
|
|
62
|
-
keywords: s.keywords
|
|
63
|
-
}));
|
|
64
|
-
const mcpLoader = new mcp_1.McpLoader();
|
|
65
|
-
const mcpConfigs = mcpLoader.loadVisibleMcpConfigs().map(m => ({
|
|
66
|
-
name: m.id,
|
|
67
|
-
description: m.name,
|
|
68
|
-
type: 'mcp',
|
|
69
|
-
namespace: m.namespace,
|
|
70
|
-
registered: m.registered
|
|
71
|
-
}));
|
|
72
|
-
const all = [...skills, ...mcpConfigs];
|
|
73
|
-
const matches = query
|
|
74
|
-
? all.filter(c => c.name.toLowerCase().includes(query) ||
|
|
75
|
-
c.description.toLowerCase().includes(query))
|
|
76
|
-
: all;
|
|
77
|
-
logger_1.logger.info(`[ListCapabilities] Encontradas ${matches.length} capabilities para query "${query || '*'}"`);
|
|
78
|
-
return {
|
|
79
|
-
success: true,
|
|
80
|
-
capabilities: matches,
|
|
81
|
-
message: matches.length > 0
|
|
82
|
-
? `Encontradas ${matches.length} capabilities. Use enable_capability para ver detalhes.`
|
|
83
|
-
: 'Nenhuma capability encontrada.'
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
class EnableCapabilitySchema {
|
|
88
|
-
}
|
|
89
|
-
EnableCapabilitySchema.schemaProperties = {
|
|
90
|
-
capabilityName: { type: 'string', required: true, description: 'Nome exato da capability (obtido via list_capabilities)' }
|
|
91
|
-
};
|
|
92
|
-
exports.enableCapabilityTool = new class extends frame_agent_sdk_1.ToolBase {
|
|
93
|
-
constructor() {
|
|
94
|
-
super(...arguments);
|
|
95
|
-
this.name = 'enable_capability';
|
|
96
|
-
this.description = 'Habilita uma Skill ou MCP. Para Skills, lê instruções. Para MCPs, lista ferramentas disponíveis.';
|
|
97
|
-
this.parameterSchema = EnableCapabilitySchema;
|
|
98
|
-
}
|
|
99
|
-
async execute(params) {
|
|
100
|
-
const name = params.capabilityName;
|
|
101
|
-
const skillLoader = new skills_1.SkillLoader();
|
|
102
|
-
const skill = skillLoader.loadAllSkills().find(s => s.name === name);
|
|
103
|
-
if (skill) {
|
|
104
|
-
try {
|
|
105
|
-
const content = fs.readFileSync(skill.path, 'utf-8');
|
|
106
|
-
logger_1.logger.info(`[EnableCapability] Skill "${name}" lida com sucesso de ${skill.path}`);
|
|
107
|
-
return {
|
|
108
|
-
success: true,
|
|
109
|
-
type: 'skill',
|
|
110
|
-
content: content,
|
|
111
|
-
message: `Skill "${name}" carregada. Leia as instruções acima atentamente.`
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
logger_1.logger.error(`[EnableCapability] Erro ao ler Skill ${skill.path}:`, error);
|
|
116
|
-
return {
|
|
117
|
-
success: false,
|
|
118
|
-
type: 'skill',
|
|
119
|
-
message: `Erro ao carregar skill: ${error.message}`
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const mcpLoader = new mcp_1.McpLoader();
|
|
124
|
-
const mcpConfig = mcpLoader.getMcpById(name);
|
|
125
|
-
if (mcpConfig && mcpConfig.visible) {
|
|
126
|
-
try {
|
|
127
|
-
const tools = await (0, mcp_2.discoverMcpTools)(mcpConfig.config);
|
|
128
|
-
logger_1.logger.info(`[EnableCapability] MCP "${mcpConfig.name}" descoberto com ${tools.length} ferramentas`);
|
|
129
|
-
return {
|
|
130
|
-
success: true,
|
|
131
|
-
type: 'mcp',
|
|
132
|
-
mcpName: mcpConfig.name,
|
|
133
|
-
registered: mcpConfig.registered,
|
|
134
|
-
tools,
|
|
135
|
-
message: mcpConfig.registered
|
|
136
|
-
? `MCP "${mcpConfig.name}" está registrado e possui ${tools.length} ferramentas disponíveis.`
|
|
137
|
-
: `MCP "${mcpConfig.name}" possui ${tools.length} ferramentas disponíveis. Use-as conforme necessário.`
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
logger_1.logger.error(`[EnableCapability] Erro ao descobrir ferramentas do MCP ${mcpConfig.name}:`, error);
|
|
142
|
-
return {
|
|
143
|
-
success: false,
|
|
144
|
-
type: 'mcp',
|
|
145
|
-
message: `Erro ao descobrir ferramentas do MCP: ${error.message}`
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return {
|
|
150
|
-
success: false,
|
|
151
|
-
message: `Capability "${name}" não encontrada. Use list_capabilities para ver as opções disponíveis.`,
|
|
152
|
-
type: 'skill'
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
};
|