opc-agent 4.2.13 → 5.0.0-alpha.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/.opc/memory.db +0 -0
- package/TASK.md +49 -0
- package/data/brain.db/deepbrain.sqlite +0 -0
- package/dist/channels/api.d.ts +14 -0
- package/dist/channels/api.d.ts.map +1 -0
- package/dist/channels/api.js +58 -0
- package/dist/channels/api.js.map +1 -0
- package/dist/cli.js +144 -52
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-loop.d.ts +3 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +51 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/context-assembler.d.ts +12 -0
- package/dist/core/context-assembler.d.ts.map +1 -0
- package/dist/core/context-assembler.js +81 -0
- package/dist/core/context-assembler.js.map +1 -0
- package/dist/core/guardrails.d.ts +16 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +62 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/iteration-budget.d.ts +12 -0
- package/dist/core/iteration-budget.d.ts.map +1 -0
- package/dist/core/iteration-budget.js +26 -0
- package/dist/core/iteration-budget.js.map +1 -0
- package/dist/core/types.d.ts +412 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/deepbrain/embedding.d.ts +7 -0
- package/dist/deepbrain/embedding.d.ts.map +1 -0
- package/dist/deepbrain/embedding.js +108 -0
- package/dist/deepbrain/embedding.js.map +1 -0
- package/dist/deepbrain/index.d.ts +8 -0
- package/dist/deepbrain/index.d.ts.map +1 -0
- package/dist/deepbrain/index.js +19 -0
- package/dist/deepbrain/index.js.map +1 -0
- package/dist/deepbrain/migrate.d.ts +2 -0
- package/dist/deepbrain/migrate.d.ts.map +1 -0
- package/dist/deepbrain/migrate.js +139 -0
- package/dist/deepbrain/migrate.js.map +1 -0
- package/dist/deepbrain/provider.d.ts +13 -0
- package/dist/deepbrain/provider.d.ts.map +1 -0
- package/dist/deepbrain/provider.js +85 -0
- package/dist/deepbrain/provider.js.map +1 -0
- package/dist/deepbrain/recall.d.ts +9 -0
- package/dist/deepbrain/recall.d.ts.map +1 -0
- package/dist/deepbrain/recall.js +48 -0
- package/dist/deepbrain/recall.js.map +1 -0
- package/dist/deepbrain/store.d.ts +36 -0
- package/dist/deepbrain/store.d.ts.map +1 -0
- package/dist/deepbrain/store.js +342 -0
- package/dist/deepbrain/store.js.map +1 -0
- package/dist/deepbrain/workspace-files.d.ts +5 -0
- package/dist/deepbrain/workspace-files.d.ts.map +1 -0
- package/dist/deepbrain/workspace-files.js +159 -0
- package/dist/deepbrain/workspace-files.js.map +1 -0
- package/dist/evolution/index.d.ts +1 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +3 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/l1-experience.d.ts +5 -0
- package/dist/evolution/l1-experience.d.ts.map +1 -0
- package/dist/evolution/l1-experience.js +117 -0
- package/dist/evolution/l1-experience.js.map +1 -0
- package/dist/evolution/l2-consolidation.d.ts +4 -0
- package/dist/evolution/l2-consolidation.d.ts.map +1 -0
- package/dist/evolution/l2-consolidation.js +106 -0
- package/dist/evolution/l2-consolidation.js.map +1 -0
- package/dist/evolution/l2-memskill.d.ts +12 -0
- package/dist/evolution/l2-memskill.d.ts.map +1 -0
- package/dist/evolution/l2-memskill.js +57 -0
- package/dist/evolution/l2-memskill.js.map +1 -0
- package/dist/evolution/l3-skill-discover.d.ts +4 -0
- package/dist/evolution/l3-skill-discover.d.ts.map +1 -0
- package/dist/evolution/l3-skill-discover.js +139 -0
- package/dist/evolution/l3-skill-discover.js.map +1 -0
- package/dist/evolution/l3-skill-verify.d.ts +12 -0
- package/dist/evolution/l3-skill-verify.d.ts.map +1 -0
- package/dist/evolution/l3-skill-verify.js +122 -0
- package/dist/evolution/l3-skill-verify.js.map +1 -0
- package/dist/evolution/l4-desensitize.d.ts +7 -0
- package/dist/evolution/l4-desensitize.d.ts.map +1 -0
- package/dist/evolution/l4-desensitize.js +30 -0
- package/dist/evolution/l4-desensitize.js.map +1 -0
- package/dist/evolution/l4-group-evolve.d.ts +8 -0
- package/dist/evolution/l4-group-evolve.d.ts.map +1 -0
- package/dist/evolution/l4-group-evolve.js +15 -0
- package/dist/evolution/l4-group-evolve.js.map +1 -0
- package/dist/evolution/maturity-scorer.d.ts +11 -0
- package/dist/evolution/maturity-scorer.d.ts.map +1 -0
- package/dist/evolution/maturity-scorer.js +21 -0
- package/dist/evolution/maturity-scorer.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -5
- package/dist/index.js.map +1 -1
- package/dist/providers/agentkits.d.ts +20 -0
- package/dist/providers/agentkits.d.ts.map +1 -0
- package/dist/providers/agentkits.js +173 -0
- package/dist/providers/agentkits.js.map +1 -0
- package/dist/providers/model-provider.d.ts +16 -0
- package/dist/providers/model-provider.d.ts.map +1 -0
- package/dist/providers/model-provider.js +13 -0
- package/dist/providers/model-provider.js.map +1 -0
- package/dist/providers/model-recommender.d.ts +15 -0
- package/dist/providers/model-recommender.d.ts.map +1 -0
- package/dist/providers/model-recommender.js +71 -0
- package/dist/providers/model-recommender.js.map +1 -0
- package/dist/providers/ollama.d.ts +22 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +176 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +23 -0
- package/dist/providers/openai-compat.d.ts.map +1 -0
- package/dist/providers/openai-compat.js +184 -0
- package/dist/providers/openai-compat.js.map +1 -0
- package/dist/providers/router.d.ts +11 -0
- package/dist/providers/router.d.ts.map +1 -0
- package/dist/providers/router.js +48 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/scheduler/cron.d.ts +19 -0
- package/dist/scheduler/cron.d.ts.map +1 -0
- package/dist/scheduler/cron.js +64 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/schema/oad.d.ts +72 -72
- package/dist/skills/loader.d.ts +16 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +114 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/matcher.d.ts +18 -0
- package/dist/skills/matcher.d.ts.map +1 -0
- package/dist/skills/matcher.js +70 -0
- package/dist/skills/matcher.js.map +1 -0
- package/dist/studio/agent-pool.d.ts +17 -0
- package/dist/studio/agent-pool.d.ts.map +1 -0
- package/dist/studio/agent-pool.js +35 -0
- package/dist/studio/agent-pool.js.map +1 -0
- package/dist/studio/assistant-tools.d.ts +4 -0
- package/dist/studio/assistant-tools.d.ts.map +1 -0
- package/dist/studio/assistant-tools.js +36 -0
- package/dist/studio/assistant-tools.js.map +1 -0
- package/dist/studio/index.d.ts +1 -0
- package/dist/studio/index.d.ts.map +1 -0
- package/dist/studio/index.js +3 -0
- package/dist/studio/index.js.map +1 -0
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +13 -18
- package/dist/studio/server.js.map +1 -1
- package/dist/templates/index.d.ts +1 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +3 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/roles/index.d.ts +4 -0
- package/dist/templates/roles/index.d.ts.map +1 -0
- package/dist/templates/roles/index.js +46 -0
- package/dist/templates/roles/index.js.map +1 -0
- package/dist/templates/template-provider.d.ts +16 -0
- package/dist/templates/template-provider.d.ts.map +1 -0
- package/dist/templates/template-provider.js +60 -0
- package/dist/templates/template-provider.js.map +1 -0
- package/dist/tools/builtin/definitions.d.ts +7 -0
- package/dist/tools/builtin/definitions.d.ts.map +1 -0
- package/dist/tools/builtin/definitions.js +60 -0
- package/dist/tools/builtin/definitions.js.map +1 -0
- package/dist/tools/execute-code.d.ts +20 -0
- package/dist/tools/execute-code.d.ts.map +1 -0
- package/dist/tools/execute-code.js +92 -0
- package/dist/tools/execute-code.js.map +1 -0
- package/dist/tools/hooks.d.ts +47 -0
- package/dist/tools/hooks.d.ts.map +1 -0
- package/dist/tools/hooks.js +69 -0
- package/dist/tools/hooks.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +20 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +35 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +42 -0
- package/dist/tools/registry.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.microCompact = microCompact;
|
|
4
|
+
exports.compileExperience = compileExperience;
|
|
5
|
+
// L1 evolution — experience compilation: MicroCompact + Contrastive Reflection
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
// MicroCompact: compress old tool outputs, keep the most recent N intact
|
|
8
|
+
function microCompact(messages, keepRecent = 3) {
|
|
9
|
+
const toolIndices = [];
|
|
10
|
+
messages.forEach((m, i) => {
|
|
11
|
+
if (m.metadata?.toolCallId || m.metadata?.isToolResult) {
|
|
12
|
+
toolIndices.push(i);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const keepSet = new Set(toolIndices.slice(-keepRecent));
|
|
16
|
+
return messages.map((m, i) => {
|
|
17
|
+
if ((m.metadata?.toolCallId || m.metadata?.isToolResult) && !keepSet.has(i)) {
|
|
18
|
+
const toolName = String(m.metadata?.toolName ?? 'unknown');
|
|
19
|
+
const byteCount = Buffer.byteLength(m.content, 'utf-8');
|
|
20
|
+
return {
|
|
21
|
+
...m,
|
|
22
|
+
content: `[tool result compressed: ${toolName} returned ${byteCount} bytes]`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return m;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Contrastive Reflection: compare success/failure paths, extract lessons
|
|
29
|
+
async function compileExperience(messages, config, router, brain) {
|
|
30
|
+
if (!config.l1.enabled)
|
|
31
|
+
return;
|
|
32
|
+
if (config.strategy === 'free') {
|
|
33
|
+
const keywords = extractKeywords(messages);
|
|
34
|
+
await brain.store({
|
|
35
|
+
content: keywords.join(', '),
|
|
36
|
+
source: 'l1',
|
|
37
|
+
layer: 'workstation',
|
|
38
|
+
tags: ['keywords', 'l1'],
|
|
39
|
+
embedding: null,
|
|
40
|
+
maturityScore: 0,
|
|
41
|
+
useCount: 0,
|
|
42
|
+
lastUsed: '',
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const provider = router.getProvider('l1');
|
|
47
|
+
const reflectPrompt = `对比以下对话中的成功和失败路径,提取3个关键教训。只输出JSON:
|
|
48
|
+
{"summary":"一句话总结","lessons":["教训1","教训2","教训3"],"errorPatterns":["错误模式"]}`;
|
|
49
|
+
const response = await provider.chat({
|
|
50
|
+
systemPrompt: reflectPrompt,
|
|
51
|
+
messages: [{
|
|
52
|
+
id: (0, crypto_1.randomUUID)(),
|
|
53
|
+
role: 'user',
|
|
54
|
+
content: formatMessagesForReflection(messages),
|
|
55
|
+
timestamp: Date.now(),
|
|
56
|
+
}],
|
|
57
|
+
});
|
|
58
|
+
const text = response.message.content;
|
|
59
|
+
const parsed = safeParseJSON(text);
|
|
60
|
+
await brain.store({
|
|
61
|
+
content: JSON.stringify({
|
|
62
|
+
summary: parsed.summary ?? text.slice(0, 200),
|
|
63
|
+
lessons: parsed.lessons ?? [],
|
|
64
|
+
errorPatterns: parsed.errorPatterns ?? [],
|
|
65
|
+
}),
|
|
66
|
+
source: 'l1',
|
|
67
|
+
layer: 'workstation',
|
|
68
|
+
tags: ['experience', 'reflection', 'l1'],
|
|
69
|
+
embedding: null,
|
|
70
|
+
maturityScore: 0,
|
|
71
|
+
useCount: 0,
|
|
72
|
+
lastUsed: '',
|
|
73
|
+
});
|
|
74
|
+
await brain.evolve('l1', config);
|
|
75
|
+
}
|
|
76
|
+
function extractKeywords(messages) {
|
|
77
|
+
const stopWords = new Set([
|
|
78
|
+
'的', '了', '是', '在', '我', '你', '他', '她', '它', '们', '和',
|
|
79
|
+
'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
80
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'shall',
|
|
81
|
+
'should', 'may', 'might', 'can', 'could', 'to', 'of', 'in', 'for',
|
|
82
|
+
'on', 'with', 'at', 'by', 'from', 'it', 'this', 'that',
|
|
83
|
+
]);
|
|
84
|
+
const freq = new Map();
|
|
85
|
+
for (const msg of messages) {
|
|
86
|
+
const words = msg.content
|
|
87
|
+
.toLowerCase()
|
|
88
|
+
.replace(/[^\w一-鿿\s]/g, ' ')
|
|
89
|
+
.split(/\s+/)
|
|
90
|
+
.filter(w => w.length >= 2 && !stopWords.has(w));
|
|
91
|
+
for (const word of words) {
|
|
92
|
+
freq.set(word, (freq.get(word) ?? 0) + 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return Array.from(freq.entries())
|
|
96
|
+
.sort((a, b) => b[1] - a[1])
|
|
97
|
+
.slice(0, 10)
|
|
98
|
+
.map(([word]) => word);
|
|
99
|
+
}
|
|
100
|
+
function formatMessagesForReflection(messages) {
|
|
101
|
+
return messages
|
|
102
|
+
.slice(-20)
|
|
103
|
+
.map(m => `[${m.role.toUpperCase()}]: ${m.content.slice(0, 500)}`)
|
|
104
|
+
.join('\n');
|
|
105
|
+
}
|
|
106
|
+
function safeParseJSON(text) {
|
|
107
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
108
|
+
if (!match)
|
|
109
|
+
return {};
|
|
110
|
+
try {
|
|
111
|
+
return JSON.parse(match[0]);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=l1-experience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l1-experience.js","sourceRoot":"","sources":["../../src/evolution/l1-experience.ts"],"names":[],"mappings":";;AAMA,oCAqBC;AAGD,8CAwDC;AAtFD,+EAA+E;AAC/E,mCAAoC;AAIpC,yEAAyE;AACzE,SAAgB,YAAY,CAAC,QAAmB,EAAE,UAAU,GAAG,CAAC;IAC9D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;YACvD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAExD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO;gBACL,GAAG,CAAC;gBACJ,OAAO,EAAE,4BAA4B,QAAQ,aAAa,SAAS,SAAS;aAC7E,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AAClE,KAAK,UAAU,iBAAiB,CACrC,QAAmB,EACnB,MAAuB,EACvB,MAAmB,EACnB,KAAwB;IAExB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO;IAE/B,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,KAAK,CAAC;YAChB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG;2EACmD,CAAC;IAE1E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;QACnC,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,CAAC;gBACT,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,2BAA2B,CAAC,QAAQ,CAAC;gBAC9C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,KAAK,CAAC,KAAK,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,EAAG,MAAM,CAAC,OAA8B,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACrE,OAAO,EAAG,MAAM,CAAC,OAAgC,IAAI,EAAE;YACvD,aAAa,EAAG,MAAM,CAAC,aAAsC,IAAI,EAAE;SACpE,CAAC;QACF,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC;QACxC,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CAAC,QAAmB;IAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;QACrD,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;QACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;QACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;QACjE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;KACvD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO;aACtB,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAmB;IACtD,OAAO,QAAQ;SACZ,KAAK,CAAC,CAAC,EAAE,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AutoDreamAction, DeepBrainProvider, EvolutionConfig } from '../core/types';
|
|
2
|
+
import type { ModelRouter } from '../providers/router';
|
|
3
|
+
export declare function autoDream(brain: DeepBrainProvider, router: ModelRouter, config: EvolutionConfig): Promise<AutoDreamAction[]>;
|
|
4
|
+
//# sourceMappingURL=l2-consolidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-consolidation.d.ts","sourceRoot":"","sources":["../../src/evolution/l2-consolidation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAsB,SAAS,CAC7B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAgG5B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.autoDream = autoDream;
|
|
4
|
+
// L2 evolution — AutoDream: merge/trim/reorganize memory entries
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
async function autoDream(brain, router, config) {
|
|
7
|
+
if (!config.l2.enabled)
|
|
8
|
+
return [];
|
|
9
|
+
const recalled = await brain.recall({
|
|
10
|
+
query: 'knowledge experience lesson error pattern',
|
|
11
|
+
topK: 50,
|
|
12
|
+
});
|
|
13
|
+
const allKnowledge = recalled.entries;
|
|
14
|
+
if (allKnowledge.length === 0)
|
|
15
|
+
return [];
|
|
16
|
+
const provider = router.getProvider('l2');
|
|
17
|
+
const consolidatePrompt = `你是记忆管理器。分析以下知识条目,决定哪些该合并(语义重复)、裁剪(过时)、重组(拆分/合并)。
|
|
18
|
+
输出 JSON: {"merge":[{"ids":["id1","id2"],"reason":"..."}],"trim":[{"id":"id1","reason":"..."}],"reorganize":[{"id":"id1","newContent":"...","reason":"..."}]}`;
|
|
19
|
+
const response = await provider.chat({
|
|
20
|
+
systemPrompt: consolidatePrompt,
|
|
21
|
+
messages: [{
|
|
22
|
+
id: (0, crypto_1.randomUUID)(),
|
|
23
|
+
role: 'user',
|
|
24
|
+
content: JSON.stringify(allKnowledge.slice(0, 50).map(e => ({
|
|
25
|
+
id: e.id,
|
|
26
|
+
content: e.content.slice(0, 300),
|
|
27
|
+
layer: e.layer,
|
|
28
|
+
maturityScore: e.maturityScore,
|
|
29
|
+
useCount: e.useCount,
|
|
30
|
+
}))),
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
}],
|
|
33
|
+
});
|
|
34
|
+
const text = response.message.content;
|
|
35
|
+
const parsed = safeParseJSON(text);
|
|
36
|
+
const actions = [];
|
|
37
|
+
const now = new Date().toISOString();
|
|
38
|
+
for (const m of (parsed.merge ?? [])) {
|
|
39
|
+
if (!Array.isArray(m.ids) || m.ids.length < 2)
|
|
40
|
+
continue;
|
|
41
|
+
const sources = allKnowledge.filter(e => m.ids.includes(e.id));
|
|
42
|
+
if (sources.length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
await brain.store({
|
|
45
|
+
content: sources.map(e => e.content).join('\n---\n'),
|
|
46
|
+
source: 'l2',
|
|
47
|
+
layer: sources[0].layer,
|
|
48
|
+
tags: [...Array.from(new Set(sources.flatMap(e => e.tags))), 'merged'],
|
|
49
|
+
embedding: null,
|
|
50
|
+
maturityScore: Math.max(...sources.map(e => e.maturityScore)),
|
|
51
|
+
useCount: sources.reduce((s, e) => s + e.useCount, 0),
|
|
52
|
+
lastUsed: now,
|
|
53
|
+
});
|
|
54
|
+
actions.push({ type: 'merge', ids: m.ids });
|
|
55
|
+
}
|
|
56
|
+
for (const t of (parsed.trim ?? [])) {
|
|
57
|
+
if (!t.id)
|
|
58
|
+
continue;
|
|
59
|
+
const entry = allKnowledge.find(e => e.id === t.id);
|
|
60
|
+
if (!entry)
|
|
61
|
+
continue;
|
|
62
|
+
await brain.store({
|
|
63
|
+
content: entry.content,
|
|
64
|
+
source: entry.source,
|
|
65
|
+
layer: entry.layer,
|
|
66
|
+
tags: [...entry.tags, '_trimmed'],
|
|
67
|
+
embedding: null,
|
|
68
|
+
maturityScore: 0,
|
|
69
|
+
useCount: entry.useCount,
|
|
70
|
+
lastUsed: entry.lastUsed,
|
|
71
|
+
});
|
|
72
|
+
actions.push({ type: 'trim', ids: [t.id] });
|
|
73
|
+
}
|
|
74
|
+
for (const r of (parsed.reorganize ?? [])) {
|
|
75
|
+
if (!r.id || !r.newContent)
|
|
76
|
+
continue;
|
|
77
|
+
const entry = allKnowledge.find(e => e.id === r.id);
|
|
78
|
+
if (!entry)
|
|
79
|
+
continue;
|
|
80
|
+
await brain.store({
|
|
81
|
+
content: r.newContent,
|
|
82
|
+
source: 'l2',
|
|
83
|
+
layer: entry.layer,
|
|
84
|
+
tags: [...entry.tags.filter(t => t !== '_trimmed'), 'reorganized'],
|
|
85
|
+
embedding: null,
|
|
86
|
+
maturityScore: entry.maturityScore,
|
|
87
|
+
useCount: entry.useCount,
|
|
88
|
+
lastUsed: entry.lastUsed,
|
|
89
|
+
});
|
|
90
|
+
actions.push({ type: 'reorganize', ids: [r.id], newContent: r.newContent });
|
|
91
|
+
}
|
|
92
|
+
await brain.evolve('l2', config);
|
|
93
|
+
return actions;
|
|
94
|
+
}
|
|
95
|
+
function safeParseJSON(text) {
|
|
96
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
97
|
+
if (!match)
|
|
98
|
+
return {};
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(match[0]);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=l2-consolidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-consolidation.js","sourceRoot":"","sources":["../../src/evolution/l2-consolidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DeepBrainProvider } from '../core/types';
|
|
2
|
+
export declare class MemSkill {
|
|
3
|
+
private brain;
|
|
4
|
+
constructor(brain: DeepBrainProvider);
|
|
5
|
+
recordRecallFeedback(query: string, results: string[], accepted: boolean): Promise<void>;
|
|
6
|
+
getOptimizedWeights(): Promise<{
|
|
7
|
+
fts: number;
|
|
8
|
+
vec: number;
|
|
9
|
+
maturity: number;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=l2-memskill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-memskill.d.ts","sourceRoot":"","sources":["../../src/evolution/l2-memskill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AASvD,qBAAa,QAAQ;IACP,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAEtC,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAkBV,mBAAmB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CA8BrF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemSkill = void 0;
|
|
4
|
+
class MemSkill {
|
|
5
|
+
brain;
|
|
6
|
+
constructor(brain) {
|
|
7
|
+
this.brain = brain;
|
|
8
|
+
}
|
|
9
|
+
async recordRecallFeedback(query, results, accepted) {
|
|
10
|
+
await this.brain.store({
|
|
11
|
+
content: JSON.stringify({
|
|
12
|
+
type: 'recall_feedback',
|
|
13
|
+
query,
|
|
14
|
+
resultCount: results.length,
|
|
15
|
+
accepted,
|
|
16
|
+
}),
|
|
17
|
+
source: 'l2',
|
|
18
|
+
layer: 'workstation',
|
|
19
|
+
tags: ['recall_feedback', accepted ? 'accepted' : 'rejected'],
|
|
20
|
+
embedding: null,
|
|
21
|
+
maturityScore: 0,
|
|
22
|
+
useCount: 0,
|
|
23
|
+
lastUsed: '',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async getOptimizedWeights() {
|
|
27
|
+
const recalled = await this.brain.recall({
|
|
28
|
+
query: 'recall feedback accepted rejected',
|
|
29
|
+
topK: 200,
|
|
30
|
+
});
|
|
31
|
+
let accepted = 0;
|
|
32
|
+
let total = 0;
|
|
33
|
+
for (const entry of recalled.entries) {
|
|
34
|
+
let data;
|
|
35
|
+
try {
|
|
36
|
+
data = JSON.parse(entry.content);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (data.type !== 'recall_feedback')
|
|
42
|
+
continue;
|
|
43
|
+
total++;
|
|
44
|
+
if (data.accepted)
|
|
45
|
+
accepted++;
|
|
46
|
+
}
|
|
47
|
+
const acceptRate = total > 0 ? accepted / total : 0.5;
|
|
48
|
+
// High acceptance → boost vector; low → fall back to FTS
|
|
49
|
+
return {
|
|
50
|
+
fts: Math.max(0.1, 1 - acceptRate * 0.8),
|
|
51
|
+
vec: Math.max(0.1, acceptRate * 0.8),
|
|
52
|
+
maturity: 0.3,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.MemSkill = MemSkill;
|
|
57
|
+
//# sourceMappingURL=l2-memskill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2-memskill.js","sourceRoot":"","sources":["../../src/evolution/l2-memskill.ts"],"names":[],"mappings":";;;AAUA,MAAa,QAAQ;IACC;IAApB,YAAoB,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IAAG,CAAC;IAEhD,KAAK,CAAC,oBAAoB,CACxB,KAAa,EACb,OAAiB,EACjB,QAAiB;QAEjB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,iBAAiB;gBACvB,KAAK;gBACL,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,QAAQ;aACgB,CAAC;YAC3B,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;YAC7D,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACvC,KAAK,EAAE,mCAAmC;YAC1C,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,IAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS;YAC9C,KAAK,EAAE,CAAC;YACR,IAAI,IAAI,CAAC,QAAQ;gBAAE,QAAQ,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QAEtD,yDAAyD;QACzD,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC;YACxC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC;YACpC,QAAQ,EAAE,GAAG;SACd,CAAC;IACJ,CAAC;CACF;AAvDD,4BAuDC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Message, EvolutionConfig, DeepBrainProvider } from '../core/types';
|
|
2
|
+
import type { ModelRouter } from '../providers/router';
|
|
3
|
+
export declare function discoverSkills(recentMessages: Message[][], router: ModelRouter, config: EvolutionConfig, brain?: DeepBrainProvider): Promise<string[]>;
|
|
4
|
+
//# sourceMappingURL=l3-skill-discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l3-skill-discover.d.ts","sourceRoot":"","sources":["../../src/evolution/l3-skill-discover.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AASvD,wBAAsB,cAAc,CAClC,cAAc,EAAE,OAAO,EAAE,EAAE,EAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,EACvB,KAAK,CAAC,EAAE,iBAAiB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmEnB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.discoverSkills = discoverSkills;
|
|
37
|
+
// L3 evolution — discover reusable skills from repeated conversation patterns
|
|
38
|
+
const fs = __importStar(require("fs/promises"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const crypto_1 = require("crypto");
|
|
41
|
+
async function discoverSkills(recentMessages, router, config, brain) {
|
|
42
|
+
if (!config.l3.enabled || !config.l3.autoDiscover)
|
|
43
|
+
return [];
|
|
44
|
+
if (recentMessages.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
const provider = router.getProvider('l3');
|
|
47
|
+
const discoverPrompt = `分析以下多轮对话,找出重复出现的任务模式。每个模式输出:
|
|
48
|
+
{"name":"skill-name","description":"做什么","triggers":["触发关键词"],"steps":["步骤1","步骤2"]}
|
|
49
|
+
将多个模式放在数组中:[{...},{...}]`;
|
|
50
|
+
const conversationSample = recentMessages
|
|
51
|
+
.slice(0, 10)
|
|
52
|
+
.map((msgs, i) => `--- 对话 ${i + 1} ---\n${msgs.slice(0, 10).map(m => `[${m.role}]: ${m.content.slice(0, 200)}`).join('\n')}`)
|
|
53
|
+
.join('\n\n');
|
|
54
|
+
const response = await provider.chat({
|
|
55
|
+
systemPrompt: discoverPrompt,
|
|
56
|
+
messages: [{
|
|
57
|
+
id: (0, crypto_1.randomUUID)(),
|
|
58
|
+
role: 'user',
|
|
59
|
+
content: conversationSample,
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
}],
|
|
62
|
+
});
|
|
63
|
+
const patterns = safeParseJSONArray(response.message.content);
|
|
64
|
+
if (patterns.length === 0)
|
|
65
|
+
return [];
|
|
66
|
+
const skillsDir = '.opc/skills';
|
|
67
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
68
|
+
const paths = [];
|
|
69
|
+
for (const p of patterns) {
|
|
70
|
+
const name = p.name;
|
|
71
|
+
if (typeof name !== 'string' || !name)
|
|
72
|
+
continue;
|
|
73
|
+
const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase();
|
|
74
|
+
const filePath = path.join(skillsDir, `auto-${safeName}.md`);
|
|
75
|
+
await fs.writeFile(filePath, generateSkillMarkdown(p), 'utf-8');
|
|
76
|
+
if (brain) {
|
|
77
|
+
await brain.store({
|
|
78
|
+
content: JSON.stringify({
|
|
79
|
+
type: 'skill_record',
|
|
80
|
+
name: safeName,
|
|
81
|
+
description: String(p.description ?? ''),
|
|
82
|
+
filePath,
|
|
83
|
+
status: 'candidate',
|
|
84
|
+
}),
|
|
85
|
+
source: 'l3',
|
|
86
|
+
layer: 'workstation',
|
|
87
|
+
tags: ['skill', 'candidate', safeName],
|
|
88
|
+
embedding: null,
|
|
89
|
+
maturityScore: 0,
|
|
90
|
+
useCount: 0,
|
|
91
|
+
lastUsed: '',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
paths.push(filePath);
|
|
95
|
+
}
|
|
96
|
+
return paths;
|
|
97
|
+
}
|
|
98
|
+
function generateSkillMarkdown(p) {
|
|
99
|
+
const triggers = Array.isArray(p.triggers) ? p.triggers : [];
|
|
100
|
+
const steps = Array.isArray(p.steps) ? p.steps : [];
|
|
101
|
+
return [
|
|
102
|
+
`# ${p.name}`,
|
|
103
|
+
'',
|
|
104
|
+
`## Description`,
|
|
105
|
+
String(p.description ?? ''),
|
|
106
|
+
'',
|
|
107
|
+
`## Triggers`,
|
|
108
|
+
triggers.map(t => `- ${t}`).join('\n') || '- (none)',
|
|
109
|
+
'',
|
|
110
|
+
`## Steps`,
|
|
111
|
+
steps.map((s, i) => `${i + 1}. ${s}`).join('\n') || '1. (none)',
|
|
112
|
+
'',
|
|
113
|
+
`---`,
|
|
114
|
+
`*Auto-generated by OPC L3 Skill Discovery*`,
|
|
115
|
+
].join('\n');
|
|
116
|
+
}
|
|
117
|
+
function safeParseJSONArray(text) {
|
|
118
|
+
const arrayMatch = text.match(/\[[\s\S]*\]/);
|
|
119
|
+
if (arrayMatch) {
|
|
120
|
+
try {
|
|
121
|
+
const parsed = JSON.parse(arrayMatch[0]);
|
|
122
|
+
if (Array.isArray(parsed))
|
|
123
|
+
return parsed;
|
|
124
|
+
}
|
|
125
|
+
catch { /* fall through */ }
|
|
126
|
+
}
|
|
127
|
+
const objMatch = text.match(/\{[\s\S]*\}/);
|
|
128
|
+
if (objMatch) {
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(objMatch[0]);
|
|
131
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
132
|
+
return [parsed];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch { /* ignore */ }
|
|
136
|
+
}
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=l3-skill-discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l3-skill-discover.js","sourceRoot":"","sources":["../../src/evolution/l3-skill-discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DeepBrainProvider } from '../core/types';
|
|
2
|
+
import type { ModelRouter } from '../providers/router';
|
|
3
|
+
export interface VerificationResult {
|
|
4
|
+
skillId: string;
|
|
5
|
+
passed: boolean;
|
|
6
|
+
errors: string[];
|
|
7
|
+
warnings: string[];
|
|
8
|
+
elapsedMs: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function verifySkill(skillPath: string, testCases: string[], router: ModelRouter): Promise<boolean>;
|
|
11
|
+
export declare function retireStaleSkills(brain: DeepBrainProvider, maxIdleDays?: number): Promise<string[]>;
|
|
12
|
+
//# sourceMappingURL=l3-skill-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l3-skill-verify.d.ts","sourceRoot":"","sources":["../../src/evolution/l3-skill-verify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CA0ClB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,iBAAiB,EACxB,WAAW,SAAK,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAyCnB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.verifySkill = verifySkill;
|
|
37
|
+
exports.retireStaleSkills = retireStaleSkills;
|
|
38
|
+
// L3 skill verifier — quality validation and lifecycle management for auto-discovered skills
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
40
|
+
const crypto_1 = require("crypto");
|
|
41
|
+
async function verifySkill(skillPath, testCases, router) {
|
|
42
|
+
let content;
|
|
43
|
+
try {
|
|
44
|
+
content = await fs.readFile(skillPath, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (!content.trim())
|
|
50
|
+
return false;
|
|
51
|
+
// Structural checks: must have title and description at minimum
|
|
52
|
+
const hasTitle = /^#\s+\S+/m.test(content);
|
|
53
|
+
const hasDescription = /##\s+(description|描述)/im.test(content);
|
|
54
|
+
if (!hasTitle || !hasDescription)
|
|
55
|
+
return false;
|
|
56
|
+
if (testCases.length === 0) {
|
|
57
|
+
return /##\s+(step|steps|步骤)/im.test(content);
|
|
58
|
+
}
|
|
59
|
+
const provider = router.getProvider('l3');
|
|
60
|
+
const verifyPrompt = `你是 Skill 质量验证员。根据以下 skill 定义和测试用例,判断 skill 是否能正确处理这些用例。
|
|
61
|
+
只输出 JSON: {"passed": true/false, "reasons": ["..."]}`;
|
|
62
|
+
const response = await provider.chat({
|
|
63
|
+
systemPrompt: verifyPrompt,
|
|
64
|
+
messages: [{
|
|
65
|
+
id: (0, crypto_1.randomUUID)(),
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: `Skill:\n${content.slice(0, 1000)}\n\nTest cases:\n${testCases.slice(0, 5).join('\n')}`,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
}],
|
|
70
|
+
});
|
|
71
|
+
const match = response.message.content.match(/\{[\s\S]*\}/);
|
|
72
|
+
if (!match)
|
|
73
|
+
return /##\s+(step|steps|步骤)/im.test(content);
|
|
74
|
+
try {
|
|
75
|
+
const parsed = JSON.parse(match[0]);
|
|
76
|
+
return parsed.passed === true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function retireStaleSkills(brain, maxIdleDays = 30) {
|
|
83
|
+
const cutoff = new Date();
|
|
84
|
+
cutoff.setDate(cutoff.getDate() - maxIdleDays);
|
|
85
|
+
const cutoffStr = cutoff.toISOString();
|
|
86
|
+
const recalled = await brain.recall({
|
|
87
|
+
query: 'skill candidate active skill record',
|
|
88
|
+
topK: 200,
|
|
89
|
+
});
|
|
90
|
+
const retired = [];
|
|
91
|
+
for (const entry of recalled.entries) {
|
|
92
|
+
let data;
|
|
93
|
+
try {
|
|
94
|
+
data = JSON.parse(entry.content);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (data.type !== 'skill_record')
|
|
100
|
+
continue;
|
|
101
|
+
if (data.status === 'retired')
|
|
102
|
+
continue;
|
|
103
|
+
const neverUsed = !entry.lastUsed;
|
|
104
|
+
const idleTooLong = entry.lastUsed ? entry.lastUsed < cutoffStr : true;
|
|
105
|
+
if (!(neverUsed || (idleTooLong && entry.useCount < 2)))
|
|
106
|
+
continue;
|
|
107
|
+
await brain.store({
|
|
108
|
+
content: JSON.stringify({ ...data, status: 'retired' }),
|
|
109
|
+
source: 'l3',
|
|
110
|
+
layer: 'workstation',
|
|
111
|
+
tags: ['skill', 'retired', String(data.name ?? '')],
|
|
112
|
+
embedding: null,
|
|
113
|
+
maturityScore: 0,
|
|
114
|
+
useCount: entry.useCount,
|
|
115
|
+
lastUsed: entry.lastUsed,
|
|
116
|
+
});
|
|
117
|
+
if (data.filePath)
|
|
118
|
+
retired.push(data.filePath);
|
|
119
|
+
}
|
|
120
|
+
return retired;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=l3-skill-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l3-skill-verify.js","sourceRoot":"","sources":["../../src/evolution/l3-skill-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EvolutionConfig, DesensitizeResult } from '../core/types';
|
|
2
|
+
export declare function desensitize(content: string, _config: EvolutionConfig): Promise<DesensitizeResult>;
|
|
3
|
+
export declare function scanForPII(text: string): Promise<{
|
|
4
|
+
hasPII: boolean;
|
|
5
|
+
types: string[];
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=l4-desensitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l4-desensitize.d.ts","sourceRoot":"","sources":["../../src/evolution/l4-desensitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMxE,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAM5F"}
|