@dollhousemcp/mcp-server 2.0.35 → 2.0.37

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 (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/elements/templates/Template.d.ts +2 -0
  11. package/dist/elements/templates/Template.d.ts.map +1 -1
  12. package/dist/elements/templates/Template.js +9 -1
  13. package/dist/generated/version.d.ts +2 -2
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  16. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  17. package/dist/handlers/GitHubAuthHandler.js +303 -60
  18. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  19. package/dist/handlers/element-crud/editElement.js +24 -11
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  23. package/dist/security/contentValidator.d.ts +32 -1
  24. package/dist/security/contentValidator.d.ts.map +1 -1
  25. package/dist/security/contentValidator.js +79 -33
  26. package/dist/security/secureYamlParser.d.ts.map +1 -1
  27. package/dist/security/secureYamlParser.js +5 -2
  28. package/dist/security/tokenManager.d.ts +1 -1
  29. package/dist/security/tokenManager.d.ts.map +1 -1
  30. package/dist/security/tokenManager.js +10 -7
  31. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  32. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  33. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  34. package/dist/utils/pathSecurity.d.ts +3 -1
  35. package/dist/utils/pathSecurity.d.ts.map +1 -1
  36. package/dist/utils/pathSecurity.js +38 -2
  37. package/dist/web/routes/setupRoutes.d.ts +23 -7
  38. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  39. package/dist/web/routes/setupRoutes.js +138 -20
  40. package/oauth-helper.mjs +233 -92
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -9,10 +9,14 @@
9
9
  */
10
10
  import { SecureYamlParser } from '../security/secureYamlParser.js';
11
11
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
12
+ import { MEMORY_CONSTANTS } from '../elements/memories/constants.js';
12
13
  import { logger } from '../utils/logger.js';
13
14
  export class MemoryMetadataExtractor {
14
- /** Align with SecureYamlParser default raw YAML limit (64KB). */
15
- static MAX_YAML_SIZE = 64 * 1024;
15
+ /**
16
+ * Align with the memory save/load limit (256KB). Issue #2329: this was 64KB,
17
+ * so memories that grew past it indexed as 'unnamed' with default metadata.
18
+ */
19
+ static MAX_YAML_SIZE = MEMORY_CONSTANTS.MAX_YAML_SIZE;
16
20
  /**
17
21
  * Extract index-relevant metadata from raw YAML memory content.
18
22
  *
@@ -174,4 +178,4 @@ export class MemoryMetadataExtractor {
174
178
  return UnicodeValidator.normalize(value).normalizedContent;
175
179
  }
176
180
  }
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLGlFQUFpRTtJQUN6RCxNQUFNLENBQVUsYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFbEQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFrQixFQUFFLFlBQW9CO1FBQzdELElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEYsT0FBTyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsMEVBQTBFO1lBQzFFLCtEQUErRDtZQUMvRCxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxLQUFL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RSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2pHLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztnQkFDTCxZQUFZLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNyRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxnRUFBZ0U7SUFDeEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFvQjtRQUM5QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLFlBQVk7WUFDdEIsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsSUFBSSxFQUFFLEVBQUU7WUFDUixVQUFVLEVBQUUsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztTQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUN4QyxPQUFPLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHRyYWN0cyBtZXRhZGF0YSBmcm9tIHB1cmUgWUFNTCBtZW1vcnkgZmlsZXMgZm9yIGxpZ2h0d2VpZ2h0IGluZGV4aW5nLlxuICpcbiAqIE1lbW9yeSBmaWxlcyBkaWZmZXIgZnJvbSBvdGhlciBlbGVtZW50czogdGhleSBhcmUgcHVyZSBZQU1MIChub3QgbWFya2Rvd25cbiAqIHdpdGggZnJvbnRtYXR0ZXIpLiBNZXRhZGF0YSBsaXZlcyB1bmRlciBhIHRvcC1sZXZlbCBgbWV0YWRhdGFgIGtleSBvclxuICogZGlyZWN0bHkgYXMgdG9wLWxldmVsIGtleXMuIFRoaXMgZXh0cmFjdG9yIHJlYWRzIHJhdyBZQU1MIGFuZCByZXR1cm5zXG4gKiB0aGUgc3Vic2V0IG9mIGZpZWxkcyBuZWVkZWQgZm9yIEVsZW1lbnRJbmRleEVudHJ5IHdpdGhvdXQgY29uc3RydWN0aW5nXG4gKiBhIGZ1bGwgTWVtb3J5IG9iamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlNZXRhZGF0YUV4dHJhY3RvciB7XG4gIC8qKiBBbGlnbiB3aXRoIFNlY3VyZVlhbWxQYXJzZXIgZGVmYXVsdCByYXcgWUFNTCBsaW1pdCAoNjRLQikuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9ZQU1MX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgaW5kZXgtcmVsZXZhbnQgbWV0YWRhdGEgZnJvbSByYXcgWUFNTCBtZW1vcnkgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHJhd0NvbnRlbnQgLSBGdWxsIFlBTUwgZmlsZSBjb250ZW50XG4gICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggLSBQYXRoIHJlbGF0aXZlIHRvIHRoZSBtZW1vcmllcyBlbGVtZW50IGRpcmVjdG9yeVxuICAgKiBAcmV0dXJucyBQYXJ0aWFsIEVsZW1lbnRJbmRleEVudHJ5IHdpdGggZXh0cmFjdGVkIGZpZWxkc1xuICAgKi9cbiAgc3RhdGljIGV4dHJhY3RNZXRhZGF0YShyYXdDb250ZW50OiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUGFydGlhbDxFbGVtZW50SW5kZXhFbnRyeT4ge1xuICAgIGlmICghcmF3Q29udGVudCB8fCB0eXBlb2YgcmF3Q29udGVudCAhPT0gJ3N0cmluZycgfHwgcmF3Q29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuZGVmYXVsdEVudHJ5KHJlbGF0aXZlUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWFyeVBhcnNlID0gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IudHJ5UGFyc2VZYW1sT2JqZWN0KHJhd0NvbnRlbnQpO1xuICAgIGxldCB5YW1sRGF0YSA9IHByaW1hcnlQYXJzZS5kYXRhO1xuICAgIGlmICgheWFtbERhdGEpIHtcbiAgICAgIC8vIE11bHRpLWRvY3VtZW50IHN0cmVhbXMgKGZyb250bWF0dGVyICsgY29udGVudCkgZmFpbCBzaW5nbGUtZG9jIHBhcnNpbmcuXG4gICAgICAvLyBFeHRyYWN0IGp1c3QgdGhlIGZyb250bWF0dGVyIGJsb2NrIGFuZCByZXRyeSBwYXJzaW5nIHNhZmVseS5cbiAgICAgIGNvbnN0IGZtQ29udGVudCA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmV4dHJhY3RGcm9udG1hdHRlcihyYXdDb250ZW50KTtcbiAgICAgIGlmICghZm1Db250ZW50KSB7XG4gICAgICAgIGlmIChwcmltYXJ5UGFyc2UuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlNZXRhZGF0YUV4dHJhY3RvcjogZmFpbGVkIHRvIHBhcnNlIFlBTUwsIHJldHVybmluZyBkZWZhdWx0IG1ldGFkYXRhJywge1xuICAgICAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICAgICAgc3RhZ2U6ICdwcmltYXJ5JyxcbiAgICAgICAgICAgIGVycm9yOiBwcmltYXJ5UGFyc2UuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5kZWZhdWx0RW50cnkocmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZhbGxiYWNrUGFyc2UgPSBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci50cnlQYXJzZVlhbWxPYmplY3QoZm1Db250ZW50KTtcbiAgICAgIHlhbWxEYXRhID0gZmFsbGJhY2tQYXJzZS5kYXRhO1xuICAgICAgaWYgKCF5YW1sRGF0YSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeU1ldGFkYXRhRXh0cmFjdG9yOiBmYWlsZWQgdG8gcGFyc2UgWUFNTCAocHJpbWFyeSArIGZyb250bWF0dGVyIGZhbGxiYWNrKSwgcmV0dXJuaW5nIGRlZmF1bHQgbWV0YWRhdGEnLCB7XG4gICAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIHByaW1hcnlFcnJvcjogcHJpbWFyeVBhcnNlLmVycm9yTWVzc2FnZSxcbiAgICAgICAgICBmYWxsYmFja0Vycm9yOiBmYWxsYmFja1BhcnNlLmVycm9yTWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5kZWZhdWx0RW50cnkocmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZW1vcnkgZmlsZXMgc3RvcmUgbWV0YWRhdGEgdW5kZXIgYSB0b3AtbGV2ZWwgYG1ldGFkYXRhYCBrZXkgb3IgZGlyZWN0bHkgYXMgdG9wLWxldmVsIGtleXNcbiAgICBjb25zdCBtZXRhZGF0YVNvdXJjZSA9IChcbiAgICAgIHlhbWxEYXRhLm1ldGFkYXRhICYmIHR5cGVvZiB5YW1sRGF0YS5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoeWFtbERhdGEubWV0YWRhdGEpXG4gICAgICAgID8geWFtbERhdGEubWV0YWRhdGFcbiAgICAgICAgOiB5YW1sRGF0YVxuICAgICkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHR5cGVvZiBtZXRhZGF0YVNvdXJjZS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICAgPyBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5ub3JtYWxpemVUZXh0KG1ldGFkYXRhU291cmNlLm5hbWUpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBub3JtYWxpemVkTmFtZS5sZW5ndGggPiAwXG4gICAgICA/IG5vcm1hbGl6ZWROYW1lXG4gICAgICA6ICd1bm5hbWVkJztcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdHlwZW9mIG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5ub3JtYWxpemVUZXh0KG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uKVxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWZXJzaW9uID0gdHlwZW9mIG1ldGFkYXRhU291cmNlLnZlcnNpb24gPT09ICdzdHJpbmcnXG4gICAgICA/IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLm5vcm1hbGl6ZVRleHQobWV0YWRhdGFTb3VyY2UudmVyc2lvbilcbiAgICAgIDogJyc7XG4gICAgY29uc3QgdmVyc2lvbiA9IG5vcm1hbGl6ZWRWZXJzaW9uLmxlbmd0aCA+IDBcbiAgICAgID8gbm9ybWFsaXplZFZlcnNpb25cbiAgICAgIDogJzEuMC4wJztcblxuICAgIGNvbnN0IGF1dGhvciA9IHR5cGVvZiBtZXRhZGF0YVNvdXJjZS5hdXRob3IgPT09ICdzdHJpbmcnXG4gICAgICA/IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLm5vcm1hbGl6ZVRleHQobWV0YWRhdGFTb3VyY2UuYXV0aG9yKVxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRhZ3MpICYmIG1ldGFkYXRhU291cmNlLnRhZ3MuZXZlcnkoKHQ6IHVua25vd24pID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJylcbiAgICAgID8gKG1ldGFkYXRhU291cmNlLnRhZ3MgYXMgc3RyaW5nW10pXG4gICAgICAgIC5tYXAodGFnID0+IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLm5vcm1hbGl6ZVRleHQodGFnKSlcbiAgICAgICAgLmZpbHRlcih0YWcgPT4gdGFnLmxlbmd0aCA+IDApXG4gICAgICA6IFtdO1xuXG4gICAgY29uc3QgYXV0b0xvYWQgPSB0eXBlb2YgbWV0YWRhdGFTb3VyY2UuYXV0b0xvYWQgPT09ICdib29sZWFuJ1xuICAgICAgPyBtZXRhZGF0YVNvdXJjZS5hdXRvTG9hZFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBwcmlvcml0eSA9IHR5cGVvZiBtZXRhZGF0YVNvdXJjZS5wcmlvcml0eSA9PT0gJ251bWJlcidcbiAgICAgID8gbWV0YWRhdGFTb3VyY2UucHJpb3JpdHlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZE1lbW9yeVR5cGUgPSB0eXBlb2YgbWV0YWRhdGFTb3VyY2UubWVtb3J5VHlwZSA9PT0gJ3N0cmluZydcbiAgICAgID8gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3Iubm9ybWFsaXplVGV4dChtZXRhZGF0YVNvdXJjZS5tZW1vcnlUeXBlKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBtZW1vcnlUeXBlID0gbm9ybWFsaXplZE1lbW9yeVR5cGUubGVuZ3RoID4gMFxuICAgICAgPyBub3JtYWxpemVkTWVtb3J5VHlwZVxuICAgICAgOiBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5pbmZlck1lbW9yeVR5cGUocmVsYXRpdmVQYXRoKTtcblxuICAgIC8vIHRvdGFsRW50cmllczogcHJlZmVyIHN0YXRzLnRvdGFsRW50cmllcywgZmFsbCBiYWNrIHRvIGVudHJpZXMgYXJyYXkgbGVuZ3RoXG4gICAgbGV0IHRvdGFsRW50cmllczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRzID0geWFtbERhdGEuc3RhdHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzICYmIHR5cGVvZiBzdGF0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHN0YXRzLnRvdGFsRW50cmllcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRvdGFsRW50cmllcyA9IHN0YXRzLnRvdGFsRW50cmllcztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoeWFtbERhdGEuZW50cmllcykpIHtcbiAgICAgIHRvdGFsRW50cmllcyA9IHlhbWxEYXRhLmVudHJpZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5OiBQYXJ0aWFsPEVsZW1lbnRJbmRleEVudHJ5PiA9IHtcbiAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uLFxuICAgICAgYXV0aG9yLFxuICAgICAgdGFncyxcbiAgICAgIG1lbW9yeVR5cGUsXG4gICAgfTtcblxuICAgIGlmIChhdXRvTG9hZCAhPT0gdW5kZWZpbmVkKSBlbnRyeS5hdXRvTG9hZCA9IGF1dG9Mb2FkO1xuICAgIGlmIChwcmlvcml0eSAhPT0gdW5kZWZpbmVkKSBlbnRyeS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIGlmICh0b3RhbEVudHJpZXMgIT09IHVuZGVmaW5lZCkgZW50cnkudG90YWxFbnRyaWVzID0gdG90YWxFbnRyaWVzO1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZmVyIHRoZSBtZW1vcnkgdHlwZSBmcm9tIHRoZSBmaWxlJ3MgcmVsYXRpdmUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHJlbGF0aXZlUGF0aCAtIFBhdGggcmVsYXRpdmUgdG8gdGhlIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKiBAcmV0dXJucyAnc3lzdGVtJyB8ICdhZGFwdGVyJyB8ICd1c2VyJ1xuICAgKi9cbiAgc3RhdGljIGluZmVyTWVtb3J5VHlwZShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gTm9ybWFsaXplIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaCBmb3IgY29uc2lzdGVudCBtYXRjaGluZ1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnc3lzdGVtLycpKSByZXR1cm4gJ3N5c3RlbSc7XG4gICAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnYWRhcHRlcnMvJykpIHJldHVybiAnYWRhcHRlcic7XG4gICAgcmV0dXJuICd1c2VyJztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IFlBTUwgY29udGVudCBiZXR3ZWVuIC0tLSBmcm9udG1hdHRlciBtYXJrZXJzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gdmFsaWQgZnJvbnRtYXR0ZXIgYmxvY2sgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0RnJvbnRtYXR0ZXIocmF3Q29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHJhd0NvbnRlbnQudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKCctLS0nKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBlbmRJbmRleCA9IHRyaW1tZWQuaW5kZXhPZignXFxuLS0tJywgMyk7XG4gICAgaWYgKGVuZEluZGV4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdHJpbW1lZC5zdWJzdHJpbmcoMywgZW5kSW5kZXgpLnRyaW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSByYXcgWUFNTCB1c2luZyB0aGUgY2VudHJhbGl6ZWQgc2VjdXJlIHBhcnNlci5cbiAgICogUmV0dXJucyBwYXJzZSBkaWFnbm9zdGljcyBzbyBjYWxsZXJzIGNhbiBmYWlsIGNsb3NlZCB3aGlsZSBwcmVzZXJ2aW5nIGVycm9yIGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB0cnlQYXJzZVlhbWxPYmplY3QoY29udGVudDogc3RyaW5nKTogeyBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGVycm9yTWVzc2FnZT86IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgZGF0YTogU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoY29udGVudCwgTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuTUFYX1lBTUxfU0laRSkgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBtaW5pbWFsIGRlZmF1bHQgZW50cnkgZm9yIGVtcHR5L2NvcnJ1cHQgY29udGVudC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdEVudHJ5KHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUGFydGlhbDxFbGVtZW50SW5kZXhFbnRyeT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgbmFtZTogJ3VubmFtZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogJycsXG4gICAgICB0YWdzOiBbXSxcbiAgICAgIG1lbW9yeVR5cGU6IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmluZmVyTWVtb3J5VHlwZShyZWxhdGl2ZVBhdGgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVUZXh0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh2YWx1ZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gIH1cbn1cbiJdfQ==
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDO0lBRXZFOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtRQUM3RCxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sdUJBQXVCLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RSxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLDBFQUEwRTtZQUMxRSwrREFBK0Q7WUFDL0QsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLElBQUks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a0JBQWtCLENBQUMsT0FBZTtRQUMvQyxJQUFJLENBQUM7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNqRyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDckUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3hELE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBb0I7UUFDOUMsT0FBTztZQUNMLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUFFLEVBQUU7WUFDZixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFFO1lBQ1IsVUFBVSxFQUFFLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7U0FDbEUsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQWE7UUFDeEMsT0FBTyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQUM7SUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXh0cmFjdHMgbWV0YWRhdGEgZnJvbSBwdXJlIFlBTUwgbWVtb3J5IGZpbGVzIGZvciBsaWdodHdlaWdodCBpbmRleGluZy5cbiAqXG4gKiBNZW1vcnkgZmlsZXMgZGlmZmVyIGZyb20gb3RoZXIgZWxlbWVudHM6IHRoZXkgYXJlIHB1cmUgWUFNTCAobm90IG1hcmtkb3duXG4gKiB3aXRoIGZyb250bWF0dGVyKS4gTWV0YWRhdGEgbGl2ZXMgdW5kZXIgYSB0b3AtbGV2ZWwgYG1ldGFkYXRhYCBrZXkgb3JcbiAqIGRpcmVjdGx5IGFzIHRvcC1sZXZlbCBrZXlzLiBUaGlzIGV4dHJhY3RvciByZWFkcyByYXcgWUFNTCBhbmQgcmV0dXJuc1xuICogdGhlIHN1YnNldCBvZiBmaWVsZHMgbmVlZGVkIGZvciBFbGVtZW50SW5kZXhFbnRyeSB3aXRob3V0IGNvbnN0cnVjdGluZ1xuICogYSBmdWxsIE1lbW9yeSBvYmplY3QuXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTIH0gZnJvbSAnLi4vZWxlbWVudHMvbWVtb3JpZXMvY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlNZXRhZGF0YUV4dHJhY3RvciB7XG4gIC8qKlxuICAgKiBBbGlnbiB3aXRoIHRoZSBtZW1vcnkgc2F2ZS9sb2FkIGxpbWl0ICgyNTZLQikuIElzc3VlICMyMzI5OiB0aGlzIHdhcyA2NEtCLFxuICAgKiBzbyBtZW1vcmllcyB0aGF0IGdyZXcgcGFzdCBpdCBpbmRleGVkIGFzICd1bm5hbWVkJyB3aXRoIGRlZmF1bHQgbWV0YWRhdGEuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfWUFNTF9TSVpFID0gTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGluZGV4LXJlbGV2YW50IG1ldGFkYXRhIGZyb20gcmF3IFlBTUwgbWVtb3J5IGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSByYXdDb250ZW50IC0gRnVsbCBZQU1MIGZpbGUgY29udGVudFxuICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIC0gUGF0aCByZWxhdGl2ZSB0byB0aGUgbWVtb3JpZXMgZWxlbWVudCBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgUGFydGlhbCBFbGVtZW50SW5kZXhFbnRyeSB3aXRoIGV4dHJhY3RlZCBmaWVsZHNcbiAgICovXG4gIHN0YXRpYyBleHRyYWN0TWV0YWRhdGEocmF3Q29udGVudDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFBhcnRpYWw8RWxlbWVudEluZGV4RW50cnk+IHtcbiAgICBpZiAoIXJhd0NvbnRlbnQgfHwgdHlwZW9mIHJhd0NvbnRlbnQgIT09ICdzdHJpbmcnIHx8IHJhd0NvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmRlZmF1bHRFbnRyeShyZWxhdGl2ZVBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1hcnlQYXJzZSA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLnRyeVBhcnNlWWFtbE9iamVjdChyYXdDb250ZW50KTtcbiAgICBsZXQgeWFtbERhdGEgPSBwcmltYXJ5UGFyc2UuZGF0YTtcbiAgICBpZiAoIXlhbWxEYXRhKSB7XG4gICAgICAvLyBNdWx0aS1kb2N1bWVudCBzdHJlYW1zIChmcm9udG1hdHRlciArIGNvbnRlbnQpIGZhaWwgc2luZ2xlLWRvYyBwYXJzaW5nLlxuICAgICAgLy8gRXh0cmFjdCBqdXN0IHRoZSBmcm9udG1hdHRlciBibG9jayBhbmQgcmV0cnkgcGFyc2luZyBzYWZlbHkuXG4gICAgICBjb25zdCBmbUNvbnRlbnQgPSBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5leHRyYWN0RnJvbnRtYXR0ZXIocmF3Q29udGVudCk7XG4gICAgICBpZiAoIWZtQ29udGVudCkge1xuICAgICAgICBpZiAocHJpbWFyeVBhcnNlLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3I6IGZhaWxlZCB0byBwYXJzZSBZQU1MLCByZXR1cm5pbmcgZGVmYXVsdCBtZXRhZGF0YScsIHtcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICAgIHN0YWdlOiAncHJpbWFyeScsXG4gICAgICAgICAgICBlcnJvcjogcHJpbWFyeVBhcnNlLmVycm9yTWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuZGVmYXVsdEVudHJ5KHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmYWxsYmFja1BhcnNlID0gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IudHJ5UGFyc2VZYW1sT2JqZWN0KGZtQ29udGVudCk7XG4gICAgICB5YW1sRGF0YSA9IGZhbGxiYWNrUGFyc2UuZGF0YTtcbiAgICAgIGlmICgheWFtbERhdGEpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlNZXRhZGF0YUV4dHJhY3RvcjogZmFpbGVkIHRvIHBhcnNlIFlBTUwgKHByaW1hcnkgKyBmcm9udG1hdHRlciBmYWxsYmFjayksIHJldHVybmluZyBkZWZhdWx0IG1ldGFkYXRhJywge1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBwcmltYXJ5RXJyb3I6IHByaW1hcnlQYXJzZS5lcnJvck1lc3NhZ2UsXG4gICAgICAgICAgZmFsbGJhY2tFcnJvcjogZmFsbGJhY2tQYXJzZS5lcnJvck1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuZGVmYXVsdEVudHJ5KHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVtb3J5IGZpbGVzIHN0b3JlIG1ldGFkYXRhIHVuZGVyIGEgdG9wLWxldmVsIGBtZXRhZGF0YWAga2V5IG9yIGRpcmVjdGx5IGFzIHRvcC1sZXZlbCBrZXlzXG4gICAgY29uc3QgbWV0YWRhdGFTb3VyY2UgPSAoXG4gICAgICB5YW1sRGF0YS5tZXRhZGF0YSAmJiB0eXBlb2YgeWFtbERhdGEubWV0YWRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHlhbWxEYXRhLm1ldGFkYXRhKVxuICAgICAgICA/IHlhbWxEYXRhLm1ldGFkYXRhXG4gICAgICAgIDogeWFtbERhdGFcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0eXBlb2YgbWV0YWRhdGFTb3VyY2UubmFtZSA9PT0gJ3N0cmluZydcbiAgICAgID8gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3Iubm9ybWFsaXplVGV4dChtZXRhZGF0YVNvdXJjZS5uYW1lKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBuYW1lID0gbm9ybWFsaXplZE5hbWUubGVuZ3RoID4gMFxuICAgICAgPyBub3JtYWxpemVkTmFtZVxuICAgICAgOiAndW5uYW1lZCc7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHR5cGVvZiBtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZydcbiAgICAgID8gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3Iubm9ybWFsaXplVGV4dChtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbilcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBub3JtYWxpemVkVmVyc2lvbiA9IHR5cGVvZiBtZXRhZGF0YVNvdXJjZS52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5ub3JtYWxpemVUZXh0KG1ldGFkYXRhU291cmNlLnZlcnNpb24pXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHZlcnNpb24gPSBub3JtYWxpemVkVmVyc2lvbi5sZW5ndGggPiAwXG4gICAgICA/IG5vcm1hbGl6ZWRWZXJzaW9uXG4gICAgICA6ICcxLjAuMCc7XG5cbiAgICBjb25zdCBhdXRob3IgPSB0eXBlb2YgbWV0YWRhdGFTb3VyY2UuYXV0aG9yID09PSAnc3RyaW5nJ1xuICAgICAgPyBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5ub3JtYWxpemVUZXh0KG1ldGFkYXRhU291cmNlLmF1dGhvcilcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS50YWdzKSAmJiBtZXRhZGF0YVNvdXJjZS50YWdzLmV2ZXJ5KCh0OiB1bmtub3duKSA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpXG4gICAgICA/IChtZXRhZGF0YVNvdXJjZS50YWdzIGFzIHN0cmluZ1tdKVxuICAgICAgICAubWFwKHRhZyA9PiBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5ub3JtYWxpemVUZXh0KHRhZykpXG4gICAgICAgIC5maWx0ZXIodGFnID0+IHRhZy5sZW5ndGggPiAwKVxuICAgICAgOiBbXTtcblxuICAgIGNvbnN0IGF1dG9Mb2FkID0gdHlwZW9mIG1ldGFkYXRhU291cmNlLmF1dG9Mb2FkID09PSAnYm9vbGVhbidcbiAgICAgID8gbWV0YWRhdGFTb3VyY2UuYXV0b0xvYWRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcHJpb3JpdHkgPSB0eXBlb2YgbWV0YWRhdGFTb3VyY2UucHJpb3JpdHkgPT09ICdudW1iZXInXG4gICAgICA/IG1ldGFkYXRhU291cmNlLnByaW9yaXR5XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRNZW1vcnlUeXBlID0gdHlwZW9mIG1ldGFkYXRhU291cmNlLm1lbW9yeVR5cGUgPT09ICdzdHJpbmcnXG4gICAgICA/IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLm5vcm1hbGl6ZVRleHQobWV0YWRhdGFTb3VyY2UubWVtb3J5VHlwZSlcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWVtb3J5VHlwZSA9IG5vcm1hbGl6ZWRNZW1vcnlUeXBlLmxlbmd0aCA+IDBcbiAgICAgID8gbm9ybWFsaXplZE1lbW9yeVR5cGVcbiAgICAgIDogTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuaW5mZXJNZW1vcnlUeXBlKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAvLyB0b3RhbEVudHJpZXM6IHByZWZlciBzdGF0cy50b3RhbEVudHJpZXMsIGZhbGwgYmFjayB0byBlbnRyaWVzIGFycmF5IGxlbmd0aFxuICAgIGxldCB0b3RhbEVudHJpZXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0cyA9IHlhbWxEYXRhLnN0YXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzdGF0cyAmJiB0eXBlb2Ygc3RhdHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBzdGF0cy50b3RhbEVudHJpZXMgPT09ICdudW1iZXInKSB7XG4gICAgICB0b3RhbEVudHJpZXMgPSBzdGF0cy50b3RhbEVudHJpZXM7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHlhbWxEYXRhLmVudHJpZXMpKSB7XG4gICAgICB0b3RhbEVudHJpZXMgPSB5YW1sRGF0YS5lbnRyaWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeTogUGFydGlhbDxFbGVtZW50SW5kZXhFbnRyeT4gPSB7XG4gICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGF1dGhvcixcbiAgICAgIHRhZ3MsXG4gICAgICBtZW1vcnlUeXBlLFxuICAgIH07XG5cbiAgICBpZiAoYXV0b0xvYWQgIT09IHVuZGVmaW5lZCkgZW50cnkuYXV0b0xvYWQgPSBhdXRvTG9hZDtcbiAgICBpZiAocHJpb3JpdHkgIT09IHVuZGVmaW5lZCkgZW50cnkucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICBpZiAodG90YWxFbnRyaWVzICE9PSB1bmRlZmluZWQpIGVudHJ5LnRvdGFsRW50cmllcyA9IHRvdGFsRW50cmllcztcblxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmZlciB0aGUgbWVtb3J5IHR5cGUgZnJvbSB0aGUgZmlsZSdzIHJlbGF0aXZlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSByZWxhdGl2ZVBhdGggLSBQYXRoIHJlbGF0aXZlIHRvIHRoZSBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgJ3N5c3RlbScgfCAnYWRhcHRlcicgfCAndXNlcidcbiAgICovXG4gIHN0YXRpYyBpbmZlck1lbW9yeVR5cGUocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE5vcm1hbGl6ZSBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2ggZm9yIGNvbnNpc3RlbnQgbWF0Y2hpbmdcbiAgICBjb25zdCBub3JtYWxpemVkID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICAgIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ3N5c3RlbS8nKSkgcmV0dXJuICdzeXN0ZW0nO1xuICAgIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2FkYXB0ZXJzLycpKSByZXR1cm4gJ2FkYXB0ZXInO1xuICAgIHJldHVybiAndXNlcic7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBZQU1MIGNvbnRlbnQgYmV0d2VlbiAtLS0gZnJvbnRtYXR0ZXIgbWFya2Vycy5cbiAgICogUmV0dXJucyBudWxsIGlmIG5vIHZhbGlkIGZyb250bWF0dGVyIGJsb2NrIGZvdW5kLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdEZyb250bWF0dGVyKHJhd0NvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHRyaW1tZWQgPSByYXdDb250ZW50LnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aCgnLS0tJykpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZW5kSW5kZXggPSB0cmltbWVkLmluZGV4T2YoJ1xcbi0tLScsIDMpO1xuICAgIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRyaW1tZWQuc3Vic3RyaW5nKDMsIGVuZEluZGV4KS50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcmF3IFlBTUwgdXNpbmcgdGhlIGNlbnRyYWxpemVkIHNlY3VyZSBwYXJzZXIuXG4gICAqIFJldHVybnMgcGFyc2UgZGlhZ25vc3RpY3Mgc28gY2FsbGVycyBjYW4gZmFpbCBjbG9zZWQgd2hpbGUgcHJlc2VydmluZyBlcnJvciBjb250ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdHJ5UGFyc2VZYW1sT2JqZWN0KGNvbnRlbnQ6IHN0cmluZyk6IHsgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBlcnJvck1lc3NhZ2U/OiBzdHJpbmcgfSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IGRhdGE6IFNlY3VyZVlhbWxQYXJzZXIucGFyc2VSYXdZYW1sKGNvbnRlbnQsIE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLk1BWF9ZQU1MX1NJWkUpIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJuIGEgbWluaW1hbCBkZWZhdWx0IGVudHJ5IGZvciBlbXB0eS9jb3JydXB0IGNvbnRlbnQuICovXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRFbnRyeShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFBhcnRpYWw8RWxlbWVudEluZGV4RW50cnk+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgIG5hbWU6ICd1bm5hbWVkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICBhdXRob3I6ICcnLFxuICAgICAgdGFnczogW10sXG4gICAgICBtZW1vcnlUeXBlOiBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5pbmZlck1lbW9yeVR5cGUocmVsYXRpdmVQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm9ybWFsaXplVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodmFsdWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICB9XG59XG4iXX0=
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Resolve a target path and verify that it remains inside the intended base
3
3
  * directory. This is separator-aware, so sibling paths such as `/tmp/base2`
4
- * are not treated as children of `/tmp/base`.
4
+ * are not treated as children of `/tmp/base`. Existing symlinked base paths
5
+ * and symlinked descendants under the base are rejected because writes would
6
+ * follow them outside the lexical containment boundary.
5
7
  */
6
8
  export declare function resolvePathWithinBase(baseDir: string, ...segments: string[]): string;
7
9
  //# sourceMappingURL=pathSecurity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BpF"}
1
+ {"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"AAqCA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BpF"}
@@ -1,8 +1,42 @@
1
+ import * as fs from 'node:fs';
1
2
  import * as path from 'node:path';
3
+ function assertNotSymlink(pathToCheck, message) {
4
+ try {
5
+ const stats = fs.lstatSync(pathToCheck);
6
+ if (stats.isSymbolicLink()) {
7
+ throw new Error(message);
8
+ }
9
+ }
10
+ catch (error) {
11
+ const code = typeof error === 'object' && error !== null && 'code' in error
12
+ ? error.code
13
+ : undefined;
14
+ if (code === 'ENOENT' || code === 'ENOTDIR') {
15
+ return;
16
+ }
17
+ throw error;
18
+ }
19
+ }
20
+ function assertNoSymlinkedDescendants(resolvedBase, resolvedTarget) {
21
+ const relativePath = path.relative(resolvedBase, resolvedTarget);
22
+ if (!relativePath) {
23
+ return;
24
+ }
25
+ let currentPath = resolvedBase;
26
+ for (const segment of relativePath.split(path.sep)) {
27
+ if (!segment) {
28
+ continue;
29
+ }
30
+ currentPath = path.join(currentPath, segment);
31
+ assertNotSymlink(currentPath, 'Path segment resolves through a symbolic link');
32
+ }
33
+ }
2
34
  /**
3
35
  * Resolve a target path and verify that it remains inside the intended base
4
36
  * directory. This is separator-aware, so sibling paths such as `/tmp/base2`
5
- * are not treated as children of `/tmp/base`.
37
+ * are not treated as children of `/tmp/base`. Existing symlinked base paths
38
+ * and symlinked descendants under the base are rejected because writes would
39
+ * follow them outside the lexical containment boundary.
6
40
  */
7
41
  export function resolvePathWithinBase(baseDir, ...segments) {
8
42
  if (!baseDir || typeof baseDir !== 'string') {
@@ -23,8 +57,10 @@ export function resolvePathWithinBase(baseDir, ...segments) {
23
57
  || relativePath.startsWith('..' + path.sep)
24
58
  || path.isAbsolute(relativePath);
25
59
  if (!isTraversal) {
60
+ assertNotSymlink(resolvedBase, 'Base directory resolves through a symbolic link');
61
+ assertNoSymlinkedDescendants(resolvedBase, resolvedTarget);
26
62
  return resolvedTarget;
27
63
  }
28
64
  throw new Error('Resolved path escapes the base directory');
29
65
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhTZWN1cml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWUsRUFBRSxHQUFHLFFBQWtCO0lBQzFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsTUFBTSxXQUFXLEdBQUcsWUFBWSxLQUFLLElBQUk7V0FDcEMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRhcmdldCBwYXRoIGFuZCB2ZXJpZnkgdGhhdCBpdCByZW1haW5zIGluc2lkZSB0aGUgaW50ZW5kZWQgYmFzZVxuICogZGlyZWN0b3J5LiBUaGlzIGlzIHNlcGFyYXRvci1hd2FyZSwgc28gc2libGluZyBwYXRocyBzdWNoIGFzIGAvdG1wL2Jhc2UyYFxuICogYXJlIG5vdCB0cmVhdGVkIGFzIGNoaWxkcmVuIG9mIGAvdG1wL2Jhc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKGJhc2VEaXI6IHN0cmluZywgLi4uc2VnbWVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKCFiYXNlRGlyIHx8IHR5cGVvZiBiYXNlRGlyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jhc2UgZGlyZWN0b3J5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAodHlwZW9mIHNlZ21lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXRoIHNlZ21lbnRzIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudC5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBzZWdtZW50IGNvbnRhaW5zIGEgbnVsbCBieXRlJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIpO1xuICBjb25zdCByZXNvbHZlZFRhcmdldCA9IHBhdGgucmVzb2x2ZShyZXNvbHZlZEJhc2UsIC4uLnNlZ21lbnRzKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZXNvbHZlZEJhc2UsIHJlc29sdmVkVGFyZ2V0KTtcbiAgY29uc3QgaXNUcmF2ZXJzYWwgPSByZWxhdGl2ZVBhdGggPT09ICcuLidcbiAgICB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApXG4gICAgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG5cbiAgaWYgKCFpc1RyYXZlcnNhbCkge1xuICAgIHJldHVybiByZXNvbHZlZFRhcmdldDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignUmVzb2x2ZWQgcGF0aCBlc2NhcGVzIHRoZSBiYXNlIGRpcmVjdG9yeScpO1xufVxuIl19
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhTZWN1cml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxTQUFTLGdCQUFnQixDQUFDLFdBQW1CLEVBQUUsT0FBZTtJQUM1RCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLElBQUksS0FBSztZQUN6RSxDQUFDLENBQUUsS0FBK0IsQ0FBQyxJQUFJO1lBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsWUFBb0IsRUFBRSxjQUFzQjtJQUNoRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLFNBQVM7UUFDWCxDQUFDO1FBRUQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWUsRUFBRSxHQUFHLFFBQWtCO0lBQzFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsTUFBTSxXQUFXLEdBQUcsWUFBWSxLQUFLLElBQUk7V0FDcEMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsaURBQWlELENBQUMsQ0FBQztRQUNsRiw0QkFBNEIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmZ1bmN0aW9uIGFzc2VydE5vdFN5bWxpbmsocGF0aFRvQ2hlY2s6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmMocGF0aFRvQ2hlY2spO1xuICAgIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY29kZSA9PT0gJ0VOT0VOVCcgfHwgY29kZSA9PT0gJ0VOT1RESVInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vU3ltbGlua2VkRGVzY2VuZGFudHMocmVzb2x2ZWRCYXNlOiBzdHJpbmcsIHJlc29sdmVkVGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZXNvbHZlZEJhc2UsIHJlc29sdmVkVGFyZ2V0KTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgY3VycmVudFBhdGggPSByZXNvbHZlZEJhc2U7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiByZWxhdGl2ZVBhdGguc3BsaXQocGF0aC5zZXApKSB7XG4gICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50UGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgc2VnbWVudCk7XG4gICAgYXNzZXJ0Tm90U3ltbGluayhjdXJyZW50UGF0aCwgJ1BhdGggc2VnbWVudCByZXNvbHZlcyB0aHJvdWdoIGEgc3ltYm9saWMgbGluaycpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRhcmdldCBwYXRoIGFuZCB2ZXJpZnkgdGhhdCBpdCByZW1haW5zIGluc2lkZSB0aGUgaW50ZW5kZWQgYmFzZVxuICogZGlyZWN0b3J5LiBUaGlzIGlzIHNlcGFyYXRvci1hd2FyZSwgc28gc2libGluZyBwYXRocyBzdWNoIGFzIGAvdG1wL2Jhc2UyYFxuICogYXJlIG5vdCB0cmVhdGVkIGFzIGNoaWxkcmVuIG9mIGAvdG1wL2Jhc2VgLiBFeGlzdGluZyBzeW1saW5rZWQgYmFzZSBwYXRoc1xuICogYW5kIHN5bWxpbmtlZCBkZXNjZW5kYW50cyB1bmRlciB0aGUgYmFzZSBhcmUgcmVqZWN0ZWQgYmVjYXVzZSB3cml0ZXMgd291bGRcbiAqIGZvbGxvdyB0aGVtIG91dHNpZGUgdGhlIGxleGljYWwgY29udGFpbm1lbnQgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aFdpdGhpbkJhc2UoYmFzZURpcjogc3RyaW5nLCAuLi5zZWdtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoIWJhc2VEaXIgfHwgdHlwZW9mIGJhc2VEaXIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFzZSBkaXJlY3RvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdGggc2VnbWVudHMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIGlmIChzZWdtZW50LmluY2x1ZGVzKCdcXDAnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHNlZ21lbnQgY29udGFpbnMgYSBudWxsIGJ5dGUnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZURpcik7XG4gIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gcGF0aC5yZXNvbHZlKHJlc29sdmVkQmFzZSwgLi4uc2VnbWVudHMpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlc29sdmVkQmFzZSwgcmVzb2x2ZWRUYXJnZXQpO1xuICBjb25zdCBpc1RyYXZlcnNhbCA9IHJlbGF0aXZlUGF0aCA9PT0gJy4uJ1xuICAgIHx8IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicgKyBwYXRoLnNlcClcbiAgICB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcblxuICBpZiAoIWlzVHJhdmVyc2FsKSB7XG4gICAgYXNzZXJ0Tm90U3ltbGluayhyZXNvbHZlZEJhc2UsICdCYXNlIGRpcmVjdG9yeSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltYm9saWMgbGluaycpO1xuICAgIGFzc2VydE5vU3ltbGlua2VkRGVzY2VuZGFudHMocmVzb2x2ZWRCYXNlLCByZXNvbHZlZFRhcmdldCk7XG4gICAgcmV0dXJuIHJlc29sdmVkVGFyZ2V0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdSZXNvbHZlZCBwYXRoIGVzY2FwZXMgdGhlIGJhc2UgZGlyZWN0b3J5Jyk7XG59XG4iXX0=
@@ -33,6 +33,13 @@ export declare function createSetupRoutes(opts?: {
33
33
  _installPermissionHook?: (client: string) => Promise<InstallPermissionHookResult>;
34
34
  /** Override permission hook status reconciler. For testing only. */
35
35
  _reconcilePermissionHookStatus?: (client: string) => Promise<PermissionHookStatus>;
36
+ /**
37
+ * Override the NVM launcher mitigation applied after a successful install.
38
+ * For testing only. Without this seam the install handler runs the real
39
+ * applyNvmLauncherIfNeeded against the real homedir(); on a machine WITH NVM
40
+ * that patches the developer's real client configs (issue #2338).
41
+ */
42
+ _applyNvmLauncher?: (client: string) => Promise<NvmLauncherResult>;
36
43
  /** Enable automatic hook asset repair during detect. Defaults off in tests. */
37
44
  _autoRepairPermissionHooksOnDetect?: boolean;
38
45
  /** Skip the sliding-window rate limiter. For testing only. */
@@ -59,18 +66,27 @@ export type NvmLauncherResult = 'applied' | 'not-applicable' | 'failed';
59
66
  */
60
67
  export declare function applyNvmLauncherIfNeeded(client: string, home?: string): Promise<NvmLauncherResult>;
61
68
  /**
62
- * Startup repair: re-creates the wrapper and re-patches all known JSON-format
63
- * client configs on every server start. Handles two cases:
64
- * 1. Wrapper was deleted recreates it so configs pointing to it keep working.
65
- * 2. Pre-existing install (user installed before this fix shipped) — patches
66
- * configs that still use bare `npx`.
69
+ * Startup repair + self-heal: reconciles every known JSON-format client config
70
+ * on each server start. Behaviour depends on whether NVM is installed, matching
71
+ * the acceptance matrix in https://github.com/DollhouseMCP/mcp-server/issues/2338:
72
+ *
73
+ * NVM present → (re)create the wrapper and point each config at it. Covers a
74
+ * deleted wrapper, a pre-fix install still on bare `npx`, and a config left
75
+ * pointing at a dead temp-dir wrapper (regenerates the real one). Healthy
76
+ * configs re-serialise byte-identically, so this is a no-op for them.
77
+ * • NVM absent → never create a wrapper, but SELF-HEAL any config whose
78
+ * command points at a `dollhousemcp-nvm.sh` that no longer exists (e.g. the
79
+ * #2338 test leak, or a user who removed ~/.dollhouse/bin) back to bare `npx`,
80
+ * preserving args so the client can launch DollhouseMCP again.
67
81
  *
68
82
  * Fire-and-forget from startWebServer. All errors are swallowed and logged.
69
83
  *
70
84
  * @param home - Override home directory (injectable for tests)
71
85
  * @param configPathResolver - Override config path lookup (injectable for tests).
72
- * Return null to skip a client entirely.
73
- * Defaults to the production getConfigPath.
86
+ * Return null to skip a client entirely. Defaults to a
87
+ * home-derived resolver so `home` stays authoritative
88
+ * — the default must NOT reach the real homedir() when
89
+ * a fake home is supplied (#2338).
74
90
  */
75
91
  export declare function repairNvmLauncherOnStartup(home?: string, configPathResolver?: (client: string) => string | null): Promise<void>;
76
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"setupRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/setupRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setupRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/setupRoutes.ts"],"names":[],"mappings":"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"}