@dollhousemcp/mcp-server 2.0.30 → 2.0.32

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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/ensembles/welcome-to-the-dollhouse.md +94 -0
  3. package/data/personas/dollhouse-expert.md +242 -14
  4. package/data/skills/research-to-elements.md +136 -0
  5. package/dist/elements/agents/AgentManager.d.ts +8 -1
  6. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  7. package/dist/elements/agents/AgentManager.js +49 -9
  8. package/dist/elements/ensembles/EnsembleManager.d.ts +36 -0
  9. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  10. package/dist/elements/ensembles/EnsembleManager.js +94 -5
  11. package/dist/generated/version.d.ts +2 -2
  12. package/dist/generated/version.js +3 -3
  13. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  14. package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
  15. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/OperationSchema.js +8 -7
  17. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/evaluatePermission.js +6 -3
  19. package/dist/server/tools/MCPAQLTools.js +21 -5
  20. package/dist/services/BuildInfoService.d.ts +3 -1
  21. package/dist/services/BuildInfoService.d.ts.map +1 -1
  22. package/dist/services/BuildInfoService.js +27 -5
  23. package/dist/utils/permissionHookShared.d.ts +39 -0
  24. package/dist/utils/permissionHookShared.d.ts.map +1 -1
  25. package/dist/utils/permissionHookShared.js +38 -1
  26. package/dist/utils/permissionHookStatus.d.ts.map +1 -1
  27. package/dist/utils/permissionHookStatus.js +6 -2
  28. package/dist/utils/permissionHooks.d.ts +1 -1
  29. package/dist/utils/permissionHooks.d.ts.map +1 -1
  30. package/dist/utils/permissionHooks.js +2 -2
  31. package/dist/web/public/app.js +213 -12
  32. package/dist/web/public/index.html +16 -7
  33. package/dist/web/public/styles.css +229 -30
  34. package/dist/web/routes/healthRoutes.d.ts.map +1 -1
  35. package/dist/web/routes/healthRoutes.js +3 -1
  36. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  37. package/dist/web/routes/permissionRoutes.js +10 -2
  38. package/package.json +1 -1
  39. package/scripts/pretooluse-dollhouse.sh +157 -39
  40. package/server.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"permissionHookStatus.d.ts","sourceRoot":"","sources":["../../src/utils/permissionHookStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAGhC,KAAK,kCAAkC,EACvC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EAWpC,MAAM,2BAA2B,CAAC;AAInC,wBAAgB,uBAAuB,CAAC,OAAO,SAAY,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAMhG;AAED,wBAAsB,4BAA4B,CAAC,OAAO,SAAY,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAMpH;AA2FD,wBAAgB,yCAAyC,IAAI,kCAAkC,GAAG,IAAI,CAErG;AAED,wBAAgB,gDAAgD,IAAI,IAAI,CAEvE;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAgC/B;AAED,wBAAsB,6BAA6B,CAAC,OAAO,SAAY,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA4B5G;AA4CD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,0BAA0B,GAClC,2BAA2B,CAmD7B;AAED,wBAAsB,8BAA8B,CAClD,OAAO,SAAY,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,kCAAkC,CAAC,CA0D7C"}
1
+ {"version":3,"file":"permissionHookStatus.d.ts","sourceRoot":"","sources":["../../src/utils/permissionHookStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAGhC,KAAK,kCAAkC,EACvC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EAapC,MAAM,2BAA2B,CAAC;AAInC,wBAAgB,uBAAuB,CAAC,OAAO,SAAY,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAMhG;AAED,wBAAsB,4BAA4B,CAAC,OAAO,SAAY,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAMpH;AA2FD,wBAAgB,yCAAyC,IAAI,kCAAkC,GAAG,IAAI,CAErG;AAED,wBAAgB,gDAAgD,IAAI,IAAI,CAEvE;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAgC/B;AAED,wBAAsB,6BAA6B,CAAC,OAAO,SAAY,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAgC5G;AA4CD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,0BAA0B,GAClC,2BAA2B,CAmD7B;AAED,wBAAsB,8BAA8B,CAClD,OAAO,SAAY,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,kCAAkC,CAAC,CA0D7C"}
@@ -1,6 +1,6 @@
1
1
  import { homedir } from 'node:os';
2
2
  import { logger } from './logger.js';
3
- import { AUTO_REPAIRABLE_HOOK_HOSTS, auditHookAssets, collectHookMarkerPaths, collectHookMarkerPathsAsync, getPrimaryHookScriptPath, installHookAssetsForHost, normalizeHookHost, readHostSpecificHookStatus, summarizeMarkerStatuses, supportsManagedHookAssets, } from './permissionHookShared.js';
3
+ import { AUTO_REPAIRABLE_HOOK_HOSTS, auditHookAssets, collectHookMarkerPaths, collectHookMarkerPathsAsync, getPermissionHookDiagnosticsPath, getPrimaryHookScriptPath, installHookAssetsForHost, normalizeHookHost, readLastPermissionHookDiagnostic, readHostSpecificHookStatus, summarizeMarkerStatuses, supportsManagedHookAssets, } from './permissionHookShared.js';
4
4
  let lastPermissionHookStartupRepairSummary = null;
5
5
  export function getPermissionHookStatus(homeDir = homedir(), host) {
6
6
  if (host) {
@@ -122,11 +122,15 @@ export async function getPermissionHookAuditSummary(homeDir = homedir()) {
122
122
  const needsRepairHosts = statuses
123
123
  .filter(({ status }) => status.needsRepair)
124
124
  .map(({ host }) => host);
125
+ const diagnosticsPath = getPermissionHookDiagnosticsPath(homeDir);
126
+ const lastDiagnostic = await readLastPermissionHookDiagnostic(homeDir);
125
127
  return {
126
128
  installedHosts,
127
129
  currentHosts,
128
130
  repairedHosts,
129
131
  needsRepairHosts,
132
+ diagnosticsPath,
133
+ lastDiagnostic,
130
134
  lastStartupRepair: getLastPermissionHookStartupRepairSummary(),
131
135
  };
132
136
  }
@@ -253,4 +257,4 @@ export async function repairPermissionHooksOnStartup(homeDir = homedir(), source
253
257
  `(repaired=${repairedCount}, needsRepair=${needsRepairCount})`);
254
258
  return summary;
255
259
  }
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbkhvb2tTdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGVybWlzc2lvbkhvb2tTdGF0dXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFRTCwwQkFBMEIsRUFDMUIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qix5QkFBeUIsR0FDMUIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxJQUFJLHNDQUFzQyxHQUE4QyxJQUFJLENBQUM7QUFFN0YsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFhO0lBQ3hFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxPQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsT0FBTyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QixDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFhO0lBQ25GLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxPQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLE1BQTRCLEVBQzVCLEtBQTJCO0lBRTNCLE9BQU8sT0FBTyxD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QUFNLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNyRCxNQUFNLENBQUMsT0FBTyxLQUFLLGNBQWMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQXVDO1FBQ2xELFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUU7UUFDaEQsVUFBVSxFQUFFLFdBQVcsR0FBRyxTQUFTO1FBQ25DLGFBQWE7UUFDYixnQkFBZ0I7UUFDaEIsV0FBVztLQUNaLENBQUM7SUFDRixzQ0FBc0MsR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RSxNQUFNLENBQUMsSUFBSSxDQUNULDJEQUEyRCxPQUFPLENBQUMsVUFBVSxLQUFLO1FBQ2xGLGFBQWEsYUFBYSxpQkFBaUIsZ0JBQWdCLEdBQUcsQ0FDL0QsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rSGVhbHRoU3VtbWFyeSxcbiAgdHlwZSBIb29rQXNzZXRBdWRpdFJlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnksXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tTdGF0dXMsXG4gIHR5cGUgUmVjb25jaWxlUGVybWlzc2lvbkhvb2tPcHRpb25zLFxuICBBVVRPX1JFUEFJUkFCTEVfSE9PS19IT1NUUyxcbiAgYXVkaXRIb29rQXNzZXRzLFxuICBjb2xsZWN0SG9va01hcmtlclBhdGhzLFxuICBjb2xsZWN0SG9va01hcmtlclBhdGhzQXN5bmMsXG4gIGdldFByaW1hcnlIb29rU2NyaXB0UGF0aCxcbiAgaW5zdGFsbEhvb2tBc3NldHNGb3JIb3N0LFxuICBub3JtYWxpemVIb29rSG9zdCxcbiAgcmVhZEhvc3RTcGVjaWZpY0hvb2tTdGF0dXMsXG4gIHN1bW1hcml6ZU1hcmtlclN0YXR1c2VzLFxuICBzdXBwb3J0c01hbmFnZWRIb29rQXNzZXRzLFxufSBmcm9tICcuL3Blcm1pc3Npb25Ib29rU2hhcmVkLmpzJztcblxubGV0IGxhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5OiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQZXJtaXNzaW9uSG9va1N0YXR1cyhob21lRGlyID0gaG9tZWRpcigpLCBob3N0Pzogc3RyaW5nKTogUGVybWlzc2lvbkhvb2tTdGF0dXMge1xuICBpZiAoaG9zdCkge1xuICAgIHJldHVybiByZWFkSG9zdFNwZWNpZmljSG9va1N0YXR1cyhob21lRGlyLCBob3N0KTtcbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpemVNYXJrZXJTdGF0dXNlcyhjb2xsZWN0SG9va01hcmtlclBhdGhzKGhvbWVEaXIpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoaG9tZURpciA9IGhvbWVkaXIoKSwgaG9zdD86IHN0cmluZyk6IFByb21pc2U8UGVybWlzc2lvbkhvb2tTdGF0dXM+IHtcbiAgaWYgKGhvc3QpIHtcbiAgICByZXR1cm4gcmVhZEhvc3RTcGVjaWZpY0hvb2tTdGF0dXMoaG9tZURpciwgaG9zdCk7XG4gIH1cblxuICByZXR1cm4gc3VtbWFyaXplTWFya2VyU3RhdHVzZXMoYXdhaXQgY29sbGVjdEhvb2tNYXJrZXJQYXRoc0FzeW5jKGhvbWVEaXIpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQXR0ZW1wdEhvb2tBc3NldFJlcGFpcihcbiAgc3RhdHVzOiBQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgYXVkaXQ6IEhvb2tBc3NldEF1ZGl0UmVzdWx0LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHN0YXR1cy5pbnN0YWxsZWRcbiAgICB8fCBzdGF0dXMuYXNzZXRzUHJlcGFyZWRcbiAgICB8fCBzdGF0dXMuc2NyaXB0UGF0aFxuICAgIHx8IGF1ZGl0LmFzc2V0c1ByZXBhcmVkXG4gICAgfHwgYXVkaXQuc3RhbGVBc3NldHMubGVuZ3RoID4gMCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRGYWxsYmFja1Blcm1pc3Npb25Ib29rU3RhdHVzKFxuICBiYXNlU3RhdHVzOiBQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgbm9ybWFsaXplZEhvc3Q6IHN0cmluZyxcbiAgaG9tZURpcjogc3RyaW5nLFxuKTogUGVybWlzc2lvbkhvb2tTdGF0dXMge1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VTdGF0dXMsXG4gICAgaG9zdDogYmFzZVN0YXR1cy5ob3N0ID8/IG5vcm1hbGl6ZWRIb3N0LFxuICAgIHNjcmlwdFBhdGg6IGJhc2VTdGF0dXMuc2NyaXB0UGF0aCA/PyBnZXRQcmltYXJ5SG9va1NjcmlwdFBhdGgobm9ybWFsaXplZEhvc3QsIGhvbWVEaXIpLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhdWRpdEFuZE1heWJlUmVwYWlySG9va0Fzc2V0cyhcbiAgbm9ybWFsaXplZEhvc3Q6IHN0cmluZyxcbiAgaG9tZURpcjogc3RyaW5nLFxuICBzb3VyY2VTY3JpcHRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGF1dG9SZXBhaXI6IGJvb2xlYW4sXG4gIGZhbGxiYWNrU3RhdHVzOiBQZXJtaXNzaW9uSG9va1N0YXR1cyxcbik6IFByb21pc2U8eyBhdWRpdDogSG9va0Fzc2V0QXVkaXRSZXN1bHQ7IGF1dG9SZXBhaXJlZDogYm9vbGVhbiB9PiB7XG4gIGxldCBhdWRpdCA9IGF3YWl0IGF1ZGl0SG9va0Fzc2V0cyhub3JtYWxpemVkSG9zdCwgaG9tZURpciwgc291cmNlU2NyaXB0UGF0aCk7XG4gIGxldCBhdXRvUmVwYWlyZWQgPSBmYWxzZTtcblxuICBpZiAoIWF1ZGl0LmFzc2V0c0N1cnJlbnQgJiYgYXV0b1JlcGFpciAmJiBzaG91bGRBdHRlbXB0SG9va0Fzc2V0UmVwYWlyKGZhbGxiYWNrU3RhdHVzLCBhdWRpdCkpIHtcbiAgICBhd2FpdCBpbnN0YWxsSG9va0Fzc2V0c0Zvckhvc3Qobm9ybWFsaXplZEhvc3QsIGhvbWVEaXIsIHNvdXJjZVNjcmlwdFBhdGgpO1xuICAgIGF1ZGl0ID0gYXdhaXQgYXVkaXRIb29rQXNzZXRzKG5vcm1hbGl6ZWRIb3N0LCBob21lRGlyLCBzb3VyY2VTY3JpcHRQYXRoKTtcbiAgICBhdXRvUmVwYWlyZWQgPSBhdWRpdC5hc3NldHNDdXJyZW50O1xuICB9XG5cbiAgcmV0dXJuIHsgYXVkaXQsIGF1dG9SZXBhaXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhvb2tSZXBhaXJGYWlsdXJlU3RhdHVzKFxuICBmYWxsYmFja1N0YXR1czogUGVybWlzc2lvbkhvb2tTdGF0dXMsXG4gIGVycm9yOiB1bmtub3duLFxuKTogUGVybWlzc2lvbkhvb2tTdGF0dXMge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICBsb2dnZXIud2FybihgW1Blcm1pc3Npb25Ib29rc10gRmFpbGVkIHRvIHJlY29uY2lsZSBob29rIGFzc2V0cyBmb3IgJHtmYWxsYmFja1N0YXR1cy5ob3N0fTogJHttZXNzYWdlfWApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uZmFsbGJhY2tTdGF0dXMsXG4gICAgYXNzZXRzQ3VycmVudDogZmFsc2UsXG4gICAgYXV0b1JlcGFpcmVkOiBmYWxzZSxcbiAgICBuZWVkc1JlcGFpcjogdHJ1ZSxcbiAgICByZXBhaXJFcnJvcjogbWVzc2FnZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9TdGFydHVwUmVwYWlyT3V0Y29tZShzdGF0dXM6IFBlcm1pc3Npb25Ib29rU3RhdHVzKTogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdFsnb3V0Y29tZSddIHtcbiAgaWYgKHN0YXR1cy5yZXBhaXJFcnJvcikgcmV0dXJuICdlcnJvcic7XG4gIGlmIChzdGF0dXMuYXV0b1JlcGFpcmVkKSByZXR1cm4gJ3JlcGFpcmVkJztcbiAgaWYgKHN0YXR1cy5uZWVkc1JlcGFpciAmJiAoc3RhdHVzLmluc3RhbGxlZCB8fCBzdGF0dXMuYXNzZXRzUHJlcGFyZWQpKSByZXR1cm4gJ25lZWRzX3JlcGFpcic7XG4gIGlmIChzdGF0dXMuYXNzZXRzQ3VycmVudCkgcmV0dXJuICdjdXJyZW50JztcbiAgcmV0dXJuICdub3RfaW5zdGFsbGVkJztcbn1cblxuZnVuY3Rpb24gdG9TdGFydHVwUmVwYWlySG9zdFJlc3VsdChcbiAgaG9zdDogc3RyaW5nLFxuICBzdGF0dXM6IFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuKTogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdHVzLFxuICAgIGhvc3QsXG4gICAgb3V0Y29tZTogdG9TdGFydHVwUmVwYWlyT3V0Y29tZShzdGF0dXMpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjbG9uZVN0YXJ0dXBSZXBhaXJTdW1tYXJ5KFxuICBzdW1tYXJ5OiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5IHwgbnVsbCxcbik6IFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgfCBudWxsIHtcbiAgaWYgKCFzdW1tYXJ5KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdW1tYXJ5LFxuICAgIGhvc3RSZXN1bHRzOiBzdW1tYXJ5Lmhvc3RSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiAoeyAuLi5yZXN1bHQgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkoKTogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSB8IG51bGwge1xuICByZXR1cm4gY2xvbmVTdGFydHVwUmVwYWlyU3VtbWFyeShsYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5Rm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5ID0gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzKFxuICBob3N0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlY29uY2lsZVBlcm1pc3Npb25Ib29rT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uSG9va1N0YXR1cz4ge1xuICBjb25zdCBub3JtYWxpemVkSG9zdCA9IG5vcm1hbGl6ZUhvb2tIb3N0KGhvc3QpO1xuICBjb25zdCBob21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3Qgc291cmNlU2NyaXB0UGF0aCA9IG9wdGlvbnMuc291cmNlU2NyaXB0UGF0aDtcbiAgY29uc3QgYXV0b1JlcGFpciA9IG9wdGlvbnMuYXV0b1JlcGFpciA/PyBmYWxzZTtcbiAgY29uc3QgYmFzZVN0YXR1cyA9IHJlYWRIb3N0U3BlY2lmaWNIb29rU3RhdHVzKGhvbWVEaXIsIG5vcm1hbGl6ZWRIb3N0KTtcblxuICBpZiAoIXN1cHBvcnRzTWFuYWdlZEhvb2tBc3NldHMobm9ybWFsaXplZEhvc3QpKSB7XG4gICAgcmV0dXJuIGJhc2VTdGF0dXM7XG4gIH1cblxuICBjb25zdCBmYWxsYmFja1N0YXR1cyA9IGJ1aWxkRmFsbGJhY2tQZXJtaXNzaW9uSG9va1N0YXR1cyhiYXNlU3RhdHVzLCBub3JtYWxpemVkSG9zdCwgaG9tZURpcik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGF1ZGl0LCBhdXRvUmVwYWlyZWQgfSA9IGF3YWl0IGF1ZGl0QW5kTWF5YmVSZXBhaXJIb29rQXNzZXRzKFxuICAgICAgbm9ybWFsaXplZEhvc3QsXG4gICAgICBob21lRGlyLFxuICAgICAgc291cmNlU2NyaXB0UGF0aCxcbiAgICAgIGF1dG9SZXBhaXIsXG4gICAgICBmYWxsYmFja1N0YXR1cyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZhbGxiYWNrU3RhdHVzLFxuICAgICAgYXNzZXRzUHJlcGFyZWQ6IGF1ZGl0LmFzc2V0c1ByZXBhcmVkLFxuICAgICAgYXNzZXRzQ3VycmVudDogYXVkaXQuYXNzZXRzQ3VycmVudCxcbiAgICAgIGF1dG9SZXBhaXJlZCxcbiAgICAgIG5lZWRzUmVwYWlyOiAhYXVkaXQuYXNzZXRzQ3VycmVudCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBidWlsZEhvb2tSZXBhaXJGYWlsdXJlU3RhdHVzKGZhbGxiYWNrU3RhdHVzLCBlcnJvcik7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5KGhvbWVEaXIgPSBob21lZGlyKCkpOiBQcm9taXNlPFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5PiB7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQVVUT19SRVBBSVJBQkxFX0hPT0tfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyIH0pLFxuICAgIH0pKSxcbiAgKTtcblxuICBjb25zdCBpbnN0YWxsZWRIb3N0cyA9IHN0YXR1c2VzXG4gICAgLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzLmluc3RhbGxlZCB8fCBzdGF0dXMuYXNzZXRzUHJlcGFyZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuICBjb25zdCBjdXJyZW50SG9zdHMgPSBzdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5hc3NldHNDdXJyZW50KVxuICAgIC5tYXAoKHsgaG9zdCB9KSA9PiBob3N0KTtcbiAgY29uc3QgcmVwYWlyZWRIb3N0cyA9IHN0YXR1c2VzXG4gICAgLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzLmF1dG9SZXBhaXJlZClcbiAgICAubWFwKCh7IGhvc3QgfSkgPT4gaG9zdCk7XG4gIGNvbnN0IG5lZWRzUmVwYWlySG9zdHMgPSBzdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5uZWVkc1JlcGFpcilcbiAgICAubWFwKCh7IGhvc3QgfSkgPT4gaG9zdCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YWxsZWRIb3N0cyxcbiAgICBjdXJyZW50SG9zdHMsXG4gICAgcmVwYWlyZWRIb3N0cyxcbiAgICBuZWVkc1JlcGFpckhvc3RzLFxuICAgIGxhc3RTdGFydHVwUmVwYWlyOiBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIb29rSG9zdExhYmVsKGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y291bnR9IGhvb2sgaG9zdCR7Y291bnQgPT09IDEgPyAnJyA6ICdzJ31gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIb29rVmVyYihjb3VudDogbnVtYmVyLCBzaW5ndWxhcjogc3RyaW5nLCBwbHVyYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb3VudCA9PT0gMSA/IHNpbmd1bGFyIDogcGx1cmFsO1xufVxuXG5mdW5jdGlvbiBidWlsZFBlcm1pc3Npb25Ib29rSGVhbHRoTWVzc2FnZShcbiAgc3VtbWFyeTogUGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnksXG4gIGhhZEVycm9yczogYm9vbGVhbixcbiAgcmVwYWlyZWRDb3VudDogbnVtYmVyLFxuICBuZWVkc1JlcGFpckNvdW50OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBpZiAoaGFkRXJyb3JzKSB7XG4gICAgaWYgKG5lZWRzUmVwYWlyQ291bnQgPiAwKSB7XG4gICAgICBjb25zdCBob3N0TGFiZWwgPSBmb3JtYXRIb29rSG9zdExhYmVsKG5lZWRzUmVwYWlyQ291bnQpO1xuICAgICAgY29uc3QgdmVyYiA9IGZvcm1hdEhvb2tWZXJiKG5lZWRzUmVwYWlyQ291bnQsICduZWVkcycsICduZWVkJyk7XG4gICAgICByZXR1cm4gYCR7aG9zdExhYmVsfSBzdGlsbCAke3ZlcmJ9IGF0dGVudGlvbiBhZnRlciBzdGFydHVwIHJlcGFpcmA7XG4gICAgfVxuXG4gICAgcmV0dXJuICdBIHN0YXJ0dXAgaG9vayByZXBhaXIgZmFpbGVkIGFuZCBuZWVkcyBhdHRlbnRpb24nO1xuICB9XG5cbiAgaWYgKG5lZWRzUmVwYWlyQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaG9zdExhYmVsID0gZm9ybWF0SG9va0hvc3RMYWJlbChuZWVkc1JlcGFpckNvdW50KTtcbiAgICBjb25zdCB2ZXJiID0gZm9ybWF0SG9va1ZlcmIobmVlZHNSZXBhaXJDb3VudCwgJ25lZWRzJywgJ25lZWQnKTtcbiAgICByZXR1cm4gYCR7aG9zdExhYmVsfSBzdGlsbCAke3ZlcmJ9IHJlcGFpcmA7XG4gIH1cblxuICBpZiAocmVwYWlyZWRDb3VudCA+IDApIHtcbiAgICBjb25zdCBob3N0TGFiZWwgPSBmb3JtYXRIb29rSG9zdExhYmVsKHJlcGFpcmVkQ291bnQpO1xuICAgIHJldHVybiBgJHtob3N0TGFiZWx9IHJlcGFpcmVkIG9uIHN0YXJ0dXBgO1xuICB9XG5cbiAgaWYgKHN1bW1hcnkuY3VycmVudEhvc3RzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gJ01hbmFnZWQgaG9vayBhc3NldHMgYXJlIGN1cnJlbnQnO1xuICB9XG5cbiAgcmV0dXJuICdObyBtYW5hZ2VkIGhvb2sgYXNzZXRzIGN1cnJlbnRseSBpbnN0YWxsZWQnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgoXG4gIHN1bW1hcnk6IFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5LFxuKTogUGVybWlzc2lvbkhvb2tIZWFsdGhTdW1tYXJ5IHtcbiAgY29uc3QgbGFzdFN0YXJ0dXBSZXBhaXIgPSBzdW1tYXJ5Lmxhc3RTdGFydHVwUmVwYWlyO1xuICBjb25zdCBoYWRFcnJvcnMgPSBCb29sZWFuKFxuICAgIGxhc3RTdGFydHVwUmVwYWlyPy5ob3N0UmVzdWx0cy5zb21lKChyZXN1bHQpID0+IHJlc3VsdC5vdXRjb21lID09PSAnZXJyb3InKSxcbiAgKTtcbiAgY29uc3QgbmVlZHNSZXBhaXJDb3VudCA9IGxhc3RTdGFydHVwUmVwYWlyPy5uZWVkc1JlcGFpckNvdW50ID8/IHN1bW1hcnkubmVlZHNSZXBhaXJIb3N0cy5sZW5ndGg7XG4gIGNvbnN0IHJlcGFpcmVkQ291bnQgPSBsYXN0U3RhcnR1cFJlcGFpcj8ucmVwYWlyZWRDb3VudCA/PyBzdW1tYXJ5LnJlcGFpcmVkSG9zdHMubGVuZ3RoO1xuICBjb25zdCBtZXNzYWdlID0gYnVpbGRQZXJtaXNzaW9uSG9va0hlYWx0aE1lc3NhZ2UoXG4gICAgc3VtbWFyeSxcbiAgICBoYWRFcnJvcnMsXG4gICAgcmVwYWlyZWRDb3VudCxcbiAgICBuZWVkc1JlcGFpckNvdW50LFxuICApO1xuXG4gIGlmIChoYWRFcnJvcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHJlcGFpcmVkQ291bnQsXG4gICAgICBuZWVkc1JlcGFpckNvdW50LFxuICAgICAgbGFzdENoZWNrZWRBdDogbGFzdFN0YXJ0dXBSZXBhaXI/LmNvbXBsZXRlZEF0LFxuICAgIH07XG4gIH1cblxuICBpZiAobmVlZHNSZXBhaXJDb3VudCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcmVwYWlyZWRDb3VudCxcbiAgICAgIG5lZWRzUmVwYWlyQ291bnQsXG4gICAgICBsYXN0Q2hlY2tlZEF0OiBsYXN0U3RhcnR1cFJlcGFpcj8uY29tcGxldGVkQXQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXBhaXJlZENvdW50ID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdvaycsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcmVwYWlyZWRDb3VudCxcbiAgICAgIG5lZWRzUmVwYWlyQ291bnQsXG4gICAgICBsYXN0Q2hlY2tlZEF0OiBsYXN0U3RhcnR1cFJlcGFpcj8uY29tcGxldGVkQXQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiAnb2snLFxuICAgIG1lc3NhZ2UsXG4gICAgcmVwYWlyZWRDb3VudCxcbiAgICBuZWVkc1JlcGFpckNvdW50LFxuICAgIGxhc3RDaGVja2VkQXQ6IGxhc3RTdGFydHVwUmVwYWlyPy5jb21wbGV0ZWRBdCxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGFpclBlcm1pc3Npb25Ib29rc09uU3RhcnR1cChcbiAgaG9tZURpciA9IGhvbWVkaXIoKSxcbiAgc291cmNlU2NyaXB0UGF0aD86IHN0cmluZyxcbik6IFByb21pc2U8UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBzdGFydGVkQXRJc28gPSBuZXcgRGF0ZShzdGFydGVkQXQpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IGhvc3RSZXN1bHRzOiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0W10gPSBbXTtcblxuICAvLyBQcm9jZXNzIHNlcXVlbnRpYWxseSBiZWNhdXNlIHNldmVyYWwgaG9zdHMgc2hhcmUgdGhlIHNhbWUgYnJpZGdlL2hlbHBlclxuICAvLyB0YXJnZXRzIHVuZGVyIH4vLmRvbGxob3VzZS9ob29rcywgYW5kIGNvbmN1cnJlbnQgd3JpdGVzIGFyZSBmbGFreSBvbiBXaW5kb3dzLlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgQVVUT19SRVBBSVJBQkxFX0hPT0tfSE9TVFMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwge1xuICAgICAgICBob21lRGlyLFxuICAgICAgICBhdXRvUmVwYWlyOiB0cnVlLFxuICAgICAgICBzb3VyY2VTY3JpcHRQYXRoLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0dXMuYXV0b1JlcGFpcmVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbUGVybWlzc2lvbkhvb2tzXSBSZWZyZXNoZWQgaW5zdGFsbGVkIGhvb2sgYXNzZXRzIGZvciAke2hvc3R9YCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5uZWVkc1JlcGFpciAmJiBzdGF0dXMuaW5zdGFsbGVkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBbUGVybWlzc2lvbkhvb2tzXSBIb29rIGFzc2V0cyBzdGlsbCBuZWVkIHJlcGFpciBmb3IgJHtob3N0fWAgK1xuICAgICAgICAgIChzdGF0dXMucmVwYWlyRXJyb3IgPyBgOiAke3N0YXR1cy5yZXBhaXJFcnJvcn1gIDogJycpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBob3N0UmVzdWx0cy5wdXNoKHRvU3RhcnR1cFJlcGFpckhvc3RSZXN1bHQoaG9zdCwgc3RhdHVzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBsb2dnZXIud2FybihgW1Blcm1pc3Npb25Ib29rc10gU3RhcnR1cCBob29rIHJlcGFpciBmYWlsZWQgZm9yICR7aG9zdH06ICR7bWVzc2FnZX1gKTtcbiAgICAgIGhvc3RSZXN1bHRzLnB1c2goe1xuICAgICAgICBob3N0LFxuICAgICAgICBpbnN0YWxsZWQ6IGZhbHNlLFxuICAgICAgICBhc3NldHNQcmVwYXJlZDogZmFsc2UsXG4gICAgICAgIGFzc2V0c0N1cnJlbnQ6IGZhbHNlLFxuICAgICAgICBhdXRvUmVwYWlyZWQ6IGZhbHNlLFxuICAgICAgICBuZWVkc1JlcGFpcjogdHJ1ZSxcbiAgICAgICAgcmVwYWlyRXJyb3I6IG1lc3NhZ2UsXG4gICAgICAgIG91dGNvbWU6ICdlcnJvcicsXG4gICAgICB9IHNhdGlzZmllcyBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVwYWlyZWRDb3VudCA9IGhvc3RSZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQub3V0Y29tZSA9PT0gJ3JlcGFpcmVkJykubGVuZ3RoO1xuICBjb25zdCBuZWVkc1JlcGFpckNvdW50ID0gaG9zdFJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+XG4gICAgcmVzdWx0Lm91dGNvbWUgPT09ICduZWVkc19yZXBhaXInIHx8IHJlc3VsdC5vdXRjb21lID09PSAnZXJyb3InKS5sZW5ndGg7XG4gIGNvbnN0IGNvbXBsZXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3VtbWFyeTogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSA9IHtcbiAgICBzdGFydGVkQXQ6IHN0YXJ0ZWRBdElzbyxcbiAgICBjb21wbGV0ZWRBdDogbmV3IERhdGUoY29tcGxldGVkQXQpLnRvSVNPU3RyaW5nKCksXG4gICAgZHVyYXRpb25NczogY29tcGxldGVkQXQgLSBzdGFydGVkQXQsXG4gICAgcmVwYWlyZWRDb3VudCxcbiAgICBuZWVkc1JlcGFpckNvdW50LFxuICAgIGhvc3RSZXN1bHRzLFxuICB9O1xuICBsYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSA9IGNsb25lU3RhcnR1cFJlcGFpclN1bW1hcnkoc3VtbWFyeSk7XG4gIGxvZ2dlci5pbmZvKFxuICAgIGBbUGVybWlzc2lvbkhvb2tzXSBTdGFydHVwIGhvb2sgYXNzZXQgYXVkaXQgY29tcGxldGVkIGluICR7c3VtbWFyeS5kdXJhdGlvbk1zfW1zIGAgK1xuICAgIGAocmVwYWlyZWQ9JHtyZXBhaXJlZENvdW50fSwgbmVlZHNSZXBhaXI9JHtuZWVkc1JlcGFpckNvdW50fSlgLFxuICApO1xuICByZXR1cm4gc3VtbWFyeTtcbn1cbiJdfQ==
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbkhvb2tTdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGVybWlzc2lvbkhvb2tTdGF0dXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFRTCwwQkFBMEIsRUFDMUIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLGdDQUFnQyxFQUNoQywwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixHQUMxQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLElBQUksc0NBQXNDLEdBQThDLElBQUksQ0FBQztBQUU3RixNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQWE7SUFDeEUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sMEJBQTBCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPLHVCQUF1QixDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsNEJBQTRCLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQWE7SUFDbkYsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sMEJBQTBCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPLHVCQUF1QixDQUFDLE1BQU0sMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FDbkMsTUFBNEIsRUFD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Z0JBQ2pCLFdBQVcsRUFBRSxPQUFPO2dCQUNwQixPQUFPLEVBQUUsT0FBTzthQUMrQixDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNyRCxNQUFNLENBQUMsT0FBTyxLQUFLLGNBQWMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQXVDO1FBQ2xELFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUU7UUFDaEQsVUFBVSxFQUFFLFdBQVcsR0FBRyxTQUFTO1FBQ25DLGFBQWE7UUFDYixnQkFBZ0I7UUFDaEIsV0FBVztLQUNaLENBQUM7SUFDRixzQ0FBc0MsR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RSxNQUFNLENBQUMsSUFBSSxDQUNULDJEQUEyRCxPQUFPLENBQUMsVUFBVSxLQUFLO1FBQ2xGLGFBQWEsYUFBYSxpQkFBaUIsZ0JBQWdCLEdBQUcsQ0FDL0QsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rSGVhbHRoU3VtbWFyeSxcbiAgdHlwZSBIb29rQXNzZXRBdWRpdFJlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnksXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tTdGF0dXMsXG4gIHR5cGUgUmVjb25jaWxlUGVybWlzc2lvbkhvb2tPcHRpb25zLFxuICBBVVRPX1JFUEFJUkFCTEVfSE9PS19IT1NUUyxcbiAgYXVkaXRIb29rQXNzZXRzLFxuICBjb2xsZWN0SG9va01hcmtlclBhdGhzLFxuICBjb2xsZWN0SG9va01hcmtlclBhdGhzQXN5bmMsXG4gIGdldFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpY3NQYXRoLFxuICBnZXRQcmltYXJ5SG9va1NjcmlwdFBhdGgsXG4gIGluc3RhbGxIb29rQXNzZXRzRm9ySG9zdCxcbiAgbm9ybWFsaXplSG9va0hvc3QsXG4gIHJlYWRMYXN0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljLFxuICByZWFkSG9zdFNwZWNpZmljSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplTWFya2VyU3RhdHVzZXMsXG4gIHN1cHBvcnRzTWFuYWdlZEhvb2tBc3NldHMsXG59IGZyb20gJy4vcGVybWlzc2lvbkhvb2tTaGFyZWQuanMnO1xuXG5sZXQgbGFzdFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnk6IFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzKGhvbWVEaXIgPSBob21lZGlyKCksIGhvc3Q/OiBzdHJpbmcpOiBQZXJtaXNzaW9uSG9va1N0YXR1cyB7XG4gIGlmIChob3N0KSB7XG4gICAgcmV0dXJuIHJlYWRIb3N0U3BlY2lmaWNIb29rU3RhdHVzKGhvbWVEaXIsIGhvc3QpO1xuICB9XG5cbiAgcmV0dXJuIHN1bW1hcml6ZU1hcmtlclN0YXR1c2VzKGNvbGxlY3RIb29rTWFya2VyUGF0aHMoaG9tZURpcikpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXNBc3luYyhob21lRGlyID0gaG9tZWRpcigpLCBob3N0Pzogc3RyaW5nKTogUHJvbWlzZTxQZXJtaXNzaW9uSG9va1N0YXR1cz4ge1xuICBpZiAoaG9zdCkge1xuICAgIHJldHVybiByZWFkSG9zdFNwZWNpZmljSG9va1N0YXR1cyhob21lRGlyLCBob3N0KTtcbiAgfVxuXG4gIHJldHVybiBzdW1tYXJpemVNYXJrZXJTdGF0dXNlcyhhd2FpdCBjb2xsZWN0SG9va01hcmtlclBhdGhzQXN5bmMoaG9tZURpcikpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRBdHRlbXB0SG9va0Fzc2V0UmVwYWlyKFxuICBzdGF0dXM6IFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICBhdWRpdDogSG9va0Fzc2V0QXVkaXRSZXN1bHQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgc3RhdHVzLmluc3RhbGxlZFxuICAgIHx8IHN0YXR1cy5hc3NldHNQcmVwYXJlZFxuICAgIHx8IHN0YXR1cy5zY3JpcHRQYXRoXG4gICAgfHwgYXVkaXQuYXNzZXRzUHJlcGFyZWRcbiAgICB8fCBhdWRpdC5zdGFsZUFzc2V0cy5sZW5ndGggPiAwLFxuICApO1xufVxuXG5mdW5jdGlvbiBidWlsZEZhbGxiYWNrUGVybWlzc2lvbkhvb2tTdGF0dXMoXG4gIGJhc2VTdGF0dXM6IFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICBub3JtYWxpemVkSG9zdDogc3RyaW5nLFxuICBob21lRGlyOiBzdHJpbmcsXG4pOiBQZXJtaXNzaW9uSG9va1N0YXR1cyB7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZVN0YXR1cyxcbiAgICBob3N0OiBiYXNlU3RhdHVzLmhvc3QgPz8gbm9ybWFsaXplZEhvc3QsXG4gICAgc2NyaXB0UGF0aDogYmFzZVN0YXR1cy5zY3JpcHRQYXRoID8/IGdldFByaW1hcnlIb29rU2NyaXB0UGF0aChub3JtYWxpemVkSG9zdCwgaG9tZURpciksXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGF1ZGl0QW5kTWF5YmVSZXBhaXJIb29rQXNzZXRzKFxuICBub3JtYWxpemVkSG9zdDogc3RyaW5nLFxuICBob21lRGlyOiBzdHJpbmcsXG4gIHNvdXJjZVNjcmlwdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYXV0b1JlcGFpcjogYm9vbGVhbixcbiAgZmFsbGJhY2tTdGF0dXM6IFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuKTogUHJvbWlzZTx7IGF1ZGl0OiBIb29rQXNzZXRBdWRpdFJlc3VsdDsgYXV0b1JlcGFpcmVkOiBib29sZWFuIH0+IHtcbiAgbGV0IGF1ZGl0ID0gYXdhaXQgYXVkaXRIb29rQXNzZXRzKG5vcm1hbGl6ZWRIb3N0LCBob21lRGlyLCBzb3VyY2VTY3JpcHRQYXRoKTtcbiAgbGV0IGF1dG9SZXBhaXJlZCA9IGZhbHNlO1xuXG4gIGlmICghYXVkaXQuYXNzZXRzQ3VycmVudCAmJiBhdXRvUmVwYWlyICYmIHNob3VsZEF0dGVtcHRIb29rQXNzZXRSZXBhaXIoZmFsbGJhY2tTdGF0dXMsIGF1ZGl0KSkge1xuICAgIGF3YWl0IGluc3RhbGxIb29rQXNzZXRzRm9ySG9zdChub3JtYWxpemVkSG9zdCwgaG9tZURpciwgc291cmNlU2NyaXB0UGF0aCk7XG4gICAgYXVkaXQgPSBhd2FpdCBhdWRpdEhvb2tBc3NldHMobm9ybWFsaXplZEhvc3QsIGhvbWVEaXIsIHNvdXJjZVNjcmlwdFBhdGgpO1xuICAgIGF1dG9SZXBhaXJlZCA9IGF1ZGl0LmFzc2V0c0N1cnJlbnQ7XG4gIH1cblxuICByZXR1cm4geyBhdWRpdCwgYXV0b1JlcGFpcmVkIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSG9va1JlcGFpckZhaWx1cmVTdGF0dXMoXG4gIGZhbGxiYWNrU3RhdHVzOiBQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgZXJyb3I6IHVua25vd24sXG4pOiBQZXJtaXNzaW9uSG9va1N0YXR1cyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gIGxvZ2dlci53YXJuKGBbUGVybWlzc2lvbkhvb2tzXSBGYWlsZWQgdG8gcmVjb25jaWxlIGhvb2sgYXNzZXRzIGZvciAke2ZhbGxiYWNrU3RhdHVzLmhvc3R9OiAke21lc3NhZ2V9YCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5mYWxsYmFja1N0YXR1cyxcbiAgICBhc3NldHNDdXJyZW50OiBmYWxzZSxcbiAgICBhdXRvUmVwYWlyZWQ6IGZhbHNlLFxuICAgIG5lZWRzUmVwYWlyOiB0cnVlLFxuICAgIHJlcGFpckVycm9yOiBtZXNzYWdlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b1N0YXJ0dXBSZXBhaXJPdXRjb21lKHN0YXR1czogUGVybWlzc2lvbkhvb2tTdGF0dXMpOiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0WydvdXRjb21lJ10ge1xuICBpZiAoc3RhdHVzLnJlcGFpckVycm9yKSByZXR1cm4gJ2Vycm9yJztcbiAgaWYgKHN0YXR1cy5hdXRvUmVwYWlyZWQpIHJldHVybiAncmVwYWlyZWQnO1xuICBpZiAoc3RhdHVzLm5lZWRzUmVwYWlyICYmIChzdGF0dXMuaW5zdGFsbGVkIHx8IHN0YXR1cy5hc3NldHNQcmVwYXJlZCkpIHJldHVybiAnbmVlZHNfcmVwYWlyJztcbiAgaWYgKHN0YXR1cy5hc3NldHNDdXJyZW50KSByZXR1cm4gJ2N1cnJlbnQnO1xuICByZXR1cm4gJ25vdF9pbnN0YWxsZWQnO1xufVxuXG5mdW5jdGlvbiB0b1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0KFxuICBob3N0OiBzdHJpbmcsXG4gIHN0YXR1czogUGVybWlzc2lvbkhvb2tTdGF0dXMsXG4pOiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0dXMsXG4gICAgaG9zdCxcbiAgICBvdXRjb21lOiB0b1N0YXJ0dXBSZXBhaXJPdXRjb21lKHN0YXR1cyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsb25lU3RhcnR1cFJlcGFpclN1bW1hcnkoXG4gIHN1bW1hcnk6IFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgfCBudWxsLFxuKTogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSB8IG51bGwge1xuICBpZiAoIXN1bW1hcnkpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIC4uLnN1bW1hcnksXG4gICAgaG9zdFJlc3VsdHM6IHN1bW1hcnkuaG9zdFJlc3VsdHMubWFwKChyZXN1bHQpID0+ICh7IC4uLnJlc3VsdCB9KSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSgpOiBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5IHwgbnVsbCB7XG4gIHJldHVybiBjbG9uZVN0YXJ0dXBSZXBhaXJTdW1tYXJ5KGxhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnlGb3JUZXN0cygpOiB2b2lkIHtcbiAgbGFzdFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgPSBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoXG4gIGhvc3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUmVjb25jaWxlUGVybWlzc2lvbkhvb2tPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFBlcm1pc3Npb25Ib29rU3RhdHVzPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRIb3N0ID0gbm9ybWFsaXplSG9va0hvc3QoaG9zdCk7XG4gIGNvbnN0IGhvbWVEaXIgPSBvcHRpb25zLmhvbWVEaXIgPz8gaG9tZWRpcigpO1xuICBjb25zdCBzb3VyY2VTY3JpcHRQYXRoID0gb3B0aW9ucy5zb3VyY2VTY3JpcHRQYXRoO1xuICBjb25zdCBhdXRvUmVwYWlyID0gb3B0aW9ucy5hdXRvUmVwYWlyID8/IGZhbHNlO1xuICBjb25zdCBiYXNlU3RhdHVzID0gcmVhZEhvc3RTcGVjaWZpY0hvb2tTdGF0dXMoaG9tZURpciwgbm9ybWFsaXplZEhvc3QpO1xuXG4gIGlmICghc3VwcG9ydHNNYW5hZ2VkSG9va0Fzc2V0cyhub3JtYWxpemVkSG9zdCkpIHtcbiAgICByZXR1cm4gYmFzZVN0YXR1cztcbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrU3RhdHVzID0gYnVpbGRGYWxsYmFja1Blcm1pc3Npb25Ib29rU3RhdHVzKGJhc2VTdGF0dXMsIG5vcm1hbGl6ZWRIb3N0LCBob21lRGlyKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHsgYXVkaXQsIGF1dG9SZXBhaXJlZCB9ID0gYXdhaXQgYXVkaXRBbmRNYXliZVJlcGFpckhvb2tBc3NldHMoXG4gICAgICBub3JtYWxpemVkSG9zdCxcbiAgICAgIGhvbWVEaXIsXG4gICAgICBzb3VyY2VTY3JpcHRQYXRoLFxuICAgICAgYXV0b1JlcGFpcixcbiAgICAgIGZhbGxiYWNrU3RhdHVzLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmFsbGJhY2tTdGF0dXMsXG4gICAgICBhc3NldHNQcmVwYXJlZDogYXVkaXQuYXNzZXRzUHJlcGFyZWQsXG4gICAgICBhc3NldHNDdXJyZW50OiBhdWRpdC5hc3NldHNDdXJyZW50LFxuICAgICAgYXV0b1JlcGFpcmVkLFxuICAgICAgbmVlZHNSZXBhaXI6ICFhdWRpdC5hc3NldHNDdXJyZW50LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGJ1aWxkSG9va1JlcGFpckZhaWx1cmVTdGF0dXMoZmFsbGJhY2tTdGF0dXMsIGVycm9yKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnkoaG9tZURpciA9IGhvbWVkaXIoKSk6IFByb21pc2U8UGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnk+IHtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBVVRPX1JFUEFJUkFCTEVfSE9PS19IT1NUUy5tYXAoYXN5bmMgKGhvc3QpID0+ICh7XG4gICAgICBob3N0LFxuICAgICAgc3RhdHVzOiBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob3N0LCB7IGhvbWVEaXIgfSksXG4gICAgfSkpLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbGxlZEhvc3RzID0gc3RhdHVzZXNcbiAgICAuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMuaW5zdGFsbGVkIHx8IHN0YXR1cy5hc3NldHNQcmVwYXJlZClcbiAgICAubWFwKCh7IGhvc3QgfSkgPT4gaG9zdCk7XG4gIGNvbnN0IGN1cnJlbnRIb3N0cyA9IHN0YXR1c2VzXG4gICAgLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzLmFzc2V0c0N1cnJlbnQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuICBjb25zdCByZXBhaXJlZEhvc3RzID0gc3RhdHVzZXNcbiAgICAuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMuYXV0b1JlcGFpcmVkKVxuICAgIC5tYXAoKHsgaG9zdCB9KSA9PiBob3N0KTtcbiAgY29uc3QgbmVlZHNSZXBhaXJIb3N0cyA9IHN0YXR1c2VzXG4gICAgLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzLm5lZWRzUmVwYWlyKVxuICAgIC5tYXAoKHsgaG9zdCB9KSA9PiBob3N0KTtcbiAgY29uc3QgZGlhZ25vc3RpY3NQYXRoID0gZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgoaG9tZURpcik7XG4gIGNvbnN0IGxhc3REaWFnbm9zdGljID0gYXdhaXQgcmVhZExhc3RQZXJtaXNzaW9uSG9va0RpYWdub3N0aWMoaG9tZURpcik7XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YWxsZWRIb3N0cyxcbiAgICBjdXJyZW50SG9zdHMsXG4gICAgcmVwYWlyZWRIb3N0cyxcbiAgICBuZWVkc1JlcGFpckhvc3RzLFxuICAgIGRpYWdub3N0aWNzUGF0aCxcbiAgICBsYXN0RGlhZ25vc3RpYyxcbiAgICBsYXN0U3RhcnR1cFJlcGFpcjogZ2V0TGFzdFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG9va0hvc3RMYWJlbChjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSBob29rIGhvc3Qke2NvdW50ID09PSAxID8gJycgOiAncyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG9va1ZlcmIoY291bnQ6IG51bWJlciwgc2luZ3VsYXI6IHN0cmluZywgcGx1cmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY291bnQgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbn1cblxuZnVuY3Rpb24gYnVpbGRQZXJtaXNzaW9uSG9va0hlYWx0aE1lc3NhZ2UoXG4gIHN1bW1hcnk6IFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5LFxuICBoYWRFcnJvcnM6IGJvb2xlYW4sXG4gIHJlcGFpcmVkQ291bnQ6IG51bWJlcixcbiAgbmVlZHNSZXBhaXJDb3VudDogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgaWYgKGhhZEVycm9ycykge1xuICAgIGlmIChuZWVkc1JlcGFpckNvdW50ID4gMCkge1xuICAgICAgY29uc3QgaG9zdExhYmVsID0gZm9ybWF0SG9va0hvc3RMYWJlbChuZWVkc1JlcGFpckNvdW50KTtcbiAgICAgIGNvbnN0IHZlcmIgPSBmb3JtYXRIb29rVmVyYihuZWVkc1JlcGFpckNvdW50LCAnbmVlZHMnLCAnbmVlZCcpO1xuICAgICAgcmV0dXJuIGAke2hvc3RMYWJlbH0gc3RpbGwgJHt2ZXJifSBhdHRlbnRpb24gYWZ0ZXIgc3RhcnR1cCByZXBhaXJgO1xuICAgIH1cblxuICAgIHJldHVybiAnQSBzdGFydHVwIGhvb2sgcmVwYWlyIGZhaWxlZCBhbmQgbmVlZHMgYXR0ZW50aW9uJztcbiAgfVxuXG4gIGlmIChuZWVkc1JlcGFpckNvdW50ID4gMCkge1xuICAgIGNvbnN0IGhvc3RMYWJlbCA9IGZvcm1hdEhvb2tIb3N0TGFiZWwobmVlZHNSZXBhaXJDb3VudCk7XG4gICAgY29uc3QgdmVyYiA9IGZvcm1hdEhvb2tWZXJiKG5lZWRzUmVwYWlyQ291bnQsICduZWVkcycsICduZWVkJyk7XG4gICAgcmV0dXJuIGAke2hvc3RMYWJlbH0gc3RpbGwgJHt2ZXJifSByZXBhaXJgO1xuICB9XG5cbiAgaWYgKHJlcGFpcmVkQ291bnQgPiAwKSB7XG4gICAgY29uc3QgaG9zdExhYmVsID0gZm9ybWF0SG9va0hvc3RMYWJlbChyZXBhaXJlZENvdW50KTtcbiAgICByZXR1cm4gYCR7aG9zdExhYmVsfSByZXBhaXJlZCBvbiBzdGFydHVwYDtcbiAgfVxuXG4gIGlmIChzdW1tYXJ5LmN1cnJlbnRIb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuICdNYW5hZ2VkIGhvb2sgYXNzZXRzIGFyZSBjdXJyZW50JztcbiAgfVxuXG4gIHJldHVybiAnTm8gbWFuYWdlZCBob29rIGFzc2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoKFxuICBzdW1tYXJ5OiBQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeSxcbik6IFBlcm1pc3Npb25Ib29rSGVhbHRoU3VtbWFyeSB7XG4gIGNvbnN0IGxhc3RTdGFydHVwUmVwYWlyID0gc3VtbWFyeS5sYXN0U3RhcnR1cFJlcGFpcjtcbiAgY29uc3QgaGFkRXJyb3JzID0gQm9vbGVhbihcbiAgICBsYXN0U3RhcnR1cFJlcGFpcj8uaG9zdFJlc3VsdHMuc29tZSgocmVzdWx0KSA9PiByZXN1bHQub3V0Y29tZSA9PT0gJ2Vycm9yJyksXG4gICk7XG4gIGNvbnN0IG5lZWRzUmVwYWlyQ291bnQgPSBsYXN0U3RhcnR1cFJlcGFpcj8ubmVlZHNSZXBhaXJDb3VudCA/PyBzdW1tYXJ5Lm5lZWRzUmVwYWlySG9zdHMubGVuZ3RoO1xuICBjb25zdCByZXBhaXJlZENvdW50ID0gbGFzdFN0YXJ0dXBSZXBhaXI/LnJlcGFpcmVkQ291bnQgPz8gc3VtbWFyeS5yZXBhaXJlZEhvc3RzLmxlbmd0aDtcbiAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkUGVybWlzc2lvbkhvb2tIZWFsdGhNZXNzYWdlKFxuICAgIHN1bW1hcnksXG4gICAgaGFkRXJyb3JzLFxuICAgIHJlcGFpcmVkQ291bnQsXG4gICAgbmVlZHNSZXBhaXJDb3VudCxcbiAgKTtcblxuICBpZiAoaGFkRXJyb3JzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICByZXBhaXJlZENvdW50LFxuICAgICAgbmVlZHNSZXBhaXJDb3VudCxcbiAgICAgIGxhc3RDaGVja2VkQXQ6IGxhc3RTdGFydHVwUmVwYWlyPy5jb21wbGV0ZWRBdCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG5lZWRzUmVwYWlyQ291bnQgPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHJlcGFpcmVkQ291bnQsXG4gICAgICBuZWVkc1JlcGFpckNvdW50LFxuICAgICAgbGFzdENoZWNrZWRBdDogbGFzdFN0YXJ0dXBSZXBhaXI/LmNvbXBsZXRlZEF0LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVwYWlyZWRDb3VudCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnb2snLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHJlcGFpcmVkQ291bnQsXG4gICAgICBuZWVkc1JlcGFpckNvdW50LFxuICAgICAgbGFzdENoZWNrZWRBdDogbGFzdFN0YXJ0dXBSZXBhaXI/LmNvbXBsZXRlZEF0LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXR1czogJ29rJyxcbiAgICBtZXNzYWdlLFxuICAgIHJlcGFpcmVkQ291bnQsXG4gICAgbmVlZHNSZXBhaXJDb3VudCxcbiAgICBsYXN0Q2hlY2tlZEF0OiBsYXN0U3RhcnR1cFJlcGFpcj8uY29tcGxldGVkQXQsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBhaXJQZXJtaXNzaW9uSG9va3NPblN0YXJ0dXAoXG4gIGhvbWVEaXIgPSBob21lZGlyKCksXG4gIHNvdXJjZVNjcmlwdFBhdGg/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnk+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3RhcnRlZEF0SXNvID0gbmV3IERhdGUoc3RhcnRlZEF0KS50b0lTT1N0cmluZygpO1xuICBjb25zdCBob3N0UmVzdWx0czogUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdFtdID0gW107XG5cbiAgLy8gUHJvY2VzcyBzZXF1ZW50aWFsbHkgYmVjYXVzZSBzZXZlcmFsIGhvc3RzIHNoYXJlIHRoZSBzYW1lIGJyaWRnZS9oZWxwZXJcbiAgLy8gdGFyZ2V0cyB1bmRlciB+Ly5kb2xsaG91c2UvaG9va3MsIGFuZCBjb25jdXJyZW50IHdyaXRlcyBhcmUgZmxha3kgb24gV2luZG93cy5cbiAgZm9yIChjb25zdCBob3N0IG9mIEFVVE9fUkVQQUlSQUJMRV9IT09LX0hPU1RTKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzKGhvc3QsIHtcbiAgICAgICAgaG9tZURpcixcbiAgICAgICAgYXV0b1JlcGFpcjogdHJ1ZSxcbiAgICAgICAgc291cmNlU2NyaXB0UGF0aCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc3RhdHVzLmF1dG9SZXBhaXJlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1Blcm1pc3Npb25Ib29rc10gUmVmcmVzaGVkIGluc3RhbGxlZCBob29rIGFzc2V0cyBmb3IgJHtob3N0fWApO1xuICAgICAgfSBlbHNlIGlmIChzdGF0dXMubmVlZHNSZXBhaXIgJiYgc3RhdHVzLmluc3RhbGxlZCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgW1Blcm1pc3Npb25Ib29rc10gSG9vayBhc3NldHMgc3RpbGwgbmVlZCByZXBhaXIgZm9yICR7aG9zdH1gICtcbiAgICAgICAgICAoc3RhdHVzLnJlcGFpckVycm9yID8gYDogJHtzdGF0dXMucmVwYWlyRXJyb3J9YCA6ICcnKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaG9zdFJlc3VsdHMucHVzaCh0b1N0YXJ0dXBSZXBhaXJIb3N0UmVzdWx0KGhvc3QsIHN0YXR1cykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nZ2VyLndhcm4oYFtQZXJtaXNzaW9uSG9va3NdIFN0YXJ0dXAgaG9vayByZXBhaXIgZmFpbGVkIGZvciAke2hvc3R9OiAke21lc3NhZ2V9YCk7XG4gICAgICBob3N0UmVzdWx0cy5wdXNoKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgaW5zdGFsbGVkOiBmYWxzZSxcbiAgICAgICAgYXNzZXRzUHJlcGFyZWQ6IGZhbHNlLFxuICAgICAgICBhc3NldHNDdXJyZW50OiBmYWxzZSxcbiAgICAgICAgYXV0b1JlcGFpcmVkOiBmYWxzZSxcbiAgICAgICAgbmVlZHNSZXBhaXI6IHRydWUsXG4gICAgICAgIHJlcGFpckVycm9yOiBtZXNzYWdlLFxuICAgICAgICBvdXRjb21lOiAnZXJyb3InLFxuICAgICAgfSBzYXRpc2ZpZXMgUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlcGFpcmVkQ291bnQgPSBob3N0UmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4gcmVzdWx0Lm91dGNvbWUgPT09ICdyZXBhaXJlZCcpLmxlbmd0aDtcbiAgY29uc3QgbmVlZHNSZXBhaXJDb3VudCA9IGhvc3RSZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PlxuICAgIHJlc3VsdC5vdXRjb21lID09PSAnbmVlZHNfcmVwYWlyJyB8fCByZXN1bHQub3V0Y29tZSA9PT0gJ2Vycm9yJykubGVuZ3RoO1xuICBjb25zdCBjb21wbGV0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHN1bW1hcnk6IFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgPSB7XG4gICAgc3RhcnRlZEF0OiBzdGFydGVkQXRJc28sXG4gICAgY29tcGxldGVkQXQ6IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS50b0lTT1N0cmluZygpLFxuICAgIGR1cmF0aW9uTXM6IGNvbXBsZXRlZEF0IC0gc3RhcnRlZEF0LFxuICAgIHJlcGFpcmVkQ291bnQsXG4gICAgbmVlZHNSZXBhaXJDb3VudCxcbiAgICBob3N0UmVzdWx0cyxcbiAgfTtcbiAgbGFzdFBlcm1pc3Npb25Ib29rU3RhcnR1cFJlcGFpclN1bW1hcnkgPSBjbG9uZVN0YXJ0dXBSZXBhaXJTdW1tYXJ5KHN1bW1hcnkpO1xuICBsb2dnZXIuaW5mbyhcbiAgICBgW1Blcm1pc3Npb25Ib29rc10gU3RhcnR1cCBob29rIGFzc2V0IGF1ZGl0IGNvbXBsZXRlZCBpbiAke3N1bW1hcnkuZHVyYXRpb25Nc31tcyBgICtcbiAgICBgKHJlcGFpcmVkPSR7cmVwYWlyZWRDb3VudH0sIG5lZWRzUmVwYWlyPSR7bmVlZHNSZXBhaXJDb3VudH0pYCxcbiAgKTtcbiAgcmV0dXJuIHN1bW1hcnk7XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- export { AUTO_REPAIRABLE_HOOK_HOSTS, MANAGED_HOOK_WRAPPER_BASENAMES, WRAPPER_HOOK_HOSTS, type HookAssetAuditResult, type HookAssetDescriptor, type InstallPermissionHookOptions, type InstallPermissionHookResult, type PermissionHookAuditSummary, type PermissionHookHealthSummary, type PermissionHookMarker, type PermissionHookStartupRepairHostResult, type PermissionHookStartupRepairSummary, type PermissionHookStatus, type ReconcilePermissionHookOptions, detectIndent, getClaudeHookSettingsPath, getCodexConfigPath, getCodexHookSettingsPath, getCursorHookSettingsPath, getGeminiHookSettingsPath, getHookSourcePath, getHookWrapperBasename, getHookWrapperPath, getManagedHookAssets, getPermissionHookMarkerPath, getPermissionHookScriptPath, getPrimaryHookScriptPath, getVsCodeHookSettingsPath, getVsCodeUserSettingsPath, getWindsurfHookSettingsPath, installHookAssetsForHost, isMissingFileError, normalizeHookHost, readOptionalUtf8, supportsManagedHookAssets, writeBackupIfPresent, } from './permissionHookShared.js';
1
+ export { AUTO_REPAIRABLE_HOOK_HOSTS, MANAGED_HOOK_WRAPPER_BASENAMES, WRAPPER_HOOK_HOSTS, type HookAssetAuditResult, type HookAssetDescriptor, type InstallPermissionHookOptions, type InstallPermissionHookResult, type PermissionHookAuditSummary, type PermissionHookDiagnosticRecord, type PermissionHookHealthSummary, type PermissionHookMarker, type PermissionHookStartupRepairHostResult, type PermissionHookStartupRepairSummary, type PermissionHookStatus, type ReconcilePermissionHookOptions, detectIndent, getClaudeHookSettingsPath, getCodexConfigPath, getPermissionHookDiagnosticsPath, getCodexHookSettingsPath, getCursorHookSettingsPath, getGeminiHookSettingsPath, getHookSourcePath, getHookWrapperBasename, getHookWrapperPath, getManagedHookAssets, getPermissionHookMarkerPath, getPermissionHookScriptPath, getPrimaryHookScriptPath, getVsCodeHookSettingsPath, getVsCodeUserSettingsPath, getWindsurfHookSettingsPath, installHookAssetsForHost, isMissingFileError, normalizeHookHost, readLastPermissionHookDiagnostic, readOptionalUtf8, supportsManagedHookAssets, writeBackupIfPresent, } from './permissionHookShared.js';
2
2
  export { ensureClaudePreToolUseHook, ensureCodexPreToolUseHook, ensureCursorPreToolUseHook, ensureGeminiBeforeToolHook, ensureVsCodePreToolUseHook, ensureWindsurfHooks, installPermissionHook, } from './permissionHookInstallers.js';
3
3
  export { _resetPermissionHookStartupRepairSummaryForTests, getLastPermissionHookStartupRepairSummary, getPermissionHookAuditSummary, getPermissionHookStatus, getPermissionHookStatusAsync, reconcilePermissionHookStatus, repairPermissionHooksOnStartup, summarizePermissionHookHealth, } from './permissionHookStatus.js';
4
4
  //# sourceMappingURL=permissionHooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissionHooks.d.ts","sourceRoot":"","sources":["../../src/utils/permissionHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,gDAAgD,EAChD,yCAAyC,EACzC,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"permissionHooks.d.ts","sourceRoot":"","sources":["../../src/utils/permissionHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,gCAAgC,EAChC,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,gCAAgC,EAChC,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,gDAAgD,EAChD,yCAAyC,EACzC,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC"}
@@ -1,4 +1,4 @@
1
- export { AUTO_REPAIRABLE_HOOK_HOSTS, MANAGED_HOOK_WRAPPER_BASENAMES, WRAPPER_HOOK_HOSTS, detectIndent, getClaudeHookSettingsPath, getCodexConfigPath, getCodexHookSettingsPath, getCursorHookSettingsPath, getGeminiHookSettingsPath, getHookSourcePath, getHookWrapperBasename, getHookWrapperPath, getManagedHookAssets, getPermissionHookMarkerPath, getPermissionHookScriptPath, getPrimaryHookScriptPath, getVsCodeHookSettingsPath, getVsCodeUserSettingsPath, getWindsurfHookSettingsPath, installHookAssetsForHost, isMissingFileError, normalizeHookHost, readOptionalUtf8, supportsManagedHookAssets, writeBackupIfPresent, } from './permissionHookShared.js';
1
+ export { AUTO_REPAIRABLE_HOOK_HOSTS, MANAGED_HOOK_WRAPPER_BASENAMES, WRAPPER_HOOK_HOSTS, detectIndent, getClaudeHookSettingsPath, getCodexConfigPath, getPermissionHookDiagnosticsPath, getCodexHookSettingsPath, getCursorHookSettingsPath, getGeminiHookSettingsPath, getHookSourcePath, getHookWrapperBasename, getHookWrapperPath, getManagedHookAssets, getPermissionHookMarkerPath, getPermissionHookScriptPath, getPrimaryHookScriptPath, getVsCodeHookSettingsPath, getVsCodeUserSettingsPath, getWindsurfHookSettingsPath, installHookAssetsForHost, isMissingFileError, normalizeHookHost, readLastPermissionHookDiagnostic, readOptionalUtf8, supportsManagedHookAssets, writeBackupIfPresent, } from './permissionHookShared.js';
2
2
  export { ensureClaudePreToolUseHook, ensureCodexPreToolUseHook, ensureCursorPreToolUseHook, ensureGeminiBeforeToolHook, ensureVsCodePreToolUseHook, ensureWindsurfHooks, installPermissionHook, } from './permissionHookInstallers.js';
3
3
  export { _resetPermissionHookStartupRepairSummaryForTests, getLastPermissionHookStartupRepairSummary, getPermissionHookAuditSummary, getPermissionHookStatus, getPermissionHookStatusAsync, reconcilePermissionHookStatus, repairPermissionHooksOnStartup, summarizePermissionHookHealth, } from './permissionHookStatus.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbkhvb2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3Blcm1pc3Npb25Ib29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLDhCQUE4QixFQUM5QixrQkFBa0IsRUFZbEIsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLHFCQUFxQixHQUN0QixNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxnREFBZ0QsRUFDaEQseUNBQXlDLEVBQ3pDLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsNEJBQTRCLEVBQzVCLDZCQUE2QixFQUM3Qiw4QkFBOEIsRUFDOUIsNkJBQTZCLEdBQzlCLE1BQU0sMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBBVVRPX1JFUEFJUkFCTEVfSE9PS19IT1NUUyxcbiAgTUFOQUdFRF9IT09LX1dSQVBQRVJfQkFTRU5BTUVTLFxuICBXUkFQUEVSX0hPT0tfSE9TVFMsXG4gIHR5cGUgSG9va0Fzc2V0QXVkaXRSZXN1bHQsXG4gIHR5cGUgSG9va0Fzc2V0RGVzY3JpcHRvcixcbiAgdHlwZSBJbnN0YWxsUGVybWlzc2lvbkhvb2tPcHRpb25zLFxuICB0eXBlIEluc3RhbGxQZXJtaXNzaW9uSG9va1Jlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeSxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va0hlYWx0aFN1bW1hcnksXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tNYXJrZXIsXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICB0eXBlIFJlY29uY2lsZVBlcm1pc3Npb25Ib29rT3B0aW9ucyxcbiAgZGV0ZWN0SW5kZW50LFxuICBnZXRDbGF1ZGVIb29rU2V0dGluZ3NQYXRoLFxuICBnZXRDb2RleENvbmZpZ1BhdGgsXG4gIGdldENvZGV4SG9va1NldHRpbmdzUGF0aCxcbiAgZ2V0Q3Vyc29ySG9va1NldHRpbmdzUGF0aCxcbiAgZ2V0R2VtaW5pSG9va1NldHRpbmdzUGF0aCxcbiAgZ2V0SG9va1NvdXJjZVBhdGgsXG4gIGdldEhvb2tXcmFwcGVyQmFzZW5hbWUsXG4gIGdldEhvb2tXcmFwcGVyUGF0aCxcbiAgZ2V0TWFuYWdlZEhvb2tBc3NldHMsXG4gIGdldFBlcm1pc3Npb25Ib29rTWFya2VyUGF0aCxcbiAgZ2V0UGVybWlzc2lvbkhvb2tTY3JpcHRQYXRoLFxuICBnZXRQcmltYXJ5SG9va1NjcmlwdFBhdGgsXG4gIGdldFZzQ29kZUhvb2tTZXR0aW5nc1BhdGgsXG4gIGdldFZzQ29kZVVzZXJTZXR0aW5nc1BhdGgsXG4gIGdldFdpbmRzdXJmSG9va1NldHRpbmdzUGF0aCxcbiAgaW5zdGFsbEhvb2tBc3NldHNGb3JIb3N0LFxuICBpc01pc3NpbmdGaWxlRXJyb3IsXG4gIG5vcm1hbGl6ZUhvb2tIb3N0LFxuICByZWFkT3B0aW9uYWxVdGY4LFxuICBzdXBwb3J0c01hbmFnZWRIb29rQXNzZXRzLFxuICB3cml0ZUJhY2t1cElmUHJlc2VudCxcbn0gZnJvbSAnLi9wZXJtaXNzaW9uSG9va1NoYXJlZC5qcyc7XG5cbmV4cG9ydCB7XG4gIGVuc3VyZUNsYXVkZVByZVRvb2xVc2VIb29rLFxuICBlbnN1cmVDb2RleFByZVRvb2xVc2VIb29rLFxuICBlbnN1cmVDdXJzb3JQcmVUb29sVXNlSG9vayxcbiAgZW5zdXJlR2VtaW5pQmVmb3JlVG9vbEhvb2ssXG4gIGVuc3VyZVZzQ29kZVByZVRvb2xVc2VIb29rLFxuICBlbnN1cmVXaW5kc3VyZkhvb2tzLFxuICBpbnN0YWxsUGVybWlzc2lvbkhvb2ssXG59IGZyb20gJy4vcGVybWlzc2lvbkhvb2tJbnN0YWxsZXJzLmpzJztcblxuZXhwb3J0IHtcbiAgX3Jlc2V0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeUZvclRlc3RzLFxuICBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSxcbiAgZ2V0UGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnksXG4gIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgcmVwYWlyUGVybWlzc2lvbkhvb2tzT25TdGFydHVwLFxuICBzdW1tYXJpemVQZXJtaXNzaW9uSG9va0hlYWx0aCxcbn0gZnJvbSAnLi9wZXJtaXNzaW9uSG9va1N0YXR1cy5qcyc7XG4iXX0=
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbkhvb2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3Blcm1pc3Npb25Ib29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLDhCQUE4QixFQUM5QixrQkFBa0IsRUFhbEIsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsZ0NBQWdDLEVBQ2hDLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixnQ0FBZ0MsRUFDaEMsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIscUJBQXFCLEdBQ3RCLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsT0FBTyxFQUNMLGdEQUFnRCxFQUNoRCx5Q0FBeUMsRUFDekMsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2Qiw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5Qiw2QkFBNkIsR0FDOUIsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gIEFVVE9fUkVQQUlSQUJMRV9IT09LX0hPU1RTLFxuICBNQU5BR0VEX0hPT0tfV1JBUFBFUl9CQVNFTkFNRVMsXG4gIFdSQVBQRVJfSE9PS19IT1NUUyxcbiAgdHlwZSBIb29rQXNzZXRBdWRpdFJlc3VsdCxcbiAgdHlwZSBIb29rQXNzZXREZXNjcmlwdG9yLFxuICB0eXBlIEluc3RhbGxQZXJtaXNzaW9uSG9va09wdGlvbnMsXG4gIHR5cGUgSW5zdGFsbFBlcm1pc3Npb25Ib29rUmVzdWx0LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpY1JlY29yZCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va0hlYWx0aFN1bW1hcnksXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tNYXJrZXIsXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlySG9zdFJlc3VsdCxcbiAgdHlwZSBQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICB0eXBlIFBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICB0eXBlIFJlY29uY2lsZVBlcm1pc3Npb25Ib29rT3B0aW9ucyxcbiAgZGV0ZWN0SW5kZW50LFxuICBnZXRDbGF1ZGVIb29rU2V0dGluZ3NQYXRoLFxuICBnZXRDb2RleENvbmZpZ1BhdGgsXG4gIGdldFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpY3NQYXRoLFxuICBnZXRDb2RleEhvb2tTZXR0aW5nc1BhdGgsXG4gIGdldEN1cnNvckhvb2tTZXR0aW5nc1BhdGgsXG4gIGdldEdlbWluaUhvb2tTZXR0aW5nc1BhdGgsXG4gIGdldEhvb2tTb3VyY2VQYXRoLFxuICBnZXRIb29rV3JhcHBlckJhc2VuYW1lLFxuICBnZXRIb29rV3JhcHBlclBhdGgsXG4gIGdldE1hbmFnZWRIb29rQXNzZXRzLFxuICBnZXRQZXJtaXNzaW9uSG9va01hcmtlclBhdGgsXG4gIGdldFBlcm1pc3Npb25Ib29rU2NyaXB0UGF0aCxcbiAgZ2V0UHJpbWFyeUhvb2tTY3JpcHRQYXRoLFxuICBnZXRWc0NvZGVIb29rU2V0dGluZ3NQYXRoLFxuICBnZXRWc0NvZGVVc2VyU2V0dGluZ3NQYXRoLFxuICBnZXRXaW5kc3VyZkhvb2tTZXR0aW5nc1BhdGgsXG4gIGluc3RhbGxIb29rQXNzZXRzRm9ySG9zdCxcbiAgaXNNaXNzaW5nRmlsZUVycm9yLFxuICBub3JtYWxpemVIb29rSG9zdCxcbiAgcmVhZExhc3RQZXJtaXNzaW9uSG9va0RpYWdub3N0aWMsXG4gIHJlYWRPcHRpb25hbFV0ZjgsXG4gIHN1cHBvcnRzTWFuYWdlZEhvb2tBc3NldHMsXG4gIHdyaXRlQmFja3VwSWZQcmVzZW50LFxufSBmcm9tICcuL3Blcm1pc3Npb25Ib29rU2hhcmVkLmpzJztcblxuZXhwb3J0IHtcbiAgZW5zdXJlQ2xhdWRlUHJlVG9vbFVzZUhvb2ssXG4gIGVuc3VyZUNvZGV4UHJlVG9vbFVzZUhvb2ssXG4gIGVuc3VyZUN1cnNvclByZVRvb2xVc2VIb29rLFxuICBlbnN1cmVHZW1pbmlCZWZvcmVUb29sSG9vayxcbiAgZW5zdXJlVnNDb2RlUHJlVG9vbFVzZUhvb2ssXG4gIGVuc3VyZVdpbmRzdXJmSG9va3MsXG4gIGluc3RhbGxQZXJtaXNzaW9uSG9vayxcbn0gZnJvbSAnLi9wZXJtaXNzaW9uSG9va0luc3RhbGxlcnMuanMnO1xuXG5leHBvcnQge1xuICBfcmVzZXRQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5Rm9yVGVzdHMsXG4gIGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICBnZXRQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeSxcbiAgZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXMsXG4gIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMsXG4gIHJlY29uY2lsZVBlcm1pc3Npb25Ib29rU3RhdHVzLFxuICByZXBhaXJQZXJtaXNzaW9uSG9va3NPblN0YXJ0dXAsXG4gIHN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoLFxufSBmcm9tICcuL3Blcm1pc3Npb25Ib29rU3RhdHVzLmpzJztcbiJdfQ==
@@ -2006,6 +2006,9 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2006
2006
 
2007
2007
  // ── Tab switching ─────────────────────────────────────────────────────────
2008
2008
  const consoleTabs = document.getElementById('console-tabs');
2009
+ const headerNavRow = document.querySelector('.header-nav-row');
2010
+ const consoleTabMenuToggle = document.getElementById('console-tab-menu-toggle');
2011
+ const consoleTabMenu = document.getElementById('console-tab-menu');
2009
2012
  const tabInits = { logs: false, metrics: false, permissions: false, security: false };
2010
2013
 
2011
2014
  const TAB_KEY = 'dollhousemcp-active-tab';
@@ -2090,8 +2093,157 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2090
2093
  p.hidden = p.id !== 'tab-' + tabName;
2091
2094
  p.classList.toggle('active', p.id === 'tab-' + tabName);
2092
2095
  });
2096
+ syncConsoleTabMenuSelection();
2097
+ closeConsoleTabMenu();
2098
+ scheduleConsoleTabOverflowCheck();
2093
2099
  };
2094
2100
 
2101
+ function renderConsoleTabMenu() {
2102
+ if (!consoleTabs || !consoleTabMenu) return;
2103
+ consoleTabMenu.innerHTML = '';
2104
+ consoleTabs.querySelectorAll('.console-tab').forEach((btn) => {
2105
+ const item = document.createElement('button');
2106
+ item.type = 'button';
2107
+ item.className = 'console-tab-menu-item';
2108
+ item.dataset.tab = btn.dataset.tab || '';
2109
+ item.setAttribute('role', 'menuitem');
2110
+ item.textContent = btn.textContent || '';
2111
+ if (btn.classList.contains('active')) item.classList.add('active');
2112
+ consoleTabMenu.appendChild(item);
2113
+ });
2114
+ }
2115
+
2116
+ function syncConsoleTabMenuSelection() {
2117
+ if (!consoleTabs || !consoleTabMenu) return;
2118
+ const activeTab = consoleTabs.querySelector('.console-tab.active')?.dataset.tab || '';
2119
+ consoleTabMenu.querySelectorAll('.console-tab-menu-item').forEach((item) => {
2120
+ item.classList.toggle('active', item.dataset.tab === activeTab);
2121
+ });
2122
+ }
2123
+
2124
+ function closeConsoleTabMenu() {
2125
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2126
+ consoleTabMenu.hidden = true;
2127
+ consoleTabMenuToggle.setAttribute('aria-expanded', 'false');
2128
+ }
2129
+
2130
+ function getConsoleTabMenuItems() {
2131
+ if (!consoleTabMenu) return [];
2132
+ return Array.from(consoleTabMenu.querySelectorAll('.console-tab-menu-item'));
2133
+ }
2134
+
2135
+ function openConsoleTabMenu(focusTarget) {
2136
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2137
+ consoleTabMenu.hidden = false;
2138
+ consoleTabMenuToggle.setAttribute('aria-expanded', 'true');
2139
+
2140
+ if (!focusTarget) return;
2141
+
2142
+ const items = getConsoleTabMenuItems();
2143
+ if (!items.length) return;
2144
+ const focusItem = (index) => {
2145
+ const boundedIndex = Math.max(0, Math.min(index, items.length - 1));
2146
+ items[boundedIndex].focus();
2147
+ };
2148
+
2149
+ if (focusTarget === 'first') {
2150
+ focusItem(0);
2151
+ return;
2152
+ }
2153
+
2154
+ if (focusTarget === 'last') {
2155
+ focusItem(items.length - 1);
2156
+ return;
2157
+ }
2158
+
2159
+ const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
2160
+ focusItem(activeIndex);
2161
+ }
2162
+
2163
+ function moveConsoleTabMenuFocus(step, origin) {
2164
+ const items = getConsoleTabMenuItems();
2165
+ if (!items.length) return;
2166
+
2167
+ const currentIndex = origin instanceof Element
2168
+ ? items.findIndex((item) => item === origin || item.contains(origin))
2169
+ : -1;
2170
+ const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
2171
+ const baseIndex = currentIndex >= 0 ? currentIndex : activeIndex;
2172
+ const nextIndex = (baseIndex + step + items.length) % items.length;
2173
+ items[nextIndex].focus();
2174
+ }
2175
+
2176
+ function handleConsoleTabMenuToggleKeydown(event) {
2177
+ if (event.key === 'ArrowDown') {
2178
+ event.preventDefault();
2179
+ openConsoleTabMenu('first');
2180
+ } else if (event.key === 'ArrowUp') {
2181
+ event.preventDefault();
2182
+ openConsoleTabMenu('last');
2183
+ }
2184
+ }
2185
+
2186
+ function handleConsoleTabMenuKeydown(event) {
2187
+ switch (event.key) {
2188
+ case 'ArrowDown':
2189
+ event.preventDefault();
2190
+ moveConsoleTabMenuFocus(1, event.target);
2191
+ break;
2192
+ case 'ArrowUp':
2193
+ event.preventDefault();
2194
+ moveConsoleTabMenuFocus(-1, event.target);
2195
+ break;
2196
+ case 'Home':
2197
+ event.preventDefault();
2198
+ getConsoleTabMenuItems()[0]?.focus();
2199
+ break;
2200
+ case 'End': {
2201
+ event.preventDefault();
2202
+ const items = getConsoleTabMenuItems();
2203
+ items.at(-1)?.focus();
2204
+ break;
2205
+ }
2206
+ case 'Escape':
2207
+ event.preventDefault();
2208
+ closeConsoleTabMenu();
2209
+ consoleTabMenuToggle?.focus();
2210
+ break;
2211
+ default:
2212
+ break;
2213
+ }
2214
+ }
2215
+
2216
+ function tabsNeedOverflowMenu() {
2217
+ if (!consoleTabs) return false;
2218
+ const buttons = Array.from(consoleTabs.querySelectorAll('.console-tab'));
2219
+ if (buttons.length < 2) return false;
2220
+ const firstTop = buttons[0].offsetTop;
2221
+ return buttons.some((btn) => btn.offsetTop !== firstTop);
2222
+ }
2223
+
2224
+ let consoleTabOverflowFrame = 0;
2225
+ function updateConsoleTabOverflow() {
2226
+ if (!consoleTabs || !headerNavRow || !consoleTabMenuToggle) return;
2227
+ headerNavRow.classList.remove('header-nav-row--collapsed');
2228
+ consoleTabMenuToggle.hidden = true;
2229
+ const shouldCollapse = tabsNeedOverflowMenu();
2230
+ if (shouldCollapse) {
2231
+ headerNavRow.classList.add('header-nav-row--collapsed');
2232
+ consoleTabMenuToggle.hidden = false;
2233
+ }
2234
+ if (!shouldCollapse) {
2235
+ closeConsoleTabMenu();
2236
+ }
2237
+ }
2238
+
2239
+ function scheduleConsoleTabOverflowCheck() {
2240
+ if (consoleTabOverflowFrame) cancelAnimationFrame(consoleTabOverflowFrame);
2241
+ consoleTabOverflowFrame = requestAnimationFrame(() => {
2242
+ consoleTabOverflowFrame = 0;
2243
+ updateConsoleTabOverflow();
2244
+ });
2245
+ }
2246
+
2095
2247
  /**
2096
2248
  * Parse the URL hash into tab name and query parameters.
2097
2249
  * Supports fragment-query pattern: #tab?key=value&key=value
@@ -2208,26 +2360,41 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2208
2360
  return false;
2209
2361
  }
2210
2362
 
2211
- if (!applyHashTab()) {
2363
+ function restoreInitialConsoleTab() {
2212
2364
  // Version check takes priority over saved tab — upgraders must see Setup
2213
2365
  // regardless of whether they have a saved tab from their previous session.
2214
2366
  if (localStorage.getItem(SETUP_SEEN_KEY) === currentServerVersion) {
2215
2367
  const savedTab = localStorage.getItem(TAB_KEY);
2216
- if (savedTab) {
2217
- switchToTab(savedTab);
2218
- lazyInitTab(savedTab, tabInits);
2219
- }
2220
- } else {
2221
- localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
2222
- switchToTab('setup');
2368
+ if (!savedTab) return;
2369
+ switchToTab(savedTab);
2370
+ lazyInitTab(savedTab, tabInits);
2371
+ return;
2223
2372
  }
2373
+
2374
+ localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
2375
+ switchToTab('setup');
2376
+ }
2377
+
2378
+ function initializeConsoleTabs() {
2379
+ if (applyHashTab()) return;
2380
+ restoreInitialConsoleTab();
2224
2381
  }
2225
2382
 
2226
- // Handle hash changes for deep-linking (e.g., open_logs operation)
2227
- globalThis.addEventListener('hashchange', () => applyHashTab());
2383
+ function registerConsoleTabObservers() {
2384
+ globalThis.addEventListener('hashchange', () => applyHashTab());
2385
+ renderConsoleTabMenu();
2386
+ syncConsoleTabMenuSelection();
2387
+ scheduleConsoleTabOverflowCheck();
2388
+ globalThis.addEventListener('resize', scheduleConsoleTabOverflowCheck);
2389
+
2390
+ if (typeof ResizeObserver !== 'function' || !headerNavRow) return;
2228
2391
 
2229
- if (consoleTabs) {
2230
- consoleTabs.addEventListener('click', (e) => {
2392
+ const tabOverflowObserver = new ResizeObserver(() => scheduleConsoleTabOverflowCheck());
2393
+ tabOverflowObserver.observe(headerNavRow);
2394
+ }
2395
+
2396
+ function registerConsoleTabInteractions() {
2397
+ consoleTabs?.addEventListener('click', (e) => {
2231
2398
  const btn = e.target.closest('.console-tab');
2232
2399
  if (!btn) return;
2233
2400
  const tab = btn.dataset.tab;
@@ -2238,8 +2405,42 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2238
2405
 
2239
2406
  lazyInitTab(tab, tabInits);
2240
2407
  });
2408
+
2409
+ consoleTabMenuToggle?.addEventListener('click', () => {
2410
+ if (!consoleTabMenu) return;
2411
+ if (consoleTabMenu.hidden) {
2412
+ openConsoleTabMenu();
2413
+ return;
2414
+ }
2415
+
2416
+ closeConsoleTabMenu();
2417
+ });
2418
+
2419
+ consoleTabMenuToggle?.addEventListener('keydown', handleConsoleTabMenuToggleKeydown);
2420
+ consoleTabMenu?.addEventListener('keydown', handleConsoleTabMenuKeydown);
2421
+ consoleTabMenu?.addEventListener('click', (e) => {
2422
+ const btn = e.target.closest('.console-tab-menu-item');
2423
+ const tab = btn?.dataset.tab;
2424
+ if (!tab) return;
2425
+ switchToTab(tab);
2426
+ localStorage.setItem(TAB_KEY, tab);
2427
+ lazyInitTab(tab, tabInits);
2428
+ });
2429
+
2430
+ globalThis.addEventListener('click', (e) => {
2431
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2432
+ if (consoleTabMenu.hidden) return;
2433
+ const target = e.target;
2434
+ if (!(target instanceof Element)) return;
2435
+ if (consoleTabMenu.contains(target) || consoleTabMenuToggle.contains(target)) return;
2436
+ closeConsoleTabMenu();
2437
+ });
2241
2438
  }
2242
2439
 
2440
+ initializeConsoleTabs();
2441
+ registerConsoleTabObservers();
2442
+ registerConsoleTabInteractions();
2443
+
2243
2444
  function lazyInitTab(tab, tabInits, params) {
2244
2445
  const dc = globalThis.DollhouseConsole;
2245
2446
  const module = dc?.[tab];
@@ -43,7 +43,14 @@
43
43
  <p class="site-tagline">Management Console</p>
44
44
  </div>
45
45
  </div>
46
- <div class="header-right">
46
+ <div class="header-controls">
47
+ <div class="site-stats" id="stats" aria-live="polite"></div>
48
+ <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
49
+ <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span>
50
+ <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
51
+ </button>
52
+ </div>
53
+ <div class="header-nav-row">
47
54
  <nav class="console-tabs" id="console-tabs" aria-label="Console tabs">
48
55
  <button class="console-tab" data-tab="setup">Setup</button>
49
56
  <button class="console-tab" data-tab="security">Auth</button>
@@ -52,12 +59,14 @@
52
59
  <button class="console-tab" data-tab="permissions">Permissions</button>
53
60
  <button class="console-tab active" data-tab="portfolio">Portfolio</button>
54
61
  </nav>
62
+ <div class="console-tab-menu-shell" id="console-tab-menu-shell">
63
+ <button class="console-tab-menu-toggle" id="console-tab-menu-toggle" type="button" hidden aria-haspopup="menu" aria-expanded="false" aria-controls="console-tab-menu">
64
+ <span class="console-tab-menu-icon" aria-hidden="true">&#9776;</span>
65
+ <span class="console-tab-menu-label">Menu</span>
66
+ </button>
67
+ <div class="console-tab-menu" id="console-tab-menu" role="menu" aria-orientation="vertical" hidden></div>
68
+ </div>
55
69
  <div class="session-indicator" id="session-indicator" title="Active sessions"></div>
56
- <div class="site-stats" id="stats" aria-live="polite"></div>
57
- <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
58
- <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span>
59
- <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
60
- </button>
61
70
  </div>
62
71
  </header>
63
72
 
@@ -572,7 +581,7 @@ npm install @dollhousemcp/mcp-server</code></pre>
572
581
  <a href="https://github.com/DollhouseMCP/mcp-server" class="footer-link">GitHub Repository</a>
573
582
  <a href="./collection-index.json" class="footer-link">JSON API</a>
574
583
  <a href="https://dollhousemcp.com" class="footer-link">DollhouseMCP</a>
575
- <span class="footer-version" id="footer-version"></span>
584
+ <span class="footer-version" id="footer-version" aria-live="polite" aria-atomic="true"></span>
576
585
  <span class="footer-updated" id="footer-updated"></span>
577
586
  <span class="footer-copyright">&copy; 2026 DollhouseMCP</span>
578
587
  </div>