@dollhousemcp/mcp-server 2.0.39 → 2.0.41

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 (86) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cache/CollectionCache.d.ts +1 -0
  3. package/dist/cache/CollectionCache.d.ts.map +1 -1
  4. package/dist/cache/CollectionCache.js +7 -16
  5. package/dist/cache/CollectionIndexCache.d.ts +1 -1
  6. package/dist/cache/CollectionIndexCache.d.ts.map +1 -1
  7. package/dist/cache/CollectionIndexCache.js +3 -2
  8. package/dist/cache/cachePaths.d.ts +7 -0
  9. package/dist/cache/cachePaths.d.ts.map +1 -0
  10. package/dist/cache/cachePaths.js +15 -0
  11. package/dist/di/Container.d.ts.map +1 -1
  12. package/dist/di/Container.js +11 -8
  13. package/dist/elements/agents/AgentManager.d.ts +146 -7
  14. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  15. package/dist/elements/agents/AgentManager.js +329 -51
  16. package/dist/elements/base/BaseElementManager.d.ts +18 -2
  17. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  18. package/dist/elements/base/BaseElementManager.js +39 -20
  19. package/dist/elements/memories/Memory.d.ts +7 -0
  20. package/dist/elements/memories/Memory.d.ts.map +1 -1
  21. package/dist/elements/memories/Memory.js +68 -34
  22. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  23. package/dist/elements/memories/MemoryManager.js +10 -2
  24. package/dist/elements/memories/memoryYamlValidation.d.ts +6 -0
  25. package/dist/elements/memories/memoryYamlValidation.d.ts.map +1 -0
  26. package/dist/elements/memories/memoryYamlValidation.js +25 -0
  27. package/dist/generated/version.d.ts +2 -2
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/CollectionHandler.d.ts.map +1 -1
  30. package/dist/handlers/CollectionHandler.js +2 -3
  31. package/dist/handlers/ElementCRUDHandler.d.ts +36 -8
  32. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  33. package/dist/handlers/ElementCRUDHandler.js +227 -96
  34. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -1
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.js +137 -73
  37. package/dist/handlers/mcp-aql/OperationSchema.js +4 -4
  38. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +7 -5
  40. package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
  41. package/dist/handlers/strategies/AgentActivationStrategy.js +5 -2
  42. package/dist/handlers/strategies/ElementActivationStrategy.d.ts +2 -0
  43. package/dist/handlers/strategies/ElementActivationStrategy.d.ts.map +1 -1
  44. package/dist/handlers/strategies/ElementActivationStrategy.js +1 -1
  45. package/dist/index.d.ts +7 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/portfolio/PortfolioManager.d.ts +5 -1
  48. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  49. package/dist/portfolio/PortfolioManager.js +9 -3
  50. package/dist/security/contentValidator.d.ts +9 -1
  51. package/dist/security/contentValidator.d.ts.map +1 -1
  52. package/dist/security/contentValidator.js +24 -3
  53. package/dist/security/secureYamlParser.d.ts +3 -1
  54. package/dist/security/secureYamlParser.d.ts.map +1 -1
  55. package/dist/security/secureYamlParser.js +3 -3
  56. package/dist/security/securityMonitor.d.ts +1 -1
  57. package/dist/security/securityMonitor.d.ts.map +1 -1
  58. package/dist/security/securityMonitor.js +1 -1
  59. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  60. package/dist/security/validation/BackgroundValidator.js +6 -4
  61. package/dist/services/ActivationStore.d.ts +5 -4
  62. package/dist/services/ActivationStore.d.ts.map +1 -1
  63. package/dist/services/ActivationStore.js +35 -9
  64. package/dist/services/PolicyExportService.d.ts +8 -2
  65. package/dist/services/PolicyExportService.d.ts.map +1 -1
  66. package/dist/services/PolicyExportService.js +37 -6
  67. package/dist/storage/ElementStorageLayer.d.ts +3 -3
  68. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  69. package/dist/storage/ElementStorageLayer.js +33 -7
  70. package/dist/storage/IStorageLayer.d.ts +8 -1
  71. package/dist/storage/IStorageLayer.d.ts.map +1 -1
  72. package/dist/storage/IStorageLayer.js +1 -1
  73. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  74. package/dist/storage/MemoryMetadataExtractor.js +7 -2
  75. package/dist/storage/MemoryStorageLayer.d.ts +4 -3
  76. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  77. package/dist/storage/MemoryStorageLayer.js +43 -13
  78. package/dist/storage/types.d.ts +7 -0
  79. package/dist/storage/types.d.ts.map +1 -1
  80. package/dist/storage/types.js +17 -2
  81. package/dist/utils/filesystem.d.ts +6 -0
  82. package/dist/utils/filesystem.d.ts.map +1 -1
  83. package/dist/utils/filesystem.js +22 -1
  84. package/oauth-helper.mjs +19 -26
  85. package/package.json +9 -9
  86. package/server.json +2 -2
@@ -62,4 +62,11 @@ export interface ManifestDiffResult {
62
62
  /** Files whose mtime matches the manifest (no change) */
63
63
  unchanged: string[];
64
64
  }
65
+ /**
66
+ * Merge sequential scan results without losing an earlier invalidation when a
67
+ * trailing scan observes the same path as unchanged. Changed categories are
68
+ * intentionally retained as unions; consumers that evict caches must see any
69
+ * modification/removal observed during the freshness window.
70
+ */
71
+ export declare function mergeManifestDiffResults(first: ManifestDiffResult, second: ManifestDiffResult): ManifestDiffResult;
65
72
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAGlB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAGlB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAUpB"}
@@ -4,5 +4,20 @@
4
4
  * Phase 1: Provides lightweight metadata indexing to avoid
5
5
  * full file reads during list() operations.
6
6
  */
7
- export {};
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBsYXllciB0eXBlcyBmb3IgY2FjaGUtYXdhcmUgZWxlbWVudCBsaXN0aW5nLlxuICpcbiAqIFBoYXNlIDE6IFByb3ZpZGVzIGxpZ2h0d2VpZ2h0IG1ldGFkYXRhIGluZGV4aW5nIHRvIGF2b2lkXG4gKiBmdWxsIGZpbGUgcmVhZHMgZHVyaW5nIGxpc3QoKSBvcGVyYXRpb25zLlxuICovXG5cbi8qKlxuICogRmlsZXN5c3RlbSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgc3RvcmFnZSBpdGVtLlxuICogUmV0dXJuZWQgYnkgc3RhdCBvcGVyYXRpb25zIG9uIHRoZSBzdG9yYWdlIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUl0ZW1NZXRhZGF0YSB7XG4gIC8qKiBQYXRoIHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50IGRpcmVjdG9yeSAqL1xuICByZWxhdGl2ZVBhdGg6IHN0cmluZztcbiAgLyoqIEZ1bGx5IHJlc29sdmVkIGFic29sdXRlIHBhdGggKi9cbiAgYWJzb2x1dGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAqL1xuICBtdGltZU1zOiBudW1iZXI7XG4gIC8qKiBGaWxlIHNpemUgaW4gYnl0ZXMgKi9cbiAgc2l6ZUJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5kZXhlZCBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgZWxlbWVudC5cbiAqIEV4dHJhY3RlZCBmcm9tIGZyb250bWF0dGVyIHdpdGhvdXQgbG9hZGluZyBmdWxsIGVsZW1lbnQgY29udGVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50SW5kZXhFbnRyeSB7XG4gIC8qKiBSZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgLyoqIEVsZW1lbnQgbmFtZSBmcm9tIGZyb250bWF0dGVyICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEVsZW1lbnQgZGVzY3JpcHRpb24gZnJvbSBmcm9udG1hdHRlciAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogU2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogQXV0aG9yIG5hbWUgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKiBDbGFzc2lmaWNhdGlvbiB0YWdzICovXG4gIHRhZ3M6IHN0cmluZ1tdO1xuICAvKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMgKG1pcnJvcnMgU3RvcmFnZUl0ZW1NZXRhZGF0YS5tdGltZU1zKSAqL1xuICBtdGltZU1zOiBudW1iZXI7XG4gIC8qKiBGaWxlIHNpemUgaW4gYnl0ZXMgKG1pcnJvcnMgU3RvcmFnZUl0ZW1NZXRhZGF0YS5zaXplQnl0ZXMpICovXG4gIHNpemVCeXRlczogbnVtYmVyO1xuXG4gIC8vIFBoYXNlIDI6IG1lbW9yeS1zcGVjaWZpYyBvcHRpb25hbCBmaWVsZHNcbiAgLyoqIFdoZXRoZXIgdGhpcyBtZW1vcnkgc2hvdWxkIGJlIGF1dG8tbG9hZGVkIG9uIHNlcnZlciBzdGFydHVwICovXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjtcbiAgLyoqIExvYWQgcHJpb3JpdHkgKGxvd2VyID0gaGlnaGVyIHByaW9yaXR5KSAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcbiAgLyoqIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uIChzeXN0ZW0sIGFkYXB0ZXIsIHVzZXIpICovXG4gIG1lbW9yeVR5cGU/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWVtb3J5ICovXG4gIHRvdGFsRW50cmllcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZGlmZmluZyBjdXJyZW50IGZpbGVzeXN0ZW0gc3RhdGUgYWdhaW5zdCBhIHN0b3JlZCBtYW5pZmVzdC5cbiAqIEVhY2ggYXJyYXkgY29udGFpbnMgcmVsYXRpdmUgcGF0aHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3REaWZmUmVzdWx0IHtcbiAgLyoqIEZpbGVzIHByZXNlbnQgb24gZGlzayBidXQgbm90IGluIG1hbmlmZXN0IChuZXcgZmlsZXMpICovXG4gIGFkZGVkOiBzdHJpbmdbXTtcbiAgLyoqIEZpbGVzIHdob3NlIG10aW1lIGNoYW5nZWQgc2luY2UgbGFzdCBtYW5pZmVzdCBzbmFwc2hvdCAqL1xuICBtb2RpZmllZDogc3RyaW5nW107XG4gIC8qKiBGaWxlcyBpbiBtYW5pZmVzdCBidXQgbm8gbG9uZ2VyIG9uIGRpc2sgKi9cbiAgcmVtb3ZlZDogc3RyaW5nW107XG4gIC8qKiBGaWxlcyB3aG9zZSBtdGltZSBtYXRjaGVzIHRoZSBtYW5pZmVzdCAobm8gY2hhbmdlKSAqL1xuICB1bmNoYW5nZWQ6IHN0cmluZ1tdO1xufVxuIl19
7
+ /**
8
+ * Merge sequential scan results without losing an earlier invalidation when a
9
+ * trailing scan observes the same path as unchanged. Changed categories are
10
+ * intentionally retained as unions; consumers that evict caches must see any
11
+ * modification/removal observed during the freshness window.
12
+ */
13
+ export function mergeManifestDiffResults(first, second) {
14
+ const unique = (values) => Array.from(new Set(values));
15
+ const added = unique([...first.added, ...second.added]);
16
+ const modified = unique([...first.modified, ...second.modified]);
17
+ const removed = unique([...first.removed, ...second.removed]);
18
+ const changed = new Set([...added, ...modified, ...removed]);
19
+ const unchanged = unique([...first.unchanged, ...second.unchanged])
20
+ .filter((filePath) => !changed.has(filePath));
21
+ return { added, modified, removed, unchanged };
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlFSDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBeUIsRUFDekIsTUFBMEI7SUFFMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFnQixFQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2hFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0b3JhZ2UgbGF5ZXIgdHlwZXMgZm9yIGNhY2hlLWF3YXJlIGVsZW1lbnQgbGlzdGluZy5cbiAqXG4gKiBQaGFzZSAxOiBQcm92aWRlcyBsaWdodHdlaWdodCBtZXRhZGF0YSBpbmRleGluZyB0byBhdm9pZFxuICogZnVsbCBmaWxlIHJlYWRzIGR1cmluZyBsaXN0KCkgb3BlcmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEZpbGVzeXN0ZW0gbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHN0b3JhZ2UgaXRlbS5cbiAqIFJldHVybmVkIGJ5IHN0YXQgb3BlcmF0aW9ucyBvbiB0aGUgc3RvcmFnZSBiYWNrZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VJdGVtTWV0YWRhdGEge1xuICAvKiogUGF0aCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG4gIC8qKiBGdWxseSByZXNvbHZlZCBhYnNvbHV0ZSBwYXRoICovXG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xuICAvKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKi9cbiAgbXRpbWVNczogbnVtYmVyO1xuICAvKiogRmlsZSBzaXplIGluIGJ5dGVzICovXG4gIHNpemVCeXRlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluZGV4ZWQgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIGVsZW1lbnQuXG4gKiBFeHRyYWN0ZWQgZnJvbSBmcm9udG1hdHRlciB3aXRob3V0IGxvYWRpbmcgZnVsbCBlbGVtZW50IGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEluZGV4RW50cnkge1xuICAvKiogUmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5ICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBFbGVtZW50IG5hbWUgZnJvbSBmcm9udG1hdHRlciAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBFbGVtZW50IGRlc2NyaXB0aW9uIGZyb20gZnJvbnRtYXR0ZXIgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFNlbWFudGljIHZlcnNpb24gc3RyaW5nICovXG4gIHZlcnNpb246IHN0cmluZztcbiAgLyoqIEF1dGhvciBuYW1lICovXG4gIGF1dGhvcjogc3RyaW5nO1xuICAvKiogQ2xhc3NpZmljYXRpb24gdGFncyAqL1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgLyoqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtaXJyb3JzIFN0b3JhZ2VJdGVtTWV0YWRhdGEubXRpbWVNcykgKi9cbiAgbXRpbWVNczogbnVtYmVyO1xuICAvKiogRmlsZSBzaXplIGluIGJ5dGVzIChtaXJyb3JzIFN0b3JhZ2VJdGVtTWV0YWRhdGEuc2l6ZUJ5dGVzKSAqL1xuICBzaXplQnl0ZXM6IG51bWJlcjtcblxuICAvLyBQaGFzZSAyOiBtZW1vcnktc3BlY2lmaWMgb3B0aW9uYWwgZmllbGRzXG4gIC8qKiBXaGV0aGVyIHRoaXMgbWVtb3J5IHNob3VsZCBiZSBhdXRvLWxvYWRlZCBvbiBzZXJ2ZXIgc3RhcnR1cCAqL1xuICBhdXRvTG9hZD86IGJvb2xlYW47XG4gIC8qKiBMb2FkIHByaW9yaXR5IChsb3dlciA9IGhpZ2hlciBwcmlvcml0eSkgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgdHlwZSBjbGFzc2lmaWNhdGlvbiAoc3lzdGVtLCBhZGFwdGVyLCB1c2VyKSAqL1xuICBtZW1vcnlUeXBlPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1lbW9yeSAqL1xuICB0b3RhbEVudHJpZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGRpZmZpbmcgY3VycmVudCBmaWxlc3lzdGVtIHN0YXRlIGFnYWluc3QgYSBzdG9yZWQgbWFuaWZlc3QuXG4gKiBFYWNoIGFycmF5IGNvbnRhaW5zIHJlbGF0aXZlIHBhdGhzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0RGlmZlJlc3VsdCB7XG4gIC8qKiBGaWxlcyBwcmVzZW50IG9uIGRpc2sgYnV0IG5vdCBpbiBtYW5pZmVzdCAobmV3IGZpbGVzKSAqL1xuICBhZGRlZDogc3RyaW5nW107XG4gIC8qKiBGaWxlcyB3aG9zZSBtdGltZSBjaGFuZ2VkIHNpbmNlIGxhc3QgbWFuaWZlc3Qgc25hcHNob3QgKi9cbiAgbW9kaWZpZWQ6IHN0cmluZ1tdO1xuICAvKiogRmlsZXMgaW4gbWFuaWZlc3QgYnV0IG5vIGxvbmdlciBvbiBkaXNrICovXG4gIHJlbW92ZWQ6IHN0cmluZ1tdO1xuICAvKiogRmlsZXMgd2hvc2UgbXRpbWUgbWF0Y2hlcyB0aGUgbWFuaWZlc3QgKG5vIGNoYW5nZSkgKi9cbiAgdW5jaGFuZ2VkOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZXF1ZW50aWFsIHNjYW4gcmVzdWx0cyB3aXRob3V0IGxvc2luZyBhbiBlYXJsaWVyIGludmFsaWRhdGlvbiB3aGVuIGFcbiAqIHRyYWlsaW5nIHNjYW4gb2JzZXJ2ZXMgdGhlIHNhbWUgcGF0aCBhcyB1bmNoYW5nZWQuIENoYW5nZWQgY2F0ZWdvcmllcyBhcmVcbiAqIGludGVudGlvbmFsbHkgcmV0YWluZWQgYXMgdW5pb25zOyBjb25zdW1lcnMgdGhhdCBldmljdCBjYWNoZXMgbXVzdCBzZWUgYW55XG4gKiBtb2RpZmljYXRpb24vcmVtb3ZhbCBvYnNlcnZlZCBkdXJpbmcgdGhlIGZyZXNobmVzcyB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU1hbmlmZXN0RGlmZlJlc3VsdHMoXG4gIGZpcnN0OiBNYW5pZmVzdERpZmZSZXN1bHQsXG4gIHNlY29uZDogTWFuaWZlc3REaWZmUmVzdWx0LFxuKTogTWFuaWZlc3REaWZmUmVzdWx0IHtcbiAgY29uc3QgdW5pcXVlID0gKHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSk7XG4gIGNvbnN0IGFkZGVkID0gdW5pcXVlKFsuLi5maXJzdC5hZGRlZCwgLi4uc2Vjb25kLmFkZGVkXSk7XG4gIGNvbnN0IG1vZGlmaWVkID0gdW5pcXVlKFsuLi5maXJzdC5tb2RpZmllZCwgLi4uc2Vjb25kLm1vZGlmaWVkXSk7XG4gIGNvbnN0IHJlbW92ZWQgPSB1bmlxdWUoWy4uLmZpcnN0LnJlbW92ZWQsIC4uLnNlY29uZC5yZW1vdmVkXSk7XG4gIGNvbnN0IGNoYW5nZWQgPSBuZXcgU2V0KFsuLi5hZGRlZCwgLi4ubW9kaWZpZWQsIC4uLnJlbW92ZWRdKTtcbiAgY29uc3QgdW5jaGFuZ2VkID0gdW5pcXVlKFsuLi5maXJzdC51bmNoYW5nZWQsIC4uLnNlY29uZC51bmNoYW5nZWRdKVxuICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiAhY2hhbmdlZC5oYXMoZmlsZVBhdGgpKTtcblxuICByZXR1cm4geyBhZGRlZCwgbW9kaWZpZWQsIHJlbW92ZWQsIHVuY2hhbmdlZCB9O1xufVxuIl19
@@ -5,6 +5,12 @@
5
5
  * Generate an anonymous ID for users without identity
6
6
  */
7
7
  export declare function generateAnonymousId(): string;
8
+ /**
9
+ * Normalize an element name to the canonical filename identity used by managers.
10
+ */
11
+ export declare function normalizeElementFilename(name: string): string;
12
+ /** Canonical non-empty identity used for element files and related runtime maps. */
13
+ export declare function normalizeElementStorageIdentity(name: string): string;
8
14
  export declare function generateUniqueId(personaName: string, author?: string): string;
9
15
  /**
10
16
  * Convert text to URL-safe slug
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAQD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB7E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B5C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF"}
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAQD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe7D;AAED,oFAAoF;AACpF,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB7E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B5C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF"}
@@ -29,6 +29,27 @@ export function generateAnonymousId() {
29
29
  */
30
30
  // Pre-compiled regex for better performance (avoids creating regex on each character)
31
31
  const ALPHANUMERIC_REGEX = /[a-z0-9]/;
32
+ /**
33
+ * Normalize an element name to the canonical filename identity used by managers.
34
+ */
35
+ export function normalizeElementFilename(name) {
36
+ if (!name || name.trim().length === 0) {
37
+ return 'unnamed';
38
+ }
39
+ const normalized = name
40
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
41
+ .replace(/[\s_]+/g, '-')
42
+ .toLowerCase()
43
+ .replace(/[^a-z0-9-]/g, '-')
44
+ .replace(/-+/g, '-');
45
+ const start = normalized.startsWith('-') ? 1 : 0;
46
+ const end = normalized.endsWith('-') ? -1 : undefined;
47
+ return normalized.slice(start, end);
48
+ }
49
+ /** Canonical non-empty identity used for element files and related runtime maps. */
50
+ export function normalizeElementStorageIdentity(name) {
51
+ return normalizeElementFilename(name) || 'unnamed';
52
+ }
32
53
  export function generateUniqueId(personaName, author) {
33
54
  const now = new Date();
34
55
  const dateStr = now.toISOString().slice(0, 10).replaceAll('-', '');
@@ -114,4 +135,4 @@ export async function createBackup(sourcePath, backupPath) {
114
135
  // Copy directory recursively
115
136
  await fs.cp(sourcePath, backupPath, { recursive: true });
116
137
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBMEIscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsMERBQTBEO0FBQzFELElBQUkscUJBQXFCLEdBQWtDLElBQUksQ0FBQztBQUVoRSxTQUFTLHdCQUF3QjtJQUMvQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQztBQUMvQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FB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QyxJQUFJLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsVUFBa0IsRUFBRSxVQUFrQjtJQUN2RSxpQ0FBaUM7SUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVqQyw2QkFBNkI7SUFDN0IsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaWxlc3lzdGVtIGFuZCBzdHJpbmcgbWFuaXB1bGF0aW9uIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBBREpFQ1RJVkVTLCBBTklNQUxTIH0gZnJvbSAnLi4vY29uZmlnL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcblxuLy8gU2luZ2xldG9uIGZpbGUgb3BlcmF0aW9ucyBzZXJ2aWNlIGZvciB1dGlsaXR5IGZ1bmN0aW9uc1xubGV0IGZpbGVPcGVyYXRpb25zU2VydmljZTogSUZpbGVPcGVyYXRpb25zU2VydmljZSB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRGaWxlT3BlcmF0aW9uc1NlcnZpY2UoKTogSUZpbGVPcGVyYXRpb25zU2VydmljZSB7XG4gIGlmICghZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKSB7XG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlID0gbmV3IEZpbGVPcGVyYXRpb25zU2VydmljZShuZXcgRmlsZUxvY2tNYW5hZ2VyKCkpO1xuICB9XG4gIHJldHVybiBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gYW5vbnltb3VzIElEIGZvciB1c2VycyB3aXRob3V0IGlkZW50aXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGFkamVjdGl2ZSA9IEFESkVDVElWRVNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogQURKRUNUSVZFUy5sZW5ndGgpXTtcbiAgY29uc3QgYW5pbWFsID0gQU5JTUFMU1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBBTklNQUxTLmxlbmd0aCldO1xuICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNik7XG4gIHJldHVybiBgYW5vbi0ke2FkamVjdGl2ZX0tJHthbmltYWx9LSR7cmFuZG9tfWA7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIHBlcnNvbmFzXG4gKi9cbi8vIFByZS1jb21waWxlZCByZWdleCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIChhdm9pZHMgY3JlYXRpbmcgcmVnZXggb24gZWFjaCBjaGFyYWN0ZXIpXG5jb25zdCBBTFBIQU5VTUVSSUNfUkVHRVggPSAvW2EtejAtOV0vO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVVbmlxdWVJZChwZXJzb25hTmFtZTogc3RyaW5nLCBhdXRob3I/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBkYXRlU3RyID0gbm93LnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLnJlcGxhY2VBbGwoJy0nLCAnJyk7XG4gIGNvbnN0IHRpbWVTdHIgPSBub3cudG9UaW1lU3RyaW5nKCkuc2xpY2UoMCwgOCkucmVwbGFjZUFsbCgnOicsICcnKTtcbiAgLy8gSXNzdWUgIzg0ODogQWRkIG1pbGxpc2Vjb25kcyArIHJhbmRvbSBzdWZmaXggZm9yIHN1Yi1zZWNvbmQgdW5pcXVlbmVzcy5cbiAgLy8gQ3JpdGljYWwgZm9yIGNvcHktb24td3JpdGUsIHN3YXJtIG9wZXJhdGlvbnMsIGFuZCByYXBpZCBwcm9ncmFtbWF0aWMgY3JlYXRpb24uXG4gIGNvbnN0IG1zU3RyID0gbm93LmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKTtcbiAgY29uc3QgcmFuZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA2KTtcbiAgLy8gU0VDVVJJVFkgRklYOiBQcmV2ZW50IFJlRG9TIGJ5IHVzaW5nIGEgc2luZ2xlLXBhc3MgYXBwcm9hY2hcbiAgLy8gUHJldmlvdXNseTogTXVsdGlwbGUgcmVwbGFjZSgpIG9wZXJhdGlvbnMgd2l0aCB1bmJvdW5kZWQgcXVhbnRpZmllcnMgY291bGQgY2F1c2UgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nXG4gIC8vIE5vdzogU2luZ2xlLXBhc3MgdHJhbnNmb3JtYXRpb24gd2l0aCBidWlsdC1pbiBsZW5ndGggbGltaXRcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBlcnNvbmFOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNhbml0aXplZE5hbWUgPSBub3JtYWxpemVkXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoY2hhciA9PiBBTFBIQU5VTUVSSUNfUkVHRVgudGVzdChjaGFyKSA/IGNoYXIgOiAnLScpXG4gICAgLmpvaW4oJycpXG4gICAgLnN1YnN0cmluZygwLCAxMDApIC8vIExpbWl0IGFmdGVyIHRyYW5zZm9ybWF0aW9uIHRvIHByZXNlcnZlIHN0cnVjdHVyZVxuICAgIC5yZXBsYWNlQWxsKC8oXi0rKXwoLSskKS9nLCAnJykgLy8gT25seSB0cmltIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuc1xuICAgIC5yZXBsYWNlQWxsKC8tezIsfS9nLCAnLScpOyAvLyBDb2xsYXBzZSBtdWx0aXBsZSBoeXBoZW5zXG4gIGNvbnN0IHdob01hZGVJdCA9IGF1dGhvciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG5cbiAgcmV0dXJuIGAke3Nhbml0aXplZE5hbWV9XyR7ZGF0ZVN0cn0tJHt0aW1lU3RyfSR7bXNTdHJ9LSR7cmFuZH1fJHt3aG9NYWRlSXR9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRleHQgdG8gVVJMLXNhZmUgc2x1Z1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTRUNVUklUWSBGSVg6IFByZXZlbnQgUmVEb1MgYnkgdXNpbmcgYSBzaW5nbGUtcGFzcyBhcHByb2FjaFxuICAvLyBQcmV2aW91c2x5OiBNdWx0aXBsZSByZXBsYWNlKCkgb3BlcmF0aW9ucyB3aXRoIHVuYm91bmRlZCBxdWFudGlmaWVycyBjb3VsZCBjYXVzZSBleHBvbmVudGlhbCBiYWNrdHJhY2tpbmdcbiAgLy8gTm93OiBTaW5nbGUtcGFzcyB0cmFuc2Zvcm1hdGlvbiB3aXRoIGJ1aWx0LWluIGxlbmd0aCBsaW1pdFxuICBjb25zdCBub3JtYWxpemVkID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCB0cmFuc2Zvcm1lZCA9IG5vcm1hbGl6ZWRcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChjaGFyID0+IEFMUEhBTlVNRVJJQ19SRUdFWC50ZXN0KGNoYXIpID8gY2hhciA6ICctJylcbiAgICAuam9pbignJyk7XG4gIFxuICAvLyBTRUNVUklUWSBGSVg6IEF2b2lkIHBvbHlub21pYWwgcmVnZXggYnkgdXNpbmcgc2VwYXJhdGUgb3BlcmF0aW9uc1xuICAvLyBUcmltIGxlYWRpbmcgaHlwaGVuc1xuICBsZXQgc3RhcnQgPSAwO1xuICB3aGlsZSAoc3RhcnQgPCB0cmFuc2Zvcm1lZC5sZW5ndGggJiYgdHJhbnNmb3JtZWRbc3RhcnRdID09PSAnLScpIHtcbiAgICBzdGFydCsrO1xuICB9XG4gIFxuICAvLyBUcmltIHRyYWlsaW5nIGh5cGhlbnNcbiAgbGV0IGVuZCA9IHRyYW5zZm9ybWVkLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChlbmQgPj0gc3RhcnQgJiYgdHJhbnNmb3JtZWRbZW5kXSA9PT0gJy0nKSB7XG4gICAgZW5kLS07XG4gIH1cbiAgXG4gIC8vIEV4dHJhY3QgdGhlIHRyaW1tZWQgcG9ydGlvbiBhbmQgY29sbGFwc2UgbXVsdGlwbGUgaHlwaGVuc1xuICBjb25zdCB0cmltbWVkID0gdHJhbnNmb3JtZWQuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICByZXR1cm4gdHJpbW1lZC5yZXBsYWNlQWxsKC8tezIsfS9nLCAnLScpOyAvLyBUaGlzIGlzIHNhZmUgYXMgaXQncyBsaW5lYXJcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBkaXJlY3RvcnkgZXhpc3RzLCBjcmVhdGUgaWYgaXQgZG9lc24ndFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlT3BzID0gZ2V0RmlsZU9wZXJhdGlvbnNTZXJ2aWNlKCk7XG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZpbGVPcHMuZXhpc3RzKGRpclBhdGgpO1xuXG4gIGlmICghZXhpc3RzKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBkaXJlY3Rvcnk6ICR7ZGlyUGF0aH1gKTtcbiAgICBhd2FpdCBmaWxlT3BzLmNyZWF0ZURpcmVjdG9yeShkaXJQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgZmlsZSBleGlzdHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlT3BzID0gZ2V0RmlsZU9wZXJhdGlvbnNTZXJ2aWNlKCk7XG4gIHJldHVybiBmaWxlT3BzLmV4aXN0cyhmaWxlUGF0aCk7XG59XG5cbi8qKlxuICogR2V0IGZpbGUgc2l6ZSBpbiBieXRlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVNpemUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZpbGVPcHMgPSBnZXRGaWxlT3BlcmF0aW9uc1NlcnZpY2UoKTtcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmaWxlT3BzLnN0YXQoZmlsZVBhdGgpO1xuICByZXR1cm4gc3RhdHMuc2l6ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAgb2YgYSBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhY2t1cChzb3VyY2VQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFbnN1cmUgYmFja3VwIGRpcmVjdG9yeSBleGlzdHNcbiAgY29uc3QgYmFja3VwRGlyID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoYmFja3VwRGlyKTtcbiAgXG4gIC8vIENvcHkgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5XG4gIGF3YWl0IGZzLmNwKHNvdXJjZVBhdGgsIGJhY2t1cFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufSJdfQ==
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBMEIscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsMERBQTBEO0FBQzFELElBQUkscUJBQXFCLEdBQWtDLElBQUksQ0FBQztBQUVoRSxTQUFTLHdCQUF3QjtJQUMvQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQztBQUMvQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FB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O0lBRWpDLDZCQUE2QjtJQUM3QixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGVzeXN0ZW0gYW5kIHN0cmluZyBtYW5pcHVsYXRpb24gdXRpbGl0aWVzXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFESkVDVElWRVMsIEFOSU1BTFMgfSBmcm9tICcuLi9jb25maWcvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UsIEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuXG4vLyBTaW5nbGV0b24gZmlsZSBvcGVyYXRpb25zIHNlcnZpY2UgZm9yIHV0aWxpdHkgZnVuY3Rpb25zXG5sZXQgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldEZpbGVPcGVyYXRpb25zU2VydmljZSgpOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcbiAgaWYgKCFmaWxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2UgPSBuZXcgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKG5ldyBGaWxlTG9ja01hbmFnZXIoKSk7XG4gIH1cbiAgcmV0dXJuIGZpbGVPcGVyYXRpb25zU2VydmljZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhbm9ueW1vdXMgSUQgZm9yIHVzZXJzIHdpdGhvdXQgaWRlbnRpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgY29uc3QgYWRqZWN0aXZlID0gQURKRUNUSVZFU1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBBREpFQ1RJVkVTLmxlbmd0aCldO1xuICBjb25zdCBhbmltYWwgPSBBTklNQUxTW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIEFOSU1BTFMubGVuZ3RoKV07XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA2KTtcbiAgcmV0dXJuIGBhbm9uLSR7YWRqZWN0aXZlfS0ke2FuaW1hbH0tJHtyYW5kb219YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgcGVyc29uYXNcbiAqL1xuLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKGF2b2lkcyBjcmVhdGluZyByZWdleCBvbiBlYWNoIGNoYXJhY3RlcilcbmNvbnN0IEFMUEhBTlVNRVJJQ19SRUdFWCA9IC9bYS16MC05XS87XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGVsZW1lbnQgbmFtZSB0byB0aGUgY2Fub25pY2FsIGZpbGVuYW1lIGlkZW50aXR5IHVzZWQgYnkgbWFuYWdlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAndW5uYW1lZCc7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gbmFtZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKVxuICAgIC5yZXBsYWNlKC9bXFxzX10rL2csICctJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJylcbiAgICAucmVwbGFjZSgvLSsvZywgJy0nKTtcblxuICBjb25zdCBzdGFydCA9IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLScpID8gMSA6IDA7XG4gIGNvbnN0IGVuZCA9IG5vcm1hbGl6ZWQuZW5kc1dpdGgoJy0nKSA/IC0xIDogdW5kZWZpbmVkO1xuICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuLyoqIENhbm9uaWNhbCBub24tZW1wdHkgaWRlbnRpdHkgdXNlZCBmb3IgZWxlbWVudCBmaWxlcyBhbmQgcmVsYXRlZCBydW50aW1lIG1hcHMuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRWxlbWVudFN0b3JhZ2VJZGVudGl0eShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplRWxlbWVudEZpbGVuYW1lKG5hbWUpIHx8ICd1bm5hbWVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVW5pcXVlSWQocGVyc29uYU5hbWU6IHN0cmluZywgYXV0aG9yPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgY29uc3QgZGF0ZVN0ciA9IG5vdy50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKS5yZXBsYWNlQWxsKCctJywgJycpO1xuICBjb25zdCB0aW1lU3RyID0gbm93LnRvVGltZVN0cmluZygpLnNsaWNlKDAsIDgpLnJlcGxhY2VBbGwoJzonLCAnJyk7XG4gIC8vIElzc3VlICM4NDg6IEFkZCBtaWxsaXNlY29uZHMgKyByYW5kb20gc3VmZml4IGZvciBzdWItc2Vjb25kIHVuaXF1ZW5lc3MuXG4gIC8vIENyaXRpY2FsIGZvciBjb3B5LW9uLXdyaXRlLCBzd2FybSBvcGVyYXRpb25zLCBhbmQgcmFwaWQgcHJvZ3JhbW1hdGljIGNyZWF0aW9uLlxuICBjb25zdCBtc1N0ciA9IG5vdy5nZXRNaWxsaXNlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDMsICcwJyk7XG4gIGNvbnN0IHJhbmQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNik7XG4gIC8vIFNFQ1VSSVRZIEZJWDogUHJldmVudCBSZURvUyBieSB1c2luZyBhIHNpbmdsZS1wYXNzIGFwcHJvYWNoXG4gIC8vIFByZXZpb3VzbHk6IE11bHRpcGxlIHJlcGxhY2UoKSBvcGVyYXRpb25zIHdpdGggdW5ib3VuZGVkIHF1YW50aWZpZXJzIGNvdWxkIGNhdXNlIGV4cG9uZW50aWFsIGJhY2t0cmFja2luZ1xuICAvLyBOb3c6IFNpbmdsZS1wYXNzIHRyYW5zZm9ybWF0aW9uIHdpdGggYnVpbHQtaW4gbGVuZ3RoIGxpbWl0XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwZXJzb25hTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzYW5pdGl6ZWROYW1lID0gbm9ybWFsaXplZFxuICAgIC5zcGxpdCgnJylcbiAgICAubWFwKGNoYXIgPT4gQUxQSEFOVU1FUklDX1JFR0VYLnRlc3QoY2hhcikgPyBjaGFyIDogJy0nKVxuICAgIC5qb2luKCcnKVxuICAgIC5zdWJzdHJpbmcoMCwgMTAwKSAvLyBMaW1pdCBhZnRlciB0cmFuc2Zvcm1hdGlvbiB0byBwcmVzZXJ2ZSBzdHJ1Y3R1cmVcbiAgICAucmVwbGFjZUFsbCgvKF4tKyl8KC0rJCkvZywgJycpIC8vIE9ubHkgdHJpbSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcbiAgICAucmVwbGFjZUFsbCgvLXsyLH0vZywgJy0nKTsgLy8gQ29sbGFwc2UgbXVsdGlwbGUgaHlwaGVuc1xuICBjb25zdCB3aG9NYWRlSXQgPSBhdXRob3IgfHwgZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuXG4gIHJldHVybiBgJHtzYW5pdGl6ZWROYW1lfV8ke2RhdGVTdHJ9LSR7dGltZVN0cn0ke21zU3RyfS0ke3JhbmR9XyR7d2hvTWFkZUl0fWA7XG59XG5cbi8qKlxuICogQ29udmVydCB0ZXh0IHRvIFVSTC1zYWZlIHNsdWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gU0VDVVJJVFkgRklYOiBQcmV2ZW50IFJlRG9TIGJ5IHVzaW5nIGEgc2luZ2xlLXBhc3MgYXBwcm9hY2hcbiAgLy8gUHJldmlvdXNseTogTXVsdGlwbGUgcmVwbGFjZSgpIG9wZXJhdGlvbnMgd2l0aCB1bmJvdW5kZWQgcXVhbnRpZmllcnMgY291bGQgY2F1c2UgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nXG4gIC8vIE5vdzogU2luZ2xlLXBhc3MgdHJhbnNmb3JtYXRpb24gd2l0aCBidWlsdC1pbiBsZW5ndGggbGltaXRcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBub3JtYWxpemVkXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoY2hhciA9PiBBTFBIQU5VTUVSSUNfUkVHRVgudGVzdChjaGFyKSA/IGNoYXIgOiAnLScpXG4gICAgLmpvaW4oJycpO1xuICBcbiAgLy8gU0VDVVJJVFkgRklYOiBBdm9pZCBwb2x5bm9taWFsIHJlZ2V4IGJ5IHVzaW5nIHNlcGFyYXRlIG9wZXJhdGlvbnNcbiAgLy8gVHJpbSBsZWFkaW5nIGh5cGhlbnNcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgd2hpbGUgKHN0YXJ0IDwgdHJhbnNmb3JtZWQubGVuZ3RoICYmIHRyYW5zZm9ybWVkW3N0YXJ0XSA9PT0gJy0nKSB7XG4gICAgc3RhcnQrKztcbiAgfVxuICBcbiAgLy8gVHJpbSB0cmFpbGluZyBoeXBoZW5zXG4gIGxldCBlbmQgPSB0cmFuc2Zvcm1lZC5sZW5ndGggLSAxO1xuICB3aGlsZSAoZW5kID49IHN0YXJ0ICYmIHRyYW5zZm9ybWVkW2VuZF0gPT09ICctJykge1xuICAgIGVuZC0tO1xuICB9XG4gIFxuICAvLyBFeHRyYWN0IHRoZSB0cmltbWVkIHBvcnRpb24gYW5kIGNvbGxhcHNlIG11bHRpcGxlIGh5cGhlbnNcbiAgY29uc3QgdHJpbW1lZCA9IHRyYW5zZm9ybWVkLnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgcmV0dXJuIHRyaW1tZWQucmVwbGFjZUFsbCgvLXsyLH0vZywgJy0nKTsgLy8gVGhpcyBpcyBzYWZlIGFzIGl0J3MgbGluZWFyXG59XG5cbi8qKlxuICogRW5zdXJlIGEgZGlyZWN0b3J5IGV4aXN0cywgY3JlYXRlIGlmIGl0IGRvZXNuJ3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZU9wcyA9IGdldEZpbGVPcGVyYXRpb25zU2VydmljZSgpO1xuICBjb25zdCBleGlzdHMgPSBhd2FpdCBmaWxlT3BzLmV4aXN0cyhkaXJQYXRoKTtcblxuICBpZiAoIWV4aXN0cykge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgZGlyZWN0b3J5OiAke2RpclBhdGh9YCk7XG4gICAgYXdhaXQgZmlsZU9wcy5jcmVhdGVEaXJlY3RvcnkoZGlyUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbGUgZXhpc3RzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZU9wcyA9IGdldEZpbGVPcGVyYXRpb25zU2VydmljZSgpO1xuICByZXR1cm4gZmlsZU9wcy5leGlzdHMoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqIEdldCBmaWxlIHNpemUgaW4gYnl0ZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBmaWxlT3BzID0gZ2V0RmlsZU9wZXJhdGlvbnNTZXJ2aWNlKCk7XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZmlsZU9wcy5zdGF0KGZpbGVQYXRoKTtcbiAgcmV0dXJuIHN0YXRzLnNpemU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFja3VwIG9mIGEgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVCYWNrdXAoc291cmNlUGF0aDogc3RyaW5nLCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRW5zdXJlIGJhY2t1cCBkaXJlY3RvcnkgZXhpc3RzXG4gIGNvbnN0IGJhY2t1cERpciA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGJhY2t1cERpcik7XG4gIFxuICAvLyBDb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseVxuICBhd2FpdCBmcy5jcChzb3VyY2VQYXRoLCBiYWNrdXBQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdfQ==
package/oauth-helper.mjs CHANGED
@@ -330,6 +330,25 @@ async function writePidFile() {
330
330
  }
331
331
 
332
332
  async function main() {
333
+ let attempts = 0;
334
+
335
+ // Install termination handling before the first await and before publishing
336
+ // the PID file. Callers use that file as the helper readiness signal.
337
+ process.on('exit', cleanupPidFileSync);
338
+ process.on('beforeExit', async () => {
339
+ await log('OAuth helper completing cleanup');
340
+ await cleanupPidFile();
341
+ });
342
+
343
+ const handleInterruption = () => {
344
+ writeTerminalResultSync('failed', attempts, 'interrupted');
345
+ cleanupStateFileSync();
346
+ cleanupPidFileSync();
347
+ process.exit(1);
348
+ };
349
+ process.once('SIGINT', handleInterruption);
350
+ process.once('SIGTERM', handleInterruption);
351
+
333
352
  await log(`[START] OAuth helper started - PID: ${process.pid}`);
334
353
  await log('[CONFIG] Device code received');
335
354
  await log(`[CONFIG] Poll interval: ${pollIntervalSeconds}s, Expires in: ${expiresIn}s`);
@@ -349,35 +368,9 @@ async function main() {
349
368
 
350
369
  const startTime = Date.now();
351
370
  const timeout = startTime + (expiresIn * 1000);
352
- let attempts = 0;
353
371
  let consecutiveErrors = 0;
354
372
  let currentPollIntervalMs = pollIntervalSeconds * 1000;
355
373
  const MAX_CONSECUTIVE_ERRORS = 5;
356
-
357
- // Set up cleanup on exit - use synchronous cleanup for exit event
358
- process.on('exit', () => {
359
- cleanupPidFileSync();
360
- });
361
-
362
- // Use beforeExit for async cleanup when possible
363
- process.on('beforeExit', async () => {
364
- await log('OAuth helper completing cleanup');
365
- await cleanupPidFile();
366
- });
367
-
368
- process.on('SIGINT', () => {
369
- writeTerminalResultSync('failed', attempts, 'interrupted');
370
- cleanupStateFileSync();
371
- cleanupPidFileSync();
372
- process.exit(1);
373
- });
374
-
375
- process.on('SIGTERM', () => {
376
- writeTerminalResultSync('failed', attempts, 'interrupted');
377
- cleanupStateFileSync();
378
- cleanupPidFileSync();
379
- process.exit(1);
380
- });
381
374
 
382
375
  async function finish(status, errorCode, exitCode) {
383
376
  clearInterval(heartbeatInterval);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.39",
3
+ "version": "2.0.41",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -11,17 +11,17 @@
11
11
  },
12
12
  "scripts": {
13
13
  "prebuild": "npm run build:safety && node scripts/generate-version.js && node scripts/generate-hashes.mjs",
14
- "build:safety": "cd packages/safety && npm install && npm run build",
14
+ "build:safety": "cd packages/safety && npm ci --ignore-scripts --workspaces=false && npm run build",
15
15
  "build": "tsc",
16
16
  "postbuild": "node -e \"const fs=require('fs'),p=require('path');function rm(d){if(fs.existsSync(d)){for(const e of fs.readdirSync(d)){const f=p.join(d,e);fs.statSync(f).isDirectory()?rm(f):fs.unlinkSync(f)}fs.rmdirSync(d)}}function cpR(s,d){fs.mkdirSync(d,{recursive:true});for(const e of fs.readdirSync(s)){const sp=p.join(s,e),dp=p.join(d,e);fs.statSync(sp).isDirectory()?cpR(sp,dp):fs.copyFileSync(sp,dp)}}cpR('src/seed-elements','dist/seed-elements');rm('dist/web/public');cpR('src/web/public','dist/web/public')\"",
17
17
  "web": "node dist/index.js --web",
18
18
  "start": "node dist/index.js",
19
19
  "dev": "tsx watch src/index.ts",
20
- "inspector": "npx @modelcontextprotocol/inspector node dist/index.js",
21
- "inspector:dev": "npx @modelcontextprotocol/inspector tsx src/index.ts",
20
+ "inspector": "mcp-inspector node dist/index.js",
21
+ "inspector:dev": "mcp-inspector tsx src/index.ts",
22
22
  "clean": "rm -rf dist",
23
23
  "rebuild": "npm run clean && npm run build",
24
- "setup": "npm install && npm run build",
24
+ "setup": "npm ci --ignore-scripts && npm run build",
25
25
  "prepublishOnly": "cp README.md README.md.backup 2>/dev/null || true && cp README.npm.md README.md && BUILD_TYPE=npm npm run build",
26
26
  "postpublish": "if [ -f README.md.backup ]; then mv README.md.backup README.md; else echo 'No backup found, README.md unchanged'; fi",
27
27
  "test": "cross-env \"NODE_OPTIONS=$NODE_OPTIONS --experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs",
@@ -57,9 +57,9 @@
57
57
  "security:audit:verbose": "tsx scripts/run-security-audit.ts --verbose",
58
58
  "typecheck:scripts": "tsc --noEmit --project tsconfig.scripts.json",
59
59
  "pre-commit": "npm run security:rapid && npm run typecheck:scripts && npm audit --audit-level=high",
60
- "test:playwright": "npx playwright test",
61
- "test:playwright:headed": "npx playwright test --headed",
62
- "test:playwright:ui": "npx playwright test --ui",
60
+ "test:playwright": "playwright test",
61
+ "test:playwright:headed": "playwright test --headed",
62
+ "test:playwright:ui": "playwright test --ui",
63
63
  "test:e2e": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs",
64
64
  "test:e2e:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs --watch",
65
65
  "test:e2e:verbose": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs --verbose",
@@ -252,7 +252,7 @@
252
252
  "path-to-regexp": "8.4.2"
253
253
  },
254
254
  "giget": {
255
- "tar": "7.5.16"
255
+ "tar": "7.5.22"
256
256
  },
257
257
  "form-data": "4.0.6",
258
258
  "qs": "6.15.2",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.39",
6
+ "version": "2.0.41",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.39",
32
+ "version": "2.0.41",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }