@memtensor/memos-local-openclaw-plugin 0.1.4 → 0.1.6

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.
Files changed (104) hide show
  1. package/README.md +196 -84
  2. package/dist/ingest/dedup.d.ts +8 -0
  3. package/dist/ingest/dedup.d.ts.map +1 -1
  4. package/dist/ingest/dedup.js +21 -0
  5. package/dist/ingest/dedup.js.map +1 -1
  6. package/dist/ingest/providers/anthropic.d.ts +14 -0
  7. package/dist/ingest/providers/anthropic.d.ts.map +1 -1
  8. package/dist/ingest/providers/anthropic.js +104 -0
  9. package/dist/ingest/providers/anthropic.js.map +1 -1
  10. package/dist/ingest/providers/bedrock.d.ts +14 -0
  11. package/dist/ingest/providers/bedrock.d.ts.map +1 -1
  12. package/dist/ingest/providers/bedrock.js +100 -0
  13. package/dist/ingest/providers/bedrock.js.map +1 -1
  14. package/dist/ingest/providers/gemini.d.ts +14 -0
  15. package/dist/ingest/providers/gemini.d.ts.map +1 -1
  16. package/dist/ingest/providers/gemini.js +96 -0
  17. package/dist/ingest/providers/gemini.js.map +1 -1
  18. package/dist/ingest/providers/index.d.ts +22 -0
  19. package/dist/ingest/providers/index.d.ts.map +1 -1
  20. package/dist/ingest/providers/index.js +68 -0
  21. package/dist/ingest/providers/index.js.map +1 -1
  22. package/dist/ingest/providers/openai.d.ts +22 -0
  23. package/dist/ingest/providers/openai.d.ts.map +1 -1
  24. package/dist/ingest/providers/openai.js +143 -0
  25. package/dist/ingest/providers/openai.js.map +1 -1
  26. package/dist/ingest/task-processor.d.ts +2 -0
  27. package/dist/ingest/task-processor.d.ts.map +1 -1
  28. package/dist/ingest/task-processor.js +15 -0
  29. package/dist/ingest/task-processor.js.map +1 -1
  30. package/dist/ingest/worker.d.ts +2 -0
  31. package/dist/ingest/worker.d.ts.map +1 -1
  32. package/dist/ingest/worker.js +115 -12
  33. package/dist/ingest/worker.js.map +1 -1
  34. package/dist/recall/engine.d.ts.map +1 -1
  35. package/dist/recall/engine.js +1 -0
  36. package/dist/recall/engine.js.map +1 -1
  37. package/dist/skill/bundled-memory-guide.d.ts +6 -0
  38. package/dist/skill/bundled-memory-guide.d.ts.map +1 -0
  39. package/dist/skill/bundled-memory-guide.js +95 -0
  40. package/dist/skill/bundled-memory-guide.js.map +1 -0
  41. package/dist/skill/evaluator.d.ts +31 -0
  42. package/dist/skill/evaluator.d.ts.map +1 -0
  43. package/dist/skill/evaluator.js +194 -0
  44. package/dist/skill/evaluator.js.map +1 -0
  45. package/dist/skill/evolver.d.ts +22 -0
  46. package/dist/skill/evolver.d.ts.map +1 -0
  47. package/dist/skill/evolver.js +193 -0
  48. package/dist/skill/evolver.js.map +1 -0
  49. package/dist/skill/generator.d.ts +25 -0
  50. package/dist/skill/generator.d.ts.map +1 -0
  51. package/dist/skill/generator.js +477 -0
  52. package/dist/skill/generator.js.map +1 -0
  53. package/dist/skill/installer.d.ts +16 -0
  54. package/dist/skill/installer.d.ts.map +1 -0
  55. package/dist/skill/installer.js +89 -0
  56. package/dist/skill/installer.js.map +1 -0
  57. package/dist/skill/upgrader.d.ts +19 -0
  58. package/dist/skill/upgrader.d.ts.map +1 -0
  59. package/dist/skill/upgrader.js +263 -0
  60. package/dist/skill/upgrader.js.map +1 -0
  61. package/dist/skill/validator.d.ts +29 -0
  62. package/dist/skill/validator.d.ts.map +1 -0
  63. package/dist/skill/validator.js +227 -0
  64. package/dist/skill/validator.js.map +1 -0
  65. package/dist/storage/sqlite.d.ts +75 -1
  66. package/dist/storage/sqlite.d.ts.map +1 -1
  67. package/dist/storage/sqlite.js +417 -6
  68. package/dist/storage/sqlite.js.map +1 -1
  69. package/dist/types.d.ts +78 -0
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/types.js +6 -0
  72. package/dist/types.js.map +1 -1
  73. package/dist/viewer/html.d.ts +1 -1
  74. package/dist/viewer/html.d.ts.map +1 -1
  75. package/dist/viewer/html.js +1549 -113
  76. package/dist/viewer/html.js.map +1 -1
  77. package/dist/viewer/server.d.ts +13 -0
  78. package/dist/viewer/server.d.ts.map +1 -1
  79. package/dist/viewer/server.js +289 -4
  80. package/dist/viewer/server.js.map +1 -1
  81. package/index.ts +489 -181
  82. package/package.json +1 -1
  83. package/skill/memos-memory-guide/SKILL.md +86 -0
  84. package/src/ingest/dedup.ts +29 -0
  85. package/src/ingest/providers/anthropic.ts +130 -0
  86. package/src/ingest/providers/bedrock.ts +126 -0
  87. package/src/ingest/providers/gemini.ts +124 -0
  88. package/src/ingest/providers/index.ts +86 -4
  89. package/src/ingest/providers/openai.ts +174 -0
  90. package/src/ingest/task-processor.ts +16 -0
  91. package/src/ingest/worker.ts +126 -21
  92. package/src/recall/engine.ts +1 -0
  93. package/src/skill/bundled-memory-guide.ts +91 -0
  94. package/src/skill/evaluator.ts +220 -0
  95. package/src/skill/evolver.ts +169 -0
  96. package/src/skill/generator.ts +506 -0
  97. package/src/skill/installer.ts +59 -0
  98. package/src/skill/upgrader.ts +257 -0
  99. package/src/skill/validator.ts +227 -0
  100. package/src/storage/sqlite.ts +508 -6
  101. package/src/types.ts +77 -0
  102. package/src/viewer/html.ts +1549 -113
  103. package/src/viewer/server.ts +285 -4
  104. package/skill/SKILL.md +0 -59
@@ -0,0 +1,477 @@
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.SkillGenerator = void 0;
37
+ const uuid_1 = require("uuid");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const validator_1 = require("./validator");
41
+ // ─── Step 1: Generate SKILL.md ───
42
+ // Based on Anthropic skill-creator principles:
43
+ // - Progressive disclosure (metadata ~100 words → body <500 lines → resources on demand)
44
+ // - Description as primary trigger mechanism — write it "pushy"
45
+ // - Explain WHY, not pile up MUST/NEVER
46
+ // - Imperative form, keep it concise
47
+ // - Generalize from the specific task, don't over-fit
48
+ const STEP1_SKILL_MD_PROMPT = `You are a Skill creation expert. Your job is to distill a completed task's execution record into a reusable SKILL.md file.
49
+
50
+ This Skill is special: it comes from real execution experience — every step was actually run, every pitfall was actually encountered and resolved.
51
+
52
+ ## Core principles (follow strictly but do NOT include these in output)
53
+
54
+ ### Progressive disclosure
55
+ - The frontmatter description (~100 words) is ALWAYS in the agent's context — it must be self-sufficient for deciding whether to use this skill.
56
+ - The SKILL.md body loads when triggered — keep it under 400 lines, focused, no fluff.
57
+ - If the task involved large configs/scripts, mention them but DON'T inline everything — just reference that scripts/ or references/ may contain them.
58
+
59
+ ### Description as trigger mechanism
60
+ The description field decides whether the agent activates this skill. Write it "proactively":
61
+ - Don't just say what it does — list the situations, keywords, and phrasings that should trigger it.
62
+ - Claude/agents tend to under-trigger skills. Counter this by being explicit about when to use it.
63
+ - Bad: "How to deploy Node.js to Docker"
64
+ - Good: "How to containerize and deploy a Node.js application using Docker. Use when the user mentions Docker deployment, Dockerfile writing, container builds, multi-stage builds, port mapping, .dockerignore, image optimization, CI/CD container pipelines, or any task involving packaging a Node/JS backend into a container — even if they don't say 'Docker' explicitly but describe wanting to 'package the app for production' or 'run it anywhere'."
65
+
66
+ ### Writing style
67
+ - Use imperative form
68
+ - Explain WHY for each step, not just HOW — today's LLMs respond better to reasoning than rigid rules
69
+ - Seeing yourself write ALWAYS or NEVER in caps is a yellow flag — rephrase with reasoning instead
70
+ - Generalize from the specific task so the skill works for similar future scenarios, don't over-fit to this exact project
71
+ - Keep real commands/code/config from the task record — these are verified to work
72
+
73
+ ### Language matching (CRITICAL)
74
+ You MUST write the ENTIRE skill in the SAME language as the user's messages in the task record.
75
+ - If the user wrote in Chinese → the skill title, description, all prose sections MUST be in Chinese
76
+ - If the user wrote in English → write in English
77
+ - If mixed → use the language that appears most in the user's messages
78
+ - The "name" field in frontmatter should still use English kebab-case (it's a machine identifier)
79
+ - But "description", section headings, step explanations, pitfall descriptions — ALL must match the user's language
80
+ - Code/commands stay in their original language (they are language-agnostic)
81
+ DO NOT default to English. Look at the task record below and match its language.
82
+
83
+ ## Output format
84
+
85
+ Output ONLY the complete SKILL.md content. No extra text before or after.
86
+
87
+ ---
88
+ name: "{NAME}"
89
+ description: "{A natural, proactive description. 60-120 words. Cover what it does + multiple phrasings/scenarios that should trigger it. Be pushy about triggering — list keywords, alternative descriptions, edge-case phrasings.}"
90
+ metadata: {{ "openclaw": {{ "emoji": "{emoji}" }} }}
91
+ ---
92
+
93
+ # {Title — clear, action-oriented}
94
+
95
+ {One sentence: what this skill helps you do and why it's valuable}
96
+
97
+ ## When to use this skill
98
+ {2-4 bullet points describing the scenarios. Focus on the user's INTENT, not just keywords. Example: "When you need to get a Node app running reliably in a container and want to avoid common pitfalls like bloated images or missing health checks."}
99
+
100
+ ## Steps
101
+ {Numbered or sectioned steps extracted from the task. For each step:
102
+ 1. What to do (with verified commands/code in fenced blocks)
103
+ 2. Why this matters (one sentence explaining the reasoning)
104
+ Keep the actual commands/code from the task — they're verified.}
105
+
106
+ ## Pitfalls and solutions
107
+ {What went wrong during the task and how it was fixed. Format:
108
+ ❌ Wrong approach → Why it fails → ✅ Correct approach
109
+ These are the most valuable parts — real debugging experience.}
110
+
111
+ ## Key code and configuration
112
+ {Complete, verified code blocks and config files. Don't summarize code — keep it complete and runnable.}
113
+
114
+ ## Environment and prerequisites
115
+ {Versions, dependencies, permissions, OS requirements — anything needed to reproduce.}
116
+
117
+ ## Task record
118
+
119
+ Task title: {TITLE}
120
+ Task summary:
121
+ {SUMMARY}
122
+
123
+ Conversation highlights:
124
+ {CONVERSATION}`;
125
+ // ─── Step 2: Extract scripts ───
126
+ const STEP2_SCRIPTS_PROMPT = `Based on the following SKILL.md and task record, extract reusable automation scripts.
127
+
128
+ Rules:
129
+ - Only extract if the task record contains concrete shell commands, Python scripts, or TypeScript code that form a complete, reusable automation.
130
+ - Each script must be self-contained and runnable.
131
+ - If there are no automatable scripts (e.g., the task was mostly manual steps or config editing), return an empty array.
132
+ - Don't fabricate scripts — only extract what was actually used in the task.
133
+
134
+ SKILL.md:
135
+ {SKILL_CONTENT}
136
+
137
+ Task conversation highlights:
138
+ {CONVERSATION}
139
+
140
+ Reply with a JSON array only. No extra text:
141
+ [
142
+ {{ "filename": "deploy.sh", "content": "#!/bin/bash\\n..." }},
143
+ {{ "filename": "setup.py", "content": "..." }}
144
+ ]
145
+
146
+ If no scripts should be extracted, reply with: []`;
147
+ // ─── Step 3: Generate evals ───
148
+ const STEP3_EVALS_PROMPT = `Based on the following skill, generate realistic test prompts that should trigger this skill.
149
+
150
+ Requirements:
151
+ - Write 3-4 test prompts that a real user would type
152
+ - Mix of direct and indirect phrasings (some obviously match the skill, some are edge cases)
153
+ - Include realistic details: file paths, project names, specific error messages
154
+ - Mix formal and casual tones, include some with typos or shorthand
155
+ - Each prompt should be complex enough that the agent would need the skill (not simple Q&A)
156
+ - Write expectations that are specific and verifiable
157
+
158
+ Skill:
159
+ {SKILL_CONTENT}
160
+
161
+ Reply with a JSON array only:
162
+ [
163
+ {{
164
+ "id": 1,
165
+ "prompt": "A realistic user message that should trigger this skill",
166
+ "expectations": ["Specific expected behavior 1", "Specific expected behavior 2"],
167
+ "trigger_confidence": "high|medium"
168
+ }}
169
+ ]`;
170
+ // ─── Step 2b: Extract references ───
171
+ const STEP2B_REFS_PROMPT = `Based on the following SKILL.md and task record, extract reference documentation worth preserving.
172
+
173
+ Rules:
174
+ - Only extract if the task involved important API docs, configuration references, or technical notes that would be useful for future similar tasks.
175
+ - Each reference should be a standalone markdown document.
176
+ - Don't duplicate what's already in SKILL.md — references are for deeper detail.
177
+ - If there's nothing worth extracting, return an empty array.
178
+
179
+ SKILL.md:
180
+ {SKILL_CONTENT}
181
+
182
+ Task conversation highlights:
183
+ {CONVERSATION}
184
+
185
+ Reply with a JSON array only:
186
+ [
187
+ {{ "filename": "api-notes.md", "content": "# API Reference\\n..." }}
188
+ ]
189
+
190
+ If no references should be extracted, reply with: []`;
191
+ class SkillGenerator {
192
+ store;
193
+ engine;
194
+ ctx;
195
+ validator;
196
+ constructor(store, engine, ctx) {
197
+ this.store = store;
198
+ this.engine = engine;
199
+ this.ctx = ctx;
200
+ this.validator = new validator_1.SkillValidator(ctx);
201
+ }
202
+ async generate(task, chunks, evalResult) {
203
+ const conversationText = this.buildConversationText(chunks);
204
+ // ── Step 1: Generate SKILL.md (primary, largest output) ──
205
+ this.ctx.log.info(`SkillGenerator: Step 1/4 — generating SKILL.md for "${evalResult.suggestedName}"`);
206
+ const skillMdContent = await this.step1GenerateSkillMd(task, conversationText, evalResult);
207
+ const skillsStoreDir = path.join(this.ctx.stateDir, "skills-store");
208
+ const dirPath = path.join(skillsStoreDir, evalResult.suggestedName);
209
+ fs.mkdirSync(dirPath, { recursive: true });
210
+ fs.writeFileSync(path.join(dirPath, "SKILL.md"), skillMdContent, "utf-8");
211
+ // ── Step 2: Extract scripts (parallel with refs) ──
212
+ this.ctx.log.info(`SkillGenerator: Step 2/4 — extracting scripts and references`);
213
+ const [scripts, references] = await Promise.all([
214
+ this.step2ExtractScripts(skillMdContent, conversationText),
215
+ this.step2bExtractReferences(skillMdContent, conversationText),
216
+ ]);
217
+ if (scripts.length > 0) {
218
+ const scriptsDir = path.join(dirPath, "scripts");
219
+ fs.mkdirSync(scriptsDir, { recursive: true });
220
+ for (const s of scripts) {
221
+ fs.writeFileSync(path.join(scriptsDir, s.filename), s.content, "utf-8");
222
+ }
223
+ }
224
+ if (references.length > 0) {
225
+ const refsDir = path.join(dirPath, "references");
226
+ fs.mkdirSync(refsDir, { recursive: true });
227
+ for (const r of references) {
228
+ fs.writeFileSync(path.join(refsDir, r.filename), r.content, "utf-8");
229
+ }
230
+ }
231
+ // ── Step 3: Generate evals ──
232
+ this.ctx.log.info(`SkillGenerator: Step 3/4 — generating eval test cases`);
233
+ const evals = await this.step3GenerateEvals(skillMdContent);
234
+ if (evals.length > 0) {
235
+ const evalsDir = path.join(dirPath, "evals");
236
+ fs.mkdirSync(evalsDir, { recursive: true });
237
+ fs.writeFileSync(path.join(evalsDir, "evals.json"), JSON.stringify({ skill_name: evalResult.suggestedName, evals }, null, 2), "utf-8");
238
+ }
239
+ // ── Step 4: Validate + verify evals ──
240
+ this.ctx.log.info(`SkillGenerator: Step 4/4 — validating and verifying`);
241
+ const validation = await this.validator.validate(dirPath);
242
+ const evalVerification = await this.verifyEvals(evals);
243
+ const description = this.parseDescription(skillMdContent);
244
+ const status = validation.qualityScore !== null && validation.qualityScore < 6 ? "draft" : "active";
245
+ const skillId = (0, uuid_1.v4)();
246
+ const now = Date.now();
247
+ const skill = {
248
+ id: skillId,
249
+ name: evalResult.suggestedName,
250
+ description,
251
+ version: 1,
252
+ status,
253
+ tags: JSON.stringify(evalResult.suggestedTags),
254
+ sourceType: "task",
255
+ dirPath,
256
+ installed: 0,
257
+ qualityScore: validation.qualityScore,
258
+ createdAt: now,
259
+ updatedAt: now,
260
+ };
261
+ this.store.insertSkill(skill);
262
+ this.store.insertSkillVersion({
263
+ id: (0, uuid_1.v4)(),
264
+ skillId,
265
+ version: 1,
266
+ content: skillMdContent,
267
+ changelog: `Initial generation from task "${task.title}"`,
268
+ changeSummary: `首次从任务"${task.title}"的实际执行记录中提炼生成。${description ? `该技能涵盖:${description.slice(0, 200)}` : ""}${scripts.length > 0 ? ` 包含 ${scripts.length} 个辅助脚本。` : ""}${evals.length > 0 ? ` 附带 ${evals.length} 个测试用例(${evalVerification.hitCount}/${evals.length} 通过命中验证)。` : ""}`,
269
+ upgradeType: "create",
270
+ sourceTaskId: task.id,
271
+ metrics: JSON.stringify({
272
+ dimensions: [],
273
+ confidence: evalResult.confidence,
274
+ scripts: scripts.map(s => s.filename),
275
+ references: references.map(r => r.filename),
276
+ evalCount: evals.length,
277
+ evalVerification,
278
+ validation: {
279
+ errors: validation.errors,
280
+ warnings: validation.warnings,
281
+ suggestions: validation.suggestions,
282
+ },
283
+ }),
284
+ qualityScore: validation.qualityScore,
285
+ createdAt: now,
286
+ });
287
+ if (validation.warnings.length > 0) {
288
+ this.ctx.log.info(`Skill "${skill.name}" validation warnings: ${validation.warnings.join("; ")}`);
289
+ }
290
+ this.ctx.log.info(`Skill generated: "${skill.name}" v1 [${status}] score=${validation.qualityScore ?? "N/A"} `
291
+ + `scripts=${scripts.length} refs=${references.length} evals=${evals.length} `
292
+ + `evalHits=${evalVerification.hitCount}/${evals.length} `
293
+ + `from task "${task.title}"`);
294
+ return skill;
295
+ }
296
+ // ─── Step 1: SKILL.md generation ───
297
+ detectLanguage(text) {
298
+ const cjk = text.match(/[\u4e00-\u9fff\u3400-\u4dbf]/g)?.length ?? 0;
299
+ const total = text.replace(/\s+/g, "").length || 1;
300
+ if (cjk / total > 0.15)
301
+ return "Chinese (中文)";
302
+ return "English";
303
+ }
304
+ async step1GenerateSkillMd(task, conversationText, evalResult) {
305
+ const cfg = this.getProviderConfig();
306
+ if (!cfg)
307
+ throw new Error("No LLM configured for skill generation");
308
+ const lang = this.detectLanguage(conversationText);
309
+ const langInstruction = `\n\n⚠️ LANGUAGE REQUIREMENT: The task record is in ${lang}. You MUST write ALL prose content (description, headings, explanations, pitfalls) in ${lang}. Only the "name" field stays in English kebab-case.\n`;
310
+ const prompt = STEP1_SKILL_MD_PROMPT
311
+ .replace("{NAME}", evalResult.suggestedName)
312
+ .replace("{TITLE}", task.title)
313
+ .replace("{SUMMARY}", task.summary.slice(0, 5000))
314
+ .replace("{CONVERSATION}", conversationText.slice(0, 12000))
315
+ + langInstruction;
316
+ const raw = await this.callLLM(cfg, prompt, { maxTokens: 6000, temperature: 0.2 });
317
+ const trimmed = raw.trim();
318
+ if (trimmed.startsWith("---"))
319
+ return trimmed;
320
+ const fmStart = trimmed.indexOf("---");
321
+ if (fmStart !== -1)
322
+ return trimmed.slice(fmStart);
323
+ return trimmed;
324
+ }
325
+ // ─── Step 2: Extract scripts ───
326
+ async step2ExtractScripts(skillContent, conversationText) {
327
+ const cfg = this.getProviderConfig();
328
+ if (!cfg)
329
+ return [];
330
+ const prompt = STEP2_SCRIPTS_PROMPT
331
+ .replace("{SKILL_CONTENT}", skillContent.slice(0, 4000))
332
+ .replace("{CONVERSATION}", conversationText.slice(0, 6000));
333
+ try {
334
+ const raw = await this.callLLM(cfg, prompt, { maxTokens: 3000, temperature: 0.1 });
335
+ return this.parseJSONArray(raw);
336
+ }
337
+ catch (err) {
338
+ this.ctx.log.warn(`SkillGenerator: script extraction failed: ${err}`);
339
+ return [];
340
+ }
341
+ }
342
+ // ─── Step 2b: Extract references ───
343
+ async step2bExtractReferences(skillContent, conversationText) {
344
+ const cfg = this.getProviderConfig();
345
+ if (!cfg)
346
+ return [];
347
+ const prompt = STEP2B_REFS_PROMPT
348
+ .replace("{SKILL_CONTENT}", skillContent.slice(0, 4000))
349
+ .replace("{CONVERSATION}", conversationText.slice(0, 6000));
350
+ try {
351
+ const raw = await this.callLLM(cfg, prompt, { maxTokens: 3000, temperature: 0.1 });
352
+ return this.parseJSONArray(raw);
353
+ }
354
+ catch (err) {
355
+ this.ctx.log.warn(`SkillGenerator: reference extraction failed: ${err}`);
356
+ return [];
357
+ }
358
+ }
359
+ // ─── Step 3: Generate evals ───
360
+ async step3GenerateEvals(skillContent) {
361
+ const cfg = this.getProviderConfig();
362
+ if (!cfg)
363
+ return [];
364
+ const lang = this.detectLanguage(skillContent);
365
+ const prompt = STEP3_EVALS_PROMPT
366
+ .replace("{SKILL_CONTENT}", skillContent.slice(0, 4000))
367
+ + `\n\n⚠️ LANGUAGE: Write test prompts and expectations in ${lang}, matching the skill's language.\n`;
368
+ try {
369
+ const raw = await this.callLLM(cfg, prompt, { maxTokens: 2000, temperature: 0.3 });
370
+ return this.parseJSONArray(raw);
371
+ }
372
+ catch (err) {
373
+ this.ctx.log.warn(`SkillGenerator: eval generation failed: ${err}`);
374
+ return [];
375
+ }
376
+ }
377
+ // ─── Step 4: Verify evals via memory search ───
378
+ async verifyEvals(evals) {
379
+ const results = [];
380
+ let hitCount = 0;
381
+ for (const ev of evals.slice(0, 4)) {
382
+ try {
383
+ const searchResult = await this.engine.search({
384
+ query: ev.prompt,
385
+ maxResults: 5,
386
+ minScore: 0.3,
387
+ });
388
+ const topScore = searchResult.hits.length > 0 ? searchResult.hits[0].score : 0;
389
+ const hasSkillHit = searchResult.hits.some(h => h.skillId != null);
390
+ const hit = searchResult.hits.length > 0 && topScore >= 0.4;
391
+ if (hit)
392
+ hitCount++;
393
+ results.push({ evalId: ev.id, hit, topScore });
394
+ this.ctx.log.debug(`SkillGenerator eval verify: "${ev.prompt.slice(0, 50)}..." → `
395
+ + `hits=${searchResult.hits.length} topScore=${topScore.toFixed(3)} skillHit=${hasSkillHit}`);
396
+ }
397
+ catch (err) {
398
+ this.ctx.log.warn(`SkillGenerator: eval verification failed for eval ${ev.id}: ${err}`);
399
+ results.push({ evalId: ev.id, hit: false, topScore: 0 });
400
+ }
401
+ }
402
+ return { hitCount, results };
403
+ }
404
+ // ─── Shared LLM call ───
405
+ async callLLM(cfg, prompt, opts) {
406
+ const endpoint = this.normalizeEndpoint(cfg.endpoint ?? "https://api.openai.com/v1/chat/completions");
407
+ const model = cfg.model ?? "gpt-4o-mini";
408
+ const headers = {
409
+ "Content-Type": "application/json",
410
+ Authorization: `Bearer ${cfg.apiKey}`,
411
+ ...cfg.headers,
412
+ };
413
+ const resp = await fetch(endpoint, {
414
+ method: "POST",
415
+ headers,
416
+ body: JSON.stringify({
417
+ model,
418
+ temperature: opts.temperature,
419
+ max_tokens: opts.maxTokens,
420
+ messages: [{ role: "user", content: prompt }],
421
+ }),
422
+ signal: AbortSignal.timeout(cfg.timeoutMs ?? 120_000),
423
+ });
424
+ if (!resp.ok) {
425
+ const body = await resp.text();
426
+ throw new Error(`LLM call failed (${resp.status}): ${body}`);
427
+ }
428
+ const json = (await resp.json());
429
+ return json.choices[0]?.message?.content?.trim() ?? "";
430
+ }
431
+ // ─── Helpers ───
432
+ parseJSONArray(raw) {
433
+ const match = raw.match(/\[[\s\S]*\]/);
434
+ if (!match)
435
+ return [];
436
+ try {
437
+ const arr = JSON.parse(match[0]);
438
+ return Array.isArray(arr) ? arr : [];
439
+ }
440
+ catch {
441
+ this.ctx.log.warn("SkillGenerator: JSON array parse failed");
442
+ return [];
443
+ }
444
+ }
445
+ buildConversationText(chunks) {
446
+ const lines = [];
447
+ for (const c of chunks) {
448
+ if (c.role !== "user" && c.role !== "assistant")
449
+ continue;
450
+ const roleLabel = c.role === "user" ? "User" : "Assistant";
451
+ lines.push(`[${roleLabel}]: ${c.content}`);
452
+ }
453
+ return lines.join("\n\n");
454
+ }
455
+ parseDescription(content) {
456
+ const match = content.match(/description:\s*"([^"]+)"/);
457
+ if (match)
458
+ return match[1];
459
+ const match2 = content.match(/description:\s*'([^']+)'/);
460
+ if (match2)
461
+ return match2[1];
462
+ return "";
463
+ }
464
+ getProviderConfig() {
465
+ return this.ctx.config.skillEvolution?.summarizer ?? this.ctx.config.summarizer;
466
+ }
467
+ normalizeEndpoint(url) {
468
+ const stripped = url.replace(/\/+$/, "");
469
+ if (stripped.endsWith("/chat/completions"))
470
+ return stripped;
471
+ if (stripped.endsWith("/completions"))
472
+ return stripped;
473
+ return `${stripped}/chat/completions`;
474
+ }
475
+ }
476
+ exports.SkillGenerator = SkillGenerator;
477
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/skill/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { PluginContext } from "../types";
3
+ export declare class SkillInstaller {
4
+ private store;
5
+ private ctx;
6
+ private workspaceSkillsDir;
7
+ constructor(store: SqliteStore, ctx: PluginContext);
8
+ install(skillId: string): {
9
+ installed: boolean;
10
+ path: string;
11
+ message: string;
12
+ };
13
+ uninstall(skillId: string): void;
14
+ syncIfInstalled(skillName: string): void;
15
+ }
16
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/skill/installer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,qBAAa,cAAc;IAIvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IAJb,OAAO,CAAC,kBAAkB,CAAS;gBAGzB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa;IAK5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAqB/E,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAYhC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAUzC"}
@@ -0,0 +1,89 @@
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.SkillInstaller = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class SkillInstaller {
40
+ store;
41
+ ctx;
42
+ workspaceSkillsDir;
43
+ constructor(store, ctx) {
44
+ this.store = store;
45
+ this.ctx = ctx;
46
+ this.workspaceSkillsDir = path.join(ctx.workspaceDir, "skills");
47
+ }
48
+ install(skillId) {
49
+ const skill = this.store.getSkill(skillId);
50
+ if (!skill)
51
+ return { installed: false, path: "", message: "Skill not found" };
52
+ if (!fs.existsSync(skill.dirPath)) {
53
+ return { installed: false, path: "", message: `Skill directory not found: ${skill.dirPath}` };
54
+ }
55
+ const dstDir = path.join(this.workspaceSkillsDir, skill.name);
56
+ fs.mkdirSync(dstDir, { recursive: true });
57
+ fs.cpSync(skill.dirPath, dstDir, { recursive: true });
58
+ this.store.updateSkill(skillId, { installed: 1 });
59
+ this.ctx.log.info(`Skill installed: "${skill.name}" v${skill.version} → ${dstDir}`);
60
+ return {
61
+ installed: true,
62
+ path: dstDir,
63
+ message: `Skill "${skill.name}" v${skill.version} installed`,
64
+ };
65
+ }
66
+ uninstall(skillId) {
67
+ const skill = this.store.getSkill(skillId);
68
+ if (!skill)
69
+ return;
70
+ const dstDir = path.join(this.workspaceSkillsDir, skill.name);
71
+ if (fs.existsSync(dstDir)) {
72
+ fs.rmSync(dstDir, { recursive: true });
73
+ }
74
+ this.store.updateSkill(skillId, { installed: 0 });
75
+ this.ctx.log.info(`Skill uninstalled: "${skill.name}"`);
76
+ }
77
+ syncIfInstalled(skillName) {
78
+ const skill = this.store.getSkillByName(skillName);
79
+ if (!skill || !skill.installed)
80
+ return;
81
+ const dstDir = path.join(this.workspaceSkillsDir, skill.name);
82
+ if (fs.existsSync(dstDir) && fs.existsSync(skill.dirPath)) {
83
+ fs.cpSync(skill.dirPath, dstDir, { recursive: true });
84
+ this.ctx.log.info(`Skill synced: "${skill.name}" v${skill.version} → workspace`);
85
+ }
86
+ }
87
+ }
88
+ exports.SkillInstaller = SkillInstaller;
89
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/skill/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { Task, Skill, PluginContext } from "../types";
3
+ import type { UpgradeEvalResult } from "./evaluator";
4
+ export declare class SkillUpgrader {
5
+ private store;
6
+ private ctx;
7
+ private validator;
8
+ constructor(store: SqliteStore, ctx: PluginContext);
9
+ upgrade(task: Task, skill: Skill, evalResult: UpgradeEvalResult): Promise<{
10
+ upgraded: boolean;
11
+ qualityScore: number | null;
12
+ }>;
13
+ private readCurrentContent;
14
+ private callUpgradeLLM;
15
+ private parseDescription;
16
+ private getProviderConfig;
17
+ private normalizeEndpoint;
18
+ }
19
+ //# sourceMappingURL=upgrader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrader.d.ts","sourceRoot":"","sources":["../../src/skill/upgrader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgErD,qBAAa,aAAa;IAItB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IAJb,OAAO,CAAC,SAAS,CAAiB;gBAGxB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa;IAKtB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAsEnI,OAAO,CAAC,kBAAkB;YAUZ,cAAc;IA+E5B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;CAM1B"}