@justmpm/comunicate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +518 -0
- package/CLAUDE.md +518 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +117 -0
- package/dist/cli.js.map +1 -0
- package/dist/comunicate/core/auth.d.ts +60 -0
- package/dist/comunicate/core/auth.d.ts.map +1 -0
- package/dist/comunicate/core/auth.js +150 -0
- package/dist/comunicate/core/auth.js.map +1 -0
- package/dist/comunicate/core/domains.d.ts +55 -0
- package/dist/comunicate/core/domains.d.ts.map +1 -0
- package/dist/comunicate/core/domains.js +157 -0
- package/dist/comunicate/core/domains.js.map +1 -0
- package/dist/comunicate/core/index.d.ts +9 -0
- package/dist/comunicate/core/index.d.ts.map +1 -0
- package/dist/comunicate/core/index.js +9 -0
- package/dist/comunicate/core/index.js.map +1 -0
- package/dist/comunicate/core/messaging.d.ts +50 -0
- package/dist/comunicate/core/messaging.d.ts.map +1 -0
- package/dist/comunicate/core/messaging.js +224 -0
- package/dist/comunicate/core/messaging.js.map +1 -0
- package/dist/comunicate/core/notifications.d.ts +26 -0
- package/dist/comunicate/core/notifications.d.ts.map +1 -0
- package/dist/comunicate/core/notifications.js +107 -0
- package/dist/comunicate/core/notifications.js.map +1 -0
- package/dist/comunicate/core/persistence.d.ts +28 -0
- package/dist/comunicate/core/persistence.d.ts.map +1 -0
- package/dist/comunicate/core/persistence.js +113 -0
- package/dist/comunicate/core/persistence.js.map +1 -0
- package/dist/comunicate/index.d.ts +11 -0
- package/dist/comunicate/index.d.ts.map +1 -0
- package/dist/comunicate/index.js +27 -0
- package/dist/comunicate/index.js.map +1 -0
- package/dist/comunicate/types/index.d.ts +5 -0
- package/dist/comunicate/types/index.d.ts.map +1 -0
- package/dist/comunicate/types/index.js +5 -0
- package/dist/comunicate/types/index.js.map +1 -0
- package/dist/comunicate/types/message.d.ts +21 -0
- package/dist/comunicate/types/message.d.ts.map +1 -0
- package/dist/comunicate/types/message.js +5 -0
- package/dist/comunicate/types/message.js.map +1 -0
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +314 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools/agent-communication.d.ts +342 -0
- package/dist/mcp-tools/agent-communication.d.ts.map +1 -0
- package/dist/mcp-tools/agent-communication.js +378 -0
- package/dist/mcp-tools/agent-communication.js.map +1 -0
- package/mcp-config.json +15 -0
- package/package.json +44 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI para Administração do @justmpm/comunicate
|
|
4
|
+
*/
|
|
5
|
+
import { readRegistry, registerAgent, generateToken, getInactiveAgents } from './comunicate/core/auth.js';
|
|
6
|
+
import { getAllClaims } from './comunicate/core/domains.js';
|
|
7
|
+
const command = process.argv[2];
|
|
8
|
+
function showHelp() {
|
|
9
|
+
console.log(`
|
|
10
|
+
@justmpm/comunicate CLI - Administração
|
|
11
|
+
|
|
12
|
+
Uso: node cli.js <comando> [args]
|
|
13
|
+
|
|
14
|
+
Comandos:
|
|
15
|
+
list-agents Lista todos os agentes
|
|
16
|
+
create-agent <id> Cria novo agente
|
|
17
|
+
list-claims Lista todos os claims
|
|
18
|
+
check-health Verifica agentes inativos
|
|
19
|
+
generate-token Gera token aleatório
|
|
20
|
+
help Mostra esta ajuda
|
|
21
|
+
|
|
22
|
+
Exemplos:
|
|
23
|
+
node cli.js list-agents
|
|
24
|
+
node cli.js create-agent backend
|
|
25
|
+
node cli.js check-health
|
|
26
|
+
`);
|
|
27
|
+
}
|
|
28
|
+
async function main() {
|
|
29
|
+
switch (command) {
|
|
30
|
+
case 'list-agents': {
|
|
31
|
+
const registry = readRegistry();
|
|
32
|
+
console.log(`\n👥 Agentes registrados (${registry.agents.length}):\n`);
|
|
33
|
+
for (const agent of registry.agents) {
|
|
34
|
+
const statusIcon = agent.status === 'active' ? '🟢' : '🔴';
|
|
35
|
+
console.log(`${statusIcon} ${agent.id}`);
|
|
36
|
+
console.log(` Status: ${agent.status}`);
|
|
37
|
+
console.log(` Capabilities: ${agent.capabilities.join(', ')}`);
|
|
38
|
+
console.log(` Domains: ${agent.domains.join(', ')}`);
|
|
39
|
+
console.log(` Last Seen: ${agent.lastSeen}`);
|
|
40
|
+
console.log(` Color: ${agent.color}`);
|
|
41
|
+
console.log('');
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'create-agent': {
|
|
46
|
+
const agentId = process.argv[3];
|
|
47
|
+
if (!agentId) {
|
|
48
|
+
console.error('❌ Erro: Especifique o ID do agente');
|
|
49
|
+
console.log('Uso: node cli.js create-agent <id>');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
// Valida formato do ID
|
|
53
|
+
if (!/^[a-z0-9-]+$/.test(agentId)) {
|
|
54
|
+
console.error('❌ Erro: ID deve conter apenas letras minúsculas, números e hífens');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
// Solicita capabilities e domains interativamente
|
|
58
|
+
console.log(`Criando agente: ${agentId}`);
|
|
59
|
+
console.log('Digite as capabilities (separadas por vírgula, ex: api,database,auth):');
|
|
60
|
+
// Para simplificar, usa defaults
|
|
61
|
+
const capabilities = ['general'];
|
|
62
|
+
const domains = ['src'];
|
|
63
|
+
try {
|
|
64
|
+
const token = registerAgent(agentId, capabilities, domains);
|
|
65
|
+
console.log(`\n✅ Agente ${agentId} criado com sucesso!`);
|
|
66
|
+
console.log(`\n🔑 Token: ${token}`);
|
|
67
|
+
console.log('\n⚠️ GUARDE ESTE TOKEN! Ele não será mostrado novamente.\n');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error(`❌ Erro: ${error}`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'list-claims': {
|
|
76
|
+
const claims = getAllClaims();
|
|
77
|
+
console.log(`\n🔐 Claims ativos (${claims.length}):\n`);
|
|
78
|
+
for (const claim of claims) {
|
|
79
|
+
console.log(`📄 ${claim.file}`);
|
|
80
|
+
console.log(` Agente: ${claim.claimedBy}`);
|
|
81
|
+
console.log(` Expira: ${claim.expiresAt}`);
|
|
82
|
+
if (claim.reason)
|
|
83
|
+
console.log(` Motivo: ${claim.reason}`);
|
|
84
|
+
console.log('');
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case 'check-health': {
|
|
89
|
+
const timeout = parseInt(process.argv[3]) || 5;
|
|
90
|
+
const inactive = getInactiveAgents(timeout);
|
|
91
|
+
console.log(`\n🏥 Health Check (timeout: ${timeout} min):\n`);
|
|
92
|
+
if (inactive.length === 0) {
|
|
93
|
+
console.log('✅ Todos os agentes estão ativos!\n');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(`⚠️ Agentes inativos (${inactive.length}):\n`);
|
|
97
|
+
for (const agent of inactive) {
|
|
98
|
+
console.log(`🔴 ${agent.id}`);
|
|
99
|
+
console.log(` Último heartbeat: ${agent.lastSeen}`);
|
|
100
|
+
console.log('');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 'generate-token': {
|
|
106
|
+
const token = generateToken();
|
|
107
|
+
console.log(`\n🔑 Token gerado: ${token}\n`);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'help':
|
|
111
|
+
default:
|
|
112
|
+
showHelp();
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
main().catch(console.error);
|
|
117
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de autenticação e gerenciamento de agentes
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Gera token seguro de 32 caracteres hexadecimais
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateToken(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Tipos TypeScript
|
|
10
|
+
*/
|
|
11
|
+
export type AgentStatus = 'created' | 'active' | 'terminated';
|
|
12
|
+
export interface Agent {
|
|
13
|
+
id: string;
|
|
14
|
+
token: string;
|
|
15
|
+
capabilities: string[];
|
|
16
|
+
domains: string[];
|
|
17
|
+
status: AgentStatus;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
lastSeen: string;
|
|
20
|
+
currentTask: string | null;
|
|
21
|
+
color: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentRegistry {
|
|
24
|
+
version: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
agents: Agent[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Lê registry de agentes
|
|
30
|
+
*/
|
|
31
|
+
export declare function readRegistry(): AgentRegistry;
|
|
32
|
+
/**
|
|
33
|
+
* Escreve registry atomicamente
|
|
34
|
+
*/
|
|
35
|
+
export declare function writeRegistry(registry: AgentRegistry): void;
|
|
36
|
+
/**
|
|
37
|
+
* Verifica se token é válido (comparação timing-safe)
|
|
38
|
+
*/
|
|
39
|
+
export declare function verifyToken(token: string | undefined): token is string;
|
|
40
|
+
/**
|
|
41
|
+
* Verifica se é token de admin (comparação timing-safe)
|
|
42
|
+
*/
|
|
43
|
+
export declare function verifyAdminToken(token: string | undefined): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Obtém ID do agente a partir do token
|
|
46
|
+
*/
|
|
47
|
+
export declare function getAgentId(token: string | undefined): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Atualiza timestamp lastSeen do agente
|
|
50
|
+
*/
|
|
51
|
+
export declare function updateAgentHeartbeat(agentId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Obtém agentes inativos (sem heartbeat por X minutos)
|
|
54
|
+
*/
|
|
55
|
+
export declare function getInactiveAgents(timeoutMinutes?: number): Agent[];
|
|
56
|
+
/**
|
|
57
|
+
* Registra novo agente
|
|
58
|
+
*/
|
|
59
|
+
export declare function registerAgent(id: string, capabilities: string[], domains: string[]): string;
|
|
60
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE9D,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAM5C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAM3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAkBtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CASnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,GAAE,MAAU,GAAG,KAAK,EAAE,CASrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CA6BR"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de autenticação e gerenciamento de agentes
|
|
3
|
+
*/
|
|
4
|
+
import { randomBytes, timingSafeEqual } from 'crypto';
|
|
5
|
+
import { resolve } from 'path';
|
|
6
|
+
import { writeJSON, readJSON } from './persistence.js';
|
|
7
|
+
const REGISTRY_PATH = resolve(process.cwd(), '.comunicate', 'registry', 'agents.json');
|
|
8
|
+
// Token de admin fixo (em produção, usar variável de ambiente)
|
|
9
|
+
const ADMIN_TOKEN = process.env.COMUNICATE_ADMIN_TOKEN || '';
|
|
10
|
+
/**
|
|
11
|
+
* Gera token seguro de 32 caracteres hexadecimais
|
|
12
|
+
*/
|
|
13
|
+
export function generateToken() {
|
|
14
|
+
return randomBytes(16).toString('hex');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Lê registry de agentes
|
|
18
|
+
*/
|
|
19
|
+
export function readRegistry() {
|
|
20
|
+
return readJSON(REGISTRY_PATH, {
|
|
21
|
+
version: '1.0.0',
|
|
22
|
+
updatedAt: new Date().toISOString(),
|
|
23
|
+
agents: []
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Escreve registry atomicamente
|
|
28
|
+
*/
|
|
29
|
+
export function writeRegistry(registry) {
|
|
30
|
+
const updated = {
|
|
31
|
+
...registry,
|
|
32
|
+
updatedAt: new Date().toISOString()
|
|
33
|
+
};
|
|
34
|
+
writeJSON(REGISTRY_PATH, updated);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Verifica se token é válido (comparação timing-safe)
|
|
38
|
+
*/
|
|
39
|
+
export function verifyToken(token) {
|
|
40
|
+
if (!token)
|
|
41
|
+
return false;
|
|
42
|
+
const registry = readRegistry();
|
|
43
|
+
for (const agent of registry.agents) {
|
|
44
|
+
if (agent.status !== 'active')
|
|
45
|
+
continue;
|
|
46
|
+
// Timing-safe comparison para evitar timing attacks
|
|
47
|
+
const tokenBuffer = Buffer.from(token, 'utf-8');
|
|
48
|
+
const agentTokenBuffer = Buffer.from(agent.token, 'utf-8');
|
|
49
|
+
if (tokenBuffer.length !== agentTokenBuffer.length)
|
|
50
|
+
continue;
|
|
51
|
+
if (timingSafeEqual(tokenBuffer, agentTokenBuffer)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Verifica se é token de admin (comparação timing-safe)
|
|
59
|
+
*/
|
|
60
|
+
export function verifyAdminToken(token) {
|
|
61
|
+
if (!token || !ADMIN_TOKEN)
|
|
62
|
+
return false;
|
|
63
|
+
const tokenBuffer = Buffer.from(token, 'utf-8');
|
|
64
|
+
const adminBuffer = Buffer.from(ADMIN_TOKEN, 'utf-8');
|
|
65
|
+
if (tokenBuffer.length !== adminBuffer.length)
|
|
66
|
+
return false;
|
|
67
|
+
return timingSafeEqual(tokenBuffer, adminBuffer);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Obtém ID do agente a partir do token
|
|
71
|
+
*/
|
|
72
|
+
export function getAgentId(token) {
|
|
73
|
+
if (!token)
|
|
74
|
+
return null;
|
|
75
|
+
const registry = readRegistry();
|
|
76
|
+
for (const agent of registry.agents) {
|
|
77
|
+
const tokenBuffer = Buffer.from(token, 'utf-8');
|
|
78
|
+
const agentTokenBuffer = Buffer.from(agent.token, 'utf-8');
|
|
79
|
+
if (tokenBuffer.length === agentTokenBuffer.length &&
|
|
80
|
+
timingSafeEqual(tokenBuffer, agentTokenBuffer)) {
|
|
81
|
+
return agent.id;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Atualiza timestamp lastSeen do agente
|
|
88
|
+
*/
|
|
89
|
+
export function updateAgentHeartbeat(agentId) {
|
|
90
|
+
const registry = readRegistry();
|
|
91
|
+
const agent = registry.agents.find(a => a.id === agentId);
|
|
92
|
+
if (agent) {
|
|
93
|
+
agent.lastSeen = new Date().toISOString();
|
|
94
|
+
writeRegistry(registry);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Obtém agentes inativos (sem heartbeat por X minutos)
|
|
99
|
+
*/
|
|
100
|
+
export function getInactiveAgents(timeoutMinutes = 5) {
|
|
101
|
+
const registry = readRegistry();
|
|
102
|
+
const now = new Date();
|
|
103
|
+
const timeout = timeoutMinutes * 60 * 1000;
|
|
104
|
+
return registry.agents.filter(agent => {
|
|
105
|
+
const lastSeen = new Date(agent.lastSeen);
|
|
106
|
+
return now.getTime() - lastSeen.getTime() > timeout;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Registra novo agente
|
|
111
|
+
*/
|
|
112
|
+
export function registerAgent(id, capabilities, domains) {
|
|
113
|
+
const registry = readRegistry();
|
|
114
|
+
// Verifica se já existe
|
|
115
|
+
if (registry.agents.some(a => a.id === id)) {
|
|
116
|
+
throw new Error(`Agent ${id} already exists`);
|
|
117
|
+
}
|
|
118
|
+
const token = generateToken();
|
|
119
|
+
const now = new Date().toISOString();
|
|
120
|
+
const agent = {
|
|
121
|
+
id,
|
|
122
|
+
token,
|
|
123
|
+
capabilities,
|
|
124
|
+
domains,
|
|
125
|
+
status: 'active',
|
|
126
|
+
createdAt: now,
|
|
127
|
+
lastSeen: now,
|
|
128
|
+
currentTask: null,
|
|
129
|
+
color: generateAgentColor(registry.agents.length)
|
|
130
|
+
};
|
|
131
|
+
registry.agents.push(agent);
|
|
132
|
+
writeRegistry(registry);
|
|
133
|
+
// Cria inbox do agente
|
|
134
|
+
createInbox(id);
|
|
135
|
+
return token;
|
|
136
|
+
}
|
|
137
|
+
function generateAgentColor(index) {
|
|
138
|
+
const colors = ['#4ecdc4', '#667eea', '#f093fb', '#f5576c', '#4facfe', '#43e97b'];
|
|
139
|
+
return colors[index % colors.length];
|
|
140
|
+
}
|
|
141
|
+
function createInbox(agentId) {
|
|
142
|
+
const inboxPath = resolve(process.cwd(), '.comunicate', 'messages', `inbox-${agentId}.json`);
|
|
143
|
+
const inbox = {
|
|
144
|
+
agentId,
|
|
145
|
+
updatedAt: new Date().toISOString(),
|
|
146
|
+
messages: []
|
|
147
|
+
};
|
|
148
|
+
writeJSON(inboxPath, inbox);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/comunicate/core/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de domínios e claims (reserva de arquivos)
|
|
3
|
+
*/
|
|
4
|
+
export interface DomainCheck {
|
|
5
|
+
allowed: boolean;
|
|
6
|
+
owner?: string;
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Claim {
|
|
10
|
+
file: string;
|
|
11
|
+
claimedBy: string;
|
|
12
|
+
claimedAt: string;
|
|
13
|
+
expiresAt: string;
|
|
14
|
+
reason?: string;
|
|
15
|
+
sequence: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ClaimsRegistry {
|
|
18
|
+
version: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
sequence: number;
|
|
21
|
+
claims: Claim[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Verifica se agente pode editar um arquivo
|
|
25
|
+
*/
|
|
26
|
+
export declare function canEditFile(agentId: string, filePath: string): DomainCheck;
|
|
27
|
+
/**
|
|
28
|
+
* Reserva arquivo para edição (com proteção contra race conditions)
|
|
29
|
+
*/
|
|
30
|
+
export declare function claimFile(agentId: string, filePath: string, durationMinutes?: number, reason?: string): {
|
|
31
|
+
success: boolean;
|
|
32
|
+
claim?: Claim;
|
|
33
|
+
error?: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Libera arquivo
|
|
37
|
+
*/
|
|
38
|
+
export declare function releaseFile(agentId: string, filePath: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Renova claim existente
|
|
41
|
+
*/
|
|
42
|
+
export declare function renewClaim(agentId: string, filePath: string, additionalMinutes?: number): {
|
|
43
|
+
success: boolean;
|
|
44
|
+
claim?: Claim;
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Lista todos os claims ativos de um agente
|
|
49
|
+
*/
|
|
50
|
+
export declare function getAgentClaims(agentId: string): Claim[];
|
|
51
|
+
/**
|
|
52
|
+
* Lista todos os claims ativos no sistema
|
|
53
|
+
*/
|
|
54
|
+
export declare function getAllClaims(): Claim[];
|
|
55
|
+
//# sourceMappingURL=domains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/domains.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AA4BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CA8C1E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,eAAe,GAAE,MAAW,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkBtE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,iBAAiB,GAAE,MAAW,GAC7B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAGvD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de domínios e claims (reserva de arquivos)
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
import { readJSON, writeJSON } from './persistence.js';
|
|
6
|
+
const REGISTRY_PATH = resolve(process.cwd(), '.comunicate', 'registry', 'agents.json');
|
|
7
|
+
const CLAIMS_PATH = resolve(process.cwd(), '.comunicate', 'registry', 'claims.json');
|
|
8
|
+
/**
|
|
9
|
+
* Lê claims e remove expirados automaticamente
|
|
10
|
+
*/
|
|
11
|
+
function readClaimsClean() {
|
|
12
|
+
const claims = readJSON(CLAIMS_PATH, {
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
updatedAt: new Date().toISOString(),
|
|
15
|
+
sequence: 0,
|
|
16
|
+
claims: []
|
|
17
|
+
});
|
|
18
|
+
const now = new Date().toISOString();
|
|
19
|
+
const originalCount = claims.claims.length;
|
|
20
|
+
// Remove claims expirados
|
|
21
|
+
claims.claims = claims.claims.filter(c => c.expiresAt > now);
|
|
22
|
+
// Se removeu algum, salva
|
|
23
|
+
if (claims.claims.length !== originalCount) {
|
|
24
|
+
claims.updatedAt = now;
|
|
25
|
+
writeJSON(CLAIMS_PATH, claims);
|
|
26
|
+
}
|
|
27
|
+
return claims;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Verifica se agente pode editar um arquivo
|
|
31
|
+
*/
|
|
32
|
+
export function canEditFile(agentId, filePath) {
|
|
33
|
+
// 1. Verifica se está no domínio do agente
|
|
34
|
+
const registry = readJSON(REGISTRY_PATH, { agents: [] });
|
|
35
|
+
const agent = registry.agents.find((a) => a.id === agentId);
|
|
36
|
+
if (!agent) {
|
|
37
|
+
return { allowed: false, reason: 'Agent not found' };
|
|
38
|
+
}
|
|
39
|
+
const normalizedPath = filePath.replace(/^\.\//, '').replace(/^src\//, '');
|
|
40
|
+
// Verifica domínios
|
|
41
|
+
for (const domain of agent.domains) {
|
|
42
|
+
const normalizedDomain = domain.replace(/^\.\//, '').replace(/^src\//, '');
|
|
43
|
+
if (normalizedPath.startsWith(normalizedDomain)) {
|
|
44
|
+
return { allowed: true };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 2. Verifica se tem claim ativo
|
|
48
|
+
const claims = readClaimsClean();
|
|
49
|
+
const activeClaim = claims.claims.find((c) => c.file === filePath &&
|
|
50
|
+
c.claimedBy === agentId);
|
|
51
|
+
if (activeClaim) {
|
|
52
|
+
return { allowed: true };
|
|
53
|
+
}
|
|
54
|
+
// Verifica se outro agente tem claim
|
|
55
|
+
const otherClaim = claims.claims.find((c) => c.file === filePath);
|
|
56
|
+
if (otherClaim) {
|
|
57
|
+
return {
|
|
58
|
+
allowed: false,
|
|
59
|
+
owner: otherClaim.claimedBy,
|
|
60
|
+
reason: `File claimed by ${otherClaim.claimedBy} until ${otherClaim.expiresAt}`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
allowed: false,
|
|
65
|
+
reason: `File not in agent domains: ${agent.domains.join(', ')}`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reserva arquivo para edição (com proteção contra race conditions)
|
|
70
|
+
*/
|
|
71
|
+
export function claimFile(agentId, filePath, durationMinutes = 15, reason) {
|
|
72
|
+
// Verifica se já pode editar (domínio próprio)
|
|
73
|
+
const check = canEditFile(agentId, filePath);
|
|
74
|
+
if (check.allowed) {
|
|
75
|
+
return { success: true, error: 'File already in your domain' };
|
|
76
|
+
}
|
|
77
|
+
// Verifica se outro tem claim
|
|
78
|
+
if (check.owner) {
|
|
79
|
+
return { success: false, error: `File claimed by ${check.owner}` };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
// Re-lê claims (limpa expirados e pega sequence atual)
|
|
83
|
+
const claims = readClaimsClean();
|
|
84
|
+
const now = new Date();
|
|
85
|
+
const claim = {
|
|
86
|
+
file: filePath,
|
|
87
|
+
claimedBy: agentId,
|
|
88
|
+
claimedAt: now.toISOString(),
|
|
89
|
+
expiresAt: new Date(now.getTime() + durationMinutes * 60000).toISOString(),
|
|
90
|
+
reason,
|
|
91
|
+
sequence: claims.sequence + 1
|
|
92
|
+
};
|
|
93
|
+
// Remove claim existente do mesmo arquivo (se houver - expirado já foi removido)
|
|
94
|
+
claims.claims = claims.claims.filter((c) => c.file !== filePath);
|
|
95
|
+
claims.claims.push(claim);
|
|
96
|
+
claims.sequence = claim.sequence;
|
|
97
|
+
claims.updatedAt = now.toISOString();
|
|
98
|
+
writeJSON(CLAIMS_PATH, claims);
|
|
99
|
+
return { success: true, claim };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { success: false, error: String(error) };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Libera arquivo
|
|
107
|
+
*/
|
|
108
|
+
export function releaseFile(agentId, filePath) {
|
|
109
|
+
try {
|
|
110
|
+
const claims = readClaimsClean();
|
|
111
|
+
const beforeCount = claims.claims.length;
|
|
112
|
+
claims.claims = claims.claims.filter((c) => !(c.file === filePath && c.claimedBy === agentId));
|
|
113
|
+
if (claims.claims.length !== beforeCount) {
|
|
114
|
+
claims.updatedAt = new Date().toISOString();
|
|
115
|
+
writeJSON(CLAIMS_PATH, claims);
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Renova claim existente
|
|
125
|
+
*/
|
|
126
|
+
export function renewClaim(agentId, filePath, additionalMinutes = 15) {
|
|
127
|
+
const claims = readClaimsClean();
|
|
128
|
+
const claim = claims.claims.find((c) => c.file === filePath && c.claimedBy === agentId);
|
|
129
|
+
if (!claim) {
|
|
130
|
+
return { success: false, error: 'No active claim found for this file' };
|
|
131
|
+
}
|
|
132
|
+
const now = new Date();
|
|
133
|
+
const currentExpiry = new Date(claim.expiresAt);
|
|
134
|
+
// Só renova se estiver prestes a expirar (menos de 5 min) ou já expirado
|
|
135
|
+
const fiveMinutes = 5 * 60 * 1000;
|
|
136
|
+
if (currentExpiry.getTime() - now.getTime() > fiveMinutes) {
|
|
137
|
+
return { success: true, claim, error: 'Claim still valid for more than 5 minutes' };
|
|
138
|
+
}
|
|
139
|
+
claim.expiresAt = new Date(now.getTime() + additionalMinutes * 60000).toISOString();
|
|
140
|
+
claims.updatedAt = now.toISOString();
|
|
141
|
+
writeJSON(CLAIMS_PATH, claims);
|
|
142
|
+
return { success: true, claim };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Lista todos os claims ativos de um agente
|
|
146
|
+
*/
|
|
147
|
+
export function getAgentClaims(agentId) {
|
|
148
|
+
const claims = readClaimsClean();
|
|
149
|
+
return claims.claims.filter(c => c.claimedBy === agentId);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Lista todos os claims ativos no sistema
|
|
153
|
+
*/
|
|
154
|
+
export function getAllClaims() {
|
|
155
|
+
return readClaimsClean().claims;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../../src/comunicate/core/domains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/comunicate/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de mensagens entre agentes
|
|
3
|
+
*/
|
|
4
|
+
import type { Message, MessageType, MessagePriority } from '../types/message.js';
|
|
5
|
+
/**
|
|
6
|
+
* Envia mensagem para outro agente
|
|
7
|
+
*/
|
|
8
|
+
export declare function sendMessage(senderToken: string, recipientId: string, content: string, options?: {
|
|
9
|
+
type?: MessageType;
|
|
10
|
+
priority?: MessagePriority;
|
|
11
|
+
}): {
|
|
12
|
+
success: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Lê mensagens da inbox do agente
|
|
17
|
+
*/
|
|
18
|
+
export declare function getMessages(token: string, options?: {
|
|
19
|
+
includeRead?: boolean;
|
|
20
|
+
markAsRead?: boolean;
|
|
21
|
+
limit?: number;
|
|
22
|
+
}): {
|
|
23
|
+
success: boolean;
|
|
24
|
+
messages?: Message[];
|
|
25
|
+
error?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Obtém número de mensagens não lidas
|
|
29
|
+
*/
|
|
30
|
+
export declare function getUnreadCount(token: string): {
|
|
31
|
+
success: boolean;
|
|
32
|
+
count?: number;
|
|
33
|
+
error?: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Deleta mensagem específica
|
|
37
|
+
*/
|
|
38
|
+
export declare function deleteMessage(token: string, messageId: string): {
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Limpa todas as mensagens lidas
|
|
44
|
+
*/
|
|
45
|
+
export declare function clearReadMessages(token: string): {
|
|
46
|
+
success: boolean;
|
|
47
|
+
deletedCount?: number;
|
|
48
|
+
error?: string;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=messaging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/messaging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAS,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA2DxF;;GAEG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,eAAe,CAAC;CACvB,GACL;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2C5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBlG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8BtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2B5G"}
|