0xkobold 0.2.0 → 0.3.0

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 (60) hide show
  1. package/HEARTBEAT.md +40 -58
  2. package/README.md +387 -337
  3. package/dist/package.json +4 -2
  4. package/dist/src/auth/device-auth.js +202 -0
  5. package/dist/src/auth/device-auth.js.map +1 -0
  6. package/dist/src/auth/index.js +3 -0
  7. package/dist/src/auth/index.js.map +1 -0
  8. package/dist/src/channels/index.js +8 -0
  9. package/dist/src/channels/index.js.map +1 -0
  10. package/dist/src/channels/slack/webhook.js +128 -0
  11. package/dist/src/channels/slack/webhook.js.map +1 -0
  12. package/dist/src/channels/telegram/bot.js +223 -0
  13. package/dist/src/channels/telegram/bot.js.map +1 -0
  14. package/dist/src/channels/whatsapp/integration.js +325 -0
  15. package/dist/src/channels/whatsapp/integration.js.map +1 -0
  16. package/dist/src/cli/commands/check.js +69 -0
  17. package/dist/src/cli/commands/check.js.map +1 -0
  18. package/dist/src/cli/commands/migrate.js +24 -0
  19. package/dist/src/cli/commands/migrate.js.map +1 -0
  20. package/dist/src/cli/commands/tailscale.js +81 -0
  21. package/dist/src/cli/commands/tailscale.js.map +1 -0
  22. package/dist/src/cli/commands/telegram.js +111 -0
  23. package/dist/src/cli/commands/telegram.js.map +1 -0
  24. package/dist/src/cli/commands/tui.js +40 -22
  25. package/dist/src/cli/commands/tui.js.map +1 -1
  26. package/dist/src/cli/commands/whatsapp.js +116 -0
  27. package/dist/src/cli/commands/whatsapp.js.map +1 -0
  28. package/dist/src/cli/program.js +20 -0
  29. package/dist/src/cli/program.js.map +1 -1
  30. package/dist/src/config/index.js +2 -9
  31. package/dist/src/config/index.js.map +1 -1
  32. package/dist/src/config/manager.js +222 -0
  33. package/dist/src/config/manager.js.map +1 -0
  34. package/dist/src/documents/index.js +3 -0
  35. package/dist/src/documents/index.js.map +1 -0
  36. package/dist/src/documents/pdf.js +168 -0
  37. package/dist/src/documents/pdf.js.map +1 -0
  38. package/dist/src/gateway/client.js +318 -0
  39. package/dist/src/gateway/client.js.map +1 -0
  40. package/dist/src/infra/index.js +3 -0
  41. package/dist/src/infra/index.js.map +1 -0
  42. package/dist/src/infra/tailscale.js +163 -0
  43. package/dist/src/infra/tailscale.js.map +1 -0
  44. package/dist/src/media/audio.js +130 -0
  45. package/dist/src/media/audio.js.map +1 -0
  46. package/dist/src/media/index.js +4 -0
  47. package/dist/src/media/index.js.map +1 -0
  48. package/dist/src/media/vision.js +131 -0
  49. package/dist/src/media/vision.js.map +1 -0
  50. package/dist/src/migration/openclaw.js +498 -0
  51. package/dist/src/migration/openclaw.js.map +1 -0
  52. package/dist/src/sandbox/docker-runner.js +228 -0
  53. package/dist/src/sandbox/docker-runner.js.map +1 -0
  54. package/dist/src/sandbox/index.js +3 -0
  55. package/dist/src/sandbox/index.js.map +1 -0
  56. package/dist/src/skills/builtin/duplicate-detector.js +469 -0
  57. package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
  58. package/dist/src/skills/index.js +2 -0
  59. package/dist/src/skills/index.js.map +1 -1
  60. package/package.json +4 -2
@@ -0,0 +1,469 @@
1
+ /**
2
+ * Duplicate Detection Skill - v0.3.0
3
+ *
4
+ * Prevents duplicate implementations by scanning codebase
5
+ * before adding new features.
6
+ */
7
+ import * as fs from "node:fs/promises";
8
+ import * as path from "node:path";
9
+ import { existsSync } from "node:fs";
10
+ const DEFAULT_CONFIG = {
11
+ similarityThreshold: 0.7,
12
+ maxResults: 5,
13
+ scanPaths: ["src", "lib", "dist"],
14
+ excludePatterns: ["node_modules", ".git", "test", "*.test.ts", "*.spec.ts"],
15
+ };
16
+ class DuplicateDetector {
17
+ config;
18
+ fileCache = new Map();
19
+ constructor(config = {}) {
20
+ this.config = { ...DEFAULT_CONFIG, ...config };
21
+ }
22
+ /**
23
+ * Check if implementation already exists
24
+ */
25
+ async check(description, codeSnippet) {
26
+ console.log(`🔍 Checking for existing: ${description}`);
27
+ const matches = [];
28
+ // Search by description keywords
29
+ const keywordMatches = await this.findByKeywords(description);
30
+ matches.push(...keywordMatches);
31
+ // Search by code similarity
32
+ if (codeSnippet) {
33
+ const codeMatches = await this.findByCodeSimilarity(codeSnippet);
34
+ matches.push(...codeMatches);
35
+ }
36
+ // Sort by similarity and deduplicate
37
+ const uniqueMatches = this.deduplicateMatches(matches)
38
+ .sort((a, b) => b.similarity - a.similarity)
39
+ .slice(0, this.config.maxResults);
40
+ const maxSimilarity = uniqueMatches[0]?.similarity || 0;
41
+ const exists = maxSimilarity >= this.config.similarityThreshold;
42
+ return {
43
+ exists,
44
+ confidence: maxSimilarity,
45
+ matches: uniqueMatches,
46
+ suggestion: this.generateSuggestion(uniqueMatches, description),
47
+ };
48
+ }
49
+ /**
50
+ * Check function implementation
51
+ */
52
+ async checkFunction(functionName, signature, filePath) {
53
+ console.log(`🔍 Checking function: ${functionName}`);
54
+ // Search for existing function
55
+ const pattern = new RegExp(`export\\s+(?:async\\s+)?function\\s+${functionName}\\s*\\(`, "i");
56
+ const matches = await this.searchPattern(pattern, filePath);
57
+ // Also check by signature similarity
58
+ const signatureMatches = await this.findBySignature(signature);
59
+ const allMatches = [...matches, ...signatureMatches]
60
+ .sort((a, b) => b.similarity - a.similarity)
61
+ .slice(0, this.config.maxResults);
62
+ const maxSimilarity = allMatches[0]?.similarity || 0;
63
+ return {
64
+ exists: maxSimilarity >= this.config.similarityThreshold,
65
+ confidence: maxSimilarity,
66
+ matches: allMatches,
67
+ suggestion: this.generateSuggestion(allMatches, `function "${functionName}"`),
68
+ };
69
+ }
70
+ /**
71
+ * Check class implementation
72
+ */
73
+ async checkClass(className, methods) {
74
+ console.log(`🔍 Checking class: ${className}`);
75
+ // Search for existing class
76
+ const pattern = new RegExp(`class\\s+${className}\\s*[{(]`, "i");
77
+ const matches = await this.searchPattern(pattern);
78
+ // Check for similar classes by method signatures
79
+ let methodMatches = [];
80
+ if (methods && methods.length > 0) {
81
+ methodMatches = await this.findByMethodSignatures(methods);
82
+ }
83
+ const allMatches = [...matches, ...methodMatches]
84
+ .sort((a, b) => b.similarity - a.similarity)
85
+ .slice(0, this.config.maxResults);
86
+ const maxSimilarity = allMatches[0]?.similarity || 0;
87
+ return {
88
+ exists: maxSimilarity >= this.config.similarityThreshold,
89
+ confidence: maxSimilarity,
90
+ matches: allMatches,
91
+ suggestion: this.generateSuggestion(allMatches, `class "${className}"`),
92
+ };
93
+ }
94
+ /**
95
+ * Check file existence by purpose
96
+ */
97
+ async checkFile(purpose, extension = ".ts") {
98
+ console.log(`🔍 Checking file for: ${purpose}`);
99
+ // Generate likely filenames
100
+ const keywords = purpose.toLowerCase().split(/\s+/);
101
+ const candidates = [
102
+ ...keywords,
103
+ keywords.join("-"),
104
+ keywords.join("_"),
105
+ ];
106
+ const matches = [];
107
+ for (const scanPath of this.config.scanPaths) {
108
+ if (!existsSync(scanPath))
109
+ continue;
110
+ const files = await this.getFiles(scanPath, extension);
111
+ for (const file of files) {
112
+ const basename = path.basename(file, extension);
113
+ const similarity = this.calculateStringSimilarity(purpose.toLowerCase(), basename.toLowerCase().replace(/[-_]/g, " "));
114
+ if (similarity > 0.5) {
115
+ const content = await this.readFile(file);
116
+ matches.push({
117
+ file,
118
+ line: 1,
119
+ snippet: content.slice(0, 200),
120
+ similarity,
121
+ });
122
+ }
123
+ }
124
+ }
125
+ const sorted = matches
126
+ .sort((a, b) => b.similarity - a.similarity)
127
+ .slice(0, this.config.maxResults);
128
+ return {
129
+ exists: sorted.length > 0 && sorted[0].similarity >= this.config.similarityThreshold,
130
+ confidence: sorted[0]?.similarity || 0,
131
+ matches: sorted,
132
+ suggestion: this.generateSuggestion(sorted, `file for "${purpose}"`),
133
+ };
134
+ }
135
+ // Private methods
136
+ async findByKeywords(keywords) {
137
+ const matches = [];
138
+ const terms = keywords.toLowerCase().split(/\s+/).filter(t => t.length > 3);
139
+ for (const scanPath of this.config.scanPaths) {
140
+ if (!existsSync(scanPath))
141
+ continue;
142
+ const files = await this.getFiles(scanPath, ".ts");
143
+ for (const file of files) {
144
+ const content = await this.readFile(file);
145
+ const lines = content.split("\n");
146
+ for (let i = 0; i < lines.length; i++) {
147
+ const line = lines[i].toLowerCase();
148
+ let matchCount = 0;
149
+ for (const term of terms) {
150
+ if (line.includes(term))
151
+ matchCount++;
152
+ }
153
+ const similarity = matchCount / terms.length;
154
+ if (similarity > 0.3) {
155
+ matches.push({
156
+ file,
157
+ line: i + 1,
158
+ snippet: lines[i].trim().slice(0, 100),
159
+ similarity,
160
+ });
161
+ }
162
+ }
163
+ }
164
+ }
165
+ return matches;
166
+ }
167
+ async findByCodeSimilarity(code) {
168
+ const matches = [];
169
+ const normalizedCode = this.normalizeCode(code);
170
+ for (const scanPath of this.config.scanPaths) {
171
+ if (!existsSync(scanPath))
172
+ continue;
173
+ const files = await this.getFiles(scanPath, ".ts");
174
+ for (const file of files) {
175
+ const content = await this.readFile(file);
176
+ const normalizedContent = this.normalizeCode(content);
177
+ const similarity = this.calculateCodeSimilarity(normalizedCode, normalizedContent);
178
+ if (similarity > 0.3) {
179
+ matches.push({
180
+ file,
181
+ line: 1,
182
+ snippet: content.slice(0, 200),
183
+ similarity,
184
+ });
185
+ }
186
+ }
187
+ }
188
+ return matches;
189
+ }
190
+ async findBySignature(signature) {
191
+ const matches = [];
192
+ // Parse the input signature
193
+ const parsedSig = this.parseSignature(signature);
194
+ const normalizedSignature = this.normalizeSignature(signature);
195
+ for (const scanPath of this.config.scanPaths) {
196
+ if (!existsSync(scanPath))
197
+ continue;
198
+ const files = await this.getFiles(scanPath, ".ts");
199
+ for (const file of files) {
200
+ const content = await this.readFile(file);
201
+ const signatures = this.extractSignatures(content);
202
+ for (const foundSig of signatures) {
203
+ // Calculate similarity using parsed signatures
204
+ const similarity = this.calculateSignatureSimilarity(parsedSig, foundSig);
205
+ if (similarity > 0.6) {
206
+ matches.push({
207
+ file,
208
+ line: foundSig.line,
209
+ snippet: foundSig.text,
210
+ similarity,
211
+ });
212
+ }
213
+ }
214
+ }
215
+ }
216
+ return matches;
217
+ }
218
+ /**
219
+ * Parse function signature
220
+ */
221
+ parseSignature(signature) {
222
+ const match = signature.match(/\s*(\w+)\s*\(([^)]*)\)/);
223
+ if (match) {
224
+ return {
225
+ name: match[1],
226
+ params: match[2]
227
+ ? match[2].split(",").map(p => p.trim()).filter(Boolean)
228
+ : [],
229
+ };
230
+ }
231
+ return { name: "", params: [] };
232
+ }
233
+ async findByMethodSignatures(methods) {
234
+ const matches = [];
235
+ for (const scanPath of this.config.scanPaths) {
236
+ if (!existsSync(scanPath))
237
+ continue;
238
+ const files = await this.getFiles(scanPath, ".ts");
239
+ for (const file of files) {
240
+ const content = await this.readFile(file);
241
+ const classMatches = [];
242
+ // Extract class definitions
243
+ const classRegex = /class\s+(\w+)\s*\{/g;
244
+ let match;
245
+ while ((match = classRegex.exec(content)) !== null) {
246
+ classMatches.push(match[1]);
247
+ }
248
+ // Check for method presence
249
+ const methodMatches = methods.filter(m => content.includes(m) || content.includes(this.camelToKebab(m)));
250
+ const similarity = methodMatches.length / methods.length;
251
+ if (similarity > 0.5) {
252
+ matches.push({
253
+ file,
254
+ line: 1,
255
+ snippet: `Classes: ${classMatches.join(", ")}`,
256
+ similarity,
257
+ });
258
+ }
259
+ }
260
+ }
261
+ return matches;
262
+ }
263
+ async searchPattern(pattern, specificPath) {
264
+ const matches = [];
265
+ const paths = specificPath ? [specificPath] : this.config.scanPaths;
266
+ for (const scanPath of paths) {
267
+ if (!existsSync(scanPath))
268
+ continue;
269
+ const files = await this.getFiles(scanPath, ".ts");
270
+ for (const file of files) {
271
+ const content = await this.readFile(file);
272
+ if (pattern.test(content)) {
273
+ const lines = content.split("\n");
274
+ for (let i = 0; i < lines.length; i++) {
275
+ if (pattern.test(lines[i])) {
276
+ matches.push({
277
+ file,
278
+ line: i + 1,
279
+ snippet: lines[i].trim(),
280
+ similarity: 0.9, // Direct pattern match
281
+ });
282
+ }
283
+ }
284
+ }
285
+ }
286
+ }
287
+ return matches;
288
+ }
289
+ async getFiles(dir, extension) {
290
+ const files = [];
291
+ try {
292
+ const entries = await fs.readdir(dir, { withFileTypes: true });
293
+ for (const entry of entries) {
294
+ const fullPath = path.join(dir, entry.name);
295
+ if (entry.isDirectory()) {
296
+ if (this.shouldExclude(entry.name))
297
+ continue;
298
+ files.push(...(await this.getFiles(fullPath, extension)));
299
+ }
300
+ else if (entry.name.endsWith(extension)) {
301
+ files.push(fullPath);
302
+ }
303
+ }
304
+ }
305
+ catch {
306
+ // Directory doesn't exist or no access
307
+ }
308
+ return files;
309
+ }
310
+ async readFile(filePath) {
311
+ if (this.fileCache.has(filePath)) {
312
+ return this.fileCache.get(filePath);
313
+ }
314
+ try {
315
+ const content = await fs.readFile(filePath, "utf-8");
316
+ this.fileCache.set(filePath, content);
317
+ return content;
318
+ }
319
+ catch {
320
+ return "";
321
+ }
322
+ }
323
+ shouldExclude(name) {
324
+ return this.config.excludePatterns.some(pattern => {
325
+ if (pattern.includes("*")) {
326
+ const regex = new RegExp(pattern.replace("*", ".*"));
327
+ return regex.test(name);
328
+ }
329
+ return name === pattern;
330
+ });
331
+ }
332
+ normalizeCode(code) {
333
+ return code
334
+ .replace(/\s+/g, " ")
335
+ .replace(/\/\/.*$/gm, "")
336
+ .replace(/\/\*[\s\S]*?\*\//g, "")
337
+ .replace(/\s*(\{|\}|\(|\)|;|,|:)\s*/g, "$1")
338
+ .toLowerCase()
339
+ .trim();
340
+ }
341
+ normalizeSignature(sig) {
342
+ return sig
343
+ .replace(/\s+/g, "")
344
+ .replace(/\w+\s*:\s*\w+/g, "_")
345
+ .toLowerCase();
346
+ }
347
+ calculateCodeSimilarity(a, b) {
348
+ // Simple substring-based similarity
349
+ if (a.length === 0 || b.length === 0)
350
+ return 0;
351
+ if (a === b)
352
+ return 1;
353
+ // Check for significant substring matches
354
+ const minLen = Math.min(a.length, b.length);
355
+ const maxLen = Math.max(a.length, b.length);
356
+ let longestMatch = 0;
357
+ for (let i = 0; i < a.length; i++) {
358
+ for (let j = minLen; j > longestMatch && i + j <= a.length; j--) {
359
+ const substr = a.slice(i, i + j);
360
+ if (b.includes(substr)) {
361
+ longestMatch = j;
362
+ break;
363
+ }
364
+ }
365
+ }
366
+ return longestMatch / maxLen;
367
+ }
368
+ calculateStringSimilarity(a, b) {
369
+ const longer = a.length > b.length ? a : b;
370
+ const shorter = a.length > b.length ? b : a;
371
+ if (longer.length === 0)
372
+ return 1;
373
+ const distance = this.levenshteinDistance(longer, shorter);
374
+ return (longer.length - distance) / longer.length;
375
+ }
376
+ calculateSignatureSimilarity(a, b) {
377
+ const nameSim = a.name === b.name ? 1 : 0;
378
+ const paramSim = this.jaccardSimilarity(new Set(a.params), new Set(b.params));
379
+ return (nameSim + paramSim) / 2;
380
+ }
381
+ jaccardSimilarity(a, b) {
382
+ const intersection = new Set([...a].filter(x => b.has(x)));
383
+ const union = new Set([...a, ...b]);
384
+ return intersection.size / union.size;
385
+ }
386
+ levenshteinDistance(a, b) {
387
+ const matrix = [];
388
+ for (let i = 0; i <= b.length; i++) {
389
+ matrix[i] = [i];
390
+ }
391
+ for (let j = 0; j <= a.length; j++) {
392
+ matrix[0][j] = j;
393
+ }
394
+ for (let i = 1; i <= b.length; i++) {
395
+ for (let j = 1; j <= a.length; j++) {
396
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
397
+ matrix[i][j] = matrix[i - 1][j - 1];
398
+ }
399
+ else {
400
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
401
+ }
402
+ }
403
+ }
404
+ return matrix[b.length][a.length];
405
+ }
406
+ extractSignatures(content) {
407
+ const signatures = [];
408
+ const lines = content.split("\n");
409
+ const functionRegex = /(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/;
410
+ lines.forEach((line, index) => {
411
+ const match = functionRegex.exec(line);
412
+ if (match) {
413
+ const params = match[2]
414
+ .split(",")
415
+ .map(p => p.trim().split(":")[0])
416
+ .filter(Boolean);
417
+ signatures.push({
418
+ name: match[1],
419
+ params,
420
+ line: index + 1,
421
+ text: line.trim(),
422
+ });
423
+ }
424
+ });
425
+ return signatures;
426
+ }
427
+ camelToKebab(str) {
428
+ return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);
429
+ }
430
+ deduplicateMatches(matches) {
431
+ const seen = new Set();
432
+ return matches.filter(match => {
433
+ const key = `${match.file}:${match.line}`;
434
+ if (seen.has(key))
435
+ return false;
436
+ seen.add(key);
437
+ return true;
438
+ });
439
+ }
440
+ generateSuggestion(matches, description) {
441
+ if (matches.length === 0) {
442
+ return `No existing implementation found for ${description}. Safe to proceed.`;
443
+ }
444
+ const topMatch = matches[0];
445
+ if (topMatch.similarity >= 0.9) {
446
+ return `⚠️ **HIGH SIMILARITY DETECTED** (${Math.round(topMatch.similarity * 100)}%)\n` +
447
+ `Existing implementation at ${topMatch.file}:${topMatch.line}\n` +
448
+ `Consider using existing code or extending it rather than duplicating.`;
449
+ }
450
+ if (matches.length === 1) {
451
+ return `⚡ Similar implementation found (${Math.round(topMatch.similarity * 100)}% match) at ${topMatch.file}\n` +
452
+ `Review before creating new implementation.`;
453
+ }
454
+ return `⚡ ${matches.length} similar implementations found:\n` +
455
+ matches.slice(0, 3).map(m => ` - ${m.file} (${Math.round(m.similarity * 100)}%)`).join("\n") +
456
+ `\nReview existing code before creating new implementation.`;
457
+ }
458
+ }
459
+ // Export singleton
460
+ let detector = null;
461
+ export function getDuplicateDetector(config) {
462
+ if (!detector) {
463
+ detector = new DuplicateDetector(config);
464
+ }
465
+ return detector;
466
+ }
467
+ export { DuplicateDetector, DEFAULT_CONFIG };
468
+ export default DuplicateDetector;
469
+ //# sourceMappingURL=duplicate-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-detector.js","sourceRoot":"","sources":["../../../../src/skills/builtin/duplicate-detector.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
  export { getSkillRegistry, resetSkillRegistry, installSkill, getSkillMarketplace } from "./framework.js";
3
3
  // Real Worker Skills (Phase 3.3 - NOW ACTUAL IMPLEMENTATIONS)
4
4
  export { nextjsWorkerSkill, sqlWorkerSkill, apiWorkerSkill, testWorkerSkill, webResearchSkill, } from "./builtin/real-workers.js";
5
+ // Duplicate Detection Skill (v0.3.0)
6
+ export { DuplicateDetector, getDuplicateDetector } from "./builtin/duplicate-detector.js";
5
7
  // Backwards compatibility - mock skills now redirect to real workers
6
8
  export { nextjsWorkerSkill as nextjsWorkerMock } from "./builtin/nextjs-worker.js";
7
9
  export { sqlWorkerSkill as sqlWorkerMock } from "./builtin/sql-worker.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EAKpB,MAAM,gBAAgB,CAAC;AAExB,8DAA8D;AAC9D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,qEAAqE;AACrE,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,cAAc,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,eAAe,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EAKpB,MAAM,gBAAgB,CAAC;AAExB,8DAA8D;AAC9D,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,qCAAqC;AACrC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE1F,qEAAqE;AACrE,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,cAAc,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,eAAe,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.2.0",
4
- "description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.2.0 - Complete with Real Gateway, Worker Skills)",
3
+ "version": "0.3.0",
4
+ "description": "Your digital familiar - a personal AI assistant that learns and evolves (v0.3.0 - Multi-Channel, Security, Media Support)",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
7
7
  "type": "module",
@@ -38,12 +38,14 @@
38
38
  "@mariozechner/pi-agent-core": "0.57.1",
39
39
  "@mariozechner/pi-coding-agent": "0.57.1",
40
40
  "@mariozechner/pi-tui": "0.57.1",
41
+ "@whiskeysockets/baileys": "^7.0.0-rc.9",
41
42
  "ajv": "^8.18.0",
42
43
  "blessed": "^0.1.81",
43
44
  "commander": "^11.1.0",
44
45
  "discord.js": "^14.25.1",
45
46
  "glob": "^10.5.0",
46
47
  "json5": "^2.2.3",
48
+ "node-telegram-bot-api": "^0.67.0",
47
49
  "playwright": "^1.58.2",
48
50
  "react": "^19.2.4",
49
51
  "sharp": "^0.33.5",