@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.
Files changed (99) hide show
  1. package/.env.example +7 -0
  2. package/README.md +94 -27
  3. package/dist/capture/index.js +3 -1
  4. package/dist/capture/index.js.map +1 -1
  5. package/dist/client/connector.d.ts +5 -0
  6. package/dist/client/connector.d.ts.map +1 -1
  7. package/dist/client/connector.js +132 -10
  8. package/dist/client/connector.js.map +1 -1
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +2 -1
  11. package/dist/config.js.map +1 -1
  12. package/dist/hub/server.d.ts +2 -0
  13. package/dist/hub/server.d.ts.map +1 -1
  14. package/dist/hub/server.js +251 -38
  15. package/dist/hub/server.js.map +1 -1
  16. package/dist/hub/user-manager.d.ts +9 -0
  17. package/dist/hub/user-manager.d.ts.map +1 -1
  18. package/dist/hub/user-manager.js +26 -2
  19. package/dist/hub/user-manager.js.map +1 -1
  20. package/dist/ingest/chunker.d.ts +2 -1
  21. package/dist/ingest/chunker.d.ts.map +1 -1
  22. package/dist/ingest/chunker.js +14 -10
  23. package/dist/ingest/chunker.js.map +1 -1
  24. package/dist/ingest/providers/index.js +2 -2
  25. package/dist/ingest/providers/index.js.map +1 -1
  26. package/dist/recall/engine.d.ts.map +1 -1
  27. package/dist/recall/engine.js +96 -1
  28. package/dist/recall/engine.js.map +1 -1
  29. package/dist/shared/llm-call.d.ts.map +1 -1
  30. package/dist/shared/llm-call.js +2 -1
  31. package/dist/shared/llm-call.js.map +1 -1
  32. package/dist/sharing/types.d.ts +1 -1
  33. package/dist/sharing/types.d.ts.map +1 -1
  34. package/dist/skill/evolver.d.ts +2 -0
  35. package/dist/skill/evolver.d.ts.map +1 -1
  36. package/dist/skill/evolver.js +56 -5
  37. package/dist/skill/evolver.js.map +1 -1
  38. package/dist/skill/generator.d.ts +2 -0
  39. package/dist/skill/generator.d.ts.map +1 -1
  40. package/dist/skill/generator.js +45 -3
  41. package/dist/skill/generator.js.map +1 -1
  42. package/dist/skill/installer.d.ts +26 -0
  43. package/dist/skill/installer.d.ts.map +1 -1
  44. package/dist/skill/installer.js +80 -4
  45. package/dist/skill/installer.js.map +1 -1
  46. package/dist/skill/upgrader.d.ts +2 -0
  47. package/dist/skill/upgrader.d.ts.map +1 -1
  48. package/dist/skill/upgrader.js +139 -1
  49. package/dist/skill/upgrader.js.map +1 -1
  50. package/dist/skill/validator.d.ts +3 -0
  51. package/dist/skill/validator.d.ts.map +1 -1
  52. package/dist/skill/validator.js +75 -0
  53. package/dist/skill/validator.js.map +1 -1
  54. package/dist/storage/sqlite.d.ts +58 -0
  55. package/dist/storage/sqlite.d.ts.map +1 -1
  56. package/dist/storage/sqlite.js +295 -35
  57. package/dist/storage/sqlite.js.map +1 -1
  58. package/dist/telemetry.d.ts.map +1 -1
  59. package/dist/telemetry.js +27 -8
  60. package/dist/telemetry.js.map +1 -1
  61. package/dist/types.d.ts +10 -0
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/types.js +4 -0
  64. package/dist/types.js.map +1 -1
  65. package/dist/viewer/html.d.ts.map +1 -1
  66. package/dist/viewer/html.js +796 -289
  67. package/dist/viewer/html.js.map +1 -1
  68. package/dist/viewer/server.d.ts +11 -0
  69. package/dist/viewer/server.d.ts.map +1 -1
  70. package/dist/viewer/server.js +456 -92
  71. package/dist/viewer/server.js.map +1 -1
  72. package/index.ts +411 -52
  73. package/openclaw.plugin.json +1 -1
  74. package/package.json +2 -1
  75. package/prebuilds/darwin-arm64/better_sqlite3.node +0 -0
  76. package/prebuilds/darwin-x64/better_sqlite3.node +0 -0
  77. package/prebuilds/linux-x64/better_sqlite3.node +0 -0
  78. package/prebuilds/win32-x64/better_sqlite3.node +0 -0
  79. package/src/capture/index.ts +4 -1
  80. package/src/client/connector.ts +136 -10
  81. package/src/config.ts +2 -1
  82. package/src/hub/server.ts +246 -38
  83. package/src/hub/user-manager.ts +42 -6
  84. package/src/ingest/chunker.ts +19 -13
  85. package/src/ingest/providers/index.ts +2 -2
  86. package/src/recall/engine.ts +89 -1
  87. package/src/shared/llm-call.ts +2 -1
  88. package/src/sharing/types.ts +1 -1
  89. package/src/skill/evolver.ts +58 -6
  90. package/src/skill/generator.ts +44 -5
  91. package/src/skill/installer.ts +107 -4
  92. package/src/skill/upgrader.ts +139 -1
  93. package/src/skill/validator.ts +79 -0
  94. package/src/storage/sqlite.ts +326 -40
  95. package/src/telemetry.ts +27 -9
  96. package/src/types.ts +11 -0
  97. package/src/viewer/html.ts +796 -289
  98. package/src/viewer/server.ts +430 -89
  99. package/telemetry.credentials.json +5 -0
@@ -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;