@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.
- package/CHANGELOG.md +118 -0
- package/README.github.md +126 -8
- package/README.md +1 -1
- package/README.md.backup +50 -795
- package/README.npm.md +1 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +6 -5
- package/dist/config/ConfigWizardDisplay.d.ts +64 -0
- package/dist/config/ConfigWizardDisplay.d.ts.map +1 -0
- package/dist/config/ConfigWizardDisplay.js +150 -0
- package/dist/config/WizardFirstResponse.d.ts +25 -0
- package/dist/config/WizardFirstResponse.d.ts.map +1 -0
- package/dist/config/WizardFirstResponse.js +118 -0
- package/dist/elements/memories/Memory.d.ts +190 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -0
- package/dist/elements/memories/Memory.js +627 -0
- package/dist/elements/memories/MemoryManager.d.ts +136 -0
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
- package/dist/elements/memories/MemoryManager.js +607 -0
- package/dist/elements/memories/MemorySearchIndex.d.ts +156 -0
- package/dist/elements/memories/MemorySearchIndex.d.ts.map +1 -0
- package/dist/elements/memories/MemorySearchIndex.js +690 -0
- package/dist/elements/memories/constants.d.ts +95 -0
- package/dist/elements/memories/constants.d.ts.map +1 -0
- package/dist/elements/memories/constants.js +102 -0
- package/dist/elements/memories/index.d.ts +7 -0
- package/dist/elements/memories/index.d.ts.map +1 -0
- package/dist/elements/memories/index.js +7 -0
- package/dist/elements/memories/utils.d.ts +68 -0
- package/dist/elements/memories/utils.d.ts.map +1 -0
- package/dist/elements/memories/utils.js +137 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/scripts/scripts/run-config-wizard.js +57 -0
- package/dist/scripts/src/config/ConfigManager.js +799 -0
- package/dist/scripts/src/config/ConfigWizard.js +368 -0
- package/dist/scripts/src/errors/SecurityError.js +47 -0
- package/dist/scripts/src/security/constants.js +28 -0
- package/dist/scripts/src/security/contentValidator.js +415 -0
- package/dist/scripts/src/security/errors.js +32 -0
- package/dist/scripts/src/security/regexValidator.js +217 -0
- package/dist/scripts/src/security/secureYamlParser.js +272 -0
- package/dist/scripts/src/security/securityMonitor.js +111 -0
- package/dist/scripts/src/security/validators/unicodeValidator.js +315 -0
- package/dist/scripts/src/utils/logger.js +288 -0
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +24 -2
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +91 -1
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/tools/getWelcomeMessage.d.ts +41 -0
- package/dist/tools/getWelcomeMessage.d.ts.map +1 -0
- package/dist/tools/getWelcomeMessage.js +109 -0
- 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.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2025-09-
|
|
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.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2025-09-
|
|
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,
|
|
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
|
+
}
|