opc-agent 4.1.24 → 4.2.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/CHANGELOG.md +59 -119
- package/COMPETITIVE-GAP.md +92 -92
- package/CONTRIBUTING.md +36 -36
- package/README.md +290 -290
- package/README.zh-CN.md +269 -269
- package/dist/channels/telegram.d.ts +0 -5
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +0 -108
- package/dist/channels/telegram.js.map +1 -1
- package/dist/channels/voice.d.ts +97 -71
- package/dist/channels/voice.d.ts.map +1 -1
- package/dist/channels/voice.js +347 -369
- package/dist/channels/voice.js.map +1 -1
- package/dist/channels/web.d.ts.map +1 -1
- package/dist/channels/web.js +2 -8
- package/dist/channels/web.js.map +1 -1
- package/dist/channels/wechat.js +6 -6
- package/dist/cli/chat.d.ts +1 -4
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +73 -680
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/setup.js +1 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli.js +280 -373
- package/dist/cli.js.map +1 -1
- package/dist/core/agent.d.ts +0 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +0 -3
- package/dist/core/agent.js.map +1 -1
- package/dist/core/runtime.d.ts.map +1 -1
- package/dist/core/runtime.js +22 -192
- package/dist/core/runtime.js.map +1 -1
- package/dist/deploy/index.js +56 -56
- package/dist/doctor.d.ts +0 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +10 -155
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/memory/deepbrain.d.ts +1 -1
- package/dist/memory/deepbrain.d.ts.map +1 -1
- package/dist/memory/deepbrain.js +4 -95
- package/dist/memory/deepbrain.js.map +1 -1
- package/dist/memory/index.d.ts +0 -2
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -3
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/user-profiler.d.ts +0 -8
- package/dist/memory/user-profiler.d.ts.map +1 -1
- package/dist/memory/user-profiler.js +0 -89
- package/dist/memory/user-profiler.js.map +1 -1
- package/dist/scheduler/cron-engine.d.ts.map +1 -1
- package/dist/scheduler/cron-engine.js +36 -3
- package/dist/scheduler/cron-engine.js.map +1 -1
- package/dist/skills/auto-learn.d.ts.map +1 -1
- package/dist/skills/auto-learn.js +11 -65
- package/dist/skills/auto-learn.js.map +1 -1
- package/dist/skills/builtin/index.d.ts.map +1 -1
- package/dist/skills/builtin/index.js +30 -163
- package/dist/skills/builtin/index.js.map +1 -1
- package/dist/skills/types.d.ts +1 -1
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/types.js +0 -1
- package/dist/skills/types.js.map +1 -1
- package/dist/studio/server.d.ts +0 -1
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +12 -142
- package/dist/studio/server.js.map +1 -1
- package/dist/studio-ui/index.html +40 -359
- package/dist/ui/components.js +105 -105
- package/examples/README.md +22 -22
- package/examples/basic-agent.ts +90 -90
- package/examples/brain-integration.ts +71 -71
- package/examples/multi-channel.ts +74 -74
- package/install.ps1 +127 -127
- package/install.sh +154 -154
- package/models.json +164 -164
- package/package.json +63 -66
- package/scripts/install.ps1 +31 -31
- package/scripts/install.sh +40 -40
- package/templates/ecommerce-assistant/README.md +45 -45
- package/templates/ecommerce-assistant/oad.yaml +47 -47
- package/templates/tech-support/README.md +43 -43
- package/templates/tech-support/oad.yaml +45 -45
- package/.opc/memory.db +0 -0
- package/dist/core/model-recommender.d.ts +0 -40
- package/dist/core/model-recommender.d.ts.map +0 -1
- package/dist/core/model-recommender.js +0 -186
- package/dist/core/model-recommender.js.map +0 -1
- package/dist/memory/evolve-engine.d.ts +0 -113
- package/dist/memory/evolve-engine.d.ts.map +0 -1
- package/dist/memory/evolve-engine.js +0 -549
- package/dist/memory/evolve-engine.js.map +0 -1
- package/dist/memory/sqlite-store.d.ts +0 -40
- package/dist/memory/sqlite-store.d.ts.map +0 -1
- package/dist/memory/sqlite-store.js +0 -269
- package/dist/memory/sqlite-store.js.map +0 -1
- package/dist/scheduler/proactive.d.ts +0 -62
- package/dist/scheduler/proactive.d.ts.map +0 -1
- package/dist/scheduler/proactive.js +0 -185
- package/dist/scheduler/proactive.js.map +0 -1
|
@@ -1,549 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* KnowledgeEvolveEngine — Two-layer knowledge distillation
|
|
4
|
-
*
|
|
5
|
-
* Layer 1: Agent private refinement (local Ollama, zero cost)
|
|
6
|
-
* Conversations → extract insights → distill → write back to agent memory
|
|
7
|
-
* Key: memory never grows, only gets more refined
|
|
8
|
-
*
|
|
9
|
-
* Layer 2: Workstation shared refinement (AgentKits cloud model, paid)
|
|
10
|
-
* Multiple agents' refined knowledge → cross-agent fusion → shared workstation layer
|
|
11
|
-
* Key: one agent learns, all agents benefit
|
|
12
|
-
*
|
|
13
|
-
* Core principle:
|
|
14
|
-
* - Layer 1 ALWAYS uses local Ollama (zero cost)
|
|
15
|
-
* - Layer 2 uses AgentKits/cloud model (paid, higher quality)
|
|
16
|
-
* - Agent memory = distilled experience, NOT raw conversation history
|
|
17
|
-
*/
|
|
18
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
-
if (k2 === undefined) k2 = k;
|
|
20
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
-
}
|
|
24
|
-
Object.defineProperty(o, k2, desc);
|
|
25
|
-
}) : (function(o, m, k, k2) {
|
|
26
|
-
if (k2 === undefined) k2 = k;
|
|
27
|
-
o[k2] = m[k];
|
|
28
|
-
}));
|
|
29
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
-
}) : function(o, v) {
|
|
32
|
-
o["default"] = v;
|
|
33
|
-
});
|
|
34
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
-
var ownKeys = function(o) {
|
|
36
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
-
var ar = [];
|
|
38
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
-
return ar;
|
|
40
|
-
};
|
|
41
|
-
return ownKeys(o);
|
|
42
|
-
};
|
|
43
|
-
return function (mod) {
|
|
44
|
-
if (mod && mod.__esModule) return mod;
|
|
45
|
-
var result = {};
|
|
46
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
-
__setModuleDefault(result, mod);
|
|
48
|
-
return result;
|
|
49
|
-
};
|
|
50
|
-
})();
|
|
51
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
-
exports.AutoEvolveScheduler = exports.KnowledgeEvolveEngine = void 0;
|
|
53
|
-
const fs = __importStar(require("fs"));
|
|
54
|
-
const path = __importStar(require("path"));
|
|
55
|
-
// Prompts for local LLM — kept short for small models
|
|
56
|
-
const EXTRACT_PROMPT = `Extract key knowledge from this conversation. Output JSON array of insights.
|
|
57
|
-
Each insight: { "title": "short title", "content": "key information", "tags": ["tag1"], "confidence": 0.0-1.0 }
|
|
58
|
-
Only extract reusable knowledge (facts, procedures, preferences), not casual chat.
|
|
59
|
-
If nothing worth saving, return [].
|
|
60
|
-
|
|
61
|
-
Conversation:
|
|
62
|
-
`;
|
|
63
|
-
const DEDUP_PROMPT = `Compare these two knowledge entries. Are they about the same topic?
|
|
64
|
-
If yes, merge them into one better entry. If no, return null.
|
|
65
|
-
Respond JSON only: { "isDuplicate": boolean, "merged": { "title": string, "content": string, "confidence": number } | null }
|
|
66
|
-
|
|
67
|
-
Entry A:
|
|
68
|
-
{A}
|
|
69
|
-
|
|
70
|
-
Entry B:
|
|
71
|
-
{B}
|
|
72
|
-
`;
|
|
73
|
-
const DISTILL_PROMPT = `Distill these workstation-level knowledge entries into a higher-level summary suitable for the {TARGET_TIER} tier.
|
|
74
|
-
Remove agent-specific details, keep universal patterns.
|
|
75
|
-
Output JSON: { "title": string, "content": string, "tags": [string], "confidence": number }
|
|
76
|
-
|
|
77
|
-
Entries:
|
|
78
|
-
{ENTRIES}
|
|
79
|
-
`;
|
|
80
|
-
/** Layer 1: Compact agent memory — distill raw conversations into refined experience */
|
|
81
|
-
const MEMORY_COMPACT_PROMPT = `You are a memory compactor. Given these conversation memories, distill them into a concise, refined summary.
|
|
82
|
-
|
|
83
|
-
Rules:
|
|
84
|
-
- Keep ONLY reusable knowledge: user preferences, facts, procedures, decisions
|
|
85
|
-
- Remove: greetings, small talk, debugging attempts, repeated questions
|
|
86
|
-
- Merge similar topics into single entries
|
|
87
|
-
- Output a markdown document with ## sections, each a distinct knowledge item
|
|
88
|
-
- Be concise: aim for 30% of original length
|
|
89
|
-
- Preserve exact names, numbers, dates, technical details
|
|
90
|
-
- Write in the same language as the input
|
|
91
|
-
|
|
92
|
-
Current memory:
|
|
93
|
-
{MEMORY}
|
|
94
|
-
|
|
95
|
-
Output ONLY the refined markdown, no explanation.`;
|
|
96
|
-
class KnowledgeEvolveEngine {
|
|
97
|
-
config;
|
|
98
|
-
ollamaUrl;
|
|
99
|
-
model;
|
|
100
|
-
knowledgeDir;
|
|
101
|
-
conversationCount = 0;
|
|
102
|
-
timer = null;
|
|
103
|
-
constructor(agentDir, config = {}) {
|
|
104
|
-
this.config = {
|
|
105
|
-
enabled: config.enabled !== false,
|
|
106
|
-
localModel: config.localModel,
|
|
107
|
-
ollamaUrl: config.ollamaUrl || process.env.OLLAMA_BASE_URL || 'http://localhost:11434/v1',
|
|
108
|
-
conversationThreshold: config.conversationThreshold ?? 10,
|
|
109
|
-
intervalMs: config.intervalMs ?? 6 * 60 * 60 * 1000, // 6h
|
|
110
|
-
maxPagesPerTier: config.maxPagesPerTier ?? 100,
|
|
111
|
-
};
|
|
112
|
-
this.ollamaUrl = this.config.ollamaUrl;
|
|
113
|
-
this.model = this.config.localModel || '';
|
|
114
|
-
this.knowledgeDir = path.join(agentDir, '.opc', 'knowledge');
|
|
115
|
-
fs.mkdirSync(this.knowledgeDir, { recursive: true });
|
|
116
|
-
}
|
|
117
|
-
/** Auto-detect best local Ollama model for evolve tasks */
|
|
118
|
-
async detectLocalModel() {
|
|
119
|
-
if (this.model)
|
|
120
|
-
return this.model;
|
|
121
|
-
try {
|
|
122
|
-
const tagsUrl = this.ollamaUrl.replace('/v1', '/api/tags');
|
|
123
|
-
const res = await fetch(tagsUrl);
|
|
124
|
-
if (!res.ok)
|
|
125
|
-
return 'qwen2.5:0.5b';
|
|
126
|
-
const data = await res.json();
|
|
127
|
-
const models = (data.models || []).map((m) => m.name);
|
|
128
|
-
// Prefer larger models for better distillation
|
|
129
|
-
const preferred = ['qwen2.5:32b', 'qwen2.5:14b', 'qwen2.5:7b', 'llama3.1:8b', 'qwen2.5:3b', 'qwen2.5:1.5b', 'qwen2.5:0.5b'];
|
|
130
|
-
for (const p of preferred) {
|
|
131
|
-
if (models.includes(p)) {
|
|
132
|
-
this.model = p;
|
|
133
|
-
return p;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (models.length > 0) {
|
|
137
|
-
this.model = models[0];
|
|
138
|
-
return models[0];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
catch { /* Ollama not running */ }
|
|
142
|
-
this.model = 'qwen2.5:0.5b';
|
|
143
|
-
return this.model;
|
|
144
|
-
}
|
|
145
|
-
/** Call local Ollama model */
|
|
146
|
-
async callLocal(prompt, system) {
|
|
147
|
-
const model = await this.detectLocalModel();
|
|
148
|
-
const messages = [];
|
|
149
|
-
if (system)
|
|
150
|
-
messages.push({ role: 'system', content: system });
|
|
151
|
-
messages.push({ role: 'user', content: prompt });
|
|
152
|
-
try {
|
|
153
|
-
const res = await fetch(`${this.ollamaUrl}/chat/completions`, {
|
|
154
|
-
method: 'POST',
|
|
155
|
-
headers: { 'Content-Type': 'application/json' },
|
|
156
|
-
body: JSON.stringify({ model, messages, temperature: 0.3, max_tokens: 1000 }),
|
|
157
|
-
});
|
|
158
|
-
if (!res.ok)
|
|
159
|
-
return '';
|
|
160
|
-
const data = await res.json();
|
|
161
|
-
return data.choices?.[0]?.message?.content || '';
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
return '';
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/** Extract knowledge from conversation messages */
|
|
168
|
-
async extractFromConversation(messages) {
|
|
169
|
-
if (messages.length < 2)
|
|
170
|
-
return [];
|
|
171
|
-
const conversationText = messages
|
|
172
|
-
.slice(-20) // Last 20 messages max
|
|
173
|
-
.map(m => `${m.role}: ${m.content.substring(0, 200)}`)
|
|
174
|
-
.join('\n');
|
|
175
|
-
const response = await this.callLocal(EXTRACT_PROMPT + conversationText, 'You are a knowledge extraction engine. Output valid JSON arrays only.');
|
|
176
|
-
const pages = [];
|
|
177
|
-
try {
|
|
178
|
-
const match = response.match(/\[[\s\S]*\]/);
|
|
179
|
-
if (!match)
|
|
180
|
-
return [];
|
|
181
|
-
const insights = JSON.parse(match[0]);
|
|
182
|
-
if (!Array.isArray(insights))
|
|
183
|
-
return [];
|
|
184
|
-
for (const insight of insights) {
|
|
185
|
-
if (!insight.title || !insight.content)
|
|
186
|
-
continue;
|
|
187
|
-
if ((insight.confidence || 0) < 0.3)
|
|
188
|
-
continue;
|
|
189
|
-
const slug = this.slugify(insight.title);
|
|
190
|
-
pages.push({
|
|
191
|
-
slug,
|
|
192
|
-
content: `## ${insight.title}\n\n${insight.content}`,
|
|
193
|
-
tier: 'workstation',
|
|
194
|
-
source: 'conversation',
|
|
195
|
-
confidence: insight.confidence || 0.5,
|
|
196
|
-
createdAt: new Date().toISOString(),
|
|
197
|
-
updatedAt: new Date().toISOString(),
|
|
198
|
-
usageCount: 1,
|
|
199
|
-
tags: insight.tags || [],
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
catch { /* Parse error, skip */ }
|
|
204
|
-
// Save extracted pages
|
|
205
|
-
for (const page of pages) {
|
|
206
|
-
this.savePage(page);
|
|
207
|
-
}
|
|
208
|
-
return pages;
|
|
209
|
-
}
|
|
210
|
-
/** Deduplicate knowledge pages within a tier */
|
|
211
|
-
async deduplicateInTier(tier) {
|
|
212
|
-
const pages = this.loadPages(tier);
|
|
213
|
-
if (pages.length < 2)
|
|
214
|
-
return 0;
|
|
215
|
-
let deduped = 0;
|
|
216
|
-
const toRemove = new Set();
|
|
217
|
-
for (let i = 0; i < pages.length; i++) {
|
|
218
|
-
if (toRemove.has(pages[i].slug))
|
|
219
|
-
continue;
|
|
220
|
-
for (let j = i + 1; j < pages.length; j++) {
|
|
221
|
-
if (toRemove.has(pages[j].slug))
|
|
222
|
-
continue;
|
|
223
|
-
const prompt = DEDUP_PROMPT
|
|
224
|
-
.replace('{A}', pages[i].content.substring(0, 300))
|
|
225
|
-
.replace('{B}', pages[j].content.substring(0, 300));
|
|
226
|
-
const response = await this.callLocal(prompt, 'Respond in JSON only.');
|
|
227
|
-
try {
|
|
228
|
-
const match = response.match(/\{[\s\S]*\}/);
|
|
229
|
-
if (!match)
|
|
230
|
-
continue;
|
|
231
|
-
const result = JSON.parse(match[0]);
|
|
232
|
-
if (result.isDuplicate && result.merged) {
|
|
233
|
-
// Update A with merged content, mark B for removal
|
|
234
|
-
pages[i].content = `## ${result.merged.title}\n\n${result.merged.content}`;
|
|
235
|
-
pages[i].confidence = Math.max(pages[i].confidence, result.merged.confidence || pages[i].confidence);
|
|
236
|
-
pages[i].usageCount += pages[j].usageCount;
|
|
237
|
-
pages[i].updatedAt = new Date().toISOString();
|
|
238
|
-
toRemove.add(pages[j].slug);
|
|
239
|
-
deduped++;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
catch {
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// Save results
|
|
248
|
-
for (const page of pages) {
|
|
249
|
-
if (!toRemove.has(page.slug)) {
|
|
250
|
-
this.savePage(page);
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
this.deletePage(page.slug, tier);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return deduped;
|
|
257
|
-
}
|
|
258
|
-
/** Promote knowledge upward: workstation → job → industry */
|
|
259
|
-
async promoteKnowledge() {
|
|
260
|
-
let promoted = 0;
|
|
261
|
-
// Workstation → Job: pages with high confidence + usage
|
|
262
|
-
const wsPages = this.loadPages('workstation')
|
|
263
|
-
.filter(p => p.confidence >= 0.7 && p.usageCount >= 3);
|
|
264
|
-
if (wsPages.length >= 3) {
|
|
265
|
-
const entries = wsPages.slice(0, 10).map(p => p.content.substring(0, 200)).join('\n---\n');
|
|
266
|
-
const prompt = DISTILL_PROMPT
|
|
267
|
-
.replace('{TARGET_TIER}', 'job (岗位)')
|
|
268
|
-
.replace('{ENTRIES}', entries);
|
|
269
|
-
const response = await this.callLocal(prompt, 'Output JSON only.');
|
|
270
|
-
try {
|
|
271
|
-
const match = response.match(/\{[\s\S]*\}/);
|
|
272
|
-
if (match) {
|
|
273
|
-
const result = JSON.parse(match[0]);
|
|
274
|
-
if (result.title && result.content) {
|
|
275
|
-
const page = {
|
|
276
|
-
slug: `promoted-${this.slugify(result.title)}`,
|
|
277
|
-
content: `## ${result.title}\n\n${result.content}`,
|
|
278
|
-
tier: 'job',
|
|
279
|
-
source: 'evolve-promotion',
|
|
280
|
-
confidence: result.confidence || 0.8,
|
|
281
|
-
createdAt: new Date().toISOString(),
|
|
282
|
-
updatedAt: new Date().toISOString(),
|
|
283
|
-
usageCount: 0,
|
|
284
|
-
tags: result.tags || ['promoted'],
|
|
285
|
-
};
|
|
286
|
-
this.savePage(page);
|
|
287
|
-
promoted++;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
catch { /* skip */ }
|
|
292
|
-
}
|
|
293
|
-
// Job → Industry: high confidence job pages
|
|
294
|
-
const jobPages = this.loadPages('job')
|
|
295
|
-
.filter(p => p.confidence >= 0.85 && p.usageCount >= 5);
|
|
296
|
-
if (jobPages.length >= 3) {
|
|
297
|
-
const entries = jobPages.slice(0, 10).map(p => p.content.substring(0, 200)).join('\n---\n');
|
|
298
|
-
const prompt = DISTILL_PROMPT
|
|
299
|
-
.replace('{TARGET_TIER}', 'industry (行业)')
|
|
300
|
-
.replace('{ENTRIES}', entries);
|
|
301
|
-
const response = await this.callLocal(prompt, 'Output JSON only.');
|
|
302
|
-
try {
|
|
303
|
-
const match = response.match(/\{[\s\S]*\}/);
|
|
304
|
-
if (match) {
|
|
305
|
-
const result = JSON.parse(match[0]);
|
|
306
|
-
if (result.title && result.content) {
|
|
307
|
-
const page = {
|
|
308
|
-
slug: `industry-${this.slugify(result.title)}`,
|
|
309
|
-
content: `## ${result.title}\n\n${result.content}`,
|
|
310
|
-
tier: 'industry',
|
|
311
|
-
source: 'evolve-promotion',
|
|
312
|
-
confidence: result.confidence || 0.9,
|
|
313
|
-
createdAt: new Date().toISOString(),
|
|
314
|
-
updatedAt: new Date().toISOString(),
|
|
315
|
-
usageCount: 0,
|
|
316
|
-
tags: result.tags || ['promoted'],
|
|
317
|
-
};
|
|
318
|
-
this.savePage(page);
|
|
319
|
-
promoted++;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
catch { /* skip */ }
|
|
324
|
-
}
|
|
325
|
-
return promoted;
|
|
326
|
-
}
|
|
327
|
-
/** Full evolve cycle: extract → dedup → compact memory → promote */
|
|
328
|
-
async evolve(recentMessages) {
|
|
329
|
-
const result = { extracted: 0, deduplicated: 0, promoted: 0, compacted: false, errors: [] };
|
|
330
|
-
if (!this.config.enabled)
|
|
331
|
-
return result;
|
|
332
|
-
try {
|
|
333
|
-
// Step 1: Extract from recent conversation
|
|
334
|
-
if (recentMessages && recentMessages.length > 0) {
|
|
335
|
-
const pages = await this.extractFromConversation(recentMessages);
|
|
336
|
-
result.extracted = pages.length;
|
|
337
|
-
}
|
|
338
|
-
// Step 2: Deduplicate within each tier
|
|
339
|
-
result.deduplicated += await this.deduplicateInTier('workstation');
|
|
340
|
-
result.deduplicated += await this.deduplicateInTier('job');
|
|
341
|
-
// Step 3: Compact agent memory (Layer 1 — write refined experience back)
|
|
342
|
-
result.compacted = await this.compactAgentMemory();
|
|
343
|
-
// Step 4: Promote upward
|
|
344
|
-
result.promoted = await this.promoteKnowledge();
|
|
345
|
-
}
|
|
346
|
-
catch (err) {
|
|
347
|
-
result.errors.push(err.message || String(err));
|
|
348
|
-
}
|
|
349
|
-
// Save evolve log
|
|
350
|
-
this.saveEvolveLog(result);
|
|
351
|
-
return result;
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Layer 1: Compact agent memory
|
|
355
|
-
* Read MEMORY.md → distill with local model → write back refined version
|
|
356
|
-
* Result: memory never grows, only gets more concentrated
|
|
357
|
-
*/
|
|
358
|
-
async compactAgentMemory() {
|
|
359
|
-
const memoryPath = path.join(path.dirname(this.knowledgeDir), 'MEMORY.md');
|
|
360
|
-
// Also check .opc/MEMORY.md
|
|
361
|
-
const altMemoryPath = path.join(this.knowledgeDir, '..', 'MEMORY.md');
|
|
362
|
-
let targetPath = '';
|
|
363
|
-
let content = '';
|
|
364
|
-
for (const p of [memoryPath, altMemoryPath]) {
|
|
365
|
-
if (fs.existsSync(p)) {
|
|
366
|
-
content = fs.readFileSync(p, 'utf-8');
|
|
367
|
-
targetPath = p;
|
|
368
|
-
break;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
// Also compact conversation memory from SQLite if available
|
|
372
|
-
const memoryJsonPath = path.join(path.dirname(this.knowledgeDir), 'memory.json');
|
|
373
|
-
let conversationMemory = '';
|
|
374
|
-
if (fs.existsSync(memoryJsonPath)) {
|
|
375
|
-
try {
|
|
376
|
-
const data = JSON.parse(fs.readFileSync(memoryJsonPath, 'utf-8'));
|
|
377
|
-
// Extract conversation entries for compaction
|
|
378
|
-
const convEntries = Object.entries(data)
|
|
379
|
-
.filter(([k]) => k.startsWith('conversation:'))
|
|
380
|
-
.map(([, v]) => {
|
|
381
|
-
if (Array.isArray(v)) {
|
|
382
|
-
return v.map((m) => `${m.role}: ${m.content?.substring(0, 100)}`).join('\n');
|
|
383
|
-
}
|
|
384
|
-
return String(v).substring(0, 200);
|
|
385
|
-
});
|
|
386
|
-
if (convEntries.length > 0) {
|
|
387
|
-
conversationMemory = convEntries.join('\n---\n');
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch { /* ok */ }
|
|
391
|
-
}
|
|
392
|
-
// Need at least some content to compact
|
|
393
|
-
const fullContent = [content, conversationMemory].filter(Boolean).join('\n\n---\n\n');
|
|
394
|
-
if (fullContent.length < 500)
|
|
395
|
-
return false; // Too short to compact
|
|
396
|
-
// Only compact if content is getting large (>2KB)
|
|
397
|
-
if (fullContent.length < 2000)
|
|
398
|
-
return false;
|
|
399
|
-
const prompt = MEMORY_COMPACT_PROMPT.replace('{MEMORY}', fullContent.substring(0, 4000));
|
|
400
|
-
const refined = await this.callLocal(prompt);
|
|
401
|
-
if (!refined || refined.length < 100)
|
|
402
|
-
return false;
|
|
403
|
-
// Safety: don't overwrite if refined is much larger (LLM hallucinated)
|
|
404
|
-
if (refined.length > fullContent.length * 0.8)
|
|
405
|
-
return false;
|
|
406
|
-
// Write back refined memory
|
|
407
|
-
if (targetPath) {
|
|
408
|
-
// Backup original
|
|
409
|
-
const backupPath = targetPath + '.bak';
|
|
410
|
-
fs.copyFileSync(targetPath, backupPath);
|
|
411
|
-
// Write refined
|
|
412
|
-
const header = `<!-- Auto-refined by OPC Evolve Engine at ${new Date().toISOString()} -->\n<!-- Original backed up to ${path.basename(backupPath)} -->\n\n`;
|
|
413
|
-
fs.writeFileSync(targetPath, header + refined);
|
|
414
|
-
}
|
|
415
|
-
// Save compaction stats
|
|
416
|
-
const statsPath = path.join(this.knowledgeDir, 'compaction-log.json');
|
|
417
|
-
let logs = [];
|
|
418
|
-
try {
|
|
419
|
-
logs = JSON.parse(fs.readFileSync(statsPath, 'utf-8'));
|
|
420
|
-
}
|
|
421
|
-
catch { /* ok */ }
|
|
422
|
-
logs.push({
|
|
423
|
-
timestamp: new Date().toISOString(),
|
|
424
|
-
originalSize: fullContent.length,
|
|
425
|
-
refinedSize: refined.length,
|
|
426
|
-
ratio: (refined.length / fullContent.length * 100).toFixed(1) + '%',
|
|
427
|
-
});
|
|
428
|
-
if (logs.length > 50)
|
|
429
|
-
logs = logs.slice(-50);
|
|
430
|
-
fs.writeFileSync(statsPath, JSON.stringify(logs, null, 2));
|
|
431
|
-
return true;
|
|
432
|
-
}
|
|
433
|
-
/** Called after each conversation turn */
|
|
434
|
-
onConversationTurn(messages) {
|
|
435
|
-
this.conversationCount++;
|
|
436
|
-
if (this.conversationCount >= (this.config.conversationThreshold || 10)) {
|
|
437
|
-
this.conversationCount = 0;
|
|
438
|
-
// Background evolve — don't await, fire and forget
|
|
439
|
-
this.evolve(messages).catch(() => { });
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
/** Start periodic evolve timer */
|
|
443
|
-
startPeriodicEvolve() {
|
|
444
|
-
if (this.timer)
|
|
445
|
-
return;
|
|
446
|
-
const interval = this.config.intervalMs || 6 * 60 * 60 * 1000;
|
|
447
|
-
this.timer = setInterval(() => {
|
|
448
|
-
this.evolve().catch(() => { });
|
|
449
|
-
}, interval);
|
|
450
|
-
}
|
|
451
|
-
/** Stop periodic evolve */
|
|
452
|
-
stopPeriodicEvolve() {
|
|
453
|
-
if (this.timer) {
|
|
454
|
-
clearInterval(this.timer);
|
|
455
|
-
this.timer = null;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
/** Get stats for all tiers */
|
|
459
|
-
getStats() {
|
|
460
|
-
return {
|
|
461
|
-
workstation: this.loadPages('workstation').length,
|
|
462
|
-
job: this.loadPages('job').length,
|
|
463
|
-
industry: this.loadPages('industry').length,
|
|
464
|
-
lastEvolve: this.getLastEvolveTime(),
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
// ─── File I/O ────────────────────────────────────────────
|
|
468
|
-
savePage(page) {
|
|
469
|
-
const tierDir = path.join(this.knowledgeDir, page.tier);
|
|
470
|
-
fs.mkdirSync(tierDir, { recursive: true });
|
|
471
|
-
const filePath = path.join(tierDir, `${page.slug}.json`);
|
|
472
|
-
fs.writeFileSync(filePath, JSON.stringify(page, null, 2));
|
|
473
|
-
}
|
|
474
|
-
loadPages(tier) {
|
|
475
|
-
const tierDir = path.join(this.knowledgeDir, tier);
|
|
476
|
-
if (!fs.existsSync(tierDir))
|
|
477
|
-
return [];
|
|
478
|
-
return fs.readdirSync(tierDir)
|
|
479
|
-
.filter(f => f.endsWith('.json'))
|
|
480
|
-
.map(f => {
|
|
481
|
-
try {
|
|
482
|
-
return JSON.parse(fs.readFileSync(path.join(tierDir, f), 'utf-8'));
|
|
483
|
-
}
|
|
484
|
-
catch {
|
|
485
|
-
return null;
|
|
486
|
-
}
|
|
487
|
-
})
|
|
488
|
-
.filter((p) => p !== null);
|
|
489
|
-
}
|
|
490
|
-
deletePage(slug, tier) {
|
|
491
|
-
const filePath = path.join(this.knowledgeDir, tier, `${slug}.json`);
|
|
492
|
-
try {
|
|
493
|
-
fs.unlinkSync(filePath);
|
|
494
|
-
}
|
|
495
|
-
catch { /* ok */ }
|
|
496
|
-
}
|
|
497
|
-
saveEvolveLog(result) {
|
|
498
|
-
const logPath = path.join(this.knowledgeDir, 'evolve-log.json');
|
|
499
|
-
let logs = [];
|
|
500
|
-
try {
|
|
501
|
-
logs = JSON.parse(fs.readFileSync(logPath, 'utf-8'));
|
|
502
|
-
}
|
|
503
|
-
catch { /* ok */ }
|
|
504
|
-
logs.push({ ...result, timestamp: new Date().toISOString() });
|
|
505
|
-
// Keep last 100 entries
|
|
506
|
-
if (logs.length > 100)
|
|
507
|
-
logs = logs.slice(-100);
|
|
508
|
-
fs.writeFileSync(logPath, JSON.stringify(logs, null, 2));
|
|
509
|
-
}
|
|
510
|
-
getLastEvolveTime() {
|
|
511
|
-
const logPath = path.join(this.knowledgeDir, 'evolve-log.json');
|
|
512
|
-
try {
|
|
513
|
-
const logs = JSON.parse(fs.readFileSync(logPath, 'utf-8'));
|
|
514
|
-
return logs[logs.length - 1]?.timestamp;
|
|
515
|
-
}
|
|
516
|
-
catch {
|
|
517
|
-
return undefined;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
slugify(text) {
|
|
521
|
-
return text
|
|
522
|
-
.toLowerCase()
|
|
523
|
-
.replace(/[^a-z0-9\u4e00-\u9fff]+/g, '-')
|
|
524
|
-
.replace(/^-|-$/g, '')
|
|
525
|
-
.substring(0, 60);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
exports.KnowledgeEvolveEngine = KnowledgeEvolveEngine;
|
|
529
|
-
/**
|
|
530
|
-
* AutoEvolveScheduler — integrates with runtime
|
|
531
|
-
*/
|
|
532
|
-
class AutoEvolveScheduler {
|
|
533
|
-
engine;
|
|
534
|
-
constructor(agentDir, config) {
|
|
535
|
-
this.engine = new KnowledgeEvolveEngine(agentDir, config);
|
|
536
|
-
}
|
|
537
|
-
async start() {
|
|
538
|
-
await this.engine.detectLocalModel();
|
|
539
|
-
this.engine.startPeriodicEvolve();
|
|
540
|
-
}
|
|
541
|
-
stop() {
|
|
542
|
-
this.engine.stopPeriodicEvolve();
|
|
543
|
-
}
|
|
544
|
-
getEngine() {
|
|
545
|
-
return this.engine;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
exports.AutoEvolveScheduler = AutoEvolveScheduler;
|
|
549
|
-
//# sourceMappingURL=evolve-engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evolve-engine.js","sourceRoot":"","sources":["../../src/memory/evolve-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { Message, MemoryStore } from '../core/types';
|
|
2
|
-
export interface SQLiteStoreOptions {
|
|
3
|
-
/** Path to the .db file. Defaults to .opc/memory.db */
|
|
4
|
-
dbPath?: string;
|
|
5
|
-
/** Max messages per session before pruning oldest. Default 1000 */
|
|
6
|
-
maxMessagesPerSession?: number;
|
|
7
|
-
}
|
|
8
|
-
export declare class SQLiteStore implements MemoryStore {
|
|
9
|
-
private db;
|
|
10
|
-
private dbPath;
|
|
11
|
-
private maxMessages;
|
|
12
|
-
private kvCache;
|
|
13
|
-
private ready;
|
|
14
|
-
constructor(options?: SQLiteStoreOptions);
|
|
15
|
-
private init;
|
|
16
|
-
private save;
|
|
17
|
-
get(key: string): Promise<unknown>;
|
|
18
|
-
set(key: string, value: unknown): Promise<void>;
|
|
19
|
-
getConversation(sessionId: string): Promise<Message[]>;
|
|
20
|
-
addMessage(sessionId: string, message: Message): Promise<void>;
|
|
21
|
-
clear(sessionId?: string): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Full-text search across all conversations.
|
|
24
|
-
* Returns matching messages ranked by relevance.
|
|
25
|
-
*/
|
|
26
|
-
search(query: string, limit?: number): Promise<Message[]>;
|
|
27
|
-
/**
|
|
28
|
-
* Get conversation stats.
|
|
29
|
-
*/
|
|
30
|
-
stats(): Promise<{
|
|
31
|
-
totalMessages: number;
|
|
32
|
-
sessions: number;
|
|
33
|
-
dbSizeKB: number;
|
|
34
|
-
}>;
|
|
35
|
-
/**
|
|
36
|
-
* Close the database (for graceful shutdown).
|
|
37
|
-
*/
|
|
38
|
-
close(): Promise<void>;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=sqlite-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/memory/sqlite-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS1D,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,GAAE,kBAAuB;YAM9B,IAAI;IAsFlB,OAAO,CAAC,IAAI;IAQN,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgBtD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC9D,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoC3D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAcrF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|