@andrew_l/app 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/config.ts","../src/utils/args.ts","../src/utils/filePathFromStack.ts","../src/utils/isMainFile.ts","../src/logger.ts","../src/utils/log.ts","../src/app.ts","../src/appHub.ts","../src/managedThread.ts","../src/appThread.ts","../src/project.ts","../src/tui/store.ts","../src/tui/components/useTuiStore.ts","../src/tui/components/AppList.tsx","../src/tui/components/LogView.tsx","../src/tui/components/StatusBar.tsx","../src/tui/components/TuiRoot.tsx","../src/tui/launchAppsTui.tsx","../src/utils/db.ts","../src/utils/props.ts","../src/cli/runApp.ts","../src/cli/index.ts","../src/strategies/IntervalStrategy.ts","../src/worker.ts"],"sourcesContent":["import { env } from '@andrew_l/toolkit';\n\nexport const CONFIG = Object.freeze({\n IS_VRUN: env.bool('VRUN', false),\n\n WATCH_MODE: env.bool('VRUN_WATCH', false),\n\n /**\n * Root path of application\n */\n APP_ROOT: env.string('APP_ROOT') || null,\n\n /**\n * Typescript resolver mode\n */\n TS_MODE:\n env.string(\n 'VRUN_TS_MODE',\n process.execArgv.some(v => v.includes('tsx/dist/loader.mjs'))\n ? 'tsx'\n : '',\n ) || null,\n\n /**\n * List of disabled workers\n */\n WORKER_DISABLED: new Set(env.list('WORKER_DISABLE', 'string')),\n} as const);\n","import os from 'node:os';\nimport path from 'node:path';\n\nexport const isHelpArgument = (argv: string | string[]) => {\n if (!Array.isArray(argv)) {\n argv = [argv];\n }\n\n return argv.includes('--help') || argv.includes('-h');\n};\n\nexport const filterHelpArgument = (argv: string[]) => {\n return argv.filter(v => !isHelpArgument(v));\n};\n\nexport const isDevArgument = (argv: string[]) => {\n return argv.includes('--dev');\n};\n\nexport function pathLastParts(value: string, count: number): string {\n const parts = path.normalize(value).split(path.sep);\n return parts.slice(-count).join(path.sep);\n}\n\nexport function getInstanceName(): string {\n return process.env.DYNO || process.env.NODE_INSTANCE || os.hostname();\n}\n\nexport function extractOptionsArgs(argv: string[]): string[] {\n const result = [];\n let flag = false;\n\n for (const value of argv) {\n if (value.startsWith('--')) {\n flag = true;\n result.push(value);\n continue;\n }\n\n if (flag) {\n result.push(value);\n flag = false;\n }\n }\n\n return result;\n}\n","import path from 'node:path';\n\nexport function filePathFromStack(stack: string) {\n const stackLines = stack.trim().split('\\n');\n\n // Find the caller line (skip Error, current function)\n const callerLine = stackLines[0];\n\n // Handle different stack trace formats across platforms\n let filePath = null;\n\n // Try different regex patterns for different formats\n const patterns = [\n /\\((.+):(\\d+):(\\d+)\\)$/, // (file:line:col)\n /at\\s+(.+):(\\d+):(\\d+)$/, // at file:line:col\n /\\s+at\\s+(.+):(\\d+):(\\d+)$/, // at file:line:col with spaces\n /\\(file:\\/\\/(.+):(\\d+):(\\d+)\\)$/, // (file://path:line:col)\n /file:\\/\\/(.+):(\\d+):(\\d+)$/, // file://path:line:col\n ];\n\n for (const pattern of patterns) {\n const match = callerLine.match(pattern);\n if (match) {\n filePath = match[1];\n break;\n }\n }\n\n if (!filePath) {\n return null;\n }\n\n // Remove file:// protocol if present\n if (filePath.startsWith('file://')) {\n filePath = filePath.replace('file://', '');\n }\n\n // Handle Windows drive letters (C:/ becomes C:\\)\n if (process.platform === 'win32') {\n // Fix Windows paths that might have forward slashes\n filePath = filePath.replace(/\\//g, '\\\\');\n\n // Handle UNC paths or drive letters\n if (filePath.match(/^[A-Za-z]:\\\\/)) {\n // Already a valid Windows path\n } else if (filePath.startsWith('\\\\')) {\n // UNC path, keep as is\n } else {\n // Might need to add drive letter - use path.resolve\n filePath = path.resolve(filePath);\n }\n }\n\n // Normalize the path for the current OS\n return path.normalize(filePath);\n}\n","import path from 'node:path';\n\nexport function isMainFile(filepath: string): boolean {\n const cwd = process.cwd();\n return process.argv.some(arg => filepath.endsWith(path.resolve(cwd, arg)));\n}\n","import { type Logger, getLoggerLevel, noop } from '@andrew_l/toolkit';\nimport { type ConsolaInstance, LogLevels, createConsola } from 'consola';\n\nexport const createLogger = (tagName?: string): ConsolaInstance & Logger => {\n const log = createConsola({\n formatOptions: { date: false },\n level: LogLevels[getLoggerLevel()],\n fancy: true,\n defaults: {\n tag: tagName,\n },\n }) as ConsolaInstance & Logger;\n\n log.extend = (tagName: any) => createLogger(tagName) as Logger;\n\n return log;\n};\n\nexport const log: ConsolaInstance & Logger = createLogger();\n\nexport const noopLogger: Logger = {\n debug: noop,\n error: noop,\n extend: () => noopLogger,\n info: noop,\n log: noop,\n warn: noop,\n};\n","import { EJSON, type Logger, isFunction, typeOf } from '@andrew_l/toolkit';\nimport type { AppDefinition } from '../app.ts';\nimport { createLogger, noopLogger } from '../logger.ts';\n\nexport type LogEventFields = Record<string, any>;\n\nexport function formatLogEvent(event: string, fields?: LogEventFields): string {\n if (!fields) return event;\n const parts: string[] = [];\n for (const key in fields) {\n if (key === 'vrun_app_thread_message') continue;\n const v = fields[key];\n if (v === undefined) continue;\n parts.push(`${key}=${formatField(v)}`);\n }\n return parts.length ? `${event} ${parts.join(' ')}` : event;\n}\n\nfunction formatField(value: unknown): string {\n switch (typeOf(value)) {\n case 'array':\n case 'object':\n return EJSON.stringify(value);\n\n default: {\n return String(value);\n }\n }\n}\n\nexport function createAppLogger(definition: AppDefinition): Logger {\n return definition.logger === false\n ? noopLogger\n : isFunction(definition.logger)\n ? definition.logger(definition)\n : definition.logger || createLogger(definition.name);\n}\n","import {\n type AnyFunction,\n type Awaitable,\n type Data,\n type ExecResult,\n type Logger,\n SimpleEventEmitter,\n captureStackTrace,\n def,\n defer,\n isFunction,\n isSkip,\n toError,\n} from '@andrew_l/toolkit';\nimport type { ExtractPropTypes, ObjectPropsOptions } from './utils/props.js';\n\nimport { CONFIG } from './config.js';\nimport { extractOptionsArgs } from './utils/args.js';\nimport { filePathFromStack } from './utils/filePathFromStack.js';\nimport { isMainFile } from './utils/isMainFile.js';\nimport { createAppLogger } from './utils/log.ts';\n\nexport namespace AppDefinition {\n export type EntryContext<T extends Data = Data> = T & {\n log: Logger;\n };\n\n export type SetupContext<T extends Data = Data> = T & {\n log: Logger;\n };\n\n export type RuntimeContext<T extends Data = Data> = T & {\n log: Logger;\n };\n}\n\n/**\n * Shape of an application — name, typed props, lifecycle hooks, and optional methods.\n * @group Types\n */\nexport interface AppDefinition<\n P extends ObjectPropsOptions = {},\n S extends Record<string, any> = {},\n M extends Record<string, AnyFunction> = {},\n RuntimeContext extends\n AppDefinition.RuntimeContext = AppDefinition.RuntimeContext<S & M>,\n EntryContext extends AppDefinition.EntryContext = AppDefinition.EntryContext<\n S & M\n >,\n SetupContext extends\n AppDefinition.SetupContext = AppDefinition.SetupContext<M>,\n> {\n /**\n * Name of your awesome application\n */\n name: string;\n\n /**\n * Describe what your application does\n */\n description?: string;\n\n /**\n * Props options to be parsed from cli arguments of env variables\n */\n props?: P;\n\n /**\n * Path to the file where this definition exports default\n * Usually you should not use this option, because it tracks automatically\n */\n filePath?: string | null;\n\n /**\n * Logger instance or constructor function\n */\n logger?: false | Logger | ((definition: AppDefinition) => Logger);\n\n /**\n * Setup function to initialize application. Will be called once\n */\n setup?(this: SetupContext, props: ExtractPropTypes<P>): Awaitable<S>;\n\n /**\n * Custom methods which will be available under `this` context\n */\n methods?: M & ThisType<RuntimeContext>;\n\n /**\n * Entry function that will be called each time when application starts\n */\n entry?(this: EntryContext, props: ExtractPropTypes<P>): Awaitable<any>;\n\n /**\n * Stop function that will be called each time when application stops\n */\n stop?(this: RuntimeContext, props: ExtractPropTypes<P>): Awaitable<void>;\n\n /**\n * Shutdown function that will be called before application/process graceful shutdown\n */\n shutdown?(this: RuntimeContext, props: ExtractPropTypes<P>): Awaitable<void>;\n}\n\nexport const APP_INSTANCE_STATE = {\n INIT: 'init',\n IN_SETUP: 'in-setup',\n SETUP: 'setup',\n IN_STOP: 'in-stop',\n IN_RUN: 'in-run',\n RUN: 'run',\n STOP: 'stop',\n IN_SHUTDOWN: 'in-shutdown',\n SHUTDOWN: 'shutdown',\n ERROR: 'error',\n} as const;\n\nexport namespace AppInstance {\n export type EventMap = {\n state: [newState: State, oldState: State];\n error: [err: Error];\n } & {\n [K in State as `state:${K}`]: [];\n };\n\n export type State =\n (typeof APP_INSTANCE_STATE)[keyof typeof APP_INSTANCE_STATE];\n}\n\n/**\n * Runtime state of a created app instance.\n * @group Types\n */\nexport interface AppInstance<\n P extends ObjectPropsOptions = {},\n S extends Record<string, any> = {},\n M extends Record<string, AnyFunction> = {},\n> {\n definition: AppDefinition<P, S, M>;\n props: ExtractPropTypes<P> | null;\n setupState: AppDefinition.SetupContext<Data>;\n eventBus: SimpleEventEmitter<AppInstance.EventMap>;\n /** @internal */\n mutexName: string | null;\n /** @internal */\n mutexQueue: Promise<void>;\n readonly state: AppInstance.State;\n logger: Logger;\n}\n\nconst APP_DEF = Symbol('app-definition');\n\n/**\n * Define an application with typed props and lifecycle hooks.\n *\n * When executed directly (`node app.ts`), the CLI is launched automatically.\n * @group Main\n * @example\n * ```ts\n * import { defineApp } from '@andrew_l/app';\n *\n * export default defineApp({\n * name: 'server',\n * props: {\n * port: { type: Number, default: () => 3000 },\n * },\n * setup() {\n * return { server: createServer() };\n * },\n * async entry(props) {\n * await this.server.listen(props.port);\n * },\n * async stop() {\n * await this.server.close();\n * },\n * });\n * ```\n */\nexport function defineApp<\n P extends ObjectPropsOptions,\n S extends Record<string, any>,\n M extends Record<string, AnyFunction>,\n>(definition: AppDefinition<P, S, M>): AppDefinition<P, S, M> {\n const result: AppDefinition<P, S, M> = {\n filePath: filePathFromStack(captureStackTrace(defineApp)),\n ...definition,\n };\n\n def(result, APP_DEF, true);\n\n if (!CONFIG.IS_VRUN) {\n if (result.filePath) {\n if (isMainFile(result.filePath)) {\n // TODO: make sure that filePath export default this definition\n import('./cli/index.js').then(m => {\n m.cli.runApp({\n cliName: 'app',\n scriptFile: result.filePath!,\n argv: extractOptionsArgs(process.argv.slice(1)),\n });\n });\n }\n } else {\n // log.warn('Failed to detect script file from execution stack: %s', stack);\n }\n }\n\n return result;\n}\n\n/**\n * Create a new runtime instance from an app definition.\n * @group App Lifecycle\n * @example\n * ```ts\n * const instance = createAppInstance(myApp);\n * await setupApp(instance, { port: 3000 });\n * await runApp(instance);\n * ```\n */\nexport function createAppInstance<\n P extends ObjectPropsOptions,\n S extends Record<string, any>,\n M extends Record<string, AnyFunction>,\n>(definition: AppDefinition<P, S, M>): AppInstance<P, S, M> {\n const setupState = createSetupState(definition);\n\n return {\n definition,\n props: null,\n setupState,\n eventBus: new SimpleEventEmitter(),\n mutexName: null,\n mutexQueue: Promise.resolve(),\n state: APP_INSTANCE_STATE.INIT,\n logger: setupState.log,\n };\n}\n\n/**\n * Returns true if the value was created by `defineApp`.\n * @group Utils\n */\nexport function isAppDefinition(value: unknown): value is AppDefinition {\n return (value as any)?.[APP_DEF] === true;\n}\n\n/**\n * Run setup and entry in one call. Shuts down automatically if entry fails.\n * @group App Lifecycle\n * @example\n * ```ts\n * const result = await startApp(myApp, { port: 3000 });\n * if (isSuccess(result)) {\n * await appWaitShutdown(result.app);\n * }\n * ```\n */\nexport async function startApp<\n P extends ObjectPropsOptions,\n S extends Record<string, any>,\n>(\n app: AppDefinition<P, S> | AppInstance<P, S>,\n props: ExtractPropTypes<P>,\n): Promise<ExecResult<{ app: AppInstance<P, S> }>> {\n const instance = isAppDefinition(app) ? createAppInstance(app) : app;\n\n const setupResult = await setupApp(instance, props);\n\n if (isSkip(setupResult)) {\n return setupResult;\n }\n\n const runResult = await runApp(instance);\n\n if (isSkip(runResult)) {\n await shutdownApp(instance);\n return runResult;\n }\n\n return {\n success: true,\n code: 'start_app',\n app: instance,\n };\n}\n\n/**\n * Run the setup phase of an app instance.\n * @group App Lifecycle\n * @example\n * ```ts\n * const result = await setupApp(instance, { port: 3000 });\n * if (isSuccess(result)) {\n * await runApp(instance);\n * }\n * ```\n */\nexport async function setupApp(\n instance: AppInstance,\n props: Data,\n): Promise<ExecResult> {\n const mutexResolve = await mutexAcquire(instance, 'setup');\n\n if (instance.state !== APP_INSTANCE_STATE.INIT) {\n mutexResolve();\n return {\n skip: true,\n code: 'setup_app',\n reason: `application in ${instance.state} state`,\n };\n }\n\n setState(instance, APP_INSTANCE_STATE.IN_SETUP);\n\n const { setup } = instance.definition;\n\n if (isFunction(setup)) {\n try {\n const setupResult = await setup.call(instance.setupState, props);\n Object.assign(instance.setupState, setupResult);\n } catch (error) {\n setState(instance, APP_INSTANCE_STATE.ERROR);\n mutexResolve();\n return {\n code: 'setup_app',\n skip: true,\n reason: 'setup function throw error',\n error: toError(error),\n };\n }\n }\n\n instance.props = props;\n setState(instance, APP_INSTANCE_STATE.SETUP);\n mutexResolve();\n\n return {\n success: true,\n code: 'setup_app',\n };\n}\n\n/**\n * Run the entry phase of an app instance.\n * @group App Lifecycle\n * @example\n * ```ts\n * await setupApp(instance, props);\n * await runApp(instance);\n * ```\n */\nexport async function runApp(instance: AppInstance): Promise<ExecResult> {\n const mutexResolve = await mutexAcquire(instance, 'run');\n\n if (instance.state !== APP_INSTANCE_STATE.SETUP) {\n mutexResolve();\n return {\n skip: true,\n code: 'execute_app',\n reason: `application in ${instance.state} state`,\n };\n }\n\n const { entry } = instance.definition;\n\n setState(instance, APP_INSTANCE_STATE.IN_RUN);\n instance.logger.info('Starting...');\n\n if (isFunction(entry)) {\n try {\n await entry.call(instance.setupState, instance.props!);\n } catch (error) {\n setState(instance, APP_INSTANCE_STATE.ERROR);\n mutexResolve();\n return {\n skip: true,\n code: 'execute_app',\n reason: 'entry function throw error',\n error: toError(error),\n };\n }\n }\n\n setState(instance, APP_INSTANCE_STATE.RUN);\n mutexResolve();\n instance.logger.info('Started');\n\n return {\n success: true,\n code: 'execute_app',\n };\n}\n\n/**\n * Stop a running app instance and call its `stop` hook.\n * @group App Lifecycle\n * @example\n * ```ts\n * process.on('SIGTERM', async () => {\n * await stopApp(instance);\n * await shutdownApp(instance);\n * });\n * ```\n */\nexport async function stopApp(instance: AppInstance): Promise<ExecResult> {\n const mutexResolve = await mutexAcquire(instance, 'stop');\n\n if (instance.state !== APP_INSTANCE_STATE.RUN) {\n mutexResolve();\n return {\n skip: true,\n code: 'stop_app',\n reason: `application in ${instance.state} state`,\n };\n }\n\n const { stop } = instance.definition;\n\n setState(instance, APP_INSTANCE_STATE.IN_STOP);\n instance.logger.info('Stopping...');\n\n let stopErr: Error | undefined;\n\n if (isFunction(stop)) {\n try {\n await stop.call(instance.setupState, instance.props!);\n } catch (err) {\n setState(instance, APP_INSTANCE_STATE.ERROR);\n stopErr = toError(err);\n }\n }\n\n mutexResolve();\n\n if (stopErr) {\n return {\n skip: true,\n code: 'stop_app',\n reason: 'stop function throw error',\n error: stopErr,\n };\n }\n\n setState(instance, APP_INSTANCE_STATE.STOP);\n instance.logger.info('Stopped');\n\n return {\n success: true,\n code: 'stop_app',\n };\n}\n\n/**\n * Shut down an app instance, call its `shutdown` hook, and reset all state.\n * @group App Lifecycle\n * @example\n * ```ts\n * await stopApp(instance);\n * await shutdownApp(instance);\n * // instance can be set up and started again after this\n * ```\n */\nexport async function shutdownApp(instance: AppInstance): Promise<ExecResult> {\n await stopApp(instance);\n\n const mutexResolve = await mutexAcquire(instance, 'shutdown');\n\n if (\n instance.state !== APP_INSTANCE_STATE.STOP &&\n instance.state !== APP_INSTANCE_STATE.SETUP &&\n instance.state !== APP_INSTANCE_STATE.ERROR\n ) {\n mutexResolve();\n return {\n skip: true,\n code: 'shutdown_app',\n reason: `application in ${instance.state} state`,\n };\n }\n\n const { shutdown } = instance.definition;\n\n setState(instance, APP_INSTANCE_STATE.IN_SHUTDOWN);\n instance.logger.info('Shutdown...');\n\n let shutdownErr: Error | undefined;\n\n if (isFunction(shutdown)) {\n try {\n await shutdown.call(instance.setupState, instance.props!);\n } catch (err) {\n shutdownErr = toError(err);\n }\n }\n\n instance.props = null;\n instance.setupState = createSetupState(instance.definition);\n mutexResolve();\n\n if (shutdownErr) {\n setState(instance, APP_INSTANCE_STATE.ERROR);\n return {\n skip: true,\n code: 'shutdown_app',\n reason: 'shutdown function throw error',\n error: shutdownErr,\n };\n }\n\n setState(instance, APP_INSTANCE_STATE.SHUTDOWN);\n\n return {\n success: true,\n code: 'shutdown_app',\n };\n}\n\n/**\n * Returns a promise that resolves when the app emits its shutdown event.\n * Resolves immediately if the app is not running.\n * @group App Lifecycle\n * @example\n * ```ts\n * await startApp(myApp, props);\n * await appWaitShutdown(instance); // blocks until shutdown\n * ```\n */\nexport function appWaitShutdown(instance: AppInstance): Promise<void> {\n if (instance.state === APP_INSTANCE_STATE.SHUTDOWN) {\n return Promise.resolve();\n }\n\n const q = defer<void>();\n\n instance.eventBus.once('state:shutdown', q.resolve);\n instance.eventBus.once('error', q.reject);\n\n return q.promise.finally(() => {\n instance.eventBus.off('state:shutdown', q.resolve);\n instance.eventBus.off('error', q.reject);\n });\n}\n\nfunction createSetupState(\n definition: AppDefinition,\n): AppDefinition.SetupContext {\n const setupState: AppDefinition.SetupContext = {\n log: createAppLogger(definition),\n };\n\n if (definition.methods) {\n for (const [key, fn] of Object.entries(definition.methods)) {\n setupState[key] = fn.bind(setupState);\n }\n }\n\n return setupState;\n}\n\nfunction mutexAcquire(\n instance: AppInstance,\n name: string,\n): Promise<() => void> {\n let outerResolve!: (release: () => void) => void;\n\n const acquirePromise = new Promise<() => void>(res => {\n outerResolve = res;\n });\n\n instance.mutexQueue = instance.mutexQueue.then(\n () =>\n new Promise<void>(innerResolve => {\n instance.mutexName = name;\n outerResolve(() => {\n instance.mutexName = null;\n innerResolve();\n });\n }),\n );\n\n return acquirePromise;\n}\n\nfunction setState(app: AppInstance, newState: AppInstance.State) {\n const oldState = app.state;\n\n if (newState !== oldState) {\n // @ts-expect-error\n app.state = newState;\n app.eventBus.emit('state', newState, oldState);\n app.eventBus.emit(`state:${newState}`);\n }\n}\n","import {\n type Data,\n type ExecSkip,\n asyncForEach,\n camelCase,\n capitalize,\n isError,\n isSkip,\n pickPrefixed,\n} from '@andrew_l/toolkit';\nimport {\n type AppDefinition,\n type AppInstance,\n createAppInstance,\n defineApp,\n runApp,\n setupApp,\n shutdownApp,\n stopApp,\n} from './app.js';\nimport type { ObjectPropsOptions } from './utils/props.js';\n\n/**\n * Combine multiple app definitions into a single orchestrated app.\n * Props from each definition are namespaced by their app name.\n * @group Utils\n */\nexport function createAppHub(definitions: AppDefinition[]): AppDefinition {\n const app = defineApp({\n name: 'app-hub',\n description: `Application wrapper around: ${definitions.map(v => v.name).join(', ')}`,\n logger: false,\n props: prefixifyProps(definitions),\n setup(props) {\n const instances: AppInstance[] = [];\n const setupSkips: ExecSkip<{ app: AppInstance }>[] = [];\n\n return asyncForEach(definitions, definition => {\n const appProps: Data = getPrefixedProps(definition, props);\n\n const instance = createAppInstance(definition);\n\n instances.push(instance);\n\n return setupApp(instance, appProps).then(setupResult => {\n if (isSkip(setupResult)) {\n setupSkips.push({ ...setupResult, app: instance });\n }\n });\n }).then(() => {\n if (setupSkips.length) {\n throw skipExecsToError('setup', setupSkips);\n }\n\n return { instances };\n });\n },\n entry() {\n const runSkips: ExecSkip<{ app: AppInstance }>[] = [];\n\n return asyncForEach(this.instances, instance => {\n return runApp(instance).then(runResult => {\n if (isSkip(runResult)) {\n runSkips.push({ ...runResult, app: instance });\n }\n });\n }).then(() => {\n if (runSkips.length) {\n throw skipExecsToError('start', runSkips);\n }\n });\n },\n stop() {\n const stopSkips: ExecSkip<{ app: AppInstance }>[] = [];\n\n return asyncForEach(this.instances, instance => {\n return stopApp(instance).then(stopResult => {\n if (isSkip(stopResult)) {\n stopSkips.push({ ...stopResult, app: instance });\n }\n });\n }).then(() => {\n if (stopSkips.length) {\n throw skipExecsToError('stop', stopSkips);\n }\n });\n },\n shutdown() {\n const shutdownSkips: ExecSkip<{ app: AppInstance }>[] = [];\n\n return asyncForEach(this.instances, instance => {\n return shutdownApp(instance).then(shutdownResult => {\n if (isSkip(shutdownResult)) {\n shutdownSkips.push({ ...shutdownResult, app: instance });\n }\n });\n }).then(() => {\n if (shutdownSkips.length) {\n throw skipExecsToError('shutdown', shutdownSkips);\n }\n });\n },\n });\n\n return app;\n}\n\nfunction skipExecsToError(\n verb: string,\n skips: ExecSkip<{ app: AppInstance }>[],\n): Error {\n const getError = (r: ExecSkip): string => {\n if ('error' in r && isError(r.error)) {\n return r.error.stack\n ? `\\n${r.error.message}\\n${r.error.stack}`\n : `\\n${r.error.message}`;\n }\n\n return '';\n };\n\n const lines = skips.map(s =>\n s.reason\n ? ` ${s.app.definition.name} [${s.code}]: ${s.reason}${getError(s).replaceAll('\\n', '\\n ')}`\n : ` ${s.app.definition.name} [${s.code}]${getError(s).replaceAll('\\n', '\\n ')}`,\n );\n return new Error(\n `Failed to ${verb} ${skips.length} app(s):\\n${lines.join('\\n')}`,\n { cause: 'error' in skips[0] ? skips[0].error : undefined },\n );\n}\n\nexport function getPrefixedProps(definition: AppDefinition, props: Data): Data {\n const result: Data = pickPrefixed(props, {\n prefix: camelCase(definition.name),\n prefixTrim: true,\n });\n\n for (const [key, value] of Object.entries(result)) {\n const propName = key.charAt(0).toLowerCase() + key.slice(1).toLowerCase();\n result[propName] = value;\n delete result[key];\n }\n\n return result;\n}\n\nexport function prefixifyProps(\n definitions: AppDefinition[],\n): ObjectPropsOptions {\n const props: ObjectPropsOptions = {};\n\n // Merge with prefix all props\n for (const definition of definitions) {\n if (definition.props) {\n for (const [propName, prop] of Object.entries(definition.props)) {\n props[camelCase(`${definition.name}${capitalize(propName)}`)] =\n prop as any;\n }\n }\n }\n\n return props;\n}\n","import { isShuttingDown } from '@andrew_l/graceful';\nimport {\n type Data,\n type ExecResult,\n type LogLevel,\n Scheduler,\n isObject,\n noop,\n toError,\n} from '@andrew_l/toolkit';\nimport * as cp from 'node:child_process';\nimport { EventEmitter } from 'node:events';\nimport path from 'node:path';\nimport { APP_INSTANCE_STATE, type AppInstance } from './app.ts';\nimport { type LogEventFields, formatLogEvent } from './utils/log.ts';\n\nconst MAX_RESTARTS = 3;\nconst HEARTBEAT_INTERVAL_MS = 5_000;\nconst HEARTBEAT_TIMEOUT_MS = 10_000;\nconst SHUTDOWN_EXIT_TIMEOUT_MS = 5_000;\nconst SHUTDOWN_REPLY_TIMEOUT_MS = 30_000;\n\nconst appModulePath = import.meta.url.endsWith('.ts')\n ? new URL('./index.js', import.meta.url).href\n : import.meta.url;\n\nconst bootstrapCode = `\nimport { delay } from '@andrew_l/toolkit'\nimport { processGraceful, onShutdown, onShutdownError } from '@andrew_l/graceful'\nimport process from 'node:process';\n\nconst scriptFile = process.env.VRUN_PROCESS_SCRIPT_FILE;\nconst threadId = parseInt(process.env.VRUN_PROCESS_ID, 10);\nconst appUrl = ${JSON.stringify(appModulePath)};\n\nif (\n scriptFile.endsWith('.ts') ||\n appUrl.endsWith('.ts') ||\n appUrl.includes('/src/')\n) {\n const { register } = await import('tsx/esm/api');\n register();\n}\n\nconst { isAppDefinition, createAppThreadInstance, shutdownApp } = await import(appUrl);\n\nconst definition = await import(scriptFile).then(r => r.default);\n\nif (!isAppDefinition(definition)) {\n throw new Error('Default export must be an app definition: ' + scriptFile);\n}\n\nconst listeners = new Set();\nconst port = {\n on(event, cb) {\n if (event === 'message') {\n process.on('message', cb);\n listeners.add(cb);\n }\n },\n postMessage(msg, cb) {\n process.send(msg, cb);\n },\n close() {\n for (const cb of listeners) process.off('message', cb);\n },\n};\n\nconst app = createAppThreadInstance({\n threadId,\n definition,\n parentPort: port,\n // onShutdown: () => processGraceful()\n});\n\nconst log = app.logger;\n\nonShutdownError((error) => {\n log.error('Shutdown error:', error);\n});\n\nonShutdown('app', async () => {\n log.info('Shutdown signal received');\n await shutdownApp(app);\n});\n`;\n\n/**\n * @group Types\n */\nexport namespace ManagedThread {\n export type State = AppInstance.State | 'ready';\n\n export interface LogEntry {\n ts: number;\n level: LogLevel;\n text: string;\n }\n\n export type EventMap = {\n ready: [];\n state: [newState: State, oldState: State];\n log: [entry: LogEntry];\n pid: [pid: number];\n exit: [code: number | null, signal: NodeJS.Signals | null];\n message: [message: ManagedThread.ThreadMessage];\n error: [err: Error];\n } & {\n [K in ManagedThread.ThreadMessage as `msg:${K['type']}`]: [msg: K];\n };\n\n export type ThreadMessage =\n | ThreadMessage.AppState\n | ThreadMessage.Ping\n | ThreadMessage.Pong\n | ThreadMessage.Ready\n | ThreadMessage.Shutdown\n | ThreadMessage.ShutdownDone\n | ThreadMessage.Start\n | ThreadMessage.StartDone\n | ThreadMessage.Setup\n | ThreadMessage.SetupDone\n | ThreadMessage.Stop\n | ThreadMessage.StopDone;\n\n export type ThreadMessageMap = {\n [K in ManagedThread.ThreadMessage as K['type']]: K;\n };\n\n export type ThreadMessageDone<T extends string> =\n `${T}_done` extends keyof ThreadMessageMap ? `${T}_done` : never;\n\n export namespace ThreadMessage {\n export interface Base<T extends string> {\n type: T;\n vrun_app_thread_message: true;\n }\n\n export type AppState = Base<'app-state'> & {\n state: AppInstance.State;\n };\n\n export type Start = Base<'start'>;\n export type StartDone = Base<'start_done'> & { result: ExecResult };\n\n export type Setup = Base<'setup'> & { props: Data };\n export type SetupDone = Base<'setup_done'> & { result: ExecResult };\n\n export type Stop = Base<'stop'>;\n export type StopDone = Base<'stop_done'> & { result: ExecResult };\n\n export type Shutdown = Base<'shutdown'>;\n export type ShutdownDone = Base<'shutdown_done'> & { result: ExecResult };\n\n export type Ping = Base<'ping'>;\n export type Pong = Base<'pong'>;\n\n export type Ready = Base<'ready'> & {\n pid: number;\n };\n }\n}\n\n/**\n * A child process managed by the parent.\n * @group Types\n */\nexport interface ManagedThread {\n child: cp.ChildProcess;\n threadId: number;\n pid: number;\n state: ManagedThread.State;\n restartCount: number;\n scriptFile: string;\n threadProps: Record<string, unknown>;\n eventBus: EventEmitter<ManagedThread.EventMap>;\n scheduler: Scheduler;\n\n writeLog(level: LogLevel, event: string, fields?: LogEventFields): void;\n\n /** @internal */ heartbeatTimer?: NodeJS.Timeout;\n /** @internal */ lastPong: number;\n}\n\nfunction setState(w: ManagedThread, next: ManagedThread.State): void {\n const prev = w.state;\n if (prev === next) return;\n w.state = next;\n w.writeLog('debug', 'state', { from: prev, to: next });\n w.eventBus.emit('state', next, prev);\n}\n\nfunction spawnChild(w: ManagedThread): void {\n w.writeLog('debug', 'thread.spawn.start', {\n script: path.basename(w.scriptFile),\n thread: w.threadId,\n });\n setState(w, 'init');\n\n const child = cp.spawn(\n process.execPath,\n ['--input-type=module', '-e', bootstrapCode],\n {\n stdio:\n w.threadProps.__inheritIO !== false\n ? ['pipe', 'inherit', 'inherit', 'ipc']\n : ['pipe', 'pipe', 'pipe', 'ipc'],\n env: {\n ...process.env,\n VRUN_PROCESS_SCRIPT_FILE: w.scriptFile,\n VRUN_PROCESS_ID: String(w.threadId),\n },\n },\n );\n w.child = child;\n\n const onData = (chunk: Buffer | string) => {\n const text = chunk.toString('utf8');\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length === 0) continue;\n w.eventBus.emit('log', parseRawLogLine(line));\n }\n };\n child.stdout?.on('data', onData);\n child.stderr?.on('data', onData);\n\n child.on('message', (msg: unknown) => {\n if (isThreadMessage(msg)) {\n w.eventBus.emit('message', msg);\n w.eventBus.emit(`msg:${msg.type}` as any, msg);\n }\n });\n\n child.once('exit', (code, signal) => {\n w.eventBus.emit('exit', code, signal);\n });\n\n child.on('error', err => {\n w.writeLog('error', 'thread.spawn.error', { message: err.message });\n w.eventBus.emit('error', err);\n });\n}\n\nfunction startHeartbeat(w: ManagedThread): void {\n w.lastPong = Date.now();\n w.heartbeatTimer = setInterval(() => {\n if (w.state !== APP_INSTANCE_STATE.RUN) {\n clearInterval(w.heartbeatTimer);\n return;\n }\n const since = Date.now() - w.lastPong;\n if (since > HEARTBEAT_TIMEOUT_MS) {\n clearInterval(w.heartbeatTimer);\n w.writeLog('warn', 'heartbeat.miss', { since_ms: since });\n restartThreadApp(w).catch(err => w.eventBus.emit('error', err));\n return;\n }\n if (w.child.connected) {\n w.child.send(createThreadMessage('ping', {}));\n }\n }, HEARTBEAT_INTERVAL_MS);\n}\n\nfunction waitForExit(w: ManagedThread, timeoutMs: number): Promise<void> {\n if (isThreadExit(w)) {\n return Promise.resolve();\n }\n\n return new Promise<void>(resolve => {\n w.writeLog('info', 'thread.exit.waiting', { timeout_ms: timeoutMs });\n\n const cleanup = () => {\n clearTimeout(slowTimer);\n clearTimeout(killTimer);\n w.child.off('exit', onExit);\n };\n\n const onExit = () => {\n cleanup();\n resolve();\n };\n\n const halfway = Math.floor(timeoutMs / 2);\n\n const slowTimer = setTimeout(() => {\n w.writeLog('warn', 'thread.exit.slow', { elapsed_ms: halfway });\n }, halfway);\n\n const killTimer = setTimeout(() => {\n cleanup();\n try {\n w.writeLog('warn', 'thread.exit.force-kill', { timeout_ms: timeoutMs });\n w.child.kill('SIGKILL');\n } catch {}\n resolve();\n }, timeoutMs);\n\n w.child.once('exit', onExit);\n });\n}\n\n/**\n * Wait for thread ready signal\n * @group Threads\n */\nexport function waitForThreadReady(w: ManagedThread): Promise<void> {\n if (w.state === 'ready') {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n w.eventBus.off('ready', onReady);\n w.eventBus.off('error', onError);\n w.eventBus.off('exit', onExit);\n };\n\n const onReady = () => {\n resolve();\n cleanup();\n };\n\n const onExit = (code: number | null) => {\n reject(new Error(`Child exited before ready (code=${code ?? 'null'})`));\n cleanup();\n };\n\n const onError = (error: Error) => {\n reject(error);\n cleanup();\n };\n\n w.eventBus.once('ready', onReady);\n w.eventBus.once('error', onError);\n w.eventBus.once('exit', onExit);\n });\n}\n\nfunction sendAndWait<T extends ManagedThread.ThreadMessage>(\n w: ManagedThread,\n message: T,\n replyType: ManagedThread.ThreadMessageDone<T['type']>,\n timeout = 30_000,\n): Promise<\n ExecResult<{\n reply: ManagedThread.ThreadMessageMap[ManagedThread.ThreadMessageDone<\n T['type']\n >];\n }>\n> {\n return new Promise(resolve => {\n const eventName = `msg:${replyType}`;\n const cleanup = () => {\n w.eventBus.off(eventName as any, onReply);\n w.eventBus.off('exit', onExit);\n clearTimeout(timer);\n };\n\n const timer = setTimeout(() => {\n cleanup();\n w.writeLog('error', 'parent.ipc.timeout', {\n waiting: replyType,\n ms: timeout,\n });\n resolve({\n skip: true,\n code: 'parent.ipc.timeout',\n reason: `Thread ${path.basename(w.scriptFile)} timed out waiting for \"${replyType}\"`,\n });\n }, timeout);\n\n const onReply = (reply: ManagedThread.ThreadMessage) => {\n cleanup();\n resolve({\n success: true,\n code: 'parent.ipc.recv',\n reply: reply as any,\n });\n };\n\n const onExit = () => {\n const reason = `thread.exit (code=${w.child.exitCode} signal=${w.child.signalCode ?? 'null'})`;\n w.writeLog('debug', 'parent.ipc.skipped', {\n waiting: replyType,\n reason,\n });\n resolve({ skip: true, code: 'thread.exit', reason });\n return;\n };\n\n if (isThreadExit(w)) {\n return void onExit();\n }\n\n w.eventBus.once('exit', onExit);\n w.eventBus.once(eventName as any, onReply);\n w.writeLog('debug', 'parent.ipc.send', message);\n\n try {\n w.child.send(message);\n } catch (err) {\n const error = toError(err);\n w.writeLog('error', 'parent.ipc.fail', {\n message,\n error: error.message,\n });\n cleanup();\n resolve({\n skip: true,\n code: 'parent.ipc.fail',\n reason: error.message,\n });\n }\n });\n}\n\n/**\n * Spawn a child process for `scriptFile` and return its {@link ManagedThread}\n * immediately — synchronously, before the child signals readiness.\n * @group Threads\n */\nexport function initThread(\n threadId: number,\n scriptFile: string,\n threadProps: Record<string, unknown>,\n): ManagedThread {\n const w: ManagedThread = {\n threadId,\n scriptFile,\n threadProps,\n pid: 0,\n state: APP_INSTANCE_STATE.INIT,\n restartCount: 0,\n lastPong: 0,\n child: null as any,\n scheduler: new Scheduler(),\n eventBus: new EventEmitter(),\n\n writeLog(level, event, fields) {\n w.eventBus.emit('log', {\n level,\n text: formatLogEvent(event, fields),\n ts: Date.now(),\n });\n },\n };\n\n w.eventBus.setMaxListeners(0);\n\n const onJobPhase =\n (phase: string) =>\n (job: Scheduler.JobOptions): void => {\n w.writeLog('debug', `job.${job.jobName ?? 'untitled'}.${phase}`);\n };\n\n w.scheduler.onJob(onJobPhase('queue'));\n w.scheduler.onJobStart(onJobPhase('start'));\n w.scheduler.onJobComplete(onJobPhase('done'));\n\n w.eventBus.on('exit', (code, signal) => {\n const prevState = w.state;\n\n if (signal) {\n w.writeLog('warn', 'thread.exit.signal', { signal, code });\n } else if (code === 0 || code === null) {\n w.writeLog('info', 'thread.exit.clean', { code });\n } else {\n w.writeLog('error', 'thread.exit.crash', { code });\n }\n\n setState(w, 'shutdown');\n clearInterval(w.heartbeatTimer);\n w.pid = 0;\n\n if (prevState === APP_INSTANCE_STATE.RUN && !isShuttingDown()) {\n restartThreadApp(w).catch(err => w.eventBus.emit('error', err));\n }\n });\n\n w.eventBus.on('message', msg => {\n w.writeLog('debug', 'parent.ipc.recv', msg);\n\n switch (msg.type) {\n case 'app-state': {\n setState(w, msg.state);\n break;\n }\n\n case 'ready': {\n w.pid = msg.pid;\n w.eventBus.emit('pid', msg.pid);\n setState(w, 'ready');\n w.writeLog('debug', 'thread.spawn.ready');\n w.eventBus.emit('ready');\n break;\n }\n\n case 'pong': {\n w.lastPong = Date.now();\n break;\n }\n }\n });\n\n spawnChild(w);\n\n return w;\n}\n\nfunction withLifecycle<T>(\n w: ManagedThread,\n phase: string,\n fn: () => Promise<T>,\n): Promise<T> {\n w.writeLog('debug', `lifecycle.${phase}.begin`);\n return fn().then(\n result => {\n w.writeLog('debug', `lifecycle.${phase}.done`);\n return result;\n },\n error => {\n w.writeLog('error', `lifecycle.${phase}.fail`, {\n message: String((error && error.message) || error),\n });\n throw error;\n },\n );\n}\n\n/**\n * Send the setup message; resolves when child replies setup_done.\n * @group Threads\n */\nexport function setupThreadApp(w: ManagedThread): Promise<void> {\n return w.scheduler.queueJobWait(\n () => withLifecycle(w, 'setupThreadApp', () => doSetupThread(w)),\n { jobName: 'setupThreadApp' },\n );\n}\n\nfunction doSetupThread(w: ManagedThread): Promise<void> {\n setState(w, APP_INSTANCE_STATE.IN_SETUP);\n return sendAndWait(\n w,\n createThreadMessage('setup', {\n props: w.threadProps,\n }),\n 'setup_done',\n ).then(noop);\n}\n\n/**\n * Send the start message; on reply, switch to running and arm heartbeat.\n * @group Threads\n */\nexport function startThreadApp(w: ManagedThread): Promise<void> {\n return w.scheduler.queueJobWait(\n () => withLifecycle(w, 'startThreadApp', () => doStartThreadApp(w)),\n { jobName: 'startThreadApp' },\n );\n}\n\nfunction doStartThreadApp(w: ManagedThread): Promise<void> {\n setState(w, APP_INSTANCE_STATE.IN_RUN);\n return sendAndWait(w, createThreadMessage('start', {}), 'start_done').then(\n () => {\n if (w.state === APP_INSTANCE_STATE.RUN) {\n startHeartbeat(w);\n }\n },\n );\n}\n\n/**\n * Send the stop message; child keeps running, app inside is stopped.\n * @group Threads\n */\nexport function stopThreadApp(w: ManagedThread): Promise<void> {\n return w.scheduler.queueJobWait(\n () => withLifecycle(w, 'stopThreadApp', () => doStopThreadApp(w)),\n { jobName: 'stopThreadApp' },\n );\n}\n\nfunction doStopThreadApp(w: ManagedThread): Promise<void> {\n setState(w, APP_INSTANCE_STATE.IN_STOP);\n clearInterval(w.heartbeatTimer);\n return sendAndWait(w, createThreadMessage('stop', {}), 'stop_done').then(\n noop,\n );\n}\n\n/**\n * Send shutdown and wait for the OS process to exit (SIGKILL fallback).\n * @group Threads\n */\nexport function shutdownThreadApp(w: ManagedThread): Promise<void> {\n return w.scheduler.queueJobWait(\n () => withLifecycle(w, 'shutdownThreadApp', () => doShutdownThreadApp(w)),\n { jobName: 'shutdownThreadApp' },\n );\n}\n\nfunction doShutdownThreadApp(w: ManagedThread): Promise<void> {\n setState(w, 'shutdown');\n clearInterval(w.heartbeatTimer);\n\n return (\n w.child.connected\n ? sendAndWait(\n w,\n createThreadMessage('shutdown', {}),\n 'shutdown_done',\n SHUTDOWN_REPLY_TIMEOUT_MS,\n )\n : Promise.resolve()\n ).then(() => waitForExit(w, SHUTDOWN_EXIT_TIMEOUT_MS));\n}\n\n/**\n * Terminate the child and spawn a fresh one with the same script + props.\n * @group Threads\n */\nexport function restartThreadApp(w: ManagedThread): Promise<void> {\n if (w.restartCount >= MAX_RESTARTS) {\n return Promise.reject(\n new Error(`Thread ${w.threadId} exceeded max restarts (${MAX_RESTARTS})`),\n );\n }\n\n return w.scheduler.queueJobWait(\n () =>\n withLifecycle(w, 'restartThreadApp', () =>\n doShutdownThreadApp(w)\n .then(() => {\n w.restartCount++;\n spawnChild(w);\n return waitForThreadReady(w);\n })\n .then(() => doSetupThread(w))\n .then(() => doStartThreadApp(w)),\n ),\n { jobName: 'restartThreadApp' },\n );\n}\n\nexport function isThreadMessage(\n value: unknown,\n): value is ManagedThread.ThreadMessage {\n return isObject(value) && !!(value as any).vrun_app_thread_message;\n}\n\nexport function createThreadMessage<\n T extends keyof ManagedThread.ThreadMessageMap,\n>(\n type: T,\n msg: Omit<\n ManagedThread.ThreadMessageMap[T],\n 'type' | 'vrun_app_thread_message'\n >,\n): ManagedThread.ThreadMessageMap[T] {\n return {\n type,\n ...msg,\n vrun_app_thread_message: true,\n } as any;\n}\n\nfunction parseRawLogLine(line: string): ManagedThread.LogEntry {\n const trimmed = line.trimEnd();\n const lower = trimmed.toLowerCase();\n let level: LogLevel = 'info';\n if (\n lower.includes('error') ||\n lower.includes('✖') ||\n lower.includes('[error]')\n ) {\n level = 'error';\n } else if (lower.includes('warn') || lower.includes('⚠')) {\n level = 'warn';\n } else if (lower.includes('debug') || lower.includes('⚙')) {\n level = 'debug';\n }\n return { ts: Date.now(), level, text: trimmed };\n}\n\nexport function isThreadExit(w: ManagedThread): boolean {\n return (\n w.child.exitCode !== null ||\n w.child.signalCode !== null ||\n !w.child.connected\n );\n}\n","import { assert, catchError, isFunction, noop } from '@andrew_l/toolkit';\nimport {\n type AppDefinition,\n type AppInstance,\n createAppInstance,\n defineApp,\n runApp,\n setupApp,\n shutdownApp,\n stopApp,\n} from './app.ts';\nimport {\n type ManagedThread,\n createThreadMessage,\n initThread,\n isThreadMessage,\n setupThreadApp,\n shutdownThreadApp,\n startThreadApp,\n stopThreadApp,\n waitForThreadReady,\n} from './managedThread.ts';\nimport { createAppLogger, formatLogEvent } from './utils/log.ts';\n\n/**\n * Wrap an app definition to run across N child processes. Adds a\n * `threads` prop and manages the full lifecycle of each child.\n * @group Types\n */\nexport function createAppThread(definition: AppDefinition): AppDefinition {\n const scriptFile = definition.filePath;\n\n assert.ok(\n scriptFile,\n `Failed to detect definition file path for: ${definition.name}`,\n );\n\n const app = defineApp({\n name: definition.name,\n description: definition.description,\n props: {\n ...(definition.props || {}),\n threads: {\n type: Number,\n description: 'Amount of threads',\n default: () => 1,\n parser: v => parseInt(v),\n },\n },\n\n logger: false,\n\n setup(props) {\n const { threads = 1, ...threadProps } = props;\n\n assert.greaterThan(threads, 0, 'threads expected to be greater than 0');\n\n const managedThreads: ManagedThread[] = Array.from(\n { length: threads },\n (_, i) => initThread(i + 1, scriptFile, threadProps),\n );\n\n // Write child logs into parent process\n if ((props as any).__inheritIO !== false) {\n for (const w of managedThreads) {\n const childLogger = createAppLogger({\n ...definition,\n name: `${definition.name}.${w.threadId}`,\n });\n\n w.eventBus.on('log', entry => {\n childLogger[entry.level](entry.text);\n });\n }\n }\n\n return Promise.all(managedThreads.map(w => waitForThreadReady(w)))\n .then(() => Promise.all(managedThreads.map(w => setupThreadApp(w))))\n .then(() => ({ managedThreads }));\n },\n\n entry() {\n return Promise.all(this.managedThreads.map(w => startThreadApp(w))).then(\n noop,\n );\n },\n\n stop() {\n return Promise.all(this.managedThreads.map(w => stopThreadApp(w))).then(\n noop,\n );\n },\n\n shutdown() {\n return Promise.all(\n this.managedThreads.map(w => shutdownThreadApp(w)),\n ).then(() => {\n this.managedThreads = [];\n });\n },\n });\n\n return app;\n}\n\nexport interface CreateAppThreadInstanceParams {\n definition: AppDefinition;\n parentPort: ParentPortLike;\n threadId: number;\n onShutdown?: () => void;\n}\n\n/**\n * A minimal port abstraction implemented by both IPC `MessagePort`\n * and the `process`-based shim spawned by {@link initThread}.\n * @group Types\n */\nexport interface ParentPortLike {\n on(event: 'message', cb: (msg: unknown) => void): unknown;\n postMessage(msg: unknown, cb?: () => void): unknown;\n close?(): unknown;\n}\n\n/**\n * Create app instance with IPC fully managed lifecycle\n * @group Threads\n */\nexport function createAppThreadInstance({\n definition,\n parentPort,\n threadId,\n onShutdown = noop,\n}: CreateAppThreadInstanceParams): AppInstance {\n definition = { ...definition };\n definition.name += '.' + threadId;\n\n const instance = createAppInstance(definition);\n const log = instance.logger;\n\n const postMessage = (\n message: ManagedThread.ThreadMessage,\n cb?: () => void,\n ) => {\n log.debug(formatLogEvent('child.ipc.send', message));\n parentPort.postMessage(message, cb);\n };\n\n instance.eventBus.on('state', newState => {\n postMessage(createThreadMessage('app-state', { state: newState }));\n });\n\n parentPort.on('message', async message => {\n if (!isThreadMessage(message)) return;\n\n log.debug(formatLogEvent('child.ipc.recv', message));\n\n switch (message.type) {\n case 'setup': {\n const result = await setupApp(instance, message.props);\n postMessage(createThreadMessage('setup_done', { result }));\n break;\n }\n\n case 'start': {\n const result = await runApp(instance);\n postMessage(createThreadMessage('start_done', { result }));\n break;\n }\n case 'stop': {\n const result = await stopApp(instance);\n postMessage(createThreadMessage('stop_done', { result }));\n break;\n }\n case 'shutdown': {\n const result = await shutdownApp(instance);\n postMessage(createThreadMessage('shutdown_done', { result }), () => {\n setImmediate(() => {\n catchError(onShutdown);\n if (isFunction(parentPort.close)) {\n parentPort.close!();\n }\n });\n });\n break;\n }\n case 'ping': {\n postMessage(createThreadMessage('pong', {}));\n break;\n }\n }\n });\n\n postMessage(\n createThreadMessage('ready', {\n pid: process.pid,\n }),\n );\n\n return instance;\n}\n","import { assert, getFileExtension, isString, uniq } from '@andrew_l/toolkit';\n\nimport dotenv from 'dotenv';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { getColor } from 'consola/utils';\nimport { CONFIG } from './config.js';\nimport { log } from './logger.js';\n\nconst TYPESCRIPT_EXTENSIONS = ['mts', 'cts', 'ts'];\nconst JAVASCRIPT_EXTENSIONS = ['js', 'mjs', 'cjs'];\n\nconst ALL_EXTENSIONS = [\n ...TYPESCRIPT_EXTENSIONS,\n ...JAVASCRIPT_EXTENSIONS,\n 'json',\n];\n\nexport interface Project {\n /**\n * Project absolute path\n */\n path: string;\n\n /**\n * Project name from package.json\n */\n name: string;\n\n /**\n * Project description form package.json\n */\n description: string;\n\n /**\n * Project version from package.json\n */\n version: string;\n\n /**\n * tsconfig file absolute path\n */\n tsconfigPath: string | null;\n\n /**\n * Dotenv file absolute path\n */\n dotenvPath: string | null;\n\n /**\n * Files to be auto imported during application launching.\n */\n autoImports: string[];\n\n /**\n * A list of directories to check where a file can be located for import\n */\n importLookupPaths: string[];\n\n /**\n * Package json data\n */\n packageJson: Record<string, any>;\n\n /**\n * Indicates typescript import supports\n */\n allowTs: boolean;\n}\n\n/**\n * Create a project instance from path\n */\nexport function createProject(projectPath: string): Project {\n const packageJsonPath = locateNearestFile(projectPath, 'package.json');\n\n assert.ok(\n packageJsonPath,\n 'package.json not found in path: ' + path.dirname(projectPath),\n );\n\n const packageJson = importJson(packageJsonPath);\n const projectLocation = path.dirname(packageJsonPath);\n\n const project: Project = {\n path: projectLocation,\n name: packageJson.name || path.basename(projectPath),\n description: packageJson.description || '',\n version: packageJson.version || '0.0.0',\n tsconfigPath: locateNearestFile(projectLocation, 'tsconfig.json'),\n dotenvPath: locateNearestFile(projectLocation, '.env'),\n autoImports: ['inversify.config'],\n importLookupPaths: createImportLookupPaths(projectLocation),\n allowTs: false,\n packageJson,\n };\n\n project.autoImports = project.autoImports\n .map(v => projectResolveFile(project, v))\n .filter(isString);\n\n return project;\n}\n\n/**\n * Lookup and import file from project\n */\nexport function projectImportFile<T = any>(\n project: Project,\n filePath: string,\n): Promise<T> {\n const existedFile = projectResolveFile(project, filePath);\n\n if (!existedFile) {\n throw new Error(\n `Cannot resolve import for path.\\n Path:\\n ${filePath}\\n Available extensions: ${ALL_EXTENSIONS.join(', ')}`,\n );\n }\n\n const ext = getFileExtension(existedFile, false);\n\n if (ext === 'json') {\n const data = importJson(existedFile);\n return Promise.resolve({ default: data } as T);\n }\n\n return import(existedFile);\n}\n\n/**\n * Resolve absolute file path for import\n */\nexport function projectResolveFile(\n project: Project,\n filePath: string,\n): string | null {\n const pathVariants: string[] = project.importLookupPaths.map(dir =>\n path.resolve(dir, filePath),\n );\n\n for (const filePath of pathVariants) {\n const pathVariants = ALL_EXTENSIONS.includes(\n getFileExtension(filePath, false)!,\n )\n ? [filePath]\n : [...ALL_EXTENSIONS.map(ext => `${filePath}.${ext}`)];\n\n const existedPath = pathVariants.find(v => fs.existsSync(v));\n\n if (existedPath) {\n return existedPath;\n }\n }\n\n return null;\n}\n\nexport async function projectLoadEnv(project: Project): Promise<boolean> {\n if (!project.dotenvPath) {\n return false;\n }\n\n dotenv.config({\n path: project.dotenvPath,\n quiet: true,\n });\n\n return true;\n}\n\nexport async function projectAutoImport(project: Project): Promise<string[]> {\n const result: string[] = [];\n const filePaths = project.autoImports.map(filePath =>\n projectResolveFile(project, filePath),\n );\n\n for (const filePath of filePaths) {\n if (filePath) {\n await projectImportFile(project, filePath);\n result.push(filePath.replace(project.path, ''));\n }\n }\n\n return result;\n}\n\nexport function projectPrintInfo(project: Project) {\n const tags: string[] = [];\n\n if (project.allowTs) {\n tags.push(getColor('bgBlue')(' TS '));\n }\n\n if (CONFIG.WATCH_MODE) {\n tags.push(getColor('bgMagenta')(' WATCH '));\n }\n\n if (project.dotenvPath) {\n tags.push(getColor('bgYellow')(` ${path.basename(project.dotenvPath)} `));\n }\n\n if (project.autoImports.length) {\n tags.push(\n getColor('bgGreen')(\n ` IMPORT: ${project.autoImports.map(v => path.relative(project.path, v)).join(' | ')} `,\n ),\n );\n }\n\n log.info(\n '%s (%s)%s',\n project.name,\n project.version,\n tags.length ? ` ${tags.join(' ')}` : '',\n );\n}\n\nfunction createImportLookupPaths(\n projectPath: string,\n appRoot: string | null = CONFIG.APP_ROOT,\n): string[] {\n const cwd = process.cwd();\n const result: string[] = [];\n\n if (appRoot) {\n result.push(path.resolve(cwd, appRoot));\n }\n\n result.push(path.resolve(cwd));\n result.push(path.resolve(projectPath));\n\n return uniq(result);\n}\n\nfunction locateNearestFile(location: string, fileName: string): string | null {\n let currentDir = path.extname(location)\n ? path.dirname(path.resolve(location))\n : path.resolve(location);\n\n while (currentDir) {\n const filePath = path.join(currentDir, fileName);\n\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n\n currentDir = parentDir;\n }\n\n return null;\n}\n\nfunction importJson(filePath: string): any {\n if (!filePath.endsWith('.json')) {\n filePath += '.json';\n }\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`JSON file not found.\\n Path:\\n ${filePath}`);\n }\n\n const data = fs.readFileSync(filePath, { encoding: 'utf-8' });\n return JSON.parse(data);\n}\n","import type { LogLevel } from '@andrew_l/toolkit';\nimport { EventEmitter } from 'node:events';\nimport type { ManagedThread } from '../managedThread.ts';\n\nexport interface LogEntry {\n ts: number;\n level: LogLevel;\n text: string;\n}\n\nexport interface ThreadNode {\n kind: 'thread';\n id: string;\n name: string;\n parentId: string;\n threadId: number;\n pid: number;\n state: ManagedThread.State;\n}\n\nexport interface AppNode {\n kind: 'app';\n id: string;\n name: string;\n state: ManagedThread.State;\n expanded: boolean;\n threads: ThreadNode[] | null;\n}\n\nexport type TreeNode = AppNode | ThreadNode;\n\nexport type LevelFilter = 'all' | 'info' | 'warn' | 'error';\n\nexport interface LifecycleHandlers {\n stop(id: string): Promise<void>;\n start(id: string): Promise<void>;\n restart(id: string): Promise<void>;\n}\n\nconst LOG_BUFFER_CAP = 2000;\n\nclass RingBuffer<T> {\n private buf: T[] = [];\n private start = 0;\n constructor(private cap: number) {}\n push(item: T): void {\n if (this.buf.length < this.cap) {\n this.buf.push(item);\n } else {\n this.buf[this.start] = item;\n this.start = (this.start + 1) % this.cap;\n }\n }\n size(): number {\n return this.buf.length;\n }\n toArray(): T[] {\n if (this.start === 0) return this.buf.slice();\n return this.buf.slice(this.start).concat(this.buf.slice(0, this.start));\n }\n clear(): void {\n this.buf = [];\n this.start = 0;\n }\n}\n\nexport interface TuiStore {\n apps: AppNode[];\n logs: Map<string, RingBuffer<LogEntry>>;\n system: LogEntry | null;\n selectedId: string | null;\n filter: LevelFilter;\n logScroll: number;\n handlers: LifecycleHandlers;\n pushLog(nodeId: string, entry: LogEntry): void;\n setState(nodeId: string, state: ManagedThread.State): void;\n setSelected(nodeId: string | null): void;\n setFilter(filter: LevelFilter): void;\n setSystem(entry: LogEntry): void;\n toggleExpand(appId: string): void;\n addApp(node: AppNode): void;\n setThreads(appId: string, threads: ThreadNode[]): void;\n setPid(nodeId: string, pid: number): void;\n getLogs(nodeId: string): LogEntry[];\n clearLogs(nodeId: string): void;\n setLogScroll(offset: number): void;\n subscribe(fn: () => void): () => void;\n}\n\nconst noopHandlers: LifecycleHandlers = {\n stop: () => Promise.resolve(),\n start: () => Promise.resolve(),\n restart: () => Promise.resolve(),\n};\n\nexport function createTuiStore(): TuiStore {\n const emitter = new EventEmitter();\n emitter.setMaxListeners(0);\n const logs = new Map<string, RingBuffer<LogEntry>>();\n const apps: AppNode[] = [];\n\n const bufferOf = (id: string): RingBuffer<LogEntry> => {\n let buf = logs.get(id);\n if (!buf) {\n buf = new RingBuffer<LogEntry>(LOG_BUFFER_CAP);\n logs.set(id, buf);\n }\n return buf;\n };\n\n const notify = (): void => {\n emitter.emit('change');\n };\n\n const isSelectedFeed = (nodeId: string): boolean => {\n if (!store.selectedId) return false;\n if (store.selectedId === nodeId) return true;\n for (const app of apps) {\n if (app.id !== store.selectedId) continue;\n return !!app.threads?.some(t => t.id === nodeId);\n }\n return false;\n };\n\n const store: TuiStore = {\n apps,\n logs,\n system: null,\n selectedId: null,\n filter: 'info',\n logScroll: 0,\n handlers: noopHandlers,\n pushLog(nodeId, entry) {\n bufferOf(nodeId).push(entry);\n if (\n store.logScroll > 0 &&\n isSelectedFeed(nodeId) &&\n passesFilter(entry, store.filter)\n ) {\n store.logScroll += 1;\n }\n notify();\n },\n setState(nodeId, state) {\n for (const app of apps) {\n if (app.id === nodeId) {\n app.state = state;\n notify();\n return;\n }\n if (app.threads) {\n for (const t of app.threads) {\n if (t.id === nodeId) {\n t.state = state;\n notify();\n return;\n }\n }\n }\n }\n },\n setSelected(nodeId) {\n store.selectedId = nodeId;\n store.logScroll = 0;\n notify();\n },\n setFilter(filter) {\n store.filter = filter;\n store.logScroll = 0;\n notify();\n },\n setLogScroll(offset) {\n store.logScroll = Math.max(0, offset);\n notify();\n },\n setSystem(entry) {\n store.system = entry;\n notify();\n },\n toggleExpand(appId) {\n for (const app of apps) {\n if (app.id === appId) {\n app.expanded = !app.expanded;\n notify();\n return;\n }\n }\n },\n addApp(node) {\n apps.push(node);\n if (!store.selectedId) store.selectedId = node.id;\n notify();\n },\n setThreads(appId, threads) {\n for (const app of apps) {\n if (app.id === appId) {\n app.threads = threads;\n notify();\n return;\n }\n }\n },\n setPid(nodeId, pid) {\n for (const app of apps) {\n if (app.threads) {\n for (const t of app.threads) {\n if (t.id === nodeId) {\n t.pid = pid;\n notify();\n return;\n }\n }\n }\n }\n },\n getLogs(nodeId) {\n const buf = logs.get(nodeId);\n return buf ? buf.toArray() : [];\n },\n clearLogs(nodeId) {\n logs.get(nodeId)?.clear();\n notify();\n },\n subscribe(fn) {\n emitter.on('change', fn);\n return () => emitter.off('change', fn);\n },\n };\n\n return store;\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n debug: 0,\n log: 1,\n info: 2,\n warn: 3,\n error: 4,\n};\n\nconst FILTER_THRESHOLD: Record<LevelFilter, number> = {\n all: 0,\n info: LEVEL_RANK.info,\n warn: LEVEL_RANK.warn,\n error: LEVEL_RANK.error,\n};\n\nexport function passesFilter(entry: LogEntry, filter: LevelFilter): boolean {\n return LEVEL_RANK[entry.level] >= FILTER_THRESHOLD[filter];\n}\n\nexport function getSelectedFilteredCount(store: TuiStore): number {\n if (!store.selectedId) return 0;\n const passes = (e: LogEntry): boolean => passesFilter(e, store.filter);\n for (const app of store.apps) {\n if (app.id !== store.selectedId) continue;\n if (!app.threads || app.threads.length === 0) {\n return store.getLogs(app.id).filter(passes).length;\n }\n let count = 0;\n for (const t of app.threads) {\n for (const e of store.getLogs(t.id)) if (passes(e)) count += 1;\n }\n return count;\n }\n return store.getLogs(store.selectedId).filter(passes).length;\n}\n\nexport function nextFilter(filter: LevelFilter): LevelFilter {\n switch (filter) {\n case 'all':\n return 'info';\n case 'info':\n return 'warn';\n case 'warn':\n return 'error';\n case 'error':\n return 'all';\n }\n}\n\nexport function flattenVisibleTree(apps: AppNode[]): TreeNode[] {\n const out: TreeNode[] = [];\n for (const app of apps) {\n out.push(app);\n if (app.expanded && app.threads) {\n for (const t of app.threads) out.push(t);\n }\n }\n return out;\n}\n","import { createContext, useContext, useEffect, useState } from 'react';\nimport type { TuiStore } from '../store.ts';\n\nexport const TuiStoreContext = createContext<TuiStore | null>(null);\n\nexport function useTuiStore(): TuiStore {\n const store = useContext(TuiStoreContext);\n if (!store) throw new Error('TuiStoreContext is not provided');\n return store;\n}\n\nexport function useStoreSnapshot(): number {\n const store = useTuiStore();\n const [version, setVersion] = useState(0);\n useEffect(() => {\n return store.subscribe(() => setVersion(v => v + 1));\n }, [store]);\n return version;\n}\n","import { Box, Text } from 'ink';\nimport type { JSX } from 'react';\nimport type { ManagedThread } from '../../managedThread.ts';\nimport { type AppNode, flattenVisibleTree } from '../store.ts';\nimport { useStoreSnapshot, useTuiStore } from './useTuiStore.ts';\n\nconst STATE_COLORS: Record<ManagedThread.State, string> = {\n 'in-run': 'yellow',\n run: 'green',\n 'in-stop': 'yellow',\n 'in-setup': 'yellow',\n setup: 'yellow',\n ready: 'gray',\n 'in-shutdown': 'yellow',\n init: 'gray',\n shutdown: 'gray',\n stop: 'gray',\n error: 'red',\n};\n\nfunction isApp(n: { kind: string }): n is AppNode {\n return n.kind === 'app';\n}\n\nfunction rowLength(n: { kind: string; name?: string; pid?: number }): number {\n // marker + caret/space + space + bullet + space + label\n if (n.kind === 'app') return 1 + 1 + 1 + 1 + 1 + (n.name?.length ?? 0);\n return 1 + 2 + 1 + 1 + `PID ${n.pid}`.length;\n}\n\nexport function AppList(): JSX.Element {\n useStoreSnapshot();\n const store = useTuiStore();\n const nodes = flattenVisibleTree(store.apps);\n const maxRow = nodes.reduce(\n (m, n) => Math.max(m, rowLength(n)),\n 'Apps'.length,\n );\n // border (2) + paddingX (2)\n const width = maxRow + 4;\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n flexShrink={0}\n borderStyle=\"single\"\n paddingX={1}\n overflow=\"hidden\"\n >\n <Text bold>Apps</Text>\n {nodes.map(node => {\n const selected = node.id === store.selectedId;\n const color = STATE_COLORS[node.state];\n const marker = selected ? '▌' : ' ';\n if (isApp(node)) {\n const caret =\n node.threads && node.threads.length\n ? node.expanded\n ? '▾'\n : '▸'\n : ' ';\n return (\n <Text key={node.id} wrap=\"truncate-end\" bold={selected}>\n <Text color=\"cyan\">{marker}</Text>\n {caret} <Text color={color}>●</Text> {node.name}\n </Text>\n );\n }\n return (\n <Text key={node.id} wrap=\"truncate-end\" bold={selected}>\n <Text color=\"cyan\">{marker}</Text>\n {' '}\n <Text color={color}>●</Text> {node.name}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import type { LogLevel } from '@andrew_l/toolkit';\nimport { Box, Text, useStdout } from 'ink';\nimport type { JSX } from 'react';\nimport type { ManagedThread } from '../../managedThread.ts';\nimport { type LogEntry, type TuiStore, passesFilter } from '../store.ts';\nimport { useStoreSnapshot, useTuiStore } from './useTuiStore.ts';\n\nconst LEVEL_COLORS: Record<LogLevel, string> = {\n debug: 'gray',\n log: 'white',\n info: 'cyan',\n warn: 'yellow',\n error: 'red',\n};\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts);\n const pad = (n: number): string => n.toString().padStart(2, '0');\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\ninterface NodeInfo {\n appName: string;\n pid?: number;\n pids: number[];\n state?: ManagedThread.State;\n states: ManagedThread.State[];\n processCount: number;\n showProcessTag: boolean;\n}\n\nfunction describeSelection(store: TuiStore): NodeInfo | null {\n if (!store.selectedId) return null;\n for (const app of store.apps) {\n if (app.id === store.selectedId) {\n const threads = app.threads ?? [];\n const pids = Array.from(\n new Set(threads.map(t => t.pid).filter(p => p > 0)),\n );\n return {\n appName: app.name,\n processCount: threads.length,\n pids,\n states: threads.map(v => v.state),\n showProcessTag: threads.length > 1,\n };\n }\n if (app.threads) {\n for (const t of app.threads) {\n if (t.id === store.selectedId) {\n return {\n appName: app.name,\n pid: t.pid,\n pids: t.pid > 0 ? [t.pid] : [],\n state: t.state,\n states: [t.state],\n processCount: app.threads.length,\n showProcessTag: false,\n };\n }\n }\n }\n }\n return null;\n}\n\nfunction formatPids(pids: number[]): string {\n if (pids.length === 0) return '?';\n if (pids.length === 1) return String(pids[0]);\n return pids.join(', ');\n}\n\nfunction gatherEntries(store: TuiStore, info: NodeInfo): LogEntry[] {\n if (!store.selectedId) return [];\n for (const app of store.apps) {\n if (app.id !== store.selectedId) continue;\n if (!app.threads || app.threads.length === 0) {\n return store.getLogs(app.id);\n }\n const merged: LogEntry[] = [];\n for (const t of app.threads) {\n for (const entry of store.getLogs(t.id)) {\n merged.push(\n info.showProcessTag\n ? { ...entry, text: `[${t.pid}] ${entry.text}` }\n : entry,\n );\n }\n }\n merged.sort((a, b) => a.ts - b.ts);\n return merged;\n }\n return store.getLogs(store.selectedId);\n}\n\nexport function LogView(): JSX.Element {\n useStoreSnapshot();\n const store = useTuiStore();\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 24;\n const visibleRows = Math.max(1, rows - 5);\n\n const info = describeSelection(store);\n let entries: LogEntry[] = [];\n let scrollLabel = '';\n if (info) {\n const all = gatherEntries(store, info);\n const filtered = all.filter(e => passesFilter(e, store.filter));\n const total = filtered.length;\n const maxOffset = Math.max(0, total - visibleRows);\n const offset = Math.min(store.logScroll, maxOffset);\n const end = total - offset;\n const start = Math.max(0, end - visibleRows);\n entries = filtered.slice(start, end);\n if (offset > 0) scrollLabel = ` · scrolled +${offset}`;\n }\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n flexShrink={1}\n borderStyle=\"single\"\n paddingX={1}\n overflow=\"hidden\"\n >\n <Box flexShrink={0} flexDirection=\"column\">\n {info ? (\n <Box justifyContent=\"space-between\">\n <Text bold wrap=\"truncate-end\">\n <Text color=\"cyan\">{info.appName}</Text>\n {info.processCount > 1 && info.pid == null ? (\n <Text color=\"gray\"> ({info.processCount} processes)</Text>\n ) : null}\n <Text color=\"gray\">\n {' '}\n · filter: {store.filter}\n {scrollLabel}\n </Text>\n </Text>\n <Text bold wrap=\"truncate-end\">\n <Text color=\"gray\">STATE {info.states.join(', ')}</Text>\n <Text color=\"gray\"> · </Text>\n <Text color=\"magenta\">PID {formatPids(info.pids)}</Text>\n </Text>\n </Box>\n ) : (\n <Text bold>\n <Text color=\"gray\"> (no selection)</Text>\n </Text>\n )}\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} flexShrink={1} overflow=\"hidden\">\n {entries.map((entry, idx) => (\n <Text key={idx} wrap=\"wrap\">\n <Text color=\"gray\">{formatTime(entry.ts)} </Text>\n <Text color={LEVEL_COLORS[entry.level]}>\n {entry.level.toUpperCase().padEnd(5)}\n </Text>{' '}\n {entry.text}\n </Text>\n ))}\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { JSX } from 'react';\nimport { useStoreSnapshot, useTuiStore } from './useTuiStore.ts';\n\nexport function StatusBar(): JSX.Element {\n useStoreSnapshot();\n const store = useTuiStore();\n const sys = store.system;\n\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n paddingX={1}\n flexShrink={0}\n height={1}\n >\n <Box flexShrink={1} overflow=\"hidden\">\n <Text wrap=\"truncate-end\">\n {sys ? (\n <>\n <Text color=\"gray\">[system] </Text>\n <Text color={sys.level === 'error' ? 'red' : 'white'}>\n {sys.text}\n </Text>\n </>\n ) : (\n <Text color=\"gray\">[system] ready</Text>\n )}\n </Text>\n </Box>\n <Box flexShrink={0}>\n <Text color=\"gray\">\n ↑/↓ · →/← · PgUp/PgDn · s · ⇧S · r · f · q\n </Text>\n </Box>\n </Box>\n );\n}\n","import { Box, useInput, useStdout } from 'ink';\nimport type { JSX } from 'react';\nimport type { TuiStore } from '../store.ts';\nimport {\n type AppNode,\n type TreeNode,\n flattenVisibleTree,\n getSelectedFilteredCount,\n nextFilter,\n} from '../store.ts';\nimport { AppList } from './AppList.tsx';\nimport { LogView } from './LogView.tsx';\nimport { StatusBar } from './StatusBar.tsx';\nimport { TuiStoreContext, useStoreSnapshot } from './useTuiStore.ts';\n\ninterface TuiRootProps {\n store: TuiStore;\n onExit: () => Promise<void>;\n}\n\nfunction findNodeAndApp(\n store: TuiStore,\n id: string,\n): { node: TreeNode; app: AppNode } | null {\n for (const app of store.apps) {\n if (app.id === id) return { node: app, app };\n if (app.threads) {\n for (const t of app.threads) {\n if (t.id === id) return { node: t, app };\n }\n }\n }\n return null;\n}\n\nfunction InnerTui({ store, onExit }: TuiRootProps): JSX.Element {\n useStoreSnapshot();\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 24;\n\n useInput((input, key) => {\n const visible = flattenVisibleTree(store.apps);\n if (visible.length === 0) return;\n const currentIdx = visible.findIndex(n => n.id === store.selectedId);\n const idx = currentIdx < 0 ? 0 : currentIdx;\n const selected = visible[idx];\n\n const visibleLogRows = Math.max(1, rows - 5);\n const halfPage = Math.max(1, Math.floor(visibleLogRows / 2));\n\n if (key.upArrow && key.shift) {\n const maxOffset = Math.max(\n 0,\n getSelectedFilteredCount(store) - visibleLogRows,\n );\n store.setLogScroll(Math.min(maxOffset, store.logScroll + halfPage));\n return;\n }\n if (key.downArrow && key.shift) {\n store.setLogScroll(Math.max(0, store.logScroll - halfPage));\n return;\n }\n if (key.home) {\n const total = getSelectedFilteredCount(store);\n store.setLogScroll(Math.max(0, total - visibleLogRows));\n return;\n }\n if (key.end) {\n store.setLogScroll(0);\n return;\n }\n if (key.upArrow) {\n const next = visible[Math.max(0, idx - 1)];\n if (next) store.setSelected(next.id);\n return;\n }\n if (key.downArrow) {\n const next = visible[Math.min(visible.length - 1, idx + 1)];\n if (next) store.setSelected(next.id);\n return;\n }\n if (key.rightArrow) {\n if (\n selected.kind === 'app' &&\n selected.threads &&\n selected.threads.length\n ) {\n if (!selected.expanded) store.toggleExpand(selected.id);\n }\n return;\n }\n if (key.leftArrow) {\n if (selected.kind === 'app' && selected.expanded) {\n store.toggleExpand(selected.id);\n } else if (selected.kind === 'thread') {\n store.setSelected(selected.parentId);\n }\n return;\n }\n if (input === 'f') {\n store.setFilter(nextFilter(store.filter));\n return;\n }\n if (input === 's') {\n const target = findNodeAndApp(store, selected.id);\n if (target) void store.handlers.stop(target.node.id);\n return;\n }\n if (input === 'S') {\n const target = findNodeAndApp(store, selected.id);\n if (target) void store.handlers.start(target.node.id);\n return;\n }\n if (input === 'r') {\n const target = findNodeAndApp(store, selected.id);\n if (target) void store.handlers.restart(target.node.id);\n return;\n }\n if (input === 'q' || (key.ctrl && input === 'c')) {\n void onExit()\n return;\n }\n });\n\n const columns = stdout?.columns ?? 80;\n\n return (\n <Box flexDirection=\"column\" width={columns} height={rows}>\n <Box flexDirection=\"row\" flexGrow={1} width={columns}>\n <AppList />\n <LogView />\n </Box>\n <StatusBar />\n </Box>\n );\n}\n\nexport function TuiRoot(props: TuiRootProps): JSX.Element {\n return (\n <TuiStoreContext.Provider value={props.store}>\n <InnerTui {...props} />\n </TuiStoreContext.Provider>\n );\n}\n","import {\n onShutdown,\n onShutdownError,\n processGraceful,\n} from '@andrew_l/graceful';\nimport {\n type Data,\n defer,\n isNumber,\n noop\n} from '@andrew_l/toolkit';\nimport { render } from 'ink';\nimport { APP_INSTANCE_STATE, type AppDefinition } from '../app.ts';\nimport { getPrefixedProps } from '../appHub.ts';\nimport {\n type ManagedThread,\n initThread,\n restartThreadApp,\n setupThreadApp,\n shutdownThreadApp,\n startThreadApp,\n stopThreadApp,\n waitForThreadReady,\n} from '../managedThread.ts';\nimport { TuiRoot } from './components/TuiRoot.tsx';\nimport { type AppNode, type ThreadNode, createTuiStore } from './store.ts';\n\ninterface AppRecord {\n appId: string;\n node: AppNode;\n threads: ManagedThread[];\n}\n\nfunction getAppProps(\n definition: AppDefinition,\n props: Data,\n isSingle: boolean,\n): Data {\n if (isSingle) return { ...props };\n\n return getPrefixedProps(definition, props);\n}\n\nfunction appIdFor(definition: AppDefinition, idx: number): string {\n return `${definition.name}#${idx}`;\n}\n\nfunction resolveThreadCount(appProps: Data): number {\n if (isNumber(appProps.threads) && appProps.threads > 0) {\n return appProps.threads;\n }\n return 1;\n}\n\nconst APP_STATE_RANK: Record<ManagedThread.State, number> = {\n error: 10,\n run: 9,\n 'in-run': 8,\n setup: 7,\n 'in-setup': 6,\n stop: 5,\n 'in-stop': 4,\n shutdown: 3,\n 'in-shutdown': 2,\n ready: 1,\n init: 0,\n};\n\nfunction aggregateAppState(threads: ManagedThread[]): ManagedThread.State {\n let best: ManagedThread.State = 'init';\n for (const w of threads) {\n const s = APP_STATE_RANK[w.state];\n if (s > APP_STATE_RANK[best]) best = w.state;\n }\n return best;\n}\n\nexport function launchAppsTui(\n definitions: AppDefinition[],\n props: Record<string, any>,\n): Promise<void> {\n const store = createTuiStore();\n const records: AppRecord[] = [];\n const isSingle = definitions.length === 1;\n\n if (props.watch) {\n store.setSystem({\n ts: Date.now(),\n level: 'warn',\n text: 'TUI does not yet support --watch mode;',\n });\n }\n\n for (let i = 0; i < definitions.length; i++) {\n const def = definitions[i];\n const appId = appIdFor(def, i);\n const appProps = getAppProps(def, props, isSingle);\n const threadCount = resolveThreadCount(appProps);\n appProps.__inheritIO = false;\n delete appProps.threads;\n\n const appNode: AppNode = {\n kind: 'app',\n id: appId,\n name: def.name,\n state: APP_INSTANCE_STATE.INIT,\n expanded: false,\n threads: [],\n };\n store.addApp(appNode);\n\n const threads: ManagedThread[] = [];\n const threadNodes: ThreadNode[] = [];\n\n for (let threadId = 1; threadId <= threadCount; threadId++) {\n const nodeId = `${appId}:${threadId}`;\n const threadNode: ThreadNode = {\n id: `${appId}:${threadId}`,\n kind: 'thread',\n name: `${appNode.name}.${threadId}`,\n parentId: appId,\n threadId: threadId,\n pid: 0,\n state: APP_INSTANCE_STATE.INIT,\n };\n threadNodes.push(threadNode);\n\n const w = initThread(threadId, def.filePath!, appProps);\n w.eventBus.on('log', (entry: ManagedThread.LogEntry) => {\n store.pushLog(nodeId, {\n ts: entry.ts,\n level: entry.level,\n text: entry.text,\n });\n });\n w.eventBus.on('state', (newState: ManagedThread.State) => {\n store.setState(nodeId, newState);\n store.setState(appId, aggregateAppState(threads));\n });\n w.eventBus.on('pid', (pid: number) => {\n store.setPid(nodeId, pid);\n });\n w.eventBus.on('error', err => {\n store.pushLog(nodeId, {\n ts: Date.now(),\n level: 'error',\n text: `Thread error: ${err.message}`,\n });\n });\n threads.push(w);\n }\n\n store.setThreads(appId, threadNodes);\n\n records.push({ appId, node: appNode, threads: threads });\n }\n\n const findRecordByAppId = (id: string): AppRecord | undefined =>\n records.find(r => r.appId === id);\n\n const findThread = (\n id: string,\n ): { record: AppRecord; thread: ManagedThread } | undefined => {\n for (const r of records) {\n for (const w of r.threads) {\n if (`${r.appId}:${w.threadId}` === id) return { record: r, thread: w };\n }\n }\n return undefined;\n };\n\n const clearAppLogs = (r: AppRecord): void => {\n store.clearLogs(r.appId);\n for (const t of r.node.threads ?? []) store.clearLogs(t.id);\n };\n\n const startSingleThread = (w: ManagedThread): Promise<void> => {\n if (w.state === APP_INSTANCE_STATE.IN_RUN || APP_INSTANCE_STATE.RUN) {\n return Promise.resolve();\n }\n\n if (w.state === APP_INSTANCE_STATE.STOP) return startThreadApp(w);\n return setupThreadApp(w).then(() => startThreadApp(w));\n };\n\n store.handlers = {\n stop(id) {\n const r = findRecordByAppId(id);\n if (r)\n return Promise.all(r.threads.map(w => stopThreadApp(w))).then(() => {});\n const found = findThread(id);\n if (found) return stopThreadApp(found.thread);\n return Promise.resolve();\n },\n start(id) {\n const r = findRecordByAppId(id);\n if (r) {\n return Promise.all(r.threads.map(startSingleThread)).then(() => {});\n }\n const found = findThread(id);\n if (found) return startSingleThread(found.thread);\n return Promise.resolve();\n },\n restart(id) {\n const r = findRecordByAppId(id);\n if (r) {\n return Promise.all(\n r.threads.map(w => {\n w.restartCount = 0;\n return restartThreadApp(w);\n }),\n ).then(() => {});\n }\n const found = findThread(id);\n if (found) {\n found.thread.restartCount = 0;\n return restartThreadApp(found.thread);\n }\n return Promise.resolve();\n },\n };\n\n const startRecord = (r: AppRecord): Promise<void> =>\n Promise.all(\n r.threads.map(w =>\n waitForThreadReady(w)\n .then(() => setupThreadApp(w))\n .then(() => startThreadApp(w)),\n ),\n ).then(noop);\n\n onShutdownError(error => {\n console.error('[Graceful Shutdown] error:', error);\n });\n\n const q = defer<void>();\n\n onShutdown('app', () => {\n store.setSystem({\n ts: Date.now(),\n level: 'warn',\n text: 'shutdown initiated',\n });\n\n return Promise.all(\n records.map(r => Promise.all(r.threads.map(w => shutdownThreadApp(w)))),\n )\n .then(() => {\n store.setSystem({\n ts: Date.now(),\n level: 'info',\n text: 'shutdown complete',\n });\n })\n .then(() => inkInstance.waitUntilRenderFlush())\n .then(() => inkInstance.unmount())\n .then(() => q.resolve())\n .catch(console.error);\n });\n\n const onExit = () => {\n return Promise.resolve().then(() => processGraceful());\n };\n\n const inkInstance = render(<TuiRoot store={store} onExit={onExit} />, {\n exitOnCtrlC: false,\n });\n\n return Promise.all(records.map(startRecord)).then(() => q.promise);\n}\n","import { EJSON } from '@andrew_l/toolkit';\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst DB_PATH = path.join(os.tmpdir(), 'vrun.json');\n\nclass TempDB {\n private _storage = new Map();\n private _dirty: boolean = false;\n\n constructor(public filepath: string) {}\n\n get isDirty() {\n return this._dirty;\n }\n\n get<T>(key: string): T | undefined {\n return this._storage.get(key);\n }\n\n set(key: string, value: unknown) {\n this._storage.set(key, value);\n this._dirty = true;\n }\n\n save() {\n if (!this._dirty) return;\n const data = EJSON.stringify(Array.from(this._storage.entries()));\n fs.writeFileSync(this.filepath, data);\n this._dirty = false;\n }\n\n load(): boolean {\n try {\n const data = EJSON.parse(fs.readFileSync(this.filepath, 'utf-8'));\n\n for (const [key, value] of data) {\n this._storage.set(key, value);\n }\n\n return true;\n } catch (_) {\n return false;\n }\n }\n}\n\nexport const db = new TempDB(DB_PATH);\n\ndb.load();\n","import {\n type Data,\n type IfAny,\n arrayable,\n isNumber,\n kebabCase,\n} from '@andrew_l/toolkit';\nimport { InvalidArgumentError, Option } from 'commander';\n\n/**\n * Declaration for a single typed app prop.\n * @group Types\n */\nexport interface PropOptions<T = any> {\n type: PropType<T> | null;\n description?: string;\n alias?: string;\n required?: boolean;\n env?: string | string[];\n default?: () => InferPropType<T>;\n parser?: (value: string) => InferPropType<T>;\n enum?: string[];\n}\n\n/**\n * @group Types\n */\nexport type PropType<T> = PropConstructor<T> | PropConstructor<T>[];\n\n/**\n * Map of prop declarations keyed by name — passed as `props` in `defineApp`.\n * @group Types\n */\nexport type ObjectPropsOptions<P = Data> = {\n [K in keyof P]: PropOptions<P[K]>;\n};\n\ntype PropConstructor<T = any> =\n | { new (...args: any[]): T & {} }\n | { (): T }\n | PropMethod<T>;\n\ntype PropMethod<T, TConstructor = any> = [T] extends [\n ((...args: any) => any) | undefined,\n] // if is function with args, allowing non-required functions\n ? { new (): TConstructor; (): T; readonly prototype: TConstructor } // Create Function like constructor\n : never;\n\ntype OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>;\n\ntype RequiredKeys<T> = {\n [K in keyof T]: T[K] extends { required: true } ? K : never;\n}[keyof T];\n\ntype InferPropType<T> = [T] extends [null]\n ? any // null & true would fail to infer\n : [T] extends [{ type: null }]\n ? any // As TS issue https://github.com/Microsoft/TypeScript/issues/14829 // somehow `ObjectConstructor` when inferred from { (): T } becomes `any` // `BooleanConstructor` when inferred from PropConstructor(with PropMethod) becomes `Boolean`\n : [T] extends [ObjectConstructor | { type: ObjectConstructor }]\n ? Record<string, any>\n : [T] extends [BooleanConstructor | { type: BooleanConstructor }]\n ? boolean\n : [T] extends [DateConstructor | { type: DateConstructor }]\n ? Date\n : [T] extends [DateConstructor | { type: DateConstructor }]\n ? Date\n : [T] extends [StringConstructor | { type: StringConstructor }]\n ? string\n : [T] extends [(infer U)[] | { type: (infer U)[] }]\n ? U extends DateConstructor\n ? Date | InferPropType<U>\n : InferPropType<U>\n : [T] extends [PropOptions<infer V>]\n ? unknown extends V\n ? IfAny<V, V, V>\n : V\n : T;\n\n/**\n * Resolve the concrete prop value types from an `ObjectPropsOptions` declaration.\n * @group Types\n */\nexport type ExtractPropTypes<O> = {\n // use `keyof Pick<O, RequiredKeys<O>>` instead of `RequiredKeys<O>` to support IDE features\n [K in keyof Pick<O, RequiredKeys<O>>]: InferPropType<O[K]>;\n} & {\n // use `keyof Pick<O, OptionalKeys<O>>` instead of `OptionalKeys<O>` to support IDE features\n [K in keyof Pick<O, OptionalKeys<O>>]?: InferPropType<O[K]>;\n};\n\nconst TYPE_TO_PLACEHOLDER = new Map<any, string>([\n [String, '<string>'],\n [Boolean, '<boolean>'],\n [Number, '<number>'],\n [Date, '<date>'],\n [Array, '<array>'],\n]);\n\n/**\n * Convert an `ObjectPropsOptions` map into Commander `Option` instances.\n * @group Types\n */\nexport function propsToOptions(props: ObjectPropsOptions): Option[] {\n const result: Option[] = [];\n\n for (const [\n name,\n {\n description,\n type,\n default: defaultValue,\n required,\n enum: variants,\n alias,\n env,\n parser,\n },\n ] of Object.entries(props)) {\n const flagName = kebabCase(name);\n\n const typePlaceholder = TYPE_TO_PLACEHOLDER.get(type);\n\n const envVariables = arrayable(env);\n\n const option = new Option(\n [alias ? `-${alias}, ` : '', `--${flagName}`, typePlaceholder]\n .filter(Boolean)\n .join(' '),\n description,\n );\n\n if (variants?.length) {\n option.choices(variants);\n }\n\n if (envVariables.length) {\n option.env(envVariables.join(', '));\n option.default(getEnv(envVariables) || defaultValue?.());\n } else if (defaultValue) {\n option.default(defaultValue());\n }\n\n if (required) {\n option.mandatory = true;\n }\n\n option.attributeName();\n\n switch (type) {\n case Boolean: {\n option.isBoolean();\n break;\n }\n\n case Number: {\n option.argParser(parseNumberArgument);\n }\n }\n\n if (parser) {\n option.argParser(parser);\n }\n\n result.push(option);\n }\n\n return result;\n}\n\nfunction getEnv(variables: string[]): string | undefined {\n for (const env of variables) {\n const value = process.env[env];\n if (value) {\n return value;\n }\n }\n}\n\nfunction parseNumberArgument(value: string) {\n const parsedValue = parseInt(value, 10);\n if (!isNumber(parsedValue)) {\n throw new InvalidArgumentError('Not a number.');\n }\n return parsedValue;\n}\n","import { onShutdown, processGraceful } from '@andrew_l/graceful';\nimport { assert, defer, isSkip, noop } from '@andrew_l/toolkit';\nimport { Command, Option } from 'commander';\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n type AppDefinition,\n type AppInstance,\n appWaitShutdown,\n isAppDefinition,\n shutdownApp,\n startApp,\n} from '../app.js';\nimport { createAppHub } from '../appHub.js';\nimport { createAppThread } from '../appThread.ts';\nimport { CONFIG } from '../config.js';\nimport { log } from '../logger.js';\nimport {\n type Project,\n createProject,\n projectAutoImport,\n projectImportFile,\n projectLoadEnv,\n projectPrintInfo,\n} from '../project.js';\nimport { launchAppsTui } from '../tui/launchAppsTui.tsx';\nimport { isHelpArgument } from '../utils/args.js';\nimport { db } from '../utils/db.js';\nimport { propsToOptions } from '../utils/props.js';\n\nexport interface RunAppOptions {\n scriptFile?: string;\n cliName?: string;\n cliDescription?: string;\n argv?: string[];\n}\n\nexport function runApp({\n scriptFile,\n cliName = 'app',\n cliDescription = 'Application cli',\n argv = process.argv,\n}: RunAppOptions): Promise<void> {\n const promise = scriptFile\n ? loadScriptCommand(scriptFile)\n : Promise.resolve(buildRootCommand({ cliName, cliDescription }));\n\n return promise\n .then(program => program.parseAsync(['node', cliName, ...argv]))\n .then(noop)\n .catch(error => {\n log.error('Failed to run app:', error);\n process.exit(1);\n });\n}\n\nfunction buildRootCommand({\n cliDescription,\n cliName,\n}: Omit<Required<RunAppOptions>, 'scriptFile' | 'argv'>): Command {\n const program = new Command()\n .name(cliName)\n .description(cliDescription)\n .enablePositionalOptions()\n .passThroughOptions()\n .helpOption(false)\n .helpCommand(false)\n .action(function () {\n const cmd = this;\n if (isHelpArgument(cmd.args)) {\n return cmd.help();\n }\n });\n\n program\n .command('start', { isDefault: true })\n .argument('<string...>', 'Path to script file')\n .description('Start application.')\n .addOption(new Option('--watch', 'Watch file changes'))\n .addOption(new Option('--dev', 'Allow to import ts files'))\n .passThroughOptions(true)\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(function (scriptFiles: string[], _opts) {\n assert.arrayStrings(scriptFiles, 'scriptFiles expected string[]');\n\n const cmd = this;\n const remainingArgs = cmd.args;\n const flagIdx = scriptFiles.findIndex(v => v.startsWith('-'));\n\n scriptFiles = (\n flagIdx > -1 ? scriptFiles.slice(0, flagIdx) : scriptFiles\n ).filter(v => !v.startsWith('-'));\n\n if (!scriptFiles.length) {\n return cmd.parent?.args?.includes('start')\n ? cmd.help()\n : program.help();\n }\n\n const project = createProject(path.resolve(scriptFiles[0]));\n\n return Promise.resolve()\n .then(() => registerTsx(project))\n .then(() => loadProject(project))\n .then(() =>\n Promise.all(scriptFiles.map(f => loadAppDefinition(project, f))),\n )\n .then(apps => buildStartCommand(apps))\n .then(appCmd => {\n if (isHelpArgument(remainingArgs)) {\n return appCmd.help();\n }\n\n return appCmd.parseAsync(remainingArgs, { from: 'user' });\n })\n .then(noop);\n });\n\n program\n .command('json')\n .description(\n 'Start apps from a JSON file containing an array of script paths.',\n )\n .argument('[string]', 'Path to JSON file')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(function (jsonFile) {\n const cmd = this;\n if (!jsonFile || isHelpArgument(jsonFile)) {\n return cmd.help();\n }\n\n const project = createProject(path.dirname(path.resolve(jsonFile)));\n const remainingArgs = cmd.args;\n\n return Promise.resolve()\n .then(() => registerTsx(project))\n .then(() => loadProject(project))\n .then(() =>\n projectImportFile<{ default: unknown }>(\n project,\n path.resolve(jsonFile),\n ),\n )\n .then(m => {\n const paths = m.default;\n\n assert.arrayStrings(paths, 'JSON file must contain a string[].');\n\n return paths.map(p =>\n path.resolve(path.dirname(path.resolve(jsonFile)), p),\n );\n })\n .then(scriptFiles =>\n Promise.all(scriptFiles.map(f => loadAppDefinition(project, f))),\n )\n .then(apps => buildStartCommand(apps))\n .then(appCmd => {\n if (isHelpArgument(remainingArgs)) {\n return appCmd.help();\n }\n\n return appCmd.parseAsync(remainingArgs, { from: 'user' });\n })\n .then(noop);\n });\n\n program\n .command('list')\n .description('Interactively pick apps to run from a folder.')\n .argument('[string]', 'Path to folder', '.')\n .addOption(\n new Option('--pattern <glob>', 'Glob pattern for app files').default(\n '**/*.{app,worker}.{ts,js}',\n ),\n )\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(function (folderPath, opts) {\n const cmd = this;\n if (isHelpArgument(cmd.args)) {\n return cmd.help();\n }\n\n const remainingArgs = cmd.args;\n const project = createProject(path.resolve(folderPath));\n\n return Promise.resolve()\n .then(() => registerTsx(project))\n .then(() => loadProject(project))\n .then(() => findAppFiles(path.resolve(folderPath), opts.pattern))\n .then(scriptFiles => {\n if (!scriptFiles.length) {\n log.error('No files found. Pattern: %s', opts.pattern);\n process.exit(1);\n }\n\n return log.prompt('Pick apps to run.', {\n type: 'multiselect',\n options: scriptFiles.map(f => ({\n label: path.basename(f),\n value: f,\n })),\n initial: db.get<string[]>('app_last_run'),\n cancel: 'null',\n });\n })\n .then(selected => {\n const selectedFiles = (selected as string[] | null) || [];\n if (!selectedFiles.length) process.exit(0);\n\n db.set('app_last_run', selectedFiles);\n db.save();\n\n return Promise.all(\n selectedFiles.map(f => loadAppDefinition(project, f)),\n );\n })\n .then(apps => buildStartCommand(apps))\n .then(appCmd => {\n if (isHelpArgument(remainingArgs)) {\n return appCmd.help();\n }\n\n return appCmd.parseAsync(remainingArgs, { from: 'user' });\n })\n .then(noop);\n });\n\n program\n .command('folder')\n .description('Start all apps found in a folder.')\n .argument('<string>', 'Path to folder')\n .addOption(\n new Option('--pattern <glob>', 'Glob pattern for app files').default(\n '**/*.{ts,js}',\n ),\n )\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(function (folderPath, opts) {\n const cmd = this;\n if (!folderPath || isHelpArgument(folderPath)) {\n return cmd.help();\n }\n\n const remainingArgs = cmd.args;\n const project = createProject(path.resolve(folderPath));\n\n return Promise.resolve()\n .then(() => registerTsx(project))\n .then(() => loadProject(project))\n .then(() => findAppFiles(path.resolve(folderPath), opts.pattern))\n .then(scriptFiles => {\n if (!scriptFiles.length) {\n log.error('No files found. Pattern: %s', opts.pattern);\n process.exit(1);\n }\n\n return Promise.all(\n scriptFiles.map(f => loadAppDefinition(project, f)),\n );\n })\n\n .then(apps => {\n if (!apps.length) {\n log.error('No valid AppDefinitions found in folder.');\n process.exit(1);\n }\n\n return apps;\n })\n .then(apps => buildStartCommand(apps))\n .then(appCmd => {\n if (isHelpArgument(remainingArgs)) {\n return appCmd.help();\n }\n\n return appCmd.parseAsync(remainingArgs, { from: 'user' });\n })\n .then(noop);\n });\n\n return program;\n}\n\nfunction findAppFiles(folderPath: string, pattern: string): string[] {\n return fs\n .globSync(pattern, {\n cwd: folderPath,\n exclude: f => f.includes('node_modules'),\n })\n .map(f => path.resolve(folderPath, f))\n .sort();\n}\n\nfunction loadScriptCommand(scriptFile: string): Promise<Command> {\n const project = createProject(path.dirname(scriptFile));\n\n return Promise.resolve()\n .then(() => registerTsx(project))\n .then(() => loadProject(project))\n .then(() => loadAppDefinition(project, scriptFile))\n .then(app => buildStartCommand([app]));\n}\n\nfunction registerTsx(project: Project): Promise<void> {\n if (CONFIG.TS_MODE === 'tsx') {\n project.allowTs = true;\n return Promise.resolve();\n }\n\n if (CONFIG.TS_MODE === 'tsx-register') {\n return Promise.resolve()\n .then(() => import('tsx/esm/api'))\n .then(m => m.register({ tsconfig: project.tsconfigPath || false }))\n .then(() => {\n project.allowTs = true;\n });\n }\n\n return Promise.resolve();\n}\n\nfunction loadProject(project: Project): Promise<void> {\n projectPrintInfo(project);\n\n return Promise.resolve()\n .then(() => projectLoadEnv(project))\n .then(() => projectAutoImport(project))\n .then(noop);\n}\n\nfunction loadAppDefinition(\n project: Project,\n scriptFile: string,\n): Promise<AppDefinition> {\n return projectImportFile(project, scriptFile).then(appModule => {\n const app = appModule.default;\n\n if (!isAppDefinition(app)) {\n log.warn(`Default export must be a app definition: ${scriptFile}`);\n process.exit(1);\n }\n\n return app;\n });\n}\n\nfunction buildStartCommand(definitions: AppDefinition[]): Command {\n const rootDefinition =\n definitions.length > 1\n ? createAppHub(definitions.map(v => createAppThread(v)))\n : createAppThread(definitions[0]);\n\n const program = new Command()\n .name(rootDefinition.name)\n .description(rootDefinition.description || 'An application');\n\n if (rootDefinition.props) {\n for (const option of propsToOptions(rootDefinition.props)) {\n program.addOption(option);\n }\n }\n\n program\n .addOption(new Option('--watch', 'Watch file changes'))\n .addOption(new Option('--dev', 'Allow to import ts files'))\n .addOption(new Option('--tui', 'Launch interactive terminal UI'))\n .helpCommand(false)\n .command('start', { isDefault: true, hidden: true })\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action((...args) => {\n const props = program.optsWithGlobals();\n\n if (props.tui) {\n return launchAppsTui(definitions, props);\n }\n\n return launchApp(\n definitions.length > 1 || props.threads > 1\n ? rootDefinition\n : definitions[0],\n props,\n );\n });\n\n return program;\n}\n\nfunction launchApp(\n definition: AppDefinition,\n props: Record<string, any>,\n): Promise<void> {\n const startDefer = defer<void>();\n let app: AppInstance | undefined;\n\n onShutdown('app', () => {\n log.warn('Graceful shutdown initiated, waiting for process to complete');\n\n if (CONFIG.TS_MODE === 'tsx') {\n log.warn('Graceful in tsx + watch mode is not supported.');\n }\n\n // Wait until app fully started\n return startDefer.promise.then(() => {\n if (app) {\n return shutdownApp(app);\n }\n });\n });\n\n return startApp(definition, props)\n .then(startResult => {\n if (isSkip(startResult)) {\n startDefer.resolve();\n log.warn('Failed to start %s', startResult, startResult.error);\n return;\n }\n\n app = startResult.app;\n startDefer.resolve();\n\n return appWaitShutdown(app);\n })\n .then(() => processGraceful());\n}\n","import { runApp } from './runApp.js';\n\n/**\n * Programmatic access to the `vrun` CLI internals.\n * @group Utils\n */\nexport const cli = Object.freeze({\n runApp,\n} as const);\n","import { log } from '../logger.js';\nimport type { WorkerInstance, WorkerStrategy } from '../worker.js';\n\nexport namespace IntervalStrategy {\n /**\n * Options for the built-in IntervalStrategy.\n */\n export interface Options {\n intervalSeconds: number;\n }\n\n /**\n * Context emitted by IntervalStrategy on each tick.\n */\n export interface Context extends WorkerStrategy.Context {\n timerSequence: number;\n }\n}\n\n/**\n * Triggers a worker task on a fixed interval.\n * Skips the tick with a warning if the worker is not idle.\n * @group Worker Strategies\n */\nexport class IntervalStrategy\n implements WorkerStrategy<IntervalStrategy.Context>\n{\n private timerSequence = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n private worker!: WorkerInstance;\n\n constructor(private readonly options: IntervalStrategy.Options) {}\n\n doSetup({ worker }: { worker: WorkerInstance }): void {\n this.worker = worker;\n }\n\n startSignal(): void {\n this.timer = setInterval(() => {\n if (this.worker.isIdle) {\n this.worker.addTask(this.createTask());\n } else {\n log.warn(\n '[%s] Worker busy, skipping tick',\n this.worker.definition.name,\n );\n }\n }, this.options.intervalSeconds * 1000);\n }\n\n stopSignal(done: () => void): void {\n clearInterval(this.timer!);\n this.timer = null;\n done();\n }\n\n doShutdown(): void {}\n\n createTask(): IntervalStrategy.Context {\n return { timerSequence: ++this.timerSequence };\n }\n}\n","import {\n type AnyFunction,\n AsyncIterableQueue,\n type Awaitable,\n CancellablePromise,\n type Data,\n type ExecResult,\n type Logger,\n ResourcePool,\n captureStackTrace,\n catchError,\n def,\n isFunction,\n isSkip,\n toError,\n} from '@andrew_l/toolkit';\nimport type { AppDefinition } from './app.js';\nimport { defineApp } from './app.js';\nimport { CONFIG } from './config.js';\nimport { filePathFromStack } from './utils/filePathFromStack.ts';\nimport type { ExtractPropTypes, ObjectPropsOptions } from './utils/props.js';\n\nexport type WorkerSuccessData = { [x: string]: unknown };\nexport type WorkerSkipData = { error?: boolean; [x: string]: unknown };\nexport type WorkerResult = ExecResult<WorkerSuccessData, WorkerSkipData>;\n\n/**\n * @group Types\n */\nexport namespace WorkerStrategy {\n /**\n * Base context bag emitted by strategies per task. Strategies extend this with typed fields.\n * @group Types\n */\n export interface Context {\n [key: string]: unknown;\n }\n}\n\n/**\n * Pluggable trigger source. Drives when tasks are enqueued.\n * @group Types\n */\nexport interface WorkerStrategy<\n C extends WorkerStrategy.Context = WorkerStrategy.Context,\n> {\n doSetup(opts: { worker: WorkerInstance }): Awaitable<void>;\n startSignal(): void;\n stopSignal(done: () => void): void;\n doShutdown(): Awaitable<void>;\n createTask(...args: any[]): C;\n executeSignal?(\n ctx: WorkerDefinition.EntryContext<WorkerStrategy<C>>,\n ): Awaitable<ExecResult>;\n completeSignal?(\n ctx: WorkerDefinition.EntryContext<WorkerStrategy<C>>,\n result: WorkerResult | WorkerResult[],\n ): Awaitable<void>;\n overloadedSignal?(): void;\n availableSignal?(): void;\n handleEntryError?(err: Error): WorkerResult;\n}\n\nexport namespace WorkerDefinition {\n /**\n * Entry function that will be called each time when worker handle a job\n */\n export type EntryFn<Context extends Data, Props extends Data> = (\n this: Context,\n props: Props,\n ) => Awaitable<WorkerResult | WorkerResult[] | void>;\n\n export type SetupFn<Context extends Data, Props extends Data, Result> = (\n this: Context,\n props: Props,\n ) => Awaitable<Result>;\n\n export type EntryContext<T extends WorkerStrategy = WorkerStrategy> =\n AppDefinition.EntryContext<\n {\n worker: WorkerInstance<T>;\n } & TaskContext<T>\n >;\n\n export type SetupContext<T extends Data = Data> = AppDefinition.SetupContext<\n T & { worker: WorkerInstance }\n >;\n\n export type RuntimeContext<T extends Data = Data> =\n AppDefinition.RuntimeContext<\n T & {\n worker: WorkerInstance;\n }\n >;\n\n export type TaskContext<T extends WorkerStrategy> =\n T extends WorkerStrategy<infer X> ? X : never;\n}\n\n/**\n * Worker definition — extends AppDefinition with strategy, per-task entry, and concurrency config.\n * @group Types\n */\nexport interface WorkerDefinition<\n P extends ObjectPropsOptions = {},\n S extends Record<string, any> = {},\n M extends Record<string, AnyFunction> = {},\n C extends WorkerStrategy = WorkerStrategy,\n RuntimeContext extends\n WorkerDefinition.RuntimeContext = WorkerDefinition.RuntimeContext<S & M>,\n EntryContext extends\n WorkerDefinition.EntryContext = WorkerDefinition.EntryContext<C> & S & M,\n SetupContext extends\n WorkerDefinition.SetupContext = WorkerDefinition.SetupContext<M>,\n> extends AppDefinition<P, S, M, RuntimeContext, EntryContext, SetupContext> {\n /**\n * Entry function that will be called each time when worker handle a job\n */\n entry?(\n this: EntryContext,\n props: ExtractPropTypes<P>,\n ): Awaitable<WorkerResult | WorkerResult[] | void>;\n\n /**\n * Setup function will be called once while worker setup.\n */\n setup?(this: SetupContext, props: ExtractPropTypes<P>): Awaitable<S>;\n\n executeStrategy: C;\n\n /**\n * Maximum limit of queued tasks\n * @default 50\n */\n taskLimit?: number;\n\n /**\n * Amount of task to be executed in parallel\n * @default 2\n */\n taskParallel?: number;\n\n /**\n * Disable worker\n * @default false\n */\n disabled?: boolean;\n}\n\n/**\n * Runtime state of a worker instance. Extends AppInstance with task queue and pool.\n * Managed with the standard startApp / stopApp / shutdownApp lifecycle.\n * @group Types\n */\nexport interface WorkerInstance<C extends WorkerStrategy = WorkerStrategy> {\n definition: WorkerDefinition<{}, {}, {}, C>;\n queue: AsyncIterableQueue<WorkerDefinition.TaskContext<C>>;\n pool: ResourcePool<symbol>;\n runTask: CancellablePromise<void> | null;\n overloadedSignaled: boolean;\n log: Logger;\n\n readonly queueMaxSize: number;\n\n readonly taskParallel: number;\n\n /**\n * Tasks queue size\n */\n readonly queueSize: number;\n\n /**\n * Check if the worker is overloaded (e.g., queue length is high)\n */\n readonly isOverloaded: boolean;\n\n /**\n * Returns true when worker do nothing\n */\n readonly isIdle: boolean;\n\n /**\n * Add task into execution queue\n */\n addTask(ctx: WorkerDefinition.TaskContext<C>): void;\n}\n\nconst WORKER_DEF = Symbol('worker-definition');\n\nfunction createWorkerPool(size: number): ResourcePool<symbol> {\n return new ResourcePool<symbol>({\n poolSize: size,\n auto: true,\n createResource: () => Symbol('worker-slot'),\n });\n}\n\n/**\n * Create a runtime WorkerInstance from a WorkerDefinition.\n * Use with startApp / stopApp / shutdownApp.\n * @group Worker\n */\nexport function createWorkerInstance<C extends WorkerStrategy>(\n definition: WorkerDefinition<{}, {}, {}, C>,\n logger: Logger,\n): WorkerInstance<C> {\n const instance: WorkerInstance<C> = {\n definition,\n log: logger,\n queue: new AsyncIterableQueue(),\n pool: createWorkerPool(definition.taskParallel ?? 2),\n runTask: null,\n queueMaxSize: definition.taskLimit ?? 50,\n taskParallel: definition.taskParallel ?? 2,\n overloadedSignaled: false,\n addTask(ctx) {\n addWorkerTask(this, ctx);\n },\n get isOverloaded() {\n return this.queueSize > this.queueMaxSize * 0.8;\n },\n get isIdle() {\n return this.pool.isIdle && this.queueSize === 0;\n },\n get queueSize() {\n return (this.queue as any)._queue.items.length;\n },\n };\n\n return instance;\n}\n\n/**\n * Enqueue a task context on the worker. Fires backpressure signals at 80% capacity.\n * @group Worker\n */\nexport function addWorkerTask<C extends WorkerStrategy>(\n instance: WorkerInstance<C>,\n ctx: WorkerDefinition.TaskContext<C>,\n): void {\n instance.queue.put(ctx);\n checkWorkerPressure(instance);\n}\n\nasync function executeWorkerTask<C extends WorkerStrategy>(\n instance: WorkerInstance<C>,\n entryContext: WorkerDefinition.EntryContext<C>,\n props: Data,\n abortSignal: AbortSignal,\n): Promise<void> {\n const { executeStrategy, entry } = instance.definition;\n\n if (isFunction(executeStrategy.executeSignal)) {\n const [signalError, signalResult] = await catchError(() =>\n executeStrategy.executeSignal!(entryContext),\n );\n\n if (signalError) {\n instance.log.error('Strategy executeSignal error, dropping task', {\n error: signalError,\n });\n return;\n }\n\n if (isSkip(signalResult)) {\n instance.log.warn(\n 'Strategy executeSignal returned skip, dropping task',\n signalResult,\n );\n return;\n }\n }\n\n let [executeError, executeResult] = await catchError(() =>\n entry?.call(entryContext, props),\n );\n\n if (executeError) {\n if (executeStrategy.handleEntryError) {\n executeResult = executeStrategy.handleEntryError(executeError);\n }\n\n if (!executeResult) {\n executeResult = {\n skip: true,\n error: true,\n code: 'critical_error',\n reason: executeError.message,\n stack: executeError.stack,\n };\n }\n } else if (\n !executeResult ||\n (Array.isArray(executeResult) && !executeResult.length)\n ) {\n executeResult = { success: true, code: 'void' };\n }\n\n const results = Array.isArray(executeResult)\n ? executeResult\n : [executeResult!];\n\n let hasError = false;\n let hasSkip = false;\n\n for (const result of results) {\n hasError = hasError || (isSkip(result) && !!result.error);\n hasSkip = isSkip(result);\n }\n\n if (hasError) {\n instance.log.error('Task error', results);\n } else if (hasSkip) {\n instance.log.warn('Task skipped', results);\n } else {\n instance.log.debug('Task completed', results);\n }\n\n if (executeStrategy.completeSignal) {\n const [completeError] = await catchError(() =>\n executeStrategy.completeSignal!(entryContext, executeResult!),\n );\n\n if (completeError) {\n instance.log.error('Strategy completeSignal error', {\n error: completeError,\n });\n }\n }\n}\n\n/**\n * Define a background worker with a pluggable execution strategy.\n * Returns a WorkerDefinition that can be run with createWorkerInstance + startApp.\n *\n * @example\n * ```ts\n * import { defineWorker, IntervalStrategy } from '@andrew_l/app';\n *\n * export default defineWorker({\n * name: 'clock',\n * executeStrategy: new IntervalStrategy({\n * intervalSeconds: 1,\n * }),\n * entry() {\n * this.log.info('tick=%d', this.timerSequence);\n * },\n * async shutdown() {\n * await delay(1000);\n * },\n * });\n * ```\n *\n * @group Main\n */\nexport function defineWorker<\n P extends ObjectPropsOptions,\n S extends Record<string, any>,\n M extends Record<string, AnyFunction>,\n C extends WorkerStrategy = WorkerStrategy,\n>(definition: WorkerDefinition<P, S, M, C>): WorkerDefinition<P, S, M, C> {\n const result = defineApp({\n filePath: filePathFromStack(captureStackTrace(defineWorker)),\n ...definition,\n setup(props) {\n return setupWorker(this, definition, props);\n },\n entry(props) {\n return runWorkerLoop(this, definition, props);\n },\n stop(props) {\n return stopWorker(this, definition, props);\n },\n shutdown(props) {\n return shutdownWorker(this, definition, props);\n },\n }) as WorkerDefinition<P, S, M, C>;\n\n result.disabled = result.disabled || CONFIG.WORKER_DISABLED.has(result.name);\n def(result, WORKER_DEF, true);\n\n return result;\n}\n\nfunction setupWorker<\n P extends ObjectPropsOptions,\n S extends Data,\n M extends Record<string, AnyFunction>,\n>(\n setupContext: AppDefinition.SetupContext<M>,\n definition: WorkerDefinition<\n P,\n S,\n M,\n WorkerStrategy,\n WorkerDefinition.RuntimeContext,\n WorkerDefinition.SetupContext<M>\n >,\n props: ExtractPropTypes<P>,\n): Promise<WorkerDefinition.SetupContext<S & M>> {\n const setupFn = definition.setup;\n const ctx: WorkerDefinition.SetupContext<M> = {\n ...setupContext,\n worker: createWorkerInstance(definition, setupContext.log),\n };\n\n return Promise.resolve()\n .then(() => (setupFn ? setupFn.call(ctx, props) : undefined))\n .then(setupResult => {\n return {\n ...ctx,\n ...(setupResult || ({} as S)),\n };\n });\n}\n\nasync function runWorkerLoop(\n runtimeContext: WorkerDefinition.RuntimeContext,\n definition: WorkerDefinition,\n props: Data,\n): Promise<void> {\n const worker = runtimeContext.worker;\n const { executeStrategy } = definition;\n\n await executeStrategy.doSetup({ worker });\n\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n\n const onStopSignal = () => {\n return Promise.resolve()\n .then(() => abortController.abort())\n .then(() =>\n catchError(() =>\n executeStrategy.stopSignal(() => worker.queue.close()),\n ),\n )\n .then(stopResult => {\n const stopError = stopResult[0];\n\n if (stopError) {\n worker.queue.close();\n worker.log.error('Strategy stopSignal error', { error: stopError });\n }\n });\n };\n\n worker.runTask = new CancellablePromise<void>(\n async (resolve, _reject, onCancel) => {\n onCancel(onStopSignal);\n\n const [startError] = await catchError(() =>\n executeStrategy.startSignal(),\n );\n\n if (startError) {\n worker.log.error('Strategy startSignal error', { error: startError });\n worker.runTask = null;\n return resolve();\n }\n\n worker.log.info('Worker started (parallel=%d)', worker.taskParallel);\n\n for await (const taskContext of worker.queue) {\n const jobTicket = await worker.pool.acquire();\n const entryContext: WorkerDefinition.EntryContext<WorkerStrategy> = {\n ...runtimeContext,\n ...taskContext,\n };\n\n executeWorkerTask(worker, entryContext, props, abortSignal).finally(\n () => {\n worker.pool.release(jobTicket);\n checkWorkerPressure(worker);\n },\n );\n }\n\n if (worker.pool.usedCount > 0) {\n worker.log.info(\n 'Draining task pool (active=%d)',\n worker.pool.usedCount,\n );\n }\n\n await worker.pool.destroy();\n worker.queue = new AsyncIterableQueue();\n worker.runTask = null;\n resolve();\n },\n );\n\n worker.runTask.catch(err => {\n worker.log.error('Worker crash: %s', { error: toError(err) });\n });\n}\n\nfunction checkWorkerPressure(worker: WorkerInstance): void {\n try {\n if (worker.isOverloaded) {\n if (!worker.definition.executeStrategy.overloadedSignal)\n return void worker.log.warn(\n 'Worker under pressure (queue=%d, limit=%d)',\n worker.queueSize,\n worker.queueMaxSize,\n );\n\n if (worker.overloadedSignaled) return;\n\n worker.overloadedSignaled = true;\n worker.definition.executeStrategy.overloadedSignal();\n } else {\n if (!worker.overloadedSignaled) return;\n if (!worker.definition.executeStrategy.availableSignal) {\n worker.log.warn('Worker capacity restored');\n } else {\n worker.definition.executeStrategy.availableSignal();\n }\n\n worker.overloadedSignaled = false;\n }\n } catch (err) {\n worker.log.error('Backpressure signal error', { error: err });\n }\n}\n\nasync function stopWorker(\n runtimeContext: WorkerDefinition.RuntimeContext,\n definition: WorkerDefinition,\n props: Data,\n): Promise<void> {\n const worker = runtimeContext.worker;\n const userStop = definition.stop;\n\n if (worker.runTask) {\n if (isFunction(userStop)) {\n await userStop.call(runtimeContext, props);\n }\n\n if (!worker.runTask) return;\n worker.runTask.cancel();\n await worker.runTask.catch(() => {});\n worker.runTask = null;\n }\n}\n\nasync function shutdownWorker(\n runtimeContext: WorkerDefinition.RuntimeContext,\n definition: WorkerDefinition,\n props: Data,\n): Promise<void> {\n const worker = runtimeContext.worker;\n const userShutdown = definition.shutdown;\n\n if (isFunction(userShutdown)) {\n await userShutdown.call(runtimeContext, props);\n }\n\n await definition.executeStrategy.doShutdown();\n\n worker.queue = new AsyncIterableQueue<any>();\n worker.pool = createWorkerPool(definition.taskParallel ?? 2);\n}\n\n/**\n * Returns true if the value was created by defineWorker.\n * @group Utils\n */\nexport function isWorkerDefinition(value: unknown): value is WorkerDefinition {\n return (value as any)?.[WORKER_DEF] === true;\n}\n\n/**\n * Returns true if the value is a WorkerInstance.\n * @group Utils\n */\nexport function isWorkerInstance(value: unknown): value is WorkerInstance {\n return isWorkerDefinition((value as WorkerInstance)?.definition);\n}\n"],"names":["log","tagName","runApp","setState","filePath","pathVariants"],"mappings":"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"}
package/dist/vrun.cjs ADDED
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const toolkit = require('@andrew_l/toolkit');
4
+
5
+ const timer = setTimeout(toolkit.noop, 1 << 30);
6
+ import('./index.cjs').then(
7
+ (r) => r.cli.runApp({
8
+ cliName: "vrun",
9
+ cliDescription: "Launch any application.",
10
+ argv: process.argv.slice(2)
11
+ })
12
+ ).finally(() => clearInterval(timer));
13
+ //# sourceMappingURL=vrun.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vrun.cjs","sources":["../src/vrun.ts"],"sourcesContent":["import { noop } from '@andrew_l/toolkit';\n\nconst timer = setTimeout(noop, 1 << 30);\n\nimport('./index.js')\n .then(r =>\n r.cli.runApp({\n cliName: 'vrun',\n cliDescription: 'Launch any application.',\n argv: process.argv.slice(2),\n }),\n )\n .finally(() => clearInterval(timer));\n"],"names":["noop"],"mappings":";;;;AAEA,MAAM,KAAA,GAAQ,UAAA,CAAWA,YAAA,EAAM,CAAA,IAAK,EAAE,CAAA;AAEtC,OAAO,aAAY,CAAA,CAChB,IAAA;AAAA,EAAK,CAAA,CAAA,KACJ,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,yBAAA;AAAA,IAChB,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC;AAAA,GAC3B;AACH,CAAA,CACC,OAAA,CAAQ,MAAM,aAAA,CAAc,KAAK,CAAC,CAAA;;"}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/vrun.d.ts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/vrun.mjs ADDED
@@ -0,0 +1,11 @@
1
+ import { noop } from '@andrew_l/toolkit';
2
+
3
+ const timer = setTimeout(noop, 1 << 30);
4
+ import('./index.mjs').then(
5
+ (r) => r.cli.runApp({
6
+ cliName: "vrun",
7
+ cliDescription: "Launch any application.",
8
+ argv: process.argv.slice(2)
9
+ })
10
+ ).finally(() => clearInterval(timer));
11
+ //# sourceMappingURL=vrun.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vrun.mjs","sources":["../src/vrun.ts"],"sourcesContent":["import { noop } from '@andrew_l/toolkit';\n\nconst timer = setTimeout(noop, 1 << 30);\n\nimport('./index.js')\n .then(r =>\n r.cli.runApp({\n cliName: 'vrun',\n cliDescription: 'Launch any application.',\n argv: process.argv.slice(2),\n }),\n )\n .finally(() => clearInterval(timer));\n"],"names":[],"mappings":";;AAEA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,CAAA,IAAK,EAAE,CAAA;AAEtC,OAAO,aAAY,CAAA,CAChB,IAAA;AAAA,EAAK,CAAA,CAAA,KACJ,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,yBAAA;AAAA,IAChB,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC;AAAA,GAC3B;AACH,CAAA,CACC,OAAA,CAAQ,MAAM,aAAA,CAAc,KAAK,CAAC,CAAA"}