@qodalis/cli-server-logs 2.0.0-beta.11 → 2.0.0-beta.13

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-beta.11",
3
+ "version": "2.0.0-beta.13",
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-beta.11"
24
+ "@qodalis/cli-core": "2.0.0-beta.13"
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-beta.11";
8
+ var LIBRARY_VERSION = "2.0.0-beta.13";
9
9
  var API_VERSION = 2;
10
10
 
11
11
  // src/lib/processors/cli-logs-command-processor.ts
@@ -90,15 +90,20 @@ var ServerLogsSubProcessor = class {
90
90
  async processCommand(command, context) {
91
91
  const serverArg = command.args["server"];
92
92
  let serverUrl;
93
+ let serverName;
94
+ let serverHeaders;
93
95
  if (serverArg) {
94
96
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
95
97
  serverUrl = serverArg;
98
+ serverName = "custom";
96
99
  } else {
97
100
  const match = context.options?.servers?.find(
98
101
  (s) => s.name === serverArg
99
102
  );
100
103
  if (match) {
101
104
  serverUrl = match.url;
105
+ serverName = match.name;
106
+ serverHeaders = match.headers;
102
107
  } else {
103
108
  context.writer.writeError(
104
109
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -107,7 +112,10 @@ var ServerLogsSubProcessor = class {
107
112
  }
108
113
  }
109
114
  } else {
110
- serverUrl = context.options?.servers?.[0]?.url;
115
+ const defaultServer = context.options?.servers?.[0];
116
+ serverUrl = defaultServer?.url;
117
+ serverName = defaultServer?.name;
118
+ serverHeaders = defaultServer?.headers;
111
119
  }
112
120
  if (!serverUrl) {
113
121
  context.writer.writeError(
@@ -125,11 +133,16 @@ var ServerLogsSubProcessor = class {
125
133
  if (command.args["pattern"]) {
126
134
  patternRegex = new RegExp(command.args["pattern"], "g");
127
135
  }
128
- const ws = new WebSocket(fullUrl);
136
+ const ws = new WebSocket(cliCore.buildAuthenticatedWebSocketUrl(
137
+ fullUrl,
138
+ () => cliCore.resolveServerHeaders(context.services, serverName ?? "custom", serverHeaders)
139
+ ));
129
140
  const logs = [];
141
+ context.notifier.info("Connecting to log stream");
130
142
  return new Promise((resolve) => {
131
143
  let index = 0;
132
144
  ws.onopen = () => {
145
+ context.notifier.info("Streaming live logs");
133
146
  context.writer.writeSuccess("Streaming live logs...");
134
147
  if (command.args["level"]) {
135
148
  context.writer.writeInfo(
@@ -181,6 +194,7 @@ var ServerLogsSubProcessor = class {
181
194
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
182
195
  context.writer.writeToFile(filename, logs.join("\n"));
183
196
  }
197
+ context.notifier.info("Log stream disconnected");
184
198
  context.writer.writeInfo("Disconnected from live logs");
185
199
  resolve();
186
200
  };
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","highlightTextWithBg","CliForegroundColor"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\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\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name === serverArg,\n );\n if (match) {\n serverUrl = match.url;\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 serverUrl = context.options?.servers?.[0]?.url;\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(fullUrl);\n const logs: string[] = [];\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\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.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","buildAuthenticatedWebSocketUrl","resolveServerHeaders","highlightTextWithBg","CliForegroundColor"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.13';\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 buildAuthenticatedWebSocketUrl,\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 serverUrl = serverArg;\n serverName = 'custom';\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name === serverArg,\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 = context.options?.servers?.[0];\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(buildAuthenticatedWebSocketUrl(\n fullUrl,\n () => resolveServerHeaders(context.services, serverName ?? 'custom', serverHeaders),\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
@@ -1,9 +1,9 @@
1
- import { DefaultLibraryAuthor, highlightTextWithBg, CliForegroundColor } from '@qodalis/cli-core';
1
+ import { DefaultLibraryAuthor, buildAuthenticatedWebSocketUrl, resolveServerHeaders, highlightTextWithBg, CliForegroundColor } from '@qodalis/cli-core';
2
2
 
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-beta.11";
6
+ var LIBRARY_VERSION = "2.0.0-beta.13";
7
7
  var API_VERSION = 2;
8
8
 
9
9
  // src/lib/processors/cli-logs-command-processor.ts
@@ -88,15 +88,20 @@ var ServerLogsSubProcessor = class {
88
88
  async processCommand(command, context) {
89
89
  const serverArg = command.args["server"];
90
90
  let serverUrl;
91
+ let serverName;
92
+ let serverHeaders;
91
93
  if (serverArg) {
92
94
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
93
95
  serverUrl = serverArg;
96
+ serverName = "custom";
94
97
  } else {
95
98
  const match = context.options?.servers?.find(
96
99
  (s) => s.name === serverArg
97
100
  );
98
101
  if (match) {
99
102
  serverUrl = match.url;
103
+ serverName = match.name;
104
+ serverHeaders = match.headers;
100
105
  } else {
101
106
  context.writer.writeError(
102
107
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -105,7 +110,10 @@ var ServerLogsSubProcessor = class {
105
110
  }
106
111
  }
107
112
  } else {
108
- serverUrl = context.options?.servers?.[0]?.url;
113
+ const defaultServer = context.options?.servers?.[0];
114
+ serverUrl = defaultServer?.url;
115
+ serverName = defaultServer?.name;
116
+ serverHeaders = defaultServer?.headers;
109
117
  }
110
118
  if (!serverUrl) {
111
119
  context.writer.writeError(
@@ -123,11 +131,16 @@ var ServerLogsSubProcessor = class {
123
131
  if (command.args["pattern"]) {
124
132
  patternRegex = new RegExp(command.args["pattern"], "g");
125
133
  }
126
- const ws = new WebSocket(fullUrl);
134
+ const ws = new WebSocket(buildAuthenticatedWebSocketUrl(
135
+ fullUrl,
136
+ () => resolveServerHeaders(context.services, serverName ?? "custom", serverHeaders)
137
+ ));
127
138
  const logs = [];
139
+ context.notifier.info("Connecting to log stream");
128
140
  return new Promise((resolve) => {
129
141
  let index = 0;
130
142
  ws.onopen = () => {
143
+ context.notifier.info("Streaming live logs");
131
144
  context.writer.writeSuccess("Streaming live logs...");
132
145
  if (command.args["level"]) {
133
146
  context.writer.writeInfo(
@@ -179,6 +192,7 @@ var ServerLogsSubProcessor = class {
179
192
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
180
193
  context.writer.writeToFile(filename, logs.join("\n"));
181
194
  }
195
+ context.notifier.info("Log stream disconnected");
182
196
  context.writer.writeInfo("Disconnected from live logs");
183
197
  resolve();
184
198
  };
@@ -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":";;;;;AAEO,IAAM,eAAA,GAAkB,eAAA;AACxB,IAAM,WAAA,GAAc,CAAA;;;ACU3B,IAAM,SAAS,CAAC,SAAA,EAAW,SAAS,aAAA,EAAe,SAAA,EAAW,SAAS,OAAO,CAAA;AASvE,IAAM,0BAAN,MAA8D;AAAA,EAA9D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,QAAA;AAEV,IAAA,IAAA,CAAA,gBAAA,GAAmB,IAAA;AAEnB,IAAA,IAAA,CAAA,UAAA,GAAkD;AAAA,MAC9C,IAAI,sBAAA;AAAuB,KAC/B;AAEA,IAAA,IAAA,CAAA,QAAA,GAA8C;AAAA,MAC1C,aAAA,EAAe,IAAA;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,mBAAA,EAAqB,gBAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACxB;AAEA,IAAA,IAAA,CAAA,MAAA,GAAyC,oBAAA;AAEzC,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAAA,EAAA;AAAA,EAEV,MAAM,cAAA,CACF,QAAA,EACA,QAAA,EACa;AAAA,EAEjB;AACJ;AAEA,IAAM,yBAAN,MAA6D;AAAA,EAgEzD,WAAA,GAAc;AA/Dd,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAmC,uCAAA;AAEnC,IAAA,IAAA,CAAA,UAAA,GAAkD,EAAC;AAEnD,IAAA,IAAA,CAAA,QAAA,GAA8C;AAAA,MAC1C,IAAA,EAAM;AAAA,KACV;AAEA,IAAA,IAAA,CAAA,UAAA,GAA4D;AAAA,MACxD;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,6CAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,SAAA,EAAW,CAAC,KAAA,KAAkB;AAC1B,UAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,UAAA,OAAO;AAAA,YACH,KAAA,EAAO,OAAA;AAAA,YACP,OAAA,EAAS,UACH,MAAA,GACA;AAAA,WACV;AAAA,QACJ;AAAA,OACJ;AAAA,MACA;AAAA,QACI,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACI,mCAAA,GAAsC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,QAC1D,QAAA,EAAU,KAAA;AAAA,QACV,SAAA,EAAW,CAAC,KAAA,KAAkB;AAC1B,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAErC,UAAA,OAAO;AAAA,YACH,KAAA,EAAO,OAAA;AAAA,YACP,SAAS,OAAA,GACH,MAAA,GACA,8CAAA,GACA,MAAA,CAAO,KAAK,IAAI;AAAA,WAC1B;AAAA,QACJ;AAAA,OACJ;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACI,0EAAA;AAAA,QACJ,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uBAAA;AAAA,QACb,QAAA,EAAU;AAAA;AACd,KACJ;AAEA,IAAA,IAAA,CAAA,MAAA,GAAyC,oBAAA;AAEzC,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAGN,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MAClB,OAAA,EAAS,MAAA;AAAA,MACT,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA,EAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAAA,MAC7C,gBAAA,EAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI;AAAA,KACpD,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACvC,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,IAAI,UAAU,UAAA,CAAW,SAAS,KAAK,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA,EAAG;AACrE,QAAA,SAAA,GAAY,SAAA;AAAA,MAChB,CAAA,MAAO;AACH,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,IAAA;AAAA,UACpC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS;AAAA,SACtB;AACA,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,SAAA,GAAY,KAAA,CAAM,GAAA;AAAA,QACtB,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,YACX,CAAA,QAAA,EAAW,SAAS,CAAA,gCAAA,EAChB,OAAA,CAAQ,SAAS,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,MAC/D,CAAA;AAAA,WACJ;AACA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,SAAA,GAAY,OAAA,CAAQ,OAAA,EAAS,OAAA,GAAU,CAAC,CAAA,EAAG,GAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,QACX;AAAA,OACJ;AACA,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAElD,IAAA,IAAI,OAAA,GAAU,GAAG,KAAK,CAAA,gBAAA,CAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACvB,MAAA,OAAA,IAAW,UAAU,kBAAA,CAAmB,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAC,CAAA,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACzB,MAAA,YAAA,GAAe,IAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,GAAG,GAAG,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,OAAO,CAAA;AAChC,IAAA,MAAM,OAAiB,EAAC;AAExB,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAClC,MAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,MAAA,EAAA,CAAG,SAAS,MAAM;AACd,QAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,wBAAwB,CAAA;AAEpD,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACvB,UAAA,OAAA,CAAQ,MAAA,CAAO,SAAA;AAAA,YACX,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,WAC1C;AAAA,QACJ;AACA,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,MAAA,CAAO,SAAA;AAAA,YACX,CAAA,gBAAA,EAAmB,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,WAC9C;AAAA,QACJ;AAEA,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,sBAAsB,CAAA;AAC/C,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAAA,MAC3B,CAAA;AAEA,MAAA,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAwB;AACpC,QAAA,IAAI;AACA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAElC,UAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC3B,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC5B,YAAA,EAAA,CAAG,KAAA,EAAM;AACT,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACrB,YAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,EAAA;AACpC,YAAA,MAAM,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAA,EAAI,WAAA,EAAY;AAC7C,YAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAClC,YAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,EAAA;AAEhC,YAAA,MAAM,OAAA,GAAU,IAAI,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,QAAQ,KAAK,OAAO,CAAA,CAAA;AAEhE,YAAA,IAAI,YAAA,EAAc;AACd,cAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,cAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,gBAAA;AAAA,cACJ;AACA,cAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AAAA,YAC7B;AAEA,YAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAEjB,YAAA,MAAM,WAAA,GAAc,YAAA,GACd,mBAAA,CAAoB,OAAA,EAAS,YAAY,CAAA,GACzC,OAAA;AAEN,YAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,cACX,CAAA,QAAA,EAAW,EAAE,KAAK,CAAA,SAAA,EAAY,WAAW,CAAA;AAAA,aAC7C;AAAA,UACJ;AAAA,QACJ,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACJ,CAAA;AAEA,MAAA,EAAA,CAAG,UAAU,MAAM;AACf,QAAA,IAAI,QAAQ,IAAA,CAAK,MAAM,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,UAAA,MAAM,WAAW,CAAA,KAAA,EAAA,iBAAQ,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA,IAAA,CAAA;AACjD,UAAA,OAAA,CAAQ,OAAO,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,QACxD;AAEA,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,6BAA6B,CAAA;AACtD,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAA;AAEA,MAAA,EAAA,CAAG,UAAU,MAAM;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,UACX;AAAA,SACJ;AAAA,MACJ,CAAA;AAEA,MAAA,OAAA,CAAQ,OAAA,CAAQ,UAAU,MAAM;AAC5B,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACb,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,IAAA,MAAA,CAAO,QAAQ,uCAAuC,CAAA;AACtD,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,QAAQ,kBAAW,CAAA;AAC1B,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,aAAA,EAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,oDAAA;AAAA,KACnE;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,2BAAA,EAA6B,kBAAA,CAAmB,IAAI,CAAC,CAAA,uCAAA;AAAA,KACjF;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,mCAAA,EAAqC,kBAAA,CAAmB,IAAI,CAAC,CAAA,+BAAA;AAAA,KACzF;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,2BAAA,EAA6B,kBAAA,CAAmB,IAAI,CAAC,CAAA,uCAAA;AAAA,KACjF;AACA,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,QAAQ,CAAA,sBAAA,CAAc,CAAA;AAC7B,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW,kBAAA,CAAmB,MAAM,CAAC,CAAA,mEAAA;AAAA,KACjE;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,WAAA,EAAa,kBAAA,CAAmB,MAAM,CAAC,CAAA,sCAAA;AAAA,KACnE;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY,kBAAA,CAAmB,MAAM,CAAC,CAAA,qCAAA;AAAA,KAClE;AACA,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,KAAK,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,0CAAA;AAAA,KAChE;AACA,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,OAAA;AAAA,MACH,mBAAY,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,kBAAA;AAAA,KACvE;AAAA,EACJ;AACJ,CAAA;AAEA,SAAS,aAAa,OAAA,EAA0B;AAC5C,EAAA,IAAI;AACA,IAAA,IAAI,OAAO,OAAO,CAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACX,SAAS,CAAA,EAAG;AACR,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;AC1SO,IAAM,gBAAA,GAA+B;AAAA,EACxC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,0BAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,uBAAA,EAAyB,CAAA;AAAA,EAC1C,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,6BAAA,EAA+B,kCAAA,EAAmC;AAAA,IACxE,EAAA,EAAI,EAAE,6BAAA,EAA+B,iCAAA,EAAkC;AAAA,IACvE,EAAA,EAAI,EAAE,6BAAA,EAA+B,0BAAA,EAA2B;AAAA,IAChE,EAAA,EAAI,EAAE,6BAAA,EAA+B,4BAAA,EAA6B;AAAA,IAClE,EAAA,EAAI,EAAE,6BAAA,EAA+B,+BAAA,EAAgC;AAAA,IACrE,EAAA,EAAI,EAAE,6BAAA,EAA+B,kDAAA,EAAW;AAAA,IAChD,EAAA,EAAI,EAAE,6BAAA,EAA+B,8CAAA,EAAY;AAAA,IACjD,EAAA,EAAI,EAAE,6BAAA,EAA+B,sCAAA,EAAS;AAAA,IAC9C,EAAA,EAAI,EAAE,6BAAA,EAA+B,gMAAA,EAAsC;AAAA,IAC3E,EAAA,EAAI,EAAE,6BAAA,EAA+B,8CAAA;AAAkC;AAE/E","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\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\n if (serverArg) {\n if (serverArg.startsWith('http://') || serverArg.startsWith('https://')) {\n serverUrl = serverArg;\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name === serverArg,\n );\n if (match) {\n serverUrl = match.url;\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 serverUrl = context.options?.servers?.[0]?.url;\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(fullUrl);\n const logs: string[] = [];\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\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.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.0-beta.13';\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 buildAuthenticatedWebSocketUrl,\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 serverUrl = serverArg;\n serverName = 'custom';\n } else {\n const match = context.options?.servers?.find(\n (s) => s.name === serverArg,\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 = context.options?.servers?.[0];\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(buildAuthenticatedWebSocketUrl(\n fullUrl,\n () => resolveServerHeaders(context.services, serverName ?? 'custom', serverHeaders),\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"]}
@@ -1833,6 +1833,22 @@ var serverLogs = (() => {
1833
1833
  CliForegroundColor2["Reset"] = "\x1B[0m";
1834
1834
  return CliForegroundColor2;
1835
1835
  })(CliForegroundColor || {});
1836
+ var ICliServerAuthService_TOKEN = "cli-server-auth-service";
1837
+ function resolveHeaders(provider) {
1838
+ if (!provider) return {};
1839
+ return typeof provider === "function" ? provider() : provider;
1840
+ }
1841
+ function resolveServerHeaders(services, serverName, configHeaders) {
1842
+ if (services) {
1843
+ const authService = services.get(
1844
+ ICliServerAuthService_TOKEN
1845
+ );
1846
+ if (authService) {
1847
+ return authService.getHeaders(serverName, configHeaders);
1848
+ }
1849
+ }
1850
+ return resolveHeaders(configHeaders);
1851
+ }
1836
1852
  var DefaultLibraryAuthor = {
1837
1853
  name: "Nicolae Lupei",
1838
1854
  email: "nicolae.lupei@qodalis.com"
@@ -1859,9 +1875,12 @@ var serverLogs = (() => {
1859
1875
  * Returns the negotiated API version and the base path for all subsequent calls,
1860
1876
  * or null if the server is unreachable or incompatible.
1861
1877
  */
1862
- static async discover(baseUrl) {
1878
+ static async discover(baseUrl, headers) {
1863
1879
  try {
1864
- const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
1880
+ const resolved = resolveHeaders(headers);
1881
+ const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`, {
1882
+ headers: Object.keys(resolved).length > 0 ? resolved : void 0
1883
+ });
1865
1884
  if (!response.ok) return null;
1866
1885
  const info = await response.json();
1867
1886
  const version = this.negotiate(info);
@@ -1875,6 +1894,17 @@ var serverLogs = (() => {
1875
1894
  }
1876
1895
  }
1877
1896
  };
1897
+ function buildAuthenticatedWebSocketUrl(wsUrl, headers) {
1898
+ const resolved = resolveHeaders(headers);
1899
+ if (Object.keys(resolved).length === 0) {
1900
+ return wsUrl;
1901
+ }
1902
+ const separator = wsUrl.includes("?") ? "&" : "?";
1903
+ const params = Object.entries(resolved).map(
1904
+ ([key, value]) => `_header_${encodeURIComponent(key)}=${encodeURIComponent(value)}`
1905
+ ).join("&");
1906
+ return `${wsUrl}${separator}${params}`;
1907
+ }
1878
1908
  var highlightTextWithBg = (text, pattern, bgColor = "\x1B[43m") => {
1879
1909
  return text.replace(
1880
1910
  pattern,
@@ -2699,7 +2729,7 @@ var serverLogs = (() => {
2699
2729
  };
2700
2730
 
2701
2731
  // src/lib/version.ts
2702
- var LIBRARY_VERSION = "2.0.0-beta.11";
2732
+ var LIBRARY_VERSION = "2.0.0-beta.13";
2703
2733
  var API_VERSION2 = 2;
2704
2734
 
2705
2735
  // src/lib/processors/cli-logs-command-processor.ts
@@ -2784,15 +2814,20 @@ var serverLogs = (() => {
2784
2814
  async processCommand(command, context) {
2785
2815
  const serverArg = command.args["server"];
2786
2816
  let serverUrl;
2817
+ let serverName;
2818
+ let serverHeaders;
2787
2819
  if (serverArg) {
2788
2820
  if (serverArg.startsWith("http://") || serverArg.startsWith("https://")) {
2789
2821
  serverUrl = serverArg;
2822
+ serverName = "custom";
2790
2823
  } else {
2791
2824
  const match = context.options?.servers?.find(
2792
2825
  (s) => s.name === serverArg
2793
2826
  );
2794
2827
  if (match) {
2795
2828
  serverUrl = match.url;
2829
+ serverName = match.name;
2830
+ serverHeaders = match.headers;
2796
2831
  } else {
2797
2832
  context.writer.writeError(
2798
2833
  `Server '${serverArg}' not found. Available servers: ${context.options?.servers?.map((s) => s.name).join(", ") || "none"}`
@@ -2801,7 +2836,10 @@ var serverLogs = (() => {
2801
2836
  }
2802
2837
  }
2803
2838
  } else {
2804
- serverUrl = context.options?.servers?.[0]?.url;
2839
+ const defaultServer = context.options?.servers?.[0];
2840
+ serverUrl = defaultServer?.url;
2841
+ serverName = defaultServer?.name;
2842
+ serverHeaders = defaultServer?.headers;
2805
2843
  }
2806
2844
  if (!serverUrl) {
2807
2845
  context.writer.writeError(
@@ -2819,11 +2857,16 @@ var serverLogs = (() => {
2819
2857
  if (command.args["pattern"]) {
2820
2858
  patternRegex = new RegExp(command.args["pattern"], "g");
2821
2859
  }
2822
- const ws = new WebSocket(fullUrl);
2860
+ const ws = new WebSocket(buildAuthenticatedWebSocketUrl(
2861
+ fullUrl,
2862
+ () => resolveServerHeaders(context.services, serverName ?? "custom", serverHeaders)
2863
+ ));
2823
2864
  const logs = [];
2865
+ context.notifier.info("Connecting to log stream");
2824
2866
  return new Promise((resolve) => {
2825
2867
  let index = 0;
2826
2868
  ws.onopen = () => {
2869
+ context.notifier.info("Streaming live logs");
2827
2870
  context.writer.writeSuccess("Streaming live logs...");
2828
2871
  if (command.args["level"]) {
2829
2872
  context.writer.writeInfo(
@@ -2875,6 +2918,7 @@ var serverLogs = (() => {
2875
2918
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
2876
2919
  context.writer.writeToFile(filename, logs.join("\n"));
2877
2920
  }
2921
+ context.notifier.info("Log stream disconnected");
2878
2922
  context.writer.writeInfo("Disconnected from live logs");
2879
2923
  resolve();
2880
2924
  };