@qodalis/cli-server-jobs 2.0.0-beta.7 → 2.0.0-beta.9
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 +2 -2
- package/public-api.d.mts +1 -1
- package/public-api.d.ts +1 -1
- package/public-api.js +1 -1
- package/public-api.js.map +1 -1
- package/public-api.mjs +1 -1
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +13 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qodalis/cli-server-jobs",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.9",
|
|
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.
|
|
21
|
+
"@qodalis/cli-core": "2.0.0-beta.9"
|
|
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.
|
|
107
|
+
declare const LIBRARY_VERSION = "2.0.0-beta.9";
|
|
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.
|
|
107
|
+
declare const LIBRARY_VERSION = "2.0.0-beta.9";
|
|
108
108
|
declare const API_VERSION = 2;
|
|
109
109
|
|
|
110
110
|
declare const jobsModule: ICliModule;
|
package/public-api.js
CHANGED
|
@@ -972,7 +972,7 @@ var CliJobNameCompletionProvider = class {
|
|
|
972
972
|
};
|
|
973
973
|
|
|
974
974
|
// src/lib/version.ts
|
|
975
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
975
|
+
var LIBRARY_VERSION = "2.0.0-beta.9";
|
|
976
976
|
var API_VERSION = 2;
|
|
977
977
|
var completionProvider = new CliJobNameCompletionProvider();
|
|
978
978
|
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.7';\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":["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.9';\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
|
@@ -970,7 +970,7 @@ var CliJobNameCompletionProvider = class {
|
|
|
970
970
|
};
|
|
971
971
|
|
|
972
972
|
// src/lib/version.ts
|
|
973
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
973
|
+
var LIBRARY_VERSION = "2.0.0-beta.9";
|
|
974
974
|
var API_VERSION = 2;
|
|
975
975
|
var completionProvider = new CliJobNameCompletionProvider();
|
|
976
976
|
var jobsModule = {
|
package/public-api.mjs.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":[],"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.7';\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":[],"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.9';\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/umd/index.global.js
CHANGED
|
@@ -1902,7 +1902,7 @@ var jobs = (() => {
|
|
|
1902
1902
|
CliIcon2["Server"] = "\u{1F5A5}";
|
|
1903
1903
|
CliIcon2["Cloud"] = "\u2601";
|
|
1904
1904
|
CliIcon2["Network"] = "\u{1F310}";
|
|
1905
|
-
CliIcon2["Monitor"] = "\u{
|
|
1905
|
+
CliIcon2["Monitor"] = "\u{1F4FA}";
|
|
1906
1906
|
CliIcon2["Printer"] = "\u{1F5A8}";
|
|
1907
1907
|
CliIcon2["USB"] = "\u{1F50C}";
|
|
1908
1908
|
CliIcon2["Speaker"] = "\u{1F50A}";
|
|
@@ -1912,14 +1912,14 @@ var jobs = (() => {
|
|
|
1912
1912
|
CliIcon2["Music"] = "\u{1F3B5}";
|
|
1913
1913
|
CliIcon2["Phone"] = "\u{1F4DE}";
|
|
1914
1914
|
CliIcon2["Package"] = "\u{1F4E6}";
|
|
1915
|
-
CliIcon2["Plugin"] = "\u{
|
|
1916
|
-
CliIcon2["Extension"] = "\u{
|
|
1917
|
-
CliIcon2["Module"] = "\u{
|
|
1915
|
+
CliIcon2["Plugin"] = "\u{1F9E9}";
|
|
1916
|
+
CliIcon2["Extension"] = "\u{1F50C}";
|
|
1917
|
+
CliIcon2["Module"] = "\u{1F9F1}";
|
|
1918
1918
|
CliIcon2["Evaluate"] = "\u{1F50D}";
|
|
1919
|
-
CliIcon2["Variable"] = "\u{
|
|
1919
|
+
CliIcon2["Variable"] = "\u{1D465}";
|
|
1920
1920
|
CliIcon2["Script"] = "\u{1F4DC}";
|
|
1921
|
-
CliIcon2["Code"] = "\u{
|
|
1922
|
-
CliIcon2["Logs"] = "\u{
|
|
1921
|
+
CliIcon2["Code"] = "\u{1F4DD}";
|
|
1922
|
+
CliIcon2["Logs"] = "\u{1F4CB}";
|
|
1923
1923
|
CliIcon2["Power"] = "\u23FB";
|
|
1924
1924
|
CliIcon2["Heart"] = "\u2764";
|
|
1925
1925
|
CliIcon2["Flame"] = "\u{1F525}";
|
|
@@ -1956,9 +1956,11 @@ var jobs = (() => {
|
|
|
1956
1956
|
email: "nicolae.lupei@qodalis.com"
|
|
1957
1957
|
};
|
|
1958
1958
|
var semver = __toESM(require_semver2());
|
|
1959
|
+
var API_VERSION = 2;
|
|
1960
|
+
var VERSIONS_ENDPOINT = "/api/qcli/versions";
|
|
1959
1961
|
var ServerVersionNegotiator = class {
|
|
1960
1962
|
static {
|
|
1961
|
-
this.CLIENT_SUPPORTED_VERSIONS = [
|
|
1963
|
+
this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
|
|
1962
1964
|
}
|
|
1963
1965
|
/**
|
|
1964
1966
|
* Given a server's version info, pick the highest mutually compatible version.
|
|
@@ -1977,7 +1979,7 @@ var jobs = (() => {
|
|
|
1977
1979
|
*/
|
|
1978
1980
|
static async discover(baseUrl) {
|
|
1979
1981
|
try {
|
|
1980
|
-
const response = await fetch(`${baseUrl}
|
|
1982
|
+
const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
|
|
1981
1983
|
if (!response.ok) return null;
|
|
1982
1984
|
const info = await response.json();
|
|
1983
1985
|
const version = this.negotiate(info);
|
|
@@ -3776,12 +3778,12 @@ var jobs = (() => {
|
|
|
3776
3778
|
};
|
|
3777
3779
|
|
|
3778
3780
|
// src/lib/version.ts
|
|
3779
|
-
var
|
|
3781
|
+
var API_VERSION2 = 2;
|
|
3780
3782
|
|
|
3781
3783
|
// src/cli-entrypoint.ts
|
|
3782
3784
|
var completionProvider = new CliJobNameCompletionProvider();
|
|
3783
3785
|
var module = {
|
|
3784
|
-
apiVersion:
|
|
3786
|
+
apiVersion: API_VERSION2,
|
|
3785
3787
|
name: "@qodalis/cli-server-jobs",
|
|
3786
3788
|
processors: [new CliJobsCommandProcessor()],
|
|
3787
3789
|
services: [
|