pidnap 0.0.0-dev.5 → 0.0.0-dev.6

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["oc","ocBase","tasks","crons","cwd","getCwd"],"sources":["../src/api/contract.ts","../src/api/server.ts","../src/manager.ts","../src/utils.ts","../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 // 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 { Command } from \"commander\";\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 } from \"./api/client.ts\";\nimport { ProcessDefinition } from \"./lazy-process.ts\";\nimport { tImport } from \"./utils.ts\";\n\nconst program = new Command();\n\nprogram\n .name(\"pidnap\")\n .description(\"Process manager with init system capabilities\")\n .version(\"0.0.0-dev.5\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize and run the process manager with config file\")\n .option(\"-c, --config [path]\", \"Path to config file\", \"pidnap.config.ts\")\n .action(async (options) => {\n process.title = \"pidnap\";\n const initLogger = logger({ name: \"pidnap\" });\n try {\n // Resolve config file path\n const configPath = resolve(process.cwd(), options.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\nprogram\n .command(\"status\")\n .description(\"Show manager status\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const status = await client.manager.status();\n\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 } catch (error) {\n console.error(\"Failed to fetch status:\", error);\n process.exit(1);\n }\n });\n\nconst processGroup = program.command(\"process\").description(\"Manage restarting processes\");\n\nprocessGroup\n .command(\"list\")\n .description(\"List restarting processes\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const processes = await client.processes.list();\n\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 } catch (error) {\n console.error(\"Failed to list processes:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"get\")\n .description(\"Get a restarting process by name or index\")\n .argument(\"<target>\", \"Process name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const proc = await client.processes.get({ target: parseTarget(target) });\n\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n } catch (error) {\n console.error(\"Failed to get process:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"add\")\n .description(\"Add a restarting process\")\n .requiredOption(\"-n, --name <name>\", \"Process name\")\n .requiredOption(\"-d, --definition <json>\", \"Process definition JSON\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const definition = parseDefinition(options.definition);\n const proc = await client.processes.add({ name: options.name, definition });\n\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n } catch (error) {\n console.error(\"Failed to add process:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"start\")\n .description(\"Start a restarting process\")\n .argument(\"<target>\", \"Process name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const proc = await client.processes.start({ target: parseTarget(target) });\n\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n } catch (error) {\n console.error(\"Failed to start process:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"stop\")\n .description(\"Stop a restarting process\")\n .argument(\"<target>\", \"Process name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const proc = await client.processes.stop({ target: parseTarget(target) });\n\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n } catch (error) {\n console.error(\"Failed to stop process:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"restart\")\n .description(\"Restart a restarting process\")\n .argument(\"<target>\", \"Process name or index\")\n .option(\"-f, --force\", \"Force restart\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const proc = await client.processes.restart({\n target: parseTarget(target),\n force: options.force,\n });\n\n const table = new Table({ head: [\"Name\", \"State\", \"Restarts\"] });\n table.push([proc.name, proc.state, proc.restarts]);\n console.log(table.toString());\n } catch (error) {\n console.error(\"Failed to restart process:\", error);\n process.exit(1);\n }\n });\n\nprocessGroup\n .command(\"remove\")\n .description(\"Remove a restarting process\")\n .argument(\"<target>\", \"Process name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n await client.processes.remove({ target: parseTarget(target) });\n console.log(\"Process removed\");\n } catch (error) {\n console.error(\"Failed to remove process:\", error);\n process.exit(1);\n }\n });\n\nconst crons = program.command(\"crons\").description(\"Manage cron processes\");\n\ncrons\n .command(\"list\")\n .description(\"List cron processes\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const crons = await client.crons.list();\n\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 } catch (error) {\n console.error(\"Failed to list crons:\", error);\n process.exit(1);\n }\n });\n\ncrons\n .command(\"get\")\n .description(\"Get a cron process by name or index\")\n .argument(\"<target>\", \"Cron name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const cron = await client.crons.get({ target: parseTarget(target) });\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 } catch (error) {\n console.error(\"Failed to get cron:\", error);\n process.exit(1);\n }\n });\n\ncrons\n .command(\"trigger\")\n .description(\"Trigger a cron process\")\n .argument(\"<target>\", \"Cron name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const cron = await client.crons.trigger({ target: parseTarget(target) });\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 } catch (error) {\n console.error(\"Failed to trigger cron:\", error);\n process.exit(1);\n }\n });\n\ncrons\n .command(\"start\")\n .description(\"Start a cron process\")\n .argument(\"<target>\", \"Cron name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const cron = await client.crons.start({ target: parseTarget(target) });\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 } catch (error) {\n console.error(\"Failed to start cron:\", error);\n process.exit(1);\n }\n });\n\ncrons\n .command(\"stop\")\n .description(\"Stop a cron process\")\n .argument(\"<target>\", \"Cron name or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const cron = await client.crons.stop({ target: parseTarget(target) });\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 } catch (error) {\n console.error(\"Failed to stop cron:\", error);\n process.exit(1);\n }\n });\n\nconst tasks = program.command(\"tasks\").description(\"Manage tasks\");\n\ntasks\n .command(\"list\")\n .description(\"List tasks\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const tasks = await client.tasks.list();\n\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 } catch (error) {\n console.error(\"Failed to list tasks:\", error);\n process.exit(1);\n }\n });\n\ntasks\n .command(\"get\")\n .description(\"Get a task by id or index\")\n .argument(\"<target>\", \"Task id or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const task = await client.tasks.get({ target: parseTarget(target) });\n\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 } catch (error) {\n console.error(\"Failed to get task:\", error);\n process.exit(1);\n }\n });\n\ntasks\n .command(\"add\")\n .description(\"Add a task\")\n .requiredOption(\"-n, --name <name>\", \"Task name\")\n .requiredOption(\"-d, --definition <json>\", \"Process definition JSON\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (options) => {\n try {\n const client = createClient(options.url);\n const definition = parseDefinition(options.definition);\n const task = await client.tasks.add({ name: options.name, definition });\n\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 } catch (error) {\n console.error(\"Failed to add task:\", error);\n process.exit(1);\n }\n });\n\ntasks\n .command(\"remove\")\n .description(\"Remove a task by id or index\")\n .argument(\"<target>\", \"Task id or index\")\n .option(\"-u, --url <url>\", \"RPC server URL\")\n .action(async (target, options) => {\n try {\n const client = createClient(options.url);\n const task = await client.tasks.remove({ target: parseTarget(target) });\n\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 } catch (error) {\n console.error(\"Failed to remove task:\", error);\n process.exit(1);\n }\n });\n\nconst TargetSchema = v.union([v.string(), v.number()]);\n\nfunction parseTarget(value: string): string | number {\n const asNumber = Number(value);\n return v.parse(TargetSchema, Number.isNaN(asNumber) ? value : asNumber);\n}\n\nfunction parseDefinition(raw: string): ProcessDefinition {\n try {\n const parsed = JSON.parse(raw);\n return v.parse(ProcessDefinition, parsed);\n } catch (error) {\n console.error(\"Invalid --definition JSON. Expected a ProcessDefinition.\");\n throw error;\n }\n}\n\nprogram.parse();\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 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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"}
package/dist/client.d.mts CHANGED
@@ -163,6 +163,7 @@ declare const api: {
163
163
  //#endregion
164
164
  //#region src/api/client.d.ts
165
165
  declare function createClient(url?: string): ContractRouterClient<typeof api>;
166
+ type Client = ReturnType<typeof createClient>;
166
167
  //#endregion
167
- export { createClient };
168
+ export { Client, createClient };
168
169
  //# sourceMappingURL=client.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":[],"sources":["../src/api/contract.ts","../src/api/client.ts"],"mappings":";;;;;cAyGa,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCpGG,YAAA,CACd,GAAA,YACC,oBAAA,QAA4B,GAAA"}
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../src/api/contract.ts","../src/api/client.ts"],"mappings":";;;;;cAyGa,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCpGG,YAAA,CACd,GAAA,YACC,oBAAA,QAA4B,GAAA;AAAA,KAOnB,MAAA,GAAS,UAAA,QAAkB,YAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","names":[],"sources":["../src/api/client.ts"],"sourcesContent":["import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport type { ContractRouterClient } from \"@orpc/contract\";\nimport type { api } from \"./contract.ts\";\n\nexport function createClient(\n url = process.env.PIDNAP_RPC_URL ?? \"http://localhost:9876/rpc\",\n): ContractRouterClient<typeof api> {\n const authToken = process.env.PIDNAP_AUTH_TOKEN;\n const headers = authToken ? { Authorization: `Bearer ${authToken}` } : undefined;\n const link = new RPCLink({ url, headers });\n return createORPCClient(link);\n}\n"],"mappings":";;;;AAKA,SAAgB,aACd,MAAM,QAAQ,IAAI,kBAAkB,6BACF;CAClC,MAAM,YAAY,QAAQ,IAAI;AAG9B,QAAO,iBADM,IAAI,QAAQ;EAAE;EAAK,SADhB,YAAY,EAAE,eAAe,UAAU,aAAa,GAAG;EAC9B,CAAC,CACb"}
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/api/client.ts"],"sourcesContent":["import { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport type { ContractRouterClient } from \"@orpc/contract\";\nimport type { api } from \"./contract.ts\";\n\nexport function createClient(\n url = process.env.PIDNAP_RPC_URL ?? \"http://localhost:9876/rpc\",\n): ContractRouterClient<typeof api> {\n const authToken = process.env.PIDNAP_AUTH_TOKEN;\n const headers = authToken ? { Authorization: `Bearer ${authToken}` } : undefined;\n const link = new RPCLink({ url, headers });\n return createORPCClient(link);\n}\n\nexport type Client = ReturnType<typeof createClient>;\n"],"mappings":";;;;AAKA,SAAgB,aACd,MAAM,QAAQ,IAAI,kBAAkB,6BACF;CAClC,MAAM,YAAY,QAAQ,IAAI;AAG9B,QAAO,iBADM,IAAI,QAAQ;EAAE;EAAK,SADhB,YAAY,EAAE,eAAe,UAAU,aAAa,GAAG;EAC9B,CAAC,CACb"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pidnap",
3
- "version": "0.0.0-dev.5",
3
+ "version": "0.0.0-dev.6",
4
4
  "bin": {
5
5
  "pidnap": "./dist/cli.mjs"
6
6
  },
@@ -23,11 +23,12 @@
23
23
  "@orpc/client": "^1.13.4",
24
24
  "@orpc/contract": "^1.13.4",
25
25
  "@orpc/server": "^1.13.4",
26
+ "@valibot/to-json-schema": "^1.5.0",
26
27
  "chokidar": "^5.0.0",
27
28
  "cli-table3": "^0.6.5",
28
- "commander": "^14.0.2",
29
29
  "croner": "^9.1.0",
30
30
  "dotenv": "^17.2.3",
31
+ "trpc-cli": "^0.12.2",
31
32
  "tsx": "^4.21.0",
32
33
  "valibot": "^1.2.0"
33
34
  },
package/src/api/client.ts CHANGED
@@ -11,3 +11,5 @@ export function createClient(
11
11
  const link = new RPCLink({ url, headers });
12
12
  return createORPCClient(link);
13
13
  }
14
+
15
+ export type Client = ReturnType<typeof createClient>;