@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
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de mensagens entre agentes
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
import { randomBytes } from 'crypto';
|
|
6
|
+
import { createGzip } from 'zlib';
|
|
7
|
+
import { pipeline } from 'stream/promises';
|
|
8
|
+
import { createReadStream, createWriteStream } from 'fs';
|
|
9
|
+
import { getAgentId, updateAgentHeartbeat, readRegistry } from './auth.js';
|
|
10
|
+
import { writeJSON, readJSON, ensureDir } from './persistence.js';
|
|
11
|
+
import { Readable } from 'stream';
|
|
12
|
+
const MESSAGES_DIR = resolve(process.cwd(), '.comunicate', 'messages');
|
|
13
|
+
const ARCHIVE_DIR = resolve(MESSAGES_DIR, 'archive');
|
|
14
|
+
const MAX_MESSAGES = 100; // Limite antes de arquivar
|
|
15
|
+
/**
|
|
16
|
+
* Gera ID único de mensagem
|
|
17
|
+
*/
|
|
18
|
+
function generateMessageId() {
|
|
19
|
+
return `msg_${randomBytes(8).toString('hex')}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Arquiva mensagens antigas para arquivo compactado
|
|
23
|
+
*/
|
|
24
|
+
async function archiveOldMessages(agentId, messages) {
|
|
25
|
+
if (messages.length < MAX_MESSAGES)
|
|
26
|
+
return;
|
|
27
|
+
ensureDir(ARCHIVE_DIR);
|
|
28
|
+
const messagesToArchive = messages.slice(MAX_MESSAGES);
|
|
29
|
+
const archiveDate = new Date().toISOString().split('T')[0];
|
|
30
|
+
const archivePath = resolve(ARCHIVE_DIR, `inbox-${agentId}-${archiveDate}.json.gz`);
|
|
31
|
+
// Lê arquivo existente se houver
|
|
32
|
+
let existingArchived = [];
|
|
33
|
+
try {
|
|
34
|
+
const gunzip = await import('zlib').then(z => z.createGunzip());
|
|
35
|
+
const data = await new Promise((resolve, reject) => {
|
|
36
|
+
const chunks = [];
|
|
37
|
+
createReadStream(archivePath)
|
|
38
|
+
.pipe(gunzip)
|
|
39
|
+
.on('data', (chunk) => chunks.push(chunk))
|
|
40
|
+
.on('end', () => resolve(Buffer.concat(chunks)))
|
|
41
|
+
.on('error', reject);
|
|
42
|
+
});
|
|
43
|
+
existingArchived = JSON.parse(data.toString());
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Arquivo não existe ainda
|
|
47
|
+
}
|
|
48
|
+
// Combina e salva
|
|
49
|
+
const allArchived = [...existingArchived, ...messagesToArchive];
|
|
50
|
+
const gzip = createGzip();
|
|
51
|
+
const source = Buffer.from(JSON.stringify(allArchived, null, 2));
|
|
52
|
+
const destination = createWriteStream(archivePath);
|
|
53
|
+
await pipeline(Readable.from(source), gzip, destination);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Envia mensagem para outro agente
|
|
57
|
+
*/
|
|
58
|
+
export function sendMessage(senderToken, recipientId, content, options = {}) {
|
|
59
|
+
const senderId = getAgentId(senderToken);
|
|
60
|
+
if (!senderId) {
|
|
61
|
+
return { success: false, error: 'Invalid sender token' };
|
|
62
|
+
}
|
|
63
|
+
// Atualiza heartbeat do sender
|
|
64
|
+
updateAgentHeartbeat(senderId);
|
|
65
|
+
// Verifica auto-comunicação
|
|
66
|
+
if (senderId === recipientId) {
|
|
67
|
+
return { success: false, error: 'Self-communication not allowed' };
|
|
68
|
+
}
|
|
69
|
+
// Verifica se destinatário existe
|
|
70
|
+
const registry = readRegistry();
|
|
71
|
+
const recipient = registry.agents.find((a) => a.id === recipientId);
|
|
72
|
+
if (!recipient) {
|
|
73
|
+
return { success: false, error: `Agent ${recipientId} not found` };
|
|
74
|
+
}
|
|
75
|
+
if (recipient.status !== 'active') {
|
|
76
|
+
return { success: false, error: `Agent ${recipientId} is not active` };
|
|
77
|
+
}
|
|
78
|
+
// Cria mensagem
|
|
79
|
+
const message = {
|
|
80
|
+
id: generateMessageId(),
|
|
81
|
+
senderId,
|
|
82
|
+
content,
|
|
83
|
+
type: options.type || 'text',
|
|
84
|
+
priority: options.priority || 'normal',
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
read: false,
|
|
87
|
+
delivered: false
|
|
88
|
+
};
|
|
89
|
+
// Escreve na inbox do destinatário
|
|
90
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${recipientId}.json`);
|
|
91
|
+
try {
|
|
92
|
+
const inbox = readJSON(inboxPath, {
|
|
93
|
+
agentId: recipientId,
|
|
94
|
+
updatedAt: new Date().toISOString(),
|
|
95
|
+
messages: []
|
|
96
|
+
});
|
|
97
|
+
inbox.messages.unshift(message); // Adiciona no início (mais recente)
|
|
98
|
+
inbox.updatedAt = new Date().toISOString();
|
|
99
|
+
// Arquiva mensagens antigas se necessário
|
|
100
|
+
if (inbox.messages.length > MAX_MESSAGES) {
|
|
101
|
+
archiveOldMessages(recipientId, inbox.messages).catch(console.error);
|
|
102
|
+
inbox.messages = inbox.messages.slice(0, MAX_MESSAGES);
|
|
103
|
+
}
|
|
104
|
+
writeJSON(inboxPath, inbox);
|
|
105
|
+
return { success: true };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return { success: false, error: `Failed to write message: ${error}` };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Lê mensagens da inbox do agente
|
|
113
|
+
*/
|
|
114
|
+
export function getMessages(token, options = {}) {
|
|
115
|
+
const agentId = getAgentId(token);
|
|
116
|
+
if (!agentId) {
|
|
117
|
+
return { success: false, error: 'Invalid token' };
|
|
118
|
+
}
|
|
119
|
+
// Atualiza heartbeat
|
|
120
|
+
updateAgentHeartbeat(agentId);
|
|
121
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
122
|
+
try {
|
|
123
|
+
const inbox = readJSON(inboxPath, {
|
|
124
|
+
agentId,
|
|
125
|
+
updatedAt: new Date().toISOString(),
|
|
126
|
+
messages: []
|
|
127
|
+
});
|
|
128
|
+
let messages = inbox.messages;
|
|
129
|
+
// Filtra não lidas se solicitado
|
|
130
|
+
if (!options.includeRead) {
|
|
131
|
+
messages = messages.filter(m => !m.read);
|
|
132
|
+
}
|
|
133
|
+
// Aplica limite
|
|
134
|
+
const limit = options.limit || 20;
|
|
135
|
+
messages = messages.slice(0, limit);
|
|
136
|
+
// Marca como lidas se solicitado
|
|
137
|
+
if (options.markAsRead && messages.length > 0) {
|
|
138
|
+
const readIds = new Set(messages.map(m => m.id));
|
|
139
|
+
inbox.messages = inbox.messages.map(m => readIds.has(m.id) ? { ...m, read: true } : m);
|
|
140
|
+
writeJSON(inboxPath, inbox);
|
|
141
|
+
}
|
|
142
|
+
return { success: true, messages };
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return { success: false, error: `Failed to read messages: ${error}` };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Obtém número de mensagens não lidas
|
|
150
|
+
*/
|
|
151
|
+
export function getUnreadCount(token) {
|
|
152
|
+
const agentId = getAgentId(token);
|
|
153
|
+
if (!agentId) {
|
|
154
|
+
return { success: false, error: 'Invalid token' };
|
|
155
|
+
}
|
|
156
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
157
|
+
try {
|
|
158
|
+
const inbox = readJSON(inboxPath, {
|
|
159
|
+
agentId,
|
|
160
|
+
updatedAt: new Date().toISOString(),
|
|
161
|
+
messages: []
|
|
162
|
+
});
|
|
163
|
+
const count = inbox.messages.filter(m => !m.read).length;
|
|
164
|
+
return { success: true, count };
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return { success: false, error: `Failed to read messages: ${error}` };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Deleta mensagem específica
|
|
172
|
+
*/
|
|
173
|
+
export function deleteMessage(token, messageId) {
|
|
174
|
+
const agentId = getAgentId(token);
|
|
175
|
+
if (!agentId) {
|
|
176
|
+
return { success: false, error: 'Invalid token' };
|
|
177
|
+
}
|
|
178
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
179
|
+
try {
|
|
180
|
+
const inbox = readJSON(inboxPath, {
|
|
181
|
+
agentId,
|
|
182
|
+
updatedAt: new Date().toISOString(),
|
|
183
|
+
messages: []
|
|
184
|
+
});
|
|
185
|
+
const originalLength = inbox.messages.length;
|
|
186
|
+
inbox.messages = inbox.messages.filter(m => m.id !== messageId);
|
|
187
|
+
if (inbox.messages.length === originalLength) {
|
|
188
|
+
return { success: false, error: 'Message not found' };
|
|
189
|
+
}
|
|
190
|
+
inbox.updatedAt = new Date().toISOString();
|
|
191
|
+
writeJSON(inboxPath, inbox);
|
|
192
|
+
return { success: true };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return { success: false, error: `Failed to delete message: ${error}` };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Limpa todas as mensagens lidas
|
|
200
|
+
*/
|
|
201
|
+
export function clearReadMessages(token) {
|
|
202
|
+
const agentId = getAgentId(token);
|
|
203
|
+
if (!agentId) {
|
|
204
|
+
return { success: false, error: 'Invalid token' };
|
|
205
|
+
}
|
|
206
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
207
|
+
try {
|
|
208
|
+
const inbox = readJSON(inboxPath, {
|
|
209
|
+
agentId,
|
|
210
|
+
updatedAt: new Date().toISOString(),
|
|
211
|
+
messages: []
|
|
212
|
+
});
|
|
213
|
+
const originalLength = inbox.messages.length;
|
|
214
|
+
inbox.messages = inbox.messages.filter(m => !m.read);
|
|
215
|
+
const deletedCount = originalLength - inbox.messages.length;
|
|
216
|
+
inbox.updatedAt = new Date().toISOString();
|
|
217
|
+
writeJSON(inboxPath, inbox);
|
|
218
|
+
return { success: true, deletedCount };
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return { success: false, error: `Failed to clear messages: ${error}` };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=messaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/comunicate/core/messaging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de notificações via file watcher
|
|
3
|
+
* Otimizado para Windows
|
|
4
|
+
*/
|
|
5
|
+
import type { Message } from '../types/message.js';
|
|
6
|
+
export interface NotificationHandler {
|
|
7
|
+
onMessage: (message: Message) => void;
|
|
8
|
+
onError?: (error: Error) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface NotificationListener {
|
|
11
|
+
stop: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Inicia listener de notificações para um agente
|
|
15
|
+
* Otimizado para Windows (usando polling interno se necessário)
|
|
16
|
+
*/
|
|
17
|
+
export declare function startNotificationListener(agentId: string, handler: NotificationHandler): NotificationListener;
|
|
18
|
+
/**
|
|
19
|
+
* Inicia polling simples de mensagens
|
|
20
|
+
* Alternativa quando file watcher não é necessário
|
|
21
|
+
*/
|
|
22
|
+
export declare function startPolling(agentId: string, onMessage: (message: Message) => void, options?: {
|
|
23
|
+
intervalMs?: number;
|
|
24
|
+
onlyUnread?: boolean;
|
|
25
|
+
}): NotificationListener;
|
|
26
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/notifications.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,qBAAqB,CAAC;AAI1D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,oBAAoB,CAkEtB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EACrC,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,oBAAoB,CA+BtB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de notificações via file watcher
|
|
3
|
+
* Otimizado para Windows
|
|
4
|
+
*/
|
|
5
|
+
import { watch, readFileSync, existsSync } from 'fs';
|
|
6
|
+
import { resolve } from 'path';
|
|
7
|
+
const MESSAGES_DIR = resolve(process.cwd(), '.comunicate', 'messages');
|
|
8
|
+
/**
|
|
9
|
+
* Inicia listener de notificações para um agente
|
|
10
|
+
* Otimizado para Windows (usando polling interno se necessário)
|
|
11
|
+
*/
|
|
12
|
+
export function startNotificationListener(agentId, handler) {
|
|
13
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
14
|
+
let lastModified = 0;
|
|
15
|
+
const processedIds = new Set();
|
|
16
|
+
let fallbackInterval = null;
|
|
17
|
+
let watcher = null;
|
|
18
|
+
// Lê estado inicial
|
|
19
|
+
try {
|
|
20
|
+
if (existsSync(inboxPath)) {
|
|
21
|
+
const inbox = JSON.parse(readFileSync(inboxPath, 'utf-8'));
|
|
22
|
+
inbox.messages.forEach(m => processedIds.add(m.id));
|
|
23
|
+
lastModified = new Date(inbox.updatedAt).getTime();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Inbox ainda não existe
|
|
28
|
+
}
|
|
29
|
+
// Função para processar novas mensagens
|
|
30
|
+
const processMessages = () => {
|
|
31
|
+
try {
|
|
32
|
+
if (!existsSync(inboxPath))
|
|
33
|
+
return;
|
|
34
|
+
const inbox = JSON.parse(readFileSync(inboxPath, 'utf-8'));
|
|
35
|
+
const newModified = new Date(inbox.updatedAt).getTime();
|
|
36
|
+
// Ignora se não mudou desde última leitura
|
|
37
|
+
if (newModified <= lastModified)
|
|
38
|
+
return;
|
|
39
|
+
lastModified = newModified;
|
|
40
|
+
// Processa mensagens novas
|
|
41
|
+
for (const message of inbox.messages) {
|
|
42
|
+
if (!processedIds.has(message.id)) {
|
|
43
|
+
processedIds.add(message.id);
|
|
44
|
+
handler.onMessage(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
handler.onError?.(error);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// Configura watcher (Windows pode precisar de fallback)
|
|
53
|
+
try {
|
|
54
|
+
watcher = watch(inboxPath, { persistent: false }, (eventType) => {
|
|
55
|
+
if (eventType === 'change') {
|
|
56
|
+
processMessages();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Fallback: se watcher falhar silenciosamente, usa polling
|
|
60
|
+
fallbackInterval = setInterval(processMessages, 2000);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Se não conseguir criar watcher, usa só polling
|
|
64
|
+
fallbackInterval = setInterval(processMessages, 1000);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
stop: () => {
|
|
68
|
+
watcher?.close();
|
|
69
|
+
if (fallbackInterval)
|
|
70
|
+
clearInterval(fallbackInterval);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Inicia polling simples de mensagens
|
|
76
|
+
* Alternativa quando file watcher não é necessário
|
|
77
|
+
*/
|
|
78
|
+
export function startPolling(agentId, onMessage, options = {}) {
|
|
79
|
+
const intervalMs = options.intervalMs || 5000;
|
|
80
|
+
const processedIds = new Set();
|
|
81
|
+
const checkMessages = () => {
|
|
82
|
+
try {
|
|
83
|
+
const inboxPath = resolve(MESSAGES_DIR, `inbox-${agentId}.json`);
|
|
84
|
+
if (!existsSync(inboxPath))
|
|
85
|
+
return;
|
|
86
|
+
const inbox = JSON.parse(readFileSync(inboxPath, 'utf-8'));
|
|
87
|
+
for (const message of inbox.messages) {
|
|
88
|
+
if (options.onlyUnread && message.read)
|
|
89
|
+
continue;
|
|
90
|
+
if (processedIds.has(message.id))
|
|
91
|
+
continue;
|
|
92
|
+
processedIds.add(message.id);
|
|
93
|
+
onMessage(message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Ignora erros de leitura
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const interval = setInterval(checkMessages, intervalMs);
|
|
101
|
+
// Checa imediatamente na primeira vez
|
|
102
|
+
checkMessages();
|
|
103
|
+
return {
|
|
104
|
+
stop: () => clearInterval(interval)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../src/comunicate/core/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitários de persistência JSON com retry e backup
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Garante que diretório existe
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureDir(dirPath: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Lê JSON com tratamento de erro
|
|
10
|
+
*/
|
|
11
|
+
export declare function readJSON<T>(path: string, defaultValue: T): T;
|
|
12
|
+
/**
|
|
13
|
+
* Escreve JSON atomicamente (evita corrupção) com retry
|
|
14
|
+
*/
|
|
15
|
+
export declare function writeJSON<T>(path: string, data: T, attempt?: number): void;
|
|
16
|
+
/**
|
|
17
|
+
* Atualiza JSON parcialmente
|
|
18
|
+
*/
|
|
19
|
+
export declare function updateJSON<T extends Record<string, any>>(path: string, updater: (data: T) => T, defaultValue: T): T;
|
|
20
|
+
/**
|
|
21
|
+
* Backup de arquivo antes de modificação
|
|
22
|
+
*/
|
|
23
|
+
export declare function backupFile(path: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Restaura arquivo do backup
|
|
26
|
+
*/
|
|
27
|
+
export declare function restoreFromBackup(backupPath: string, originalPath: string): boolean;
|
|
28
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/comunicate/core/persistence.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6BH;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAO5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,GAAE,MAAU,GAAG,IAAI,CA8B7E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EACvB,YAAY,EAAE,CAAC,GACd,CAAC,CAKH;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAWnF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitários de persistência JSON com retry e backup
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync, unlinkSync } from 'fs';
|
|
5
|
+
import { dirname } from 'path';
|
|
6
|
+
import { randomBytes } from 'crypto';
|
|
7
|
+
/**
|
|
8
|
+
* Configuração de retry
|
|
9
|
+
*/
|
|
10
|
+
const RETRY_CONFIG = {
|
|
11
|
+
maxRetries: 3,
|
|
12
|
+
delayMs: 100,
|
|
13
|
+
backoffMultiplier: 2
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Delay assíncrono
|
|
17
|
+
*/
|
|
18
|
+
function delay(ms) {
|
|
19
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Garante que diretório existe
|
|
23
|
+
*/
|
|
24
|
+
export function ensureDir(dirPath) {
|
|
25
|
+
if (!existsSync(dirPath)) {
|
|
26
|
+
mkdirSync(dirPath, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Lê JSON com tratamento de erro
|
|
31
|
+
*/
|
|
32
|
+
export function readJSON(path, defaultValue) {
|
|
33
|
+
try {
|
|
34
|
+
const data = readFileSync(path, 'utf-8');
|
|
35
|
+
return JSON.parse(data);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return defaultValue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Escreve JSON atomicamente (evita corrupção) com retry
|
|
43
|
+
*/
|
|
44
|
+
export function writeJSON(path, data, attempt = 1) {
|
|
45
|
+
ensureDir(dirname(path));
|
|
46
|
+
const tempPath = `${path}.tmp-${randomBytes(4).toString('hex')}`;
|
|
47
|
+
const json = JSON.stringify(data, null, 2);
|
|
48
|
+
try {
|
|
49
|
+
writeFileSync(tempPath, json, 'utf-8');
|
|
50
|
+
renameSync(tempPath, path);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Limpa arquivo temporário se existir
|
|
54
|
+
try {
|
|
55
|
+
if (existsSync(tempPath)) {
|
|
56
|
+
unlinkSync(tempPath);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Ignora erro de cleanup
|
|
61
|
+
}
|
|
62
|
+
// Retry com backoff
|
|
63
|
+
if (attempt < RETRY_CONFIG.maxRetries) {
|
|
64
|
+
const retryDelay = RETRY_CONFIG.delayMs * Math.pow(RETRY_CONFIG.backoffMultiplier, attempt - 1);
|
|
65
|
+
delay(retryDelay).then(() => {
|
|
66
|
+
writeJSON(path, data, attempt + 1);
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Atualiza JSON parcialmente
|
|
75
|
+
*/
|
|
76
|
+
export function updateJSON(path, updater, defaultValue) {
|
|
77
|
+
const data = readJSON(path, defaultValue);
|
|
78
|
+
const updated = updater(data);
|
|
79
|
+
writeJSON(path, updated);
|
|
80
|
+
return updated;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Backup de arquivo antes de modificação
|
|
84
|
+
*/
|
|
85
|
+
export function backupFile(path) {
|
|
86
|
+
try {
|
|
87
|
+
if (!existsSync(path))
|
|
88
|
+
return null;
|
|
89
|
+
const backupPath = `${path}.backup-${Date.now()}`;
|
|
90
|
+
const data = readFileSync(path, 'utf-8');
|
|
91
|
+
writeFileSync(backupPath, data, 'utf-8');
|
|
92
|
+
return backupPath;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Restaura arquivo do backup
|
|
100
|
+
*/
|
|
101
|
+
export function restoreFromBackup(backupPath, originalPath) {
|
|
102
|
+
try {
|
|
103
|
+
if (!existsSync(backupPath))
|
|
104
|
+
return false;
|
|
105
|
+
const data = readFileSync(backupPath, 'utf-8');
|
|
106
|
+
writeFileSync(originalPath, data, 'utf-8');
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/comunicate/core/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de Comunicação Entre Agentes - @justmpm/comunicate
|
|
3
|
+
* Arquitetura File-Based para Windows
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Versão do pacote (lida do package.json)
|
|
7
|
+
*/
|
|
8
|
+
export declare const VERSION: string;
|
|
9
|
+
export * from './types/index.js';
|
|
10
|
+
export * from './core/index.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/comunicate/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,eAAO,MAAM,OAAO,QAAe,CAAC;AAEpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de Comunicação Entre Agentes - @justmpm/comunicate
|
|
3
|
+
* Arquitetura File-Based para Windows
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
6
|
+
import { resolve } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Lê a versão do package.json
|
|
9
|
+
*/
|
|
10
|
+
function getVersion() {
|
|
11
|
+
try {
|
|
12
|
+
const packagePath = resolve(process.cwd(), 'package.json');
|
|
13
|
+
const packageContent = readFileSync(packagePath, 'utf-8');
|
|
14
|
+
const packageJson = JSON.parse(packageContent);
|
|
15
|
+
return packageJson.version || '0.0.0';
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return '0.0.0';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Versão do pacote (lida do package.json)
|
|
23
|
+
*/
|
|
24
|
+
export const VERSION = getVersion();
|
|
25
|
+
export * from './types/index.js';
|
|
26
|
+
export * from './core/index.js';
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/comunicate/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;GAEG;AACH,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC/C,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAEpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comunicate/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/comunicate/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipos de mensagens do sistema de comunicação entre agentes
|
|
3
|
+
*/
|
|
4
|
+
export type MessageType = 'text' | 'assistance_request' | 'task_update' | 'notification' | 'stop_command';
|
|
5
|
+
export type MessagePriority = 'low' | 'normal' | 'high' | 'urgent';
|
|
6
|
+
export interface Message {
|
|
7
|
+
id: string;
|
|
8
|
+
senderId: string;
|
|
9
|
+
content: string;
|
|
10
|
+
type: MessageType;
|
|
11
|
+
priority: MessagePriority;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
read: boolean;
|
|
14
|
+
delivered: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface Inbox {
|
|
17
|
+
agentId: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
messages: Message[];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/comunicate/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,oBAAoB,GACpB,aAAa,GACb,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/comunicate/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|