@mcp-z/client 1.0.1 → 1.0.3

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 (73) hide show
  1. package/dist/cjs/auth/capability-discovery.d.cts +0 -19
  2. package/dist/cjs/auth/capability-discovery.d.ts +0 -19
  3. package/dist/cjs/auth/capability-discovery.js +123 -52
  4. package/dist/cjs/auth/capability-discovery.js.map +1 -1
  5. package/dist/cjs/auth/index.js.map +1 -1
  6. package/dist/cjs/auth/interactive-oauth-flow.js.map +1 -1
  7. package/dist/cjs/auth/oauth-callback-listener.js.map +1 -1
  8. package/dist/cjs/auth/pkce.js.map +1 -1
  9. package/dist/cjs/auth/rfc9728-discovery.d.cts +7 -0
  10. package/dist/cjs/auth/rfc9728-discovery.d.ts +7 -0
  11. package/dist/cjs/auth/rfc9728-discovery.js +208 -46
  12. package/dist/cjs/auth/rfc9728-discovery.js.map +1 -1
  13. package/dist/cjs/auth/types.js.map +1 -1
  14. package/dist/cjs/client-helpers.js.map +1 -1
  15. package/dist/cjs/config/server-loader.js.map +1 -1
  16. package/dist/cjs/config/validate-config.js +3 -7
  17. package/dist/cjs/config/validate-config.js.map +1 -1
  18. package/dist/cjs/connection/connect-client.js.map +1 -1
  19. package/dist/cjs/connection/existing-process-transport.js.map +1 -1
  20. package/dist/cjs/connection/types.js.map +1 -1
  21. package/dist/cjs/connection/wait-for-http-ready.js.map +1 -1
  22. package/dist/cjs/dcr/dcr-authenticator.js.map +1 -1
  23. package/dist/cjs/dcr/dynamic-client-registrar.js.map +1 -1
  24. package/dist/cjs/dcr/index.js.map +1 -1
  25. package/dist/cjs/index.js.map +1 -1
  26. package/dist/cjs/monkey-patches.js.map +1 -1
  27. package/dist/cjs/response-wrappers.js.map +1 -1
  28. package/dist/cjs/search/index.js.map +1 -1
  29. package/dist/cjs/search/search.js.map +1 -1
  30. package/dist/cjs/search/types.js.map +1 -1
  31. package/dist/cjs/spawn/spawn-server.js +4 -0
  32. package/dist/cjs/spawn/spawn-server.js.map +1 -1
  33. package/dist/cjs/spawn/spawn-servers.js.map +1 -1
  34. package/dist/cjs/types.js.map +1 -1
  35. package/dist/cjs/utils/logger.js.map +1 -1
  36. package/dist/cjs/utils/path-utils.js.map +1 -1
  37. package/dist/cjs/utils/sanitizer.js.map +1 -1
  38. package/dist/esm/auth/capability-discovery.d.ts +0 -19
  39. package/dist/esm/auth/capability-discovery.js +43 -41
  40. package/dist/esm/auth/capability-discovery.js.map +1 -1
  41. package/dist/esm/auth/index.js.map +1 -1
  42. package/dist/esm/auth/interactive-oauth-flow.js.map +1 -1
  43. package/dist/esm/auth/oauth-callback-listener.js.map +1 -1
  44. package/dist/esm/auth/pkce.js.map +1 -1
  45. package/dist/esm/auth/rfc9728-discovery.d.ts +7 -0
  46. package/dist/esm/auth/rfc9728-discovery.js +67 -0
  47. package/dist/esm/auth/rfc9728-discovery.js.map +1 -1
  48. package/dist/esm/auth/types.js.map +1 -1
  49. package/dist/esm/client-helpers.js.map +1 -1
  50. package/dist/esm/config/server-loader.js.map +1 -1
  51. package/dist/esm/config/validate-config.js +3 -7
  52. package/dist/esm/config/validate-config.js.map +1 -1
  53. package/dist/esm/connection/connect-client.js.map +1 -1
  54. package/dist/esm/connection/existing-process-transport.js.map +1 -1
  55. package/dist/esm/connection/types.js.map +1 -1
  56. package/dist/esm/connection/wait-for-http-ready.js.map +1 -1
  57. package/dist/esm/dcr/dcr-authenticator.js.map +1 -1
  58. package/dist/esm/dcr/dynamic-client-registrar.js.map +1 -1
  59. package/dist/esm/dcr/index.js.map +1 -1
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/monkey-patches.js.map +1 -1
  62. package/dist/esm/response-wrappers.js.map +1 -1
  63. package/dist/esm/search/index.js.map +1 -1
  64. package/dist/esm/search/search.js.map +1 -1
  65. package/dist/esm/search/types.js.map +1 -1
  66. package/dist/esm/spawn/spawn-server.js +4 -0
  67. package/dist/esm/spawn/spawn-server.js.map +1 -1
  68. package/dist/esm/spawn/spawn-servers.js.map +1 -1
  69. package/dist/esm/types.js.map +1 -1
  70. package/dist/esm/utils/logger.js.map +1 -1
  71. package/dist/esm/utils/path-utils.js.map +1 -1
  72. package/dist/esm/utils/sanitizer.js.map +1 -1
  73. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/libs/client/src/utils/logger.ts"],"sourcesContent":["/**\n * Sanitized logger with log level filtering\n * Provides credential redaction and verbosity control for all log output\n */\n\nimport type { SpawnMetadata } from '../connection/types.ts';\nimport { sanitizeForLogging } from './sanitizer.ts';\n\n/**\n * Log level for filtering output\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/**\n * Logger interface - subset of Console\n */\nexport type Logger = Pick<Console, 'info' | 'error' | 'warn' | 'debug'>;\n\n// Log level hierarchy (higher number = more important)\nconst levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\n// Default to 'warn' - quiet library, only show warnings and errors\nlet currentLevel: LogLevel = (process.env.LOG_LEVEL as LogLevel) || 'warn';\n\n/**\n * Check if a log should be output based on current level\n */\nfunction shouldLog(level: keyof Omit<typeof levels, 'silent'>): boolean {\n return levels[level] >= levels[currentLevel];\n}\n\n/**\n * Set the global log level\n * Users can call this to control library verbosity\n *\n * @param level - Log level: 'debug' (all), 'info', 'warn', 'error', 'silent' (none)\n */\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\n/**\n * Get current log level\n */\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\n/**\n * Create a sanitized logger with log level filtering\n */\nfunction createSanitizedLogger(): Logger {\n const createLogMethod = (consoleMethod: 'info' | 'warn' | 'error' | 'debug') => {\n return (message: string, ...args: unknown[]) => {\n // Check if this log level should be output\n if (!shouldLog(consoleMethod)) {\n return;\n }\n\n const metadata = args.length > 0 && typeof args[0] === 'object' ? (args[0] as SpawnMetadata) : {};\n const { message: clean, meta: cleanMeta } = sanitizeForLogging(message, metadata);\n if (Object.keys(cleanMeta).length > 0) {\n console[consoleMethod](clean, cleanMeta);\n } else {\n console[consoleMethod](clean);\n }\n };\n };\n\n return {\n info: createLogMethod('info'),\n warn: createLogMethod('warn'),\n error: createLogMethod('error'),\n debug: createLogMethod('debug'),\n };\n}\n\n// Singleton instance - shared across all operations\nexport const logger = createSanitizedLogger();\n"],"names":["sanitizeForLogging","levels","debug","info","warn","error","silent","currentLevel","process","env","LOG_LEVEL","shouldLog","level","setLogLevel","getLogLevel","createSanitizedLogger","createLogMethod","consoleMethod","message","args","metadata","length","clean","meta","cleanMeta","Object","keys","console","logger"],"mappings":"AAAA;;;CAGC,GAGD,SAASA,kBAAkB,QAAQ,iBAAiB;AAYpD,uDAAuD;AACvD,MAAMC,SAAmC;IACvCC,OAAO;IACPC,MAAM;IACNC,MAAM;IACNC,OAAO;IACPC,QAAQ;AACV;AAEA,mEAAmE;AACnE,IAAIC,eAAyB,AAACC,QAAQC,GAAG,CAACC,SAAS,IAAiB;AAEpE;;CAEC,GACD,SAASC,UAAUC,KAA0C;IAC3D,OAAOX,MAAM,CAACW,MAAM,IAAIX,MAAM,CAACM,aAAa;AAC9C;AAEA;;;;;CAKC,GACD,OAAO,SAASM,YAAYD,KAAe;IACzCL,eAAeK;AACjB;AAEA;;CAEC,GACD,OAAO,SAASE;IACd,OAAOP;AACT;AAEA;;CAEC,GACD,SAASQ;IACP,MAAMC,kBAAkB,CAACC;QACvB,OAAO,CAACC,SAAiB,GAAGC;YAC1B,2CAA2C;YAC3C,IAAI,CAACR,UAAUM,gBAAgB;gBAC7B;YACF;YAEA,MAAMG,WAAWD,KAAKE,MAAM,GAAG,KAAK,OAAOF,IAAI,CAAC,EAAE,KAAK,WAAYA,IAAI,CAAC,EAAE,GAAqB,CAAC;YAChG,MAAM,EAAED,SAASI,KAAK,EAAEC,MAAMC,SAAS,EAAE,GAAGxB,mBAAmBkB,SAASE;YACxE,IAAIK,OAAOC,IAAI,CAACF,WAAWH,MAAM,GAAG,GAAG;gBACrCM,OAAO,CAACV,cAAc,CAACK,OAAOE;YAChC,OAAO;gBACLG,OAAO,CAACV,cAAc,CAACK;YACzB;QACF;IACF;IAEA,OAAO;QACLnB,MAAMa,gBAAgB;QACtBZ,MAAMY,gBAAgB;QACtBX,OAAOW,gBAAgB;QACvBd,OAAOc,gBAAgB;IACzB;AACF;AAEA,oDAAoD;AACpD,OAAO,MAAMY,SAASb,wBAAwB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/client/src/utils/logger.ts"],"sourcesContent":["/**\n * Sanitized logger with log level filtering\n * Provides credential redaction and verbosity control for all log output\n */\n\nimport type { SpawnMetadata } from '../connection/types.ts';\nimport { sanitizeForLogging } from './sanitizer.ts';\n\n/**\n * Log level for filtering output\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/**\n * Logger interface - subset of Console\n */\nexport type Logger = Pick<Console, 'info' | 'error' | 'warn' | 'debug'>;\n\n// Log level hierarchy (higher number = more important)\nconst levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\n// Default to 'warn' - quiet library, only show warnings and errors\nlet currentLevel: LogLevel = (process.env.LOG_LEVEL as LogLevel) || 'warn';\n\n/**\n * Check if a log should be output based on current level\n */\nfunction shouldLog(level: keyof Omit<typeof levels, 'silent'>): boolean {\n return levels[level] >= levels[currentLevel];\n}\n\n/**\n * Set the global log level\n * Users can call this to control library verbosity\n *\n * @param level - Log level: 'debug' (all), 'info', 'warn', 'error', 'silent' (none)\n */\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\n/**\n * Get current log level\n */\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\n/**\n * Create a sanitized logger with log level filtering\n */\nfunction createSanitizedLogger(): Logger {\n const createLogMethod = (consoleMethod: 'info' | 'warn' | 'error' | 'debug') => {\n return (message: string, ...args: unknown[]) => {\n // Check if this log level should be output\n if (!shouldLog(consoleMethod)) {\n return;\n }\n\n const metadata = args.length > 0 && typeof args[0] === 'object' ? (args[0] as SpawnMetadata) : {};\n const { message: clean, meta: cleanMeta } = sanitizeForLogging(message, metadata);\n if (Object.keys(cleanMeta).length > 0) {\n console[consoleMethod](clean, cleanMeta);\n } else {\n console[consoleMethod](clean);\n }\n };\n };\n\n return {\n info: createLogMethod('info'),\n warn: createLogMethod('warn'),\n error: createLogMethod('error'),\n debug: createLogMethod('debug'),\n };\n}\n\n// Singleton instance - shared across all operations\nexport const logger = createSanitizedLogger();\n"],"names":["sanitizeForLogging","levels","debug","info","warn","error","silent","currentLevel","process","env","LOG_LEVEL","shouldLog","level","setLogLevel","getLogLevel","createSanitizedLogger","createLogMethod","consoleMethod","message","args","metadata","length","clean","meta","cleanMeta","Object","keys","console","logger"],"mappings":"AAAA;;;CAGC,GAGD,SAASA,kBAAkB,QAAQ,iBAAiB;AAYpD,uDAAuD;AACvD,MAAMC,SAAmC;IACvCC,OAAO;IACPC,MAAM;IACNC,MAAM;IACNC,OAAO;IACPC,QAAQ;AACV;AAEA,mEAAmE;AACnE,IAAIC,eAAyB,AAACC,QAAQC,GAAG,CAACC,SAAS,IAAiB;AAEpE;;CAEC,GACD,SAASC,UAAUC,KAA0C;IAC3D,OAAOX,MAAM,CAACW,MAAM,IAAIX,MAAM,CAACM,aAAa;AAC9C;AAEA;;;;;CAKC,GACD,OAAO,SAASM,YAAYD,KAAe;IACzCL,eAAeK;AACjB;AAEA;;CAEC,GACD,OAAO,SAASE;IACd,OAAOP;AACT;AAEA;;CAEC,GACD,SAASQ;IACP,MAAMC,kBAAkB,CAACC;QACvB,OAAO,CAACC,SAAiB,GAAGC;YAC1B,2CAA2C;YAC3C,IAAI,CAACR,UAAUM,gBAAgB;gBAC7B;YACF;YAEA,MAAMG,WAAWD,KAAKE,MAAM,GAAG,KAAK,OAAOF,IAAI,CAAC,EAAE,KAAK,WAAYA,IAAI,CAAC,EAAE,GAAqB,CAAC;YAChG,MAAM,EAAED,SAASI,KAAK,EAAEC,MAAMC,SAAS,EAAE,GAAGxB,mBAAmBkB,SAASE;YACxE,IAAIK,OAAOC,IAAI,CAACF,WAAWH,MAAM,GAAG,GAAG;gBACrCM,OAAO,CAACV,cAAc,CAACK,OAAOE;YAChC,OAAO;gBACLG,OAAO,CAACV,cAAc,CAACK;YACzB;QACF;IACF;IAEA,OAAO;QACLnB,MAAMa,gBAAgB;QACtBZ,MAAMY,gBAAgB;QACtBX,OAAOW,gBAAgB;QACvBd,OAAOc,gBAAgB;IACzB;AACF;AAEA,oDAAoD;AACpD,OAAO,MAAMY,SAASb,wBAAwB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/libs/client/src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path resolution utilities for cluster spawning.\n * Handles ~, relative paths, absolute paths, and special cases (URLs, npm packages, flags).\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Resolve a file path relative to a working directory.\n *\n * Handles three cases:\n * - `~` or `~/path` - Expands to home directory\n * - Absolute paths - Returns as-is\n * - Relative paths - Resolves relative to cwd\n *\n * @param filePath - The path to resolve\n * @param cwd - The working directory for resolving relative paths\n * @returns The resolved absolute path\n *\n * @example\n * resolvePath('~/config.json', '/unused') // → '/home/user/config.json'\n * resolvePath('/absolute/path', '/unused') // → '/absolute/path'\n * resolvePath('./relative', '/base') // → '/base/relative'\n */\nexport function resolvePath(filePath: string, cwd: string): string {\n // Expand ~ to home directory\n if (filePath === '~' || filePath.startsWith('~/')) {\n filePath = filePath.replace(/^~/, os.homedir());\n }\n\n // If absolute, return as-is\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n\n // Otherwise resolve relative to cwd\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Resolve paths in command arguments array.\n *\n * Intelligently handles different argument types:\n * - Flags with paths: `--env-file=./path` → `--env-file=/absolute/path`\n * - Flags without paths: `--port=3000` → unchanged\n * - Command flags: `--verbose` → unchanged\n * - URLs: `http://example.com` → unchanged\n * - npm packages: `@scope/package` or `package-name` → unchanged\n * - Regular paths: `./script.js` → `/absolute/script.js`\n *\n * @param args - Array of command arguments\n * @param cwd - Working directory for resolving relative paths\n * @returns Array with paths resolved\n *\n * @example\n * resolveArgsPaths(['./bin/server.js', '--env-file=./config.env', '--port=3000'], '/home/user')\n * // → ['/home/user/bin/server.js', '--env-file=/home/user/config.env', '--port=3000']\n *\n * resolveArgsPaths(['@scope/package', 'https://example.com'], '/unused')\n * // → ['@scope/package', 'https://example.com'] (unchanged)\n */\nexport function resolveArgsPaths(args: string[], cwd: string): string[] {\n return args.map((arg) => {\n if (typeof arg !== 'string') {\n return arg;\n }\n\n // Check for flags with path values like --env-file=path, --config=path, etc.\n const flagMatch = arg.match(/^(--.+?)=(.+)$/);\n if (flagMatch) {\n const [, flag, value] = flagMatch;\n // Only resolve if the value looks like a path (contains ./ or ../ or / )\n if (value && value.includes('/')) {\n // Skip URLs in flag values\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(value)) {\n return arg;\n }\n return `${flag}=${resolvePath(value, cwd)}`;\n }\n return arg; // Return as-is for non-path flag values like --port=3000\n }\n\n // Skip command-line flags, only resolve actual paths\n if (arg.startsWith('-')) {\n return arg; // Don't resolve command-line flags as paths\n }\n\n // Skip URLs (http://, https://, etc.)\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(arg)) {\n return arg; // Return URLs as-is\n }\n\n // Skip npm package names (starting with @ or containing no path separators)\n if (arg.startsWith('@') || (!arg.includes('/') && !arg.includes('\\\\'))) {\n return arg; // Return npm package names as-is\n }\n\n // Regular arguments get resolved as paths\n return resolvePath(arg, cwd);\n });\n}\n"],"names":["os","path","resolvePath","filePath","cwd","startsWith","replace","homedir","isAbsolute","resolve","resolveArgsPaths","args","map","arg","flagMatch","match","flag","value","includes","test"],"mappings":"AAAA;;;CAGC,GAED,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,SAASC,YAAYC,QAAgB,EAAEC,GAAW;IACvD,6BAA6B;IAC7B,IAAID,aAAa,OAAOA,SAASE,UAAU,CAAC,OAAO;QACjDF,WAAWA,SAASG,OAAO,CAAC,MAAMN,GAAGO,OAAO;IAC9C;IAEA,4BAA4B;IAC5B,IAAIN,KAAKO,UAAU,CAACL,WAAW;QAC7B,OAAOA;IACT;IAEA,oCAAoC;IACpC,OAAOF,KAAKQ,OAAO,CAACL,KAAKD;AAC3B;AAEA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASO,iBAAiBC,IAAc,EAAEP,GAAW;IAC1D,OAAOO,KAAKC,GAAG,CAAC,CAACC;QACf,IAAI,OAAOA,QAAQ,UAAU;YAC3B,OAAOA;QACT;QAEA,6EAA6E;QAC7E,MAAMC,YAAYD,IAAIE,KAAK,CAAC;QAC5B,IAAID,WAAW;YACb,MAAM,GAAGE,MAAMC,MAAM,GAAGH;YACxB,yEAAyE;YACzE,IAAIG,SAASA,MAAMC,QAAQ,CAAC,MAAM;gBAChC,2BAA2B;gBAC3B,IAAI,gCAAgCC,IAAI,CAACF,QAAQ;oBAC/C,OAAOJ;gBACT;gBACA,OAAO,GAAGG,KAAK,CAAC,EAAEd,YAAYe,OAAOb,MAAM;YAC7C;YACA,OAAOS,KAAK,yDAAyD;QACvE;QAEA,qDAAqD;QACrD,IAAIA,IAAIR,UAAU,CAAC,MAAM;YACvB,OAAOQ,KAAK,4CAA4C;QAC1D;QAEA,sCAAsC;QACtC,IAAI,gCAAgCM,IAAI,CAACN,MAAM;YAC7C,OAAOA,KAAK,oBAAoB;QAClC;QAEA,4EAA4E;QAC5E,IAAIA,IAAIR,UAAU,CAAC,QAAS,CAACQ,IAAIK,QAAQ,CAAC,QAAQ,CAACL,IAAIK,QAAQ,CAAC,OAAQ;YACtE,OAAOL,KAAK,iCAAiC;QAC/C;QAEA,0CAA0C;QAC1C,OAAOX,YAAYW,KAAKT;IAC1B;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/client/src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path resolution utilities for cluster spawning.\n * Handles ~, relative paths, absolute paths, and special cases (URLs, npm packages, flags).\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Resolve a file path relative to a working directory.\n *\n * Handles three cases:\n * - `~` or `~/path` - Expands to home directory\n * - Absolute paths - Returns as-is\n * - Relative paths - Resolves relative to cwd\n *\n * @param filePath - The path to resolve\n * @param cwd - The working directory for resolving relative paths\n * @returns The resolved absolute path\n *\n * @example\n * resolvePath('~/config.json', '/unused') // → '/home/user/config.json'\n * resolvePath('/absolute/path', '/unused') // → '/absolute/path'\n * resolvePath('./relative', '/base') // → '/base/relative'\n */\nexport function resolvePath(filePath: string, cwd: string): string {\n // Expand ~ to home directory\n if (filePath === '~' || filePath.startsWith('~/')) {\n filePath = filePath.replace(/^~/, os.homedir());\n }\n\n // If absolute, return as-is\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n\n // Otherwise resolve relative to cwd\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Resolve paths in command arguments array.\n *\n * Intelligently handles different argument types:\n * - Flags with paths: `--env-file=./path` → `--env-file=/absolute/path`\n * - Flags without paths: `--port=3000` → unchanged\n * - Command flags: `--verbose` → unchanged\n * - URLs: `http://example.com` → unchanged\n * - npm packages: `@scope/package` or `package-name` → unchanged\n * - Regular paths: `./script.js` → `/absolute/script.js`\n *\n * @param args - Array of command arguments\n * @param cwd - Working directory for resolving relative paths\n * @returns Array with paths resolved\n *\n * @example\n * resolveArgsPaths(['./bin/server.js', '--env-file=./config.env', '--port=3000'], '/home/user')\n * // → ['/home/user/bin/server.js', '--env-file=/home/user/config.env', '--port=3000']\n *\n * resolveArgsPaths(['@scope/package', 'https://example.com'], '/unused')\n * // → ['@scope/package', 'https://example.com'] (unchanged)\n */\nexport function resolveArgsPaths(args: string[], cwd: string): string[] {\n return args.map((arg) => {\n if (typeof arg !== 'string') {\n return arg;\n }\n\n // Check for flags with path values like --env-file=path, --config=path, etc.\n const flagMatch = arg.match(/^(--.+?)=(.+)$/);\n if (flagMatch) {\n const [, flag, value] = flagMatch;\n // Only resolve if the value looks like a path (contains ./ or ../ or / )\n if (value && value.includes('/')) {\n // Skip URLs in flag values\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(value)) {\n return arg;\n }\n return `${flag}=${resolvePath(value, cwd)}`;\n }\n return arg; // Return as-is for non-path flag values like --port=3000\n }\n\n // Skip command-line flags, only resolve actual paths\n if (arg.startsWith('-')) {\n return arg; // Don't resolve command-line flags as paths\n }\n\n // Skip URLs (http://, https://, etc.)\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(arg)) {\n return arg; // Return URLs as-is\n }\n\n // Skip npm package names (starting with @ or containing no path separators)\n if (arg.startsWith('@') || (!arg.includes('/') && !arg.includes('\\\\'))) {\n return arg; // Return npm package names as-is\n }\n\n // Regular arguments get resolved as paths\n return resolvePath(arg, cwd);\n });\n}\n"],"names":["os","path","resolvePath","filePath","cwd","startsWith","replace","homedir","isAbsolute","resolve","resolveArgsPaths","args","map","arg","flagMatch","match","flag","value","includes","test"],"mappings":"AAAA;;;CAGC,GAED,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,SAASC,YAAYC,QAAgB,EAAEC,GAAW;IACvD,6BAA6B;IAC7B,IAAID,aAAa,OAAOA,SAASE,UAAU,CAAC,OAAO;QACjDF,WAAWA,SAASG,OAAO,CAAC,MAAMN,GAAGO,OAAO;IAC9C;IAEA,4BAA4B;IAC5B,IAAIN,KAAKO,UAAU,CAACL,WAAW;QAC7B,OAAOA;IACT;IAEA,oCAAoC;IACpC,OAAOF,KAAKQ,OAAO,CAACL,KAAKD;AAC3B;AAEA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASO,iBAAiBC,IAAc,EAAEP,GAAW;IAC1D,OAAOO,KAAKC,GAAG,CAAC,CAACC;QACf,IAAI,OAAOA,QAAQ,UAAU;YAC3B,OAAOA;QACT;QAEA,6EAA6E;QAC7E,MAAMC,YAAYD,IAAIE,KAAK,CAAC;QAC5B,IAAID,WAAW;YACb,MAAM,GAAGE,MAAMC,MAAM,GAAGH;YACxB,yEAAyE;YACzE,IAAIG,SAASA,MAAMC,QAAQ,CAAC,MAAM;gBAChC,2BAA2B;gBAC3B,IAAI,gCAAgCC,IAAI,CAACF,QAAQ;oBAC/C,OAAOJ;gBACT;gBACA,OAAO,GAAGG,KAAK,CAAC,EAAEd,YAAYe,OAAOb,MAAM;YAC7C;YACA,OAAOS,KAAK,yDAAyD;QACvE;QAEA,qDAAqD;QACrD,IAAIA,IAAIR,UAAU,CAAC,MAAM;YACvB,OAAOQ,KAAK,4CAA4C;QAC1D;QAEA,sCAAsC;QACtC,IAAI,gCAAgCM,IAAI,CAACN,MAAM;YAC7C,OAAOA,KAAK,oBAAoB;QAClC;QAEA,4EAA4E;QAC5E,IAAIA,IAAIR,UAAU,CAAC,QAAS,CAACQ,IAAIK,QAAQ,CAAC,QAAQ,CAACL,IAAIK,QAAQ,CAAC,OAAQ;YACtE,OAAOL,KAAK,iCAAiC;QAC/C;QAEA,0CAA0C;QAC1C,OAAOX,YAAYW,KAAKT;IAC1B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/libs/client/src/utils/sanitizer.ts"],"sourcesContent":["/**\n * Minimal log sanitization for spawn operations\n * Redacts credentials from environment variables and command arguments\n */\n\nimport type { SpawnMetadata } from '../connection/types.ts';\n\n/**\n * Sanitize log messages and metadata to prevent credential leakage\n *\n * Redacts common credential patterns:\n * - key=value, secret=value, token=value, password=value\n * - Environment variables with sensitive names\n *\n * @param message - Log message to sanitize\n * @param obj - Metadata object to sanitize\n * @returns Sanitized message and metadata\n */\nexport function sanitizeForLogging(message: string, obj: SpawnMetadata): { message: string; meta: SpawnMetadata } {\n // Redact common credential patterns in message\n const cleanMessage = message\n .replace(/key[=:]\\S+/gi, 'key=[REDACTED]')\n .replace(/secret[=:]\\S+/gi, 'secret=[REDACTED]')\n .replace(/token[=:]\\S+/gi, 'token=[REDACTED]')\n .replace(/password[=:]\\S+/gi, 'password=[REDACTED]')\n .replace(/auth[=:]\\S+/gi, 'auth=[REDACTED]');\n\n // Deep clone and redact sensitive env var keys\n const cleanMeta = JSON.parse(JSON.stringify(obj));\n\n // Redact sensitive environment variable values\n if (cleanMeta.env && typeof cleanMeta.env === 'object') {\n for (const envKey of Object.keys(cleanMeta.env)) {\n if (/key|secret|token|password|auth|credential/i.test(envKey)) {\n cleanMeta.env[envKey] = '[REDACTED]';\n }\n }\n }\n\n return { message: cleanMessage, meta: cleanMeta };\n}\n\nexport function sanitizeForLoggingFormatter() {\n return {\n log: (obj: SpawnMetadata) => {\n const message = (obj.msg || obj.message || '') as string;\n const { message: clean, meta } = sanitizeForLogging(message, obj);\n return { ...meta, msg: clean };\n },\n };\n}\n"],"names":["sanitizeForLogging","message","obj","cleanMessage","replace","cleanMeta","JSON","parse","stringify","env","envKey","Object","keys","test","meta","sanitizeForLoggingFormatter","log","msg","clean"],"mappings":"AAAA;;;CAGC,GAID;;;;;;;;;;CAUC,GACD,OAAO,SAASA,mBAAmBC,OAAe,EAAEC,GAAkB;IACpE,+CAA+C;IAC/C,MAAMC,eAAeF,QAClBG,OAAO,CAAC,gBAAgB,kBACxBA,OAAO,CAAC,mBAAmB,qBAC3BA,OAAO,CAAC,kBAAkB,oBAC1BA,OAAO,CAAC,qBAAqB,uBAC7BA,OAAO,CAAC,iBAAiB;IAE5B,+CAA+C;IAC/C,MAAMC,YAAYC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN;IAE5C,+CAA+C;IAC/C,IAAIG,UAAUI,GAAG,IAAI,OAAOJ,UAAUI,GAAG,KAAK,UAAU;QACtD,KAAK,MAAMC,UAAUC,OAAOC,IAAI,CAACP,UAAUI,GAAG,EAAG;YAC/C,IAAI,6CAA6CI,IAAI,CAACH,SAAS;gBAC7DL,UAAUI,GAAG,CAACC,OAAO,GAAG;YAC1B;QACF;IACF;IAEA,OAAO;QAAET,SAASE;QAAcW,MAAMT;IAAU;AAClD;AAEA,OAAO,SAASU;IACd,OAAO;QACLC,KAAK,CAACd;YACJ,MAAMD,UAAWC,IAAIe,GAAG,IAAIf,IAAID,OAAO,IAAI;YAC3C,MAAM,EAAEA,SAASiB,KAAK,EAAEJ,IAAI,EAAE,GAAGd,mBAAmBC,SAASC;YAC7D,OAAO;gBAAE,GAAGY,IAAI;gBAAEG,KAAKC;YAAM;QAC/B;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/client/src/utils/sanitizer.ts"],"sourcesContent":["/**\n * Minimal log sanitization for spawn operations\n * Redacts credentials from environment variables and command arguments\n */\n\nimport type { SpawnMetadata } from '../connection/types.ts';\n\n/**\n * Sanitize log messages and metadata to prevent credential leakage\n *\n * Redacts common credential patterns:\n * - key=value, secret=value, token=value, password=value\n * - Environment variables with sensitive names\n *\n * @param message - Log message to sanitize\n * @param obj - Metadata object to sanitize\n * @returns Sanitized message and metadata\n */\nexport function sanitizeForLogging(message: string, obj: SpawnMetadata): { message: string; meta: SpawnMetadata } {\n // Redact common credential patterns in message\n const cleanMessage = message\n .replace(/key[=:]\\S+/gi, 'key=[REDACTED]')\n .replace(/secret[=:]\\S+/gi, 'secret=[REDACTED]')\n .replace(/token[=:]\\S+/gi, 'token=[REDACTED]')\n .replace(/password[=:]\\S+/gi, 'password=[REDACTED]')\n .replace(/auth[=:]\\S+/gi, 'auth=[REDACTED]');\n\n // Deep clone and redact sensitive env var keys\n const cleanMeta = JSON.parse(JSON.stringify(obj));\n\n // Redact sensitive environment variable values\n if (cleanMeta.env && typeof cleanMeta.env === 'object') {\n for (const envKey of Object.keys(cleanMeta.env)) {\n if (/key|secret|token|password|auth|credential/i.test(envKey)) {\n cleanMeta.env[envKey] = '[REDACTED]';\n }\n }\n }\n\n return { message: cleanMessage, meta: cleanMeta };\n}\n\nexport function sanitizeForLoggingFormatter() {\n return {\n log: (obj: SpawnMetadata) => {\n const message = (obj.msg || obj.message || '') as string;\n const { message: clean, meta } = sanitizeForLogging(message, obj);\n return { ...meta, msg: clean };\n },\n };\n}\n"],"names":["sanitizeForLogging","message","obj","cleanMessage","replace","cleanMeta","JSON","parse","stringify","env","envKey","Object","keys","test","meta","sanitizeForLoggingFormatter","log","msg","clean"],"mappings":"AAAA;;;CAGC,GAID;;;;;;;;;;CAUC,GACD,OAAO,SAASA,mBAAmBC,OAAe,EAAEC,GAAkB;IACpE,+CAA+C;IAC/C,MAAMC,eAAeF,QAClBG,OAAO,CAAC,gBAAgB,kBACxBA,OAAO,CAAC,mBAAmB,qBAC3BA,OAAO,CAAC,kBAAkB,oBAC1BA,OAAO,CAAC,qBAAqB,uBAC7BA,OAAO,CAAC,iBAAiB;IAE5B,+CAA+C;IAC/C,MAAMC,YAAYC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN;IAE5C,+CAA+C;IAC/C,IAAIG,UAAUI,GAAG,IAAI,OAAOJ,UAAUI,GAAG,KAAK,UAAU;QACtD,KAAK,MAAMC,UAAUC,OAAOC,IAAI,CAACP,UAAUI,GAAG,EAAG;YAC/C,IAAI,6CAA6CI,IAAI,CAACH,SAAS;gBAC7DL,UAAUI,GAAG,CAACC,OAAO,GAAG;YAC1B;QACF;IACF;IAEA,OAAO;QAAET,SAASE;QAAcW,MAAMT;IAAU;AAClD;AAEA,OAAO,SAASU;IACd,OAAO;QACLC,KAAK,CAACd;YACJ,MAAMD,UAAWC,IAAIe,GAAG,IAAIf,IAAID,OAAO,IAAI;YAC3C,MAAM,EAAEA,SAASiB,KAAK,EAAEJ,IAAI,EAAE,GAAGd,mBAAmBC,SAASC;YAC7D,OAAO;gBAAE,GAAGY,IAAI;gBAAEG,KAAKC;YAAM;QAC/B;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-z/client",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Programmatic MCP client library for Node.js - connect, discover, and call tools on Model Context Protocol servers.",
5
5
  "keywords": [
6
6
  "mcp",