@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,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MEMORY_GUIDE_SKILL_MD = void 0;
4
+ /**
5
+ * Bundled MemOS memory-guide skill content.
6
+ * Written to workspace/skills/memos-memory-guide on plugin register so OpenClaw loads it.
7
+ */
8
+ exports.MEMORY_GUIDE_SKILL_MD = `---
9
+ name: memos-memory-guide
10
+ description: Use the MemOS local memory system to search and use the user's past conversations. Use this skill whenever the user refers to past chats, their own preferences or history, or when you need to answer from prior context. When auto-recall returns nothing (long or unclear user query), generate your own short search query and call memory_search. Use task_summary when you need full task context, skill_get for experience guides, and memory_timeline to expand around a memory hit.
11
+ ---
12
+
13
+ # MemOS Local Memory — Agent Guide
14
+
15
+ This skill describes how to use the MemOS memory tools so you can reliably search and use the user's long-term conversation history.
16
+
17
+ ## How memory is provided each turn
18
+
19
+ - **Automatic recall (hook):** At the start of each turn, the system runs a memory search using the user's current message and injects relevant past memories into your context. You do not need to call any tool for that.
20
+ - **When that is not enough:** If the user's message is very long, vague, or the automatic search returns **no memories**, you should **generate your own short, focused query** and call \`memory_search\` yourself. For example:
21
+ - User sent a long paragraph → extract 1–2 key topics or a short question and search with that.
22
+ - Auto-recall said "no memories" or you see no memory block → call \`memory_search\` with a query you derive (e.g. the user's name, a topic they often mention, or a rephrased question).
23
+ - **When you need more detail:** Search results only give excerpts and IDs. Use the tools below to fetch full task context, skill content, or surrounding messages.
24
+
25
+ ## Tools — what they do and when to call
26
+
27
+ ### memory_search
28
+
29
+ - **What it does:** Searches the user's stored conversation memory by a natural-language query. Returns a list of relevant excerpts with \`chunkId\` and optionally \`task_id\`.
30
+ - **When to call:**
31
+ - The automatic recall did not run or returned nothing (e.g. no \`<memory_context>\` block, or a note that no memories were found).
32
+ - The user's query is long or unclear — **generate a short query yourself** (keywords, rephrased question, or a clear sub-question) and call \`memory_search(query="...")\`.
33
+ - You need to search with a different angle (e.g. filter by \`role='user'\` to find what the user said, or use a more specific query).
34
+ - **Parameters:** \`query\` (required), optional \`minScore\`, \`role\` (e.g. \`"user"\`).
35
+ - **Output:** List of items with role, excerpt, \`chunkId\`, and sometimes \`task_id\`. Use those IDs with the tools below when you need more context.
36
+
37
+ ### task_summary
38
+
39
+ - **What it does:** Returns the full task summary for a given \`task_id\`: title, status, and the complete narrative summary of that conversation task (steps, decisions, URLs, commands, etc.).
40
+ - **When to call:** A \`memory_search\` hit included a \`task_id\` and you need the full story of that task (e.g. what was done, what the user decided, what failed or succeeded).
41
+ - **Parameters:** \`taskId\` (from a search hit).
42
+ - **Effect:** You get one coherent summary of the whole task instead of isolated excerpts.
43
+
44
+ ### skill_get
45
+
46
+ - **What it does:** Returns the content of a learned skill (experience guide) by \`skillId\` or by \`taskId\`. If you pass \`taskId\`, the system finds the skill linked to that task.
47
+ - **When to call:** A search hit has a \`task_id\` and the task is the kind that has a "how to do this again" guide (e.g. a workflow the user has run before). Use this to follow the same approach or reuse steps.
48
+ - **Parameters:** \`skillId\` (direct) or \`taskId\` (lookup).
49
+ - **Effect:** You receive the full SKILL.md-style guide. You can then call \`skill_install(skillId)\` if the user or you want that skill loaded for future turns.
50
+
51
+ ### skill_install
52
+
53
+ - **What it does:** Installs a skill (by \`skillId\`) into the workspace so it is loaded in future sessions.
54
+ - **When to call:** After \`skill_get\` when the skill is useful for ongoing use (e.g. the user's recurring workflow). Optional; only when you want the skill to be permanently available.
55
+ - **Parameters:** \`skillId\`.
56
+
57
+ ### memory_timeline
58
+
59
+ - **What it does:** Expands context around a single memory chunk: returns the surrounding conversation messages (±N turns) so you see what was said before and after that excerpt.
60
+ - **When to call:** A \`memory_search\` hit is relevant but you need the surrounding dialogue (e.g. who said what next, or the exact follow-up question).
61
+ - **Parameters:** \`chunkId\` (from a search hit), optional \`window\` (default 2).
62
+ - **Effect:** You get a short, linear slice of the conversation around that chunk.
63
+
64
+ ### memory_viewer
65
+
66
+ - **What it does:** Returns the URL of the MemOS Memory Viewer (web UI) where the user can browse, search, and manage their memories.
67
+ - **When to call:** The user asks how to view their memories, open the memory dashboard, or manage stored data.
68
+ - **Parameters:** None.
69
+ - **Effect:** You can tell the user to open that URL in a browser.
70
+
71
+ ## Quick decision flow
72
+
73
+ 1. **No memories in context or auto-recall reported nothing**
74
+ → Call \`memory_search\` with a **self-generated short query** (e.g. key topic or rephrased question).
75
+
76
+ 2. **Search returned hits with \`task_id\` and you need full context**
77
+ → Call \`task_summary(taskId)\`.
78
+
79
+ 3. **Task has an experience guide you want to follow**
80
+ → Call \`skill_get(taskId=...)\` (or \`skill_get(skillId=...)\` if you have the id). Optionally \`skill_install(skillId)\` for future use.
81
+
82
+ 4. **You need the exact surrounding conversation of a hit**
83
+ → Call \`memory_timeline(chunkId=...)\`.
84
+
85
+ 5. **User asks where to see or manage their memories**
86
+ → Call \`memory_viewer()\` and share the URL.
87
+
88
+ ## Writing good search queries
89
+
90
+ - Prefer **short, focused** queries (a few words or one clear question).
91
+ - Use **concrete terms**: names, topics, tools, or decisions (e.g. "preferred editor", "deploy script", "API key setup").
92
+ - If the user's message is long, **derive one or two sub-queries** rather than pasting the whole message.
93
+ - Use \`role='user'\` when you specifically want to find what the user said (e.g. preferences, past questions).
94
+ `;
95
+ //# sourceMappingURL=bundled-memory-guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-memory-guide.js","sourceRoot":"","sources":["../../src/skill/bundled-memory-guide.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFpC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Chunk, Task, Skill, PluginContext } from "../types";
2
+ export interface CreateEvalResult {
3
+ shouldGenerate: boolean;
4
+ reason: string;
5
+ suggestedName: string;
6
+ suggestedTags: string[];
7
+ confidence: number;
8
+ }
9
+ export interface UpgradeEvalResult {
10
+ shouldUpgrade: boolean;
11
+ upgradeType: "refine" | "extend" | "fix";
12
+ dimensions: string[];
13
+ reason: string;
14
+ mergeStrategy: string;
15
+ confidence: number;
16
+ }
17
+ export declare class SkillEvaluator {
18
+ private ctx;
19
+ constructor(ctx: PluginContext);
20
+ passesRuleFilter(chunks: Chunk[], task: Task): {
21
+ pass: boolean;
22
+ skipReason: string;
23
+ };
24
+ evaluateCreate(task: Task): Promise<CreateEvalResult>;
25
+ evaluateUpgrade(task: Task, skill: Skill, skillContent: string): Promise<UpgradeEvalResult>;
26
+ private getProviderConfig;
27
+ private callLLM;
28
+ private parseJSON;
29
+ private normalizeEndpoint;
30
+ }
31
+ //# sourceMappingURL=evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/skill/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAGpF,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IACzC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0ED,qBAAa,cAAc;IACb,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,aAAa;IAEtC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IA2B9E,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBrD,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwBjG,OAAO,CAAC,iBAAiB;YAIX,OAAO;IAgCrB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,iBAAiB;CAM1B"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkillEvaluator = void 0;
4
+ const types_1 = require("../types");
5
+ const CREATE_EVAL_PROMPT = `You are an experience evaluation expert. Based on the completed task record below, decide whether this task contains reusable experience worth distilling into a "skill".
6
+
7
+ A skill is a reusable guide that helps an AI agent handle similar tasks better in the future.
8
+
9
+ Worth distilling (any ONE qualifies):
10
+ - Contains concrete steps, commands, code, or configuration
11
+ - Solves a recurring problem with a specific approach/workflow
12
+ - Went through trial-and-error (wrong approach then corrected)
13
+ - Involves non-obvious usage of specific tools, APIs, or frameworks
14
+ - Contains debugging/troubleshooting with diagnostic reasoning
15
+ - Demonstrates a multi-step workflow using external tools (browser, search, file system, etc.)
16
+ - Reveals user preferences or style requirements that should be remembered
17
+ - Shows how to combine multiple tools/services to accomplish a goal
18
+ - Contains a process that required specific parameter tuning or configuration
19
+
20
+ NOT worth distilling:
21
+ - Pure factual Q&A with no process ("what is TCP", "what's the capital of France")
22
+ - Single-turn simple answers with no workflow
23
+ - Conversation too fragmented or incoherent to extract a clear process
24
+
25
+ Task title: {TITLE}
26
+ Task summary:
27
+ {SUMMARY}
28
+
29
+ Reply in JSON only, no extra text:
30
+ {
31
+ "shouldGenerate": boolean,
32
+ "reason": "brief explanation",
33
+ "suggestedName": "kebab-case-name",
34
+ "suggestedTags": ["tag1", "tag2"],
35
+ "confidence": 0.0-1.0
36
+ }`;
37
+ const UPGRADE_EVAL_PROMPT = `You are a skill upgrade evaluation expert.
38
+
39
+ Existing skill (v{VERSION}):
40
+ Name: {SKILL_NAME}
41
+ Content:
42
+ {SKILL_CONTENT}
43
+
44
+ Newly completed task:
45
+ Title: {TITLE}
46
+ Summary:
47
+ {SUMMARY}
48
+
49
+ Does the new task bring substantive improvements to the existing skill?
50
+
51
+ Worth upgrading (any one qualifies):
52
+ 1. Faster — shorter path discovered
53
+ 2. More elegant — cleaner, follows best practices better
54
+ 3. More convenient — fewer dependencies or complexity
55
+ 4. Fewer tokens — less exploration/trial-and-error needed
56
+ 5. More accurate — corrects wrong parameters/steps in old skill
57
+ 6. More robust — adds edge cases, error handling
58
+ 7. New scenario — covers a variant the old skill didn't
59
+ 8. Fixes outdated info — old skill has stale information
60
+
61
+ NOT worth upgrading:
62
+ - New task is identical to existing skill
63
+ - New task's approach is worse than existing skill
64
+ - Differences are trivial
65
+
66
+ Reply in JSON only, no extra text:
67
+ {
68
+ "shouldUpgrade": boolean,
69
+ "upgradeType": "refine" | "extend" | "fix",
70
+ "dimensions": ["faster", "more_elegant", "more_convenient", "fewer_tokens", "more_accurate", "more_robust", "new_scenario", "fix_outdated"],
71
+ "reason": "what new value the task brings",
72
+ "mergeStrategy": "which specific parts need updating",
73
+ "confidence": 0.0-1.0
74
+ }`;
75
+ class SkillEvaluator {
76
+ ctx;
77
+ constructor(ctx) {
78
+ this.ctx = ctx;
79
+ }
80
+ passesRuleFilter(chunks, task) {
81
+ const minChunks = this.ctx.config.skillEvolution?.minChunksForEval ?? types_1.DEFAULTS.skillMinChunksForEval;
82
+ if (chunks.length < minChunks) {
83
+ return { pass: false, skipReason: `chunks不足 (${chunks.length} < ${minChunks})` };
84
+ }
85
+ if (task.status === "skipped") {
86
+ return { pass: false, skipReason: "task状态为skipped" };
87
+ }
88
+ if (task.summary.length < 100) {
89
+ return { pass: false, skipReason: `summary过短 (${task.summary.length} < 100)` };
90
+ }
91
+ const userChunks = chunks.filter(c => c.role === "user");
92
+ if (userChunks.length === 0) {
93
+ return { pass: false, skipReason: "无用户消息" };
94
+ }
95
+ const assistantChunks = chunks.filter(c => c.role === "assistant");
96
+ if (assistantChunks.length === 0) {
97
+ return { pass: false, skipReason: "无助手回复" };
98
+ }
99
+ return { pass: true, skipReason: "" };
100
+ }
101
+ async evaluateCreate(task) {
102
+ const cfg = this.getProviderConfig();
103
+ if (!cfg) {
104
+ return { shouldGenerate: false, reason: "no LLM configured", suggestedName: "", suggestedTags: [], confidence: 0 };
105
+ }
106
+ const prompt = CREATE_EVAL_PROMPT
107
+ .replace("{TITLE}", task.title)
108
+ .replace("{SUMMARY}", task.summary.slice(0, 3000));
109
+ try {
110
+ const raw = await this.callLLM(cfg, prompt);
111
+ return this.parseJSON(raw, {
112
+ shouldGenerate: false, reason: "parse failed", suggestedName: "", suggestedTags: [], confidence: 0,
113
+ });
114
+ }
115
+ catch (err) {
116
+ this.ctx.log.warn(`SkillEvaluator.evaluateCreate failed: ${err}`);
117
+ return { shouldGenerate: false, reason: `error: ${err}`, suggestedName: "", suggestedTags: [], confidence: 0 };
118
+ }
119
+ }
120
+ async evaluateUpgrade(task, skill, skillContent) {
121
+ const cfg = this.getProviderConfig();
122
+ if (!cfg) {
123
+ return { shouldUpgrade: false, upgradeType: "refine", dimensions: [], reason: "no LLM configured", mergeStrategy: "", confidence: 0 };
124
+ }
125
+ const prompt = UPGRADE_EVAL_PROMPT
126
+ .replace("{VERSION}", String(skill.version))
127
+ .replace("{SKILL_NAME}", skill.name)
128
+ .replace("{SKILL_CONTENT}", skillContent.slice(0, 4000))
129
+ .replace("{TITLE}", task.title)
130
+ .replace("{SUMMARY}", task.summary.slice(0, 3000));
131
+ try {
132
+ const raw = await this.callLLM(cfg, prompt);
133
+ return this.parseJSON(raw, {
134
+ shouldUpgrade: false, upgradeType: "refine", dimensions: [], reason: "parse failed", mergeStrategy: "", confidence: 0,
135
+ });
136
+ }
137
+ catch (err) {
138
+ this.ctx.log.warn(`SkillEvaluator.evaluateUpgrade failed: ${err}`);
139
+ return { shouldUpgrade: false, upgradeType: "refine", dimensions: [], reason: `error: ${err}`, mergeStrategy: "", confidence: 0 };
140
+ }
141
+ }
142
+ getProviderConfig() {
143
+ return this.ctx.config.skillEvolution?.summarizer ?? this.ctx.config.summarizer;
144
+ }
145
+ async callLLM(cfg, userContent) {
146
+ const endpoint = this.normalizeEndpoint(cfg.endpoint ?? "https://api.openai.com/v1/chat/completions");
147
+ const model = cfg.model ?? "gpt-4o-mini";
148
+ const headers = {
149
+ "Content-Type": "application/json",
150
+ Authorization: `Bearer ${cfg.apiKey}`,
151
+ ...cfg.headers,
152
+ };
153
+ const resp = await fetch(endpoint, {
154
+ method: "POST",
155
+ headers,
156
+ body: JSON.stringify({
157
+ model,
158
+ temperature: cfg.temperature ?? 0.1,
159
+ max_tokens: 1024,
160
+ messages: [
161
+ { role: "user", content: userContent },
162
+ ],
163
+ }),
164
+ signal: AbortSignal.timeout(cfg.timeoutMs ?? 30_000),
165
+ });
166
+ if (!resp.ok) {
167
+ const body = await resp.text();
168
+ throw new Error(`LLM call failed (${resp.status}): ${body}`);
169
+ }
170
+ const json = (await resp.json());
171
+ return json.choices[0]?.message?.content?.trim() ?? "";
172
+ }
173
+ parseJSON(raw, fallback) {
174
+ const jsonMatch = raw.match(/\{[\s\S]*\}/);
175
+ if (!jsonMatch)
176
+ return fallback;
177
+ try {
178
+ return JSON.parse(jsonMatch[0]);
179
+ }
180
+ catch {
181
+ return fallback;
182
+ }
183
+ }
184
+ normalizeEndpoint(url) {
185
+ const stripped = url.replace(/\/+$/, "");
186
+ if (stripped.endsWith("/chat/completions"))
187
+ return stripped;
188
+ if (stripped.endsWith("/completions"))
189
+ return stripped;
190
+ return `${stripped}/chat/completions`;
191
+ }
192
+ }
193
+ exports.SkillEvaluator = SkillEvaluator;
194
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/skill/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { RecallEngine } from "../recall/engine";
3
+ import type { Task, PluginContext } from "../types";
4
+ export declare class SkillEvolver {
5
+ private store;
6
+ private engine;
7
+ private ctx;
8
+ private evaluator;
9
+ private generator;
10
+ private upgrader;
11
+ private installer;
12
+ private processing;
13
+ constructor(store: SqliteStore, engine: RecallEngine, ctx: PluginContext);
14
+ onTaskCompleted(task: Task): Promise<void>;
15
+ private process;
16
+ private findRelatedSkill;
17
+ private handleExistingSkill;
18
+ private handleNewSkill;
19
+ private markChunksWithSkill;
20
+ private readSkillContent;
21
+ }
22
+ //# sourceMappingURL=evolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolver.d.ts","sourceRoot":"","sources":["../../src/skill/evolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AAOlE,qBAAa,YAAY;IAQrB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IATb,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,UAAU,CAAS;gBAGjB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,aAAa;IAQtB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBlC,OAAO;YAmBP,gBAAgB;YAuBhB,mBAAmB;YAqCnB,cAAc;IAwB5B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,193 @@
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.SkillEvolver = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const types_1 = require("../types");
40
+ const evaluator_1 = require("./evaluator");
41
+ const generator_1 = require("./generator");
42
+ const upgrader_1 = require("./upgrader");
43
+ const installer_1 = require("./installer");
44
+ class SkillEvolver {
45
+ store;
46
+ engine;
47
+ ctx;
48
+ evaluator;
49
+ generator;
50
+ upgrader;
51
+ installer;
52
+ processing = false;
53
+ constructor(store, engine, ctx) {
54
+ this.store = store;
55
+ this.engine = engine;
56
+ this.ctx = ctx;
57
+ this.evaluator = new evaluator_1.SkillEvaluator(ctx);
58
+ this.generator = new generator_1.SkillGenerator(store, engine, ctx);
59
+ this.upgrader = new upgrader_1.SkillUpgrader(store, ctx);
60
+ this.installer = new installer_1.SkillInstaller(store, ctx);
61
+ }
62
+ async onTaskCompleted(task) {
63
+ const enabled = this.ctx.config.skillEvolution?.enabled ?? types_1.DEFAULTS.skillEvolutionEnabled;
64
+ const autoEval = this.ctx.config.skillEvolution?.autoEvaluate ?? types_1.DEFAULTS.skillAutoEvaluate;
65
+ if (!enabled || !autoEval)
66
+ return;
67
+ if (this.processing) {
68
+ this.ctx.log.debug("SkillEvolver: already processing, skipping");
69
+ return;
70
+ }
71
+ this.processing = true;
72
+ try {
73
+ await this.process(task);
74
+ }
75
+ catch (err) {
76
+ this.ctx.log.error(`SkillEvolver error: ${err}`);
77
+ }
78
+ finally {
79
+ this.processing = false;
80
+ }
81
+ }
82
+ async process(task) {
83
+ const chunks = this.store.getChunksByTask(task.id);
84
+ const { pass, skipReason } = this.evaluator.passesRuleFilter(chunks, task);
85
+ if (!pass) {
86
+ this.ctx.log.debug(`SkillEvolver: task ${task.id} skipped by rule filter: ${skipReason} (chunks=${chunks.length})`);
87
+ this.store.setTaskSkillMeta(task.id, { skillStatus: "skipped", skillReason: skipReason });
88
+ return;
89
+ }
90
+ const relatedSkill = await this.findRelatedSkill(task);
91
+ if (relatedSkill) {
92
+ await this.handleExistingSkill(task, chunks, relatedSkill);
93
+ }
94
+ else {
95
+ await this.handleNewSkill(task, chunks);
96
+ }
97
+ }
98
+ async findRelatedSkill(task) {
99
+ try {
100
+ const result = await this.engine.search({
101
+ query: task.summary.slice(0, 500),
102
+ maxResults: 10,
103
+ minScore: 0.5,
104
+ });
105
+ for (const hit of result.hits) {
106
+ if (hit.skillId) {
107
+ const skill = this.store.getSkill(hit.skillId);
108
+ if (skill && (skill.status === "active" || skill.status === "draft")) {
109
+ this.ctx.log.debug(`SkillEvolver: found related skill "${skill.name}" via memory search`);
110
+ return skill;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ catch (err) {
116
+ this.ctx.log.warn(`SkillEvolver: memory search for related skill failed: ${err}`);
117
+ }
118
+ return null;
119
+ }
120
+ async handleExistingSkill(task, chunks, skill) {
121
+ const skillContent = this.readSkillContent(skill);
122
+ if (!skillContent) {
123
+ this.ctx.log.warn(`SkillEvolver: cannot read skill "${skill.name}" content, treating as new`);
124
+ await this.handleNewSkill(task, chunks);
125
+ return;
126
+ }
127
+ const minConfidence = this.ctx.config.skillEvolution?.minConfidence ?? types_1.DEFAULTS.skillMinConfidence;
128
+ const evalResult = await this.evaluator.evaluateUpgrade(task, skill, skillContent);
129
+ if (evalResult.shouldUpgrade && evalResult.confidence >= minConfidence) {
130
+ this.ctx.log.info(`SkillEvolver: upgrading skill "${skill.name}" — ${evalResult.reason}`);
131
+ const { upgraded } = await this.upgrader.upgrade(task, skill, evalResult);
132
+ this.markChunksWithSkill(chunks, skill.id);
133
+ if (upgraded) {
134
+ this.store.linkTaskSkill(task.id, skill.id, "evolved_from", skill.version + 1);
135
+ this.installer.syncIfInstalled(skill.name);
136
+ }
137
+ else {
138
+ this.store.linkTaskSkill(task.id, skill.id, "applied_to", skill.version);
139
+ }
140
+ }
141
+ else if (evalResult.confidence < 0.3) {
142
+ // Low confidence means the matched skill is likely unrelated — try creating a new one
143
+ this.ctx.log.info(`SkillEvolver: skill "${skill.name}" has low relevance (confidence=${evalResult.confidence}), ` +
144
+ `falling back to new skill evaluation for task "${task.title}"`);
145
+ await this.handleNewSkill(task, chunks);
146
+ }
147
+ else {
148
+ this.ctx.log.debug(`SkillEvolver: skill "${skill.name}" not worth upgrading (confidence=${evalResult.confidence})`);
149
+ this.markChunksWithSkill(chunks, skill.id);
150
+ this.store.linkTaskSkill(task.id, skill.id, "applied_to", skill.version);
151
+ }
152
+ }
153
+ async handleNewSkill(task, chunks) {
154
+ const minConfidence = this.ctx.config.skillEvolution?.minConfidence ?? types_1.DEFAULTS.skillMinConfidence;
155
+ const evalResult = await this.evaluator.evaluateCreate(task);
156
+ if (evalResult.shouldGenerate && evalResult.confidence >= minConfidence) {
157
+ this.ctx.log.info(`SkillEvolver: generating new skill "${evalResult.suggestedName}" — ${evalResult.reason}`);
158
+ this.store.setTaskSkillMeta(task.id, { skillStatus: "generating", skillReason: evalResult.reason });
159
+ const skill = await this.generator.generate(task, chunks, evalResult);
160
+ this.markChunksWithSkill(chunks, skill.id);
161
+ this.store.linkTaskSkill(task.id, skill.id, "generated_from", 1);
162
+ this.store.setTaskSkillMeta(task.id, { skillStatus: "generated", skillReason: evalResult.reason });
163
+ const autoInstall = this.ctx.config.skillEvolution?.autoInstall ?? types_1.DEFAULTS.skillAutoInstall;
164
+ if (autoInstall && skill.status === "active") {
165
+ this.installer.install(skill.id);
166
+ }
167
+ }
168
+ else {
169
+ const reason = evalResult.reason || `confidence不足 (${evalResult.confidence} < ${minConfidence})`;
170
+ this.ctx.log.debug(`SkillEvolver: task "${task.title}" not worth generating skill — ${reason}`);
171
+ this.store.setTaskSkillMeta(task.id, { skillStatus: "not_generated", skillReason: reason });
172
+ }
173
+ }
174
+ markChunksWithSkill(chunks, skillId) {
175
+ for (const chunk of chunks) {
176
+ this.store.setChunkSkillId(chunk.id, skillId);
177
+ }
178
+ this.ctx.log.debug(`SkillEvolver: marked ${chunks.length} chunks with skill_id=${skillId}`);
179
+ }
180
+ readSkillContent(skill) {
181
+ const filePath = path.join(skill.dirPath, "SKILL.md");
182
+ try {
183
+ if (fs.existsSync(filePath)) {
184
+ return fs.readFileSync(filePath, "utf-8");
185
+ }
186
+ }
187
+ catch { /* fall through */ }
188
+ const sv = this.store.getLatestSkillVersion(skill.id);
189
+ return sv?.content ?? null;
190
+ }
191
+ }
192
+ exports.SkillEvolver = SkillEvolver;
193
+ //# sourceMappingURL=evolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolver.js","sourceRoot":"","sources":["../../src/skill/evolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { RecallEngine } from "../recall/engine";
3
+ import type { Chunk, Task, Skill, PluginContext } from "../types";
4
+ import type { CreateEvalResult } from "./evaluator";
5
+ export declare class SkillGenerator {
6
+ private store;
7
+ private engine;
8
+ private ctx;
9
+ private validator;
10
+ constructor(store: SqliteStore, engine: RecallEngine, ctx: PluginContext);
11
+ generate(task: Task, chunks: Chunk[], evalResult: CreateEvalResult): Promise<Skill>;
12
+ private detectLanguage;
13
+ private step1GenerateSkillMd;
14
+ private step2ExtractScripts;
15
+ private step2bExtractReferences;
16
+ private step3GenerateEvals;
17
+ private verifyEvals;
18
+ private callLLM;
19
+ private parseJSONArray;
20
+ private buildConversationText;
21
+ private parseDescription;
22
+ private getProviderConfig;
23
+ private normalizeEndpoint;
24
+ }
25
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/skill/generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAyC,MAAM,UAAU,CAAC;AAEzG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAiKpD,qBAAa,cAAc;IAIvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IALb,OAAO,CAAC,SAAS,CAAiB;gBAGxB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,aAAa;IAKtB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC;IAoHzF,OAAO,CAAC,cAAc;YAOR,oBAAoB;YAyBpB,mBAAmB;YAsBnB,uBAAuB;YAsBvB,kBAAkB;YAsBlB,WAAW;YAoCX,OAAO;IAoCrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;CAM1B"}