pidnap 0.0.0-dev.6 → 0.0.0-dev.7

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/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { _ as ProcessDefinition, a as TaskStateSchema, c as CronProcessState, h as RestartingProcessState, i as TaskList, m as RestartingProcessOptions, n as EnvManager, o as CronProcess, p as RestartingProcess, s as CronProcessOptions, t as logger } from "./logger-BU2RmetS.mjs";
2
+ import { _ as ProcessDefinition, a as TaskStateSchema, c as CronProcessState, h as RestartingProcessState, i as TaskList, m as RestartingProcessOptions, n as logger, o as CronProcess, p as RestartingProcess, s as CronProcessOptions, t as EnvManager } from "./env-manager-FKhvfwIR.mjs";
3
3
  import { createClient } from "./client.mjs";
4
4
  import { createServer } from "node:http";
5
5
  import { pathToFileURL } from "node:url";
@@ -283,7 +283,7 @@ var Manager = class {
283
283
  cwd: cwd$1,
284
284
  globalEnvFile: config.envFile,
285
285
  customEnvFiles
286
- });
286
+ }, this.logger.child("env-manager"));
287
287
  this.envChangeUnsubscribe = this.envManager.onChange((event) => this.handleEnvChange(event));
288
288
  for (const signal of ["SIGINT", "SIGTERM"]) {
289
289
  const handler = () => this.handleSignal(signal);
@@ -774,7 +774,7 @@ async function tImport(path) {
774
774
 
775
775
  //#endregion
776
776
  //#region package.json
777
- var version = "0.0.0-dev.6";
777
+ var version = "0.0.0-dev.7";
778
778
 
779
779
  //#endregion
780
780
  //#region src/cli.ts
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["oc","ocBase","ResourceTarget","os","cwd","getCwd","os","osBase","pkg.version"],"sources":["../src/api/contract.ts","../src/api/server.ts","../src/manager.ts","../src/utils.ts","../package.json","../src/cli.ts"],"sourcesContent":["import { oc as ocBase } from \"@orpc/contract\";\nimport * as v from \"valibot\";\nimport { ProcessDefinition } from \"../lazy-process.ts\";\nimport { RestartingProcessState } from \"../restarting-process.ts\";\nimport { CronProcessState } from \"../cron-process.ts\";\nimport { TaskStateSchema } from \"../task-list.ts\";\n\nconst oc = ocBase.$input(v.void());\n\n// Resource target (name or index)\nconst ResourceTarget = v.union([v.string(), v.number()]);\n\n// Manager state schema\nexport const ManagerStateSchema = v.picklist([\n \"idle\",\n \"initializing\",\n \"running\",\n \"stopping\",\n \"stopped\",\n]);\n\nexport type ManagerState = v.InferOutput<typeof ManagerStateSchema>;\n\n// Manager status response\nexport const ManagerStatusSchema = v.object({\n state: ManagerStateSchema,\n processCount: v.number(),\n cronCount: v.number(),\n taskCount: v.number(),\n});\n\nexport type ManagerStatus = v.InferOutput<typeof ManagerStatusSchema>;\n\n// API response schemas\nexport const RestartingProcessInfoSchema = v.object({\n name: v.string(),\n state: RestartingProcessState,\n restarts: v.number(),\n});\n\nexport type RestartingProcessInfo = v.InferOutput<typeof RestartingProcessInfoSchema>;\n\nexport const CronProcessInfoSchema = v.object({\n name: v.string(),\n state: CronProcessState,\n runCount: v.number(),\n failCount: v.number(),\n nextRun: v.nullable(v.string()), // ISO date string\n});\n\nexport type CronProcessInfo = v.InferOutput<typeof CronProcessInfoSchema>;\n\nexport const TaskEntryInfoSchema = v.object({\n id: v.string(),\n state: TaskStateSchema,\n processNames: v.array(v.string()),\n});\n\nexport type TaskEntryInfo = v.InferOutput<typeof TaskEntryInfoSchema>;\n\n// API contract\nexport const manager = {\n status: oc.output(ManagerStatusSchema),\n};\n\nexport const processes = {\n get: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n list: oc.output(v.array(RestartingProcessInfoSchema)),\n add: oc\n .input(v.object({ name: v.string(), definition: ProcessDefinition }))\n .output(RestartingProcessInfoSchema),\n start: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n stop: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n restart: oc\n .input(v.object({ target: ResourceTarget, force: v.optional(v.boolean()) }))\n .output(RestartingProcessInfoSchema),\n reload: oc\n .input(\n v.object({\n target: ResourceTarget,\n definition: ProcessDefinition,\n restartImmediately: v.optional(v.boolean()),\n }),\n )\n .output(RestartingProcessInfoSchema),\n remove: oc.input(v.object({ target: ResourceTarget })).output(v.object({ success: v.boolean() })),\n};\n\nexport const tasks = {\n get: oc.input(v.object({ target: ResourceTarget })).output(TaskEntryInfoSchema),\n list: oc.output(v.array(TaskEntryInfoSchema)),\n add: oc\n .input(v.object({ name: v.string(), definition: ProcessDefinition }))\n .output(TaskEntryInfoSchema),\n remove: oc.input(v.object({ target: ResourceTarget })).output(TaskEntryInfoSchema),\n};\n\nexport const crons = {\n get: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n list: oc.output(v.array(CronProcessInfoSchema)),\n trigger: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n start: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n stop: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n};\n\nexport const api = {\n manager,\n processes,\n tasks,\n crons,\n};\n","import { implement } from \"@orpc/server\";\nimport {\n api,\n type RestartingProcessInfo,\n type CronProcessInfo,\n type TaskEntryInfo,\n type ManagerStatus,\n} from \"./contract.ts\";\nimport type { Manager } from \"../manager.ts\";\nimport type { RestartingProcess } from \"../restarting-process.ts\";\nimport type { CronProcess } from \"../cron-process.ts\";\n\nconst os = implement(api).$context<{ manager: Manager }>();\n\n// Helper to serialize a RestartingProcess to API response\nfunction serializeProcess(proc: RestartingProcess): RestartingProcessInfo {\n return {\n name: proc.name,\n state: proc.state,\n restarts: proc.restarts,\n };\n}\n\n// Helper to serialize a CronProcess to API response\nfunction serializeCron(cron: CronProcess): CronProcessInfo {\n return {\n name: cron.name,\n state: cron.state,\n runCount: cron.runCount,\n failCount: cron.failCount,\n nextRun: cron.nextRun?.toISOString() ?? null,\n };\n}\n\n// Manager handlers\nconst managerStatus = os.manager.status.handler(async ({ context }): Promise<ManagerStatus> => {\n const manager = context.manager;\n const taskList = manager.getTaskList();\n return {\n state: manager.state,\n processCount: manager.getRestartingProcesses().size,\n cronCount: manager.getCronProcesses().size,\n taskCount: taskList?.tasks.length ?? 0,\n };\n});\n\n// Processes handlers\nconst getProcess = os.processes.get.handler(async ({ input, context }) => {\n const proc = context.manager.getProcessByTarget(input.target);\n if (!proc) {\n throw new Error(`Process not found: ${input.target}`);\n }\n return serializeProcess(proc);\n});\n\nconst listProcesses = os.processes.list.handler(async ({ context }) => {\n const processes = Array.from(context.manager.getRestartingProcesses().values());\n return processes.map(serializeProcess);\n});\n\nconst addProcess = os.processes.add.handler(async ({ input, context }) => {\n const proc = await context.manager.addProcess(input.name, input.definition);\n return serializeProcess(proc);\n});\n\nconst startProcess = os.processes.start.handler(async ({ input, context }) => {\n const proc = await context.manager.startProcessByTarget(input.target);\n return serializeProcess(proc);\n});\n\nconst stopProcess = os.processes.stop.handler(async ({ input, context }) => {\n const proc = await context.manager.stopProcessByTarget(input.target);\n return serializeProcess(proc);\n});\n\nconst restartProcess = os.processes.restart.handler(async ({ input, context }) => {\n const proc = await context.manager.restartProcessByTarget(input.target, input.force);\n return serializeProcess(proc);\n});\n\nconst reloadProcess = os.processes.reload.handler(async ({ input, context }) => {\n const proc = await context.manager.reloadProcessByTarget(input.target, input.definition, {\n restartImmediately: input.restartImmediately,\n });\n return serializeProcess(proc);\n});\n\nconst removeProcess = os.processes.remove.handler(async ({ input, context }) => {\n await context.manager.removeProcessByTarget(input.target);\n return { success: true };\n});\n\n// Crons handlers\nconst getCron = os.crons.get.handler(async ({ input, context }) => {\n const cron = context.manager.getCronByTarget(input.target);\n if (!cron) {\n throw new Error(`Cron not found: ${input.target}`);\n }\n return serializeCron(cron);\n});\n\nconst listCrons = os.crons.list.handler(async ({ context }) => {\n const crons = Array.from(context.manager.getCronProcesses().values());\n return crons.map(serializeCron);\n});\n\nconst triggerCron = os.crons.trigger.handler(async ({ input, context }) => {\n const cron = await context.manager.triggerCronByTarget(input.target);\n return serializeCron(cron);\n});\n\nconst startCron = os.crons.start.handler(async ({ input, context }) => {\n const cron = context.manager.startCronByTarget(input.target);\n return serializeCron(cron);\n});\n\nconst stopCron = os.crons.stop.handler(async ({ input, context }) => {\n const cron = await context.manager.stopCronByTarget(input.target);\n return serializeCron(cron);\n});\n\n// Tasks handlers\nconst getTask = os.tasks.get.handler(async ({ input, context }) => {\n const task = context.manager.getTaskByTarget(input.target);\n if (!task) {\n throw new Error(`Task not found: ${input.target}`);\n }\n return task as TaskEntryInfo;\n});\n\nconst listTasks = os.tasks.list.handler(async ({ context }) => {\n const taskList = context.manager.getTaskList();\n if (!taskList) {\n return [];\n }\n return taskList.tasks.map((t) => ({\n id: t.id,\n state: t.state,\n processNames: t.processes.map((p) => p.name),\n })) as TaskEntryInfo[];\n});\n\nconst addTask = os.tasks.add.handler(async ({ input, context }) => {\n const task = context.manager.addTask(input.name, input.definition);\n return task as TaskEntryInfo;\n});\n\nconst removeTask = os.tasks.remove.handler(async ({ input, context }) => {\n const task = context.manager.removeTaskByTarget(input.target);\n return task as TaskEntryInfo;\n});\n\nexport const router = os.router({\n manager: {\n status: managerStatus,\n },\n processes: {\n add: addProcess,\n get: getProcess,\n list: listProcesses,\n start: startProcess,\n stop: stopProcess,\n restart: restartProcess,\n reload: reloadProcess,\n remove: removeProcess,\n },\n crons: {\n get: getCron,\n list: listCrons,\n trigger: triggerCron,\n start: startCron,\n stop: stopCron,\n },\n tasks: {\n get: getTask,\n list: listTasks,\n add: addTask,\n remove: removeTask,\n },\n});\n","import * as v from \"valibot\";\nimport { join } from \"node:path\";\nimport { cwd as getCwd } from \"node:process\";\nimport { mkdirSync } from \"node:fs\";\nimport { ProcessDefinition } from \"./lazy-process.ts\";\nimport type { Logger } from \"./logger.ts\";\nimport { TaskList, type NamedProcessDefinition } from \"./task-list.ts\";\nimport { CronProcess, CronProcessOptions } from \"./cron-process.ts\";\nimport { RestartingProcess, RestartingProcessOptions } from \"./restarting-process.ts\";\nimport { EnvManager, type EnvChangeEvent } from \"./env-manager.ts\";\n\nexport const HttpServerConfig = v.object({\n host: v.optional(v.string()),\n port: v.optional(v.number()),\n authToken: v.optional(v.string()),\n});\nexport type HttpServerConfig = v.InferOutput<typeof HttpServerConfig>;\n\nexport const CronProcessEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n options: CronProcessOptions,\n envFile: v.optional(v.string()),\n});\nexport type CronProcessEntry = v.InferOutput<typeof CronProcessEntry>;\n\nexport const EnvReloadDelay = v.union([v.number(), v.boolean(), v.literal(\"immediately\")]);\nexport type EnvReloadDelay = v.InferOutput<typeof EnvReloadDelay>;\n\nexport const RestartingProcessEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n options: v.optional(RestartingProcessOptions),\n envFile: v.optional(v.string()),\n envReloadDelay: v.optional(EnvReloadDelay),\n});\nexport type RestartingProcessEntry = v.InferOutput<typeof RestartingProcessEntry>;\n\nexport const TaskEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n envFile: v.optional(v.string()),\n});\nexport type TaskEntry = v.InferOutput<typeof TaskEntry>;\n\nexport const ManagerConfig = v.object({\n http: v.optional(HttpServerConfig),\n cwd: v.optional(v.string()),\n logDir: v.optional(v.string()),\n env: v.optional(v.record(v.string(), v.string())),\n envFile: v.optional(v.string()),\n tasks: v.optional(v.array(TaskEntry)),\n crons: v.optional(v.array(CronProcessEntry)),\n processes: v.optional(v.array(RestartingProcessEntry)),\n});\nexport type ManagerConfig = v.InferOutput<typeof ManagerConfig>;\n\nconst DEFAULT_RESTART_OPTIONS = {\n restartPolicy: \"always\" as const,\n};\nconst SHUTDOWN_TIMEOUT_MS = 15000;\n\n// Manager state\nexport type ManagerState =\n | \"idle\" // Not started\n | \"initializing\" // Running task list\n | \"running\" // All processes running\n | \"stopping\" // Stopping all processes\n | \"stopped\"; // Fully stopped\n\nexport class Manager {\n private config: ManagerConfig;\n private logger: Logger;\n private envManager: EnvManager;\n\n private _state: ManagerState = \"idle\";\n private taskList: TaskList | null = null;\n private cronProcesses: Map<string, CronProcess> = new Map();\n private restartingProcesses: Map<string, RestartingProcess> = new Map();\n private logDir: string;\n\n // Env reload tracking\n private processEnvReloadConfig: Map<string, EnvReloadDelay> = new Map();\n private envReloadTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private envChangeUnsubscribe: (() => void) | null = null;\n\n // Shutdown handling\n private signalHandlers: Map<NodeJS.Signals, () => void> = new Map();\n private shutdownPromise: Promise<void> | null = null;\n private isShuttingDown: boolean = false;\n\n constructor(config: ManagerConfig, logger: Logger) {\n const cwd = config.cwd ?? getCwd();\n this.config = config;\n this.logger = logger;\n this.logDir = config.logDir ?? join(cwd, \"logs\");\n this.ensureLogDirs();\n\n // Validate that all names are globally unique across tasks, crons, and processes\n this.validateConfigNames();\n\n const customEnvFiles: Record<string, string> = {};\n for (const task of config.tasks ?? []) {\n if (task.envFile) customEnvFiles[task.name] = task.envFile;\n }\n for (const cron of config.crons ?? []) {\n if (cron.envFile) customEnvFiles[cron.name] = cron.envFile;\n }\n for (const proc of config.processes ?? []) {\n if (proc.envFile) customEnvFiles[proc.name] = proc.envFile;\n }\n\n this.envManager = new EnvManager({\n cwd,\n globalEnvFile: config.envFile,\n customEnvFiles,\n });\n\n this.envChangeUnsubscribe = this.envManager.onChange((event) => this.handleEnvChange(event));\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => this.handleSignal(signal);\n this.signalHandlers.set(signal, handler);\n process.on(signal, handler);\n }\n }\n\n private validateConfigNames(): void {\n const allNames: { name: string; type: string }[] = [];\n\n for (const task of this.config.tasks ?? []) {\n allNames.push({ name: task.name, type: \"task\" });\n }\n for (const cron of this.config.crons ?? []) {\n allNames.push({ name: cron.name, type: \"cron\" });\n }\n for (const proc of this.config.processes ?? []) {\n allNames.push({ name: proc.name, type: \"process\" });\n }\n\n const seen = new Map<string, string>();\n for (const { name, type } of allNames) {\n const existingType = seen.get(name);\n if (existingType) {\n throw new Error(\n `Duplicate name \"${name}\" found: already used as ${existingType}, cannot use as ${type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n seen.set(name, type);\n }\n }\n\n /**\n * Check if a name is already used by any task, cron, or process\n */\n private isNameUsed(name: string): { used: boolean; type?: string } {\n for (const task of this.config.tasks ?? []) {\n if (task.name === name) return { used: true, type: \"task\" };\n }\n\n if (this.taskList) {\n for (const task of this.taskList.tasks) {\n for (const proc of task.processes) {\n if (proc.name === name) return { used: true, type: \"task\" };\n }\n }\n }\n\n if (this.cronProcesses.has(name)) return { used: true, type: \"cron\" };\n for (const cron of this.config.crons ?? []) {\n if (cron.name === name) return { used: true, type: \"cron\" };\n }\n\n if (this.restartingProcesses.has(name)) return { used: true, type: \"process\" };\n for (const proc of this.config.processes ?? []) {\n if (proc.name === name) return { used: true, type: \"process\" };\n }\n\n return { used: false };\n }\n\n private applyDefaults(processName: string, definition: ProcessDefinition): ProcessDefinition {\n const envVarsFromManager = this.envManager.getEnvVars(processName);\n\n return {\n ...definition,\n cwd: definition.cwd ?? this.config.cwd,\n env: {\n ...envVarsFromManager,\n ...this.config.env,\n ...definition.env,\n },\n };\n }\n\n private processLogFile(name: string): string {\n return join(this.logDir, \"process\", `${name}.log`);\n }\n\n private taskLogFile(name: string): string {\n return join(this.logDir, \"tasks\", `${name}.log`);\n }\n\n private cronLogFile(name: string): string {\n return join(this.logDir, \"cron\", `${name}.log`);\n }\n\n private ensureLogDirs(): void {\n mkdirSync(this.logDir, { recursive: true });\n mkdirSync(join(this.logDir, \"process\"), { recursive: true });\n mkdirSync(join(this.logDir, \"tasks\"), { recursive: true });\n mkdirSync(join(this.logDir, \"cron\"), { recursive: true });\n }\n\n /**\n * Handle env file changes\n */\n private handleEnvChange(event: EnvChangeEvent): void {\n if (this._state !== \"running\") return;\n\n if (event.type === \"global\") {\n this.logger.info(\"Global env file changed, reloading all processes as per their policies\");\n for (const processName of this.restartingProcesses.keys()) {\n const reloadDelay = this.processEnvReloadConfig.get(processName);\n if (reloadDelay === false) continue;\n this.scheduleProcessReload(processName, reloadDelay);\n }\n return;\n }\n\n if (event.type === \"process\") {\n const processName = event.key;\n const reloadDelay = this.processEnvReloadConfig.get(processName);\n if (reloadDelay === false) return;\n this.scheduleProcessReload(processName, reloadDelay);\n }\n }\n\n /**\n * Schedule a process reload with debouncing\n */\n private scheduleProcessReload(processName: string, reloadDelay?: EnvReloadDelay): void {\n // Clear existing timer if any\n const existingTimer = this.envReloadTimers.get(processName);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Determine delay in ms\n let delayMs: number;\n if (reloadDelay === false) {\n return; // Should not happen, but guard anyway\n } else if (reloadDelay === true || reloadDelay === \"immediately\") {\n delayMs = 0;\n } else if (typeof reloadDelay === \"number\") {\n delayMs = reloadDelay;\n } else {\n delayMs = 5000; // Default 5 seconds\n }\n\n this.logger.info(`Scheduling reload for process \"${processName}\" in ${delayMs}ms`);\n\n const timer = setTimeout(async () => {\n await this.reloadProcessEnv(processName);\n this.envReloadTimers.delete(processName);\n }, delayMs);\n\n this.envReloadTimers.set(processName, timer);\n }\n\n /**\n * Reload a process with updated env vars\n */\n private async reloadProcessEnv(processName: string): Promise<void> {\n const proc = this.restartingProcesses.get(processName);\n if (!proc) {\n this.logger.warn(`Process \"${processName}\" not found for env reload`);\n return;\n }\n\n this.logger.info(`Reloading process \"${processName}\" due to env change`);\n\n // Get the original config for this process\n const processConfig = this.config.processes?.find((p) => p.name === processName);\n if (!processConfig) {\n this.logger.warn(`Process config for \"${processName}\" not found`);\n return;\n }\n\n const updatedDefinition = this.applyDefaults(processName, processConfig.definition);\n await proc.reload(updatedDefinition, true);\n }\n\n get state(): ManagerState {\n return this._state;\n }\n\n /**\n * Get all cron processes (read-only access)\n */\n getCronProcesses(): ReadonlyMap<string, CronProcess> {\n return this.cronProcesses;\n }\n\n /**\n * Get a specific cron process by name\n */\n getCronProcess(name: string): CronProcess | undefined {\n return this.cronProcesses.get(name);\n }\n\n /**\n * Get all restarting processes (read-only access)\n */\n getRestartingProcesses(): ReadonlyMap<string, RestartingProcess> {\n return this.restartingProcesses;\n }\n\n /**\n * Get a specific restarting process by name\n */\n getRestartingProcess(name: string): RestartingProcess | undefined {\n return this.restartingProcesses.get(name);\n }\n\n /**\n * Get the task list (read-only access)\n */\n getTaskList(): TaskList | null {\n return this.taskList;\n }\n\n /**\n * Get a restarting process by name or index\n */\n getProcessByTarget(target: string | number): RestartingProcess | undefined {\n if (typeof target === \"string\") {\n return this.restartingProcesses.get(target);\n }\n const entries = Array.from(this.restartingProcesses.values());\n return entries[target];\n }\n\n /**\n * Get a cron process by name or index\n */\n getCronByTarget(target: string | number): CronProcess | undefined {\n if (typeof target === \"string\") {\n return this.cronProcesses.get(target);\n }\n const entries = Array.from(this.cronProcesses.values());\n return entries[target];\n }\n\n /**\n * Get a task by id or index\n */\n getTaskByTarget(\n target: string | number,\n ): { id: string; state: string; processNames: string[] } | undefined {\n if (!this.taskList) return undefined;\n const tasks = this.taskList.tasks;\n\n if (typeof target === \"string\") {\n const task = tasks.find((t) => t.id === target);\n if (!task) return undefined;\n return {\n id: task.id,\n state: task.state,\n processNames: task.processes.map((p) => p.name),\n };\n }\n\n const task = tasks[target];\n if (!task) return undefined;\n return {\n id: task.id,\n state: task.state,\n processNames: task.processes.map((p) => p.name),\n };\n }\n\n /**\n * Start a restarting process by target\n */\n async startProcessByTarget(target: string | number): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n proc.start();\n return proc;\n }\n\n /**\n * Stop a restarting process by target\n */\n async stopProcessByTarget(target: string | number, timeout?: number): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n await proc.stop(timeout);\n return proc;\n }\n\n /**\n * Restart a restarting process by target\n */\n async restartProcessByTarget(\n target: string | number,\n force: boolean = false,\n ): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n await proc.restart(force);\n return proc;\n }\n\n /**\n * Reload a restarting process with new definition\n */\n async reloadProcessByTarget(\n target: string | number,\n newDefinition: ProcessDefinition,\n options?: {\n restartImmediately?: boolean;\n updateOptions?: Partial<RestartingProcessOptions>;\n },\n ): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n // Apply global defaults to new definition\n const definitionWithDefaults = this.applyDefaults(proc.name, newDefinition);\n\n // Update options if provided\n if (options?.updateOptions) {\n proc.updateOptions(options.updateOptions);\n }\n\n // Reload with new definition\n await proc.reload(definitionWithDefaults, options?.restartImmediately ?? true);\n this.logger.info(`Reloaded process: ${proc.name}`);\n return proc;\n }\n\n /**\n * Remove a restarting process by target\n */\n async removeProcessByTarget(target: string | number, timeout?: number): Promise<void> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n // Stop the process first\n await proc.stop(timeout);\n\n // Remove from the map\n this.restartingProcesses.delete(proc.name);\n this.logger.info(`Removed process: ${proc.name}`);\n }\n\n /**\n * Add a task to the task list\n * Creates the task list if it doesn't exist and starts it\n */\n addTask(\n name: string,\n definition: ProcessDefinition,\n envFile?: string,\n ): { id: string; state: string; processNames: string[] } {\n // Check for global name uniqueness\n const nameCheck = this.isNameUsed(name);\n if (nameCheck.used) {\n throw new Error(\n `Name \"${name}\" is already used as ${nameCheck.type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n\n // Register custom env file if provided\n if (envFile) {\n this.envManager.registerFile(name, envFile);\n }\n\n if (!this.taskList) {\n const taskListLogger = this.logger.child(\"tasks\", {\n logFile: this.taskLogFile(\"tasks\"),\n });\n this.taskList = new TaskList(\"runtime\", taskListLogger, undefined, (processName) => {\n return this.taskLogFile(processName);\n });\n }\n\n const namedProcess: NamedProcessDefinition = {\n name,\n process: this.applyDefaults(name, definition),\n };\n const id = this.taskList.addTask(namedProcess);\n\n // Start the task list if it's idle so the task runs immediately\n if (this.taskList.state === \"idle\") {\n this.taskList.start();\n }\n\n return {\n id,\n state: \"pending\",\n processNames: [name],\n };\n }\n\n removeTaskByTarget(target: string | number): {\n id: string;\n state: string;\n processNames: string[];\n } {\n if (!this.taskList) {\n throw new Error(`Task list not initialized`);\n }\n\n const removed = this.taskList.removeTaskByTarget(target);\n return {\n id: removed.id,\n state: removed.state,\n processNames: removed.processes.map((p) => p.name),\n };\n }\n\n /**\n * Add a restarting process at runtime\n */\n async addProcess(\n name: string,\n definition: ProcessDefinition,\n options?: RestartingProcessOptions,\n envReloadDelay?: EnvReloadDelay,\n envFile?: string,\n ): Promise<RestartingProcess> {\n // Check for global name uniqueness\n const nameCheck = this.isNameUsed(name);\n if (nameCheck.used) {\n throw new Error(\n `Name \"${name}\" is already used as ${nameCheck.type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n\n // Register custom env file if provided\n if (envFile) {\n this.envManager.registerFile(name, envFile);\n }\n\n const processLogger = this.logger.child(name, { logFile: this.processLogFile(name) });\n const restartingProcess = new RestartingProcess(\n name,\n this.applyDefaults(name, definition),\n options ?? DEFAULT_RESTART_OPTIONS,\n processLogger,\n );\n this.restartingProcesses.set(name, restartingProcess);\n\n restartingProcess.start();\n\n // Track env reload config for this process\n this.processEnvReloadConfig.set(name, envReloadDelay ?? 5000);\n\n this.logger.info(`Added and started restarting process: ${name}`);\n return restartingProcess;\n }\n\n /**\n * Trigger a cron process by target\n */\n async triggerCronByTarget(target: string | number): Promise<CronProcess> {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n await cron.trigger();\n return cron;\n }\n\n /**\n * Start a cron process by target\n */\n startCronByTarget(target: string | number): CronProcess {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n cron.start();\n return cron;\n }\n\n /**\n * Stop a cron process by target\n */\n async stopCronByTarget(target: string | number, timeout?: number): Promise<CronProcess> {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n await cron.stop(timeout);\n return cron;\n }\n\n /**\n * Start the manager:\n * 1. Run task list (if configured) and wait for completion\n * 2. Create and start all cron/restarting processes\n */\n async start(): Promise<void> {\n if (this._state !== \"idle\" && this._state !== \"stopped\") {\n throw new Error(`Manager is already ${this._state}`);\n }\n\n this.logger.info(`Starting manager`);\n\n // Phase 1: Run initialization tasks\n if (this.config.tasks && this.config.tasks.length > 0) {\n this._state = \"initializing\";\n this.logger.info(`Running initialization tasks`);\n\n const taskListLogger = this.logger.child(\"tasks\");\n const tasksWithDefaults = this.config.tasks.map((task) => ({\n name: task.name,\n process: this.applyDefaults(task.name, task.definition),\n }));\n this.taskList = new TaskList(\"init\", taskListLogger, tasksWithDefaults, (processName) => {\n return this.taskLogFile(processName);\n });\n\n this.taskList.start();\n await this.taskList.waitUntilIdle();\n\n // Check if any tasks failed\n const failedTasks = this.taskList.tasks.filter((t) => t.state === \"failed\");\n if (failedTasks.length > 0) {\n this._state = \"stopped\";\n const failedNames = failedTasks.map((t) => t.id).join(\", \");\n throw new Error(`Initialization failed: tasks [${failedNames}] failed`);\n }\n\n this.logger.info(`Initialization tasks completed`);\n }\n\n // Phase 2: Create and start cron processes\n if (this.config.crons) {\n for (const entry of this.config.crons) {\n const processLogger = this.logger.child(entry.name, {\n logFile: this.cronLogFile(entry.name),\n });\n const cronProcess = new CronProcess(\n entry.name,\n this.applyDefaults(entry.name, entry.definition),\n entry.options,\n processLogger,\n );\n this.cronProcesses.set(entry.name, cronProcess);\n cronProcess.start();\n this.logger.info(`Started cron process: ${entry.name}`);\n }\n }\n\n // Phase 3: Create and start restarting processes\n if (this.config.processes) {\n for (const entry of this.config.processes) {\n const processLogger = this.logger.child(entry.name, {\n logFile: this.processLogFile(entry.name),\n });\n const restartingProcess = new RestartingProcess(\n entry.name,\n this.applyDefaults(entry.name, entry.definition),\n entry.options ?? DEFAULT_RESTART_OPTIONS,\n processLogger,\n );\n this.restartingProcesses.set(entry.name, restartingProcess);\n\n restartingProcess.start();\n\n // Track env reload config for this process\n this.processEnvReloadConfig.set(\n entry.name,\n entry.envReloadDelay ?? 5000, // Default to 5000ms\n );\n\n this.logger.info(`Started restarting process: ${entry.name}`);\n }\n }\n\n this._state = \"running\";\n this.logger.info(\n `Manager started with ${this.cronProcesses.size} cron process(es) and ${this.restartingProcesses.size} restarting process(es)`,\n );\n }\n\n /**\n * Stop all managed processes\n */\n async stop(timeout?: number): Promise<void> {\n if (this._state === \"idle\" || this._state === \"stopped\") {\n this._state = \"stopped\";\n return;\n }\n\n this._state = \"stopping\";\n this.logger.info(`Stopping manager`);\n\n // Clear all env reload timers\n for (const timer of this.envReloadTimers.values()) {\n clearTimeout(timer);\n }\n this.envReloadTimers.clear();\n\n // Unsubscribe from env changes\n if (this.envChangeUnsubscribe) {\n this.envChangeUnsubscribe();\n this.envChangeUnsubscribe = null;\n }\n\n this.envManager.close();\n\n for (const [signal, handler] of this.signalHandlers) {\n process.off(signal, handler);\n }\n this.signalHandlers.clear();\n\n // Stop task list if still running\n if (this.taskList) {\n await this.taskList.stop(timeout);\n }\n\n // Stop all cron processes in parallel\n const cronStopPromises = Array.from(this.cronProcesses.values()).map((p) => p.stop(timeout));\n\n // Stop all restarting processes in parallel\n const restartingStopPromises = Array.from(this.restartingProcesses.values()).map((p) =>\n p.stop(timeout),\n );\n\n await Promise.all([...cronStopPromises, ...restartingStopPromises]);\n\n this._state = \"stopped\";\n this.logger.info(`Manager stopped`);\n }\n\n /**\n * Wait for shutdown to complete (useful for keeping process alive)\n * Resolves when the manager has fully stopped\n */\n async waitForShutdown(): Promise<void> {\n // If already stopped, return immediately\n if (this._state === \"stopped\") {\n return;\n }\n\n // If shutdown is in progress, wait for it\n if (this.shutdownPromise) {\n await this.shutdownPromise;\n return;\n }\n\n // Wait for state to become stopped\n return new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (this._state === \"stopped\") {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n });\n }\n\n /**\n * Trigger graceful shutdown programmatically\n */\n async shutdown(): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn(`Shutdown already in progress`);\n if (this.shutdownPromise) {\n await this.shutdownPromise;\n }\n return;\n }\n\n this.isShuttingDown = true;\n this.logger.info(`Initiating graceful shutdown (timeout: ${SHUTDOWN_TIMEOUT_MS}ms)`);\n\n this.shutdownPromise = this.performShutdown();\n await this.shutdownPromise;\n }\n\n private handleSignal(signal: NodeJS.Signals): void {\n this.logger.info(`Received ${signal}, initiating graceful shutdown...`);\n\n // Prevent handling multiple signals\n if (this.isShuttingDown) {\n this.logger.warn(`Shutdown already in progress, ignoring ${signal}`);\n return;\n }\n\n this.isShuttingDown = true;\n this.shutdownPromise = this.performShutdown();\n\n this.shutdownPromise\n .then(() => {\n this.logger.info(`Exiting with code 0`);\n process.exit();\n })\n .catch((err) => {\n this.logger.error(`Shutdown error:`, err);\n process.exit(1);\n });\n }\n\n private async performShutdown(): Promise<void> {\n // Create a timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Shutdown timed out after ${SHUTDOWN_TIMEOUT_MS}ms`));\n }, SHUTDOWN_TIMEOUT_MS);\n });\n\n try {\n // Race between graceful stop and timeout\n await Promise.race([this.stop(SHUTDOWN_TIMEOUT_MS), timeoutPromise]);\n this.logger.info(`Graceful shutdown completed`);\n } catch (err) {\n this.logger.error(`Shutdown error:`, err);\n // Force stop on timeout\n this._state = \"stopped\";\n throw err;\n } finally {\n this.isShuttingDown = false;\n this.shutdownPromise = null;\n }\n }\n}\n","export async function tImport(path: string) {\n try {\n // Try to import the file as a module with native import\n return await import(path);\n } catch {\n // If native import fails, use tsx's tsImport function\n const { tsImport } = await import(\"tsx/esm/api\");\n return await tsImport(path, { parentURL: import.meta.url });\n }\n}\n","","#!/usr/bin/env node\nimport { createServer } from \"node:http\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolve } from \"node:path\";\nimport { RPCHandler } from \"@orpc/server/node\";\nimport { onError } from \"@orpc/server\";\nimport * as v from \"valibot\";\nimport { router } from \"./api/server.ts\";\nimport { Manager, ManagerConfig } from \"./manager.ts\";\nimport { logger } from \"./logger.ts\";\nimport Table from \"cli-table3\";\nimport { createClient, type Client } from \"./api/client.ts\";\nimport { ProcessDefinition } from \"./lazy-process.ts\";\nimport { tImport } from \"./utils.ts\";\nimport { os as osBase } from \"@orpc/server\";\nimport { createCli, type TrpcCliMeta } from \"trpc-cli\";\nimport { format } from \"node:util\";\nimport pkg from \"../package.json\" assert { type: \"json\" };\n\nconst os = osBase.$context<{ client: Client }>().$meta<TrpcCliMeta>({});\n\nconst ResourceTarget = v.union([v.string(), v.number()]);\n\n// Helper functions for table formatting (used multiple times)\nfunction printProcessTable(proc: { name: string; state: string; restarts: number }) {\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n}\n\nfunction printTaskTable(task: { id: string; state: string; processNames: string[] }) {\n const table = new Table({ head: [\"Id\", \"State\", \"Processes\"] });\n table.push([task.id, task.state, task.processNames.join(\", \")]);\n console.log(table.toString());\n}\n\nfunction printCronTable(cron: {\n name: string;\n state: string;\n runCount: number;\n failCount: number;\n nextRun: string | null;\n}) {\n const table = new Table({ head: [\"Name\", \"State\", \"Runs\", \"Fails\", \"Next Run\"] });\n table.push([cron.name, cron.state, cron.runCount, cron.failCount, cron.nextRun ?? \"-\"]);\n console.log(table.toString());\n}\n\nconst cliRouter = os.router({\n init: osBase\n .meta({\n description: \"Initialize and run the process manager with config file\",\n aliases: { options: { config: \"c\" } },\n })\n .input(\n v.object({\n config: v.optional(\n v.pipe(v.string(), v.description(\"Path to config file\")),\n \"pidnap.config.ts\",\n ),\n }),\n )\n .handler(async ({ input }) => {\n process.title = \"pidnap\";\n const initLogger = logger({ name: \"pidnap\" });\n try {\n // Resolve config file path\n const configPath = resolve(process.cwd(), input.config);\n const configUrl = pathToFileURL(configPath).href;\n\n // Import the config file\n const configModule = await tImport(configUrl);\n const rawConfig =\n configModule.default.default || configModule.default || configModule.config || {};\n\n // Parse and validate the config with Valibot\n const config = v.parse(ManagerConfig, rawConfig);\n\n // Extract HTTP config with defaults\n const host = config.http?.host ?? \"127.0.0.1\";\n const port = config.http?.port ?? 9876;\n const authToken = config.http?.authToken;\n\n // Create manager with config\n const logDir = config.logDir ?? resolve(process.cwd(), \"logs\");\n const managerLogger = logger({ name: \"pidnap\", logFile: resolve(logDir, \"pidnap.log\") });\n const manager = new Manager(config, managerLogger);\n\n // Setup ORPC server with optional auth token middleware\n const handler = new RPCHandler(router, {\n interceptors: [\n onError((error) => {\n managerLogger.error(error);\n }),\n ],\n });\n\n const server = createServer(async (req, res) => {\n // Check auth token if configured\n if (authToken) {\n const providedToken = req.headers[\"authorization\"]?.replace(\"Bearer \", \"\");\n if (providedToken !== authToken) {\n res.statusCode = 401;\n res.end(\"Unauthorized\");\n return;\n }\n }\n\n const { matched } = await handler.handle(req, res, {\n prefix: \"/rpc\",\n context: { manager },\n });\n if (matched) return;\n res.statusCode = 404;\n res.end(\"Not found\\n\");\n });\n\n server.listen(port, host, async () => {\n managerLogger.info(`pidnap RPC server running on http://${host}:${port}`);\n if (authToken) {\n managerLogger.info(\"Auth token required for API access\");\n }\n\n try {\n await manager.start();\n } catch (err) {\n managerLogger.error(\"Failed to start manager:\", err);\n server.close();\n process.exit(1);\n }\n });\n\n // Wait for shutdown\n await manager.waitForShutdown();\n\n // Close server on shutdown\n server.close();\n } catch (error) {\n initLogger.error(\"Failed to start pidnap:\", error);\n process.exit(1);\n }\n }),\n\n status: os\n .meta({ description: \"Show manager status\" })\n .handler(async ({ context: { client } }) => {\n const status = await client.manager.status();\n const table = new Table({ head: [\"State\", \"Processes\", \"Crons\", \"Tasks\"] });\n table.push([status.state, status.processCount, status.cronCount, status.taskCount]);\n console.log(table.toString());\n }),\n\n process: os.router({\n list: os\n .meta({ description: \"List restarting processes\" })\n .handler(async ({ context: { client } }) => {\n const processes = await client.processes.list();\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n for (const proc of processes) {\n table.push([proc.name, proc.state, proc.restarts]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({\n description: \"Get a restarting process by name or index\",\n aliases: { options: { target: \"t\" } },\n })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.get({ target: input.target });\n printProcessTable(proc);\n }),\n add: os\n .meta({\n description: \"Add a restarting process\",\n aliases: { options: { name: \"n\", definition: \"d\" } },\n })\n .input(\n v.object({\n name: v.pipe(v.string(), v.description(\"Process name\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.add({ name: input.name, definition: input.definition });\n printProcessTable(proc);\n }),\n start: os\n .meta({ description: \"Start a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.start({ target: input.target });\n printProcessTable(proc);\n }),\n stop: os\n .meta({ description: \"Stop a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.stop({ target: input.target });\n printProcessTable(proc);\n }),\n restart: os\n .meta({\n description: \"Restart a restarting process\",\n aliases: { options: { target: \"t\", force: \"f\" } },\n })\n .input(\n v.object({\n target: v.pipe(ResourceTarget, v.description(\"Process name or index\")),\n force: v.optional(v.pipe(v.boolean(), v.description(\"Force restart\"))),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.restart({ target: input.target, force: input.force });\n printProcessTable(proc);\n }),\n reload: os\n .meta({\n description: \"Reload a restarting process definition\",\n aliases: { options: { target: \"t\", definition: \"d\", restartImmediately: \"r\" } },\n })\n .input(\n v.object({\n target: v.pipe(ResourceTarget, v.description(\"Process name or index\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n restartImmediately: v.optional(\n v.pipe(v.boolean(), v.description(\"Restart immediately after reload\")),\n ),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.reload({\n target: input.target,\n definition: input.definition,\n restartImmediately: input.restartImmediately,\n });\n printProcessTable(proc);\n }),\n remove: os\n .meta({ description: \"Remove a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n await client.processes.remove({ target: input.target });\n console.log(\"Process removed\");\n }),\n }),\n\n // Tasks\n tasks: os.router({\n list: os.meta({ description: \"List tasks\" }).handler(async ({ context: { client } }) => {\n const tasks = await client.tasks.list();\n const table = new Table({ head: [\"Id\", \"State\", \"Processes\"] });\n for (const task of tasks) {\n table.push([task.id, task.state, task.processNames.join(\", \")]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({ description: \"Get a task by id or index\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Task id or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.get({ target: input.target });\n printTaskTable(task);\n }),\n add: os\n .meta({ description: \"Add a task\", aliases: { options: { name: \"n\", definition: \"d\" } } })\n .input(\n v.object({\n name: v.pipe(v.string(), v.description(\"Task name\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.add({ name: input.name, definition: input.definition });\n printTaskTable(task);\n }),\n remove: os\n .meta({ description: \"Remove a task by id or index\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Task id or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.remove({ target: input.target });\n printTaskTable(task);\n }),\n }),\n\n // Crons\n crons: os.router({\n list: os\n .meta({ description: \"List cron processes\" })\n .handler(async ({ context: { client } }) => {\n const crons = await client.crons.list();\n const table = new Table({ head: [\"Name\", \"State\", \"Runs\", \"Fails\", \"Next Run\"] });\n for (const cron of crons) {\n table.push([cron.name, cron.state, cron.runCount, cron.failCount, cron.nextRun ?? \"-\"]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({\n description: \"Get a cron process by name or index\",\n aliases: { options: { target: \"t\" } },\n })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.get({ target: input.target });\n printCronTable(cron);\n }),\n trigger: os\n .meta({ description: \"Trigger a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.trigger({ target: input.target });\n printCronTable(cron);\n }),\n start: os\n .meta({ description: \"Start a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.start({ target: input.target });\n printCronTable(cron);\n }),\n stop: os\n .meta({ description: \"Stop a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.stop({ target: input.target });\n printCronTable(cron);\n }),\n }),\n});\n\nconst client = createClient();\nconst cli = createCli({\n name: \"pidnap\",\n version: pkg.version,\n router: cliRouter,\n context: { client },\n});\n\ncli.run({\n formatError(error: any) {\n if (error?.cause?.code === \"ECONNREFUSED\") {\n return (\n `Failed to connect to RPC server, are you sure the server is running? If the Server is running of different url, use PIDNAP_RPC_URL environment variable to set it.\\n` +\n format(error)\n );\n }\n return format(error);\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["oc","ocBase","ResourceTarget","os","cwd","getCwd","os","osBase","pkg.version"],"sources":["../src/api/contract.ts","../src/api/server.ts","../src/manager.ts","../src/utils.ts","../package.json","../src/cli.ts"],"sourcesContent":["import { oc as ocBase } from \"@orpc/contract\";\nimport * as v from \"valibot\";\nimport { ProcessDefinition } from \"../lazy-process.ts\";\nimport { RestartingProcessState } from \"../restarting-process.ts\";\nimport { CronProcessState } from \"../cron-process.ts\";\nimport { TaskStateSchema } from \"../task-list.ts\";\n\nconst oc = ocBase.$input(v.void());\n\n// Resource target (name or index)\nconst ResourceTarget = v.union([v.string(), v.number()]);\n\n// Manager state schema\nexport const ManagerStateSchema = v.picklist([\n \"idle\",\n \"initializing\",\n \"running\",\n \"stopping\",\n \"stopped\",\n]);\n\nexport type ManagerState = v.InferOutput<typeof ManagerStateSchema>;\n\n// Manager status response\nexport const ManagerStatusSchema = v.object({\n state: ManagerStateSchema,\n processCount: v.number(),\n cronCount: v.number(),\n taskCount: v.number(),\n});\n\nexport type ManagerStatus = v.InferOutput<typeof ManagerStatusSchema>;\n\n// API response schemas\nexport const RestartingProcessInfoSchema = v.object({\n name: v.string(),\n state: RestartingProcessState,\n restarts: v.number(),\n});\n\nexport type RestartingProcessInfo = v.InferOutput<typeof RestartingProcessInfoSchema>;\n\nexport const CronProcessInfoSchema = v.object({\n name: v.string(),\n state: CronProcessState,\n runCount: v.number(),\n failCount: v.number(),\n nextRun: v.nullable(v.string()), // ISO date string\n});\n\nexport type CronProcessInfo = v.InferOutput<typeof CronProcessInfoSchema>;\n\nexport const TaskEntryInfoSchema = v.object({\n id: v.string(),\n state: TaskStateSchema,\n processNames: v.array(v.string()),\n});\n\nexport type TaskEntryInfo = v.InferOutput<typeof TaskEntryInfoSchema>;\n\n// API contract\nexport const manager = {\n status: oc.output(ManagerStatusSchema),\n};\n\nexport const processes = {\n get: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n list: oc.output(v.array(RestartingProcessInfoSchema)),\n add: oc\n .input(v.object({ name: v.string(), definition: ProcessDefinition }))\n .output(RestartingProcessInfoSchema),\n start: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n stop: oc.input(v.object({ target: ResourceTarget })).output(RestartingProcessInfoSchema),\n restart: oc\n .input(v.object({ target: ResourceTarget, force: v.optional(v.boolean()) }))\n .output(RestartingProcessInfoSchema),\n reload: oc\n .input(\n v.object({\n target: ResourceTarget,\n definition: ProcessDefinition,\n restartImmediately: v.optional(v.boolean()),\n }),\n )\n .output(RestartingProcessInfoSchema),\n remove: oc.input(v.object({ target: ResourceTarget })).output(v.object({ success: v.boolean() })),\n};\n\nexport const tasks = {\n get: oc.input(v.object({ target: ResourceTarget })).output(TaskEntryInfoSchema),\n list: oc.output(v.array(TaskEntryInfoSchema)),\n add: oc\n .input(v.object({ name: v.string(), definition: ProcessDefinition }))\n .output(TaskEntryInfoSchema),\n remove: oc.input(v.object({ target: ResourceTarget })).output(TaskEntryInfoSchema),\n};\n\nexport const crons = {\n get: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n list: oc.output(v.array(CronProcessInfoSchema)),\n trigger: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n start: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n stop: oc.input(v.object({ target: ResourceTarget })).output(CronProcessInfoSchema),\n};\n\nexport const api = {\n manager,\n processes,\n tasks,\n crons,\n};\n","import { implement } from \"@orpc/server\";\nimport {\n api,\n type RestartingProcessInfo,\n type CronProcessInfo,\n type TaskEntryInfo,\n type ManagerStatus,\n} from \"./contract.ts\";\nimport type { Manager } from \"../manager.ts\";\nimport type { RestartingProcess } from \"../restarting-process.ts\";\nimport type { CronProcess } from \"../cron-process.ts\";\n\nconst os = implement(api).$context<{ manager: Manager }>();\n\n// Helper to serialize a RestartingProcess to API response\nfunction serializeProcess(proc: RestartingProcess): RestartingProcessInfo {\n return {\n name: proc.name,\n state: proc.state,\n restarts: proc.restarts,\n };\n}\n\n// Helper to serialize a CronProcess to API response\nfunction serializeCron(cron: CronProcess): CronProcessInfo {\n return {\n name: cron.name,\n state: cron.state,\n runCount: cron.runCount,\n failCount: cron.failCount,\n nextRun: cron.nextRun?.toISOString() ?? null,\n };\n}\n\n// Manager handlers\nconst managerStatus = os.manager.status.handler(async ({ context }): Promise<ManagerStatus> => {\n const manager = context.manager;\n const taskList = manager.getTaskList();\n return {\n state: manager.state,\n processCount: manager.getRestartingProcesses().size,\n cronCount: manager.getCronProcesses().size,\n taskCount: taskList?.tasks.length ?? 0,\n };\n});\n\n// Processes handlers\nconst getProcess = os.processes.get.handler(async ({ input, context }) => {\n const proc = context.manager.getProcessByTarget(input.target);\n if (!proc) {\n throw new Error(`Process not found: ${input.target}`);\n }\n return serializeProcess(proc);\n});\n\nconst listProcesses = os.processes.list.handler(async ({ context }) => {\n const processes = Array.from(context.manager.getRestartingProcesses().values());\n return processes.map(serializeProcess);\n});\n\nconst addProcess = os.processes.add.handler(async ({ input, context }) => {\n const proc = await context.manager.addProcess(input.name, input.definition);\n return serializeProcess(proc);\n});\n\nconst startProcess = os.processes.start.handler(async ({ input, context }) => {\n const proc = await context.manager.startProcessByTarget(input.target);\n return serializeProcess(proc);\n});\n\nconst stopProcess = os.processes.stop.handler(async ({ input, context }) => {\n const proc = await context.manager.stopProcessByTarget(input.target);\n return serializeProcess(proc);\n});\n\nconst restartProcess = os.processes.restart.handler(async ({ input, context }) => {\n const proc = await context.manager.restartProcessByTarget(input.target, input.force);\n return serializeProcess(proc);\n});\n\nconst reloadProcess = os.processes.reload.handler(async ({ input, context }) => {\n const proc = await context.manager.reloadProcessByTarget(input.target, input.definition, {\n restartImmediately: input.restartImmediately,\n });\n return serializeProcess(proc);\n});\n\nconst removeProcess = os.processes.remove.handler(async ({ input, context }) => {\n await context.manager.removeProcessByTarget(input.target);\n return { success: true };\n});\n\n// Crons handlers\nconst getCron = os.crons.get.handler(async ({ input, context }) => {\n const cron = context.manager.getCronByTarget(input.target);\n if (!cron) {\n throw new Error(`Cron not found: ${input.target}`);\n }\n return serializeCron(cron);\n});\n\nconst listCrons = os.crons.list.handler(async ({ context }) => {\n const crons = Array.from(context.manager.getCronProcesses().values());\n return crons.map(serializeCron);\n});\n\nconst triggerCron = os.crons.trigger.handler(async ({ input, context }) => {\n const cron = await context.manager.triggerCronByTarget(input.target);\n return serializeCron(cron);\n});\n\nconst startCron = os.crons.start.handler(async ({ input, context }) => {\n const cron = context.manager.startCronByTarget(input.target);\n return serializeCron(cron);\n});\n\nconst stopCron = os.crons.stop.handler(async ({ input, context }) => {\n const cron = await context.manager.stopCronByTarget(input.target);\n return serializeCron(cron);\n});\n\n// Tasks handlers\nconst getTask = os.tasks.get.handler(async ({ input, context }) => {\n const task = context.manager.getTaskByTarget(input.target);\n if (!task) {\n throw new Error(`Task not found: ${input.target}`);\n }\n return task as TaskEntryInfo;\n});\n\nconst listTasks = os.tasks.list.handler(async ({ context }) => {\n const taskList = context.manager.getTaskList();\n if (!taskList) {\n return [];\n }\n return taskList.tasks.map((t) => ({\n id: t.id,\n state: t.state,\n processNames: t.processes.map((p) => p.name),\n })) as TaskEntryInfo[];\n});\n\nconst addTask = os.tasks.add.handler(async ({ input, context }) => {\n const task = context.manager.addTask(input.name, input.definition);\n return task as TaskEntryInfo;\n});\n\nconst removeTask = os.tasks.remove.handler(async ({ input, context }) => {\n const task = context.manager.removeTaskByTarget(input.target);\n return task as TaskEntryInfo;\n});\n\nexport const router = os.router({\n manager: {\n status: managerStatus,\n },\n processes: {\n add: addProcess,\n get: getProcess,\n list: listProcesses,\n start: startProcess,\n stop: stopProcess,\n restart: restartProcess,\n reload: reloadProcess,\n remove: removeProcess,\n },\n crons: {\n get: getCron,\n list: listCrons,\n trigger: triggerCron,\n start: startCron,\n stop: stopCron,\n },\n tasks: {\n get: getTask,\n list: listTasks,\n add: addTask,\n remove: removeTask,\n },\n});\n","import * as v from \"valibot\";\nimport { join } from \"node:path\";\nimport { cwd as getCwd } from \"node:process\";\nimport { mkdirSync } from \"node:fs\";\nimport { ProcessDefinition } from \"./lazy-process.ts\";\nimport type { Logger } from \"./logger.ts\";\nimport { TaskList, type NamedProcessDefinition } from \"./task-list.ts\";\nimport { CronProcess, CronProcessOptions } from \"./cron-process.ts\";\nimport { RestartingProcess, RestartingProcessOptions } from \"./restarting-process.ts\";\nimport { EnvManager, type EnvChangeEvent } from \"./env-manager.ts\";\n\nexport const HttpServerConfig = v.object({\n host: v.optional(v.string()),\n port: v.optional(v.number()),\n authToken: v.optional(v.string()),\n});\nexport type HttpServerConfig = v.InferOutput<typeof HttpServerConfig>;\n\nexport const CronProcessEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n options: CronProcessOptions,\n envFile: v.optional(v.string()),\n});\nexport type CronProcessEntry = v.InferOutput<typeof CronProcessEntry>;\n\nexport const EnvReloadDelay = v.union([v.number(), v.boolean(), v.literal(\"immediately\")]);\nexport type EnvReloadDelay = v.InferOutput<typeof EnvReloadDelay>;\n\nexport const RestartingProcessEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n options: v.optional(RestartingProcessOptions),\n envFile: v.optional(v.string()),\n envReloadDelay: v.optional(EnvReloadDelay),\n});\nexport type RestartingProcessEntry = v.InferOutput<typeof RestartingProcessEntry>;\n\nexport const TaskEntry = v.object({\n name: v.string(),\n definition: ProcessDefinition,\n envFile: v.optional(v.string()),\n});\nexport type TaskEntry = v.InferOutput<typeof TaskEntry>;\n\nexport const ManagerConfig = v.object({\n http: v.optional(HttpServerConfig),\n cwd: v.optional(v.string()),\n logDir: v.optional(v.string()),\n env: v.optional(v.record(v.string(), v.string())),\n envFile: v.optional(v.string()),\n tasks: v.optional(v.array(TaskEntry)),\n crons: v.optional(v.array(CronProcessEntry)),\n processes: v.optional(v.array(RestartingProcessEntry)),\n});\nexport type ManagerConfig = v.InferOutput<typeof ManagerConfig>;\n\nconst DEFAULT_RESTART_OPTIONS = {\n restartPolicy: \"always\" as const,\n};\nconst SHUTDOWN_TIMEOUT_MS = 15000;\n\n// Manager state\nexport type ManagerState =\n | \"idle\" // Not started\n | \"initializing\" // Running task list\n | \"running\" // All processes running\n | \"stopping\" // Stopping all processes\n | \"stopped\"; // Fully stopped\n\nexport class Manager {\n private config: ManagerConfig;\n private logger: Logger;\n private envManager: EnvManager;\n\n private _state: ManagerState = \"idle\";\n private taskList: TaskList | null = null;\n private cronProcesses: Map<string, CronProcess> = new Map();\n private restartingProcesses: Map<string, RestartingProcess> = new Map();\n private logDir: string;\n\n // Env reload tracking\n private processEnvReloadConfig: Map<string, EnvReloadDelay> = new Map();\n private envReloadTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private envChangeUnsubscribe: (() => void) | null = null;\n\n // Shutdown handling\n private signalHandlers: Map<NodeJS.Signals, () => void> = new Map();\n private shutdownPromise: Promise<void> | null = null;\n private isShuttingDown: boolean = false;\n\n constructor(config: ManagerConfig, logger: Logger) {\n const cwd = config.cwd ?? getCwd();\n this.config = config;\n this.logger = logger;\n this.logDir = config.logDir ?? join(cwd, \"logs\");\n this.ensureLogDirs();\n\n // Validate that all names are globally unique across tasks, crons, and processes\n this.validateConfigNames();\n\n const customEnvFiles: Record<string, string> = {};\n for (const task of config.tasks ?? []) {\n if (task.envFile) customEnvFiles[task.name] = task.envFile;\n }\n for (const cron of config.crons ?? []) {\n if (cron.envFile) customEnvFiles[cron.name] = cron.envFile;\n }\n for (const proc of config.processes ?? []) {\n if (proc.envFile) customEnvFiles[proc.name] = proc.envFile;\n }\n\n this.envManager = new EnvManager(\n {\n cwd,\n globalEnvFile: config.envFile,\n customEnvFiles,\n },\n this.logger.child(\"env-manager\"),\n );\n\n this.envChangeUnsubscribe = this.envManager.onChange((event) => this.handleEnvChange(event));\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = () => this.handleSignal(signal);\n this.signalHandlers.set(signal, handler);\n process.on(signal, handler);\n }\n }\n\n private validateConfigNames(): void {\n const allNames: { name: string; type: string }[] = [];\n\n for (const task of this.config.tasks ?? []) {\n allNames.push({ name: task.name, type: \"task\" });\n }\n for (const cron of this.config.crons ?? []) {\n allNames.push({ name: cron.name, type: \"cron\" });\n }\n for (const proc of this.config.processes ?? []) {\n allNames.push({ name: proc.name, type: \"process\" });\n }\n\n const seen = new Map<string, string>();\n for (const { name, type } of allNames) {\n const existingType = seen.get(name);\n if (existingType) {\n throw new Error(\n `Duplicate name \"${name}\" found: already used as ${existingType}, cannot use as ${type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n seen.set(name, type);\n }\n }\n\n /**\n * Check if a name is already used by any task, cron, or process\n */\n private isNameUsed(name: string): { used: boolean; type?: string } {\n for (const task of this.config.tasks ?? []) {\n if (task.name === name) return { used: true, type: \"task\" };\n }\n\n if (this.taskList) {\n for (const task of this.taskList.tasks) {\n for (const proc of task.processes) {\n if (proc.name === name) return { used: true, type: \"task\" };\n }\n }\n }\n\n if (this.cronProcesses.has(name)) return { used: true, type: \"cron\" };\n for (const cron of this.config.crons ?? []) {\n if (cron.name === name) return { used: true, type: \"cron\" };\n }\n\n if (this.restartingProcesses.has(name)) return { used: true, type: \"process\" };\n for (const proc of this.config.processes ?? []) {\n if (proc.name === name) return { used: true, type: \"process\" };\n }\n\n return { used: false };\n }\n\n private applyDefaults(processName: string, definition: ProcessDefinition): ProcessDefinition {\n const envVarsFromManager = this.envManager.getEnvVars(processName);\n\n return {\n ...definition,\n cwd: definition.cwd ?? this.config.cwd,\n env: {\n ...envVarsFromManager,\n ...this.config.env,\n ...definition.env,\n },\n };\n }\n\n private processLogFile(name: string): string {\n return join(this.logDir, \"process\", `${name}.log`);\n }\n\n private taskLogFile(name: string): string {\n return join(this.logDir, \"tasks\", `${name}.log`);\n }\n\n private cronLogFile(name: string): string {\n return join(this.logDir, \"cron\", `${name}.log`);\n }\n\n private ensureLogDirs(): void {\n mkdirSync(this.logDir, { recursive: true });\n mkdirSync(join(this.logDir, \"process\"), { recursive: true });\n mkdirSync(join(this.logDir, \"tasks\"), { recursive: true });\n mkdirSync(join(this.logDir, \"cron\"), { recursive: true });\n }\n\n /**\n * Handle env file changes\n */\n private handleEnvChange(event: EnvChangeEvent): void {\n if (this._state !== \"running\") return;\n\n if (event.type === \"global\") {\n this.logger.info(\"Global env file changed, reloading all processes as per their policies\");\n for (const processName of this.restartingProcesses.keys()) {\n const reloadDelay = this.processEnvReloadConfig.get(processName);\n if (reloadDelay === false) continue;\n this.scheduleProcessReload(processName, reloadDelay);\n }\n return;\n }\n\n if (event.type === \"process\") {\n const processName = event.key;\n const reloadDelay = this.processEnvReloadConfig.get(processName);\n if (reloadDelay === false) return;\n this.scheduleProcessReload(processName, reloadDelay);\n }\n }\n\n /**\n * Schedule a process reload with debouncing\n */\n private scheduleProcessReload(processName: string, reloadDelay?: EnvReloadDelay): void {\n // Clear existing timer if any\n const existingTimer = this.envReloadTimers.get(processName);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Determine delay in ms\n let delayMs: number;\n if (reloadDelay === false) {\n return; // Should not happen, but guard anyway\n } else if (reloadDelay === true || reloadDelay === \"immediately\") {\n delayMs = 0;\n } else if (typeof reloadDelay === \"number\") {\n delayMs = reloadDelay;\n } else {\n delayMs = 5000; // Default 5 seconds\n }\n\n this.logger.info(`Scheduling reload for process \"${processName}\" in ${delayMs}ms`);\n\n const timer = setTimeout(async () => {\n await this.reloadProcessEnv(processName);\n this.envReloadTimers.delete(processName);\n }, delayMs);\n\n this.envReloadTimers.set(processName, timer);\n }\n\n /**\n * Reload a process with updated env vars\n */\n private async reloadProcessEnv(processName: string): Promise<void> {\n const proc = this.restartingProcesses.get(processName);\n if (!proc) {\n this.logger.warn(`Process \"${processName}\" not found for env reload`);\n return;\n }\n\n this.logger.info(`Reloading process \"${processName}\" due to env change`);\n\n // Get the original config for this process\n const processConfig = this.config.processes?.find((p) => p.name === processName);\n if (!processConfig) {\n this.logger.warn(`Process config for \"${processName}\" not found`);\n return;\n }\n\n const updatedDefinition = this.applyDefaults(processName, processConfig.definition);\n await proc.reload(updatedDefinition, true);\n }\n\n get state(): ManagerState {\n return this._state;\n }\n\n /**\n * Get all cron processes (read-only access)\n */\n getCronProcesses(): ReadonlyMap<string, CronProcess> {\n return this.cronProcesses;\n }\n\n /**\n * Get a specific cron process by name\n */\n getCronProcess(name: string): CronProcess | undefined {\n return this.cronProcesses.get(name);\n }\n\n /**\n * Get all restarting processes (read-only access)\n */\n getRestartingProcesses(): ReadonlyMap<string, RestartingProcess> {\n return this.restartingProcesses;\n }\n\n /**\n * Get a specific restarting process by name\n */\n getRestartingProcess(name: string): RestartingProcess | undefined {\n return this.restartingProcesses.get(name);\n }\n\n /**\n * Get the task list (read-only access)\n */\n getTaskList(): TaskList | null {\n return this.taskList;\n }\n\n /**\n * Get a restarting process by name or index\n */\n getProcessByTarget(target: string | number): RestartingProcess | undefined {\n if (typeof target === \"string\") {\n return this.restartingProcesses.get(target);\n }\n const entries = Array.from(this.restartingProcesses.values());\n return entries[target];\n }\n\n /**\n * Get a cron process by name or index\n */\n getCronByTarget(target: string | number): CronProcess | undefined {\n if (typeof target === \"string\") {\n return this.cronProcesses.get(target);\n }\n const entries = Array.from(this.cronProcesses.values());\n return entries[target];\n }\n\n /**\n * Get a task by id or index\n */\n getTaskByTarget(\n target: string | number,\n ): { id: string; state: string; processNames: string[] } | undefined {\n if (!this.taskList) return undefined;\n const tasks = this.taskList.tasks;\n\n if (typeof target === \"string\") {\n const task = tasks.find((t) => t.id === target);\n if (!task) return undefined;\n return {\n id: task.id,\n state: task.state,\n processNames: task.processes.map((p) => p.name),\n };\n }\n\n const task = tasks[target];\n if (!task) return undefined;\n return {\n id: task.id,\n state: task.state,\n processNames: task.processes.map((p) => p.name),\n };\n }\n\n /**\n * Start a restarting process by target\n */\n async startProcessByTarget(target: string | number): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n proc.start();\n return proc;\n }\n\n /**\n * Stop a restarting process by target\n */\n async stopProcessByTarget(target: string | number, timeout?: number): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n await proc.stop(timeout);\n return proc;\n }\n\n /**\n * Restart a restarting process by target\n */\n async restartProcessByTarget(\n target: string | number,\n force: boolean = false,\n ): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n await proc.restart(force);\n return proc;\n }\n\n /**\n * Reload a restarting process with new definition\n */\n async reloadProcessByTarget(\n target: string | number,\n newDefinition: ProcessDefinition,\n options?: {\n restartImmediately?: boolean;\n updateOptions?: Partial<RestartingProcessOptions>;\n },\n ): Promise<RestartingProcess> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n // Apply global defaults to new definition\n const definitionWithDefaults = this.applyDefaults(proc.name, newDefinition);\n\n // Update options if provided\n if (options?.updateOptions) {\n proc.updateOptions(options.updateOptions);\n }\n\n // Reload with new definition\n await proc.reload(definitionWithDefaults, options?.restartImmediately ?? true);\n this.logger.info(`Reloaded process: ${proc.name}`);\n return proc;\n }\n\n /**\n * Remove a restarting process by target\n */\n async removeProcessByTarget(target: string | number, timeout?: number): Promise<void> {\n const proc = this.getProcessByTarget(target);\n if (!proc) {\n throw new Error(`Process not found: ${target}`);\n }\n\n // Stop the process first\n await proc.stop(timeout);\n\n // Remove from the map\n this.restartingProcesses.delete(proc.name);\n this.logger.info(`Removed process: ${proc.name}`);\n }\n\n /**\n * Add a task to the task list\n * Creates the task list if it doesn't exist and starts it\n */\n addTask(\n name: string,\n definition: ProcessDefinition,\n envFile?: string,\n ): { id: string; state: string; processNames: string[] } {\n // Check for global name uniqueness\n const nameCheck = this.isNameUsed(name);\n if (nameCheck.used) {\n throw new Error(\n `Name \"${name}\" is already used as ${nameCheck.type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n\n // Register custom env file if provided\n if (envFile) {\n this.envManager.registerFile(name, envFile);\n }\n\n if (!this.taskList) {\n const taskListLogger = this.logger.child(\"tasks\", {\n logFile: this.taskLogFile(\"tasks\"),\n });\n this.taskList = new TaskList(\"runtime\", taskListLogger, undefined, (processName) => {\n return this.taskLogFile(processName);\n });\n }\n\n const namedProcess: NamedProcessDefinition = {\n name,\n process: this.applyDefaults(name, definition),\n };\n const id = this.taskList.addTask(namedProcess);\n\n // Start the task list if it's idle so the task runs immediately\n if (this.taskList.state === \"idle\") {\n this.taskList.start();\n }\n\n return {\n id,\n state: \"pending\",\n processNames: [name],\n };\n }\n\n removeTaskByTarget(target: string | number): {\n id: string;\n state: string;\n processNames: string[];\n } {\n if (!this.taskList) {\n throw new Error(`Task list not initialized`);\n }\n\n const removed = this.taskList.removeTaskByTarget(target);\n return {\n id: removed.id,\n state: removed.state,\n processNames: removed.processes.map((p) => p.name),\n };\n }\n\n /**\n * Add a restarting process at runtime\n */\n async addProcess(\n name: string,\n definition: ProcessDefinition,\n options?: RestartingProcessOptions,\n envReloadDelay?: EnvReloadDelay,\n envFile?: string,\n ): Promise<RestartingProcess> {\n // Check for global name uniqueness\n const nameCheck = this.isNameUsed(name);\n if (nameCheck.used) {\n throw new Error(\n `Name \"${name}\" is already used as ${nameCheck.type}. Names must be globally unique across tasks, crons, and processes.`,\n );\n }\n\n // Register custom env file if provided\n if (envFile) {\n this.envManager.registerFile(name, envFile);\n }\n\n const processLogger = this.logger.child(name, { logFile: this.processLogFile(name) });\n const restartingProcess = new RestartingProcess(\n name,\n this.applyDefaults(name, definition),\n options ?? DEFAULT_RESTART_OPTIONS,\n processLogger,\n );\n this.restartingProcesses.set(name, restartingProcess);\n\n restartingProcess.start();\n\n // Track env reload config for this process\n this.processEnvReloadConfig.set(name, envReloadDelay ?? 5000);\n\n this.logger.info(`Added and started restarting process: ${name}`);\n return restartingProcess;\n }\n\n /**\n * Trigger a cron process by target\n */\n async triggerCronByTarget(target: string | number): Promise<CronProcess> {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n await cron.trigger();\n return cron;\n }\n\n /**\n * Start a cron process by target\n */\n startCronByTarget(target: string | number): CronProcess {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n cron.start();\n return cron;\n }\n\n /**\n * Stop a cron process by target\n */\n async stopCronByTarget(target: string | number, timeout?: number): Promise<CronProcess> {\n const cron = this.getCronByTarget(target);\n if (!cron) {\n throw new Error(`Cron not found: ${target}`);\n }\n await cron.stop(timeout);\n return cron;\n }\n\n /**\n * Start the manager:\n * 1. Run task list (if configured) and wait for completion\n * 2. Create and start all cron/restarting processes\n */\n async start(): Promise<void> {\n if (this._state !== \"idle\" && this._state !== \"stopped\") {\n throw new Error(`Manager is already ${this._state}`);\n }\n\n this.logger.info(`Starting manager`);\n\n // Phase 1: Run initialization tasks\n if (this.config.tasks && this.config.tasks.length > 0) {\n this._state = \"initializing\";\n this.logger.info(`Running initialization tasks`);\n\n const taskListLogger = this.logger.child(\"tasks\");\n const tasksWithDefaults = this.config.tasks.map((task) => ({\n name: task.name,\n process: this.applyDefaults(task.name, task.definition),\n }));\n this.taskList = new TaskList(\"init\", taskListLogger, tasksWithDefaults, (processName) => {\n return this.taskLogFile(processName);\n });\n\n this.taskList.start();\n await this.taskList.waitUntilIdle();\n\n // Check if any tasks failed\n const failedTasks = this.taskList.tasks.filter((t) => t.state === \"failed\");\n if (failedTasks.length > 0) {\n this._state = \"stopped\";\n const failedNames = failedTasks.map((t) => t.id).join(\", \");\n throw new Error(`Initialization failed: tasks [${failedNames}] failed`);\n }\n\n this.logger.info(`Initialization tasks completed`);\n }\n\n // Phase 2: Create and start cron processes\n if (this.config.crons) {\n for (const entry of this.config.crons) {\n const processLogger = this.logger.child(entry.name, {\n logFile: this.cronLogFile(entry.name),\n });\n const cronProcess = new CronProcess(\n entry.name,\n this.applyDefaults(entry.name, entry.definition),\n entry.options,\n processLogger,\n );\n this.cronProcesses.set(entry.name, cronProcess);\n cronProcess.start();\n this.logger.info(`Started cron process: ${entry.name}`);\n }\n }\n\n // Phase 3: Create and start restarting processes\n if (this.config.processes) {\n for (const entry of this.config.processes) {\n const processLogger = this.logger.child(entry.name, {\n logFile: this.processLogFile(entry.name),\n });\n const restartingProcess = new RestartingProcess(\n entry.name,\n this.applyDefaults(entry.name, entry.definition),\n entry.options ?? DEFAULT_RESTART_OPTIONS,\n processLogger,\n );\n this.restartingProcesses.set(entry.name, restartingProcess);\n\n restartingProcess.start();\n\n // Track env reload config for this process\n this.processEnvReloadConfig.set(\n entry.name,\n entry.envReloadDelay ?? 5000, // Default to 5000ms\n );\n\n this.logger.info(`Started restarting process: ${entry.name}`);\n }\n }\n\n this._state = \"running\";\n this.logger.info(\n `Manager started with ${this.cronProcesses.size} cron process(es) and ${this.restartingProcesses.size} restarting process(es)`,\n );\n }\n\n /**\n * Stop all managed processes\n */\n async stop(timeout?: number): Promise<void> {\n if (this._state === \"idle\" || this._state === \"stopped\") {\n this._state = \"stopped\";\n return;\n }\n\n this._state = \"stopping\";\n this.logger.info(`Stopping manager`);\n\n // Clear all env reload timers\n for (const timer of this.envReloadTimers.values()) {\n clearTimeout(timer);\n }\n this.envReloadTimers.clear();\n\n // Unsubscribe from env changes\n if (this.envChangeUnsubscribe) {\n this.envChangeUnsubscribe();\n this.envChangeUnsubscribe = null;\n }\n\n this.envManager.close();\n\n for (const [signal, handler] of this.signalHandlers) {\n process.off(signal, handler);\n }\n this.signalHandlers.clear();\n\n // Stop task list if still running\n if (this.taskList) {\n await this.taskList.stop(timeout);\n }\n\n // Stop all cron processes in parallel\n const cronStopPromises = Array.from(this.cronProcesses.values()).map((p) => p.stop(timeout));\n\n // Stop all restarting processes in parallel\n const restartingStopPromises = Array.from(this.restartingProcesses.values()).map((p) =>\n p.stop(timeout),\n );\n\n await Promise.all([...cronStopPromises, ...restartingStopPromises]);\n\n this._state = \"stopped\";\n this.logger.info(`Manager stopped`);\n }\n\n /**\n * Wait for shutdown to complete (useful for keeping process alive)\n * Resolves when the manager has fully stopped\n */\n async waitForShutdown(): Promise<void> {\n // If already stopped, return immediately\n if (this._state === \"stopped\") {\n return;\n }\n\n // If shutdown is in progress, wait for it\n if (this.shutdownPromise) {\n await this.shutdownPromise;\n return;\n }\n\n // Wait for state to become stopped\n return new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (this._state === \"stopped\") {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n });\n }\n\n /**\n * Trigger graceful shutdown programmatically\n */\n async shutdown(): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn(`Shutdown already in progress`);\n if (this.shutdownPromise) {\n await this.shutdownPromise;\n }\n return;\n }\n\n this.isShuttingDown = true;\n this.logger.info(`Initiating graceful shutdown (timeout: ${SHUTDOWN_TIMEOUT_MS}ms)`);\n\n this.shutdownPromise = this.performShutdown();\n await this.shutdownPromise;\n }\n\n private handleSignal(signal: NodeJS.Signals): void {\n this.logger.info(`Received ${signal}, initiating graceful shutdown...`);\n\n // Prevent handling multiple signals\n if (this.isShuttingDown) {\n this.logger.warn(`Shutdown already in progress, ignoring ${signal}`);\n return;\n }\n\n this.isShuttingDown = true;\n this.shutdownPromise = this.performShutdown();\n\n this.shutdownPromise\n .then(() => {\n this.logger.info(`Exiting with code 0`);\n process.exit();\n })\n .catch((err) => {\n this.logger.error(`Shutdown error:`, err);\n process.exit(1);\n });\n }\n\n private async performShutdown(): Promise<void> {\n // Create a timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Shutdown timed out after ${SHUTDOWN_TIMEOUT_MS}ms`));\n }, SHUTDOWN_TIMEOUT_MS);\n });\n\n try {\n // Race between graceful stop and timeout\n await Promise.race([this.stop(SHUTDOWN_TIMEOUT_MS), timeoutPromise]);\n this.logger.info(`Graceful shutdown completed`);\n } catch (err) {\n this.logger.error(`Shutdown error:`, err);\n // Force stop on timeout\n this._state = \"stopped\";\n throw err;\n } finally {\n this.isShuttingDown = false;\n this.shutdownPromise = null;\n }\n }\n}\n","export async function tImport(path: string) {\n try {\n // Try to import the file as a module with native import\n return await import(path);\n } catch {\n // If native import fails, use tsx's tsImport function\n const { tsImport } = await import(\"tsx/esm/api\");\n return await tsImport(path, { parentURL: import.meta.url });\n }\n}\n","","#!/usr/bin/env node\nimport { createServer } from \"node:http\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolve } from \"node:path\";\nimport { RPCHandler } from \"@orpc/server/node\";\nimport { onError } from \"@orpc/server\";\nimport * as v from \"valibot\";\nimport { router } from \"./api/server.ts\";\nimport { Manager, ManagerConfig } from \"./manager.ts\";\nimport { logger } from \"./logger.ts\";\nimport Table from \"cli-table3\";\nimport { createClient, type Client } from \"./api/client.ts\";\nimport { ProcessDefinition } from \"./lazy-process.ts\";\nimport { tImport } from \"./utils.ts\";\nimport { os as osBase } from \"@orpc/server\";\nimport { createCli, type TrpcCliMeta } from \"trpc-cli\";\nimport { format } from \"node:util\";\nimport pkg from \"../package.json\" assert { type: \"json\" };\n\nconst os = osBase.$context<{ client: Client }>().$meta<TrpcCliMeta>({});\n\nconst ResourceTarget = v.union([v.string(), v.number()]);\n\n// Helper functions for table formatting (used multiple times)\nfunction printProcessTable(proc: { name: string; state: string; restarts: number }) {\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n}\n\nfunction printTaskTable(task: { id: string; state: string; processNames: string[] }) {\n const table = new Table({ head: [\"Id\", \"State\", \"Processes\"] });\n table.push([task.id, task.state, task.processNames.join(\", \")]);\n console.log(table.toString());\n}\n\nfunction printCronTable(cron: {\n name: string;\n state: string;\n runCount: number;\n failCount: number;\n nextRun: string | null;\n}) {\n const table = new Table({ head: [\"Name\", \"State\", \"Runs\", \"Fails\", \"Next Run\"] });\n table.push([cron.name, cron.state, cron.runCount, cron.failCount, cron.nextRun ?? \"-\"]);\n console.log(table.toString());\n}\n\nconst cliRouter = os.router({\n init: osBase\n .meta({\n description: \"Initialize and run the process manager with config file\",\n aliases: { options: { config: \"c\" } },\n })\n .input(\n v.object({\n config: v.optional(\n v.pipe(v.string(), v.description(\"Path to config file\")),\n \"pidnap.config.ts\",\n ),\n }),\n )\n .handler(async ({ input }) => {\n process.title = \"pidnap\";\n const initLogger = logger({ name: \"pidnap\" });\n try {\n // Resolve config file path\n const configPath = resolve(process.cwd(), input.config);\n const configUrl = pathToFileURL(configPath).href;\n\n // Import the config file\n const configModule = await tImport(configUrl);\n const rawConfig =\n configModule.default.default || configModule.default || configModule.config || {};\n\n // Parse and validate the config with Valibot\n const config = v.parse(ManagerConfig, rawConfig);\n\n // Extract HTTP config with defaults\n const host = config.http?.host ?? \"127.0.0.1\";\n const port = config.http?.port ?? 9876;\n const authToken = config.http?.authToken;\n\n // Create manager with config\n const logDir = config.logDir ?? resolve(process.cwd(), \"logs\");\n const managerLogger = logger({ name: \"pidnap\", logFile: resolve(logDir, \"pidnap.log\") });\n const manager = new Manager(config, managerLogger);\n\n // Setup ORPC server with optional auth token middleware\n const handler = new RPCHandler(router, {\n interceptors: [\n onError((error) => {\n managerLogger.error(error);\n }),\n ],\n });\n\n const server = createServer(async (req, res) => {\n // Check auth token if configured\n if (authToken) {\n const providedToken = req.headers[\"authorization\"]?.replace(\"Bearer \", \"\");\n if (providedToken !== authToken) {\n res.statusCode = 401;\n res.end(\"Unauthorized\");\n return;\n }\n }\n\n const { matched } = await handler.handle(req, res, {\n prefix: \"/rpc\",\n context: { manager },\n });\n if (matched) return;\n res.statusCode = 404;\n res.end(\"Not found\\n\");\n });\n\n server.listen(port, host, async () => {\n managerLogger.info(`pidnap RPC server running on http://${host}:${port}`);\n if (authToken) {\n managerLogger.info(\"Auth token required for API access\");\n }\n\n try {\n await manager.start();\n } catch (err) {\n managerLogger.error(\"Failed to start manager:\", err);\n server.close();\n process.exit(1);\n }\n });\n\n // Wait for shutdown\n await manager.waitForShutdown();\n\n // Close server on shutdown\n server.close();\n } catch (error) {\n initLogger.error(\"Failed to start pidnap:\", error);\n process.exit(1);\n }\n }),\n\n status: os\n .meta({ description: \"Show manager status\" })\n .handler(async ({ context: { client } }) => {\n const status = await client.manager.status();\n const table = new Table({ head: [\"State\", \"Processes\", \"Crons\", \"Tasks\"] });\n table.push([status.state, status.processCount, status.cronCount, status.taskCount]);\n console.log(table.toString());\n }),\n\n process: os.router({\n list: os\n .meta({ description: \"List restarting processes\" })\n .handler(async ({ context: { client } }) => {\n const processes = await client.processes.list();\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n for (const proc of processes) {\n table.push([proc.name, proc.state, proc.restarts]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({\n description: \"Get a restarting process by name or index\",\n aliases: { options: { target: \"t\" } },\n })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.get({ target: input.target });\n printProcessTable(proc);\n }),\n add: os\n .meta({\n description: \"Add a restarting process\",\n aliases: { options: { name: \"n\", definition: \"d\" } },\n })\n .input(\n v.object({\n name: v.pipe(v.string(), v.description(\"Process name\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.add({ name: input.name, definition: input.definition });\n printProcessTable(proc);\n }),\n start: os\n .meta({ description: \"Start a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.start({ target: input.target });\n printProcessTable(proc);\n }),\n stop: os\n .meta({ description: \"Stop a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.stop({ target: input.target });\n printProcessTable(proc);\n }),\n restart: os\n .meta({\n description: \"Restart a restarting process\",\n aliases: { options: { target: \"t\", force: \"f\" } },\n })\n .input(\n v.object({\n target: v.pipe(ResourceTarget, v.description(\"Process name or index\")),\n force: v.optional(v.pipe(v.boolean(), v.description(\"Force restart\"))),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.restart({ target: input.target, force: input.force });\n printProcessTable(proc);\n }),\n reload: os\n .meta({\n description: \"Reload a restarting process definition\",\n aliases: { options: { target: \"t\", definition: \"d\", restartImmediately: \"r\" } },\n })\n .input(\n v.object({\n target: v.pipe(ResourceTarget, v.description(\"Process name or index\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n restartImmediately: v.optional(\n v.pipe(v.boolean(), v.description(\"Restart immediately after reload\")),\n ),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const proc = await client.processes.reload({\n target: input.target,\n definition: input.definition,\n restartImmediately: input.restartImmediately,\n });\n printProcessTable(proc);\n }),\n remove: os\n .meta({ description: \"Remove a restarting process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Process name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n await client.processes.remove({ target: input.target });\n console.log(\"Process removed\");\n }),\n }),\n\n // Tasks\n tasks: os.router({\n list: os.meta({ description: \"List tasks\" }).handler(async ({ context: { client } }) => {\n const tasks = await client.tasks.list();\n const table = new Table({ head: [\"Id\", \"State\", \"Processes\"] });\n for (const task of tasks) {\n table.push([task.id, task.state, task.processNames.join(\", \")]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({ description: \"Get a task by id or index\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Task id or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.get({ target: input.target });\n printTaskTable(task);\n }),\n add: os\n .meta({ description: \"Add a task\", aliases: { options: { name: \"n\", definition: \"d\" } } })\n .input(\n v.object({\n name: v.pipe(v.string(), v.description(\"Task name\")),\n definition: v.pipe(ProcessDefinition, v.description(\"Process definition JSON\")),\n }),\n )\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.add({ name: input.name, definition: input.definition });\n printTaskTable(task);\n }),\n remove: os\n .meta({ description: \"Remove a task by id or index\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Task id or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const task = await client.tasks.remove({ target: input.target });\n printTaskTable(task);\n }),\n }),\n\n // Crons\n crons: os.router({\n list: os\n .meta({ description: \"List cron processes\" })\n .handler(async ({ context: { client } }) => {\n const crons = await client.crons.list();\n const table = new Table({ head: [\"Name\", \"State\", \"Runs\", \"Fails\", \"Next Run\"] });\n for (const cron of crons) {\n table.push([cron.name, cron.state, cron.runCount, cron.failCount, cron.nextRun ?? \"-\"]);\n }\n console.log(table.toString());\n }),\n get: os\n .meta({\n description: \"Get a cron process by name or index\",\n aliases: { options: { target: \"t\" } },\n })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.get({ target: input.target });\n printCronTable(cron);\n }),\n trigger: os\n .meta({ description: \"Trigger a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.trigger({ target: input.target });\n printCronTable(cron);\n }),\n start: os\n .meta({ description: \"Start a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.start({ target: input.target });\n printCronTable(cron);\n }),\n stop: os\n .meta({ description: \"Stop a cron process\", aliases: { options: { target: \"t\" } } })\n .input(v.object({ target: v.pipe(ResourceTarget, v.description(\"Cron name or index\")) }))\n .handler(async ({ input, context: { client } }) => {\n const cron = await client.crons.stop({ target: input.target });\n printCronTable(cron);\n }),\n }),\n});\n\nconst client = createClient();\nconst cli = createCli({\n name: \"pidnap\",\n version: pkg.version,\n router: cliRouter,\n context: { client },\n});\n\ncli.run({\n formatError(error: any) {\n if (error?.cause?.code === \"ECONNREFUSED\") {\n return (\n `Failed to connect to RPC server, are you sure the server is running? If the Server is running of different url, use PIDNAP_RPC_URL environment variable to set it.\\n` +\n format(error)\n );\n }\n return format(error);\n },\n});\n"],"mappings":"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"}