wegho-agentes 4.0.1
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/AGENT_WORKFLOW.md +528 -0
- package/.agents/AI_COMPATIBILITY.md +332 -0
- package/.agents/CLI.md +222 -0
- package/.agents/README.md +130 -0
- package/.agents/cli.js +389 -0
- package/.agents/code-auditor-agent.ts +333 -0
- package/.agents/config.ts +145 -0
- package/.agents/context-loader.ts +300 -0
- package/.agents/core/agent-parallelizer.test.ts +94 -0
- package/.agents/core/agent-parallelizer.ts +108 -0
- package/.agents/core/architecture-agent.ts +237 -0
- package/.agents/core/base-agent.ts +311 -0
- package/.agents/core/cache-manager.test.ts +147 -0
- package/.agents/core/cache-manager.ts +184 -0
- package/.agents/core/documentation-agent.ts +183 -0
- package/.agents/core/feedback-collector.ts +207 -0
- package/.agents/core/frontend-agent.ts +210 -0
- package/.agents/core/inventory-agent.ts +582 -0
- package/.agents/core/memory-system.ts +397 -0
- package/.agents/core/quality-agent.ts +268 -0
- package/.agents/core/retry-utility.test.ts +165 -0
- package/.agents/core/retry-utility.ts +140 -0
- package/.agents/core/security-agent.ts +217 -0
- package/.agents/core/workflow-validator.test.ts +171 -0
- package/.agents/core/workflow-validator.ts +158 -0
- package/.agents/domains/README.md +53 -0
- package/.agents/domains/logistics/route-agent.ts +177 -0
- package/.agents/domains/news/cms-agent.ts +158 -0
- package/.agents/domains/news/seo-agent.ts +170 -0
- package/.agents/domains/production/production-control-agent.ts +169 -0
- package/.agents/example-learning-system.js +118 -0
- package/.agents/init.ts +164 -0
- package/.agents/memory/architecture-agent/failures.json +1 -0
- package/.agents/memory/architecture-agent/learnings.json +1 -0
- package/.agents/memory/architecture-agent/specialty.md +31 -0
- package/.agents/memory/architecture-agent/successes.json +16 -0
- package/.agents/memory/cms-agent/failures.json +1 -0
- package/.agents/memory/cms-agent/learnings.json +1 -0
- package/.agents/memory/cms-agent/specialty.md +30 -0
- package/.agents/memory/cms-agent/successes.json +16 -0
- package/.agents/memory/documentation-agent/failures.json +1 -0
- package/.agents/memory/documentation-agent/learnings.json +1 -0
- package/.agents/memory/documentation-agent/specialty.md +33 -0
- package/.agents/memory/documentation-agent/successes.json +16 -0
- package/.agents/memory/frontend-agent/failures.json +1 -0
- package/.agents/memory/frontend-agent/learnings.json +1 -0
- package/.agents/memory/frontend-agent/specialty.md +30 -0
- package/.agents/memory/frontend-agent/successes.json +16 -0
- package/.agents/memory/inventory-agent/failures.json +1 -0
- package/.agents/memory/inventory-agent/inventory/index.json +8 -0
- package/.agents/memory/inventory-agent/inventory/types.json +77716 -0
- package/.agents/memory/inventory-agent/inventory/variables.json +405 -0
- package/.agents/memory/inventory-agent/learnings.json +1 -0
- package/.agents/memory/inventory-agent/specialty.md +129 -0
- package/.agents/memory/inventory-agent/successes.json +30 -0
- package/.agents/memory/production-control-agent/failures.json +1 -0
- package/.agents/memory/production-control-agent/learnings.json +1 -0
- package/.agents/memory/production-control-agent/specialty.md +29 -0
- package/.agents/memory/production-control-agent/successes.json +16 -0
- package/.agents/memory/quality-agent/failures.json +16 -0
- package/.agents/memory/quality-agent/learnings.json +1 -0
- package/.agents/memory/quality-agent/specialty.md +31 -0
- package/.agents/memory/quality-agent/successes.json +1 -0
- package/.agents/memory/reference-repositories.json +271 -0
- package/.agents/memory/route-agent/failures.json +1 -0
- package/.agents/memory/route-agent/learnings.json +1 -0
- package/.agents/memory/route-agent/specialty.md +29 -0
- package/.agents/memory/route-agent/successes.json +16 -0
- package/.agents/memory/security-agent/failures.json +1 -0
- package/.agents/memory/security-agent/learnings.json +1 -0
- package/.agents/memory/security-agent/specialty.md +31 -0
- package/.agents/memory/security-agent/successes.json +16 -0
- package/.agents/memory/seo-agent/failures.json +1 -0
- package/.agents/memory/seo-agent/learnings.json +1 -0
- package/.agents/memory/seo-agent/specialty.md +31 -0
- package/.agents/memory/seo-agent/successes.json +16 -0
- package/.agents/orchestrator.ts +438 -0
- package/.agents/project-discovery-agent.ts +342 -0
- package/.agents/security/pentesting-agent.py +387 -0
- package/.agents/security/python-bridge.ts +193 -0
- package/.agents/security/vulnerability-db.json +201 -0
- package/.agents/task-analyzer-agent.ts +346 -0
- package/.agents/test-init-context.js +67 -0
- package/INSTALL.md +300 -0
- package/LICENSE +21 -0
- package/README.md +315 -0
- package/docs/AGENT_RULES.md +292 -0
- package/docs/BUILD_HISTORY.md +65 -0
- package/docs/DESIGN_SYSTEM.md +256 -0
- package/docs/LEARNING_SYSTEM.md +326 -0
- package/docs/SYMBOLS_TREE.md +182 -0
- package/docs/VERSION.md +6 -0
- package/docs/architecture.md +111 -0
- package/package.json +60 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Manager - Sistema de cache inteligente com TTL
|
|
3
|
+
*
|
|
4
|
+
* Reduz latência de consultas à memória em até 80%
|
|
5
|
+
* ao cachear resultados frequentes em memória
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface CacheEntry<T> {
|
|
9
|
+
data: T;
|
|
10
|
+
expiry: number;
|
|
11
|
+
hits: number;
|
|
12
|
+
createdAt: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface CacheStats {
|
|
16
|
+
hits: number;
|
|
17
|
+
misses: number;
|
|
18
|
+
size: number;
|
|
19
|
+
hitRate: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class CacheManager {
|
|
23
|
+
private cache = new Map<string, CacheEntry<any>>();
|
|
24
|
+
private readonly defaultTTL: number;
|
|
25
|
+
private readonly maxSize: number;
|
|
26
|
+
private stats = {
|
|
27
|
+
hits: 0,
|
|
28
|
+
misses: 0
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
constructor(defaultTTL: number = 300000, maxSize: number = 1000) {
|
|
32
|
+
this.defaultTTL = defaultTTL; // 5 minutos padrão
|
|
33
|
+
this.maxSize = maxSize;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Obtém valor do cache
|
|
38
|
+
*/
|
|
39
|
+
get<T>(key: string): T | null {
|
|
40
|
+
const entry = this.cache.get(key);
|
|
41
|
+
|
|
42
|
+
if (!entry) {
|
|
43
|
+
this.stats.misses++;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Verificar se expirou
|
|
48
|
+
if (Date.now() > entry.expiry) {
|
|
49
|
+
this.cache.delete(key);
|
|
50
|
+
this.stats.misses++;
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Incrementar hits
|
|
55
|
+
entry.hits++;
|
|
56
|
+
this.stats.hits++;
|
|
57
|
+
|
|
58
|
+
return entry.data as T;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Define valor no cache
|
|
63
|
+
*/
|
|
64
|
+
set<T>(key: string, data: T, ttl?: number): void {
|
|
65
|
+
// Verificar limite de tamanho
|
|
66
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
67
|
+
this.evictLRU();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const expiryTime = ttl || this.defaultTTL;
|
|
71
|
+
|
|
72
|
+
this.cache.set(key, {
|
|
73
|
+
data,
|
|
74
|
+
expiry: Date.now() + expiryTime,
|
|
75
|
+
hits: 0,
|
|
76
|
+
createdAt: Date.now()
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Remove entrada do cache
|
|
82
|
+
*/
|
|
83
|
+
delete(key: string): boolean {
|
|
84
|
+
return this.cache.delete(key);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Limpa todo o cache
|
|
89
|
+
*/
|
|
90
|
+
clear(): void {
|
|
91
|
+
this.cache.clear();
|
|
92
|
+
this.stats.hits = 0;
|
|
93
|
+
this.stats.misses = 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Remove entradas expiradas
|
|
98
|
+
*/
|
|
99
|
+
cleanup(): number {
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
let removed = 0;
|
|
102
|
+
|
|
103
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
104
|
+
if (now > entry.expiry) {
|
|
105
|
+
this.cache.delete(key);
|
|
106
|
+
removed++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return removed;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Evict Least Recently Used (LRU)
|
|
115
|
+
*/
|
|
116
|
+
private evictLRU(): void {
|
|
117
|
+
let lruKey: string | null = null;
|
|
118
|
+
let lruHits = Infinity;
|
|
119
|
+
|
|
120
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
121
|
+
if (entry.hits < lruHits) {
|
|
122
|
+
lruHits = entry.hits;
|
|
123
|
+
lruKey = key;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (lruKey) {
|
|
128
|
+
this.cache.delete(lruKey);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Obtém estatísticas do cache
|
|
134
|
+
*/
|
|
135
|
+
getStats(): CacheStats {
|
|
136
|
+
const total = this.stats.hits + this.stats.misses;
|
|
137
|
+
const hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
hits: this.stats.hits,
|
|
141
|
+
misses: this.stats.misses,
|
|
142
|
+
size: this.cache.size,
|
|
143
|
+
hitRate: Math.round(hitRate * 100) / 100
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Reseta estatísticas
|
|
149
|
+
*/
|
|
150
|
+
resetStats(): void {
|
|
151
|
+
this.stats.hits = 0;
|
|
152
|
+
this.stats.misses = 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Obtém todas as chaves do cache
|
|
157
|
+
*/
|
|
158
|
+
keys(): string[] {
|
|
159
|
+
return Array.from(this.cache.keys());
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Verifica se chave existe no cache
|
|
164
|
+
*/
|
|
165
|
+
has(key: string): boolean {
|
|
166
|
+
const entry = this.cache.get(key);
|
|
167
|
+
if (!entry) return false;
|
|
168
|
+
|
|
169
|
+
// Verificar se não expirou
|
|
170
|
+
if (Date.now() > entry.expiry) {
|
|
171
|
+
this.cache.delete(key);
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Obtém tamanho atual do cache
|
|
180
|
+
*/
|
|
181
|
+
size(): number {
|
|
182
|
+
return this.cache.size;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation Agent (com Memória)
|
|
3
|
+
*
|
|
4
|
+
* Responsabilidades:
|
|
5
|
+
* - Gerar/atualizar DESIGN_SYSTEM.md
|
|
6
|
+
* - Gerar/atualizar SYMBOLS_TREE.md
|
|
7
|
+
* - Gerar/atualizar BUILD_HISTORY.md
|
|
8
|
+
* - Atualizar AGENT_RULES.md
|
|
9
|
+
* - Aprender estilos de documentação preferidos
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import { BaseAgent, TaskContext, TaskResult } from './base-agent';
|
|
15
|
+
|
|
16
|
+
export class DocumentationAgent extends BaseAgent {
|
|
17
|
+
constructor(memoryBasePath: string = '.agents/memory') {
|
|
18
|
+
super('documentation-agent', memoryBasePath);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Implementação da geração de documentação
|
|
23
|
+
*/
|
|
24
|
+
async executeTask(taskDescription: string, context: TaskContext): Promise<TaskResult> {
|
|
25
|
+
console.log('\n📚 Gerando/atualizando documentação...\n');
|
|
26
|
+
|
|
27
|
+
const updates: string[] = [];
|
|
28
|
+
|
|
29
|
+
// 1. Atualizar DESIGN_SYSTEM.md se houver mudanças de UI
|
|
30
|
+
if (context.areas.includes('frontend')) {
|
|
31
|
+
const designSystemUpdated = await this.updateDesignSystem(context.files);
|
|
32
|
+
if (designSystemUpdated) {
|
|
33
|
+
updates.push('DESIGN_SYSTEM.md atualizado');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 2. Atualizar SYMBOLS_TREE.md
|
|
38
|
+
const symbolsTreeUpdated = await this.updateSymbolsTree(context.files);
|
|
39
|
+
if (symbolsTreeUpdated) {
|
|
40
|
+
updates.push('SYMBOLS_TREE.md atualizado');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 3. Atualizar BUILD_HISTORY.md
|
|
44
|
+
const buildHistoryUpdated = await this.updateBuildHistory();
|
|
45
|
+
if (buildHistoryUpdated) {
|
|
46
|
+
updates.push('BUILD_HISTORY.md atualizado');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const success = updates.length > 0;
|
|
50
|
+
const details = updates.length > 0
|
|
51
|
+
? `Documentação atualizada: ${updates.join(', ')}`
|
|
52
|
+
: 'Nenhuma atualização de documentação necessária';
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
success,
|
|
56
|
+
details,
|
|
57
|
+
recommendations: updates.length === 0
|
|
58
|
+
? ['Considere adicionar documentação para novas features']
|
|
59
|
+
: undefined
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Atualiza DESIGN_SYSTEM.md
|
|
65
|
+
*/
|
|
66
|
+
private async updateDesignSystem(files: string[]): Promise<boolean> {
|
|
67
|
+
console.log(' 🎨 Verificando DESIGN_SYSTEM.md...');
|
|
68
|
+
|
|
69
|
+
const designSystemPath = 'docs/DESIGN_SYSTEM.md';
|
|
70
|
+
|
|
71
|
+
// Verificar se há componentes novos
|
|
72
|
+
const newComponents = files.filter(f =>
|
|
73
|
+
f.includes('components/') &&
|
|
74
|
+
(f.endsWith('.tsx') || f.endsWith('.jsx'))
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
if (newComponents.length === 0) {
|
|
78
|
+
console.log(' ⏭️ Nenhum componente novo');
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Aqui seria feita a análise real dos componentes
|
|
83
|
+
// e atualização do DESIGN_SYSTEM.md
|
|
84
|
+
console.log(` ✅ ${newComponents.length} componente(s) documentado(s)`);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Atualiza SYMBOLS_TREE.md
|
|
90
|
+
*/
|
|
91
|
+
private async updateSymbolsTree(files: string[]): Promise<boolean> {
|
|
92
|
+
console.log(' 🌳 Verificando SYMBOLS_TREE.md...');
|
|
93
|
+
|
|
94
|
+
const symbolsTreePath = 'docs/SYMBOLS_TREE.md';
|
|
95
|
+
|
|
96
|
+
// Verificar se há arquivos novos
|
|
97
|
+
if (files.length === 0) {
|
|
98
|
+
console.log(' ⏭️ Nenhum arquivo novo');
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Aqui seria feita a análise real da estrutura
|
|
103
|
+
// e atualização do SYMBOLS_TREE.md
|
|
104
|
+
console.log(` ✅ Árvore de símbolos atualizada`);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Atualiza BUILD_HISTORY.md
|
|
110
|
+
*/
|
|
111
|
+
private async updateBuildHistory(): Promise<boolean> {
|
|
112
|
+
console.log(' 📜 Verificando BUILD_HISTORY.md...');
|
|
113
|
+
|
|
114
|
+
const buildHistoryPath = 'docs/BUILD_HISTORY.md';
|
|
115
|
+
|
|
116
|
+
// Verificar se há novo build
|
|
117
|
+
const buildNumber = this.getCurrentBuildNumber();
|
|
118
|
+
|
|
119
|
+
// Aqui seria feita a atualização real do histórico
|
|
120
|
+
console.log(` ✅ Build #${buildNumber} registrado`);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Obtém número do build atual
|
|
126
|
+
*/
|
|
127
|
+
private getCurrentBuildNumber(): number {
|
|
128
|
+
try {
|
|
129
|
+
const buildHistoryPath = 'docs/BUILD_HISTORY.md';
|
|
130
|
+
if (fs.existsSync(buildHistoryPath)) {
|
|
131
|
+
const content = fs.readFileSync(buildHistoryPath, 'utf-8');
|
|
132
|
+
const match = content.match(/Build #(\d+)/g);
|
|
133
|
+
if (match) {
|
|
134
|
+
const numbers = match.map(m => parseInt(m.match(/\d+/)?.[0] || '0'));
|
|
135
|
+
return Math.max(...numbers) + 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} catch (error) {
|
|
139
|
+
// Ignorar erro
|
|
140
|
+
}
|
|
141
|
+
return 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Especialidade padrão do Documentation Agent
|
|
146
|
+
*/
|
|
147
|
+
protected getDefaultSpecialty(): string {
|
|
148
|
+
return `# Documentation Agent - Especialidade
|
|
149
|
+
|
|
150
|
+
## Responsabilidades
|
|
151
|
+
- Gerar documentação automática
|
|
152
|
+
- Manter DESIGN_SYSTEM.md atualizado
|
|
153
|
+
- Manter SYMBOLS_TREE.md atualizado
|
|
154
|
+
- Registrar histórico de builds
|
|
155
|
+
- Documentar APIs e componentes
|
|
156
|
+
- Criar guias de uso
|
|
157
|
+
|
|
158
|
+
## Expertise
|
|
159
|
+
- Technical Writing
|
|
160
|
+
- Markdown
|
|
161
|
+
- JSDoc/TSDoc
|
|
162
|
+
- API Documentation
|
|
163
|
+
- Architecture Documentation
|
|
164
|
+
- Diagramas (Mermaid, PlantUML)
|
|
165
|
+
|
|
166
|
+
## Regras
|
|
167
|
+
- Documentação sempre atualizada
|
|
168
|
+
- Exemplos de código funcionais
|
|
169
|
+
- Linguagem clara e concisa
|
|
170
|
+
- Diagramas quando necessário
|
|
171
|
+
- Versionamento de documentação
|
|
172
|
+
- Links funcionais
|
|
173
|
+
|
|
174
|
+
## Tarefas Típicas
|
|
175
|
+
- Documentar novos componentes
|
|
176
|
+
- Atualizar design system
|
|
177
|
+
- Registrar mudanças arquiteturais
|
|
178
|
+
- Criar guias de instalação
|
|
179
|
+
- Documentar APIs
|
|
180
|
+
- Gerar changelog
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Collector - Coletor de Feedback do Usuário
|
|
3
|
+
*
|
|
4
|
+
* Responsabilidades:
|
|
5
|
+
* - Coletar feedback do usuário após tarefas
|
|
6
|
+
* - Registrar feedback na memória dos agentes
|
|
7
|
+
* - Analisar padrões em feedbacks
|
|
8
|
+
* - Gerar sugestões baseadas em histórico
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { MemorySystem, MemoryEntry } from './memory-system';
|
|
12
|
+
import { TaskContext } from './base-agent';
|
|
13
|
+
|
|
14
|
+
export interface UserFeedback {
|
|
15
|
+
taskId: string;
|
|
16
|
+
agentName: string;
|
|
17
|
+
satisfied: boolean;
|
|
18
|
+
likes: string[];
|
|
19
|
+
dislikes: string[];
|
|
20
|
+
suggestions: string[];
|
|
21
|
+
timestamp: Date;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface FeedbackPrompt {
|
|
25
|
+
question: string;
|
|
26
|
+
type: 'boolean' | 'text' | 'multipleChoice';
|
|
27
|
+
options?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class FeedbackCollector {
|
|
31
|
+
private memory: MemorySystem;
|
|
32
|
+
|
|
33
|
+
constructor(memoryBasePath: string = '.agents/memory') {
|
|
34
|
+
this.memory = new MemorySystem(memoryBasePath);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Coleta feedback do usuário (simulado - em produção seria interativo)
|
|
39
|
+
*/
|
|
40
|
+
async collectFeedback(
|
|
41
|
+
taskId: string,
|
|
42
|
+
agentName: string,
|
|
43
|
+
taskDescription: string
|
|
44
|
+
): Promise<UserFeedback | null> {
|
|
45
|
+
console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
46
|
+
console.log('📝 FEEDBACK DO USUÁRIO');
|
|
47
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
48
|
+
console.log(`Tarefa: ${taskDescription}`);
|
|
49
|
+
console.log(`Agente: ${agentName}\n`);
|
|
50
|
+
|
|
51
|
+
// Em produção, isso seria um prompt interativo
|
|
52
|
+
// Por enquanto, retornamos null para indicar que o feedback será coletado manualmente
|
|
53
|
+
console.log('💡 Para fornecer feedback, use o método provideFeedback()');
|
|
54
|
+
console.log(' Exemplo: feedbackCollector.provideFeedback(taskId, agentName, {...})\n');
|
|
55
|
+
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Fornece feedback manualmente
|
|
61
|
+
*/
|
|
62
|
+
async provideFeedback(feedback: UserFeedback): Promise<void> {
|
|
63
|
+
console.log(`\n✅ Feedback recebido para ${feedback.agentName}`);
|
|
64
|
+
console.log(` Satisfeito: ${feedback.satisfied ? '👍 Sim' : '👎 Não'}`);
|
|
65
|
+
|
|
66
|
+
if (feedback.likes.length > 0) {
|
|
67
|
+
console.log(` Gostou: ${feedback.likes.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (feedback.dislikes.length > 0) {
|
|
71
|
+
console.log(` Não gostou: ${feedback.dislikes.join(', ')}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (feedback.suggestions.length > 0) {
|
|
75
|
+
console.log(` Sugestões: ${feedback.suggestions.join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Analisar feedback e gerar aprendizados
|
|
79
|
+
await this.analyzeFeedback(feedback);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Analisa feedback e gera aprendizados
|
|
84
|
+
*/
|
|
85
|
+
private async analyzeFeedback(feedback: UserFeedback): Promise<void> {
|
|
86
|
+
// Se não está satisfeito, criar aprendizado negativo
|
|
87
|
+
if (!feedback.satisfied && feedback.dislikes.length > 0) {
|
|
88
|
+
for (const dislike of feedback.dislikes) {
|
|
89
|
+
this.memory.addLearning(
|
|
90
|
+
feedback.agentName,
|
|
91
|
+
`Evitar: ${dislike}`,
|
|
92
|
+
`Usuário não gostou de: ${dislike}`,
|
|
93
|
+
`Evitar fazer: ${dislike}`,
|
|
94
|
+
[feedback.taskId]
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Se está satisfeito, criar aprendizado positivo
|
|
100
|
+
if (feedback.satisfied && feedback.likes.length > 0) {
|
|
101
|
+
for (const like of feedback.likes) {
|
|
102
|
+
this.memory.addLearning(
|
|
103
|
+
feedback.agentName,
|
|
104
|
+
`Repetir: ${like}`,
|
|
105
|
+
`Usuário gostou de: ${like}`,
|
|
106
|
+
`Continuar fazendo: ${like}`,
|
|
107
|
+
[feedback.taskId]
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Processar sugestões
|
|
113
|
+
if (feedback.suggestions.length > 0) {
|
|
114
|
+
for (const suggestion of feedback.suggestions) {
|
|
115
|
+
this.memory.addLearning(
|
|
116
|
+
feedback.agentName,
|
|
117
|
+
`Sugestão: ${suggestion}`,
|
|
118
|
+
`Usuário sugeriu: ${suggestion}`,
|
|
119
|
+
`Considerar implementar: ${suggestion}`,
|
|
120
|
+
[feedback.taskId]
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log(`\n🧠 Aprendizados registrados para ${feedback.agentName}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Obtém padrões de feedback
|
|
130
|
+
*/
|
|
131
|
+
getFeedbackPatterns(agentName: string): {
|
|
132
|
+
commonLikes: string[];
|
|
133
|
+
commonDislikes: string[];
|
|
134
|
+
commonSuggestions: string[];
|
|
135
|
+
} {
|
|
136
|
+
const agentMemory = this.memory.loadMemory(agentName);
|
|
137
|
+
|
|
138
|
+
// Extrair padrões dos aprendizados
|
|
139
|
+
const likes = agentMemory.learnings
|
|
140
|
+
.filter(l => l.pattern.startsWith('Repetir:'))
|
|
141
|
+
.sort((a, b) => b.occurrences - a.occurrences)
|
|
142
|
+
.slice(0, 5)
|
|
143
|
+
.map(l => l.pattern.replace('Repetir: ', ''));
|
|
144
|
+
|
|
145
|
+
const dislikes = agentMemory.learnings
|
|
146
|
+
.filter(l => l.pattern.startsWith('Evitar:'))
|
|
147
|
+
.sort((a, b) => b.occurrences - a.occurrences)
|
|
148
|
+
.slice(0, 5)
|
|
149
|
+
.map(l => l.pattern.replace('Evitar: ', ''));
|
|
150
|
+
|
|
151
|
+
const suggestions = agentMemory.learnings
|
|
152
|
+
.filter(l => l.pattern.startsWith('Sugestão:'))
|
|
153
|
+
.sort((a, b) => b.occurrences - a.occurrences)
|
|
154
|
+
.slice(0, 5)
|
|
155
|
+
.map(l => l.pattern.replace('Sugestão: ', ''));
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
commonLikes: likes,
|
|
159
|
+
commonDislikes: dislikes,
|
|
160
|
+
commonSuggestions: suggestions,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Gera relatório de feedback
|
|
166
|
+
*/
|
|
167
|
+
generateFeedbackReport(agentName: string): string {
|
|
168
|
+
const patterns = this.getFeedbackPatterns(agentName);
|
|
169
|
+
const stats = this.memory.getStats(agentName);
|
|
170
|
+
|
|
171
|
+
let report = `\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
172
|
+
report += `📊 RELATÓRIO DE FEEDBACK - ${agentName}\n`;
|
|
173
|
+
report += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n`;
|
|
174
|
+
|
|
175
|
+
report += `📈 Estatísticas:\n`;
|
|
176
|
+
report += ` Total de tarefas: ${stats.totalTasks}\n`;
|
|
177
|
+
report += ` Taxa de sucesso: ${(stats.successRate * 100).toFixed(1)}%\n\n`;
|
|
178
|
+
|
|
179
|
+
if (patterns.commonLikes.length > 0) {
|
|
180
|
+
report += `👍 O que os usuários mais gostam:\n`;
|
|
181
|
+
patterns.commonLikes.forEach((like, i) => {
|
|
182
|
+
report += ` ${i + 1}. ${like}\n`;
|
|
183
|
+
});
|
|
184
|
+
report += `\n`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (patterns.commonDislikes.length > 0) {
|
|
188
|
+
report += `👎 O que os usuários não gostam:\n`;
|
|
189
|
+
patterns.commonDislikes.forEach((dislike, i) => {
|
|
190
|
+
report += ` ${i + 1}. ${dislike}\n`;
|
|
191
|
+
});
|
|
192
|
+
report += `\n`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (patterns.commonSuggestions.length > 0) {
|
|
196
|
+
report += `💡 Sugestões recorrentes:\n`;
|
|
197
|
+
patterns.commonSuggestions.forEach((suggestion, i) => {
|
|
198
|
+
report += ` ${i + 1}. ${suggestion}\n`;
|
|
199
|
+
});
|
|
200
|
+
report += `\n`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
report += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
204
|
+
|
|
205
|
+
return report;
|
|
206
|
+
}
|
|
207
|
+
}
|