@memtensor/memos-local-openclaw-plugin 1.0.4-beta.8 → 1.0.4
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/.env.example +7 -0
- package/README.md +94 -27
- package/dist/capture/index.js +3 -1
- package/dist/capture/index.js.map +1 -1
- package/dist/client/connector.d.ts +5 -0
- package/dist/client/connector.d.ts.map +1 -1
- package/dist/client/connector.js +132 -10
- package/dist/client/connector.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/hub/server.d.ts +2 -0
- package/dist/hub/server.d.ts.map +1 -1
- package/dist/hub/server.js +251 -38
- package/dist/hub/server.js.map +1 -1
- package/dist/hub/user-manager.d.ts +9 -0
- package/dist/hub/user-manager.d.ts.map +1 -1
- package/dist/hub/user-manager.js +26 -2
- package/dist/hub/user-manager.js.map +1 -1
- package/dist/ingest/chunker.d.ts +2 -1
- package/dist/ingest/chunker.d.ts.map +1 -1
- package/dist/ingest/chunker.js +14 -10
- package/dist/ingest/chunker.js.map +1 -1
- package/dist/ingest/providers/index.js +2 -2
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +96 -1
- package/dist/recall/engine.js.map +1 -1
- package/dist/shared/llm-call.d.ts.map +1 -1
- package/dist/shared/llm-call.js +2 -1
- package/dist/shared/llm-call.js.map +1 -1
- package/dist/sharing/types.d.ts +1 -1
- package/dist/sharing/types.d.ts.map +1 -1
- package/dist/skill/evolver.d.ts +2 -0
- package/dist/skill/evolver.d.ts.map +1 -1
- package/dist/skill/evolver.js +56 -5
- package/dist/skill/evolver.js.map +1 -1
- package/dist/skill/generator.d.ts +2 -0
- package/dist/skill/generator.d.ts.map +1 -1
- package/dist/skill/generator.js +45 -3
- package/dist/skill/generator.js.map +1 -1
- package/dist/skill/installer.d.ts +26 -0
- package/dist/skill/installer.d.ts.map +1 -1
- package/dist/skill/installer.js +80 -4
- package/dist/skill/installer.js.map +1 -1
- package/dist/skill/upgrader.d.ts +2 -0
- package/dist/skill/upgrader.d.ts.map +1 -1
- package/dist/skill/upgrader.js +139 -1
- package/dist/skill/upgrader.js.map +1 -1
- package/dist/skill/validator.d.ts +3 -0
- package/dist/skill/validator.d.ts.map +1 -1
- package/dist/skill/validator.js +75 -0
- package/dist/skill/validator.js.map +1 -1
- package/dist/storage/sqlite.d.ts +58 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +295 -35
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +27 -8
- package/dist/telemetry.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +796 -289
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +11 -0
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +456 -92
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +411 -52
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/prebuilds/darwin-arm64/better_sqlite3.node +0 -0
- package/prebuilds/darwin-x64/better_sqlite3.node +0 -0
- package/prebuilds/linux-x64/better_sqlite3.node +0 -0
- package/prebuilds/win32-x64/better_sqlite3.node +0 -0
- package/src/capture/index.ts +4 -1
- package/src/client/connector.ts +136 -10
- package/src/config.ts +2 -1
- package/src/hub/server.ts +246 -38
- package/src/hub/user-manager.ts +42 -6
- package/src/ingest/chunker.ts +19 -13
- package/src/ingest/providers/index.ts +2 -2
- package/src/recall/engine.ts +89 -1
- package/src/shared/llm-call.ts +2 -1
- package/src/sharing/types.ts +1 -1
- package/src/skill/evolver.ts +58 -6
- package/src/skill/generator.ts +44 -5
- package/src/skill/installer.ts +107 -4
- package/src/skill/upgrader.ts +139 -1
- package/src/skill/validator.ts +79 -0
- package/src/storage/sqlite.ts +326 -40
- package/src/telemetry.ts +27 -9
- package/src/types.ts +11 -0
- package/src/viewer/html.ts +796 -289
- package/src/viewer/server.ts +430 -89
- package/telemetry.credentials.json +5 -0
package/src/skill/validator.ts
CHANGED
|
@@ -31,6 +31,9 @@ export class SkillValidator {
|
|
|
31
31
|
this.validateFormat(dirPath, result);
|
|
32
32
|
if (!result.valid) return result;
|
|
33
33
|
|
|
34
|
+
this.checkCompanionConsistency(dirPath, result);
|
|
35
|
+
this.scanSecrets(dirPath, result);
|
|
36
|
+
|
|
34
37
|
if (opts?.previousContent) {
|
|
35
38
|
this.regressionCheck(dirPath, opts.previousContent, result);
|
|
36
39
|
}
|
|
@@ -133,6 +136,82 @@ export class SkillValidator {
|
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
|
|
139
|
+
private checkCompanionConsistency(dirPath: string, result: ValidationResult): void {
|
|
140
|
+
const skillMdPath = path.join(dirPath, "SKILL.md");
|
|
141
|
+
const content = fs.readFileSync(skillMdPath, "utf-8");
|
|
142
|
+
|
|
143
|
+
const referencedScripts = [...content.matchAll(/`scripts\/([^`]+)`/g)].map(m => m[1]);
|
|
144
|
+
const referencedRefs = [...content.matchAll(/`references\/([^`]+)`/g)].map(m => m[1]);
|
|
145
|
+
|
|
146
|
+
const scriptsDir = path.join(dirPath, "scripts");
|
|
147
|
+
const refsDir = path.join(dirPath, "references");
|
|
148
|
+
|
|
149
|
+
for (const f of referencedScripts) {
|
|
150
|
+
if (!fs.existsSync(path.join(scriptsDir, f))) {
|
|
151
|
+
result.warnings.push(`SKILL.md references scripts/${f} but file does not exist`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
for (const f of referencedRefs) {
|
|
155
|
+
if (!fs.existsSync(path.join(refsDir, f))) {
|
|
156
|
+
result.warnings.push(`SKILL.md references references/${f} but file does not exist`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (fs.existsSync(scriptsDir)) {
|
|
161
|
+
try {
|
|
162
|
+
const actualScripts = fs.readdirSync(scriptsDir);
|
|
163
|
+
for (const f of actualScripts) {
|
|
164
|
+
if (!referencedScripts.includes(f)) {
|
|
165
|
+
result.warnings.push(`scripts/${f} exists but is not referenced in SKILL.md`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
} catch { /* best-effort */ }
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const evalsPath = path.join(dirPath, "evals", "evals.json");
|
|
172
|
+
if (fs.existsSync(evalsPath)) {
|
|
173
|
+
try {
|
|
174
|
+
const evalsData = JSON.parse(fs.readFileSync(evalsPath, "utf-8"));
|
|
175
|
+
if (!Array.isArray(evalsData?.evals) && !Array.isArray(evalsData)) {
|
|
176
|
+
result.warnings.push("evals/evals.json exists but has unexpected structure");
|
|
177
|
+
}
|
|
178
|
+
} catch {
|
|
179
|
+
result.warnings.push("evals/evals.json exists but is not valid JSON");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private static readonly SECRET_PATTERNS: Array<{ label: string; regex: RegExp }> = [
|
|
185
|
+
{ label: "API key (sk-...)", regex: /\bsk-[a-zA-Z0-9]{20,}\b/ },
|
|
186
|
+
{ label: "Bearer token", regex: /\bBearer\s+[a-zA-Z0-9_\-.]{20,}\b/ },
|
|
187
|
+
{ label: "AWS key", regex: /\bAKIA[0-9A-Z]{16}\b/ },
|
|
188
|
+
{ label: "Generic secret assignment", regex: /(api[_-]?key|secret|token|password|credential)\s*[:=]\s*["'][^"']{8,}["']/i },
|
|
189
|
+
{ label: "Base64 encoded secret (long)", regex: /\b[A-Za-z0-9+/]{40,}={0,2}\b/ },
|
|
190
|
+
];
|
|
191
|
+
|
|
192
|
+
private scanSecrets(dirPath: string, result: ValidationResult): void {
|
|
193
|
+
const filesToScan = ["SKILL.md"];
|
|
194
|
+
const scriptsDir = path.join(dirPath, "scripts");
|
|
195
|
+
if (fs.existsSync(scriptsDir)) {
|
|
196
|
+
try {
|
|
197
|
+
for (const f of fs.readdirSync(scriptsDir)) filesToScan.push(path.join("scripts", f));
|
|
198
|
+
} catch { /* best-effort */ }
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
for (const relPath of filesToScan) {
|
|
202
|
+
const fullPath = path.join(dirPath, relPath);
|
|
203
|
+
if (!fs.existsSync(fullPath)) continue;
|
|
204
|
+
try {
|
|
205
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
206
|
+
for (const { label, regex } of SkillValidator.SECRET_PATTERNS) {
|
|
207
|
+
if (regex.test(content)) {
|
|
208
|
+
result.warnings.push(`Potential secret detected in ${relPath}: ${label}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} catch { /* best-effort */ }
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
136
215
|
private async assessQuality(dirPath: string, result: ValidationResult): Promise<void> {
|
|
137
216
|
const chain = buildSkillConfigChain(this.ctx);
|
|
138
217
|
if (chain.length === 0) return;
|