@qodalis/cli-server-logs 2.0.0-rc.4 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/cli-server-logs",
3
- "version": "2.0.0-rc.4",
3
+ "version": "2.0.1",
4
4
  "description": "@qodalis/cli extension for streaming and viewing server logs via WebSocket.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
@@ -21,7 +21,7 @@
21
21
  "umd": "./umd/index.global.js",
22
22
  "unpkg": "./umd/index.global.js",
23
23
  "dependencies": {
24
- "@qodalis/cli-core": "2.0.0-rc.4"
24
+ "@qodalis/cli-core": "2.0.1"
25
25
  },
26
26
  "sideEffects": false,
27
27
  "main": "./public-api.js",
package/public-api.js CHANGED
@@ -5,7 +5,7 @@ var cliCore = require('@qodalis/cli-core');
5
5
  // src/lib/processors/cli-logs-command-processor.ts
6
6
 
7
7
  // src/lib/version.ts
8
- var LIBRARY_VERSION = "2.0.0-rc.4";
8
+ var LIBRARY_VERSION = "2.0.1";
9
9
  var API_VERSION = 2;
10
10
 
11
11
  // src/lib/processors/cli-logs-command-processor.ts
@@ -92,6 +92,7 @@ var ServerLogsSubProcessor = class {
92
92
  let serverUrl;
93
93
  let serverName;
94
94
  let serverHeaders;
95
+ let unsafeHeaders;
95
96
  if (serverArg) {
96
97
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
97
98
  serverUrl = serverArg;
@@ -103,6 +104,7 @@ var ServerLogsSubProcessor = class {
103
104
  serverUrl = match.url;
104
105
  serverName = match.name;
105
106
  serverHeaders = match.headers;
107
+ unsafeHeaders = match.unsafeHeadersInWebSocketUrl;
106
108
  } else {
107
109
  context.writer.writeError(
108
110
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -115,6 +117,7 @@ var ServerLogsSubProcessor = class {
115
117
  serverUrl = defaultServer?.url;
116
118
  serverName = defaultServer?.name;
117
119
  serverHeaders = defaultServer?.headers;
120
+ unsafeHeaders = defaultServer?.unsafeHeadersInWebSocketUrl;
118
121
  }
119
122
  if (!serverUrl) {
120
123
  context.writer.writeError(
@@ -133,7 +136,9 @@ var ServerLogsSubProcessor = class {
133
136
  patternRegex = new RegExp(command.args["pattern"], "g");
134
137
  }
135
138
  const ws = new WebSocket(
136
- serverName ? await cliCore.resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders) : fullUrl
139
+ serverName ? await cliCore.resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders, {
140
+ unsafeHeadersInWebSocketUrl: unsafeHeaders
141
+ }) : fullUrl
137
142
  );
138
143
  const logs = [];
139
144
  context.notifier.info("Connecting to log stream");
package/public-api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/server-logs/src/lib/version.ts","../../packages/plugins/server-logs/src/lib/processors/cli-logs-command-processor.ts","../../packages/plugins/server-logs/src/public-api.ts"],"names":["DefaultLibraryAuthor","cliDefaultServer","resolveServerWebSocketUrl","highlightTextWithBg","CliForegroundColor"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.4';\nexport const API_VERSION = 2;\n ","import {\n CliHeadersProvider,\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n resolveServerWebSocketUrl,\n cliDefaultServer,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n/**\n * Extends the built-in `server` command with a `logs` sub-command.\n * The registry merges sub-processors into the existing `server` processor,\n * preserving all original sub-commands (list, status, reconnect, default).\n *\n * Usage: `server logs`, `server logs live`, `server logs --server=node --level=error`\n */\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n processors?: ICliCommandProcessor[] | undefined = [\n new ServerLogsSubProcessor(),\n ];\n\n metadata?: CliProcessorMetadata | undefined = {\n requireServer: true,\n icon: '📜',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n async processCommand(\n _command: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — the registry merges sub-processors into the existing server processor\n }\n}\n\nclass ServerLogsSubProcessor implements ICliCommandProcessor {\n command = 'logs';\n\n description?: string | undefined = 'Stream live server logs via WebSocket';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n icon: '📜',\n };\n\n parameters?: ICliCommandParameterDescriptor[] | undefined = [\n {\n name: 'pattern',\n type: 'string',\n description: 'The regex pattern to search for in the logs',\n required: false,\n validator: (value: string) => {\n const isValid = isValidRegex(value);\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid regex pattern provided',\n };\n },\n },\n {\n name: 'level',\n type: 'string',\n description:\n 'The log level to filter by, e.g. ' + levels.join(', '),\n required: false,\n validator: (value: string) => {\n const isValid = levels.includes(value);\n\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid log level provided, must be one of: ' +\n levels.join(', '),\n };\n },\n },\n {\n name: 'server',\n type: 'string',\n description:\n 'Server name or URL to connect to, e.g. \"node\" or \"http://localhost:5000\"',\n required: false,\n },\n {\n name: 'file',\n type: 'boolean',\n description: 'Export logs to a file',\n required: false,\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n constructor() {\n this.processors?.push({\n command: 'live',\n description: this.description,\n parameters: this.parameters,\n processCommand: this.processCommand.bind(this),\n writeDescription: this.writeDescription.bind(this),\n });\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const serverArg = command.args['server'] as string | undefined;\n let serverUrl: string | undefined;\n let serverName: string | undefined;\n let serverHeaders: CliHeadersProvider | undefined;\n\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n // An ad-hoc URL gets no credentials: it is not a configured server\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name.toLowerCase() === serverArg.toLowerCase(),\n );\n if (match) {\n serverUrl = match.url;\n serverName = match.name;\n serverHeaders = match.headers;\n } else {\n context.writer.writeError(\n `Server '${serverArg}' not found. Available servers: ${\n context.options?.servers?.map((s) => s.name).join(', ') || 'none'\n }`,\n );\n return;\n }\n }\n } else {\n const defaultServer = cliDefaultServer(context);\n serverUrl = defaultServer?.url;\n serverName = defaultServer?.name;\n serverHeaders = defaultServer?.headers;\n }\n\n if (!serverUrl) {\n context.writer.writeError(\n 'No server URL provided. Use --server=<name|url> or configure a server in the CLI options.',\n );\n return;\n }\n\n const cleanServerUrl = serverUrl.replace(/\\/+$/, '');\n const wsUrl = cleanServerUrl.replace(/^http/, 'ws');\n\n let fullUrl = `${wsUrl}/ws/v1/qcli/logs`;\n if (command.args['level']) {\n fullUrl += `?level=${encodeURIComponent(command.args['level'])}`;\n }\n\n let patternRegex: RegExp | null = null;\n if (command.args['pattern']) {\n patternRegex = new RegExp(command.args['pattern'], 'g');\n }\n\n const ws = new WebSocket(\n serverName\n ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders)\n : fullUrl,\n );\n const logs: string[] = [];\n context.notifier.info('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.notifier.info('Streaming live logs');\n context.writer.writeSuccess('Streaming live logs...');\n\n if (command.args['level']) {\n context.writer.writeInfo(\n `Level filter: ${command.args['level']}`,\n );\n }\n if (command.args['pattern']) {\n context.writer.writeInfo(\n `Pattern filter: ${command.args['pattern']}`,\n );\n }\n\n context.writer.writeInfo('Press Ctrl+C to stop');\n context.writer.writeln();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n\n if (data.type === 'connected') {\n return;\n }\n\n if (data.type === 'disconnect') {\n ws.close();\n return;\n }\n\n if (data.type === 'log') {\n const timestamp = data.timestamp || '';\n const level = (data.level || '').toUpperCase();\n const category = data.category || '';\n const message = data.message || '';\n\n const logLine = `[${timestamp}] ${level} [${category}] ${message}`;\n\n if (patternRegex) {\n patternRegex.lastIndex = 0;\n if (!patternRegex.test(logLine)) {\n return;\n }\n patternRegex.lastIndex = 0;\n }\n\n logs.push(logLine);\n\n const displayLine = patternRegex\n ? highlightTextWithBg(logLine, patternRegex)\n : logLine;\n\n context.writer.writeln(\n `\\x1b[33m${++index}\\x1b[0m. ${displayLine}`,\n );\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onclose = () => {\n if (command.args['file'] && logs.length > 0) {\n const filename = `logs-${new Date().toISOString()}.txt`;\n context.writer.writeToFile(filename, logs.join('\\n'));\n }\n\n context.notifier.info('Log stream disconnected');\n context.writer.writeInfo('Disconnected from live logs');\n resolve();\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n 'WebSocket error occurred while connecting to live logs',\n );\n };\n\n context.onAbort.subscribe(() => {\n ws.close();\n });\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln('Stream live server logs via WebSocket');\n writer.writeln();\n writer.writeln('📋 Usage:');\n writer.writeln(\n ` ${writer.wrapInColor('server logs', CliForegroundColor.Cyan)} Start streaming`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --level=error', CliForegroundColor.Cyan)} Filter by level`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --pattern=\"Exception\"', CliForegroundColor.Cyan)} Filter by regex`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --server=node', CliForegroundColor.Cyan)} Specific server`,\n );\n writer.writeln();\n writer.writeln(`⚙️ Options:`);\n writer.writeln(\n ` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server name or URL to connect to`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`,\n );\n writer.writeln();\n writer.writeln(\n `💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`,\n );\n }\n}\n\nfunction isValidRegex(pattern: string): boolean {\n try {\n new RegExp(pattern);\n return true;\n } catch (e) {\n return false;\n }\n}\n","/*\n * Public API Surface of server-logs\n */\n\nexport * from './lib/processors/cli-logs-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliLogsCommandProcessor } from './lib/processors/cli-logs-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const serverLogsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-logs',\n processors: [new CliLogsCommandProcessor()],\n translations: {\n es: { 'cli.server-logs.description': 'Mostrar registros en tiempo real' },\n fr: { 'cli.server-logs.description': 'Afficher les journaux en direct' },\n de: { 'cli.server-logs.description': 'Live-Protokolle anzeigen' },\n pt: { 'cli.server-logs.description': 'Mostrar logs em tempo real' },\n it: { 'cli.server-logs.description': 'Mostrare i log in tempo reale' },\n ja: { 'cli.server-logs.description': 'ライブログを表示' },\n ko: { 'cli.server-logs.description': '실시간 로그 표시' },\n zh: { 'cli.server-logs.description': '显示实时日志' },\n ru: { 'cli.server-logs.description': 'Показать журналы в реальном времени' },\n ro: { 'cli.server-logs.description': 'Afișează jurnalele în timp real' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/server-logs/src/lib/version.ts","../../packages/plugins/server-logs/src/lib/processors/cli-logs-command-processor.ts","../../packages/plugins/server-logs/src/public-api.ts"],"names":["DefaultLibraryAuthor","cliDefaultServer","resolveServerWebSocketUrl","highlightTextWithBg","CliForegroundColor"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.1';\nexport const API_VERSION = 2;\n ","import {\n CliHeadersProvider,\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n resolveServerWebSocketUrl,\n cliDefaultServer,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n/**\n * Extends the built-in `server` command with a `logs` sub-command.\n * The registry merges sub-processors into the existing `server` processor,\n * preserving all original sub-commands (list, status, reconnect, default).\n *\n * Usage: `server logs`, `server logs live`, `server logs --server=node --level=error`\n */\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n processors?: ICliCommandProcessor[] | undefined = [\n new ServerLogsSubProcessor(),\n ];\n\n metadata?: CliProcessorMetadata | undefined = {\n requireServer: true,\n icon: '📜',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n async processCommand(\n _command: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — the registry merges sub-processors into the existing server processor\n }\n}\n\nclass ServerLogsSubProcessor implements ICliCommandProcessor {\n command = 'logs';\n\n description?: string | undefined = 'Stream live server logs via WebSocket';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n icon: '📜',\n };\n\n parameters?: ICliCommandParameterDescriptor[] | undefined = [\n {\n name: 'pattern',\n type: 'string',\n description: 'The regex pattern to search for in the logs',\n required: false,\n validator: (value: string) => {\n const isValid = isValidRegex(value);\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid regex pattern provided',\n };\n },\n },\n {\n name: 'level',\n type: 'string',\n description:\n 'The log level to filter by, e.g. ' + levels.join(', '),\n required: false,\n validator: (value: string) => {\n const isValid = levels.includes(value);\n\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid log level provided, must be one of: ' +\n levels.join(', '),\n };\n },\n },\n {\n name: 'server',\n type: 'string',\n description:\n 'Server name or URL to connect to, e.g. \"node\" or \"http://localhost:5000\"',\n required: false,\n },\n {\n name: 'file',\n type: 'boolean',\n description: 'Export logs to a file',\n required: false,\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n constructor() {\n this.processors?.push({\n command: 'live',\n description: this.description,\n parameters: this.parameters,\n processCommand: this.processCommand.bind(this),\n writeDescription: this.writeDescription.bind(this),\n });\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const serverArg = command.args['server'] as string | undefined;\n let serverUrl: string | undefined;\n let serverName: string | undefined;\n let serverHeaders: CliHeadersProvider | undefined;\n let unsafeHeaders: boolean | undefined;\n\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n // An ad-hoc URL gets no credentials: it is not a configured server\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name.toLowerCase() === serverArg.toLowerCase(),\n );\n if (match) {\n serverUrl = match.url;\n serverName = match.name;\n serverHeaders = match.headers;\n unsafeHeaders = match.unsafeHeadersInWebSocketUrl;\n } else {\n context.writer.writeError(\n `Server '${serverArg}' not found. Available servers: ${\n context.options?.servers?.map((s) => s.name).join(', ') || 'none'\n }`,\n );\n return;\n }\n }\n } else {\n const defaultServer = cliDefaultServer(context);\n serverUrl = defaultServer?.url;\n serverName = defaultServer?.name;\n serverHeaders = defaultServer?.headers;\n unsafeHeaders = defaultServer?.unsafeHeadersInWebSocketUrl;\n }\n\n if (!serverUrl) {\n context.writer.writeError(\n 'No server URL provided. Use --server=<name|url> or configure a server in the CLI options.',\n );\n return;\n }\n\n const cleanServerUrl = serverUrl.replace(/\\/+$/, '');\n const wsUrl = cleanServerUrl.replace(/^http/, 'ws');\n\n let fullUrl = `${wsUrl}/ws/v1/qcli/logs`;\n if (command.args['level']) {\n fullUrl += `?level=${encodeURIComponent(command.args['level'])}`;\n }\n\n let patternRegex: RegExp | null = null;\n if (command.args['pattern']) {\n patternRegex = new RegExp(command.args['pattern'], 'g');\n }\n\n const ws = new WebSocket(\n serverName\n ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders, {\n unsafeHeadersInWebSocketUrl: unsafeHeaders,\n })\n : fullUrl,\n );\n const logs: string[] = [];\n context.notifier.info('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.notifier.info('Streaming live logs');\n context.writer.writeSuccess('Streaming live logs...');\n\n if (command.args['level']) {\n context.writer.writeInfo(\n `Level filter: ${command.args['level']}`,\n );\n }\n if (command.args['pattern']) {\n context.writer.writeInfo(\n `Pattern filter: ${command.args['pattern']}`,\n );\n }\n\n context.writer.writeInfo('Press Ctrl+C to stop');\n context.writer.writeln();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n\n if (data.type === 'connected') {\n return;\n }\n\n if (data.type === 'disconnect') {\n ws.close();\n return;\n }\n\n if (data.type === 'log') {\n const timestamp = data.timestamp || '';\n const level = (data.level || '').toUpperCase();\n const category = data.category || '';\n const message = data.message || '';\n\n const logLine = `[${timestamp}] ${level} [${category}] ${message}`;\n\n if (patternRegex) {\n patternRegex.lastIndex = 0;\n if (!patternRegex.test(logLine)) {\n return;\n }\n patternRegex.lastIndex = 0;\n }\n\n logs.push(logLine);\n\n const displayLine = patternRegex\n ? highlightTextWithBg(logLine, patternRegex)\n : logLine;\n\n context.writer.writeln(\n `\\x1b[33m${++index}\\x1b[0m. ${displayLine}`,\n );\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onclose = () => {\n if (command.args['file'] && logs.length > 0) {\n const filename = `logs-${new Date().toISOString()}.txt`;\n context.writer.writeToFile(filename, logs.join('\\n'));\n }\n\n context.notifier.info('Log stream disconnected');\n context.writer.writeInfo('Disconnected from live logs');\n resolve();\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n 'WebSocket error occurred while connecting to live logs',\n );\n };\n\n context.onAbort.subscribe(() => {\n ws.close();\n });\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln('Stream live server logs via WebSocket');\n writer.writeln();\n writer.writeln('📋 Usage:');\n writer.writeln(\n ` ${writer.wrapInColor('server logs', CliForegroundColor.Cyan)} Start streaming`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --level=error', CliForegroundColor.Cyan)} Filter by level`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --pattern=\"Exception\"', CliForegroundColor.Cyan)} Filter by regex`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --server=node', CliForegroundColor.Cyan)} Specific server`,\n );\n writer.writeln();\n writer.writeln(`⚙️ Options:`);\n writer.writeln(\n ` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server name or URL to connect to`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`,\n );\n writer.writeln();\n writer.writeln(\n `💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`,\n );\n }\n}\n\nfunction isValidRegex(pattern: string): boolean {\n try {\n new RegExp(pattern);\n return true;\n } catch (e) {\n return false;\n }\n}\n","/*\n * Public API Surface of server-logs\n */\n\nexport * from './lib/processors/cli-logs-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliLogsCommandProcessor } from './lib/processors/cli-logs-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const serverLogsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-logs',\n processors: [new CliLogsCommandProcessor()],\n translations: {\n es: { 'cli.server-logs.description': 'Mostrar registros en tiempo real' },\n fr: { 'cli.server-logs.description': 'Afficher les journaux en direct' },\n de: { 'cli.server-logs.description': 'Live-Protokolle anzeigen' },\n pt: { 'cli.server-logs.description': 'Mostrar logs em tempo real' },\n it: { 'cli.server-logs.description': 'Mostrare i log in tempo reale' },\n ja: { 'cli.server-logs.description': 'ライブログを表示' },\n ko: { 'cli.server-logs.description': '실시간 로그 표시' },\n zh: { 'cli.server-logs.description': '显示实时日志' },\n ru: { 'cli.server-logs.description': 'Показать журналы в реальном времени' },\n ro: { 'cli.server-logs.description': 'Afișează jurnalele în timp real' },\n },\n};\n"]}
package/public-api.mjs CHANGED
@@ -3,7 +3,7 @@ import { DefaultLibraryAuthor, cliDefaultServer, resolveServerWebSocketUrl, high
3
3
  // src/lib/processors/cli-logs-command-processor.ts
4
4
 
5
5
  // src/lib/version.ts
6
- var LIBRARY_VERSION = "2.0.0-rc.4";
6
+ var LIBRARY_VERSION = "2.0.1";
7
7
  var API_VERSION = 2;
8
8
 
9
9
  // src/lib/processors/cli-logs-command-processor.ts
@@ -90,6 +90,7 @@ var ServerLogsSubProcessor = class {
90
90
  let serverUrl;
91
91
  let serverName;
92
92
  let serverHeaders;
93
+ let unsafeHeaders;
93
94
  if (serverArg) {
94
95
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
95
96
  serverUrl = serverArg;
@@ -101,6 +102,7 @@ var ServerLogsSubProcessor = class {
101
102
  serverUrl = match.url;
102
103
  serverName = match.name;
103
104
  serverHeaders = match.headers;
105
+ unsafeHeaders = match.unsafeHeadersInWebSocketUrl;
104
106
  } else {
105
107
  context.writer.writeError(
106
108
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -113,6 +115,7 @@ var ServerLogsSubProcessor = class {
113
115
  serverUrl = defaultServer?.url;
114
116
  serverName = defaultServer?.name;
115
117
  serverHeaders = defaultServer?.headers;
118
+ unsafeHeaders = defaultServer?.unsafeHeadersInWebSocketUrl;
116
119
  }
117
120
  if (!serverUrl) {
118
121
  context.writer.writeError(
@@ -131,7 +134,9 @@ var ServerLogsSubProcessor = class {
131
134
  patternRegex = new RegExp(command.args["pattern"], "g");
132
135
  }
133
136
  const ws = new WebSocket(
134
- serverName ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders) : fullUrl
137
+ serverName ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders, {
138
+ unsafeHeadersInWebSocketUrl: unsafeHeaders
139
+ }) : fullUrl
135
140
  );
136
141
  const logs = [];
137
142
  context.notifier.info("Connecting to log stream");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/server-logs/src/lib/version.ts","../../packages/plugins/server-logs/src/lib/processors/cli-logs-command-processor.ts","../../packages/plugins/server-logs/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.4';\nexport const API_VERSION = 2;\n ","import {\n CliHeadersProvider,\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n resolveServerWebSocketUrl,\n cliDefaultServer,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n/**\n * Extends the built-in `server` command with a `logs` sub-command.\n * The registry merges sub-processors into the existing `server` processor,\n * preserving all original sub-commands (list, status, reconnect, default).\n *\n * Usage: `server logs`, `server logs live`, `server logs --server=node --level=error`\n */\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n processors?: ICliCommandProcessor[] | undefined = [\n new ServerLogsSubProcessor(),\n ];\n\n metadata?: CliProcessorMetadata | undefined = {\n requireServer: true,\n icon: '📜',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n async processCommand(\n _command: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — the registry merges sub-processors into the existing server processor\n }\n}\n\nclass ServerLogsSubProcessor implements ICliCommandProcessor {\n command = 'logs';\n\n description?: string | undefined = 'Stream live server logs via WebSocket';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n icon: '📜',\n };\n\n parameters?: ICliCommandParameterDescriptor[] | undefined = [\n {\n name: 'pattern',\n type: 'string',\n description: 'The regex pattern to search for in the logs',\n required: false,\n validator: (value: string) => {\n const isValid = isValidRegex(value);\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid regex pattern provided',\n };\n },\n },\n {\n name: 'level',\n type: 'string',\n description:\n 'The log level to filter by, e.g. ' + levels.join(', '),\n required: false,\n validator: (value: string) => {\n const isValid = levels.includes(value);\n\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid log level provided, must be one of: ' +\n levels.join(', '),\n };\n },\n },\n {\n name: 'server',\n type: 'string',\n description:\n 'Server name or URL to connect to, e.g. \"node\" or \"http://localhost:5000\"',\n required: false,\n },\n {\n name: 'file',\n type: 'boolean',\n description: 'Export logs to a file',\n required: false,\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n constructor() {\n this.processors?.push({\n command: 'live',\n description: this.description,\n parameters: this.parameters,\n processCommand: this.processCommand.bind(this),\n writeDescription: this.writeDescription.bind(this),\n });\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const serverArg = command.args['server'] as string | undefined;\n let serverUrl: string | undefined;\n let serverName: string | undefined;\n let serverHeaders: CliHeadersProvider | undefined;\n\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n // An ad-hoc URL gets no credentials: it is not a configured server\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name.toLowerCase() === serverArg.toLowerCase(),\n );\n if (match) {\n serverUrl = match.url;\n serverName = match.name;\n serverHeaders = match.headers;\n } else {\n context.writer.writeError(\n `Server '${serverArg}' not found. Available servers: ${\n context.options?.servers?.map((s) => s.name).join(', ') || 'none'\n }`,\n );\n return;\n }\n }\n } else {\n const defaultServer = cliDefaultServer(context);\n serverUrl = defaultServer?.url;\n serverName = defaultServer?.name;\n serverHeaders = defaultServer?.headers;\n }\n\n if (!serverUrl) {\n context.writer.writeError(\n 'No server URL provided. Use --server=<name|url> or configure a server in the CLI options.',\n );\n return;\n }\n\n const cleanServerUrl = serverUrl.replace(/\\/+$/, '');\n const wsUrl = cleanServerUrl.replace(/^http/, 'ws');\n\n let fullUrl = `${wsUrl}/ws/v1/qcli/logs`;\n if (command.args['level']) {\n fullUrl += `?level=${encodeURIComponent(command.args['level'])}`;\n }\n\n let patternRegex: RegExp | null = null;\n if (command.args['pattern']) {\n patternRegex = new RegExp(command.args['pattern'], 'g');\n }\n\n const ws = new WebSocket(\n serverName\n ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders)\n : fullUrl,\n );\n const logs: string[] = [];\n context.notifier.info('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.notifier.info('Streaming live logs');\n context.writer.writeSuccess('Streaming live logs...');\n\n if (command.args['level']) {\n context.writer.writeInfo(\n `Level filter: ${command.args['level']}`,\n );\n }\n if (command.args['pattern']) {\n context.writer.writeInfo(\n `Pattern filter: ${command.args['pattern']}`,\n );\n }\n\n context.writer.writeInfo('Press Ctrl+C to stop');\n context.writer.writeln();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n\n if (data.type === 'connected') {\n return;\n }\n\n if (data.type === 'disconnect') {\n ws.close();\n return;\n }\n\n if (data.type === 'log') {\n const timestamp = data.timestamp || '';\n const level = (data.level || '').toUpperCase();\n const category = data.category || '';\n const message = data.message || '';\n\n const logLine = `[${timestamp}] ${level} [${category}] ${message}`;\n\n if (patternRegex) {\n patternRegex.lastIndex = 0;\n if (!patternRegex.test(logLine)) {\n return;\n }\n patternRegex.lastIndex = 0;\n }\n\n logs.push(logLine);\n\n const displayLine = patternRegex\n ? highlightTextWithBg(logLine, patternRegex)\n : logLine;\n\n context.writer.writeln(\n `\\x1b[33m${++index}\\x1b[0m. ${displayLine}`,\n );\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onclose = () => {\n if (command.args['file'] && logs.length > 0) {\n const filename = `logs-${new Date().toISOString()}.txt`;\n context.writer.writeToFile(filename, logs.join('\\n'));\n }\n\n context.notifier.info('Log stream disconnected');\n context.writer.writeInfo('Disconnected from live logs');\n resolve();\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n 'WebSocket error occurred while connecting to live logs',\n );\n };\n\n context.onAbort.subscribe(() => {\n ws.close();\n });\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln('Stream live server logs via WebSocket');\n writer.writeln();\n writer.writeln('📋 Usage:');\n writer.writeln(\n ` ${writer.wrapInColor('server logs', CliForegroundColor.Cyan)} Start streaming`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --level=error', CliForegroundColor.Cyan)} Filter by level`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --pattern=\"Exception\"', CliForegroundColor.Cyan)} Filter by regex`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --server=node', CliForegroundColor.Cyan)} Specific server`,\n );\n writer.writeln();\n writer.writeln(`⚙️ Options:`);\n writer.writeln(\n ` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server name or URL to connect to`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`,\n );\n writer.writeln();\n writer.writeln(\n `💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`,\n );\n }\n}\n\nfunction isValidRegex(pattern: string): boolean {\n try {\n new RegExp(pattern);\n return true;\n } catch (e) {\n return false;\n }\n}\n","/*\n * Public API Surface of server-logs\n */\n\nexport * from './lib/processors/cli-logs-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliLogsCommandProcessor } from './lib/processors/cli-logs-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const serverLogsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-logs',\n processors: [new CliLogsCommandProcessor()],\n translations: {\n es: { 'cli.server-logs.description': 'Mostrar registros en tiempo real' },\n fr: { 'cli.server-logs.description': 'Afficher les journaux en direct' },\n de: { 'cli.server-logs.description': 'Live-Protokolle anzeigen' },\n pt: { 'cli.server-logs.description': 'Mostrar logs em tempo real' },\n it: { 'cli.server-logs.description': 'Mostrare i log in tempo reale' },\n ja: { 'cli.server-logs.description': 'ライブログを表示' },\n ko: { 'cli.server-logs.description': '실시간 로그 표시' },\n zh: { 'cli.server-logs.description': '显示实时日志' },\n ru: { 'cli.server-logs.description': 'Показать журналы в реальном времени' },\n ro: { 'cli.server-logs.description': 'Afișează jurnalele în timp real' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/server-logs/src/lib/version.ts","../../packages/plugins/server-logs/src/lib/processors/cli-logs-command-processor.ts","../../packages/plugins/server-logs/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.1';\nexport const API_VERSION = 2;\n ","import {\n CliHeadersProvider,\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n resolveServerWebSocketUrl,\n cliDefaultServer,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n/**\n * Extends the built-in `server` command with a `logs` sub-command.\n * The registry merges sub-processors into the existing `server` processor,\n * preserving all original sub-commands (list, status, reconnect, default).\n *\n * Usage: `server logs`, `server logs live`, `server logs --server=node --level=error`\n */\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n processors?: ICliCommandProcessor[] | undefined = [\n new ServerLogsSubProcessor(),\n ];\n\n metadata?: CliProcessorMetadata | undefined = {\n requireServer: true,\n icon: '📜',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n async processCommand(\n _command: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — the registry merges sub-processors into the existing server processor\n }\n}\n\nclass ServerLogsSubProcessor implements ICliCommandProcessor {\n command = 'logs';\n\n description?: string | undefined = 'Stream live server logs via WebSocket';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n icon: '📜',\n };\n\n parameters?: ICliCommandParameterDescriptor[] | undefined = [\n {\n name: 'pattern',\n type: 'string',\n description: 'The regex pattern to search for in the logs',\n required: false,\n validator: (value: string) => {\n const isValid = isValidRegex(value);\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid regex pattern provided',\n };\n },\n },\n {\n name: 'level',\n type: 'string',\n description:\n 'The log level to filter by, e.g. ' + levels.join(', '),\n required: false,\n validator: (value: string) => {\n const isValid = levels.includes(value);\n\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid log level provided, must be one of: ' +\n levels.join(', '),\n };\n },\n },\n {\n name: 'server',\n type: 'string',\n description:\n 'Server name or URL to connect to, e.g. \"node\" or \"http://localhost:5000\"',\n required: false,\n },\n {\n name: 'file',\n type: 'boolean',\n description: 'Export logs to a file',\n required: false,\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n constructor() {\n this.processors?.push({\n command: 'live',\n description: this.description,\n parameters: this.parameters,\n processCommand: this.processCommand.bind(this),\n writeDescription: this.writeDescription.bind(this),\n });\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const serverArg = command.args['server'] as string | undefined;\n let serverUrl: string | undefined;\n let serverName: string | undefined;\n let serverHeaders: CliHeadersProvider | undefined;\n let unsafeHeaders: boolean | undefined;\n\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n // An ad-hoc URL gets no credentials: it is not a configured server\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name.toLowerCase() === serverArg.toLowerCase(),\n );\n if (match) {\n serverUrl = match.url;\n serverName = match.name;\n serverHeaders = match.headers;\n unsafeHeaders = match.unsafeHeadersInWebSocketUrl;\n } else {\n context.writer.writeError(\n `Server '${serverArg}' not found. Available servers: ${\n context.options?.servers?.map((s) => s.name).join(', ') || 'none'\n }`,\n );\n return;\n }\n }\n } else {\n const defaultServer = cliDefaultServer(context);\n serverUrl = defaultServer?.url;\n serverName = defaultServer?.name;\n serverHeaders = defaultServer?.headers;\n unsafeHeaders = defaultServer?.unsafeHeadersInWebSocketUrl;\n }\n\n if (!serverUrl) {\n context.writer.writeError(\n 'No server URL provided. Use --server=<name|url> or configure a server in the CLI options.',\n );\n return;\n }\n\n const cleanServerUrl = serverUrl.replace(/\\/+$/, '');\n const wsUrl = cleanServerUrl.replace(/^http/, 'ws');\n\n let fullUrl = `${wsUrl}/ws/v1/qcli/logs`;\n if (command.args['level']) {\n fullUrl += `?level=${encodeURIComponent(command.args['level'])}`;\n }\n\n let patternRegex: RegExp | null = null;\n if (command.args['pattern']) {\n patternRegex = new RegExp(command.args['pattern'], 'g');\n }\n\n const ws = new WebSocket(\n serverName\n ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders, {\n unsafeHeadersInWebSocketUrl: unsafeHeaders,\n })\n : fullUrl,\n );\n const logs: string[] = [];\n context.notifier.info('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.notifier.info('Streaming live logs');\n context.writer.writeSuccess('Streaming live logs...');\n\n if (command.args['level']) {\n context.writer.writeInfo(\n `Level filter: ${command.args['level']}`,\n );\n }\n if (command.args['pattern']) {\n context.writer.writeInfo(\n `Pattern filter: ${command.args['pattern']}`,\n );\n }\n\n context.writer.writeInfo('Press Ctrl+C to stop');\n context.writer.writeln();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data);\n\n if (data.type === 'connected') {\n return;\n }\n\n if (data.type === 'disconnect') {\n ws.close();\n return;\n }\n\n if (data.type === 'log') {\n const timestamp = data.timestamp || '';\n const level = (data.level || '').toUpperCase();\n const category = data.category || '';\n const message = data.message || '';\n\n const logLine = `[${timestamp}] ${level} [${category}] ${message}`;\n\n if (patternRegex) {\n patternRegex.lastIndex = 0;\n if (!patternRegex.test(logLine)) {\n return;\n }\n patternRegex.lastIndex = 0;\n }\n\n logs.push(logLine);\n\n const displayLine = patternRegex\n ? highlightTextWithBg(logLine, patternRegex)\n : logLine;\n\n context.writer.writeln(\n `\\x1b[33m${++index}\\x1b[0m. ${displayLine}`,\n );\n }\n } catch {\n // Ignore non-JSON messages\n }\n };\n\n ws.onclose = () => {\n if (command.args['file'] && logs.length > 0) {\n const filename = `logs-${new Date().toISOString()}.txt`;\n context.writer.writeToFile(filename, logs.join('\\n'));\n }\n\n context.notifier.info('Log stream disconnected');\n context.writer.writeInfo('Disconnected from live logs');\n resolve();\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n 'WebSocket error occurred while connecting to live logs',\n );\n };\n\n context.onAbort.subscribe(() => {\n ws.close();\n });\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln('Stream live server logs via WebSocket');\n writer.writeln();\n writer.writeln('📋 Usage:');\n writer.writeln(\n ` ${writer.wrapInColor('server logs', CliForegroundColor.Cyan)} Start streaming`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --level=error', CliForegroundColor.Cyan)} Filter by level`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --pattern=\"Exception\"', CliForegroundColor.Cyan)} Filter by regex`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('server logs --server=node', CliForegroundColor.Cyan)} Specific server`,\n );\n writer.writeln();\n writer.writeln(`⚙️ Options:`);\n writer.writeln(\n ` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server name or URL to connect to`,\n );\n writer.writeln(\n ` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`,\n );\n writer.writeln();\n writer.writeln(\n `💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`,\n );\n }\n}\n\nfunction isValidRegex(pattern: string): boolean {\n try {\n new RegExp(pattern);\n return true;\n } catch (e) {\n return false;\n }\n}\n","/*\n * Public API Surface of server-logs\n */\n\nexport * from './lib/processors/cli-logs-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliLogsCommandProcessor } from './lib/processors/cli-logs-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const serverLogsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-logs',\n processors: [new CliLogsCommandProcessor()],\n translations: {\n es: { 'cli.server-logs.description': 'Mostrar registros en tiempo real' },\n fr: { 'cli.server-logs.description': 'Afficher les journaux en direct' },\n de: { 'cli.server-logs.description': 'Live-Protokolle anzeigen' },\n pt: { 'cli.server-logs.description': 'Mostrar logs em tempo real' },\n it: { 'cli.server-logs.description': 'Mostrare i log in tempo reale' },\n ja: { 'cli.server-logs.description': 'ライブログを表示' },\n ko: { 'cli.server-logs.description': '실시간 로그 표시' },\n zh: { 'cli.server-logs.description': '显示实时日志' },\n ru: { 'cli.server-logs.description': 'Показать журналы в реальном времени' },\n ro: { 'cli.server-logs.description': 'Afișează jurnalele în timp real' },\n },\n};\n"]}
@@ -2000,13 +2000,61 @@ var serverLogs = (() => {
2000
2000
  ).join("&");
2001
2001
  return `${wsUrl}${separator}${params}`;
2002
2002
  }
2003
- async function resolveServerWebSocketUrl(services, serverName, wsUrl, configHeaders) {
2003
+ var CLI_WS_TICKET_PATH = "/api/v1/qcli/sessions/ws-ticket";
2004
+ var warnedServers = /* @__PURE__ */ new Set();
2005
+ async function buildServerWebSocketUrl(wsUrl, headers, options) {
2006
+ const resolved = resolveHeaders(headers);
2007
+ if (Object.keys(resolved).length === 0) {
2008
+ return wsUrl;
2009
+ }
2010
+ if (options?.unsafeHeadersInWebSocketUrl) {
2011
+ return buildAuthenticatedWebSocketUrl(wsUrl, resolved);
2012
+ }
2013
+ const httpBase = toHttpBaseUrl(wsUrl);
2014
+ const ticket = await fetchWebSocketTicket(httpBase, resolved);
2015
+ if (ticket) {
2016
+ return appendQueryParams(wsUrl, { ticket });
2017
+ }
2018
+ if (!warnedServers.has(httpBase)) {
2019
+ warnedServers.add(httpBase);
2020
+ console.warn(
2021
+ `[qodalis-cli] ${httpBase} issued no WebSocket ticket (${CLI_WS_TICKET_PATH}), so its sockets connect without credentials. Configured headers are never copied into WebSocket URLs; enable the users plugin on the server, or set \`unsafeHeadersInWebSocketUrl: true\` on the server config to keep the old behaviour.`
2022
+ );
2023
+ }
2024
+ return wsUrl;
2025
+ }
2026
+ async function resolveServerWebSocketUrl(services, serverName, wsUrl, configHeaders, options) {
2004
2027
  const authService = services?.get(ICliServerAuthService_TOKEN);
2005
2028
  const params = await authService?.getWebSocketParams?.(serverName);
2006
2029
  if (params) {
2007
2030
  return appendQueryParams(wsUrl, params);
2008
2031
  }
2009
- return buildAuthenticatedWebSocketUrl(wsUrl, () => resolveServerHeaders(services, serverName, configHeaders));
2032
+ return buildServerWebSocketUrl(
2033
+ wsUrl,
2034
+ () => resolveServerHeaders(services, serverName, configHeaders),
2035
+ options
2036
+ );
2037
+ }
2038
+ function toHttpBaseUrl(wsUrl) {
2039
+ const url = new URL(wsUrl);
2040
+ const wsSegment = url.pathname.indexOf("/ws/");
2041
+ const basePath = wsSegment >= 0 ? url.pathname.slice(0, wsSegment) : "";
2042
+ const protocol = url.protocol === "wss:" || url.protocol === "https:" ? "https:" : "http:";
2043
+ return `${protocol}//${url.host}${basePath}`;
2044
+ }
2045
+ async function fetchWebSocketTicket(httpBase, headers) {
2046
+ try {
2047
+ const response = await fetch(`${httpBase}${CLI_WS_TICKET_PATH}`, {
2048
+ method: "POST",
2049
+ headers: { ...headers, "Content-Type": "application/json" },
2050
+ body: "{}"
2051
+ });
2052
+ if (!response.ok) return void 0;
2053
+ const body = await response.json();
2054
+ return typeof body?.ticket === "string" && body.ticket ? body.ticket : void 0;
2055
+ } catch {
2056
+ return void 0;
2057
+ }
2010
2058
  }
2011
2059
  function appendQueryParams(url, params) {
2012
2060
  const entries = Object.entries(params);
@@ -2844,7 +2892,7 @@ var serverLogs = (() => {
2844
2892
  };
2845
2893
 
2846
2894
  // src/lib/version.ts
2847
- var LIBRARY_VERSION = "2.0.0-rc.4";
2895
+ var LIBRARY_VERSION = "2.0.1";
2848
2896
  var API_VERSION2 = 2;
2849
2897
 
2850
2898
  // src/lib/processors/cli-logs-command-processor.ts
@@ -2931,6 +2979,7 @@ var serverLogs = (() => {
2931
2979
  let serverUrl;
2932
2980
  let serverName;
2933
2981
  let serverHeaders;
2982
+ let unsafeHeaders;
2934
2983
  if (serverArg) {
2935
2984
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
2936
2985
  serverUrl = serverArg;
@@ -2942,6 +2991,7 @@ var serverLogs = (() => {
2942
2991
  serverUrl = match.url;
2943
2992
  serverName = match.name;
2944
2993
  serverHeaders = match.headers;
2994
+ unsafeHeaders = match.unsafeHeadersInWebSocketUrl;
2945
2995
  } else {
2946
2996
  context.writer.writeError(
2947
2997
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -2954,6 +3004,7 @@ var serverLogs = (() => {
2954
3004
  serverUrl = defaultServer?.url;
2955
3005
  serverName = defaultServer?.name;
2956
3006
  serverHeaders = defaultServer?.headers;
3007
+ unsafeHeaders = defaultServer?.unsafeHeadersInWebSocketUrl;
2957
3008
  }
2958
3009
  if (!serverUrl) {
2959
3010
  context.writer.writeError(
@@ -2972,7 +3023,9 @@ var serverLogs = (() => {
2972
3023
  patternRegex = new RegExp(command.args["pattern"], "g");
2973
3024
  }
2974
3025
  const ws = new WebSocket(
2975
- serverName ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders) : fullUrl
3026
+ serverName ? await resolveServerWebSocketUrl(context.services, serverName, fullUrl, serverHeaders, {
3027
+ unsafeHeadersInWebSocketUrl: unsafeHeaders
3028
+ }) : fullUrl
2976
3029
  );
2977
3030
  const logs = [];
2978
3031
  context.notifier.info("Connecting to log stream");