@dollhousemcp/mcp-server 1.8.0 → 1.9.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 (56) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.github.md +126 -8
  3. package/README.md +1 -1
  4. package/README.md.backup +50 -795
  5. package/README.npm.md +1 -1
  6. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  7. package/dist/collection/CollectionBrowser.js +6 -5
  8. package/dist/config/ConfigWizardDisplay.d.ts +64 -0
  9. package/dist/config/ConfigWizardDisplay.d.ts.map +1 -0
  10. package/dist/config/ConfigWizardDisplay.js +150 -0
  11. package/dist/config/WizardFirstResponse.d.ts +25 -0
  12. package/dist/config/WizardFirstResponse.d.ts.map +1 -0
  13. package/dist/config/WizardFirstResponse.js +118 -0
  14. package/dist/elements/memories/Memory.d.ts +190 -0
  15. package/dist/elements/memories/Memory.d.ts.map +1 -0
  16. package/dist/elements/memories/Memory.js +627 -0
  17. package/dist/elements/memories/MemoryManager.d.ts +136 -0
  18. package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
  19. package/dist/elements/memories/MemoryManager.js +607 -0
  20. package/dist/elements/memories/MemorySearchIndex.d.ts +156 -0
  21. package/dist/elements/memories/MemorySearchIndex.d.ts.map +1 -0
  22. package/dist/elements/memories/MemorySearchIndex.js +690 -0
  23. package/dist/elements/memories/constants.d.ts +95 -0
  24. package/dist/elements/memories/constants.d.ts.map +1 -0
  25. package/dist/elements/memories/constants.js +102 -0
  26. package/dist/elements/memories/index.d.ts +7 -0
  27. package/dist/elements/memories/index.d.ts.map +1 -0
  28. package/dist/elements/memories/index.js +7 -0
  29. package/dist/elements/memories/utils.d.ts +68 -0
  30. package/dist/elements/memories/utils.d.ts.map +1 -0
  31. package/dist/elements/memories/utils.js +137 -0
  32. package/dist/generated/version.d.ts +2 -2
  33. package/dist/generated/version.js +3 -3
  34. package/dist/scripts/scripts/run-config-wizard.js +57 -0
  35. package/dist/scripts/src/config/ConfigManager.js +799 -0
  36. package/dist/scripts/src/config/ConfigWizard.js +368 -0
  37. package/dist/scripts/src/errors/SecurityError.js +47 -0
  38. package/dist/scripts/src/security/constants.js +28 -0
  39. package/dist/scripts/src/security/contentValidator.js +415 -0
  40. package/dist/scripts/src/security/errors.js +32 -0
  41. package/dist/scripts/src/security/regexValidator.js +217 -0
  42. package/dist/scripts/src/security/secureYamlParser.js +272 -0
  43. package/dist/scripts/src/security/securityMonitor.js +111 -0
  44. package/dist/scripts/src/security/validators/unicodeValidator.js +315 -0
  45. package/dist/scripts/src/utils/logger.js +288 -0
  46. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  47. package/dist/security/audit/SecurityAuditor.js +24 -2
  48. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  49. package/dist/security/audit/config/suppressions.js +91 -1
  50. package/dist/security/securityMonitor.d.ts +1 -1
  51. package/dist/security/securityMonitor.d.ts.map +1 -1
  52. package/dist/security/securityMonitor.js +1 -1
  53. package/dist/tools/getWelcomeMessage.d.ts +41 -0
  54. package/dist/tools/getWelcomeMessage.d.ts.map +1 -0
  55. package/dist/tools/getWelcomeMessage.js +109 -0
  56. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Constants for Memory element implementation
3
+ * Extracted for reusability and maintainability
4
+ *
5
+ * MEMORY ARCHITECTURE DESIGN:
6
+ * - Memories are stored as small, sharded YAML files for fast loading
7
+ * - Each memory file should be <256KB for optimal parse performance
8
+ * - Larger content referenced via external documents (PDFs, images, etc)
9
+ * - Index-of-indexes pattern for O(log n) search performance
10
+ *
11
+ * SECURITY NOTE: This file contains only constants and type definitions.
12
+ * It does not process any user input. The security scanner may flag this
13
+ * for missing Unicode normalization, but this is a false positive as no
14
+ * input processing occurs here.
15
+ *
16
+ * @module MemoryConstants
17
+ */
18
+ export declare const MEMORY_CONSTANTS: {
19
+ readonly MAX_MEMORY_SIZE: number;
20
+ readonly MAX_ENTRY_SIZE: number;
21
+ readonly MAX_ENTRIES_DEFAULT: 1000;
22
+ readonly MAX_TAGS_PER_ENTRY: 20;
23
+ readonly MAX_TAG_LENGTH: 50;
24
+ readonly MAX_METADATA_KEYS: 20;
25
+ readonly MAX_METADATA_KEY_LENGTH: 50;
26
+ readonly MAX_METADATA_VALUE_LENGTH: 200;
27
+ readonly DEFAULT_RETENTION_DAYS: 30;
28
+ readonly MIN_RETENTION_DAYS: 1;
29
+ readonly MAX_RETENTION_DAYS: 365;
30
+ readonly DEFAULT_SEARCH_LIMIT: 100;
31
+ /**
32
+ * YAML Size Limit Rationale:
33
+ * 256KB is optimal for YAML parsing performance while preventing DoS attacks.
34
+ * - YAML parsing is CPU-intensive; large files can block the event loop
35
+ * - 256KB accommodates ~5000 lines of typical memory content
36
+ * - Larger memories should be sharded across multiple files
37
+ * - External references used for binary data (images, PDFs, etc)
38
+ *
39
+ * Performance benchmarks:
40
+ * - <256KB: Parse time <10ms on average hardware
41
+ * - 1MB: Parse time ~50-100ms (acceptable but not ideal)
42
+ * - >5MB: Parse time >500ms (unacceptable, blocks UI)
43
+ */
44
+ readonly MAX_YAML_SIZE: number;
45
+ /**
46
+ * Privacy Level Hierarchy:
47
+ *
48
+ * 'public' - Lowest restriction level
49
+ * - Available to all contexts and users
50
+ * - Can be shared across sessions
51
+ * - Suitable for general knowledge, documentation
52
+ * - Example: Project conventions, public APIs
53
+ *
54
+ * 'private' - Default level, moderate restriction
55
+ * - Restricted to current user/session
56
+ * - Not shared with other users
57
+ * - Suitable for personal preferences, user-specific data
58
+ * - Example: User's coding style, personal notes
59
+ *
60
+ * 'sensitive' - Highest restriction level
61
+ * - Requires explicit permission to access
62
+ * - Extra logging and audit trail
63
+ * - Automatic deletion after retention period
64
+ * - Suitable for credentials, PII, confidential data
65
+ * - Example: API keys (temporary), personal information
66
+ *
67
+ * Access rules cascade: sensitive ⊂ private ⊂ public
68
+ */
69
+ readonly PRIVACY_LEVELS: readonly ["public", "private", "sensitive"];
70
+ readonly DEFAULT_PRIVACY_LEVEL: "private";
71
+ readonly DEFAULT_STORAGE_BACKEND: "memory";
72
+ readonly SUPPORTED_STORAGE_BACKENDS: readonly ["memory", "file", "indexed"];
73
+ };
74
+ export type PrivacyLevel = typeof MEMORY_CONSTANTS.PRIVACY_LEVELS[number];
75
+ export type StorageBackend = typeof MEMORY_CONSTANTS.SUPPORTED_STORAGE_BACKENDS[number];
76
+ export declare const MEMORY_SECURITY_EVENTS: {
77
+ readonly MEMORY_CREATED: "MEMORY_CREATED";
78
+ readonly MEMORY_ADDED: "MEMORY_ADDED";
79
+ readonly MEMORY_SEARCHED: "MEMORY_SEARCHED";
80
+ readonly SENSITIVE_MEMORY_DELETED: "SENSITIVE_MEMORY_DELETED";
81
+ readonly RETENTION_POLICY_ENFORCED: "RETENTION_POLICY_ENFORCED";
82
+ readonly MEMORY_CLEARED: "MEMORY_CLEARED";
83
+ readonly MEMORY_LOADED: "MEMORY_LOADED";
84
+ readonly MEMORY_SAVED: "MEMORY_SAVED";
85
+ readonly MEMORY_DELETED: "MEMORY_DELETED";
86
+ readonly MEMORY_LOAD_FAILED: "MEMORY_LOAD_FAILED";
87
+ readonly MEMORY_SAVE_FAILED: "MEMORY_SAVE_FAILED";
88
+ readonly MEMORY_DESERIALIZE_FAILED: "MEMORY_DESERIALIZE_FAILED";
89
+ readonly MEMORY_LIST_ITEM_FAILED: "MEMORY_LIST_ITEM_FAILED";
90
+ readonly MEMORY_IMPORT_FAILED: "MEMORY_IMPORT_FAILED";
91
+ readonly MEMORY_INTEGRITY_VIOLATION: "MEMORY_INTEGRITY_VIOLATION";
92
+ readonly MEMORY_UNICODE_VALIDATION_FAILED: "MEMORY_UNICODE_VALIDATION_FAILED";
93
+ readonly MEMORY_DUPLICATE_DETECTED: "MEMORY_DUPLICATE_DETECTED";
94
+ };
95
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;IAqB3B;;;;;;;;;;;;OAYG;;IAGH;;;;;;;;;;;;;;;;;;;;;;;OAuBG;;;;;CAOK,CAAC;AAGX,MAAM,MAAM,YAAY,GAAG,OAAO,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAGxF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;CAkBzB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Constants for Memory element implementation
3
+ * Extracted for reusability and maintainability
4
+ *
5
+ * MEMORY ARCHITECTURE DESIGN:
6
+ * - Memories are stored as small, sharded YAML files for fast loading
7
+ * - Each memory file should be <256KB for optimal parse performance
8
+ * - Larger content referenced via external documents (PDFs, images, etc)
9
+ * - Index-of-indexes pattern for O(log n) search performance
10
+ *
11
+ * SECURITY NOTE: This file contains only constants and type definitions.
12
+ * It does not process any user input. The security scanner may flag this
13
+ * for missing Unicode normalization, but this is a false positive as no
14
+ * input processing occurs here.
15
+ *
16
+ * @module MemoryConstants
17
+ */
18
+ // security-audit-ignore: DMCP-SEC-004
19
+ // Reason: Constants file - no user input processing
20
+ // Memory size limits
21
+ export const MEMORY_CONSTANTS = {
22
+ // Size limits
23
+ MAX_MEMORY_SIZE: 1024 * 1024, // 1MB total memory size
24
+ MAX_ENTRY_SIZE: 100 * 1024, // 100KB per entry
25
+ MAX_ENTRIES_DEFAULT: 1000, // Maximum number of entries
26
+ // Entry limits
27
+ MAX_TAGS_PER_ENTRY: 20, // Maximum tags per memory entry
28
+ MAX_TAG_LENGTH: 50, // Maximum length of each tag
29
+ MAX_METADATA_KEYS: 20, // Maximum metadata keys per entry
30
+ MAX_METADATA_KEY_LENGTH: 50, // Maximum metadata key length
31
+ MAX_METADATA_VALUE_LENGTH: 200, // Maximum metadata value length
32
+ // Retention defaults
33
+ DEFAULT_RETENTION_DAYS: 30, // Default retention period
34
+ MIN_RETENTION_DAYS: 1, // Minimum retention period
35
+ MAX_RETENTION_DAYS: 365, // Maximum retention period
36
+ // Search limits
37
+ DEFAULT_SEARCH_LIMIT: 100, // Default search result limit
38
+ /**
39
+ * YAML Size Limit Rationale:
40
+ * 256KB is optimal for YAML parsing performance while preventing DoS attacks.
41
+ * - YAML parsing is CPU-intensive; large files can block the event loop
42
+ * - 256KB accommodates ~5000 lines of typical memory content
43
+ * - Larger memories should be sharded across multiple files
44
+ * - External references used for binary data (images, PDFs, etc)
45
+ *
46
+ * Performance benchmarks:
47
+ * - <256KB: Parse time <10ms on average hardware
48
+ * - 1MB: Parse time ~50-100ms (acceptable but not ideal)
49
+ * - >5MB: Parse time >500ms (unacceptable, blocks UI)
50
+ */
51
+ MAX_YAML_SIZE: 256 * 1024, // 256KB max YAML size for import
52
+ /**
53
+ * Privacy Level Hierarchy:
54
+ *
55
+ * 'public' - Lowest restriction level
56
+ * - Available to all contexts and users
57
+ * - Can be shared across sessions
58
+ * - Suitable for general knowledge, documentation
59
+ * - Example: Project conventions, public APIs
60
+ *
61
+ * 'private' - Default level, moderate restriction
62
+ * - Restricted to current user/session
63
+ * - Not shared with other users
64
+ * - Suitable for personal preferences, user-specific data
65
+ * - Example: User's coding style, personal notes
66
+ *
67
+ * 'sensitive' - Highest restriction level
68
+ * - Requires explicit permission to access
69
+ * - Extra logging and audit trail
70
+ * - Automatic deletion after retention period
71
+ * - Suitable for credentials, PII, confidential data
72
+ * - Example: API keys (temporary), personal information
73
+ *
74
+ * Access rules cascade: sensitive ⊂ private ⊂ public
75
+ */
76
+ PRIVACY_LEVELS: ['public', 'private', 'sensitive'],
77
+ DEFAULT_PRIVACY_LEVEL: 'private',
78
+ // Storage backends
79
+ DEFAULT_STORAGE_BACKEND: 'memory',
80
+ SUPPORTED_STORAGE_BACKENDS: ['memory', 'file', 'indexed'],
81
+ };
82
+ // Security event types for memory operations
83
+ export const MEMORY_SECURITY_EVENTS = {
84
+ MEMORY_CREATED: 'MEMORY_CREATED',
85
+ MEMORY_ADDED: 'MEMORY_ADDED',
86
+ MEMORY_SEARCHED: 'MEMORY_SEARCHED',
87
+ SENSITIVE_MEMORY_DELETED: 'SENSITIVE_MEMORY_DELETED',
88
+ RETENTION_POLICY_ENFORCED: 'RETENTION_POLICY_ENFORCED',
89
+ MEMORY_CLEARED: 'MEMORY_CLEARED',
90
+ MEMORY_LOADED: 'MEMORY_LOADED',
91
+ MEMORY_SAVED: 'MEMORY_SAVED',
92
+ MEMORY_DELETED: 'MEMORY_DELETED',
93
+ MEMORY_LOAD_FAILED: 'MEMORY_LOAD_FAILED',
94
+ MEMORY_SAVE_FAILED: 'MEMORY_SAVE_FAILED',
95
+ MEMORY_DESERIALIZE_FAILED: 'MEMORY_DESERIALIZE_FAILED',
96
+ MEMORY_LIST_ITEM_FAILED: 'MEMORY_LIST_ITEM_FAILED',
97
+ MEMORY_IMPORT_FAILED: 'MEMORY_IMPORT_FAILED',
98
+ MEMORY_INTEGRITY_VIOLATION: 'MEMORY_INTEGRITY_VIOLATION',
99
+ MEMORY_UNICODE_VALIDATION_FAILED: 'MEMORY_UNICODE_VALIDATION_FAILED',
100
+ MEMORY_DUPLICATE_DETECTED: 'MEMORY_DUPLICATE_DETECTED',
101
+ };
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILHNDQUFzQztBQUN0QyxvREFBb0Q7QUFFcEQscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLGNBQWM7SUFDZCxlQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBUyx3QkFBd0I7SUFDN0QsY0FBYyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQVcsa0JBQWtCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUksRUFBWSw0QkFBNEI7SUFFakUsZUFBZTtJQUNmLGtCQUFrQixFQUFFLEVBQUUsRUFBZSxnQ0FBZ0M7SUFDckUsY0FBYyxFQUFFLEVBQUUsRUFBbUIsNkJBQTZCO0lBQ2xFLGlCQUFpQixFQUFFLEVBQUUsRUFBZ0Isa0NBQWtDO0lBQ3ZFLHVCQUF1QixFQUFFLEVBQUUsRUFBVSw4QkFBOEI7SUFDbkUseUJBQXlCLEVBQUUsR0FBRyxFQUFPLGdDQUFnQztJQUVyRSxxQkFBcUI7SUFDckIsc0JBQXNCLEVBQUUsRUFBRSxFQUFXLDJCQUEyQjtJQUNoRSxrQkFBa0IsRUFBRSxDQUFDLEVBQWdCLDJCQUEyQjtJQUNoRSxrQkFBa0IsRUFBRSxHQUFHLEVBQWMsMkJBQTJCO0lBRWhFLGdCQUFnQjtJQUNoQixvQkFBb0IsRUFBRSxHQUFHLEVBQVksOEJBQThCO0lBRW5FOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGFBQWEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFZLGlDQUFpQztJQUV0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSCxjQUFjLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBVTtJQUMzRCxxQkFBcUIsRUFBRSxTQUFrQjtJQUV6QyxtQkFBbUI7SUFDbkIsdUJBQXVCLEVBQUUsUUFBaUI7SUFDMUMsMEJBQTBCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBVTtDQUMxRCxDQUFDO0FBTVgsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyx3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYSxFQUFFLGVBQWU7SUFDOUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCx1QkFBdUIsRUFBRSx5QkFBeUI7SUFDbEQsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLDBCQUEwQixFQUFFLDRCQUE0QjtJQUN4RCxnQ0FBZ0MsRUFBRSxrQ0FBa0M7SUFDcEUseUJBQXlCLEVBQUUsMkJBQTJCO0NBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0YW50cyBmb3IgTWVtb3J5IGVsZW1lbnQgaW1wbGVtZW50YXRpb25cbiAqIEV4dHJhY3RlZCBmb3IgcmV1c2FiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eVxuICpcbiAqIE1FTU9SWSBBUkNISVRFQ1RVUkUgREVTSUdOOlxuICogLSBNZW1vcmllcyBhcmUgc3RvcmVkIGFzIHNtYWxsLCBzaGFyZGVkIFlBTUwgZmlsZXMgZm9yIGZhc3QgbG9hZGluZ1xuICogLSBFYWNoIG1lbW9yeSBmaWxlIHNob3VsZCBiZSA8MjU2S0IgZm9yIG9wdGltYWwgcGFyc2UgcGVyZm9ybWFuY2VcbiAqIC0gTGFyZ2VyIGNvbnRlbnQgcmVmZXJlbmNlZCB2aWEgZXh0ZXJuYWwgZG9jdW1lbnRzIChQREZzLCBpbWFnZXMsIGV0YylcbiAqIC0gSW5kZXgtb2YtaW5kZXhlcyBwYXR0ZXJuIGZvciBPKGxvZyBuKSBzZWFyY2ggcGVyZm9ybWFuY2VcbiAqXG4gKiBTRUNVUklUWSBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBjb25zdGFudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuXG4gKiBJdCBkb2VzIG5vdCBwcm9jZXNzIGFueSB1c2VyIGlucHV0LiBUaGUgc2VjdXJpdHkgc2Nhbm5lciBtYXkgZmxhZyB0aGlzXG4gKiBmb3IgbWlzc2luZyBVbmljb2RlIG5vcm1hbGl6YXRpb24sIGJ1dCB0aGlzIGlzIGEgZmFsc2UgcG9zaXRpdmUgYXMgbm9cbiAqIGlucHV0IHByb2Nlc3Npbmcgb2NjdXJzIGhlcmUuXG4gKlxuICogQG1vZHVsZSBNZW1vcnlDb25zdGFudHNcbiAqL1xuXG4vLyBzZWN1cml0eS1hdWRpdC1pZ25vcmU6IERNQ1AtU0VDLTAwNFxuLy8gUmVhc29uOiBDb25zdGFudHMgZmlsZSAtIG5vIHVzZXIgaW5wdXQgcHJvY2Vzc2luZ1xuXG4vLyBNZW1vcnkgc2l6ZSBsaW1pdHNcbmV4cG9ydCBjb25zdCBNRU1PUllfQ09OU1RBTlRTID0ge1xuICAvLyBTaXplIGxpbWl0c1xuICBNQVhfTUVNT1JZX1NJWkU6IDEwMjQgKiAxMDI0LCAgICAgICAgLy8gMU1CIHRvdGFsIG1lbW9yeSBzaXplXG4gIE1BWF9FTlRSWV9TSVpFOiAxMDAgKiAxMDI0LCAgICAgICAgICAvLyAxMDBLQiBwZXIgZW50cnlcbiAgTUFYX0VOVFJJRVNfREVGQVVMVDogMTAwMCwgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXNcblxuICAvLyBFbnRyeSBsaW1pdHNcbiAgTUFYX1RBR1NfUEVSX0VOVFJZOiAyMCwgICAgICAgICAgICAgIC8vIE1heGltdW0gdGFncyBwZXIgbWVtb3J5IGVudHJ5XG4gIE1BWF9UQUdfTEVOR1RIOiA1MCwgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHRhZ1xuICBNQVhfTUVUQURBVEFfS0VZUzogMjAsICAgICAgICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXlzIHBlciBlbnRyeVxuICBNQVhfTUVUQURBVEFfS0VZX0xFTkdUSDogNTAsICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXkgbGVuZ3RoXG4gIE1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEg6IDIwMCwgICAgICAvLyBNYXhpbXVtIG1ldGFkYXRhIHZhbHVlIGxlbmd0aFxuXG4gIC8vIFJldGVudGlvbiBkZWZhdWx0c1xuICBERUZBVUxUX1JFVEVOVElPTl9EQVlTOiAzMCwgICAgICAgICAgLy8gRGVmYXVsdCByZXRlbnRpb24gcGVyaW9kXG4gIE1JTl9SRVRFTlRJT05fREFZUzogMSwgICAgICAgICAgICAgICAvLyBNaW5pbXVtIHJldGVudGlvbiBwZXJpb2RcbiAgTUFYX1JFVEVOVElPTl9EQVlTOiAzNjUsICAgICAgICAgICAgIC8vIE1heGltdW0gcmV0ZW50aW9uIHBlcmlvZFxuXG4gIC8vIFNlYXJjaCBsaW1pdHNcbiAgREVGQVVMVF9TRUFSQ0hfTElNSVQ6IDEwMCwgICAgICAgICAgIC8vIERlZmF1bHQgc2VhcmNoIHJlc3VsdCBsaW1pdFxuXG4gIC8qKlxuICAgKiBZQU1MIFNpemUgTGltaXQgUmF0aW9uYWxlOlxuICAgKiAyNTZLQiBpcyBvcHRpbWFsIGZvciBZQU1MIHBhcnNpbmcgcGVyZm9ybWFuY2Ugd2hpbGUgcHJldmVudGluZyBEb1MgYXR0YWNrcy5cbiAgICogLSBZQU1MIHBhcnNpbmcgaXMgQ1BVLWludGVuc2l2ZTsgbGFyZ2UgZmlsZXMgY2FuIGJsb2NrIHRoZSBldmVudCBsb29wXG4gICAqIC0gMjU2S0IgYWNjb21tb2RhdGVzIH41MDAwIGxpbmVzIG9mIHR5cGljYWwgbWVtb3J5IGNvbnRlbnRcbiAgICogLSBMYXJnZXIgbWVtb3JpZXMgc2hvdWxkIGJlIHNoYXJkZWQgYWNyb3NzIG11bHRpcGxlIGZpbGVzXG4gICAqIC0gRXh0ZXJuYWwgcmVmZXJlbmNlcyB1c2VkIGZvciBiaW5hcnkgZGF0YSAoaW1hZ2VzLCBQREZzLCBldGMpXG4gICAqXG4gICAqIFBlcmZvcm1hbmNlIGJlbmNobWFya3M6XG4gICAqIC0gPDI1NktCOiBQYXJzZSB0aW1lIDwxMG1zIG9uIGF2ZXJhZ2UgaGFyZHdhcmVcbiAgICogLSAxTUI6IFBhcnNlIHRpbWUgfjUwLTEwMG1zIChhY2NlcHRhYmxlIGJ1dCBub3QgaWRlYWwpXG4gICAqIC0gPjVNQjogUGFyc2UgdGltZSA+NTAwbXMgKHVuYWNjZXB0YWJsZSwgYmxvY2tzIFVJKVxuICAgKi9cbiAgTUFYX1lBTUxfU0laRTogMjU2ICogMTAyNCwgICAgICAgICAgIC8vIDI1NktCIG1heCBZQU1MIHNpemUgZm9yIGltcG9ydFxuXG4gIC8qKlxuICAgKiBQcml2YWN5IExldmVsIEhpZXJhcmNoeTpcbiAgICpcbiAgICogJ3B1YmxpYycgLSBMb3dlc3QgcmVzdHJpY3Rpb24gbGV2ZWxcbiAgICogICAtIEF2YWlsYWJsZSB0byBhbGwgY29udGV4dHMgYW5kIHVzZXJzXG4gICAqICAgLSBDYW4gYmUgc2hhcmVkIGFjcm9zcyBzZXNzaW9uc1xuICAgKiAgIC0gU3VpdGFibGUgZm9yIGdlbmVyYWwga25vd2xlZGdlLCBkb2N1bWVudGF0aW9uXG4gICAqICAgLSBFeGFtcGxlOiBQcm9qZWN0IGNvbnZlbnRpb25zLCBwdWJsaWMgQVBJc1xuICAgKlxuICAgKiAncHJpdmF0ZScgLSBEZWZhdWx0IGxldmVsLCBtb2RlcmF0ZSByZXN0cmljdGlvblxuICAgKiAgIC0gUmVzdHJpY3RlZCB0byBjdXJyZW50IHVzZXIvc2Vzc2lvblxuICAgKiAgIC0gTm90IHNoYXJlZCB3aXRoIG90aGVyIHVzZXJzXG4gICAqICAgLSBTdWl0YWJsZSBmb3IgcGVyc29uYWwgcHJlZmVyZW5jZXMsIHVzZXItc3BlY2lmaWMgZGF0YVxuICAgKiAgIC0gRXhhbXBsZTogVXNlcidzIGNvZGluZyBzdHlsZSwgcGVyc29uYWwgbm90ZXNcbiAgICpcbiAgICogJ3NlbnNpdGl2ZScgLSBIaWdoZXN0IHJlc3RyaWN0aW9uIGxldmVsXG4gICAqICAgLSBSZXF1aXJlcyBleHBsaWNpdCBwZXJtaXNzaW9uIHRvIGFjY2Vzc1xuICAgKiAgIC0gRXh0cmEgbG9nZ2luZyBhbmQgYXVkaXQgdHJhaWxcbiAgICogICAtIEF1dG9tYXRpYyBkZWxldGlvbiBhZnRlciByZXRlbnRpb24gcGVyaW9kXG4gICAqICAgLSBTdWl0YWJsZSBmb3IgY3JlZGVudGlhbHMsIFBJSSwgY29uZmlkZW50aWFsIGRhdGFcbiAgICogICAtIEV4YW1wbGU6IEFQSSBrZXlzICh0ZW1wb3JhcnkpLCBwZXJzb25hbCBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgcnVsZXMgY2FzY2FkZTogc2Vuc2l0aXZlIOKKgiBwcml2YXRlIOKKgiBwdWJsaWNcbiAgICovXG4gIFBSSVZBQ1lfTEVWRUxTOiBbJ3B1YmxpYycsICdwcml2YXRlJywgJ3NlbnNpdGl2ZSddIGFzIGNvbnN0LFxuICBERUZBVUxUX1BSSVZBQ1lfTEVWRUw6ICdwcml2YXRlJyBhcyBjb25zdCxcbiAgXG4gIC8vIFN0b3JhZ2UgYmFja2VuZHNcbiAgREVGQVVMVF9TVE9SQUdFX0JBQ0tFTkQ6ICdtZW1vcnknIGFzIGNvbnN0LFxuICBTVVBQT1JURURfU1RPUkFHRV9CQUNLRU5EUzogWydtZW1vcnknLCAnZmlsZScsICdpbmRleGVkJ10gYXMgY29uc3QsXG59IGFzIGNvbnN0O1xuXG4vLyBUeXBlIGV4cG9ydHMgZm9yIHByaXZhY3kgbGV2ZWxzIGFuZCBzdG9yYWdlIGJhY2tlbmRzXG5leHBvcnQgdHlwZSBQcml2YWN5TGV2ZWwgPSB0eXBlb2YgTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMU1tudW1iZXJdO1xuZXhwb3J0IHR5cGUgU3RvcmFnZUJhY2tlbmQgPSB0eXBlb2YgTUVNT1JZX0NPTlNUQU5UUy5TVVBQT1JURURfU1RPUkFHRV9CQUNLRU5EU1tudW1iZXJdO1xuXG4vLyBTZWN1cml0eSBldmVudCB0eXBlcyBmb3IgbWVtb3J5IG9wZXJhdGlvbnNcbmV4cG9ydCBjb25zdCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTID0ge1xuICBNRU1PUllfQ1JFQVRFRDogJ01FTU9SWV9DUkVBVEVEJyxcbiAgTUVNT1JZX0FEREVEOiAnTUVNT1JZX0FEREVEJyxcbiAgTUVNT1JZX1NFQVJDSEVEOiAnTUVNT1JZX1NFQVJDSEVEJyxcbiAgU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVEOiAnU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVEJyxcbiAgUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRDogJ1JFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQnLFxuICBNRU1PUllfQ0xFQVJFRDogJ01FTU9SWV9DTEVBUkVEJyxcbiAgTUVNT1JZX0xPQURFRDogJ01FTU9SWV9MT0FERUQnLFxuICBNRU1PUllfU0FWRUQ6ICdNRU1PUllfU0FWRUQnLFxuICBNRU1PUllfREVMRVRFRDogJ01FTU9SWV9ERUxFVEVEJyxcbiAgTUVNT1JZX0xPQURfRkFJTEVEOiAnTUVNT1JZX0xPQURfRkFJTEVEJyxcbiAgTUVNT1JZX1NBVkVfRkFJTEVEOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgTUVNT1JZX0RFU0VSSUFMSVpFX0ZBSUxFRDogJ01FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQnLFxuICBNRU1PUllfTElTVF9JVEVNX0ZBSUxFRDogJ01FTU9SWV9MSVNUX0lURU1fRkFJTEVEJyxcbiAgTUVNT1JZX0lNUE9SVF9GQUlMRUQ6ICdNRU1PUllfSU1QT1JUX0ZBSUxFRCcsXG4gIE1FTU9SWV9JTlRFR1JJVFlfVklPTEFUSU9OOiAnTUVNT1JZX0lOVEVHUklUWV9WSU9MQVRJT04nLFxuICBNRU1PUllfVU5JQ09ERV9WQUxJREFUSU9OX0ZBSUxFRDogJ01FTU9SWV9VTklDT0RFX1ZBTElEQVRJT05fRkFJTEVEJyxcbiAgTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRDogJ01FTU9SWV9EVVBMSUNBVEVfREVURUNURUQnLFxufSBhcyBjb25zdDsiXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Memory element exports
3
+ */
4
+ export { Memory, MemoryMetadata, MemoryEntry, MemorySearchOptions } from './Memory.js';
5
+ export { MemoryManager } from './MemoryManager.js';
6
+ export { MemorySearchIndex, SearchQuery, SearchIndexConfig, SearchResult } from './MemorySearchIndex.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Memory element exports
3
+ */
4
+ export { Memory } from './Memory.js';
5
+ export { MemoryManager } from './MemoryManager.js';
6
+ export { MemorySearchIndex } from './MemorySearchIndex.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvbWVtb3JpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFvRCxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFnRCxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnkgZWxlbWVudCBleHBvcnRzXG4gKi9cblxuZXhwb3J0IHsgTWVtb3J5LCBNZW1vcnlNZXRhZGF0YSwgTWVtb3J5RW50cnksIE1lbW9yeVNlYXJjaE9wdGlvbnMgfSBmcm9tICcuL01lbW9yeS5qcyc7XG5leHBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi9NZW1vcnlNYW5hZ2VyLmpzJztcbmV4cG9ydCB7IE1lbW9yeVNlYXJjaEluZGV4LCBTZWFyY2hRdWVyeSwgU2VhcmNoSW5kZXhDb25maWcsIFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vTWVtb3J5U2VhcmNoSW5kZXguanMnOyJdfQ==
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Utility functions for Memory element operations
3
+ *
4
+ * PERFORMANCE CONSIDERATIONS:
5
+ * - ID generation should be fast (<1ms)
6
+ * - Hash functions optimized for memory verification
7
+ * - Index operations designed for O(log n) complexity
8
+ *
9
+ * SECURITY CONSIDERATIONS:
10
+ * - Hash functions normalize Unicode to prevent bypass attempts
11
+ * - Content verification detects external modifications
12
+ * - Protects against manual editing and tampering
13
+ */
14
+ /**
15
+ * Generate a unique ID for memory entries
16
+ * Format: mem_{timestamp}_{random}
17
+ *
18
+ * @returns Unique memory entry ID
19
+ * @example
20
+ * generateMemoryId() // "mem_1699234567890_x7k2n9p4m"
21
+ */
22
+ export declare function generateMemoryId(): string;
23
+ /**
24
+ * Generate a content hash for memory integrity verification
25
+ * Uses SHA-256 for cryptographic strength with Unicode normalization
26
+ *
27
+ * SECURITY: Normalizes content to prevent Unicode-based bypass attempts
28
+ * where attackers use homographs or invisible characters to create
29
+ * content that appears identical but has a different hash
30
+ *
31
+ * @param content - The content to hash (will be normalized)
32
+ * @returns Hex-encoded hash string
33
+ */
34
+ export declare function generateContentHash(content: string): string;
35
+ /**
36
+ * Verify memory content integrity
37
+ *
38
+ * SECURITY: This function detects:
39
+ * - External tool modifications (didn't use our hash function)
40
+ * - Manual human editing of YAML files
41
+ * - Filesystem corruption
42
+ * - Tampering attempts (including Unicode tricks)
43
+ *
44
+ * @param content - The content to verify (will be normalized)
45
+ * @param expectedHash - The expected hash value
46
+ * @returns True if content matches hash after normalization
47
+ */
48
+ export declare function verifyContentIntegrity(content: string, expectedHash: string): boolean;
49
+ /**
50
+ * Calculate shard key for memory distribution
51
+ * Used for distributing memories across multiple files
52
+ *
53
+ * SECURITY: Normalizes input to ensure consistent sharding
54
+ * regardless of Unicode representation
55
+ *
56
+ * @param memoryId - The memory ID (will be normalized)
57
+ * @param shardCount - Number of shards (default 16)
58
+ * @returns Shard index (0 to shardCount-1)
59
+ */
60
+ export declare function calculateShardKey(memoryId: string, shardCount?: number): number;
61
+ /**
62
+ * Parse memory ID to extract timestamp
63
+ *
64
+ * @param memoryId - The memory ID to parse
65
+ * @returns Timestamp or null if invalid format
66
+ */
67
+ export declare function parseMemoryTimestamp(memoryId: string): number | null;
68
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmB3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAgBrF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,MAAM,CAoB3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Utility functions for Memory element operations
3
+ *
4
+ * PERFORMANCE CONSIDERATIONS:
5
+ * - ID generation should be fast (<1ms)
6
+ * - Hash functions optimized for memory verification
7
+ * - Index operations designed for O(log n) complexity
8
+ *
9
+ * SECURITY CONSIDERATIONS:
10
+ * - Hash functions normalize Unicode to prevent bypass attempts
11
+ * - Content verification detects external modifications
12
+ * - Protects against manual editing and tampering
13
+ */
14
+ import * as crypto from 'crypto';
15
+ import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
16
+ import { SecurityMonitor } from '../../security/securityMonitor.js';
17
+ import { MEMORY_SECURITY_EVENTS } from './constants.js';
18
+ /**
19
+ * Generate a unique ID for memory entries
20
+ * Format: mem_{timestamp}_{random}
21
+ *
22
+ * @returns Unique memory entry ID
23
+ * @example
24
+ * generateMemoryId() // "mem_1699234567890_x7k2n9p4m"
25
+ */
26
+ export function generateMemoryId() {
27
+ const timestamp = Date.now();
28
+ const random = Math.random().toString(36).substr(2, 9);
29
+ return `mem_${timestamp}_${random}`;
30
+ }
31
+ /**
32
+ * Generate a content hash for memory integrity verification
33
+ * Uses SHA-256 for cryptographic strength with Unicode normalization
34
+ *
35
+ * SECURITY: Normalizes content to prevent Unicode-based bypass attempts
36
+ * where attackers use homographs or invisible characters to create
37
+ * content that appears identical but has a different hash
38
+ *
39
+ * @param content - The content to hash (will be normalized)
40
+ * @returns Hex-encoded hash string
41
+ */
42
+ export function generateContentHash(content) {
43
+ // SECURITY FIX: Normalize Unicode to prevent homograph attacks
44
+ // This ensures consistent hashing regardless of Unicode representation
45
+ const normalized = UnicodeValidator.normalize(content);
46
+ if (!normalized.isValid && normalized.detectedIssues) {
47
+ // Log potential security issue but still generate hash
48
+ // We want to detect the tampering, not reject it silently
49
+ SecurityMonitor.logSecurityEvent({
50
+ type: MEMORY_SECURITY_EVENTS.MEMORY_UNICODE_VALIDATION_FAILED,
51
+ severity: 'MEDIUM',
52
+ source: 'generateContentHash',
53
+ details: `Unicode security issues detected: ${normalized.detectedIssues.join(', ')}`
54
+ });
55
+ }
56
+ return crypto.createHash('sha256')
57
+ .update(normalized.normalizedContent)
58
+ .digest('hex');
59
+ }
60
+ /**
61
+ * Verify memory content integrity
62
+ *
63
+ * SECURITY: This function detects:
64
+ * - External tool modifications (didn't use our hash function)
65
+ * - Manual human editing of YAML files
66
+ * - Filesystem corruption
67
+ * - Tampering attempts (including Unicode tricks)
68
+ *
69
+ * @param content - The content to verify (will be normalized)
70
+ * @param expectedHash - The expected hash value
71
+ * @returns True if content matches hash after normalization
72
+ */
73
+ export function verifyContentIntegrity(content, expectedHash) {
74
+ const actualHash = generateContentHash(content);
75
+ const isValid = actualHash === expectedHash;
76
+ if (!isValid) {
77
+ // SECURITY: Log integrity violation for audit trail
78
+ // This could indicate external modification or tampering
79
+ SecurityMonitor.logSecurityEvent({
80
+ type: MEMORY_SECURITY_EVENTS.MEMORY_INTEGRITY_VIOLATION,
81
+ severity: 'HIGH',
82
+ source: 'verifyContentIntegrity',
83
+ details: `Hash mismatch detected. Expected: ${expectedHash.substring(0, 8)}..., Got: ${actualHash.substring(0, 8)}...`
84
+ });
85
+ }
86
+ return isValid;
87
+ }
88
+ /**
89
+ * Calculate shard key for memory distribution
90
+ * Used for distributing memories across multiple files
91
+ *
92
+ * SECURITY: Normalizes input to ensure consistent sharding
93
+ * regardless of Unicode representation
94
+ *
95
+ * @param memoryId - The memory ID (will be normalized)
96
+ * @param shardCount - Number of shards (default 16)
97
+ * @returns Shard index (0 to shardCount-1)
98
+ */
99
+ export function calculateShardKey(memoryId, shardCount = 16) {
100
+ // SECURITY FIX: Normalize memoryId to prevent Unicode-based attacks
101
+ // that could cause memories to be placed in unexpected shards
102
+ const normalized = UnicodeValidator.normalize(memoryId);
103
+ if (!normalized.isValid && normalized.detectedIssues) {
104
+ // Log but continue - we still need to calculate a shard
105
+ SecurityMonitor.logSecurityEvent({
106
+ type: MEMORY_SECURITY_EVENTS.MEMORY_UNICODE_VALIDATION_FAILED,
107
+ severity: 'LOW',
108
+ source: 'calculateShardKey',
109
+ details: `Unicode issues in memory ID: ${normalized.detectedIssues.join(', ')}`
110
+ });
111
+ }
112
+ const hash = crypto.createHash('md5')
113
+ .update(normalized.normalizedContent)
114
+ .digest();
115
+ const hashInt = hash.readUInt32BE(0);
116
+ return hashInt % shardCount;
117
+ }
118
+ /**
119
+ * Parse memory ID to extract timestamp
120
+ *
121
+ * @param memoryId - The memory ID to parse
122
+ * @returns Timestamp or null if invalid format
123
+ */
124
+ export function parseMemoryTimestamp(memoryId) {
125
+ const match = memoryId.match(/^mem_(\d+)_/);
126
+ if (match && match[1]) {
127
+ const timestamp = parseInt(match[1], 10);
128
+ return isNaN(timestamp) ? null : timestamp;
129
+ }
130
+ return null;
131
+ }
132
+ // TODO: Future index utilities
133
+ // - createMemoryIndex(): Create B-tree or similar structure for fast lookups
134
+ // - updateIndex(): Update index when memories are added/removed
135
+ // - searchIndex(): O(log n) search through indexed memories
136
+ // - mergeIndices(): Combine multiple index files for distributed search
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvbWVtb3JpZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxPQUFPLFNBQVMsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFlO0lBQ2pELCtEQUErRDtJQUMvRCx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyRCx1REFBdUQ7UUFDdkQsMERBQTBEO1FBQzFELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsZ0NBQWdDO1lBQzdELFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE1BQU0sRUFBRSxxQkFBcUI7WUFDN0IsT0FBTyxFQUFFLHFDQUFxQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtTQUNyRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUMvQixNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1NBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE9BQWUsRUFBRSxZQUFvQjtJQUMxRSxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUssWUFBWSxDQUFDO0lBRTVDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLG9EQUFvRDtRQUNwRCx5REFBeUQ7UUFDekQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQywwQkFBMEI7WUFDdkQsUUFBUSxFQUFFLE1BQU07WUFDaEIsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUscUNBQXFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLO1NBQ3ZILENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLFVBQVUsR0FBRyxFQUFFO0lBQ2pFLG9FQUFvRTtJQUNwRSw4REFBOEQ7SUFDOUQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyRCx3REFBd0Q7UUFDeEQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxnQ0FBZ0M7WUFDN0QsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsbUJBQW1CO1lBQzNCLE9BQU8sRUFBRSxnQ0FBZ0MsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7U0FDaEYsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ2xDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7U0FDcEMsTUFBTSxFQUFFLENBQUM7SUFDWixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sT0FBTyxHQUFHLFVBQVUsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFDbkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM1QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsK0JBQStCO0FBQy9CLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELHdFQUF3RSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIE1lbW9yeSBlbGVtZW50IG9wZXJhdGlvbnNcbiAqXG4gKiBQRVJGT1JNQU5DRSBDT05TSURFUkFUSU9OUzpcbiAqIC0gSUQgZ2VuZXJhdGlvbiBzaG91bGQgYmUgZmFzdCAoPDFtcylcbiAqIC0gSGFzaCBmdW5jdGlvbnMgb3B0aW1pemVkIGZvciBtZW1vcnkgdmVyaWZpY2F0aW9uXG4gKiAtIEluZGV4IG9wZXJhdGlvbnMgZGVzaWduZWQgZm9yIE8obG9nIG4pIGNvbXBsZXhpdHlcbiAqXG4gKiBTRUNVUklUWSBDT05TSURFUkFUSU9OUzpcbiAqIC0gSGFzaCBmdW5jdGlvbnMgbm9ybWFsaXplIFVuaWNvZGUgdG8gcHJldmVudCBieXBhc3MgYXR0ZW1wdHNcbiAqIC0gQ29udGVudCB2ZXJpZmljYXRpb24gZGV0ZWN0cyBleHRlcm5hbCBtb2RpZmljYXRpb25zXG4gKiAtIFByb3RlY3RzIGFnYWluc3QgbWFudWFsIGVkaXRpbmcgYW5kIHRhbXBlcmluZ1xuICovXG5cbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgbWVtb3J5IGVudHJpZXNcbiAqIEZvcm1hdDogbWVtX3t0aW1lc3RhbXB9X3tyYW5kb219XG4gKlxuICogQHJldHVybnMgVW5pcXVlIG1lbW9yeSBlbnRyeSBJRFxuICogQGV4YW1wbGVcbiAqIGdlbmVyYXRlTWVtb3J5SWQoKSAvLyBcIm1lbV8xNjk5MjM0NTY3ODkwX3g3azJuOXA0bVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1lbW9yeUlkKCk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgcmV0dXJuIGBtZW1fJHt0aW1lc3RhbXB9XyR7cmFuZG9tfWA7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBjb250ZW50IGhhc2ggZm9yIG1lbW9yeSBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gKiBVc2VzIFNIQS0yNTYgZm9yIGNyeXB0b2dyYXBoaWMgc3RyZW5ndGggd2l0aCBVbmljb2RlIG5vcm1hbGl6YXRpb25cbiAqXG4gKiBTRUNVUklUWTogTm9ybWFsaXplcyBjb250ZW50IHRvIHByZXZlbnQgVW5pY29kZS1iYXNlZCBieXBhc3MgYXR0ZW1wdHNcbiAqIHdoZXJlIGF0dGFja2VycyB1c2UgaG9tb2dyYXBocyBvciBpbnZpc2libGUgY2hhcmFjdGVycyB0byBjcmVhdGVcbiAqIGNvbnRlbnQgdGhhdCBhcHBlYXJzIGlkZW50aWNhbCBidXQgaGFzIGEgZGlmZmVyZW50IGhhc2hcbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGhhc2ggKHdpbGwgYmUgbm9ybWFsaXplZClcbiAqIEByZXR1cm5zIEhleC1lbmNvZGVkIGhhc2ggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvbnRlbnRIYXNoKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFNFQ1VSSVRZIEZJWDogTm9ybWFsaXplIFVuaWNvZGUgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrc1xuICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCBoYXNoaW5nIHJlZ2FyZGxlc3Mgb2YgVW5pY29kZSByZXByZXNlbnRhdGlvblxuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCk7XG5cbiAgaWYgKCFub3JtYWxpemVkLmlzVmFsaWQgJiYgbm9ybWFsaXplZC5kZXRlY3RlZElzc3Vlcykge1xuICAgIC8vIExvZyBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWUgYnV0IHN0aWxsIGdlbmVyYXRlIGhhc2hcbiAgICAvLyBXZSB3YW50IHRvIGRldGVjdCB0aGUgdGFtcGVyaW5nLCBub3QgcmVqZWN0IGl0IHNpbGVudGx5XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfVU5JQ09ERV9WQUxJREFUSU9OX0ZBSUxFRCxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ2dlbmVyYXRlQ29udGVudEhhc2gnLFxuICAgICAgZGV0YWlsczogYFVuaWNvZGUgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkOiAke25vcm1hbGl6ZWQuZGV0ZWN0ZWRJc3N1ZXMuam9pbignLCAnKX1gXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgLnVwZGF0ZShub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50KVxuICAgIC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIFZlcmlmeSBtZW1vcnkgY29udGVudCBpbnRlZ3JpdHlcbiAqXG4gKiBTRUNVUklUWTogVGhpcyBmdW5jdGlvbiBkZXRlY3RzOlxuICogLSBFeHRlcm5hbCB0b29sIG1vZGlmaWNhdGlvbnMgKGRpZG4ndCB1c2Ugb3VyIGhhc2ggZnVuY3Rpb24pXG4gKiAtIE1hbnVhbCBodW1hbiBlZGl0aW5nIG9mIFlBTUwgZmlsZXNcbiAqIC0gRmlsZXN5c3RlbSBjb3JydXB0aW9uXG4gKiAtIFRhbXBlcmluZyBhdHRlbXB0cyAoaW5jbHVkaW5nIFVuaWNvZGUgdHJpY2tzKVxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgdG8gdmVyaWZ5ICh3aWxsIGJlIG5vcm1hbGl6ZWQpXG4gKiBAcGFyYW0gZXhwZWN0ZWRIYXNoIC0gVGhlIGV4cGVjdGVkIGhhc2ggdmFsdWVcbiAqIEByZXR1cm5zIFRydWUgaWYgY29udGVudCBtYXRjaGVzIGhhc2ggYWZ0ZXIgbm9ybWFsaXphdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5Q29udGVudEludGVncml0eShjb250ZW50OiBzdHJpbmcsIGV4cGVjdGVkSGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFjdHVhbEhhc2ggPSBnZW5lcmF0ZUNvbnRlbnRIYXNoKGNvbnRlbnQpO1xuICBjb25zdCBpc1ZhbGlkID0gYWN0dWFsSGFzaCA9PT0gZXhwZWN0ZWRIYXNoO1xuXG4gIGlmICghaXNWYWxpZCkge1xuICAgIC8vIFNFQ1VSSVRZOiBMb2cgaW50ZWdyaXR5IHZpb2xhdGlvbiBmb3IgYXVkaXQgdHJhaWxcbiAgICAvLyBUaGlzIGNvdWxkIGluZGljYXRlIGV4dGVybmFsIG1vZGlmaWNhdGlvbiBvciB0YW1wZXJpbmdcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9JTlRFR1JJVFlfVklPTEFUSU9OLFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ3ZlcmlmeUNvbnRlbnRJbnRlZ3JpdHknLFxuICAgICAgZGV0YWlsczogYEhhc2ggbWlzbWF0Y2ggZGV0ZWN0ZWQuIEV4cGVjdGVkOiAke2V4cGVjdGVkSGFzaC5zdWJzdHJpbmcoMCwgOCl9Li4uLCBHb3Q6ICR7YWN0dWFsSGFzaC5zdWJzdHJpbmcoMCwgOCl9Li4uYFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGlzVmFsaWQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHNoYXJkIGtleSBmb3IgbWVtb3J5IGRpc3RyaWJ1dGlvblxuICogVXNlZCBmb3IgZGlzdHJpYnV0aW5nIG1lbW9yaWVzIGFjcm9zcyBtdWx0aXBsZSBmaWxlc1xuICpcbiAqIFNFQ1VSSVRZOiBOb3JtYWxpemVzIGlucHV0IHRvIGVuc3VyZSBjb25zaXN0ZW50IHNoYXJkaW5nXG4gKiByZWdhcmRsZXNzIG9mIFVuaWNvZGUgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0gbWVtb3J5SWQgLSBUaGUgbWVtb3J5IElEICh3aWxsIGJlIG5vcm1hbGl6ZWQpXG4gKiBAcGFyYW0gc2hhcmRDb3VudCAtIE51bWJlciBvZiBzaGFyZHMgKGRlZmF1bHQgMTYpXG4gKiBAcmV0dXJucyBTaGFyZCBpbmRleCAoMCB0byBzaGFyZENvdW50LTEpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFyZEtleShtZW1vcnlJZDogc3RyaW5nLCBzaGFyZENvdW50ID0gMTYpOiBudW1iZXIge1xuICAvLyBTRUNVUklUWSBGSVg6IE5vcm1hbGl6ZSBtZW1vcnlJZCB0byBwcmV2ZW50IFVuaWNvZGUtYmFzZWQgYXR0YWNrc1xuICAvLyB0aGF0IGNvdWxkIGNhdXNlIG1lbW9yaWVzIHRvIGJlIHBsYWNlZCBpbiB1bmV4cGVjdGVkIHNoYXJkc1xuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWVtb3J5SWQpO1xuXG4gIGlmICghbm9ybWFsaXplZC5pc1ZhbGlkICYmIG5vcm1hbGl6ZWQuZGV0ZWN0ZWRJc3N1ZXMpIHtcbiAgICAvLyBMb2cgYnV0IGNvbnRpbnVlIC0gd2Ugc3RpbGwgbmVlZCB0byBjYWxjdWxhdGUgYSBzaGFyZFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1VOSUNPREVfVkFMSURBVElPTl9GQUlMRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdjYWxjdWxhdGVTaGFyZEtleScsXG4gICAgICBkZXRhaWxzOiBgVW5pY29kZSBpc3N1ZXMgaW4gbWVtb3J5IElEOiAke25vcm1hbGl6ZWQuZGV0ZWN0ZWRJc3N1ZXMuam9pbignLCAnKX1gXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgLnVwZGF0ZShub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50KVxuICAgIC5kaWdlc3QoKTtcbiAgY29uc3QgaGFzaEludCA9IGhhc2gucmVhZFVJbnQzMkJFKDApO1xuICByZXR1cm4gaGFzaEludCAlIHNoYXJkQ291bnQ7XG59XG5cbi8qKlxuICogUGFyc2UgbWVtb3J5IElEIHRvIGV4dHJhY3QgdGltZXN0YW1wXG4gKlxuICogQHBhcmFtIG1lbW9yeUlkIC0gVGhlIG1lbW9yeSBJRCB0byBwYXJzZVxuICogQHJldHVybnMgVGltZXN0YW1wIG9yIG51bGwgaWYgaW52YWxpZCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVtb3J5VGltZXN0YW1wKG1lbW9yeUlkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSBtZW1vcnlJZC5tYXRjaCgvXm1lbV8oXFxkKylfLyk7XG4gIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgcmV0dXJuIGlzTmFOKHRpbWVzdGFtcCkgPyBudWxsIDogdGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUT0RPOiBGdXR1cmUgaW5kZXggdXRpbGl0aWVzXG4vLyAtIGNyZWF0ZU1lbW9yeUluZGV4KCk6IENyZWF0ZSBCLXRyZWUgb3Igc2ltaWxhciBzdHJ1Y3R1cmUgZm9yIGZhc3QgbG9va3Vwc1xuLy8gLSB1cGRhdGVJbmRleCgpOiBVcGRhdGUgaW5kZXggd2hlbiBtZW1vcmllcyBhcmUgYWRkZWQvcmVtb3ZlZFxuLy8gLSBzZWFyY2hJbmRleCgpOiBPKGxvZyBuKSBzZWFyY2ggdGhyb3VnaCBpbmRleGVkIG1lbW9yaWVzXG4vLyAtIG1lcmdlSW5kaWNlcygpOiBDb21iaW5lIG11bHRpcGxlIGluZGV4IGZpbGVzIGZvciBkaXN0cmlidXRlZCBzZWFyY2giXX0=
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "1.8.0";
6
- export declare const BUILD_TIMESTAMP = "2025-09-15T17:34:06.605Z";
5
+ export declare const PACKAGE_VERSION = "1.9.0";
6
+ export declare const BUILD_TIMESTAMP = "2025-09-19T14:39:55.094Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '1.8.0';
6
- export const BUILD_TIMESTAMP = '2025-09-15T17:34:06.605Z';
5
+ export const PACKAGE_VERSION = '1.9.0';
6
+ export const BUILD_TIMESTAMP = '2025-09-19T14:39:55.094Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjguMCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMTVUMTc6MzQ6MDYuNjA1Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjkuMCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMTlUMTQ6Mzk6NTUuMDk0Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Standalone script to run the configuration wizard
5
+ * Can be used for testing or manual configuration
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runConfigWizard = main;
9
+ const ConfigManager_js_1 = require("../src/config/ConfigManager.js");
10
+ const ConfigWizard_js_1 = require("../src/config/ConfigWizard.js");
11
+ const chalk_1 = require("chalk");
12
+ async function main() {
13
+ try {
14
+ // Initialize config manager
15
+ const configManager = ConfigManager_js_1.ConfigManager.getInstance();
16
+ await configManager.initialize();
17
+ // Create and run wizard
18
+ const wizard = new ConfigWizard_js_1.ConfigWizard(configManager);
19
+ // Check if we should force run (for testing)
20
+ const forceRun = process.argv.includes('--force');
21
+ if (forceRun || await wizard.shouldRunWizard()) {
22
+ const choice = await wizard.promptInitial();
23
+ if (choice === 'yes') {
24
+ await wizard.runWizard();
25
+ }
26
+ else if (choice === 'never') {
27
+ await wizard.markDismissed();
28
+ console.log(chalk_1.default.gray('\nWizard dismissed. You can run it manually anytime.\n'));
29
+ }
30
+ else {
31
+ console.log(chalk_1.default.gray('\nSkipped for now. The wizard will ask again next time.\n'));
32
+ }
33
+ }
34
+ else {
35
+ const config = configManager.getConfig();
36
+ if (config.wizard?.completed) {
37
+ console.log(chalk_1.default.green('\n✅ Configuration wizard already completed.'));
38
+ console.log(chalk_1.default.gray('Use --force to run it again.\n'));
39
+ }
40
+ else if (config.wizard?.dismissed) {
41
+ console.log(chalk_1.default.yellow('\n⚠️ Configuration wizard was previously dismissed.'));
42
+ console.log(chalk_1.default.gray('Use --force to run it anyway.\n'));
43
+ }
44
+ }
45
+ // Clean up
46
+ wizard.close();
47
+ process.exit(0);
48
+ }
49
+ catch (error) {
50
+ console.error(chalk_1.default.red('\n❌ Error running configuration wizard:'), error);
51
+ process.exit(1);
52
+ }
53
+ }
54
+ // Run if called directly
55
+ if (import.meta.url === `file://${process.argv[1]}`) {
56
+ main();
57
+ }