@qodalis/cli-server-jobs 2.1.1 → 2.3.0
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 +121 -59
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":["resolveServerHeaders"],"mappings":"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","file":"public-api.mjs","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n resolveServerWebSocketUrl,\n resolveServerHeaders,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(context.services, name, config.headers);\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match: the ID, then the exact name,\n * then the name in any case.\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 lower = nameOrId.toLowerCase();\n return (\n jobs.find((j) => j.id === nameOrId) ??\n jobs.find((j) => j.name === nameOrId) ??\n jobs.find((j) => j.name.toLowerCase() === lower) ??\n null\n );\n}\n\n/** A job found on one server. */\ninterface JobMatch {\n name: string;\n service: CliJobsService;\n job: JobDto;\n}\n\n/**\n * Look the job up on every given server. Lookup errors are reported per\n * server; a job that no server has is reported once.\n */\nasync function findJobOnServers(\n context: ICliExecutionContext,\n services: { name: string; service: CliJobsService }[],\n nameOrId: string,\n): Promise<JobMatch[]> {\n const matches: JobMatch[] = [];\n const missing: string[] = [];\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (job) {\n matches.push({ name, service, job });\n } else {\n missing.push(name);\n }\n } catch (e: any) {\n context.writer.writeError(`Error on server ${name}: ${e.message}`);\n }\n }\n\n if (matches.length === 0 && missing.length > 0) {\n if (missing.length === services.length) {\n // Report once, when no server has the job\n context.writer.writeError(\n services.length === 1\n ? `Job \"${nameOrId}\" not found on server ${missing[0]}.`\n : `Job \"${nameOrId}\" not found on any of the ${services.length} connected servers.`,\n );\n } else {\n // The other servers failed and were reported above\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on ${missing.length === 1 ? 'server' : 'servers'} ${missing.join(', ')}.`,\n );\n }\n }\n return matches;\n}\n\n/** Write the \"Server: <name>\" header used when several servers are connected. */\nfunction writeServerHeader(\n context: ICliExecutionContext,\n name: string,\n): void {\n context.writer.writeln(\n context.writer.wrapInColor(`Server: ${name}`, CliForegroundColor.Cyan),\n );\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.help.see_control_background_jobs', 'See and control the background jobs that run on connected servers: list them, run one now, pause or stop it, read its history and logs, change its settings, or watch events live. A job is picked by name (any case) or ID and looked up on every connected server; actions apply to each server that has the job, and --server limits a command to one server.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs', t.t('cli.server.jobs.help.same_server_jobs_list', 'Same as server jobs list')],\n ['server jobs <action> <name|id>', 'info, trigger, pause, resume, stop, cancel, history, logs, edit'],\n ['server jobs watch', t.t('cli.server.jobs.help.live_job_events', 'Live job events')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs', t.t('cli.server.jobs.help.all_jobs', 'All jobs')],\n ['server jobs trigger cleanup', t.t('cli.server.jobs.help.run_cleanup_job_now', 'Run the cleanup job now')],\n ['server jobs history cleanup --status failed', t.t('cli.server.jobs.help.failed_runs', 'Its failed runs')],\n ['server jobs logs cleanup --server node', t.t('cli.server.jobs.help.last_run_output_node', 'Last run output, on node')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.list.help.list_jobs_every_connected', 'List the jobs of every connected server: group, status, schedule, last and next run, and how long the last run took. With several servers, each gets its own table.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs list', t.t('cli.server.jobs.list.help.jobs_all_connected_servers', 'Jobs on all connected servers')],\n ['server jobs ls --group <name>', t.t('cli.server.jobs.list.help.only_one_group', 'Only one group')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs ls --server node', t.t('cli.server.jobs.list.help.jobs_node_server', 'Jobs on the node server')],\n ['server jobs list --group reports', t.t('cli.server.jobs.list.help.jobs_reports_group', 'Jobs in the reports group')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.info.help.show_everything_about_one', 'Show everything about one job: schedule, retries, timeout, overlap policy, the execution running now and the result of the last run. The job is found by name (any case) or ID.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs info <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs info cleanup', t.t('cli.server.jobs.info.help.details_cleanup_job', 'Details of the cleanup job')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.trigger.help.run_job_now_without', 'Run a job now, without waiting for its next scheduled time. Its schedule does not change.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs trigger <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs trigger cleanup', t.t('cli.server.jobs.trigger.help.run_cleanup_now', 'Run cleanup now')],\n ['server jobs logs cleanup', t.t('cli.server.jobs.trigger.help.then_read_output', 'Then read its output')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.pause.help.stop_running_job_schedule', 'Stop running a job on its schedule until it is resumed. Use cancel or stop for a run that is already in progress.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs pause <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs pause cleanup', t.t('cli.server.jobs.pause.help.hold_cleanup', 'Hold cleanup')],\n ['server jobs resume cleanup', t.t('cli.server.jobs.pause.help.put_back_schedule', 'Put it back on schedule')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.resume.help.put_paused_job_back', 'Put a paused job back on its schedule.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs resume <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs resume cleanup', t.t('cli.server.jobs.resume.help.run_cleanup_schedule_again', 'Run cleanup on schedule again')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.stop.help.take_job_off_schedule', 'Take a job off its schedule and cancel the run in progress, if there is one.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs stop <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs stop cleanup', t.t('cli.server.jobs.stop.help.stop_cleanup_completely', 'Stop cleanup completely')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.cancel.help.cancel_run_progress_job', 'Cancel the run in progress of a job. The job stays on its schedule and runs again at the next time.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs cancel <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs cancel cleanup', t.t('cli.server.jobs.cancel.help.abort_current_cleanup_run', 'Abort the current cleanup run')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.history.help.list_past_runs_job', 'List the past runs of a job: status, start time, duration, retry attempt and the start of the error message. Use the short ID with logs --exec to read the output of one run.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs history <name|id>', t.t('cli.server.jobs.history.help.last_20_runs', 'The last 20 runs')],\n ['server jobs history <name|id> --limit <n> --offset <n>', t.t('cli.server.jobs.history.help.page_through_older_runs', 'Page through older runs')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs history cleanup --status failed', t.t('cli.server.jobs.history.help.only_failed_runs', 'Only failed runs')],\n ['server jobs history cleanup --limit 5', t.t('cli.server.jobs.history.help.last_5_runs', 'The last 5 runs')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.logs.help.print_log_entries_latest', 'Print the log entries of the latest run of a job, or of one run picked by its execution ID (from history).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs logs <name|id>', t.t('cli.server.jobs.logs.help.logs_latest_run', 'Logs of the latest run')],\n ['server jobs logs <name|id> --exec <id>', t.t('cli.server.jobs.logs.help.logs_one_run', 'Logs of one run')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs logs cleanup', t.t('cli.server.jobs.logs.help.what_last_cleanup_run', 'What the last cleanup run printed')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.edit.help.change_job_step_step', 'Change a job step by step: description, group, cron schedule or interval, max retries, timeout and overlap policy (skip, queue or cancel). Press Enter to keep a value and Ctrl+C or Escape to cancel; nothing changes until you confirm. A job on several servers needs --server.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs edit <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs edit cleanup', t.t('cli.server.jobs.edit.help.edit_cleanup_server_has', 'Edit cleanup on the server that has it')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.watch.help.follow_job_events_they', 'Follow job events as they happen (started, completed, failed and so on) on every connected server, one line per event. Press Ctrl+C to stop.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs watch', t.t('cli.server.jobs.watch.help.events_all_connected_servers', 'Events from all connected servers')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs watch --server node', t.t('cli.server.jobs.watch.help.only_events_node', 'Only events from node')],\n ]);\n },\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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, job } of matches) {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 ? `every ${job.interval}ms` : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n ['Timeout', job.timeout ? `${job.timeout}ms` : 'none'],\n ['Overlap Policy', job.overlapPolicy],\n ['Current Execution', job.currentExecutionId ?? 'none'],\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 }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n /**\n * Without --server the action applies to every connected server that has\n * the job, each reported on its own line. When several servers have it,\n * a note says so (and how to target one).\n */\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError(`Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n if (matches.length > 1) {\n context.writer.writeInfo(\n `Job \"${nameOrId}\" is on ${matches.length} servers (${matches.map((m) => m.name).join(', ')}); applying ${action} to each. Use --server <name> to target one.`,\n );\n }\n\n for (const { name, service, job } of matches) {\n try {\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}\" ${PAST_TENSE[action] ?? `${action}ed`}${serverSuffix}.`,\n );\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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, service, job } of matches) {\n try {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 continue;\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 } 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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, service, job } of matches) {\n try {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 continue;\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 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 continue;\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 } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n /**\n * Prompt for each setting; Enter keeps the current value. Ctrl+C or\n * Escape at any prompt (the reader resolves null) cancels the whole edit\n * and nothing is sent. A job on several servers needs --server.\n */\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n if (matches.length === 0) {\n return;\n }\n if (matches.length > 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" is on ${matches.length} servers (${matches.map((m) => m.name).join(', ')}). Use --server <name> to choose the one to edit.`,\n );\n return;\n }\n\n const { name, service, job } = matches[0];\n const cancelled = () => {\n context.writer.writeInfo('Edit cancelled.');\n };\n const aborted = () => !!context.signal?.aborted;\n /** The answer, or null when the user cancelled. */\n const ask = async (prompt: string): Promise<string | null> => {\n if (aborted()) return null;\n const answer = await context.reader.readLine(prompt);\n return answer == null || aborted() ? null : answer.trim();\n };\n\n try {\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. Ctrl+C cancels.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await ask(`Description [${job.description}]: `);\n if (newDesc == null) return cancelled();\n if (newDesc) update.description = newDesc;\n\n // Group\n const newGroup = await ask(`Group [${job.group ?? 'none'}]: `);\n if (newGroup == null) return cancelled();\n if (newGroup) update.group = newGroup;\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await ask(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) return cancelled();\n if (newSchedule) update.schedule = newSchedule;\n\n // Interval\n if (!newSchedule) {\n const newInterval = await ask(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval == null) return cancelled();\n if (newInterval) update.interval = newInterval;\n }\n\n // Max retries\n const newRetries = await ask(`Max retries [${job.maxRetries}]: `);\n if (newRetries == null) return cancelled();\n if (newRetries) {\n const parsed = parseInt(newRetries, 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await ask(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout == null) return cancelled();\n if (newTimeout) update.timeout = newTimeout;\n\n // Overlap policy\n const newOverlap = await ask(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (newOverlap == null) return cancelled();\n if (\n newOverlap &&\n ['skip', 'queue', 'cancel'].includes(newOverlap.toLowerCase())\n ) {\n update.overlapPolicy = newOverlap.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 (null when cancelled, false when declined)\n const confirm = aborted()\n ? null\n : await context.reader.readConfirm('Apply changes?');\n if (!confirm || aborted()) return cancelled();\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n } catch (e: any) {\n context.writer.writeError(`Error on server ${name}: ${e.message}`);\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n /**\n * Stream job events until Ctrl+C (context.onAbort / context.signal) or\n * until every watched server has closed its connection. On exit the\n * sockets are closed and every subscription and listener is removed.\n */\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n const targets: [string, any][] = [];\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 targets.push([serverName, connection]);\n }\n\n if (targets.length === 0) {\n context.writer.writeInfo(\n targetServer\n ? `Server \"${targetServer}\" is not connected.`\n : 'No connected servers.',\n );\n return;\n }\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 open = new Set<WebSocket>();\n let stopped = false;\n let reason = 'aborted' as 'aborted' | 'closed';\n let resolveDone!: () => void;\n const done = new Promise<void>((resolve) => (resolveDone = resolve));\n\n const closeSocket = (ws: WebSocket) => {\n ws.onmessage = null;\n ws.onerror = null;\n ws.onclose = null;\n try {\n ws.close();\n } catch {\n // ignore\n }\n };\n\n const onAbortSignal = () => stop('aborted');\n const abortSub = context.onAbort?.subscribe(onAbortSignal);\n context.signal?.addEventListener('abort', onAbortSignal);\n\n function stop(why: 'aborted' | 'closed'): void {\n if (stopped) return;\n stopped = true;\n reason = why;\n abortSub?.unsubscribe();\n context.signal?.removeEventListener('abort', onAbortSignal);\n for (const ws of open) closeSocket(ws);\n open.clear();\n resolveDone();\n }\n\n if (context.signal?.aborted) {\n stop('aborted');\n }\n\n const multiServer = targets.length > 1;\n for (const [serverName, connection] of targets) {\n if (stopped) break;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n\n try {\n const wsUrl = await resolveServerWebSocketUrl(\n context.services,\n serverName,\n baseUrl.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:') + '/ws/v1/qcli/events',\n config.headers,\n { unsafeHeadersInWebSocketUrl: config.unsafeHeadersInWebSocketUrl },\n );\n // Ctrl+C while the URL was being resolved\n if (stopped) break;\n\n const ws = new WebSocket(wsUrl);\n open.add(ws);\n\n ws.onmessage = (event) => {\n if (stopped) return;\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 = multiServer\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 if (stopped) return;\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n if (stopped || !open.delete(ws)) return;\n context.writer.writeWarning(\n `Connection to server ${serverName} closed.`,\n );\n if (open.size === 0) {\n stop('closed');\n }\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Nothing to wait for: every connection failed to open\n if (!stopped && open.size === 0) {\n stop('closed');\n }\n\n await done;\n\n context.writer.writeln('');\n context.writer.writeInfo(\n reason === 'closed'\n ? 'Stopped watching job events: no server connection left.'\n : 'Stopped watching job events.',\n );\n }\n}\n\n/** Past tense of the job actions, for the confirmation message. */\nconst PAST_TENSE: Record<string, string> = {\n trigger: 'triggered',\n pause: 'paused',\n resume: 'resumed',\n stop: 'stopped',\n cancel: 'cancelled',\n};\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.getRequired<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(this.services!, name, config.headers);\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.1.1';\nexport const API_VERSION = 2;\n ","/*\n * Public API Surface of jobs\n */\n\nexport * from './lib/processors/cli-jobs-command-processor';\nexport * from './lib/completion/cli-job-name-completion-provider';\nexport * from './lib/services/cli-jobs-service';\nexport * from './lib/models';\nexport * from './lib/version';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliJobsCommandProcessor } from './lib/processors/cli-jobs-command-processor';\nimport { CliJobNameCompletionProvider } from './lib/completion/cli-job-name-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst completionProvider = new CliJobNameCompletionProvider();\n\nexport const jobsModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-server-jobs',\n processors: [new CliJobsCommandProcessor()],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: completionProvider,\n multi: true,\n },\n ],\n async onInit(context) {\n completionProvider.setServices(context.services);\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/server-jobs/src/lib/services/cli-jobs-service.ts","../../packages/plugins/server-jobs/src/lib/processors/cli-jobs-command-processor.ts","../../packages/plugins/server-jobs/src/lib/completion/cli-job-name-completion-provider.ts","../../packages/plugins/server-jobs/src/lib/version.ts","../../packages/plugins/server-jobs/src/public-api.ts"],"names":["resolveServerHeaders"],"mappings":"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","file":"public-api.mjs","sourcesContent":["import {\n JobDto,\n JobExecutionDto,\n JobHistoryResponse,\n UpdateJobRequest,\n} from '../models';\n\nexport class CliJobsService {\n constructor(\n private baseUrl: string,\n private headers: Record<string, string> = {},\n ) {}\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}/api/v1/qcli/jobs${path}`;\n const response = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n\n if (!response.ok) {\n let errorMessage = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body.error) {\n errorMessage = body.error;\n }\n } catch {\n // use default error message\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n async listJobs(): Promise<JobDto[]> {\n return this.request<JobDto[]>('');\n }\n\n async getJob(id: string): Promise<JobDto> {\n return this.request<JobDto>(`/${encodeURIComponent(id)}`);\n }\n\n async triggerJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/trigger`, {\n method: 'POST',\n });\n }\n\n async pauseJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n });\n }\n\n async resumeJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n });\n }\n\n async stopJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n }\n\n async cancelJob(id: string): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}/cancel`, {\n method: 'POST',\n });\n }\n\n async updateJob(id: string, request: UpdateJobRequest): Promise<void> {\n await this.request<void>(`/${encodeURIComponent(id)}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n async getHistory(\n id: string,\n opts?: { limit?: number; offset?: number; status?: string },\n ): Promise<JobHistoryResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.offset != null) params.set('offset', String(opts.offset));\n if (opts?.status) params.set('status', opts.status);\n const qs = params.toString();\n return this.request<JobHistoryResponse>(\n `/${encodeURIComponent(id)}/history${qs ? `?${qs}` : ''}`,\n );\n }\n\n async getExecution(\n jobId: string,\n execId: string,\n ): Promise<JobExecutionDto> {\n return this.request<JobExecutionDto>(\n `/${encodeURIComponent(jobId)}/history/${encodeURIComponent(execId)}`,\n );\n }\n}\n","import {\n ICliCommandProcessor,\n ICliExecutionContext,\n CliProcessCommand,\n ICliCommandAuthor,\n CliProcessorMetadata,\n CliIcon,\n DefaultLibraryAuthor,\n CliForegroundColor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n resolveServerWebSocketUrl,\n resolveServerHeaders,\n writeExamples,\n writeUsage,\n writeWrapped,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\nimport { JobDto, JobExecutionDto, UpdateJobRequest } from '../models';\n\n/**\n * Resolve connected server URLs and optional headers from the CliServerManager.\n * Returns an array of { name, service } for each connected server.\n * When --server is specified, only that server is returned.\n */\nfunction getServices(\n context: ICliExecutionContext,\n args: Record<string, any>,\n): { name: string; service: CliJobsService }[] {\n // The CliServerManager is registered under the 'cli-server-manager' token\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n return [];\n }\n\n const targetServer = args['server'] as string | undefined;\n const results: { name: string; service: CliJobsService }[] = [];\n\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (targetServer && name !== targetServer) continue;\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(context.services, name, config.headers);\n results.push({ name, service: new CliJobsService(baseUrl, headers) });\n }\n\n return results;\n}\n\n/**\n * Resolve a job by name or ID. If the value looks like a UUID, use it directly;\n * otherwise, fetch the job list and find a match: the ID, then the exact name,\n * then the name in any case.\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 lower = nameOrId.toLowerCase();\n return (\n jobs.find((j) => j.id === nameOrId) ??\n jobs.find((j) => j.name === nameOrId) ??\n jobs.find((j) => j.name.toLowerCase() === lower) ??\n null\n );\n}\n\n/** A job found on one server. */\ninterface JobMatch {\n name: string;\n service: CliJobsService;\n job: JobDto;\n}\n\n/**\n * Look the job up on every given server. Lookup errors are reported per\n * server; a job that no server has is reported once.\n */\nasync function findJobOnServers(\n context: ICliExecutionContext,\n services: { name: string; service: CliJobsService }[],\n nameOrId: string,\n): Promise<JobMatch[]> {\n const matches: JobMatch[] = [];\n const missing: string[] = [];\n for (const { name, service } of services) {\n try {\n const job = await resolveJobId(service, nameOrId);\n if (job) {\n matches.push({ name, service, job });\n } else {\n missing.push(name);\n }\n } catch (e: any) {\n context.writer.writeError(`Error on server ${name}: ${e.message}`);\n }\n }\n\n if (matches.length === 0 && missing.length > 0) {\n if (missing.length === services.length) {\n // Report once, when no server has the job\n context.writer.writeError(\n services.length === 1\n ? `Job \"${nameOrId}\" not found on server ${missing[0]}.`\n : `Job \"${nameOrId}\" not found on any of the ${services.length} connected servers.`,\n );\n } else {\n // The other servers failed and were reported above\n context.writer.writeError(\n `Job \"${nameOrId}\" not found on ${missing.length === 1 ? 'server' : 'servers'} ${missing.join(', ')}.`,\n );\n }\n }\n return matches;\n}\n\n/** Write the \"Server: <name>\" header used when several servers are connected. */\nfunction writeServerHeader(\n context: ICliExecutionContext,\n name: string,\n): void {\n context.writer.writeln(\n context.writer.wrapInColor(`Server: ${name}`, CliForegroundColor.Cyan),\n );\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.help.see_control_background_jobs', 'See and control the background jobs that run on connected servers: list them, run one now, pause or stop it, read its history and logs, change its settings, or watch events live. A job is picked by name (any case) or ID and looked up on every connected server; actions apply to each server that has the job, and --server limits a command to one server.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs', t.t('cli.server.jobs.help.same_server_jobs_list', 'Same as server jobs list')],\n ['server jobs <action> <name|id>', 'info, trigger, pause, resume, stop, cancel, history, logs, edit'],\n ['server jobs watch', t.t('cli.server.jobs.help.live_job_events', 'Live job events')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs', t.t('cli.server.jobs.help.all_jobs', 'All jobs')],\n ['server jobs trigger cleanup', t.t('cli.server.jobs.help.run_cleanup_job_now', 'Run the cleanup job now')],\n ['server jobs history cleanup --status failed', t.t('cli.server.jobs.help.failed_runs', 'Its failed runs')],\n ['server jobs logs cleanup --server node', t.t('cli.server.jobs.help.last_run_output_node', 'Last run output, on node')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.list.help.list_jobs_every_connected', 'List the jobs of every connected server: group, status, schedule, last and next run, and how long the last run took. With several servers, each gets its own table.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs list', t.t('cli.server.jobs.list.help.jobs_all_connected_servers', 'Jobs on all connected servers')],\n ['server jobs ls --group <name>', t.t('cli.server.jobs.list.help.only_one_group', 'Only one group')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs ls --server node', t.t('cli.server.jobs.list.help.jobs_node_server', 'Jobs on the node server')],\n ['server jobs list --group reports', t.t('cli.server.jobs.list.help.jobs_reports_group', 'Jobs in the reports group')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.info.help.show_everything_about_one', 'Show everything about one job: schedule, retries, timeout, overlap policy, the execution running now and the result of the last run. The job is found by name (any case) or ID.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs info <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs info cleanup', t.t('cli.server.jobs.info.help.details_cleanup_job', 'Details of the cleanup job')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.trigger.help.run_job_now_without', 'Run a job now, without waiting for its next scheduled time. Its schedule does not change.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs trigger <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs trigger cleanup', t.t('cli.server.jobs.trigger.help.run_cleanup_now', 'Run cleanup now')],\n ['server jobs logs cleanup', t.t('cli.server.jobs.trigger.help.then_read_output', 'Then read its output')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.pause.help.stop_running_job_schedule', 'Stop running a job on its schedule until it is resumed. Use cancel or stop for a run that is already in progress.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs pause <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs pause cleanup', t.t('cli.server.jobs.pause.help.hold_cleanup', 'Hold cleanup')],\n ['server jobs resume cleanup', t.t('cli.server.jobs.pause.help.put_back_schedule', 'Put it back on schedule')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.resume.help.put_paused_job_back', 'Put a paused job back on its schedule.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs resume <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs resume cleanup', t.t('cli.server.jobs.resume.help.run_cleanup_schedule_again', 'Run cleanup on schedule again')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.stop.help.take_job_off_schedule', 'Take a job off its schedule and cancel the run in progress, if there is one.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs stop <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs stop cleanup', t.t('cli.server.jobs.stop.help.stop_cleanup_completely', 'Stop cleanup completely')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.cancel.help.cancel_run_progress_job', 'Cancel the run in progress of a job. The job stays on its schedule and runs again at the next time.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs cancel <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs cancel cleanup', t.t('cli.server.jobs.cancel.help.abort_current_cleanup_run', 'Abort the current cleanup run')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.history.help.list_past_runs_job', 'List the past runs of a job: status, start time, duration, retry attempt and the start of the error message. Use the short ID with logs --exec to read the output of one run.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs history <name|id>', t.t('cli.server.jobs.history.help.last_20_runs', 'The last 20 runs')],\n ['server jobs history <name|id> --limit <n> --offset <n>', t.t('cli.server.jobs.history.help.page_through_older_runs', 'Page through older runs')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs history cleanup --status failed', t.t('cli.server.jobs.history.help.only_failed_runs', 'Only failed runs')],\n ['server jobs history cleanup --limit 5', t.t('cli.server.jobs.history.help.last_5_runs', 'The last 5 runs')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.logs.help.print_log_entries_latest', 'Print the log entries of the latest run of a job, or of one run picked by its execution ID (from history).'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs logs <name|id>', t.t('cli.server.jobs.logs.help.logs_latest_run', 'Logs of the latest run')],\n ['server jobs logs <name|id> --exec <id>', t.t('cli.server.jobs.logs.help.logs_one_run', 'Logs of one run')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs logs cleanup', t.t('cli.server.jobs.logs.help.what_last_cleanup_run', 'What the last cleanup run printed')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.edit.help.change_job_step_step', 'Change a job step by step: description, group, cron schedule or interval, max retries, timeout and overlap policy (skip, queue or cancel). Press Enter to keep a value and Ctrl+C or Escape to cancel; nothing changes until you confirm. A job on several servers needs --server.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs edit <name|id>', ''],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs edit cleanup', t.t('cli.server.jobs.edit.help.edit_cleanup_server_has', 'Edit cleanup on the server that has it')],\n ]);\n },\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 writeDescription: (context: ICliExecutionContext) => {\n const t = context.translator;\n writeWrapped(\n context,\n t.t('cli.server.jobs.watch.help.follow_job_events_they', 'Follow job events as they happen (started, completed, failed and so on) on every connected server, one line per event. Press Ctrl+C to stop.'),\n );\n context.writer.writeln();\n writeUsage(context, [\n ['server jobs watch', t.t('cli.server.jobs.watch.help.events_all_connected_servers', 'Events from all connected servers')],\n ]);\n context.writer.writeln();\n writeExamples(context, [\n ['server jobs watch --server node', t.t('cli.server.jobs.watch.help.only_events_node', 'Only events from node')],\n ]);\n },\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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, job } of matches) {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 ? `every ${job.interval}ms` : '-'),\n ],\n ['Max Retries', String(job.maxRetries)],\n ['Timeout', job.timeout ? `${job.timeout}ms` : 'none'],\n ['Overlap Policy', job.overlapPolicy],\n ['Current Execution', job.currentExecutionId ?? 'none'],\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 }\n }\n\n // ── Action (trigger/pause/resume/stop/cancel) ────────────────────\n\n /**\n * Without --server the action applies to every connected server that has\n * the job, each reported on its own line. When several servers have it,\n * a note says so (and how to target one).\n */\n private async handleAction(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n action: 'trigger' | 'pause' | 'resume' | 'stop' | 'cancel',\n ): Promise<void> {\n const nameOrId = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError(`Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n if (matches.length > 1) {\n context.writer.writeInfo(\n `Job \"${nameOrId}\" is on ${matches.length} servers (${matches.map((m) => m.name).join(', ')}); applying ${action} to each. Use --server <name> to target one.`,\n );\n }\n\n for (const { name, service, job } of matches) {\n try {\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}\" ${PAST_TENSE[action] ?? `${action}ed`}${serverSuffix}.`,\n );\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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, service, job } of matches) {\n try {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 continue;\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 } 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 = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n for (const { name, service, job } of matches) {\n try {\n if (services.length > 1) {\n writeServerHeader(context, name);\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 continue;\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 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 continue;\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 } catch (e: any) {\n context.writer.writeError(\n `Error on server ${name}: ${e.message}`,\n );\n }\n }\n }\n\n // ── Edit ─────────────────────────────────────────────────────────\n\n /**\n * Prompt for each setting; Enter keeps the current value. Ctrl+C or\n * Escape at any prompt (the reader resolves null) cancels the whole edit\n * and nothing is sent. A job on several servers needs --server.\n */\n private async handleEdit(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const nameOrId = joinShellWords(cmd.value ?? '');\n if (!nameOrId) {\n context.writer.writeError('Usage: server 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 const matches = await findJobOnServers(context, services, nameOrId);\n if (matches.length === 0) {\n return;\n }\n if (matches.length > 1) {\n context.writer.writeError(\n `Job \"${nameOrId}\" is on ${matches.length} servers (${matches.map((m) => m.name).join(', ')}). Use --server <name> to choose the one to edit.`,\n );\n return;\n }\n\n const { name, service, job } = matches[0];\n const cancelled = () => {\n context.writer.writeInfo('Edit cancelled.');\n };\n const aborted = () => !!context.signal?.aborted;\n /** The answer, or null when the user cancelled. */\n const ask = async (prompt: string): Promise<string | null> => {\n if (aborted()) return null;\n const answer = await context.reader.readLine(prompt);\n return answer == null || aborted() ? null : answer.trim();\n };\n\n try {\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. Ctrl+C cancels.',\n );\n context.writer.writeln('');\n\n const update: UpdateJobRequest = {};\n\n // Description\n const newDesc = await ask(`Description [${job.description}]: `);\n if (newDesc == null) return cancelled();\n if (newDesc) update.description = newDesc;\n\n // Group\n const newGroup = await ask(`Group [${job.group ?? 'none'}]: `);\n if (newGroup == null) return cancelled();\n if (newGroup) update.group = newGroup;\n\n // Schedule\n const currentSchedule =\n job.schedule ??\n (job.interval ? `interval: ${job.interval}ms` : 'none');\n const newSchedule = await ask(\n `Cron schedule [${currentSchedule}]: `,\n );\n if (newSchedule == null) return cancelled();\n if (newSchedule) update.schedule = newSchedule;\n\n // Interval\n if (!newSchedule) {\n const newInterval = await ask(\n `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : 'none'}]: `,\n );\n if (newInterval == null) return cancelled();\n if (newInterval) update.interval = newInterval;\n }\n\n // Max retries\n const newRetries = await ask(`Max retries [${job.maxRetries}]: `);\n if (newRetries == null) return cancelled();\n if (newRetries) {\n const parsed = parseInt(newRetries, 10);\n if (!isNaN(parsed)) {\n update.maxRetries = parsed;\n }\n }\n\n // Timeout\n const newTimeout = await ask(\n `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : 'none'}]: `,\n );\n if (newTimeout == null) return cancelled();\n if (newTimeout) update.timeout = newTimeout;\n\n // Overlap policy\n const newOverlap = await ask(\n `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `,\n );\n if (newOverlap == null) return cancelled();\n if (\n newOverlap &&\n ['skip', 'queue', 'cancel'].includes(newOverlap.toLowerCase())\n ) {\n update.overlapPolicy = newOverlap.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 (null when cancelled, false when declined)\n const confirm = aborted()\n ? null\n : await context.reader.readConfirm('Apply changes?');\n if (!confirm || aborted()) return cancelled();\n\n await service.updateJob(job.id, update);\n context.writer.writeSuccess(\n `Job \"${job.name}\" updated successfully.`,\n );\n } catch (e: any) {\n context.writer.writeError(`Error on server ${name}: ${e.message}`);\n }\n }\n\n // ── Watch ────────────────────────────────────────────────────────\n\n /**\n * Stream job events until Ctrl+C (context.onAbort / context.signal) or\n * until every watched server has closed its connection. On exit the\n * sockets are closed and every subscription and listener is removed.\n */\n private async handleWatch(\n cmd: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const manager = context.services.getRequired<any>('cli-server-manager');\n if (!manager || !manager.connections) {\n context.writer.writeInfo('No connected servers.');\n return;\n }\n\n const targetServer = cmd.args['server'] as string | undefined;\n const targets: [string, any][] = [];\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 targets.push([serverName, connection]);\n }\n\n if (targets.length === 0) {\n context.writer.writeInfo(\n targetServer\n ? `Server \"${targetServer}\" is not connected.`\n : 'No connected servers.',\n );\n return;\n }\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 open = new Set<WebSocket>();\n let stopped = false;\n let reason = 'aborted' as 'aborted' | 'closed';\n let resolveDone!: () => void;\n const done = new Promise<void>((resolve) => (resolveDone = resolve));\n\n const closeSocket = (ws: WebSocket) => {\n ws.onmessage = null;\n ws.onerror = null;\n ws.onclose = null;\n try {\n ws.close();\n } catch {\n // ignore\n }\n };\n\n const onAbortSignal = () => stop('aborted');\n const abortSub = context.onAbort?.subscribe(onAbortSignal);\n context.signal?.addEventListener('abort', onAbortSignal);\n\n function stop(why: 'aborted' | 'closed'): void {\n if (stopped) return;\n stopped = true;\n reason = why;\n abortSub?.unsubscribe();\n context.signal?.removeEventListener('abort', onAbortSignal);\n for (const ws of open) closeSocket(ws);\n open.clear();\n resolveDone();\n }\n\n if (context.signal?.aborted) {\n stop('aborted');\n }\n\n const multiServer = targets.length > 1;\n for (const [serverName, connection] of targets) {\n if (stopped) break;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n\n try {\n const wsUrl = await resolveServerWebSocketUrl(\n context.services,\n serverName,\n baseUrl.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:') + '/ws/v1/qcli/events',\n config.headers,\n { unsafeHeadersInWebSocketUrl: config.unsafeHeadersInWebSocketUrl },\n );\n // Ctrl+C while the URL was being resolved\n if (stopped) break;\n\n const ws = new WebSocket(wsUrl);\n open.add(ws);\n\n ws.onmessage = (event) => {\n if (stopped) return;\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 = multiServer\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 if (stopped) return;\n context.writer.writeError(\n `WebSocket error on server ${serverName}`,\n );\n };\n\n ws.onclose = () => {\n if (stopped || !open.delete(ws)) return;\n context.writer.writeWarning(\n `Connection to server ${serverName} closed.`,\n );\n if (open.size === 0) {\n stop('closed');\n }\n };\n } catch (e: any) {\n context.writer.writeError(\n `Failed to connect to ${serverName}: ${e.message}`,\n );\n }\n }\n\n // Nothing to wait for: every connection failed to open\n if (!stopped && open.size === 0) {\n stop('closed');\n }\n\n await done;\n\n context.writer.writeln('');\n context.writer.writeInfo(\n reason === 'closed'\n ? 'Stopped watching job events: no server connection left.'\n : 'Stopped watching job events.',\n );\n }\n}\n\n/** Past tense of the job actions, for the confirmation message. */\nconst PAST_TENSE: Record<string, string> = {\n trigger: 'triggered',\n pause: 'paused',\n resume: 'resumed',\n stop: 'stopped',\n cancel: 'cancelled',\n};\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n ICliServiceProvider,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { CliJobsService } from '../services/cli-jobs-service';\n\n/**\n * Sub-commands of `server jobs` that accept a job name/id as a value.\n */\nconst JOB_NAME_SUBCOMMANDS = new Set([\n 'info',\n 'trigger',\n 'pause',\n 'resume',\n 'stop',\n 'cancel',\n 'history',\n 'logs',\n 'edit',\n]);\n\n/**\n * Provides tab-completion for job names when typing\n * `server jobs <subcommand> <name>`.\n *\n * Priority 50 — checked before command and parameter completion so that\n * job names are suggested instead of treating the value position as\n * a sub-command or flag.\n */\nexport class CliJobNameCompletionProvider implements ICliCompletionProvider {\n priority = 50;\n\n private services: ICliServiceProvider | null = null;\n\n setServices(services: ICliServiceProvider): void {\n this.services = services;\n }\n\n async getCompletions(context: ICliCompletionContext): Promise<string[]> {\n const { tokens, tokenIndex, token } = context;\n\n // Expected: server jobs <subcommand> <value>\n // tokens[0] = 'server', tokens[1] = 'jobs', tokens[2] = subcommand, tokens[3] = value\n if (tokenIndex !== 3 || tokens.length < 3) {\n return [];\n }\n\n if (tokens[0].toLowerCase() !== 'server') {\n return [];\n }\n\n if (tokens[1].toLowerCase() !== 'jobs') {\n return [];\n }\n\n const subCommand = tokens[2].toLowerCase();\n if (!JOB_NAME_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n if (!this.services) {\n return [];\n }\n\n const lowerPrefix = token.toLowerCase();\n\n try {\n const manager = this.services.getRequired<any>('cli-server-manager');\n if (!manager?.connections) {\n return [];\n }\n\n const names: string[] = [];\n for (const [name, connection] of manager.connections as Map<string, any>) {\n if (!connection.connected) continue;\n\n const config = connection.config;\n const baseUrl = config.url.endsWith('/')\n ? config.url.slice(0, -1)\n : config.url;\n const headers = resolveServerHeaders(this.services!, name, config.headers);\n const service = new CliJobsService(baseUrl, headers);\n\n try {\n const jobs = await service.listJobs();\n for (const job of jobs) {\n if (!names.includes(job.name)) {\n names.push(job.name);\n }\n }\n } catch {\n // skip unreachable servers\n }\n }\n\n return names\n .filter((name) => name.toLowerCase().startsWith(lowerPrefix))\n .sort();\n } catch {\n return [];\n }\n }\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.3.0';\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"]}
|