@qodalis/cli-server-logs 2.0.0-beta.10 → 2.0.0-beta.12

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.10",
3
+ "version": "2.0.0-beta.12",
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.10"
24
+ "@qodalis/cli-core": "2.0.0-beta.12"
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.10";
8
+ var LIBRARY_VERSION = "2.0.0-beta.12";
9
9
  var API_VERSION = 2;
10
10
 
11
11
  // src/lib/processors/cli-logs-command-processor.ts
@@ -127,9 +127,11 @@ var ServerLogsSubProcessor = class {
127
127
  }
128
128
  const ws = new WebSocket(fullUrl);
129
129
  const logs = [];
130
+ context.setStatusText("Connecting to log stream");
130
131
  return new Promise((resolve) => {
131
132
  let index = 0;
132
133
  ws.onopen = () => {
134
+ context.setStatusText("Streaming live logs");
133
135
  context.writer.writeSuccess("Streaming live logs...");
134
136
  if (command.args["level"]) {
135
137
  context.writer.writeInfo(
@@ -181,6 +183,7 @@ var ServerLogsSubProcessor = class {
181
183
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
182
184
  context.writer.writeToFile(filename, logs.join("\n"));
183
185
  }
186
+ context.setStatusText("Log stream disconnected");
184
187
  context.writer.writeInfo("Disconnected from live logs");
185
188
  resolve();
186
189
  };
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.10';\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","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.12';\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 context.setStatusText('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.setStatusText('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.setStatusText('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, highlightTextWithBg, CliForegroundColor } from '@
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.10";
6
+ var LIBRARY_VERSION = "2.0.0-beta.12";
7
7
  var API_VERSION = 2;
8
8
 
9
9
  // src/lib/processors/cli-logs-command-processor.ts
@@ -125,9 +125,11 @@ var ServerLogsSubProcessor = class {
125
125
  }
126
126
  const ws = new WebSocket(fullUrl);
127
127
  const logs = [];
128
+ context.setStatusText("Connecting to log stream");
128
129
  return new Promise((resolve) => {
129
130
  let index = 0;
130
131
  ws.onopen = () => {
132
+ context.setStatusText("Streaming live logs");
131
133
  context.writer.writeSuccess("Streaming live logs...");
132
134
  if (command.args["level"]) {
133
135
  context.writer.writeInfo(
@@ -179,6 +181,7 @@ var ServerLogsSubProcessor = class {
179
181
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
180
182
  context.writer.writeToFile(filename, logs.join("\n"));
181
183
  }
184
+ context.setStatusText("Log stream disconnected");
182
185
  context.writer.writeInfo("Disconnected from live logs");
183
186
  resolve();
184
187
  };
@@ -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-beta.10';\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.12';\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 context.setStatusText('Connecting to log stream');\n\n return new Promise<void>((resolve) => {\n let index = 0;\n\n ws.onopen = () => {\n context.setStatusText('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.setStatusText('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"]}
@@ -2699,7 +2699,7 @@ var serverLogs = (() => {
2699
2699
  };
2700
2700
 
2701
2701
  // src/lib/version.ts
2702
- var LIBRARY_VERSION = "2.0.0-beta.10";
2702
+ var LIBRARY_VERSION = "2.0.0-beta.12";
2703
2703
  var API_VERSION2 = 2;
2704
2704
 
2705
2705
  // src/lib/processors/cli-logs-command-processor.ts
@@ -2821,9 +2821,11 @@ var serverLogs = (() => {
2821
2821
  }
2822
2822
  const ws = new WebSocket(fullUrl);
2823
2823
  const logs = [];
2824
+ context.setStatusText("Connecting to log stream");
2824
2825
  return new Promise((resolve) => {
2825
2826
  let index = 0;
2826
2827
  ws.onopen = () => {
2828
+ context.setStatusText("Streaming live logs");
2827
2829
  context.writer.writeSuccess("Streaming live logs...");
2828
2830
  if (command.args["level"]) {
2829
2831
  context.writer.writeInfo(
@@ -2875,6 +2877,7 @@ var serverLogs = (() => {
2875
2877
  const filename = `logs-${(/* @__PURE__ */ new Date()).toISOString()}.txt`;
2876
2878
  context.writer.writeToFile(filename, logs.join("\n"));
2877
2879
  }
2880
+ context.setStatusText("Log stream disconnected");
2878
2881
  context.writer.writeInfo("Disconnected from live logs");
2879
2882
  resolve();
2880
2883
  };