@qodalis/cli-server-jobs 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-jobs",
3
- "version": "2.0.0-beta.11",
3
+ "version": "2.0.0-beta.13",
4
4
  "description": "Background job management",
5
5
  "author": "Qodalis Solutions",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "umd": "./umd/index.global.js",
19
19
  "unpkg": "./umd/index.global.js",
20
20
  "dependencies": {
21
- "@qodalis/cli-core": "2.0.0-beta.11"
21
+ "@qodalis/cli-core": "2.0.0-beta.13"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "main": "./public-api.js",
package/public-api.d.mts CHANGED
@@ -104,7 +104,7 @@ declare class CliJobsService {
104
104
  getExecution(jobId: string, execId: string): Promise<JobExecutionDto>;
105
105
  }
106
106
 
107
- declare const LIBRARY_VERSION = "2.0.0-beta.11";
107
+ declare const LIBRARY_VERSION = "2.0.0-beta.13";
108
108
  declare const API_VERSION = 2;
109
109
 
110
110
  declare const jobsModule: ICliModule;
package/public-api.d.ts CHANGED
@@ -104,7 +104,7 @@ declare class CliJobsService {
104
104
  getExecution(jobId: string, execId: string): Promise<JobExecutionDto>;
105
105
  }
106
106
 
107
- declare const LIBRARY_VERSION = "2.0.0-beta.11";
107
+ declare const LIBRARY_VERSION = "2.0.0-beta.13";
108
108
  declare const API_VERSION = 2;
109
109
 
110
110
  declare const jobsModule: ICliModule;
package/public-api.js CHANGED
@@ -93,7 +93,7 @@ var CliJobsService = class {
93
93
 
94
94
  // src/lib/processors/cli-jobs-command-processor.ts
95
95
  function getServices(context, args) {
96
- const manager = context.services.get("cli-server-manager");
96
+ const manager = context.services.getRequired("cli-server-manager");
97
97
  if (!manager || !manager.connections) {
98
98
  return [];
99
99
  }
@@ -104,7 +104,7 @@ function getServices(context, args) {
104
104
  if (!connection.connected) continue;
105
105
  const config = connection.config;
106
106
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
107
- const headers = config.headers ?? {};
107
+ const headers = cliCore.resolveServerHeaders(context.services, name, config.headers);
108
108
  results.push({ name, service: new CliJobsService(baseUrl, headers) });
109
109
  }
110
110
  return results;
@@ -807,7 +807,7 @@ var CliJobsCommandProcessor = class {
807
807
  }
808
808
  // ── Watch ────────────────────────────────────────────────────────
809
809
  async handleWatch(cmd, context) {
810
- const manager = context.services.get("cli-server-manager");
810
+ const manager = context.services.getRequired("cli-server-manager");
811
811
  if (!manager || !manager.connections) {
812
812
  context.writer.writeInfo("No connected servers.");
813
813
  return;
@@ -835,7 +835,10 @@ var CliJobsCommandProcessor = class {
835
835
  if (!connection.connected) continue;
836
836
  const config = connection.config;
837
837
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
838
- const wsUrl = baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events";
838
+ const wsUrl = cliCore.buildAuthenticatedWebSocketUrl(
839
+ baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events",
840
+ () => cliCore.resolveServerHeaders(context.services, serverName, config.headers)
841
+ );
839
842
  try {
840
843
  const ws = new WebSocket(wsUrl);
841
844
  sockets.push(ws);
@@ -902,8 +905,6 @@ var CliJobsCommandProcessor = class {
902
905
  context.writer.writeInfo("Stopped watching job events.");
903
906
  }
904
907
  };
905
-
906
- // src/lib/completion/cli-job-name-completion-provider.ts
907
908
  var JOB_NAME_SUBCOMMANDS = /* @__PURE__ */ new Set([
908
909
  "info",
909
910
  "trigger",
@@ -943,16 +944,16 @@ var CliJobNameCompletionProvider = class {
943
944
  }
944
945
  const lowerPrefix = token.toLowerCase();
945
946
  try {
946
- const manager = this.services.get("cli-server-manager");
947
+ const manager = this.services.getRequired("cli-server-manager");
947
948
  if (!manager?.connections) {
948
949
  return [];
949
950
  }
950
951
  const names = [];
951
- for (const [, connection] of manager.connections) {
952
+ for (const [name, connection] of manager.connections) {
952
953
  if (!connection.connected) continue;
953
954
  const config = connection.config;
954
955
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
955
- const headers = config.headers ?? {};
956
+ const headers = cliCore.resolveServerHeaders(this.services, name, config.headers);
956
957
  const service = new CliJobsService(baseUrl, headers);
957
958
  try {
958
959
  const jobs = await service.listJobs();
@@ -972,7 +973,7 @@ var CliJobNameCompletionProvider = class {
972
973
  };
973
974
 
974
975
  // src/lib/version.ts
975
- var LIBRARY_VERSION = "2.0.0-beta.11";
976
+ var LIBRARY_VERSION = "2.0.0-beta.13";
976
977
  var API_VERSION = 2;
977
978
  var completionProvider = new CliJobNameCompletionProvider();
978
979
  var jobsModule = {
package/public-api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/server-jobs/src/lib/services/cli-jobs-service.ts","../../packages/plugins/server-jobs/src/lib/processors/cli-jobs-command-processor.ts","../../packages/plugins/server-jobs/src/lib/completion/cli-job-name-completion-provider.ts","../../packages/plugins/server-jobs/src/lib/version.ts","../../packages/plugins/server-jobs/src/public-api.ts"],"names":["CliForegroundColor","DefaultLibraryAuthor","CliIcon","ICliCompletionProvider_TOKEN"],"mappings":"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","file":"public-api.js","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.get<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = config.headers ?? {};\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match by name.\n */\nasync function resolveJobId(\n service: CliJobsService,\n nameOrId: string,\n): Promise<JobDto | null> {\n // If it looks like a UUID, try fetching directly\n if (/^[0-9a-f-]{8,}$/i.test(nameOrId)) {\n try {\n return await service.getJob(nameOrId);\n } catch {\n // fall through to name search\n }\n }\n\n const jobs = await service.listJobs();\n const match = jobs.find(\n (j) =>\n j.name.toLowerCase() === nameOrId.toLowerCase() ||\n j.id === nameOrId,\n );\n return match ?? null;\n}\n\nfunction formatRelativeTime(isoString?: string): string {\n if (!isoString) return '-';\n const diff = Date.now() - new Date(isoString).getTime();\n if (diff < 0) {\n // future\n const absDiff = -diff;\n if (absDiff < 60_000) return `in ${Math.round(absDiff / 1000)}s`;\n if (absDiff < 3_600_000) return `in ${Math.round(absDiff / 60_000)}m`;\n if (absDiff < 86_400_000) return `in ${Math.round(absDiff / 3_600_000)}h`;\n return `in ${Math.round(absDiff / 86_400_000)}d`;\n }\n if (diff < 60_000) return `${Math.round(diff / 1000)}s ago`;\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction formatDuration(ms?: number): string {\n if (ms == null) return '-';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nfunction statusColor(\n status: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (status) {\n case 'active':\n case 'completed':\n case 'running':\n return writer.wrapInColor(status, CliForegroundColor.Green);\n case 'paused':\n return writer.wrapInColor(status, CliForegroundColor.Yellow);\n case 'stopped':\n case 'failed':\n case 'timed_out':\n case 'cancelled':\n return writer.wrapInColor(status, CliForegroundColor.Red);\n default:\n return status;\n }\n}\n\nfunction logLevelColor(\n level: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (level) {\n case 'debug':\n return writer.wrapInColor(level, CliForegroundColor.Cyan);\n case 'info':\n return writer.wrapInColor(level, CliForegroundColor.Green);\n case 'warning':\n return writer.wrapInColor(level, CliForegroundColor.Yellow);\n case 'error':\n return writer.wrapInColor(level, CliForegroundColor.Red);\n default:\n return level;\n }\n}\n\nconst serverParam: ICliCommandParameterDescriptor = {\n name: 'server',\n description: 'Target a specific server by name',\n required: false,\n type: 'string',\n};\n\nexport class CliJobsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n description = 'Manage background jobs on connected servers';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n };\n\n processors?: ICliCommandProcessor[] = [\n {\n command: 'jobs',\n description: 'Manage background jobs on connected servers',\n author: DefaultLibraryAuthor,\n metadata: {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n },\n parameters: [serverParam],\n processors: [\n // list\n {\n command: 'list',\n description: 'List all jobs across connected servers',\n aliases: ['ls'],\n parameters: [\n serverParam,\n {\n name: 'group',\n description: 'Filter jobs by group',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleList(cmd, context);\n },\n },\n // info\n {\n command: 'info',\n description: 'Show detailed information about a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleInfo(cmd, context);\n },\n },\n // trigger\n {\n command: 'trigger',\n description: 'Trigger immediate execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'trigger');\n },\n },\n // pause\n {\n command: 'pause',\n description: 'Pause scheduled execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'pause');\n },\n },\n // resume\n {\n command: 'resume',\n description: 'Resume a paused job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'resume');\n },\n },\n // stop\n {\n command: 'stop',\n description: 'Stop a job and cancel current execution if running',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'stop');\n },\n },\n // cancel\n {\n command: 'cancel',\n description: 'Cancel the current execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'cancel');\n },\n },\n // history\n {\n command: 'history',\n description: 'Show execution history for a job',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'limit',\n description: 'Number of entries to show (default 20)',\n required: false,\n type: 'number',\n defaultValue: 20,\n },\n {\n name: 'offset',\n description: 'Offset for pagination',\n required: false,\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'status',\n description: 'Filter by execution status',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleHistory(cmd, context);\n },\n },\n // logs\n {\n command: 'logs',\n description: 'Show logs from the latest or a specific execution',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'exec',\n description: 'Specific execution ID to show logs for',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleLogs(cmd, context);\n },\n },\n // edit\n {\n command: 'edit',\n description: 'Interactively edit job settings',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleEdit(cmd, context);\n },\n },\n // watch\n {\n command: 'watch',\n description: 'Live view of job events via WebSocket',\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleWatch(cmd, context);\n },\n },\n ] as ICliCommandChildProcessor[],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n // Default action: list jobs\n await this.handleList(cmd, context);\n },\n } as any,\n ];\n\n async processCommand(\n _cmd: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — this processor extends 'server' and delegates to child processors\n }\n\n // ── List ──────────────────────────────────────────────────────────\n\n private async handleList(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo(\n 'No connected servers. Use \"server list\" to check connections.',\n );\n return;\n }\n\n const groupFilter = cmd.args['group'] as string | undefined;\n const multiServer = services.length > 1;\n\n for (const { name, service } of services) {\n try {\n let jobs = await service.listJobs();\n if (groupFilter) {\n jobs = jobs.filter(\n (j) =>\n j.group?.toLowerCase() ===\n groupFilter.toLowerCase(),\n );\n }\n\n if (multiServer) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n if (jobs.length === 0) {\n context.writer.writeInfo(' No jobs found.');\n continue;\n }\n\n const headers = [\n 'Name',\n 'Group',\n 'Status',\n 'Schedule',\n 'Last Run',\n 'Next Run',\n 'Duration',\n ];\n const rows: string[][] = jobs.map((j) => [\n j.name,\n j.group ?? '-',\n statusColor(j.status, context.writer),\n j.schedule ?? (j.interval ? `every ${j.interval}ms` : '-'),\n formatRelativeTime(j.lastRunAt),\n formatRelativeTime(j.nextRunAt),\n formatDuration(j.lastRunDuration),\n ]);\n\n context.writer.writeTable(headers, rows);\n } catch (e: any) {\n context.writer.writeError(\n `Failed to list jobs on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Info ──────────────────────────────────────────────────────────\n\n private async handleInfo(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs info <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const lines: [string, string][] = [\n ['ID', job.id],\n ['Name', job.name],\n ['Description', job.description],\n ['Group', job.group ?? '-'],\n ['Status', statusColor(job.status, context.writer)],\n [\n 'Schedule',\n job.schedule ??\n (job.interval\n ? `every ${job.interval}ms`\n : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n [\n 'Timeout',\n job.timeout ? `${job.timeout}ms` : 'none',\n ],\n ['Overlap Policy', job.overlapPolicy],\n [\n 'Current Execution',\n job.currentExecutionId ?? 'none',\n ],\n ['Next Run', formatRelativeTime(job.nextRunAt)],\n ['Last Run', formatRelativeTime(job.lastRunAt)],\n [\n 'Last Run Status',\n job.lastRunStatus\n ? statusColor(job.lastRunStatus, context.writer)\n : '-',\n ],\n ['Last Run Duration', formatDuration(job.lastRunDuration)],\n ];\n\n for (const [label, value] of lines) {\n context.writer.writeln(\n ` ${context.writer.wrapInColor(\n label.padEnd(20),\n CliForegroundColor.Yellow,\n )} ${value}`,\n );\n }\n return; // found on this server\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError(`Usage: jobs ${action} <id|name>`);\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n switch (action) {\n case 'trigger':\n await service.triggerJob(job.id);\n break;\n case 'pause':\n await service.pauseJob(job.id);\n break;\n case 'resume':\n await service.resumeJob(job.id);\n break;\n case 'stop':\n await service.stopJob(job.id);\n break;\n case 'cancel':\n await service.cancelJob(job.id);\n break;\n }\n\n const serverSuffix =\n services.length > 1 ? ` on server ${name}` : '';\n context.writer.writeSuccess(\n `Job \"${job.name}\" ${action}${action.endsWith('e') ? 'd' : 'ed'}${serverSuffix}.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Failed to ${action} job on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── History ──────────────────────────────────────────────────────\n\n private async handleHistory(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs history <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const limit = (cmd.args['limit'] as number) ?? 20;\n const offset = (cmd.args['offset'] as number) ?? 0;\n const status = cmd.args['status'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const history = await service.getHistory(job.id, {\n limit,\n offset,\n status,\n });\n\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No execution history for \"${job.name}\".`,\n );\n return;\n }\n\n context.writer.writeln(\n `Showing ${history.items.length} of ${history.total} executions for \"${job.name}\":`,\n );\n\n const headers = [\n 'ID',\n 'Status',\n 'Started',\n 'Duration',\n 'Retry',\n 'Error',\n ];\n const rows: string[][] = history.items.map((exec) => [\n exec.id.substring(0, 8),\n statusColor(exec.status, context.writer),\n formatRelativeTime(exec.startedAt),\n formatDuration(exec.duration),\n String(exec.retryAttempt),\n exec.error ? exec.error.substring(0, 40) : '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Logs ─────────────────────────────────────────────────────────\n\n private async handleLogs(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs logs <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const execId = cmd.args['exec'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n let execution: JobExecutionDto;\n\n if (execId) {\n execution = await service.getExecution(job.id, execId);\n } else {\n // Get the latest execution\n const history = await service.getHistory(job.id, {\n limit: 1,\n });\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No executions found for \"${job.name}\".`,\n );\n return;\n }\n // Fetch full execution to get logs\n execution = await service.getExecution(\n job.id,\n history.items[0].id,\n );\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n context.writer.writeln(\n `Logs for \"${job.name}\" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`,\n );\n\n if (!execution.logs || execution.logs.length === 0) {\n context.writer.writeInfo(' No log entries.');\n return;\n }\n\n for (const entry of execution.logs) {\n const ts = new Date(entry.timestamp).toLocaleTimeString();\n const level = logLevelColor(\n entry.level,\n context.writer,\n ).padEnd(12);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`,\n );\n }\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs edit <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n // Use the first matching server\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n context.writer.writeln(\n `Editing job \"${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}\" on server ${name}`,\n );\n context.writer.writeln(\n 'Press Enter to keep current value, or type a new value.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await context.reader.readLine(\n `Description [${job.description}]: `,\n );\n if (newDesc == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newDesc.trim()) {\n update.description = newDesc.trim();\n }\n\n // Group\n const newGroup = await context.reader.readLine(\n `Group [${job.group ?? 'none'}]: `,\n );\n if (newGroup == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newGroup.trim()) {\n update.group = newGroup.trim();\n }\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await context.reader.readLine(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newSchedule.trim()) {\n update.schedule = newSchedule.trim();\n }\n\n // Interval\n if (!newSchedule.trim()) {\n const newInterval = await context.reader.readLine(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval != null && newInterval.trim()) {\n update.interval = newInterval.trim();\n }\n }\n\n // Max retries\n const newRetries = await context.reader.readLine(\n `Max retries [${job.maxRetries}]: `,\n );\n if (newRetries != null && newRetries.trim()) {\n const parsed = parseInt(newRetries.trim(), 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await context.reader.readLine(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout != null && newTimeout.trim()) {\n update.timeout = newTimeout.trim();\n }\n\n // Overlap policy\n const newOverlap = await context.reader.readLine(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (\n newOverlap != null &&\n newOverlap.trim() &&\n ['skip', 'queue', 'cancel'].includes(\n newOverlap.trim().toLowerCase(),\n )\n ) {\n update.overlapPolicy = newOverlap.trim().toLowerCase();\n }\n\n // Check if anything changed\n if (Object.keys(update).length === 0) {\n context.writer.writeInfo('No changes made.');\n return;\n }\n\n // Confirm\n const confirm = await context.reader.readConfirm(\n 'Apply changes?',\n );\n if (!confirm) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.get<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n\n context.writer.writeln(\n context.writer.wrapInColor(\n 'Watching job events... (press Ctrl+C to stop)',\n CliForegroundColor.Cyan,\n ),\n );\n context.writer.writeln('');\n\n const sockets: WebSocket[] = [];\n const abortHandler = () => {\n for (const ws of sockets) {\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n };\n\n context.onAbort.subscribe(abortHandler);\n\n for (const [serverName, connection] of manager.connections as Map<\n string,\n any\n >) {\n if (targetServer && serverName !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const wsUrl =\n baseUrl\n .replace(/^https:/, 'wss:')\n .replace(/^http:/, 'ws:') + '/ws/v1/qcli/events';\n\n try {\n const ws = new WebSocket(wsUrl);\n sockets.push(ws);\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n if (\n !data.type ||\n !data.type.startsWith('job:')\n ) {\n return;\n }\n\n const ts = new Date().toLocaleTimeString();\n const serverPrefix =\n manager.connections.size > 1\n ? context.writer.wrapInColor(\n `[${serverName}] `,\n CliForegroundColor.Cyan,\n )\n : '';\n\n let detail = '';\n if (data.jobId) {\n detail += ` jobId=${data.jobId}`;\n }\n if (data.executionId) {\n detail += ` execId=${data.executionId.substring(0, 8)}`;\n }\n if (data.duration != null) {\n detail += ` duration=${formatDuration(data.duration)}`;\n }\n if (data.error) {\n detail += ` error=\"${data.error}\"`;\n }\n\n const eventType = statusColor(\n data.type.replace('job:', ''),\n context.writer,\n );\n\n context.writer.writeln(\n `${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${serverPrefix}${eventType}${detail}`,\n );\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n // Will close when aborted\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Keep the command alive until aborted\n await new Promise<void>((resolve) => {\n const sub = context.onAbort.subscribe(() => {\n sub.unsubscribe();\n resolve();\n });\n // Also resolve if the signal fires\n if (context.signal) {\n context.signal.addEventListener('abort', () => {\n sub.unsubscribe();\n resolve();\n });\n }\n });\n\n context.writer.writeln('');\n context.writer.writeInfo('Stopped watching job events.');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.get<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = config.headers ?? {};\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of jobs\n */\n\nexport * from './lib/processors/cli-jobs-command-processor';\nexport * from './lib/completion/cli-job-name-completion-provider';\nexport * from './lib/services/cli-jobs-service';\nexport * from './lib/models';\nexport * from './lib/version';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliJobsCommandProcessor } from './lib/processors/cli-jobs-command-processor';\nimport { CliJobNameCompletionProvider } from './lib/completion/cli-job-name-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst completionProvider = new CliJobNameCompletionProvider();\n\nexport const jobsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-jobs',\n processors: [new CliJobsCommandProcessor()],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: completionProvider,\n multi: true,\n },\n ],\n async onInit(context) {\n completionProvider.setServices(context.services);\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/server-jobs/src/lib/services/cli-jobs-service.ts","../../packages/plugins/server-jobs/src/lib/processors/cli-jobs-command-processor.ts","../../packages/plugins/server-jobs/src/lib/completion/cli-job-name-completion-provider.ts","../../packages/plugins/server-jobs/src/lib/version.ts","../../packages/plugins/server-jobs/src/public-api.ts"],"names":["resolveServerHeaders","CliForegroundColor","DefaultLibraryAuthor","CliIcon","buildAuthenticatedWebSocketUrl","ICliCompletionProvider_TOKEN"],"mappings":"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","file":"public-api.js","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n buildAuthenticatedWebSocketUrl,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(context.services, name, config.headers);\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match by name.\n */\nasync function resolveJobId(\n service: CliJobsService,\n nameOrId: string,\n): Promise<JobDto | null> {\n // If it looks like a UUID, try fetching directly\n if (/^[0-9a-f-]{8,}$/i.test(nameOrId)) {\n try {\n return await service.getJob(nameOrId);\n } catch {\n // fall through to name search\n }\n }\n\n const jobs = await service.listJobs();\n const match = jobs.find(\n (j) =>\n j.name.toLowerCase() === nameOrId.toLowerCase() ||\n j.id === nameOrId,\n );\n return match ?? null;\n}\n\nfunction formatRelativeTime(isoString?: string): string {\n if (!isoString) return '-';\n const diff = Date.now() - new Date(isoString).getTime();\n if (diff < 0) {\n // future\n const absDiff = -diff;\n if (absDiff < 60_000) return `in ${Math.round(absDiff / 1000)}s`;\n if (absDiff < 3_600_000) return `in ${Math.round(absDiff / 60_000)}m`;\n if (absDiff < 86_400_000) return `in ${Math.round(absDiff / 3_600_000)}h`;\n return `in ${Math.round(absDiff / 86_400_000)}d`;\n }\n if (diff < 60_000) return `${Math.round(diff / 1000)}s ago`;\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction formatDuration(ms?: number): string {\n if (ms == null) return '-';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nfunction statusColor(\n status: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (status) {\n case 'active':\n case 'completed':\n case 'running':\n return writer.wrapInColor(status, CliForegroundColor.Green);\n case 'paused':\n return writer.wrapInColor(status, CliForegroundColor.Yellow);\n case 'stopped':\n case 'failed':\n case 'timed_out':\n case 'cancelled':\n return writer.wrapInColor(status, CliForegroundColor.Red);\n default:\n return status;\n }\n}\n\nfunction logLevelColor(\n level: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (level) {\n case 'debug':\n return writer.wrapInColor(level, CliForegroundColor.Cyan);\n case 'info':\n return writer.wrapInColor(level, CliForegroundColor.Green);\n case 'warning':\n return writer.wrapInColor(level, CliForegroundColor.Yellow);\n case 'error':\n return writer.wrapInColor(level, CliForegroundColor.Red);\n default:\n return level;\n }\n}\n\nconst serverParam: ICliCommandParameterDescriptor = {\n name: 'server',\n description: 'Target a specific server by name',\n required: false,\n type: 'string',\n};\n\nexport class CliJobsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n description = 'Manage background jobs on connected servers';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n };\n\n processors?: ICliCommandProcessor[] = [\n {\n command: 'jobs',\n description: 'Manage background jobs on connected servers',\n author: DefaultLibraryAuthor,\n metadata: {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n },\n parameters: [serverParam],\n processors: [\n // list\n {\n command: 'list',\n description: 'List all jobs across connected servers',\n aliases: ['ls'],\n parameters: [\n serverParam,\n {\n name: 'group',\n description: 'Filter jobs by group',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleList(cmd, context);\n },\n },\n // info\n {\n command: 'info',\n description: 'Show detailed information about a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleInfo(cmd, context);\n },\n },\n // trigger\n {\n command: 'trigger',\n description: 'Trigger immediate execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'trigger');\n },\n },\n // pause\n {\n command: 'pause',\n description: 'Pause scheduled execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'pause');\n },\n },\n // resume\n {\n command: 'resume',\n description: 'Resume a paused job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'resume');\n },\n },\n // stop\n {\n command: 'stop',\n description: 'Stop a job and cancel current execution if running',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'stop');\n },\n },\n // cancel\n {\n command: 'cancel',\n description: 'Cancel the current execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'cancel');\n },\n },\n // history\n {\n command: 'history',\n description: 'Show execution history for a job',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'limit',\n description: 'Number of entries to show (default 20)',\n required: false,\n type: 'number',\n defaultValue: 20,\n },\n {\n name: 'offset',\n description: 'Offset for pagination',\n required: false,\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'status',\n description: 'Filter by execution status',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleHistory(cmd, context);\n },\n },\n // logs\n {\n command: 'logs',\n description: 'Show logs from the latest or a specific execution',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'exec',\n description: 'Specific execution ID to show logs for',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleLogs(cmd, context);\n },\n },\n // edit\n {\n command: 'edit',\n description: 'Interactively edit job settings',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleEdit(cmd, context);\n },\n },\n // watch\n {\n command: 'watch',\n description: 'Live view of job events via WebSocket',\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleWatch(cmd, context);\n },\n },\n ] as ICliCommandChildProcessor[],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n // Default action: list jobs\n await this.handleList(cmd, context);\n },\n } as any,\n ];\n\n async processCommand(\n _cmd: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — this processor extends 'server' and delegates to child processors\n }\n\n // ── List ──────────────────────────────────────────────────────────\n\n private async handleList(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo(\n 'No connected servers. Use \"server list\" to check connections.',\n );\n return;\n }\n\n const groupFilter = cmd.args['group'] as string | undefined;\n const multiServer = services.length > 1;\n\n for (const { name, service } of services) {\n try {\n let jobs = await service.listJobs();\n if (groupFilter) {\n jobs = jobs.filter(\n (j) =>\n j.group?.toLowerCase() ===\n groupFilter.toLowerCase(),\n );\n }\n\n if (multiServer) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n if (jobs.length === 0) {\n context.writer.writeInfo(' No jobs found.');\n continue;\n }\n\n const headers = [\n 'Name',\n 'Group',\n 'Status',\n 'Schedule',\n 'Last Run',\n 'Next Run',\n 'Duration',\n ];\n const rows: string[][] = jobs.map((j) => [\n j.name,\n j.group ?? '-',\n statusColor(j.status, context.writer),\n j.schedule ?? (j.interval ? `every ${j.interval}ms` : '-'),\n formatRelativeTime(j.lastRunAt),\n formatRelativeTime(j.nextRunAt),\n formatDuration(j.lastRunDuration),\n ]);\n\n context.writer.writeTable(headers, rows);\n } catch (e: any) {\n context.writer.writeError(\n `Failed to list jobs on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Info ──────────────────────────────────────────────────────────\n\n private async handleInfo(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs info <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const lines: [string, string][] = [\n ['ID', job.id],\n ['Name', job.name],\n ['Description', job.description],\n ['Group', job.group ?? '-'],\n ['Status', statusColor(job.status, context.writer)],\n [\n 'Schedule',\n job.schedule ??\n (job.interval\n ? `every ${job.interval}ms`\n : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n [\n 'Timeout',\n job.timeout ? `${job.timeout}ms` : 'none',\n ],\n ['Overlap Policy', job.overlapPolicy],\n [\n 'Current Execution',\n job.currentExecutionId ?? 'none',\n ],\n ['Next Run', formatRelativeTime(job.nextRunAt)],\n ['Last Run', formatRelativeTime(job.lastRunAt)],\n [\n 'Last Run Status',\n job.lastRunStatus\n ? statusColor(job.lastRunStatus, context.writer)\n : '-',\n ],\n ['Last Run Duration', formatDuration(job.lastRunDuration)],\n ];\n\n for (const [label, value] of lines) {\n context.writer.writeln(\n ` ${context.writer.wrapInColor(\n label.padEnd(20),\n CliForegroundColor.Yellow,\n )} ${value}`,\n );\n }\n return; // found on this server\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError(`Usage: jobs ${action} <id|name>`);\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n switch (action) {\n case 'trigger':\n await service.triggerJob(job.id);\n break;\n case 'pause':\n await service.pauseJob(job.id);\n break;\n case 'resume':\n await service.resumeJob(job.id);\n break;\n case 'stop':\n await service.stopJob(job.id);\n break;\n case 'cancel':\n await service.cancelJob(job.id);\n break;\n }\n\n const serverSuffix =\n services.length > 1 ? ` on server ${name}` : '';\n context.writer.writeSuccess(\n `Job \"${job.name}\" ${action}${action.endsWith('e') ? 'd' : 'ed'}${serverSuffix}.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Failed to ${action} job on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── History ──────────────────────────────────────────────────────\n\n private async handleHistory(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs history <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const limit = (cmd.args['limit'] as number) ?? 20;\n const offset = (cmd.args['offset'] as number) ?? 0;\n const status = cmd.args['status'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const history = await service.getHistory(job.id, {\n limit,\n offset,\n status,\n });\n\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No execution history for \"${job.name}\".`,\n );\n return;\n }\n\n context.writer.writeln(\n `Showing ${history.items.length} of ${history.total} executions for \"${job.name}\":`,\n );\n\n const headers = [\n 'ID',\n 'Status',\n 'Started',\n 'Duration',\n 'Retry',\n 'Error',\n ];\n const rows: string[][] = history.items.map((exec) => [\n exec.id.substring(0, 8),\n statusColor(exec.status, context.writer),\n formatRelativeTime(exec.startedAt),\n formatDuration(exec.duration),\n String(exec.retryAttempt),\n exec.error ? exec.error.substring(0, 40) : '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Logs ─────────────────────────────────────────────────────────\n\n private async handleLogs(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs logs <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const execId = cmd.args['exec'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n let execution: JobExecutionDto;\n\n if (execId) {\n execution = await service.getExecution(job.id, execId);\n } else {\n // Get the latest execution\n const history = await service.getHistory(job.id, {\n limit: 1,\n });\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No executions found for \"${job.name}\".`,\n );\n return;\n }\n // Fetch full execution to get logs\n execution = await service.getExecution(\n job.id,\n history.items[0].id,\n );\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n context.writer.writeln(\n `Logs for \"${job.name}\" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`,\n );\n\n if (!execution.logs || execution.logs.length === 0) {\n context.writer.writeInfo(' No log entries.');\n return;\n }\n\n for (const entry of execution.logs) {\n const ts = new Date(entry.timestamp).toLocaleTimeString();\n const level = logLevelColor(\n entry.level,\n context.writer,\n ).padEnd(12);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`,\n );\n }\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs edit <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n // Use the first matching server\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n context.writer.writeln(\n `Editing job \"${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}\" on server ${name}`,\n );\n context.writer.writeln(\n 'Press Enter to keep current value, or type a new value.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await context.reader.readLine(\n `Description [${job.description}]: `,\n );\n if (newDesc == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newDesc.trim()) {\n update.description = newDesc.trim();\n }\n\n // Group\n const newGroup = await context.reader.readLine(\n `Group [${job.group ?? 'none'}]: `,\n );\n if (newGroup == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newGroup.trim()) {\n update.group = newGroup.trim();\n }\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await context.reader.readLine(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newSchedule.trim()) {\n update.schedule = newSchedule.trim();\n }\n\n // Interval\n if (!newSchedule.trim()) {\n const newInterval = await context.reader.readLine(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval != null && newInterval.trim()) {\n update.interval = newInterval.trim();\n }\n }\n\n // Max retries\n const newRetries = await context.reader.readLine(\n `Max retries [${job.maxRetries}]: `,\n );\n if (newRetries != null && newRetries.trim()) {\n const parsed = parseInt(newRetries.trim(), 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await context.reader.readLine(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout != null && newTimeout.trim()) {\n update.timeout = newTimeout.trim();\n }\n\n // Overlap policy\n const newOverlap = await context.reader.readLine(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (\n newOverlap != null &&\n newOverlap.trim() &&\n ['skip', 'queue', 'cancel'].includes(\n newOverlap.trim().toLowerCase(),\n )\n ) {\n update.overlapPolicy = newOverlap.trim().toLowerCase();\n }\n\n // Check if anything changed\n if (Object.keys(update).length === 0) {\n context.writer.writeInfo('No changes made.');\n return;\n }\n\n // Confirm\n const confirm = await context.reader.readConfirm(\n 'Apply changes?',\n );\n if (!confirm) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n\n context.writer.writeln(\n context.writer.wrapInColor(\n 'Watching job events... (press Ctrl+C to stop)',\n CliForegroundColor.Cyan,\n ),\n );\n context.writer.writeln('');\n\n const sockets: WebSocket[] = [];\n const abortHandler = () => {\n for (const ws of sockets) {\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n };\n\n context.onAbort.subscribe(abortHandler);\n\n for (const [serverName, connection] of manager.connections as Map<\n string,\n any\n >) {\n if (targetServer && serverName !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const wsUrl = buildAuthenticatedWebSocketUrl(\n baseUrl\n .replace(/^https:/, 'wss:')\n .replace(/^http:/, 'ws:') + '/ws/v1/qcli/events',\n () => resolveServerHeaders(context.services, serverName, config.headers),\n );\n\n try {\n const ws = new WebSocket(wsUrl);\n sockets.push(ws);\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n if (\n !data.type ||\n !data.type.startsWith('job:')\n ) {\n return;\n }\n\n const ts = new Date().toLocaleTimeString();\n const serverPrefix =\n manager.connections.size > 1\n ? context.writer.wrapInColor(\n `[${serverName}] `,\n CliForegroundColor.Cyan,\n )\n : '';\n\n let detail = '';\n if (data.jobId) {\n detail += ` jobId=${data.jobId}`;\n }\n if (data.executionId) {\n detail += ` execId=${data.executionId.substring(0, 8)}`;\n }\n if (data.duration != null) {\n detail += ` duration=${formatDuration(data.duration)}`;\n }\n if (data.error) {\n detail += ` error=\"${data.error}\"`;\n }\n\n const eventType = statusColor(\n data.type.replace('job:', ''),\n context.writer,\n );\n\n context.writer.writeln(\n `${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${serverPrefix}${eventType}${detail}`,\n );\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n // Will close when aborted\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Keep the command alive until aborted\n await new Promise<void>((resolve) => {\n const sub = context.onAbort.subscribe(() => {\n sub.unsubscribe();\n resolve();\n });\n // Also resolve if the signal fires\n if (context.signal) {\n context.signal.addEventListener('abort', () => {\n sub.unsubscribe();\n resolve();\n });\n }\n });\n\n context.writer.writeln('');\n context.writer.writeInfo('Stopped watching job events.');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.getRequired<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(this.services!, name, config.headers);\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.13';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of jobs\n */\n\nexport * from './lib/processors/cli-jobs-command-processor';\nexport * from './lib/completion/cli-job-name-completion-provider';\nexport * from './lib/services/cli-jobs-service';\nexport * from './lib/models';\nexport * from './lib/version';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliJobsCommandProcessor } from './lib/processors/cli-jobs-command-processor';\nimport { CliJobNameCompletionProvider } from './lib/completion/cli-job-name-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst completionProvider = new CliJobNameCompletionProvider();\n\nexport const jobsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-jobs',\n processors: [new CliJobsCommandProcessor()],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: completionProvider,\n multi: true,\n },\n ],\n async onInit(context) {\n completionProvider.setServices(context.services);\n },\n};\n"]}
package/public-api.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { DefaultLibraryAuthor, CliIcon, CliForegroundColor, ICliCompletionProvider_TOKEN } from '@qodalis/cli-core';
1
+ import { DefaultLibraryAuthor, CliIcon, CliForegroundColor, buildAuthenticatedWebSocketUrl, resolveServerHeaders, ICliCompletionProvider_TOKEN } from '@qodalis/cli-core';
2
2
 
3
3
  // src/lib/processors/cli-jobs-command-processor.ts
4
4
 
@@ -91,7 +91,7 @@ var CliJobsService = class {
91
91
 
92
92
  // src/lib/processors/cli-jobs-command-processor.ts
93
93
  function getServices(context, args) {
94
- const manager = context.services.get("cli-server-manager");
94
+ const manager = context.services.getRequired("cli-server-manager");
95
95
  if (!manager || !manager.connections) {
96
96
  return [];
97
97
  }
@@ -102,7 +102,7 @@ function getServices(context, args) {
102
102
  if (!connection.connected) continue;
103
103
  const config = connection.config;
104
104
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
105
- const headers = config.headers ?? {};
105
+ const headers = resolveServerHeaders(context.services, name, config.headers);
106
106
  results.push({ name, service: new CliJobsService(baseUrl, headers) });
107
107
  }
108
108
  return results;
@@ -805,7 +805,7 @@ var CliJobsCommandProcessor = class {
805
805
  }
806
806
  // ── Watch ────────────────────────────────────────────────────────
807
807
  async handleWatch(cmd, context) {
808
- const manager = context.services.get("cli-server-manager");
808
+ const manager = context.services.getRequired("cli-server-manager");
809
809
  if (!manager || !manager.connections) {
810
810
  context.writer.writeInfo("No connected servers.");
811
811
  return;
@@ -833,7 +833,10 @@ var CliJobsCommandProcessor = class {
833
833
  if (!connection.connected) continue;
834
834
  const config = connection.config;
835
835
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
836
- const wsUrl = baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events";
836
+ const wsUrl = buildAuthenticatedWebSocketUrl(
837
+ baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events",
838
+ () => resolveServerHeaders(context.services, serverName, config.headers)
839
+ );
837
840
  try {
838
841
  const ws = new WebSocket(wsUrl);
839
842
  sockets.push(ws);
@@ -900,8 +903,6 @@ var CliJobsCommandProcessor = class {
900
903
  context.writer.writeInfo("Stopped watching job events.");
901
904
  }
902
905
  };
903
-
904
- // src/lib/completion/cli-job-name-completion-provider.ts
905
906
  var JOB_NAME_SUBCOMMANDS = /* @__PURE__ */ new Set([
906
907
  "info",
907
908
  "trigger",
@@ -941,16 +942,16 @@ var CliJobNameCompletionProvider = class {
941
942
  }
942
943
  const lowerPrefix = token.toLowerCase();
943
944
  try {
944
- const manager = this.services.get("cli-server-manager");
945
+ const manager = this.services.getRequired("cli-server-manager");
945
946
  if (!manager?.connections) {
946
947
  return [];
947
948
  }
948
949
  const names = [];
949
- for (const [, connection] of manager.connections) {
950
+ for (const [name, connection] of manager.connections) {
950
951
  if (!connection.connected) continue;
951
952
  const config = connection.config;
952
953
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
953
- const headers = config.headers ?? {};
954
+ const headers = resolveServerHeaders(this.services, name, config.headers);
954
955
  const service = new CliJobsService(baseUrl, headers);
955
956
  try {
956
957
  const jobs = await service.listJobs();
@@ -970,7 +971,7 @@ var CliJobNameCompletionProvider = class {
970
971
  };
971
972
 
972
973
  // src/lib/version.ts
973
- var LIBRARY_VERSION = "2.0.0-beta.11";
974
+ var LIBRARY_VERSION = "2.0.0-beta.13";
974
975
  var API_VERSION = 2;
975
976
  var completionProvider = new CliJobNameCompletionProvider();
976
977
  var jobsModule = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/plugins/server-jobs/src/lib/services/cli-jobs-service.ts","../../packages/plugins/server-jobs/src/lib/processors/cli-jobs-command-processor.ts","../../packages/plugins/server-jobs/src/lib/completion/cli-job-name-completion-provider.ts","../../packages/plugins/server-jobs/src/lib/version.ts","../../packages/plugins/server-jobs/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.get<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = config.headers ?? {};\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match by name.\n */\nasync function resolveJobId(\n service: CliJobsService,\n nameOrId: string,\n): Promise<JobDto | null> {\n // If it looks like a UUID, try fetching directly\n if (/^[0-9a-f-]{8,}$/i.test(nameOrId)) {\n try {\n return await service.getJob(nameOrId);\n } catch {\n // fall through to name search\n }\n }\n\n const jobs = await service.listJobs();\n const match = jobs.find(\n (j) =>\n j.name.toLowerCase() === nameOrId.toLowerCase() ||\n j.id === nameOrId,\n );\n return match ?? null;\n}\n\nfunction formatRelativeTime(isoString?: string): string {\n if (!isoString) return '-';\n const diff = Date.now() - new Date(isoString).getTime();\n if (diff < 0) {\n // future\n const absDiff = -diff;\n if (absDiff < 60_000) return `in ${Math.round(absDiff / 1000)}s`;\n if (absDiff < 3_600_000) return `in ${Math.round(absDiff / 60_000)}m`;\n if (absDiff < 86_400_000) return `in ${Math.round(absDiff / 3_600_000)}h`;\n return `in ${Math.round(absDiff / 86_400_000)}d`;\n }\n if (diff < 60_000) return `${Math.round(diff / 1000)}s ago`;\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction formatDuration(ms?: number): string {\n if (ms == null) return '-';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nfunction statusColor(\n status: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (status) {\n case 'active':\n case 'completed':\n case 'running':\n return writer.wrapInColor(status, CliForegroundColor.Green);\n case 'paused':\n return writer.wrapInColor(status, CliForegroundColor.Yellow);\n case 'stopped':\n case 'failed':\n case 'timed_out':\n case 'cancelled':\n return writer.wrapInColor(status, CliForegroundColor.Red);\n default:\n return status;\n }\n}\n\nfunction logLevelColor(\n level: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (level) {\n case 'debug':\n return writer.wrapInColor(level, CliForegroundColor.Cyan);\n case 'info':\n return writer.wrapInColor(level, CliForegroundColor.Green);\n case 'warning':\n return writer.wrapInColor(level, CliForegroundColor.Yellow);\n case 'error':\n return writer.wrapInColor(level, CliForegroundColor.Red);\n default:\n return level;\n }\n}\n\nconst serverParam: ICliCommandParameterDescriptor = {\n name: 'server',\n description: 'Target a specific server by name',\n required: false,\n type: 'string',\n};\n\nexport class CliJobsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n description = 'Manage background jobs on connected servers';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n };\n\n processors?: ICliCommandProcessor[] = [\n {\n command: 'jobs',\n description: 'Manage background jobs on connected servers',\n author: DefaultLibraryAuthor,\n metadata: {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n },\n parameters: [serverParam],\n processors: [\n // list\n {\n command: 'list',\n description: 'List all jobs across connected servers',\n aliases: ['ls'],\n parameters: [\n serverParam,\n {\n name: 'group',\n description: 'Filter jobs by group',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleList(cmd, context);\n },\n },\n // info\n {\n command: 'info',\n description: 'Show detailed information about a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleInfo(cmd, context);\n },\n },\n // trigger\n {\n command: 'trigger',\n description: 'Trigger immediate execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'trigger');\n },\n },\n // pause\n {\n command: 'pause',\n description: 'Pause scheduled execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'pause');\n },\n },\n // resume\n {\n command: 'resume',\n description: 'Resume a paused job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'resume');\n },\n },\n // stop\n {\n command: 'stop',\n description: 'Stop a job and cancel current execution if running',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'stop');\n },\n },\n // cancel\n {\n command: 'cancel',\n description: 'Cancel the current execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'cancel');\n },\n },\n // history\n {\n command: 'history',\n description: 'Show execution history for a job',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'limit',\n description: 'Number of entries to show (default 20)',\n required: false,\n type: 'number',\n defaultValue: 20,\n },\n {\n name: 'offset',\n description: 'Offset for pagination',\n required: false,\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'status',\n description: 'Filter by execution status',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleHistory(cmd, context);\n },\n },\n // logs\n {\n command: 'logs',\n description: 'Show logs from the latest or a specific execution',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'exec',\n description: 'Specific execution ID to show logs for',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleLogs(cmd, context);\n },\n },\n // edit\n {\n command: 'edit',\n description: 'Interactively edit job settings',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleEdit(cmd, context);\n },\n },\n // watch\n {\n command: 'watch',\n description: 'Live view of job events via WebSocket',\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleWatch(cmd, context);\n },\n },\n ] as ICliCommandChildProcessor[],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n // Default action: list jobs\n await this.handleList(cmd, context);\n },\n } as any,\n ];\n\n async processCommand(\n _cmd: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — this processor extends 'server' and delegates to child processors\n }\n\n // ── List ──────────────────────────────────────────────────────────\n\n private async handleList(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo(\n 'No connected servers. Use \"server list\" to check connections.',\n );\n return;\n }\n\n const groupFilter = cmd.args['group'] as string | undefined;\n const multiServer = services.length > 1;\n\n for (const { name, service } of services) {\n try {\n let jobs = await service.listJobs();\n if (groupFilter) {\n jobs = jobs.filter(\n (j) =>\n j.group?.toLowerCase() ===\n groupFilter.toLowerCase(),\n );\n }\n\n if (multiServer) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n if (jobs.length === 0) {\n context.writer.writeInfo(' No jobs found.');\n continue;\n }\n\n const headers = [\n 'Name',\n 'Group',\n 'Status',\n 'Schedule',\n 'Last Run',\n 'Next Run',\n 'Duration',\n ];\n const rows: string[][] = jobs.map((j) => [\n j.name,\n j.group ?? '-',\n statusColor(j.status, context.writer),\n j.schedule ?? (j.interval ? `every ${j.interval}ms` : '-'),\n formatRelativeTime(j.lastRunAt),\n formatRelativeTime(j.nextRunAt),\n formatDuration(j.lastRunDuration),\n ]);\n\n context.writer.writeTable(headers, rows);\n } catch (e: any) {\n context.writer.writeError(\n `Failed to list jobs on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Info ──────────────────────────────────────────────────────────\n\n private async handleInfo(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs info <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const lines: [string, string][] = [\n ['ID', job.id],\n ['Name', job.name],\n ['Description', job.description],\n ['Group', job.group ?? '-'],\n ['Status', statusColor(job.status, context.writer)],\n [\n 'Schedule',\n job.schedule ??\n (job.interval\n ? `every ${job.interval}ms`\n : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n [\n 'Timeout',\n job.timeout ? `${job.timeout}ms` : 'none',\n ],\n ['Overlap Policy', job.overlapPolicy],\n [\n 'Current Execution',\n job.currentExecutionId ?? 'none',\n ],\n ['Next Run', formatRelativeTime(job.nextRunAt)],\n ['Last Run', formatRelativeTime(job.lastRunAt)],\n [\n 'Last Run Status',\n job.lastRunStatus\n ? statusColor(job.lastRunStatus, context.writer)\n : '-',\n ],\n ['Last Run Duration', formatDuration(job.lastRunDuration)],\n ];\n\n for (const [label, value] of lines) {\n context.writer.writeln(\n ` ${context.writer.wrapInColor(\n label.padEnd(20),\n CliForegroundColor.Yellow,\n )} ${value}`,\n );\n }\n return; // found on this server\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError(`Usage: jobs ${action} <id|name>`);\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n switch (action) {\n case 'trigger':\n await service.triggerJob(job.id);\n break;\n case 'pause':\n await service.pauseJob(job.id);\n break;\n case 'resume':\n await service.resumeJob(job.id);\n break;\n case 'stop':\n await service.stopJob(job.id);\n break;\n case 'cancel':\n await service.cancelJob(job.id);\n break;\n }\n\n const serverSuffix =\n services.length > 1 ? ` on server ${name}` : '';\n context.writer.writeSuccess(\n `Job \"${job.name}\" ${action}${action.endsWith('e') ? 'd' : 'ed'}${serverSuffix}.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Failed to ${action} job on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── History ──────────────────────────────────────────────────────\n\n private async handleHistory(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs history <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const limit = (cmd.args['limit'] as number) ?? 20;\n const offset = (cmd.args['offset'] as number) ?? 0;\n const status = cmd.args['status'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const history = await service.getHistory(job.id, {\n limit,\n offset,\n status,\n });\n\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No execution history for \"${job.name}\".`,\n );\n return;\n }\n\n context.writer.writeln(\n `Showing ${history.items.length} of ${history.total} executions for \"${job.name}\":`,\n );\n\n const headers = [\n 'ID',\n 'Status',\n 'Started',\n 'Duration',\n 'Retry',\n 'Error',\n ];\n const rows: string[][] = history.items.map((exec) => [\n exec.id.substring(0, 8),\n statusColor(exec.status, context.writer),\n formatRelativeTime(exec.startedAt),\n formatDuration(exec.duration),\n String(exec.retryAttempt),\n exec.error ? exec.error.substring(0, 40) : '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Logs ─────────────────────────────────────────────────────────\n\n private async handleLogs(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs logs <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const execId = cmd.args['exec'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n let execution: JobExecutionDto;\n\n if (execId) {\n execution = await service.getExecution(job.id, execId);\n } else {\n // Get the latest execution\n const history = await service.getHistory(job.id, {\n limit: 1,\n });\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No executions found for \"${job.name}\".`,\n );\n return;\n }\n // Fetch full execution to get logs\n execution = await service.getExecution(\n job.id,\n history.items[0].id,\n );\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n context.writer.writeln(\n `Logs for \"${job.name}\" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`,\n );\n\n if (!execution.logs || execution.logs.length === 0) {\n context.writer.writeInfo(' No log entries.');\n return;\n }\n\n for (const entry of execution.logs) {\n const ts = new Date(entry.timestamp).toLocaleTimeString();\n const level = logLevelColor(\n entry.level,\n context.writer,\n ).padEnd(12);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`,\n );\n }\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs edit <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n // Use the first matching server\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n context.writer.writeln(\n `Editing job \"${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}\" on server ${name}`,\n );\n context.writer.writeln(\n 'Press Enter to keep current value, or type a new value.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await context.reader.readLine(\n `Description [${job.description}]: `,\n );\n if (newDesc == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newDesc.trim()) {\n update.description = newDesc.trim();\n }\n\n // Group\n const newGroup = await context.reader.readLine(\n `Group [${job.group ?? 'none'}]: `,\n );\n if (newGroup == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newGroup.trim()) {\n update.group = newGroup.trim();\n }\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await context.reader.readLine(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newSchedule.trim()) {\n update.schedule = newSchedule.trim();\n }\n\n // Interval\n if (!newSchedule.trim()) {\n const newInterval = await context.reader.readLine(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval != null && newInterval.trim()) {\n update.interval = newInterval.trim();\n }\n }\n\n // Max retries\n const newRetries = await context.reader.readLine(\n `Max retries [${job.maxRetries}]: `,\n );\n if (newRetries != null && newRetries.trim()) {\n const parsed = parseInt(newRetries.trim(), 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await context.reader.readLine(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout != null && newTimeout.trim()) {\n update.timeout = newTimeout.trim();\n }\n\n // Overlap policy\n const newOverlap = await context.reader.readLine(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (\n newOverlap != null &&\n newOverlap.trim() &&\n ['skip', 'queue', 'cancel'].includes(\n newOverlap.trim().toLowerCase(),\n )\n ) {\n update.overlapPolicy = newOverlap.trim().toLowerCase();\n }\n\n // Check if anything changed\n if (Object.keys(update).length === 0) {\n context.writer.writeInfo('No changes made.');\n return;\n }\n\n // Confirm\n const confirm = await context.reader.readConfirm(\n 'Apply changes?',\n );\n if (!confirm) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.get<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n\n context.writer.writeln(\n context.writer.wrapInColor(\n 'Watching job events... (press Ctrl+C to stop)',\n CliForegroundColor.Cyan,\n ),\n );\n context.writer.writeln('');\n\n const sockets: WebSocket[] = [];\n const abortHandler = () => {\n for (const ws of sockets) {\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n };\n\n context.onAbort.subscribe(abortHandler);\n\n for (const [serverName, connection] of manager.connections as Map<\n string,\n any\n >) {\n if (targetServer && serverName !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const wsUrl =\n baseUrl\n .replace(/^https:/, 'wss:')\n .replace(/^http:/, 'ws:') + '/ws/v1/qcli/events';\n\n try {\n const ws = new WebSocket(wsUrl);\n sockets.push(ws);\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n if (\n !data.type ||\n !data.type.startsWith('job:')\n ) {\n return;\n }\n\n const ts = new Date().toLocaleTimeString();\n const serverPrefix =\n manager.connections.size > 1\n ? context.writer.wrapInColor(\n `[${serverName}] `,\n CliForegroundColor.Cyan,\n )\n : '';\n\n let detail = '';\n if (data.jobId) {\n detail += ` jobId=${data.jobId}`;\n }\n if (data.executionId) {\n detail += ` execId=${data.executionId.substring(0, 8)}`;\n }\n if (data.duration != null) {\n detail += ` duration=${formatDuration(data.duration)}`;\n }\n if (data.error) {\n detail += ` error=\"${data.error}\"`;\n }\n\n const eventType = statusColor(\n data.type.replace('job:', ''),\n context.writer,\n );\n\n context.writer.writeln(\n `${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${serverPrefix}${eventType}${detail}`,\n );\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n // Will close when aborted\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Keep the command alive until aborted\n await new Promise<void>((resolve) => {\n const sub = context.onAbort.subscribe(() => {\n sub.unsubscribe();\n resolve();\n });\n // Also resolve if the signal fires\n if (context.signal) {\n context.signal.addEventListener('abort', () => {\n sub.unsubscribe();\n resolve();\n });\n }\n });\n\n context.writer.writeln('');\n context.writer.writeInfo('Stopped watching job events.');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.get<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = config.headers ?? {};\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of jobs\n */\n\nexport * from './lib/processors/cli-jobs-command-processor';\nexport * from './lib/completion/cli-job-name-completion-provider';\nexport * from './lib/services/cli-jobs-service';\nexport * from './lib/models';\nexport * from './lib/version';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliJobsCommandProcessor } from './lib/processors/cli-jobs-command-processor';\nimport { CliJobNameCompletionProvider } from './lib/completion/cli-job-name-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst completionProvider = new CliJobNameCompletionProvider();\n\nexport const jobsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-jobs',\n processors: [new CliJobsCommandProcessor()],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: completionProvider,\n multi: true,\n },\n ],\n async onInit(context) {\n completionProvider.setServices(context.services);\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/server-jobs/src/lib/services/cli-jobs-service.ts","../../packages/plugins/server-jobs/src/lib/processors/cli-jobs-command-processor.ts","../../packages/plugins/server-jobs/src/lib/completion/cli-job-name-completion-provider.ts","../../packages/plugins/server-jobs/src/lib/version.ts","../../packages/plugins/server-jobs/src/public-api.ts"],"names":["resolveServerHeaders"],"mappings":"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","file":"public-api.mjs","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n buildAuthenticatedWebSocketUrl,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(context.services, name, config.headers);\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match by name.\n */\nasync function resolveJobId(\n service: CliJobsService,\n nameOrId: string,\n): Promise<JobDto | null> {\n // If it looks like a UUID, try fetching directly\n if (/^[0-9a-f-]{8,}$/i.test(nameOrId)) {\n try {\n return await service.getJob(nameOrId);\n } catch {\n // fall through to name search\n }\n }\n\n const jobs = await service.listJobs();\n const match = jobs.find(\n (j) =>\n j.name.toLowerCase() === nameOrId.toLowerCase() ||\n j.id === nameOrId,\n );\n return match ?? null;\n}\n\nfunction formatRelativeTime(isoString?: string): string {\n if (!isoString) return '-';\n const diff = Date.now() - new Date(isoString).getTime();\n if (diff < 0) {\n // future\n const absDiff = -diff;\n if (absDiff < 60_000) return `in ${Math.round(absDiff / 1000)}s`;\n if (absDiff < 3_600_000) return `in ${Math.round(absDiff / 60_000)}m`;\n if (absDiff < 86_400_000) return `in ${Math.round(absDiff / 3_600_000)}h`;\n return `in ${Math.round(absDiff / 86_400_000)}d`;\n }\n if (diff < 60_000) return `${Math.round(diff / 1000)}s ago`;\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction formatDuration(ms?: number): string {\n if (ms == null) return '-';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60_000).toFixed(1)}m`;\n}\n\nfunction statusColor(\n status: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (status) {\n case 'active':\n case 'completed':\n case 'running':\n return writer.wrapInColor(status, CliForegroundColor.Green);\n case 'paused':\n return writer.wrapInColor(status, CliForegroundColor.Yellow);\n case 'stopped':\n case 'failed':\n case 'timed_out':\n case 'cancelled':\n return writer.wrapInColor(status, CliForegroundColor.Red);\n default:\n return status;\n }\n}\n\nfunction logLevelColor(\n level: string,\n writer: ICliExecutionContext['writer'],\n): string {\n switch (level) {\n case 'debug':\n return writer.wrapInColor(level, CliForegroundColor.Cyan);\n case 'info':\n return writer.wrapInColor(level, CliForegroundColor.Green);\n case 'warning':\n return writer.wrapInColor(level, CliForegroundColor.Yellow);\n case 'error':\n return writer.wrapInColor(level, CliForegroundColor.Red);\n default:\n return level;\n }\n}\n\nconst serverParam: ICliCommandParameterDescriptor = {\n name: 'server',\n description: 'Target a specific server by name',\n required: false,\n type: 'string',\n};\n\nexport class CliJobsCommandProcessor implements ICliCommandProcessor {\n command = 'server';\n\n extendsProcessor = true;\n\n description = 'Manage background jobs on connected servers';\n author: ICliCommandAuthor = DefaultLibraryAuthor;\n metadata: CliProcessorMetadata = {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n };\n\n processors?: ICliCommandProcessor[] = [\n {\n command: 'jobs',\n description: 'Manage background jobs on connected servers',\n author: DefaultLibraryAuthor,\n metadata: {\n icon: CliIcon.Gear,\n module: '@qodalis/cli-server-jobs',\n },\n parameters: [serverParam],\n processors: [\n // list\n {\n command: 'list',\n description: 'List all jobs across connected servers',\n aliases: ['ls'],\n parameters: [\n serverParam,\n {\n name: 'group',\n description: 'Filter jobs by group',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleList(cmd, context);\n },\n },\n // info\n {\n command: 'info',\n description: 'Show detailed information about a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleInfo(cmd, context);\n },\n },\n // trigger\n {\n command: 'trigger',\n description: 'Trigger immediate execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'trigger');\n },\n },\n // pause\n {\n command: 'pause',\n description: 'Pause scheduled execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'pause');\n },\n },\n // resume\n {\n command: 'resume',\n description: 'Resume a paused job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'resume');\n },\n },\n // stop\n {\n command: 'stop',\n description: 'Stop a job and cancel current execution if running',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'stop');\n },\n },\n // cancel\n {\n command: 'cancel',\n description: 'Cancel the current execution of a job',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleAction(cmd, context, 'cancel');\n },\n },\n // history\n {\n command: 'history',\n description: 'Show execution history for a job',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'limit',\n description: 'Number of entries to show (default 20)',\n required: false,\n type: 'number',\n defaultValue: 20,\n },\n {\n name: 'offset',\n description: 'Offset for pagination',\n required: false,\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'status',\n description: 'Filter by execution status',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleHistory(cmd, context);\n },\n },\n // logs\n {\n command: 'logs',\n description: 'Show logs from the latest or a specific execution',\n valueRequired: true,\n parameters: [\n serverParam,\n {\n name: 'exec',\n description: 'Specific execution ID to show logs for',\n required: false,\n type: 'string',\n },\n ],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleLogs(cmd, context);\n },\n },\n // edit\n {\n command: 'edit',\n description: 'Interactively edit job settings',\n valueRequired: true,\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleEdit(cmd, context);\n },\n },\n // watch\n {\n command: 'watch',\n description: 'Live view of job events via WebSocket',\n parameters: [serverParam],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n await this.handleWatch(cmd, context);\n },\n },\n ] as ICliCommandChildProcessor[],\n processCommand: async (\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ) => {\n // Default action: list jobs\n await this.handleList(cmd, context);\n },\n } as any,\n ];\n\n async processCommand(\n _cmd: CliProcessCommand,\n _context: ICliExecutionContext,\n ): Promise<void> {\n // Not called — this processor extends 'server' and delegates to child processors\n }\n\n // ── List ──────────────────────────────────────────────────────────\n\n private async handleList(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo(\n 'No connected servers. Use \"server list\" to check connections.',\n );\n return;\n }\n\n const groupFilter = cmd.args['group'] as string | undefined;\n const multiServer = services.length > 1;\n\n for (const { name, service } of services) {\n try {\n let jobs = await service.listJobs();\n if (groupFilter) {\n jobs = jobs.filter(\n (j) =>\n j.group?.toLowerCase() ===\n groupFilter.toLowerCase(),\n );\n }\n\n if (multiServer) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n if (jobs.length === 0) {\n context.writer.writeInfo(' No jobs found.');\n continue;\n }\n\n const headers = [\n 'Name',\n 'Group',\n 'Status',\n 'Schedule',\n 'Last Run',\n 'Next Run',\n 'Duration',\n ];\n const rows: string[][] = jobs.map((j) => [\n j.name,\n j.group ?? '-',\n statusColor(j.status, context.writer),\n j.schedule ?? (j.interval ? `every ${j.interval}ms` : '-'),\n formatRelativeTime(j.lastRunAt),\n formatRelativeTime(j.nextRunAt),\n formatDuration(j.lastRunDuration),\n ]);\n\n context.writer.writeTable(headers, rows);\n } catch (e: any) {\n context.writer.writeError(\n `Failed to list jobs on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Info ──────────────────────────────────────────────────────────\n\n private async handleInfo(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs info <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const lines: [string, string][] = [\n ['ID', job.id],\n ['Name', job.name],\n ['Description', job.description],\n ['Group', job.group ?? '-'],\n ['Status', statusColor(job.status, context.writer)],\n [\n 'Schedule',\n job.schedule ??\n (job.interval\n ? `every ${job.interval}ms`\n : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n [\n 'Timeout',\n job.timeout ? `${job.timeout}ms` : 'none',\n ],\n ['Overlap Policy', job.overlapPolicy],\n [\n 'Current Execution',\n job.currentExecutionId ?? 'none',\n ],\n ['Next Run', formatRelativeTime(job.nextRunAt)],\n ['Last Run', formatRelativeTime(job.lastRunAt)],\n [\n 'Last Run Status',\n job.lastRunStatus\n ? statusColor(job.lastRunStatus, context.writer)\n : '-',\n ],\n ['Last Run Duration', formatDuration(job.lastRunDuration)],\n ];\n\n for (const [label, value] of lines) {\n context.writer.writeln(\n ` ${context.writer.wrapInColor(\n label.padEnd(20),\n CliForegroundColor.Yellow,\n )} ${value}`,\n );\n }\n return; // found on this server\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError(`Usage: jobs ${action} <id|name>`);\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n switch (action) {\n case 'trigger':\n await service.triggerJob(job.id);\n break;\n case 'pause':\n await service.pauseJob(job.id);\n break;\n case 'resume':\n await service.resumeJob(job.id);\n break;\n case 'stop':\n await service.stopJob(job.id);\n break;\n case 'cancel':\n await service.cancelJob(job.id);\n break;\n }\n\n const serverSuffix =\n services.length > 1 ? ` on server ${name}` : '';\n context.writer.writeSuccess(\n `Job \"${job.name}\" ${action}${action.endsWith('e') ? 'd' : 'ed'}${serverSuffix}.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Failed to ${action} job on ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── History ──────────────────────────────────────────────────────\n\n private async handleHistory(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs history <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const limit = (cmd.args['limit'] as number) ?? 20;\n const offset = (cmd.args['offset'] as number) ?? 0;\n const status = cmd.args['status'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n const history = await service.getHistory(job.id, {\n limit,\n offset,\n status,\n });\n\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No execution history for \"${job.name}\".`,\n );\n return;\n }\n\n context.writer.writeln(\n `Showing ${history.items.length} of ${history.total} executions for \"${job.name}\":`,\n );\n\n const headers = [\n 'ID',\n 'Status',\n 'Started',\n 'Duration',\n 'Retry',\n 'Error',\n ];\n const rows: string[][] = history.items.map((exec) => [\n exec.id.substring(0, 8),\n statusColor(exec.status, context.writer),\n formatRelativeTime(exec.startedAt),\n formatDuration(exec.duration),\n String(exec.retryAttempt),\n exec.error ? exec.error.substring(0, 40) : '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Logs ─────────────────────────────────────────────────────────\n\n private async handleLogs(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs logs <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const execId = cmd.args['exec'] as string | undefined;\n\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n let execution: JobExecutionDto;\n\n if (execId) {\n execution = await service.getExecution(job.id, execId);\n } else {\n // Get the latest execution\n const history = await service.getHistory(job.id, {\n limit: 1,\n });\n if (history.items.length === 0) {\n context.writer.writeInfo(\n `No executions found for \"${job.name}\".`,\n );\n return;\n }\n // Fetch full execution to get logs\n execution = await service.getExecution(\n job.id,\n history.items[0].id,\n );\n }\n\n if (services.length > 1) {\n context.writer.writeln(\n context.writer.wrapInColor(\n `Server: ${name}`,\n CliForegroundColor.Cyan,\n ),\n );\n }\n\n context.writer.writeln(\n `Logs for \"${job.name}\" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`,\n );\n\n if (!execution.logs || execution.logs.length === 0) {\n context.writer.writeInfo(' No log entries.');\n return;\n }\n\n for (const entry of execution.logs) {\n const ts = new Date(entry.timestamp).toLocaleTimeString();\n const level = logLevelColor(\n entry.level,\n context.writer,\n ).padEnd(12);\n context.writer.writeln(\n ` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`,\n );\n }\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = (cmd.value ?? '').trim();\n if (!nameOrId) {\n context.writer.writeError('Usage: jobs edit <id|name>');\n return;\n }\n\n const services = getServices(context, cmd.args);\n if (services.length === 0) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n // Use the first matching server\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (!job) {\n if (services.length === 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on server ${name}.`,\n );\n }\n continue;\n }\n\n context.writer.writeln(\n `Editing job \"${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}\" on server ${name}`,\n );\n context.writer.writeln(\n 'Press Enter to keep current value, or type a new value.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await context.reader.readLine(\n `Description [${job.description}]: `,\n );\n if (newDesc == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newDesc.trim()) {\n update.description = newDesc.trim();\n }\n\n // Group\n const newGroup = await context.reader.readLine(\n `Group [${job.group ?? 'none'}]: `,\n );\n if (newGroup == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newGroup.trim()) {\n update.group = newGroup.trim();\n }\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await context.reader.readLine(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n if (newSchedule.trim()) {\n update.schedule = newSchedule.trim();\n }\n\n // Interval\n if (!newSchedule.trim()) {\n const newInterval = await context.reader.readLine(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval != null && newInterval.trim()) {\n update.interval = newInterval.trim();\n }\n }\n\n // Max retries\n const newRetries = await context.reader.readLine(\n `Max retries [${job.maxRetries}]: `,\n );\n if (newRetries != null && newRetries.trim()) {\n const parsed = parseInt(newRetries.trim(), 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await context.reader.readLine(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout != null && newTimeout.trim()) {\n update.timeout = newTimeout.trim();\n }\n\n // Overlap policy\n const newOverlap = await context.reader.readLine(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (\n newOverlap != null &&\n newOverlap.trim() &&\n ['skip', 'queue', 'cancel'].includes(\n newOverlap.trim().toLowerCase(),\n )\n ) {\n update.overlapPolicy = newOverlap.trim().toLowerCase();\n }\n\n // Check if anything changed\n if (Object.keys(update).length === 0) {\n context.writer.writeInfo('No changes made.');\n return;\n }\n\n // Confirm\n const confirm = await context.reader.readConfirm(\n 'Apply changes?',\n );\n if (!confirm) {\n context.writer.writeInfo('Edit cancelled.');\n return;\n }\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n return;\n } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n\n context.writer.writeln(\n context.writer.wrapInColor(\n 'Watching job events... (press Ctrl+C to stop)',\n CliForegroundColor.Cyan,\n ),\n );\n context.writer.writeln('');\n\n const sockets: WebSocket[] = [];\n const abortHandler = () => {\n for (const ws of sockets) {\n try {\n ws.close();\n } catch {\n // ignore\n }\n }\n };\n\n context.onAbort.subscribe(abortHandler);\n\n for (const [serverName, connection] of manager.connections as Map<\n string,\n any\n >) {\n if (targetServer && serverName !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const wsUrl = buildAuthenticatedWebSocketUrl(\n baseUrl\n .replace(/^https:/, 'wss:')\n .replace(/^http:/, 'ws:') + '/ws/v1/qcli/events',\n () => resolveServerHeaders(context.services, serverName, config.headers),\n );\n\n try {\n const ws = new WebSocket(wsUrl);\n sockets.push(ws);\n\n ws.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n if (\n !data.type ||\n !data.type.startsWith('job:')\n ) {\n return;\n }\n\n const ts = new Date().toLocaleTimeString();\n const serverPrefix =\n manager.connections.size > 1\n ? context.writer.wrapInColor(\n `[${serverName}] `,\n CliForegroundColor.Cyan,\n )\n : '';\n\n let detail = '';\n if (data.jobId) {\n detail += ` jobId=${data.jobId}`;\n }\n if (data.executionId) {\n detail += ` execId=${data.executionId.substring(0, 8)}`;\n }\n if (data.duration != null) {\n detail += ` duration=${formatDuration(data.duration)}`;\n }\n if (data.error) {\n detail += ` error=\"${data.error}\"`;\n }\n\n const eventType = statusColor(\n data.type.replace('job:', ''),\n context.writer,\n );\n\n context.writer.writeln(\n `${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${serverPrefix}${eventType}${detail}`,\n );\n } catch {\n // ignore malformed messages\n }\n };\n\n ws.onerror = () => {\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n // Will close when aborted\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Keep the command alive until aborted\n await new Promise<void>((resolve) => {\n const sub = context.onAbort.subscribe(() => {\n sub.unsubscribe();\n resolve();\n });\n // Also resolve if the signal fires\n if (context.signal) {\n context.signal.addEventListener('abort', () => {\n sub.unsubscribe();\n resolve();\n });\n }\n });\n\n context.writer.writeln('');\n context.writer.writeInfo('Stopped watching job events.');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.getRequired<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(this.services!, name, config.headers);\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.13';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of jobs\n */\n\nexport * from './lib/processors/cli-jobs-command-processor';\nexport * from './lib/completion/cli-job-name-completion-provider';\nexport * from './lib/services/cli-jobs-service';\nexport * from './lib/models';\nexport * from './lib/version';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliJobsCommandProcessor } from './lib/processors/cli-jobs-command-processor';\nimport { CliJobNameCompletionProvider } from './lib/completion/cli-job-name-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst completionProvider = new CliJobNameCompletionProvider();\n\nexport const jobsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-jobs',\n processors: [new CliJobsCommandProcessor()],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: completionProvider,\n multi: true,\n },\n ],\n async onInit(context) {\n completionProvider.setServices(context.services);\n },\n};\n"]}
@@ -1951,6 +1951,22 @@ var jobs = (() => {
1951
1951
  return CliIcon2;
1952
1952
  })(CliIcon || {});
1953
1953
  var ICliCompletionProvider_TOKEN = "cli-completion-provider";
1954
+ var ICliServerAuthService_TOKEN = "cli-server-auth-service";
1955
+ function resolveHeaders(provider) {
1956
+ if (!provider) return {};
1957
+ return typeof provider === "function" ? provider() : provider;
1958
+ }
1959
+ function resolveServerHeaders(services, serverName, configHeaders) {
1960
+ if (services) {
1961
+ const authService = services.get(
1962
+ ICliServerAuthService_TOKEN
1963
+ );
1964
+ if (authService) {
1965
+ return authService.getHeaders(serverName, configHeaders);
1966
+ }
1967
+ }
1968
+ return resolveHeaders(configHeaders);
1969
+ }
1954
1970
  var DefaultLibraryAuthor = {
1955
1971
  name: "Nicolae Lupei",
1956
1972
  email: "nicolae.lupei@qodalis.com"
@@ -1977,9 +1993,12 @@ var jobs = (() => {
1977
1993
  * Returns the negotiated API version and the base path for all subsequent calls,
1978
1994
  * or null if the server is unreachable or incompatible.
1979
1995
  */
1980
- static async discover(baseUrl) {
1996
+ static async discover(baseUrl, headers) {
1981
1997
  try {
1982
- const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
1998
+ const resolved = resolveHeaders(headers);
1999
+ const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`, {
2000
+ headers: Object.keys(resolved).length > 0 ? resolved : void 0
2001
+ });
1983
2002
  if (!response.ok) return null;
1984
2003
  const info = await response.json();
1985
2004
  const version = this.negotiate(info);
@@ -1993,6 +2012,17 @@ var jobs = (() => {
1993
2012
  }
1994
2013
  }
1995
2014
  };
2015
+ function buildAuthenticatedWebSocketUrl(wsUrl, headers) {
2016
+ const resolved = resolveHeaders(headers);
2017
+ if (Object.keys(resolved).length === 0) {
2018
+ return wsUrl;
2019
+ }
2020
+ const separator = wsUrl.includes("?") ? "&" : "?";
2021
+ const params = Object.entries(resolved).map(
2022
+ ([key, value]) => `_header_${encodeURIComponent(key)}=${encodeURIComponent(value)}`
2023
+ ).join("&");
2024
+ return `${wsUrl}${separator}${params}`;
2025
+ }
1996
2026
  var bootCliModule = async (module2) => {
1997
2027
  if (typeof window !== "undefined" && window.__cliModuleRegistry) {
1998
2028
  await window.__cliModuleRegistry.register(module2);
@@ -2899,7 +2929,7 @@ var jobs = (() => {
2899
2929
 
2900
2930
  // src/lib/processors/cli-jobs-command-processor.ts
2901
2931
  function getServices(context, args) {
2902
- const manager = context.services.get("cli-server-manager");
2932
+ const manager = context.services.getRequired("cli-server-manager");
2903
2933
  if (!manager || !manager.connections) {
2904
2934
  return [];
2905
2935
  }
@@ -2910,7 +2940,7 @@ var jobs = (() => {
2910
2940
  if (!connection.connected) continue;
2911
2941
  const config = connection.config;
2912
2942
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
2913
- const headers = config.headers ?? {};
2943
+ const headers = resolveServerHeaders(context.services, name, config.headers);
2914
2944
  results.push({ name, service: new CliJobsService(baseUrl, headers) });
2915
2945
  }
2916
2946
  return results;
@@ -3613,7 +3643,7 @@ var jobs = (() => {
3613
3643
  }
3614
3644
  // ── Watch ────────────────────────────────────────────────────────
3615
3645
  async handleWatch(cmd, context) {
3616
- const manager = context.services.get("cli-server-manager");
3646
+ const manager = context.services.getRequired("cli-server-manager");
3617
3647
  if (!manager || !manager.connections) {
3618
3648
  context.writer.writeInfo("No connected servers.");
3619
3649
  return;
@@ -3641,7 +3671,10 @@ var jobs = (() => {
3641
3671
  if (!connection.connected) continue;
3642
3672
  const config = connection.config;
3643
3673
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
3644
- const wsUrl = baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events";
3674
+ const wsUrl = buildAuthenticatedWebSocketUrl(
3675
+ baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events",
3676
+ () => resolveServerHeaders(context.services, serverName, config.headers)
3677
+ );
3645
3678
  try {
3646
3679
  const ws = new WebSocket(wsUrl);
3647
3680
  sockets.push(ws);
@@ -3749,16 +3782,16 @@ var jobs = (() => {
3749
3782
  }
3750
3783
  const lowerPrefix = token.toLowerCase();
3751
3784
  try {
3752
- const manager = this.services.get("cli-server-manager");
3785
+ const manager = this.services.getRequired("cli-server-manager");
3753
3786
  if (!manager?.connections) {
3754
3787
  return [];
3755
3788
  }
3756
3789
  const names = [];
3757
- for (const [, connection] of manager.connections) {
3790
+ for (const [name, connection] of manager.connections) {
3758
3791
  if (!connection.connected) continue;
3759
3792
  const config = connection.config;
3760
3793
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
3761
- const headers = config.headers ?? {};
3794
+ const headers = resolveServerHeaders(this.services, name, config.headers);
3762
3795
  const service = new CliJobsService(baseUrl, headers);
3763
3796
  try {
3764
3797
  const jobs = await service.listJobs();