hostctl 0.1.42 → 0.1.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -3
- package/dist/bin/hostctl.js +1556 -357
- package/dist/bin/hostctl.js.map +1 -1
- package/dist/index.d.ts +3011 -1367
- package/dist/index.js +9807 -2605
- package/dist/index.js.map +1 -1
- package/package.json +13 -11
package/dist/bin/hostctl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli.ts","../../src/app.ts","../../src/handlebars.ts","../../src/config.ts","../../src/config-file.ts","../../src/flex/function.ts","../../src/flex/protocol.ts","../../src/flex/type.ts","../../src/flex/compactable.ts","../../src/flex/enumerator.ts","../../src/flex/enumerable.ts","../../src/flex/mappable.ts","../../src/flex/selectable.ts","../../src/flex/array-protocols.ts","../../src/flex/map.ts","../../src/flex/map-protocols.ts","../../src/flex/object.ts","../../src/flex/object-protocols.ts","../../src/flex/path.ts","../../src/flex/platform.ts","../../src/flex/string.ts","../../src/flex/range.ts","../../src/flex/equal.ts","../../src/flex/range-protocols.ts","../../src/flex/set-protocols.ts","../../src/flex/array.ts","../../src/flex/set.ts","../../src/flex/pipe.ts","../../src/tempfile.ts","../../src/flex/file.ts","../../src/host.ts","../../src/age-encryption.ts","../../src/process.ts","../../src/config-url.ts","../../src/interaction-handler.ts","../../src/local-runtime.ts","../../src/stacktrace.ts","../../src/runtime-base.ts","../../src/command.ts","../../src/verbosity.ts","../../src/task.model.ts","../../src/remote-runtime.ts","../../src/ssh-session.ts","../../src/util/input-helpers.ts","../../src/ruspty-command.ts","../../src/node-runtime.ts","../../src/http.ts","../../src/unarchive.ts","../../src/zip.ts","../../src/hash.ts","../../src/param-map.ts","../../src/version.ts","../../src/core/remote/runAllRemote.ts","../../src/commands/pkg/package-manager.ts","../../src/cli/resolve-task-and-args.ts","../../src/commands/pkg/create.ts","../../src/commands/pkg/install.ts","../../src/commands/pkg/list.ts","../../src/commands/pkg/remove.ts","../../src/bin/hostctl.ts"],"sourcesContent":["import process from 'node:process';\nimport * as cmdr from 'commander';\n\nimport { App } from './app';\nimport { Verbosity } from './verbosity';\nimport { File } from './flex/file';\nimport { version } from './version';\nimport { createPackage } from './commands/pkg/create';\nimport { installPackage } from './commands/pkg/install';\nimport { listPackages } from './commands/pkg/list';\nimport { removePackage } from './commands/pkg/remove';\n\nimport JSON5 from 'json5';\nimport { Path } from './flex/path';\n\nimport { resolveTaskPathAndArgs } from './cli/resolve-task-and-args';\n\n/**\n * Type guard to check if an `unknown` value is an `Error` object.\n *\n * @param value - The value to check.\n *\n * @returns `true` if the value is an `Error` object, otherwise `false`.\n */\nexport const isError = (value: unknown): value is Error =>\n !!value &&\n typeof value === 'object' &&\n 'message' in value &&\n typeof value.message === 'string' &&\n 'stack' in value &&\n typeof value.stack === 'string';\n\nconst logError = (message: string, error: unknown): void => {\n console.error(`Error: ${message}`); // Print the primary message to stderr\n if (isError(error)) {\n console.error(error.stack); // Print stack to stderr\n } else {\n try {\n // For unknown errors, create a new error to get a stack trace pointing to this logError call\n const unknownError = new Error(\n `Unexpected value thrown: ${typeof error === 'object' ? JSON.stringify(error) : String(error)}`,\n );\n console.error(unknownError.stack);\n } catch {\n console.error(new Error(`Unexpected value thrown: non-stringifiable object`).stack);\n }\n }\n};\n\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch (_) {\n return false;\n }\n}\n\n// per example at https://github.com/tj/commander.js/blob/HEAD/examples/options-custom-processing.js\nfunction increaseVerbosity(dummyValue: any, previous: number) {\n return previous + 1;\n}\n\nfunction decreaseVerbosity(dummyValue: any, previous: number) {\n return previous - 1;\n}\n\nexport class Cli {\n public app: App;\n public program: cmdr.Command;\n\n constructor() {\n this.app = new App();\n\n this.program = new cmdr.Command();\n\n this.program\n .configureHelp({ showGlobalOptions: true })\n .name('hostctl')\n .version(version)\n .option('-q, --quiet', 'quiet; be less verbose; may be specified multiple times', decreaseVerbosity, 0)\n .option(\n '-v, --verbose',\n 'verbose; may be specified multiple times for increased verbosity',\n increaseVerbosity,\n Verbosity.WARN,\n )\n .option('-c, --config <file path>', 'config file path or http endpoint')\n .option('--json', 'output should be json formatted')\n .option('-p, --password', 'should prompt for sudo password?', false)\n .option('-t, --tag <tags...>', 'specify a tag (repeat for multiple tags)');\n\n this.program\n .command('exec')\n .alias('e')\n .argument(\n '<command...>',\n `the command string to run, with optional arguments (e.g. hostctl exec sudo sh -c 'echo \"$(whoami)\"')`,\n )\n .description('execute a command on the selected hosts (default)')\n .action(this.handleExec.bind(this));\n\n const inventoryCmd = this.program.command('inventory').alias('i').description('manage inventory and view reports');\n\n inventoryCmd\n .command('report', { isDefault: true })\n .description('print out an inventory report (default)')\n .action(this.handleInventory.bind(this));\n\n inventoryCmd\n .command('encrypt')\n .alias('e')\n .description('encrypt the inventory file')\n .action(this.handleInventoryEncrypt.bind(this));\n\n inventoryCmd\n .command('decrypt')\n .alias('d')\n .description('decrypt the inventory file')\n .action(this.handleInventoryDecrypt.bind(this));\n\n inventoryCmd\n .command('list')\n .alias('ls')\n .description('list the hosts in the inventory file')\n .action(this.handleInventoryList.bind(this));\n\n const pkgCmd = this.program.command('pkg').description('manage hostctl packages');\n\n pkgCmd\n .command('create <package-name>')\n .description('create a new hostctl package')\n .option('--lang <language>', 'the language for the package (typescript or javascript)', 'typescript')\n .hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n const supportedLanguages = ['typescript', 'javascript'];\n if (!supportedLanguages.includes(options.lang)) {\n console.error(\n `Error: Unsupported language '${options.lang}'. Supported languages are: ${supportedLanguages.join(', ')}`,\n );\n process.exit(1);\n }\n })\n .action(this.handlePkgCreate.bind(this));\n\n pkgCmd\n .command('install <package-source>')\n .description('install a hostctl package')\n .action(this.handlePkgInstall.bind(this));\n\n pkgCmd\n .command('list')\n .alias('ls')\n .description('list installed hostctl packages')\n .action(this.handlePkgList.bind(this));\n\n pkgCmd\n .command('remove <package-identifier>')\n .alias('rm')\n .description('remove an installed hostctl package')\n .action(this.handlePkgRemove.bind(this));\n\n this.program\n .command('run')\n .alias('r')\n .argument(\n '[pkgTaskArgs...]',\n `The package, task, and arguments to run. Examples:\n - hostctl run ./my-script.ts\n - hostctl run ./my-package/ mytask param1:foo param2:bar\n - hostctl run hostctl-hello goodbye name:Phil\n - hostctl run https://github.com/hostctl/core echo args:hello,world\n `,\n )\n .description('run a hostctl script (default)')\n .option(\n '-f, --file <path>',\n 'runtime parameters should be read from file at <path> containing json object representing params to supply to the script',\n )\n .option(\n '-p, --params \"<json object>\"',\n 'runtime parameters supplied as a string to be parsed as a json object representing params to supply to the script',\n )\n .option('-r, --remote', 'run the script on remote hosts specified by tags via SSH orchestration')\n .action(this.handleRun.bind(this));\n\n const runtimeCmd = this.program\n .command('runtime')\n .alias('rt')\n .description('print out a report of the runtime environment')\n .action(this.handleRuntime.bind(this));\n\n runtimeCmd\n .command('install')\n .alias('i')\n .description('install a temporary runtime environment on the local host if needed')\n .action(this.handleRuntimeInstall.bind(this));\n }\n\n async handleInventory(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.printInventoryReport();\n }\n\n async handleInventoryEncrypt(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.encryptInventoryFile();\n }\n\n async handleInventoryDecrypt(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.decryptInventoryFile();\n }\n\n async handleInventoryList(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n if (!this.app.config) {\n console.log('Configuration could not be loaded. Cannot list hosts.');\n if (!this.app.configRef) {\n console.log('(Also, no configuration file path was found by the app instance)');\n }\n return;\n }\n\n console.log('Config file: ' + this.app.configRef);\n\n const hosts = this.app.selectedInventory(); // Use tags from options if provided\n if (hosts.length > 0) {\n console.log('\\nHosts in inventory:');\n hosts.forEach((host) => {\n let hostIdentifier = host.shortName || '(Unnamed host)';\n console.log(` - ${hostIdentifier}`);\n if (host.tags && host.tags.length > 0) {\n console.log(` Tags: ${host.tags.join(', ')}`);\n }\n });\n } else {\n const selectedTagsSet = this.app.selectedTags;\n const selectedTagsArray = Array.from(selectedTagsSet);\n if (selectedTagsArray.length > 0) {\n console.log(`No hosts found matching tags: ${selectedTagsArray.join(', ')}`);\n } else {\n console.log('No hosts found in the inventory.');\n }\n }\n }\n\n async handleExec(commandParts: string | string[], options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.warn(`Executing command: ${commandParts}`);\n\n const result = await this.app.execute(commandParts);\n\n // Propagate exit status so that callers can detect failures\n if (!result.success) {\n // Non-zero indicates at least one host failed\n process.exitCode = 1;\n }\n }\n\n async handleRun(pkgTaskArgs: string[], options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.debug(`tags: ${opts.tag}, remote: ${opts.remote}`);\n\n // Resolve script path using helper\n let resolved;\n try {\n resolved = await resolveTaskPathAndArgs(this.app, pkgTaskArgs);\n } catch (error) {\n if (error instanceof Error && error.message.includes('Multiple packages found with name')) {\n console.error('Error:', error.message);\n console.error('\\nTo resolve this, use the full source URL instead of just the package name.');\n console.error('For example:');\n console.error(' ./hostctl run <full-source-url> <task-name>');\n process.exitCode = 1;\n return;\n }\n throw error;\n }\n const scriptRef = resolved.scriptRef;\n const scriptArgs = resolved.scriptArgs;\n\n let params: object = {};\n try {\n if (options.params) {\n params = JSON5.parse(options.params);\n } else if (options.file) {\n const contents = File.readSync(options.file);\n params = JSON5.parse(contents);\n } else {\n params = this.app.parseParams(scriptArgs);\n }\n } catch (err) {\n this.app.error(\n `Failed to parse params as JSON5: ${(err as Error).message}`,\n `params: ${JSON5.stringify(options.params)}`,\n );\n throw new Error(`Failed to parse params as JSON5: ${(err as Error).message}`);\n }\n\n if (!scriptRef) {\n this.program.help();\n }\n\n this.app.debug(`Resolved script: ${scriptRef}`);\n this.app.debug(`Script params: ${JSON.stringify(params)}`);\n\n let result;\n if (opts.remote) {\n result = await this.app.runScriptRemote(scriptRef, params);\n } else {\n result = await this.app.runScript(scriptRef, params);\n }\n\n // Set exit code based on result type and content\n if (result instanceof Error) {\n // If the result is an Error object, it's an unexpected error\n process.exitCode = 1;\n } else if (result && typeof result === 'object') {\n // For remote results (map of host -> result), check if any host failed\n if (Object.values(result).some((v: any) => v instanceof Error)) {\n process.exitCode = 1;\n } else if (\n Object.values(result).some((v: any) => v && typeof v === 'object' && 'success' in v && v.success === false)\n ) {\n // Check if any host has success: false\n process.exitCode = 1;\n } else if (\n Object.values(result).some((v: any) => v && typeof v === 'object' && 'success' in v && v.success === true)\n ) {\n // If any host has success: true, set exit code to 0\n process.exitCode = 0;\n } else {\n // Default to success if no success field is found\n process.exitCode = 0;\n }\n } else {\n // For non-object results, assume success\n process.exitCode = 0;\n }\n }\n\n deriveConfigRef(suppliedConfigRef?: string): string {\n // 1. If suppliedConfigRef is an existing file, use it.\n if (suppliedConfigRef && Path.new(suppliedConfigRef).isFile()) {\n return Path.new(suppliedConfigRef).toString();\n }\n\n // 2. Search CWD and ancestors for hostctl.yaml\n const foundPath = Path.cwd()\n .selfAndAncestors()\n .find((p) => p.join('hostctl.yaml').isFile());\n if (foundPath) {\n return foundPath.join('hostctl.yaml').toString();\n }\n\n // 3. Check for ~/.hostctl/hostctl.yaml\n const homeConfigPath = Path.homeDir().join('.hostctl', 'hostctl.yaml');\n if (homeConfigPath.isFile()) {\n return homeConfigPath.toString();\n }\n\n // 4. If a configRef was supplied (e.g. -c URL or -c non-existent-file), use that.\n // This allows `load()` to handle it as a ConfigUrl or report non-existence.\n if (suppliedConfigRef && isValidUrl(suppliedConfigRef)) {\n return suppliedConfigRef;\n }\n\n // 5. Otherwise, error out\n throw new Error(\n \"Could not find a hostctl configuration file. Searched for 'hostctl.yaml' in the current directory, ancestor directories, and '~/.hostctl/hostctl.yaml'. If you intended to use a URL or a specific file path, please ensure it's correct and accessible via the -c option.\",\n );\n }\n\n async loadApp(opts: Record<string, any>) {\n await this.app.loadConfig(opts.config);\n\n const verbosity = opts.quiet + opts.verbose;\n this.app.setVerbosity(verbosity);\n if (opts.json) {\n this.app.setOutputStyle('json');\n } else {\n this.app.setOutputStyle('plain');\n }\n let tagsToSet: string[] = [];\n if (typeof opts.tag === 'string') {\n tagsToSet = [opts.tag];\n } else if (Array.isArray(opts.tag)) {\n tagsToSet = opts.tag;\n }\n this.app.setSelectedTags(tagsToSet);\n }\n\n async run() {\n try {\n await this.program.parseAsync(process.argv);\n } catch (e) {\n logError('hostctl error:', e);\n }\n }\n\n async handleRuntime(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.printRuntimeReport();\n }\n\n async handleRuntimeInstall(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.installRuntime();\n }\n\n async handlePkgCreate(packageName: string, options: { lang: 'typescript' | 'javascript' }) {\n await createPackage(packageName, options);\n }\n\n async handlePkgInstall(source: string) {\n await this.loadApp(this.program.opts());\n try {\n await installPackage(source, this.app);\n } catch (error) {\n console.error(\n `Failed to install package from ${source}: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exitCode = 1;\n }\n }\n\n async handlePkgList() {\n await this.loadApp(this.program.opts());\n await listPackages(this.app);\n }\n\n async handlePkgRemove(packageIdentifier: string) {\n await this.loadApp(this.program.opts());\n await removePackage(packageIdentifier, this.app);\n }\n}\n","import process from 'node:process';\nimport * as fs from 'node:fs';\nimport { homedir } from 'node:os';\nimport Handlebars from './handlebars';\n\n// import Emittery from \"emittery\"; // Believed to be unused\nimport { type Config, load } from './config';\nimport type { Secret, RecipientGroup } from './config-file';\n\nexport type AppConfig = Config; // Alias for the main application configuration type\nimport { Host } from './host';\nimport { InteractionHandler } from './interaction-handler';\n\nimport { A } from './flex/array';\nimport { Path } from './flex/path';\nimport * as util from 'node:util';\nimport { ConfigFile } from './config-file';\nimport chalk from 'chalk';\nimport { S } from './flex/set';\nimport { password as promptPassword } from '@inquirer/prompts';\nimport { Listr } from 'listr2';\nimport { isError } from './cli';\nimport { LocalRuntime, type LocalInvocation } from './local-runtime';\nimport { TmpFileRegistry } from './tempfile';\nimport { NodeRuntime } from './node-runtime';\nimport { zipDirectory } from './zip';\nimport { sha256 } from './hash';\nimport { ParamMap } from './param-map';\nimport { Verbosity, type VerbosityLevel } from './verbosity';\nimport {\n type IInvocation,\n type RunFnReturnValue,\n type TaskFn,\n type TaskContext,\n type LogLevel,\n type TaskParams,\n type TaskPartialFn,\n type RunFn,\n} from './runtime';\nimport { RemoteInvocation, RemoteRuntime } from './remote-runtime';\nimport { version } from './version';\nimport { retryUntilDefined } from 'ts-retry';\nimport { Mutex } from 'async-mutex';\nimport { Command } from './command';\nimport { type CommandResult, type EnvVarObj } from './command'; // EnvVarObj from command.ts\nimport { VP } from './flex/pipe';\nimport { match } from 'ts-pattern';\nimport { SSHSession } from './ssh-session';\nimport runAllRemote from './core/remote/runAllRemote';\nimport { CHECKMARK, withSudo, XMARK } from './util/input-helpers';\nimport { resolveTaskPathAndArgs } from './cli/resolve-task-and-args';\n\nexport type TaskTreeNode = {\n id: string;\n parentId: string | null;\n parent: TaskTreeNode | undefined;\n children: Set<TaskTreeNode>;\n name: string;\n result?: Promise<string | Error | undefined>;\n};\ntype NewTaskEvent = { id: string; parentId: string; name: string };\ntype TaskCompleteEvent = { id: string; result: any };\n\nexport class TaskTree {\n // private taskEventBus: Emittery<{ newTask: NewTaskEvent; taskComplete: TaskCompleteEvent }>;\n private listr: Listr;\n private subLists: Map<string, Promise<Listr>>;\n private nodes: Map<string, TaskTreeNode>;\n private mutex: Mutex;\n\n constructor() {\n this.mutex = new Mutex();\n this.nodes = new Map();\n this.subLists = new Map();\n // this.taskEventBus = new Emittery();\n // this.taskEventBus.on(\"newTask\", (newTaskEvent) => {\n // this.handleNewTask(newTaskEvent);\n // });\n // this.taskEventBus.on(\"taskComplete\", (taskCompleteEvent) => {\n // this.handleTaskComplete(taskCompleteEvent);\n // });\n this.listr = new Listr([], {\n // exitOnError: false,\n concurrent: true,\n rendererOptions: { collapseSubtasks: false },\n });\n }\n\n clear() {\n this.nodes.clear();\n this.subLists.clear();\n this.listr = new Listr([], {\n // exitOnError: false,\n concurrent: true,\n rendererOptions: { collapseSubtasks: false },\n });\n }\n\n async add(\n id: string,\n parentId: string | null,\n name: string,\n result?: Promise<string | Error | undefined>,\n ): Promise<TaskTreeNode> {\n return await this.mutex.runExclusive(async () => {\n const parent = this.get(parentId as string);\n const newNode: TaskTreeNode = { id, parentId, parent, children: new Set(), name, result };\n this.nodes.set(id, newNode);\n\n this.listr.add({\n title: newNode.name,\n task: async (ctx, task): Promise<void> => {\n await result;\n },\n });\n\n return newNode;\n });\n }\n\n get(id: string): TaskTreeNode | undefined {\n return this.nodes.get(id);\n }\n\n async getWithTimeout(id: string): Promise<TaskTreeNode | undefined> {\n try {\n return await retryUntilDefined(\n () => {\n return this.get(id);\n },\n { delay: 50, maxTry: 5 },\n );\n } catch (err) {\n return undefined;\n }\n }\n\n // setResult(id: string, result: Promise<string | Error | undefined>): TaskTreeNode | undefined {\n // const node = this.get(id);\n // if (node) {\n // node.result = result;\n // }\n // return node;\n // }\n\n run(ctx?: any) {\n return this.listr.run(ctx);\n }\n\n // emit(name: any, event: any) {\n // this.taskEventBus.emit(name, event);\n // }\n}\n\nexport interface LoadAppOptions {\n /** Optional configuration file path or URL */\n config?: string;\n /** Optional verbosity level (0-4, where 0 is error only, 4 is trace) */\n verbosity?: number;\n /** Optional output style (plain, json, api) */\n outputStyle?: 'plain' | 'json' | 'api';\n}\n\nexport interface ExecuteResult {\n /** Overall success indicator - true if all hosts succeeded */\n success: boolean;\n /** Results for each host, keyed by hostname */\n hosts: Record<string, {\n /** Host alias if available */\n alias: string;\n /** Whether the command succeeded on this host */\n success: boolean;\n /** Command output */\n stdout: string;\n /** Command error output */\n stderr: string;\n /** Exit code */\n exitCode: number;\n /** Signal if the process was terminated by a signal */\n signal?: string;\n }>;\n /** Total number of hosts that were targeted */\n totalHosts: number;\n /** Number of hosts that succeeded */\n successfulHosts: number;\n /** Number of hosts that failed */\n failedHosts: number;\n}\n\nexport class App {\n public static async loadApiMode(options: LoadAppOptions): Promise<App> {\n return App.load({ ...options, outputStyle: 'api' });\n }\n\n public static async load(options: LoadAppOptions): Promise<App> {\n const app = new App();\n await app.loadConfig(options.config);\n app.setVerbosity(options.verbosity ?? Verbosity.WARN);\n app.setOutputStyle(options.outputStyle ?? 'plain');\n return app;\n }\n\n public configRef?: string;\n private _config?: Config;\n public selectedTags: Set<string>;\n private outputStyle: 'plain' | 'json' | 'api';\n private _tmpDir?: Path;\n private tmpFileRegistry: TmpFileRegistry;\n\n public taskTree: TaskTree;\n public verbosity: VerbosityLevel = Verbosity.ERROR;\n\n constructor() {\n this.taskTree = new TaskTree();\n this.selectedTags = new Set([]);\n this.outputStyle = 'plain';\n this.tmpFileRegistry = new TmpFileRegistry(this.hostctlTmpDir());\n this.configRef = undefined;\n process.on('exit', (code) => this.appExitCallback());\n }\n\n appExitCallback() {\n // This callback is registered for the process 'exit' event.\n // Cleanup tasks, if any, can be performed here.\n // The TmpFileRegistry has its own exit handler to cleanup temporary files.\n }\n\n get config(): Config {\n if (!this._config) {\n throw new Error('Configuration has not been loaded. Call loadConfig() first.');\n }\n return this._config;\n }\n\n get tmpDir(): Path {\n if (!this._tmpDir) {\n // Ensure hostctlDir exists before creating a subdirectory in it.\n if (!fs.existsSync(this.hostctlDir().toString())) {\n fs.mkdirSync(this.hostctlDir().toString(), { recursive: true });\n }\n this._tmpDir = this.createNamedTmpDir(version);\n }\n return this._tmpDir;\n }\n\n async loadConfig(configRef?: string) {\n this.configRef = this.deriveConfigRef(configRef);\n this._config = await load(this.configRef);\n }\n\n isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch (_) {\n return false;\n }\n }\n\n deriveConfigRef(configRef?: string): string {\n // 1. If configRef is an existing file, use it.\n if (configRef && Path.new(configRef).isFile()) {\n return Path.new(configRef).toString();\n }\n\n // 2. Search CWD and ancestors for hostctl.yaml\n const foundPath = Path.cwd()\n .selfAndAncestors()\n .find((p) => p.join('hostctl.yaml').isFile());\n if (foundPath) {\n return foundPath.join('hostctl.yaml').toString();\n }\n\n // 3. Check for ~/.hostctl/hostctl.yaml\n const homeConfigPath = Path.homeDir().join('.hostctl', 'hostctl.yaml');\n if (homeConfigPath.isFile()) {\n return homeConfigPath.toString();\n }\n\n // 4. If a configRef was supplied (e.g. -c URL or -c non-existent-file), use that.\n // This allows `load()` to handle it as a ConfigUrl or report non-existence.\n if (configRef && this.isValidUrl(configRef)) {\n return configRef;\n }\n\n // 5. Otherwise, error out\n throw new Error(\n \"Could not find a hostctl configuration file. Searched for 'hostctl.yaml' in the current directory, ancestor directories, and '~/.hostctl/hostctl.yaml'. If you intended to use a URL or a specific file path, please ensure it's correct and accessible via the -c option.\",\n );\n }\n\n log(level: LogLevel, ...args: any[]): void {\n if (this.outputStyle === 'plain' && this.verbosity >= level) {\n console.log(...args);\n }\n }\n\n debug(...args: any[]): void {\n this.log(Verbosity.DEBUG, ...args);\n }\n\n info(...args: any[]): void {\n this.log(Verbosity.INFO, ...args);\n }\n\n warn(...args: any[]): void {\n this.log(Verbosity.WARN, ...args);\n }\n\n error(...args: any[]): void {\n this.log(Verbosity.ERROR, ...args);\n }\n\n osHomeDir(): Path {\n return Path.new(homedir()).absolute();\n }\n\n hostctlDir(): Path {\n return this.osHomeDir().join('.hostctl');\n }\n\n hostctlTmpDir() {\n return this.hostctlDir().join('tmp');\n }\n\n packagesDir(): Path {\n const envPkgDir = process.env.HOSTCTL_PKG_DIR;\n if (envPkgDir) {\n return Path.new(envPkgDir);\n }\n return this.hostctlDir().join('packages');\n }\n\n randName(): string {\n return Math.random().toString(36).slice(-5) + Math.random().toString(36).slice(-5);\n }\n\n hostctlTmpPath(tmpName?: string) {\n tmpName ??= this.randName();\n return this.hostctlTmpDir().join(tmpName);\n }\n\n // this directory will be automatically cleaned up at program exit\n createNamedTmpDir(subDirName?: string): Path {\n return this.tmpFileRegistry.createNamedTmpDir(subDirName);\n }\n\n // this file will be automatically cleaned up at program exit\n writeTmpFile(fileContent: string): Path {\n return this.tmpFileRegistry.writeTmpFile(fileContent);\n }\n\n shouldRunRemote(): boolean {\n // If any explicitly selected host is remote, assume remote intent for those.\n // If all selected hosts are local or no hosts are specified (implying local), run locally.\n const selectedHosts = this.selectedInventory();\n if (selectedHosts.length === 0 && this.selectedTags.size === 0) return false; // Default to local if no tags/hosts specified\n return selectedHosts.some((h) => !h.isLocal()); // True if any selected host is remote\n }\n\n logHostCommandResult(\n host: Host,\n command: string | string[],\n cmdOrErr: Command | Error,\n isErrorResult: boolean = false,\n ) {\n const hostName = host.uri || (host.isLocal() ? 'localhost' : 'unknown-host');\n if (cmdOrErr instanceof Error || isErrorResult) {\n const error = cmdOrErr as Error;\n this.debug(chalk.red(`[${hostName}] Error executing command \"${command}\": ${error.message}`));\n if (error.stack && this.verbosity >= Verbosity.DEBUG) {\n this.debug(chalk.red(error.stack));\n }\n } else {\n const cmdRes = cmdOrErr.result!;\n this.debug(chalk.green(`[${hostName}] Success executing \"${command}\" (exit code: ${cmdRes.exitCode})`));\n if (cmdRes.stdout) {\n this.debug(chalk.cyan(`[${hostName}] STDOUT:\\n${cmdRes.stdout.trim()}`));\n }\n if (cmdRes.stderr) {\n this.debug(chalk.yellow(`[${hostName}] STDERR:\\n${cmdRes.stderr.trim()}`));\n }\n }\n }\n\n defaultSshUser(): string | undefined {\n // TODO: Implement logic to get default SSH user from config\n // For example, look for a global default or a host-specific override\n // return this.config?.globalSettings?.defaultSshUser;\n return undefined; // Placeholder\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-jill.priv tsx bin/ops.ts e whoami -t ubuntu\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/ops.ts -c david.yaml exec \"whoami\" -t synology blog 4gb web1\n async execute(cmd: string | string[]): Promise<ExecuteResult> {\n const selectedHosts = this.selectedInventory();\n\n const cmdResults: Array<Promise<Command | Error>> = A(selectedHosts).map((host: Host) => this.runRemote(host, cmd));\n\n const hostResultQuads = await VP(selectedHosts)\n .a.zip(cmdResults)\n .a.map(([host, cmdPromise]: [Host, Promise<Command | Error>]) => {\n return cmdPromise.then((cmd) =>\n match(cmd)\n .when(isError, (err) => [host, false, '', chalk.red(err.message), -1, undefined])\n .otherwise((cmd) => [\n host,\n cmd.result?.success ?? false,\n cmd.result?.stdout ?? '',\n cmd.result?.stderr ?? '',\n cmd.result?.exitCode ?? -1,\n cmd.result?.signal?.name\n ]),\n );\n })\n .waitAll().value;\n\n // Build the detailed result structure using extracted methods\n const result = this.buildExecuteResult(hostResultQuads, selectedHosts.length);\n\n if (this.outputStyle === 'plain') {\n this.warn(chalk.yellow('=== Result ==='));\n A(hostResultQuads).each(([host, success, stdout, stderr]: [Host, boolean, string, string]) => {\n this.warn(\n `${success ? chalk.green(CHECKMARK) : chalk.red(XMARK)} ${chalk.cyan(host.hostname)}${host.alias ? ` (${host.alias})` : ''}`,\n );\n if (stdout) {\n this.warn(stdout);\n }\n if (stderr) {\n this.warn(chalk.red(stderr));\n }\n this.warn(chalk.yellow('--------------'));\n });\n } else if (this.outputStyle === 'json') {\n const result = A(hostResultQuads).reduce(\n (\n acc: Record<string, { alias: string; success: boolean; stdout: string; stderr: string }>,\n [host, success, stdout, stderr]: [Host, boolean, string, string],\n ) => {\n acc[host.hostname] = {\n alias: host.alias || '',\n success,\n stdout,\n stderr,\n };\n return acc;\n },\n {} as Record<string, { alias: string; success: boolean; stdout: string; stderr: string }>,\n );\n console.log(JSON.stringify(result, null, 2));\n }\n\n return result;\n }\n\n // used by execute to run a command on the remote host\n async runRemote(host: Host, cmd: string | string[]): Promise<Command | Error> {\n try {\n const hostPassword = await host.decryptedPassword();\n const sshConnection = {\n host: host.hostname,\n port: host.port,\n username: host.user,\n password: hostPassword,\n privateKeyPath: await host.plaintextSshKeyPath(),\n };\n\n const interactionHandler = InteractionHandler.with(withSudo(hostPassword));\n\n const session = new SSHSession();\n await session.connect(sshConnection);\n\n const command = Command.build(cmd);\n\n const commandObj = await session.run(command, interactionHandler);\n\n session.disconnect();\n\n return commandObj;\n } catch (e) {\n return e as Error;\n }\n }\n\n /**\n * Builds the hosts record from host result quads\n */\n private buildHostsRecord(hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>): Record<string, any> {\n const hosts: Record<string, any> = {};\n\n A(hostResultQuads).each(([host, success, stdout, stderr, exitCode, signal]: [Host, boolean, string, string, number, string | undefined]) => {\n // Use alias as the key to ensure uniqueness, fallback to hostname:port if no alias\n const key = host.alias || `${host.hostname}:${host.port}`;\n hosts[key] = {\n alias: host.alias || '',\n success,\n stdout,\n stderr,\n exitCode,\n signal,\n };\n });\n\n return hosts;\n }\n\n /**\n * Counts successful and failed hosts from host result quads\n */\n private countHostResults(hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>): { successfulHosts: number; failedHosts: number } {\n let successfulHosts = 0;\n let failedHosts = 0;\n\n A(hostResultQuads).each(([_, success]: [Host, boolean]) => {\n if (success) {\n successfulHosts++;\n } else {\n failedHosts++;\n }\n });\n\n return { successfulHosts, failedHosts };\n }\n\n /**\n * Determines overall success from host result quads\n */\n private determineOverallSuccess(hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>): boolean {\n return hostResultQuads.every((quad) => quad[1]);\n }\n\n /**\n * Constructs the detailed ExecuteResult from host result quads and total host count\n */\n private buildExecuteResult(\n hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>,\n totalHosts: number\n ): ExecuteResult {\n const hosts = this.buildHostsRecord(hostResultQuads);\n const { successfulHosts, failedHosts } = this.countHostResults(hostResultQuads);\n const success = this.determineOverallSuccess(hostResultQuads);\n\n return {\n success,\n hosts,\n totalHosts,\n successfulHosts,\n failedHosts,\n };\n }\n\n getSecretsForHost(hostId: string): Map<string | RegExp, string> {\n const secretsMap = new Map<string | RegExp, string>();\n if (!this._config) {\n return secretsMap; // No config loaded\n }\n // Placeholder: Actual logic to populate secretsMap based on hostId and _config needed here.\n // For now, it correctly returns an empty map if no config or no specific secrets found.\n return secretsMap;\n }\n\n public taskContextForRunFn<TParams extends TaskParams>(\n invocation: IInvocation<TParams>,\n params: TParams,\n hostForContext?: Host, // Optional host, primarily for remote tasks. The invocation itself might have a host.\n ): TaskContext<TParams> {\n const effectiveHost = hostForContext || invocation.host;\n\n return {\n // Properties from TaskContext\n params,\n id: invocation.id,\n host: effectiveHost,\n config: invocation.config, // Delegated from invocation\n\n // Methods from TaskContext, delegating to invocation\n log: (level: LogLevel, ...message: any[]) => {\n invocation.log(level, ...message);\n },\n info: (...message: any[]) => {\n invocation.info(...message);\n },\n debug: (...message: any[]) => {\n invocation.debug(...message);\n },\n warn: (...message: any[]) => {\n invocation.warn(...message);\n },\n error: (...message: any[]) => {\n invocation.error(...message);\n },\n exec: async (\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ) => {\n return await invocation.exec(command, options);\n },\n ssh: async <TRemoteParams extends TaskParams, TRemoteReturn extends RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> => {\n return await invocation.ssh(tags, remoteTaskFn);\n },\n run: async <TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> => {\n return await invocation.run(taskPartialFn);\n },\n getPassword: async (): Promise<string | undefined> => {\n return await invocation.getPassword();\n },\n getSecret: async (name: string): Promise<string | undefined> => {\n return await invocation.getSecret(name);\n },\n exit: (exitCode: number, message?: string): void => {\n invocation.exit(exitCode, message);\n },\n inventory: (tags: string[]): Host[] => {\n return invocation.inventory(tags);\n },\n selectedInventory: (tags?: string[]): Host[] => {\n return invocation.selectedInventory(tags);\n },\n file: invocation.file,\n };\n }\n\n setSelectedTags(selectedTags: string[]) {\n this.selectedTags = new Set(selectedTags);\n }\n\n setOutputStyle(outputStyle: 'plain' | 'json' | 'api') {\n this.outputStyle = outputStyle;\n }\n\n setVerbosity(level: number) {\n this.verbosity = level as VerbosityLevel;\n return this.verbosity;\n }\n\n outputApiMode() {\n return this.outputStyle == 'api';\n }\n\n outputJson() {\n return this.outputStyle == 'json';\n }\n\n outputPlain() {\n return this.outputStyle == 'plain';\n }\n\n querySelectedInventory(tags: Set<string> = new Set()): Host[] {\n return this.selectInventory(this.selectedInventory(), tags);\n }\n\n selectedInventory(): Host[] {\n return this.queryInventory(this.selectedTags);\n }\n\n // returns hosts that have *all* of the given tags\n // each tag is a string of the form:\n // - foo\n // - bar+baz\n // the tags are interpreted to be in disjunctive-normal-form: a disjunction of conjunctions\n queryInventory(tags: Set<string> = new Set()): Host[] {\n if (!this._config) {\n this.warn('Warning: Configuration not loaded, cannot query inventory.');\n return [];\n }\n const allHosts = this._config.hosts(); // Changed from inventory() to hosts()\n if (tags.size === 0) {\n return allHosts;\n }\n return this.selectInventory(allHosts, new Set(tags));\n }\n\n selectInventory(hosts: Host[], tags: Set<string> = new Set()): Host[] {\n if (S(tags).isEmpty()) {\n return hosts;\n }\n\n return A(hosts).select((host: Host) => host.hasAnyTag(tags));\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-jill.priv tsx bin/hostctl.ts inventory -t ubuntu\n printInventoryReport() {\n const configFromGetter = this.config;\n const config: Config = configFromGetter; // Explicitly type 'config'\n const allHosts = config.hosts(); // Gets all hosts if no tags are specified\n const allSecrets = config.secrets(); // Map<string, Secret>\n const allIds = config.ids(); // Map<string, RecipientGroup>\n\n if (this.outputPlain()) {\n let output = 'Config file: ' + this.configRef + '\\n\\nHosts:\\n';\n if (allHosts.length > 0) {\n allHosts.forEach((host) => {\n output += ` - ${host.uri}:\\n`;\n output += ` alias: ${host.alias || ''}\\n`;\n output += ` user: ${host.user || ''}\\n`;\n output += ` port: ${host.port || ''}\\n`;\n output += ` tags: ${host.tags.join(', ')}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n\n output += '\\nSecrets:\\n';\n if (allSecrets.size > 0) {\n allSecrets.forEach((secret: Secret, name: string) => {\n output += ` - ${name}:\\n`;\n output += ` encrypted: ${secret.value.isEncrypted()}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n\n output += '\\nIdentities (Public Keys):\\n';\n if (allIds.size > 0) {\n allIds.forEach((idGroup: RecipientGroup, name: string) => {\n output += ` - ${name}:\\n`;\n output += ` publicKeys: ${idGroup.publicKeys.join(', ')}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n console.log(output.trim());\n } else if (this.outputJson()) {\n const jsonData: any = {\n hosts: allHosts.map((h) => h.toObject()),\n secrets: {},\n identities: {},\n };\n allSecrets.forEach((secret: Secret, name: string) => {\n jsonData.secrets[name] = {\n name: secret.name,\n encrypted: secret.value.isEncrypted(),\n // Consider if ids/recipients should be exposed here\n };\n });\n allIds.forEach((idGroup: RecipientGroup, name: string) => {\n jsonData.identities[name] = {\n name: (idGroup as any).name || name, // Assuming NamedRecipientGroup has a name property\n publicKeys: idGroup.publicKeys,\n idRefs: idGroup.idRefs,\n };\n });\n console.log(JSON.stringify(jsonData, null, 2));\n }\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-david.priv tsx bin/hostctl.ts inventory encrypt\n async encryptInventoryFile() {\n if (!this.configRef) {\n throw new Error('Cannot encrypt inventory: Configuration file reference is not set.');\n }\n const currentConfigRef = this.configRef; // this.configRef is now guaranteed to be a string\n this.warn(`Encrypting inventory file: ${currentConfigRef}`);\n const configFile = new ConfigFile(currentConfigRef);\n await configFile.load();\n await configFile.encryptAll();\n await configFile.save(currentConfigRef);\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts inventory decrypt\n async decryptInventoryFile() {\n if (!this.configRef) {\n throw new Error('Cannot decrypt inventory: Configuration file reference is not set.');\n }\n const currentConfigRef = this.configRef;\n const configFile = new ConfigFile(currentConfigRef);\n await configFile.load();\n\n let hasEncryptedSecrets = false;\n for (const secret of configFile._secrets.values()) {\n if (secret.value.isEncrypted()) {\n hasEncryptedSecrets = true;\n break;\n }\n }\n\n if (!hasEncryptedSecrets) {\n this.info('No encrypted secrets found to decrypt. Inventory is already decrypted.');\n return;\n }\n\n // Only warn if we are actually proceeding with decryption\n this.warn(`Decrypting inventory file: ${currentConfigRef}`);\n\n try {\n await configFile.decryptAllIfPossible();\n\n // Log successfully used keys. This part might need refinement if loadPrivateKeys doesn't accurately reflect *used* keys.\n const successfullyUsedIdentityPaths = configFile\n .loadPrivateKeys() // This loads all keys specified by AGE_IDS\n .filter((identity) => {\n // A more robust check would be to see if AgeEncryption.decrypt reported success with this key.\n // For now, just checking existence, assuming if it was bad, decryptAllIfPossible would have failed.\n try {\n return fs.existsSync(identity.identityFilePath);\n } catch (e) {\n return false;\n }\n })\n .map((i) => i.identityFilePath)\n .join('\\n');\n\n if (this.verbosity >= Verbosity.INFO && successfullyUsedIdentityPaths.length > 0) {\n this.info(`Decrypted with one or more of the following private keys:\\n${successfullyUsedIdentityPaths}`);\n } else if (\n this.verbosity >= Verbosity.INFO &&\n hasEncryptedSecrets &&\n successfullyUsedIdentityPaths.length === 0\n ) {\n // This case implies decryption was attempted but no specified keys worked or were found,\n // though decryptAllIfPossible should ideally throw if it can't decrypt anything it needs to.\n this.warn('Encrypted secrets found, but no specified AGE identities were successfully used or found.');\n }\n\n await configFile.save(currentConfigRef);\n } catch (error: any) {\n if (error.message?.includes('Unable to read identity file')) {\n // Match the test's expected error message pattern for unreadable/missing keys\n throw new Error('Decryption failed: no identity matched or failed to decrypt due to key issue.');\n }\n // Handle cases where decryption fails for other reasons e.g. no matching identity for a secret\n if (error.message?.includes('No identity matched secret')) {\n // Assuming AgeEncryption.decrypt might throw this\n throw new Error('Decryption failed: no identity matched the encrypted secrets.');\n }\n throw error; // Re-throw other errors\n }\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -t ubuntu -- script.ts\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -c david.yaml -t synology blog 4gb web1 -- script.ts\n async runScript(scriptRef: string, params: TaskParams) {\n const selectedHosts = this.selectedInventory();\n this.info(`Selected hosts: ${selectedHosts.length}`);\n\n const absoluteScriptRef = Path.new(scriptRef).absolute();\n this.debug(`absoluteScriptRef=${absoluteScriptRef}`);\n this.debug(`params=${util.inspect(params)}`);\n const mod = await this.loadScriptAsModule(absoluteScriptRef.toString());\n\n this.debug(`mod=${util.inspect(mod)}`);\n\n const packageFileDir = this.pathOfPackageJsonFile(absoluteScriptRef.toString());\n if (!packageFileDir) {\n console.error(\n chalk.red(`Bundle failure. \"${absoluteScriptRef}\" nor any ancestor directory contains a package.json file.`),\n );\n return;\n }\n\n const taskFn: TaskFn = mod.default;\n\n const interactionHandler = new InteractionHandler();\n const localRuntime = new LocalRuntime(this, absoluteScriptRef, interactionHandler);\n\n if (this.outputPlain()) {\n this.info(`run: ${chalk.yellow(absoluteScriptRef.toString())} ${chalk.cyan(util.inspect(params))}`);\n }\n\n let invocation: LocalInvocation<any, any> | undefined;\n let scriptResult: RunFnReturnValue | Error;\n try {\n invocation = await (localRuntime as LocalRuntime).invokeRootTask(taskFn, params, `Running ${scriptRef}`);\n if (!invocation) {\n this.error(`Failed to invoke task for script: ${scriptRef}`);\n scriptResult = new Error(`Failed to invoke task for script: ${scriptRef}`);\n } else {\n scriptResult = await invocation.result;\n this.reportScriptResult(invocation, scriptResult);\n }\n } catch (e) {\n scriptResult = e as Error;\n if (this.outputPlain()) {\n this.error(`Error running script ${scriptRef}: ${scriptResult.message}`);\n if (this.verbosity >= Verbosity.DEBUG && scriptResult.stack) {\n this.error(scriptResult.stack);\n }\n }\n if (invocation) {\n this.reportScriptResult(invocation, scriptResult);\n }\n }\n\n return scriptResult;\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -t ubuntu -- script.ts\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -c david.yaml -t synology blog 4gb web1 -- script.ts\n async runScriptRemote(scriptRef: string, params: TaskParams) {\n const selectedHosts = this.selectedInventory();\n this.info(`Selected hosts: ${selectedHosts.length}`);\n\n const absoluteScriptRef = Path.new(scriptRef).absolute();\n this.debug(`absoluteScriptRef=${absoluteScriptRef}`);\n this.debug(`params=${util.inspect(params)}`);\n const mod = await this.loadScriptAsModule(absoluteScriptRef.toString());\n\n this.debug(`mod=${util.inspect(mod)}`);\n\n const packageFileDir = this.pathOfPackageJsonFile(absoluteScriptRef.toString());\n if (!packageFileDir) {\n console.error(\n chalk.red(`Bundle failure. \"${absoluteScriptRef}\" nor any ancestor directory contains a package.json file.`),\n );\n return;\n }\n\n const taskFn: TaskFn = mod.default;\n\n const interactionHandler = new InteractionHandler();\n const localRuntime = new LocalRuntime(this, absoluteScriptRef, interactionHandler);\n\n this.info(`run: ${chalk.yellow(absoluteScriptRef.toString())} ${chalk.cyan(util.inspect(params))}`);\n\n let invocation: LocalInvocation<any, any> | undefined;\n let scriptResult: RunFnReturnValue | Error;\n try {\n const runAllRemoteParams = { taskFn, params };\n invocation = await (localRuntime as LocalRuntime).invokeRootTask(\n runAllRemote,\n runAllRemoteParams,\n `Running ${scriptRef} on selected hosts`,\n );\n if (!invocation) {\n this.error(`Failed to invoke task for script: ${scriptRef}`);\n scriptResult = new Error(`Failed to invoke task for script: ${scriptRef}`);\n } else {\n scriptResult = await invocation.result;\n this.reportScriptResult(invocation, scriptResult);\n }\n } catch (e) {\n scriptResult = e as Error;\n if (this.outputPlain()) {\n this.error(`Error running script ${scriptRef}: ${scriptResult.message}`);\n if (this.verbosity >= Verbosity.DEBUG && scriptResult.stack) {\n this.error(scriptResult.stack);\n }\n }\n if (invocation) {\n this.reportScriptResult(invocation, scriptResult);\n }\n }\n\n return scriptResult;\n }\n\n async walkInvocationTreePreorder(\n invocation: IInvocation<any>,\n visitFn: (invocation: IInvocation<any>, depth: number) => Promise<void>,\n visited: Set<IInvocation<any>> = new Set(),\n depth = 0,\n ) {\n if (visited.has(invocation)) return;\n\n visited.add(invocation);\n await visitFn(invocation, depth);\n\n for (const childInvocation of invocation.getChildren() as IInvocation<any>[]) {\n await this.walkInvocationTreePreorder(childInvocation, visitFn, visited, depth + 1);\n }\n }\n\n async reportScriptResult(invocation: LocalInvocation<any, any>, scriptResult: RunFnReturnValue | Error) {\n if (this.outputPlain()) {\n this.warn('=== Evaluation ===');\n await this.walkInvocationTreePreorder(invocation, async (invocation, depth) => {\n const indent = ' '.repeat(depth);\n if (invocation.getDescription() || invocation.id) {\n const err = await invocation.resultError();\n if (err) {\n if (this.verbosity >= Verbosity.WARN) {\n this.warn(\n `${indent}${chalk.red(XMARK)} ${invocation.getDescription() || invocation.id} ${chalk.red(util.inspect(err))}`,\n );\n if (this.verbosity >= Verbosity.INFO) {\n this.info(`${indent} ${chalk.red(err.message)}`);\n if (this.verbosity >= Verbosity.DEBUG) {\n invocation.stdout && this.debug(`${indent} ${chalk.bgGreen(invocation.stdout.trimEnd())}`);\n invocation.stderr && this.debug(`${indent} ${chalk.bgRed(invocation.stderr.trimEnd())}`);\n }\n }\n }\n } else {\n if (this.verbosity >= Verbosity.WARN) {\n this.warn(`${indent}${chalk.green(CHECKMARK)} ${invocation.getDescription() || invocation.id}`);\n if (this.verbosity >= Verbosity.INFO) {\n this.info(`${indent} ${chalk.green(util.inspect(await invocation.getResultPromise()))}`);\n if (this.verbosity >= Verbosity.DEBUG) {\n invocation.stdout && this.debug(`${indent} ${chalk.bgGreen(invocation.stdout.trimEnd())}`);\n invocation.stderr && this.debug(`${indent} ${chalk.bgRed(invocation.stderr.trimEnd())}`);\n }\n }\n }\n }\n }\n });\n\n this.warn('=== Result ===');\n if (isError(scriptResult)) {\n this.warn(chalk.red(`${invocation.getDescription() || invocation.id} failed:`));\n this.warn(chalk.red(scriptResult.message));\n if (scriptResult.stack) {\n this.warn(chalk.red(scriptResult.stack));\n }\n } else if (\n scriptResult &&\n typeof scriptResult === 'object' &&\n 'exitCode' in scriptResult &&\n typeof scriptResult.exitCode === 'number'\n ) {\n // This case handles an intentional exit requested by the script returning an object like { exitCode: number, message?: string }\n const exitCode = scriptResult.exitCode;\n const message = (scriptResult as any).message || '';\n this.warn(\n chalk.yellow(\n `${invocation.getDescription() || invocation.id} requested exit with code ${exitCode}: ${message}`,\n ),\n );\n } else if (scriptResult === undefined) {\n this.warn(chalk.green(`${invocation.getDescription() || invocation.id} completed successfully.`));\n } else {\n this.warn(\n chalk.green(\n `${invocation.getDescription() || invocation.id} completed with result: ${util.inspect(scriptResult, { depth: 3 })}`,\n ),\n );\n }\n } else if (this.outputJson()) {\n // When JSON output is requested, print the stringified result directly,\n // bypassing the general verbosity-controlled logging system.\n if (!(scriptResult instanceof Error)) {\n console.log(JSON.stringify(scriptResult, null, 2));\n } else {\n // For errors in JSON mode, output a JSON error object to stdout\n const errorJson = {\n error: scriptResult.message,\n stack: scriptResult.stack,\n };\n console.log(JSON.stringify(errorJson, null, 2));\n }\n }\n }\n\n async loadScriptAsModule(scriptRef: string) {\n const mod = await import(scriptRef);\n return mod;\n }\n\n parseParams(scriptArgs: string[]): Object {\n return ParamMap.parse(scriptArgs).toObject();\n }\n\n // walks the directory tree that contains the given path from leaf to root searching for the deepest directory\n // containing a package.json file and returns the absolute path of that directory\n pathOfPackageJsonFile(path: string): Path | null {\n let p = Path.new(path);\n while (true) {\n if (p.dirContains('package.json')) {\n return p.absolute();\n }\n if (p.isRoot()) {\n return null;\n }\n\n p = p.parent();\n }\n }\n\n async printRuntimeReport() {\n const nodeRuntime = new NodeRuntime(this.tmpDir);\n\n const reportObj = {\n nodePath: await nodeRuntime.nodePath(),\n npmPath: await nodeRuntime.npmPath(),\n // summary: report?.getReport(),\n };\n this.info(reportObj);\n }\n\n async promptPassword(message = 'Enter your password') {\n return await promptPassword({ message });\n }\n\n async installRuntime() {\n this.info(`creating node runtime with ${this.tmpDir.toString()}`);\n const nodeRuntime = new NodeRuntime(this.tmpDir);\n await nodeRuntime.installIfNeeded();\n }\n\n /**\n * Executes a command on the selected hosts\n *\n * @param options - Configuration options for running the task\n * @returns Promise resolving to the task's result\n */\n\n async apiExecute(options: {\n /** The host tags to scope the run to */\n hostTags?: string[];\n /** The command to execute */\n command: string | string[];\n }): Promise<ExecuteResult> {\n if (options.hostTags) {\n this.setSelectedTags(options.hostTags);\n }\n\n const result = await this.execute(options.command);\n return result;\n }\n\n /**\n * Resolves a task from a package reference and runs it\n *\n * This method provides a simple way to resolve and execute tasks using the same\n * logic as the CLI, but as a method on an App instance.\n *\n * @param options - Configuration options for running the task\n * @returns Promise resolving to the task's result\n */\n async apiRunTask(options: {\n /** Whether to run the task remotely (if not provided, runs locally) */\n remote?: boolean;\n /** The host tags to scope the run to */\n hostTags?: string[];\n /** The package reference (core task, local path, or remote package) */\n package: string;\n /** Optional task name within the package */\n task?: string;\n /** Parameters to pass to the task */\n params: TaskParams;\n }): Promise<RunFnReturnValue> {\n // Build the package and task arguments for resolution\n const pkgTaskArgs = [options.package];\n if (options.task) {\n pkgTaskArgs.push(options.task);\n }\n\n // Resolve the task path\n const { scriptRef } = await resolveTaskPathAndArgs(this, pkgTaskArgs);\n\n if (options.hostTags) {\n this.setSelectedTags(options.hostTags);\n }\n\n if (options.remote) {\n return await this.runScriptRemote(scriptRef, options.params);\n } else {\n return await this.runScript(scriptRef, options.params);\n }\n }\n}\n","import Handlebars from 'handlebars';\n\n// per https://github.com/handlebars-lang/handlebars.js/issues/133#issuecomment-2585143\nHandlebars.registerHelper('join', function (items, block) {\n var delimiter = block.hash.delimiter || ',',\n start = block.hash.start || 0,\n len = items ? items.length : 0,\n end = block.hash.end || len,\n out = '';\n\n if (end > len) end = len;\n\n if ('function' === typeof block) {\n for (let i = start; i < end; i++) {\n if (i > start) out += delimiter;\n if ('string' === typeof items[i]) out += items[i];\n else out += block(items[i]);\n }\n return out;\n } else {\n return [].concat(items).slice(start, end).join(delimiter);\n }\n});\nexport default Handlebars;\n","import * as fs from 'node:fs';\nimport { ConfigFile } from './config-file';\nimport { Host } from './host';\nimport { ConfigUrl } from './config-url';\nimport type { Secret, RecipientGroup } from './config-file';\n\nexport interface ISecret {\n name: string;\n recipients(): string[]; // array of strings representing public keys of the identities that may decrypt the secret\n ciphertext(): Promise<string>;\n plaintext(): Promise<string | undefined>;\n}\n\nexport interface IRecipientGroup {\n recipients(): string[]; // returns an array of public keys associated with all immediate and transitive recipients\n}\n\nexport interface Config {\n hosts(): Host[]; // Renamed from inventory()\n secrets(): Map<string, Secret>; // Changed from property to method\n ids(): Map<string, RecipientGroup>; // Changed from property to method\n getSecret(name: string): ISecret | undefined; // Unchanged\n getRecipientGroups(idRefs: string[]): IRecipientGroup[]; // Unchanged\n}\n\nexport async function load(configRef: string | undefined): Promise<Config> {\n if (configRef && fs.existsSync(configRef)) {\n const configFile = new ConfigFile(configRef);\n await configFile.load();\n return configFile;\n } else if (configRef) {\n return new ConfigUrl(configRef);\n } else {\n throw new Error('No config specified.');\n }\n}\n","import fsa from 'node:fs/promises';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { glob, globSync, globStream, globStreamSync, Glob } from 'glob';\nimport { base16, base32, base64, base58, bech32 } from '@scure/base';\nimport * as R from 'rambda';\nimport yaml from 'js-yaml';\n// import * as yaml from \"yaml\";\nimport { Host } from './host';\nimport { AgeEncryption, Identity } from './age-encryption';\nimport { A } from './flex/array';\nimport { File } from './flex/file';\nimport { S } from './flex/set';\nimport { VP } from './flex/pipe';\nimport type { Config, IRecipientGroup, ISecret } from './config';\nimport { Undefined, V } from './flex/type';\nimport { M } from './flex/map';\n\ntype YamlHost = {\n host?: string; // The actual hostname/IP address\n port?: number; // SSH port (defaults to 22)\n user?: string;\n password?: SecretRef | string;\n 'ssh-key'?: SecretRef | string;\n tags?: string[];\n};\n\ntype YamlHostsMapping = { [key: string]: YamlHost };\n\ntype YamlSecret = {\n ids: string | string[];\n value: string;\n};\n\ntype YamlSecretsMapping = { [key: string]: YamlSecret };\n\ntype YamlIdsMapping = { [key: string]: string | string[] };\n\ntype YamlConfigFile = {\n hosts?: YamlHostsMapping;\n secrets?: YamlSecretsMapping;\n ids?: YamlIdsMapping;\n};\n\nexport class SecretRef {\n constructor(public name: string) {}\n\n toYAML() {\n return this;\n }\n}\n\nexport class SecretValue {\n constructor(private value: string) {}\n\n async encrypt(recipients: string[]): Promise<string> {\n if (!this.isEncrypted()) {\n this.value = await AgeEncryption.encrypt(this.value, recipients);\n // console.log(`encrypted: ${this.value}`)\n }\n return this.value;\n }\n\n async decrypt(identities: Identity[]): Promise<string | undefined> {\n if (this.isEncrypted()) {\n const decryptedValue = await AgeEncryption.decrypt(\n this.value,\n identities.map((i) => i.identityFilePath),\n );\n if (!decryptedValue) {\n return undefined;\n }\n this.value = decryptedValue;\n }\n return this.value;\n }\n\n isEncrypted() {\n return this.value.includes('AGE ENCRYPTED FILE');\n }\n\n toYAML() {\n return this.value;\n }\n}\n\nexport class Secret implements ISecret {\n constructor(\n public config: ConfigFile,\n public name: string,\n public ids: RecipientGroup,\n public value: SecretValue,\n ) {}\n\n recipients(): string[] {\n return this.ids.recipients();\n }\n\n async ciphertext(): Promise<string> {\n // console.log(`encrypting ${this.name} with ${this.recipients()}`);\n return await this.value.encrypt(this.recipients());\n }\n\n async plaintext(): Promise<string | undefined> {\n const identities = this.config.loadPrivateKeys();\n return await this.value.decrypt(identities);\n }\n\n async encrypt(): Promise<string> {\n return await this.ciphertext();\n }\n\n async decrypt(): Promise<string | undefined> {\n return await this.plaintext();\n }\n\n toYAML() {\n return {\n ids: this.ids.toYAML(),\n value: this.value.toYAML(),\n };\n }\n}\n\nexport class RecipientGroup implements IRecipientGroup {\n constructor(\n public config: ConfigFile,\n public publicKeys: string[],\n public idRefs: string[],\n ) {}\n\n // returns an array of public keys associated with all immediate and transitive recipients\n recipients(): string[] {\n const accumulatedPublicKeys: Set<string> = A(this.publicKeys).toSet();\n\n // console.log(\"111\")\n this.walkRecipientGroups((rg: RecipientGroup) => {\n // console.log(\"222\")\n // VP(accumulatedPublicKeys).pipe(S.addAll(rg.publicKeys));\n S(accumulatedPublicKeys).addAll(rg.publicKeys);\n });\n\n return S(accumulatedPublicKeys).toArray();\n }\n\n walkRecipientGroups(visitFn: (rg: RecipientGroup) => void, visited: Set<RecipientGroup> = new Set()) {\n if (visited.has(this)) return;\n\n visited.add(this);\n visitFn(this);\n\n this.config.getRecipientGroups(this.idRefs).forEach((rg) => rg.walkRecipientGroups(visitFn, visited));\n }\n\n toYAML() {\n return this.publicKeys.concat(this.idRefs);\n }\n}\n\nexport class NamedRecipientGroup extends RecipientGroup {\n constructor(\n public config: ConfigFile,\n public name: string,\n public publicKeys: string[],\n public idRefs: string[],\n ) {\n super(config, publicKeys, idRefs);\n }\n}\n\nconst SecretRefYamlType = new yaml.Type('!secret', {\n kind: 'scalar', // 'scalar' means string\n\n // Loader must check if the input object is suitable for this type.\n resolve(data): boolean {\n return !!data && typeof data === 'string' && data.trim().length > 0;\n },\n\n // If a node is resolved, use it to create a SecretRef instance.\n construct(yamlObj) {\n return new SecretRef(yamlObj); // yamlObj should be a string\n },\n\n // Dumper must process instances of Point by rules of this YAML type.\n instanceOf: SecretRef,\n\n // Dumper must represent SecretRef objects as string in YAML.\n represent(secretRef) {\n return (secretRef as SecretRef).name;\n },\n});\n\nconst HOSTCTL_CONFIG_SCHEMA = yaml.DEFAULT_SCHEMA.extend([SecretRefYamlType]);\n\nexport class ConfigFile implements Config {\n public _hosts: Map<string, Host>;\n public _ids: Map<string, RecipientGroup>;\n public _secrets: Map<string, Secret>;\n\n constructor(public path: string) {\n this._hosts = new Map();\n this._ids = new Map();\n this._secrets = new Map();\n }\n\n // serialization and deserialization\n\n async load() {\n if (!File.exists(this.path)) {\n throw new Error(`Config file ${this.path} doesn't exist. Unable to load.`);\n }\n\n const yamlFileContents = await fsa.readFile(this.path, {\n encoding: 'utf8',\n });\n\n const yamlDocument: YamlConfigFile = yaml.load(yamlFileContents, {\n schema: HOSTCTL_CONFIG_SCHEMA,\n }) as YamlConfigFile;\n\n this.parse(yamlDocument);\n }\n\n parse(yamlDocument: YamlConfigFile) {\n this._hosts = this.parseHosts(yamlDocument.hosts || {});\n this._ids = this.parseIdsMap(yamlDocument.ids || {});\n this._secrets = this.parseSecrets(yamlDocument.secrets || {});\n }\n\n parseSecretValue(yamlSecretValue: SecretRef | string | undefined): SecretRef | string | undefined {\n switch (V(yamlSecretValue).kind()) {\n case Undefined:\n return yamlSecretValue as undefined;\n case SecretRef:\n return yamlSecretValue as SecretRef;\n case String:\n return yamlSecretValue as string;\n // return new SecretValue(yamlSecretValue as string);\n default:\n throw new Error(`unknown secret type: ${V.inspect(yamlSecretValue)}`);\n }\n }\n\n // yamlHosts is an object\n parseHosts(yamlHosts: YamlHostsMapping): Map<string, Host> {\n const hosts = Object.entries(yamlHosts).reduce((hostMap: Map<string, Host>, [alias, hostObj]) => {\n hostObj ||= {};\n const password = this.parseSecretValue(hostObj.password);\n const sshKey = this.parseSecretValue(hostObj['ssh-key']);\n\n // Determine the hostname - use 'host' field if present, otherwise fall back to alias (for backward compatibility)\n const hostname = hostObj.host || alias;\n\n hostMap.set(\n alias, // Use the key as the alias\n new Host(this, {\n hostname, // Use the resolved hostname\n alias, // The key becomes the alias\n port: hostObj.port, // SSH port (defaults to 22 in Host constructor)\n user: hostObj.user,\n password,\n sshKey,\n tags: hostObj.tags,\n }),\n );\n return hostMap;\n }, new Map());\n return hosts;\n }\n\n parseIdsMap(yamlIds: YamlIdsMapping): Map<string, RecipientGroup> {\n const ids = Object.entries(yamlIds).reduce((secretsMap: Map<string, RecipientGroup>, [name, value]) => {\n value ||= [];\n const rg = this.parseRecipients(value as string[]);\n secretsMap.set(name, new NamedRecipientGroup(this, name, rg.publicKeys, rg.idRefs));\n return secretsMap;\n }, new Map());\n return ids;\n }\n\n parseRecipients(ids: string | string[] | (string | string[])[]): RecipientGroup {\n let idStrings: string[];\n if (V(ids).isA(String)) {\n idStrings = [ids as string];\n } else if (Array.isArray(ids) && ids.every((item: any) => V(item).isA(String))) {\n idStrings = ids as string[]; // ids is string[]\n } else if (Array.isArray(ids)) {\n // Handles (string | string[])[]\n idStrings = (ids as (string | string[])[]).flat(1) as string[];\n } else {\n // ids is not a string and not an array (e.g. undefined, null from YAML parsing)\n // This situation should ideally be handled based on how YAML treats missing/null recipient lists.\n // For now, default to an empty array to prevent further errors, with a warning.\n // console.warn(`[ConfigFile.parseRecipients] 'ids' field has unexpected type: ${typeof ids}. Expected string or array. Defaulting to empty recipient list.`);\n idStrings = [];\n }\n const publicKeysAndIdRefs = idStrings.flatMap((str) => str.split(',')).map((str) => str.trim());\n const [publicKeys, idRefs] = A(publicKeysAndIdRefs).partition(this.isValidPublicKey);\n return new RecipientGroup(this, publicKeys, idRefs);\n }\n\n // returns true if the key is an Age encryption public key (i.e. a bech32 key with a prefix of 'age')\n isValidPublicKey(str: string): boolean {\n try {\n const { prefix, words } = bech32.decode(str as any);\n return prefix === 'age';\n } catch (e) {\n return false;\n }\n }\n\n // yamlSecrets is an object\n parseSecrets(yamlSecrets: YamlSecretsMapping): Map<string, Secret> {\n const secrets = Object.entries(yamlSecrets).reduce((secretsMap: Map<string, Secret>, [name, yamlSecret]) => {\n // yamlSecret ||= {};\n\n const recipients = this.parseRecipients(yamlSecret.ids);\n\n secretsMap.set(name, new Secret(this, name, recipients, new SecretValue(yamlSecret.value)));\n return secretsMap;\n }, new Map());\n return secrets;\n }\n\n async save(destinationPath: string = this.path) {\n const hosts = this.serializeHosts();\n const secrets = this.serializeSecrets();\n const ids = this.serializeIds();\n const yamlFileObj = {\n hosts,\n secrets,\n ids,\n };\n const yamlFileContents = yaml.dump(yamlFileObj, {\n schema: HOSTCTL_CONFIG_SCHEMA,\n noRefs: true,\n });\n await fsa.writeFile(destinationPath, yamlFileContents);\n }\n\n serializeHosts() {\n // return M.toObject(M.map(([name, host]) => [name, host.toYAML()])(this.hosts));\n return VP(this._hosts)\n .map(([name, host]: [string, Host]) => [name, host.toYAML()])\n .m.toObject().value;\n }\n\n serializeSecrets() {\n // return M.toObject(\n // M.map(([name, secret]) => [name, secret.toYAML()])(this.secrets)\n // );\n return VP(this._secrets)\n .map(([name, secret]) => [name, secret.toYAML()])\n .m.toObject().value;\n }\n\n serializeIds() {\n // return M.toObject(M.map(([name, id]) => [name, id.toYAML()])(this.ids));\n return VP(this._ids)\n .map(([name, id]) => [name, id.toYAML()])\n .m.toObject().value;\n }\n\n // domain logic\n\n // loads private keys from the AGE_IDS environment variable, or defaults to $HOME/.hostctl/age/*.priv\n loadPrivateKeys(): Identity[] {\n let ageIds = process.env.AGE_IDS;\n if (!ageIds) {\n const home = os.homedir();\n if (home) {\n ageIds = path.join(home, '.hostctl', 'age', '*.priv');\n }\n }\n if (ageIds) {\n const paths = globSync(ageIds);\n const ids = paths.map((path) => new Identity({ path }));\n return ids;\n }\n return [];\n }\n\n getSecret(name: string): Secret | undefined {\n return this._secrets.get(name);\n }\n\n getRecipientGroups(idRefs: string[]): RecipientGroup[] {\n // return pipe(idRefs, A.map(this.ids.get), A.compact());\n return VP(idRefs)\n .map((idRef: string) => this._ids.get(idRef))\n .compact().value;\n }\n\n async decryptAllIfPossible(): Promise<void> {\n await VP(this._secrets)\n .m.values()\n .map((secret: Secret) => secret.decrypt())\n .waitAll().value;\n }\n\n async encryptAll(): Promise<void> {\n await VP(this._secrets)\n .m.values()\n .map((secret: Secret) => secret.encrypt())\n .waitAll().value;\n }\n\n // Config interface\n\n hosts(): Host[] {\n return M(this._hosts).values();\n }\n\n secrets(): Map<string, Secret> {\n return this._secrets;\n }\n\n ids(): Map<string, RecipientGroup> {\n return this._ids;\n }\n}\n","export const GeneratorFunction = function* () {}.constructor;\n\nexport interface BaseWrapperProxy {\n <T>(wrappedValue: T): any; // Generic call signature for the proxy itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\ninterface InternalFunctionWithRegMethods extends Function {\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\n// export function buildPipeThroughFunction() {\n// function func(wrappedValue) {\n// // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n// return new Proxy(wrappedValue, {\n// get(target, property, receiver) {\n// // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n// const fn = Reflect.get(func, property, receiver);\n// if (fn === undefined) {\n// return Reflect.get(target, property, receiver); // target === wrappedValue\n// }\n// const fnParams = parameters(fn);\n// const noParameters = fnParams.length === 0;\n// return function (...args: any) {\n// if (noParameters || args.length === 0) {\n// // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n// return fn.call(receiver, target);\n// } else {\n// // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n// return fn.apply(receiver, args)(target);\n// }\n// };\n// },\n// });\n// }\n// return func;\n// }\n\nexport type FunctionBag = { [key: string]: Function };\nexport class MethodBag {\n public methods: Map<string, [Function, number]>;\n public staticMethods: Map<string, Function>;\n constructor() {\n this.methods = new Map();\n this.staticMethods = new Map();\n }\n registerUncurriedFns(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.methods.set(functionName, [functionObj, 1]);\n });\n }\n registerCurriedFns(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.methods.set(functionName, [functionObj, 2]);\n });\n }\n registerStatic(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.staticMethods.set(functionName, functionObj);\n });\n }\n lookup(fnName: string): [Function, number] | undefined {\n const pair = this.methods.get(fnName);\n if (!pair) {\n return undefined;\n }\n return pair;\n }\n lookupStatic(fnName: string): Function | undefined {\n const fn = this.staticMethods.get(fnName);\n if (!fn) {\n return undefined;\n }\n return fn;\n }\n}\n\nexport function buildWrapperProxy(): BaseWrapperProxy {\n const methods = new MethodBag();\n function func(wrappedValue: any): any {\n // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n return new Proxy(wrappedValue, {\n get(target: any, property: string | symbol, receiver: any) {\n // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n const fnArityPair = methods.lookup(property.toString());\n if (fnArityPair === undefined) {\n return Reflect.get(target, property, receiver); // target === wrappedValue\n }\n const [fn, arity] = fnArityPair;\n return function (...args: any) {\n if (arity === 1) {\n // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n return fn.call(receiver, target);\n } else {\n // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n return fn.apply(receiver, args)(target);\n }\n };\n },\n });\n }\n Object.assign(func, {\n registerUncurriedFns: (fnBag: FunctionBag): void => {\n methods.registerUncurriedFns(fnBag);\n },\n registerCurriedFns: (fnBag: FunctionBag): void => {\n methods.registerCurriedFns(fnBag);\n },\n registerStatic: (fnBag: FunctionBag): void => {\n methods.registerStatic(fnBag);\n },\n });\n const funcWithMethods = func as unknown as InternalFunctionWithRegMethods;\n return new Proxy(funcWithMethods, {\n get(target: any, property: string | symbol, receiver: any) {\n const fn = methods.lookupStatic(property.toString());\n if (fn === undefined) {\n return Reflect.get(target, property, receiver); // target === func\n }\n return fn;\n },\n }) as BaseWrapperProxy;\n}\n\n// taken from https://javascript.info/currying-partials\nexport function curry(func: (...args: any[]) => any) {\n return function curried(this: any, ...args: any[]): any {\n if (args.length >= func.length) {\n return func.apply(this, args);\n } else {\n return function (this: any, ...args2: any[]): any {\n return curried.apply(this, args.concat(args2));\n };\n }\n };\n}\n\nexport function identity(val: any): any {\n return val;\n}\n\n// taken from https://stackoverflow.com/questions/1007981/how-to-get-function-parameter-names-values-dynamically\nexport function parameters(func: any): string[] {\n const ARROW = true;\n const FUNC_ARGS = ARROW ? /^(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m : /^(function)\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\n const FUNC_ARG_SPLIT = /,/;\n const FUNC_ARG = /^\\s*(_?)(.+?)\\1\\s*$/;\n const STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n return ((func || '').toString().replace(STRIP_COMMENTS, '').match(FUNC_ARGS) || ['', '', ''])[2]\n .split(FUNC_ARG_SPLIT)\n .map(function (arg: string) {\n return arg.replace(FUNC_ARG, function (all: string, underscore: string, name: string) {\n return name.split('=')[0].trim();\n });\n })\n .filter(String);\n}\n\nexport function thread(...args: ((arg: any) => any)[]) {\n return function (firstArg: any | undefined = undefined) {\n let pipeline = args;\n if (firstArg !== undefined) {\n pipeline.unshift(firstArg);\n }\n return pipeline.reduce((arg: any, fn: (arg: any) => any) => fn(arg));\n };\n}\n\nexport function threadR(...fns: ((arg: any) => any)[]) {\n return function (firstArg: any = undefined) {\n let pipeline = fns;\n if (firstArg !== undefined) {\n pipeline.push(firstArg);\n }\n return pipeline.reduceRight((arg: any, fn: (arg: any) => any) => fn(arg));\n };\n}\n\nexport interface FunctionUtilWrapperProxy extends BaseWrapperProxy {\n curry: (func: (...args: any[]) => any) => (...args: any[]) => any;\n identity: (val: any) => any;\n parameters: (func: any) => string[];\n thread: (...args: any[]) => (firstArg?: any) => any;\n threadR: (...fns: any[]) => (firstArg?: any) => any;\n}\n\n// export const F = {\n// curry,\n// identity,\n// thread,\n// };\n\nexport const F = buildWrapperProxy() as FunctionUtilWrapperProxy;\nF.registerUncurriedFns({ parameters });\n// F.registerCurriedFns({ });\nF.registerStatic({\n curry,\n identity,\n parameters,\n thread,\n threadR,\n});\n","import { Mutex } from 'async-mutex';\n\nimport { V, kind } from './type';\n\nexport type AnyConstructor = new (...args: any[]) => any;\n\n// This represents a set of implementations of the same protocol for the same type.\n// The implementations are named for disambuation purposes.\nclass NamedImplementations<StoredItemType> {\n constructor(\n public impls: Map<string, StoredItemType> = new Map(),\n public defaultImpl: string = '',\n ) {}\n\n register<SpecificItemType extends StoredItemType>(\n name: string,\n implClass: SpecificItemType,\n makeDefault: boolean = false,\n ) {\n if (this.impls.size === 0 || makeDefault) {\n this.setDefaultImpl(name);\n }\n this.impls.set(name, implClass);\n }\n\n get(name?: string): StoredItemType | undefined {\n return this.impls.get(name || this.defaultImpl);\n }\n\n setDefaultImpl(name: string) {\n this.defaultImpl = name;\n }\n}\n\n// This class captures all the named implementations of a particular typeclass/protocol associated with a given type.\n// There will be one of these ImplementationRegistry objects for every typeclass/protocol.\n// This class is responsible for associating types with their corresponding implementations of the typeclass/protocol that this\n// instance represents.\n// For example:\n// const mappableImplementations = new ImplementationRegistry(\"Mappable\");\n// In this example, mappableImplementations would represent all of the named implementations of the Mappable typeclass/protocol\n// for any type. The implementations private member would store all of the per-type named implementations of the Mappable typeclass/protocol\n// as (type => named implementations) pairs.\nclass ImplementationRegistry {\n // implementations is a Map of (type constructor function => ProtocolImplGroup) pairs\n // It stores all the named implementations of the typeclass/protocol associated with the type stored in the key of the map\n private implementations: Map<AnyConstructor, NamedImplementations<AnyConstructor>> = new Map();\n\n constructor(public name: string) {}\n\n register(classConstructor: AnyConstructor, implClass: AnyConstructor, makeDefault: boolean = false) {\n let protocolImplGroup = this.implementations.get(classConstructor);\n if (!protocolImplGroup) {\n protocolImplGroup = new NamedImplementations<AnyConstructor>();\n this.implementations.set(classConstructor, protocolImplGroup);\n }\n\n protocolImplGroup.register(implClass.name, implClass, makeDefault);\n }\n\n use(classConstructor: AnyConstructor, implClass: AnyConstructor) {\n this.register(classConstructor, implClass, true);\n }\n\n public clear() {\n this.implementations.clear();\n }\n\n // returns a class object that implements the typeclass/protocol - this is an implementation of the typeclass/protocol for a given type\n get(classConstructor: AnyConstructor, name?: string) {\n const protocolImplGroup = this.implementations.get(classConstructor);\n if (!protocolImplGroup) {\n throw new Error(`Protocol ${this.name} not implemented by ${classConstructor}`);\n }\n const impl = protocolImplGroup.get(name);\n if (!impl) {\n throw new Error(\n `Named implementation '${\n name || protocolImplGroup.defaultImpl\n }' of protocol ${this.name} not implemented by ${classConstructor}`,\n );\n }\n return impl;\n }\n}\n\n// declare global {\n// var protocolRegistry: Map<string, ImplementationRegistry>;\n// var protocolRegistryLock: Mutex;\n// }\n// global.protocolRegistryLock = global.protocolRegistryLock || new Mutex();\n// await global.protocolRegistryLock.runExclusive(async () => {\n// global.protocolRegistry = global.protocolRegistry || new Map();\n// });\n\n// Every implementation of the protocol must conform to the same interface.\n// The interface defines which methods a user of the protocol implementation may invoke.\nexport class Protocol {\n static protocolRegistryLock: Mutex;\n static registry: Map<string, ImplementationRegistry>;\n\n static {\n Protocol.protocolRegistryLock = Protocol.protocolRegistryLock || new Mutex();\n Protocol.registry = Protocol.registry || new Map();\n }\n\n static getTypeclass(): ImplementationRegistry {\n if (this.registry.has(this.name)) {\n return this.registry.get(this.name) as ImplementationRegistry;\n } else {\n const newTypeclass = new ImplementationRegistry(this.name);\n this.registry.set(this.name, newTypeclass);\n return newTypeclass;\n }\n }\n\n // static getTypeclass(): ImplementationRegistry {\n // if (global.protocolRegistry.has(this.name)) {\n // return global.protocolRegistry.get(this.name) as ImplementationRegistry;\n // } else {\n // const newTypeclass = new ImplementationRegistry(this.name);\n // global.protocolRegistry.set(this.name, newTypeclass);\n // return newTypeclass;\n // }\n // }\n\n static async register(classConstructor: AnyConstructor, implClass: AnyConstructor, makeDefault: boolean = false) {\n await Protocol.protocolRegistryLock.runExclusive(async () => {\n let typeclass = this.getTypeclass();\n typeclass.register(classConstructor, implClass, makeDefault);\n });\n }\n\n static async use(classConstructor: AnyConstructor, implClass: AnyConstructor) {\n await Protocol.protocolRegistryLock.runExclusive(async () => {\n let typeclass = this.getTypeclass();\n typeclass.use(classConstructor, implClass);\n });\n }\n\n // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n static get(classConstructor: AnyConstructor, name?: string) {\n const typeclass = this.getTypeclass();\n // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n return typeclass.get(classConstructor, name);\n }\n\n // returns an instance of the class that implements the typeclass\n // For example, Enumerable.for([1,2,3]) returns a new instance of the EnumerableArray implementation of the\n // Enumerable typeclass on the Array type, initialized with [1,2,3] in the constructor\n static for<S extends Protocol>(\n instance: any,\n // Allow passing the implementation class constructor directly.\n // The 'implClass' parameter from the original signature was used for named lookup,\n // which is handled by this.get() when explicitImplClass is not provided.\n explicitImplClass?: new (self: any) => S,\n ) {\n let finalImplConstructor: new (self: any) => S;\n\n if (explicitImplClass) {\n finalImplConstructor = explicitImplClass;\n } else {\n // Lookup in registry if no explicit class is provided.\n // this.get will retrieve the default implementation for kind(instance).\n finalImplConstructor = this.get(\n kind(instance),\n // No name needed here for the default lookup via this.get(typeConstructor)\n ) as new (self: any) => S;\n }\n return new finalImplConstructor(instance);\n }\n}\n\n// // TC is the class that represents the typeclass, e.g. Mappable\n// class NamedImplementations<TC extends Protocol> {\n// constructor(\n// // new () => TypeclassClass means the constructor function for the TypeclassClass\n// public impls: Map<string, ImplCtor<any, TC>> = new Map(), // this map stores named references to implementations of typeclass classes, e.g. 'MappableArray' -> MappableArray class that extends Mappable, etc.\n// public defaultImpl: string = \"\"\n// ) {}\n\n// register<Impl extends TC>(\n// name: string,\n// implClass: ImplCtor<TC, Impl>,\n// makeDefault: boolean = false\n// ) {\n// if (this.impls.size === 0 || makeDefault) {\n// this.setDefaultImpl(name);\n// }\n// this.impls.set(name, implClass);\n// }\n\n// get<Impl extends TC>(name?: string): Impl | undefined {\n// return this.impls.get(name || this.defaultImpl) as Impl | undefined;\n// }\n\n// setDefaultImpl(name: string) {\n// this.defaultImpl = name;\n// }\n// }\n\n// type EmptyConstructorFor<T> = {\n// new (): T;\n// }\n\n// type ImplCtor<TC extends Protocol, ImplClass extends TC> = EmptyConstructorFor<ImplClass>\n\n// type TCCtor<TC extends Protocol> = EmptyConstructorFor<TC>;\n\n// type TypeThatImplementsATypeclass = Function;\n\n// // Every implementation of the protocol must conform to the same interface.\n// // The interface defines which methods a user of the protocol implementation may invoke.\n// export abstract class Protocol {\n// // // Protocl has two parts, static and instance.\n// // // the static bits have to do with the registry at the class level, e.g. Mappable is a static registry for Mappable implementations\n// // // the instance bits are the implementation of the Mappable\n\n// // // this field is shared among all subclasses of Protocol\n// // private static registry: Map<string, Protocol> = new Map(); // this is a map of (typeclass name -> typeclass instance) pairs.\n\n// // static getTypeclass<TC extends Protocol>(): TC {\n// // if (this.registry.has(this.name)) {\n// // // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// // return this.registry.get(this.name) as unknown as TC;\n// // } else {\n// // const newTypeclass = new (this as unknown as TCCtor<TC>)(); // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// // this.registry.set(this.name, newTypeclass);\n// // return newTypeclass;\n// // }\n// // }\n\n// // static register(\n// // classConstructor: TypeThatImplementsATypeclass,\n// // implClass,\n// // makeDefault: boolean = false\n// // ) {\n// // let typeclass = this.getTypeclass<TC>();\n// // typeclass.register(classConstructor, implClass, makeDefault);\n// // }\n\n// // static use(classConstructor: TypeThatImplementsATypeclass, implClass) {\n// // let typeclass = this.getTypeclass();\n// // typeclass.use(classConstructor, implClass);\n// // }\n\n// // // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n// // static get<TC extends Protocol, ImplClass extends TC>(\n// // classConstructor: TypeThatImplementsATypeclass,\n// // name?: string\n// // ): ImplCtor<TC, ImplClass> {\n// // const typeclass = this.getTypeclass();\n// // // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n// // return typeclass.get(classConstructor, name);\n// // }\n\n// // returns an instance of the class that implements the typeclass\n// // For example, Enumerable.for([1,2,3]) returns a new instance of the EnumerableArray implementation of the\n// // Enumerable typeclass on the Array type, initialized with [1,2,3] in the constructor\n// static for<TC extends Protocol, ImplClass extends TC>(\n// instance,\n// implClassConstructor = undefined\n// ): ImplClass {\n// const implConstructor = ProtocolRegistry.get(this, kind(instance), implClassConstructor?.name);\n// return new implConstructor(instance);\n// }\n\n// // implementations is a Map of (type => NamedImplementations<typeclass class>) pairs\n// // e.g. 'String' -> NamedImplementations<Mappable>\n// // It stores all the named implementations of the typeclass/protocol associated with the type stored in the key of the map\n// private implementations: Map<\n// TypeThatImplementsATypeclass,\n// NamedImplementations<typeof this>\n// > = new Map();\n\n// // constructor(public name: string) {} // we don't need the name anymore because the this.constructor.name is the name of the typeclass, e.g. class Mappable extends Protocol; new Mappable().name is the name \"Mappable\"\n\n// register<ImplClass extends typeof this>(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassConstructor: EmptyConstructorFor<ImplClass>,\n// makeDefault: boolean = false\n// ) {\n// let protocolImplGroup = this.implementations.get(classConstructor);\n// if (!protocolImplGroup) {\n// protocolImplGroup = new NamedImplementations<typeof this>();\n// this.implementations.set(classConstructor, protocolImplGroup);\n// }\n\n// protocolImplGroup.register(\n// implClassConstructor.name,\n// implClassConstructor,\n// makeDefault\n// );\n// }\n\n// use<ImplClass extends typeof this>(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassConstructor: EmptyConstructorFor<ImplClass>,\n// ) {\n// this.register(classConstructor, implClassConstructor, true);\n// }\n\n// // returns a class object that implements the typeclass/protocol - this is an implementation of the typeclass/protocol for a given type\n// get(\n// classConstructor: TypeThatImplementsATypeclass,\n// name?: string\n// ): typeof this {\n// const protocolImplGroup = this.implementations.get(classConstructor);\n// if (!protocolImplGroup) {\n// throw `Protocol ${this.constructor.name} not implemented by ${classConstructor}`;\n// }\n// const impl = protocolImplGroup.get(name);\n// if (!impl) {\n// throw `Named implementation '${\n// name || protocolImplGroup.defaultImpl\n// }' of protocol ${\n// this.constructor.name\n// } not implemented by ${classConstructor}`;\n// }\n// return impl;\n// }\n// }\n\n// // Every implementation of the protocol must conform to the same interface.\n// // The interface defines which methods a user of the protocol implementation may invoke.\n// export abstract class ProtocolRegistry {\n// private static registry: Map<string, Protocol> = new Map(); // this is a map of (typeclass name -> typeclass instance) pairs.\n\n// static getTypeclassForImpl<TC extends Protocol>(implClassCtor): TC {\n// const typeclassCtor = V(implClassCtor).superclass();\n// return this.getTypeclass(typeclassCtor.name);\n// }\n\n// static getTypeclass<TC extends Protocol>(typeclassName): TC {\n// if (this.registry.has(typeclassName)) {\n// return this.registry.get(typeclassName) as unknown as TC;\n// } else {\n// const newTypeclass = new (this as unknown as TCCtor<TC>)(); // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// this.registry.set(typeclassName, newTypeclass);\n// return newTypeclass;\n// }\n// }\n\n// static register(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassCtor,\n// makeDefault: boolean = false\n// ) {\n// let typeclass = this.getTypeclassForImpl<typeof implClassCtor>(implClassCtor);\n// typeclass.register(classConstructor, implClassCtor, makeDefault);\n// }\n\n// static use(classConstructor: TypeThatImplementsATypeclass, implClassCtor) {\n// let typeclass = this.getTypeclassForImpl<typeof implClassCtor>(implClassCtor);\n// typeclass.use(classConstructor, implClassCtor);\n// }\n\n// // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n// static get<TC extends Protocol, ImplClass extends TC>(\n// typeclassCtor,\n// classConstructor: TypeThatImplementsATypeclass,\n// name?: string\n// ) {\n// // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n// const typeclass = this.registry.get(typeclassCtor.name) as Protocol;\n// return typeclass.get(classConstructor, name);\n// }\n// }\n","import { inspect as nodeInspect } from 'node:util';\nimport { MethodBag, type FunctionBag } from './function';\n\nexport class End {\n private static _instance: End;\n\n private constructor() {}\n\n public static get instance(): End {\n if (!this._instance) {\n this._instance = new End();\n }\n return this._instance;\n }\n}\nexport class Undefined {}\nexport class Null {}\nexport class Class {}\n\nexport function inspect(valueToInspect: any) {\n return nodeInspect(valueToInspect, { showProxy: true });\n}\n\nexport function isA(predicateType: any) {\n return function (value: any): boolean {\n return (\n value instanceof predicateType ||\n kind(value) === predicateType ||\n (value != null &&\n (value.constructor === predicateType || (predicateType.name === 'Object' && typeof value === 'object')))\n );\n };\n}\n\nexport function isAbsent(value: any): boolean {\n return value === null || value === undefined;\n}\n\nexport function isDefined(value: any): boolean {\n return value !== undefined;\n}\n\nconst BUILT_IN_CONSTRUCTORS = [\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Map,\n Set,\n Error,\n Promise,\n Symbol,\n BigInt,\n];\n\nexport function isClass(fn: any): boolean {\n if (typeof fn !== 'function') {\n return false;\n }\n // Check for class keyword syntax for user-defined classes\n if (/^class\\s/.test(Function.prototype.toString.call(fn))) {\n return true;\n }\n // Check if it's one of the built-in constructors that should be treated as a class\n if (BUILT_IN_CONSTRUCTORS.includes(fn)) {\n return true;\n }\n return false;\n}\n\n// true for arrays, functions, objects\nexport function isObject(val: any): boolean {\n return val !== null && (typeof val === 'function' || typeof val === 'object');\n}\n\nexport function isPresent(value: any): boolean {\n return !isAbsent(value);\n}\n\n// returns Null | Undefined | Boolean | Number | BigInt | String | Symbol | Function | Class | class object\n// the returned type should always have a name property\n// kind(new Set()).name -> 'Set'\n// kind(new Set()).name -> 'Set'\nexport function kind(value: any) {\n if (value === null) {\n return Null;\n }\n switch (typeof value) {\n case 'undefined':\n return Undefined;\n case 'boolean':\n return Boolean;\n case 'number':\n return Number;\n case 'bigint':\n return BigInt;\n case 'string':\n return String;\n case 'symbol':\n return Symbol;\n case 'function': // matches class constructors (class objects) and functions\n if (isClass(value)) {\n return Class;\n } else {\n return value.constructor;\n }\n break;\n case 'object': // matches instances of classes (e.g. arrays, ) and objects\n return value.constructor;\n break;\n }\n}\n\nexport function klass(objOrClass: any) {\n if (isClass(objOrClass)) {\n // Use the updated isClass\n return Function; // The 'class' of a class is Function, as per tests\n }\n // It's an instance or a non-class function/object\n const proto = Object.getPrototypeOf(objOrClass);\n if (proto === null || proto === undefined) {\n return undefined; // Or handle as appropriate if tests cover this\n }\n return proto.constructor;\n}\n\nexport function superclass(objOrClass: any) {\n if (objOrClass === Object) {\n return null; // Object has no superclass, as per tests\n }\n\n if (isClass(objOrClass)) {\n // Use the updated isClass\n const proto = Object.getPrototypeOf(objOrClass);\n // For built-ins like String, or base user classes like 'class A {}',\n // their prototype is Function.prototype. Their superclass is Object.\n if (proto === Function.prototype) {\n return Object;\n }\n // For derived classes like 'class C extends B {}', proto is B.\n return proto;\n } else {\n // It's an instance\n const instanceProto = Object.getPrototypeOf(objOrClass);\n if (instanceProto === null || instanceProto === undefined) {\n return undefined;\n }\n const superProto = Object.getPrototypeOf(instanceProto);\n if (superProto === null || superProto === undefined) {\n // This instance's class directly inherits from Object (or has no explicit superclass)\n // or it's an object created with Object.create(null)\n return superProto === null ? null : undefined; // if superProto is null, its constructor is undefined. if it's Object.prototype, constructor is Object\n }\n // If superProto is Object.prototype, then superProto.constructor is Object.\n // If instanceProto is, e.g. an Array instance, instanceProto is Array.prototype.\n // superProto is Object.prototype. superProto.constructor is Object.\n return superProto.constructor;\n }\n}\n\n// export const T = buildPipeThroughFunction();\n// Object.assign(T, {\n// kind,\n// });\n\nclass Value<T> {\n public isWrappedValue = true;\n constructor(public value: T) {}\n\n // isA(predicateType: any): boolean {\n // return isA(predicateType)(this.value);\n // }\n\n // isAbsent(value: any) {\n // return isAbsent(value);\n // }\n\n // isClass(value: unknown) {\n // isClass(value);\n // }\n\n // isPresent(value: any) {\n // return isPresent(value);\n // }\n\n // isError(value: unknown): value is Error {\n // return isError(value);\n // }\n\n // inspect() {\n // return inspect(this.value);\n // }\n\n // kind() {\n // return kind(this.value);\n // }\n\n // klass() {\n // return klass(this.value);\n // }\n\n // superclass() {\n // return superclass(this.value);\n // }\n}\n\n// export const V = function <T>(value: T): Value<T> {\n// return new Value(value);\n// };\n\n// Object.assign(V, {\n// isA,\n// isAbsent,\n// isClass,\n// isPresent,\n// inspect,\n// kind,\n// klass,\n// superclass,\n// });\n\ninterface FunctionWithRegistrationMethods {\n (wrappedValue: any): any; // Original signature of func\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\nexport interface ValueWrapperProxy extends FunctionWithRegistrationMethods {\n <T>(wrappedValue: T): any; // Represents the function signature of V itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n // Add other static methods if V is supposed to have them directly, e.g., isA, inspect, etc.\n // For now, focusing on the registration methods as per the errors.\n // Static methods registered via V.registerStatic\n isA: (predicateType: any) => (value: any) => boolean;\n isAbsent: (value: any) => boolean;\n isClass: (fn: any) => boolean;\n isDefined: (value: any) => boolean;\n isObject: (val: any) => boolean;\n isPresent: (value: any) => boolean;\n inspect: (valueToInspect: any) => string;\n kind: (value: any) => any; // Adjust 'any' to the actual return type of kind if more specific\n klass: (objOrClass: any) => any; // Adjust 'any' if more specific\n superclass: (objOrClass: any) => any; // Adjust 'any' if more specific\n}\n\nexport function buildValueWrapperProxy(): ValueWrapperProxy {\n const methods = new MethodBag();\n function func(wrappedValue: any): any {\n // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n if (!isObject(wrappedValue)) {\n wrappedValue = new Value(wrappedValue);\n }\n return new Proxy(wrappedValue, {\n get(target, property, receiver) {\n // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n const fnArityPair = methods.lookup(property.toString());\n if (fnArityPair === undefined) {\n if (target.isWrappedValue) {\n return Reflect.get(target.value, property, receiver); // target === Value(wrappedValue)\n } else {\n return Reflect.get(target, property, receiver); // target === wrappedValue\n }\n }\n const [fn, arity] = fnArityPair;\n return function (...args: any) {\n if (arity === 1) {\n // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n if (target.isWrappedValue) {\n // console.log(`111. ${fn}.call(${inspect(receiver)}, ${inspect(target.value)})`);\n\n // target === Value(wrappedValue)\n return fn.call(receiver, target.value);\n } else {\n // console.log(`222. ${fn}.call(${inspect(receiver)}, ${inspect(target)})`);\n return fn.call(receiver, target);\n }\n } else {\n // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n if (target.isWrappedValue) {\n // console.log(`333. ${fn}.apply(${inspect(receiver)}, ${inspect(args)})(${inspect(target.value)})`);\n return fn.apply(receiver, args)(target.value);\n } else {\n // console.log(`444. ${fn}.apply(${inspect(receiver)}, ${inspect(args)})(${inspect(target)})`);\n return fn.apply(receiver, args)(target);\n }\n }\n };\n },\n });\n }\n Object.assign(func, {\n registerUncurriedFns(fnBag: FunctionBag) {\n return methods.registerUncurriedFns(fnBag);\n },\n registerCurriedFns(fnBag: FunctionBag) {\n return methods.registerCurriedFns(fnBag);\n },\n registerStatic(fnBag: FunctionBag) {\n return methods.registerStatic(fnBag);\n },\n });\n const funcWithMethods = func as FunctionWithRegistrationMethods;\n return new Proxy(funcWithMethods, {\n get(target: any, property: string | symbol, receiver: any) {\n const fn = methods.lookupStatic(property.toString());\n if (fn === undefined) {\n // If the property is not a registered static method,\n // delegate to the target (funcWithMethods), which has registerUncurriedFns etc.\n return Reflect.get(target, property, receiver);\n }\n return fn;\n },\n }) as ValueWrapperProxy;\n}\n\nexport const V = buildValueWrapperProxy() as ValueWrapperProxy;\nV.registerUncurriedFns({\n isAbsent,\n isClass,\n isDefined,\n isObject,\n isPresent,\n inspect,\n kind,\n klass,\n superclass,\n});\nV.registerCurriedFns({ isA });\nV.registerStatic({\n isA,\n isAbsent,\n isClass,\n isDefined,\n isObject,\n isPresent,\n inspect,\n kind,\n klass,\n superclass,\n});\n","import { Protocol } from './protocol';\n\nexport class Compactable<S> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n compact(omit?: any[]): any {\n throw new Error('not implemented');\n }\n}\n\nexport function compact(omit?: any[]) {\n return function <V>(compactableVal: V | V[]): V | V[] | undefined {\n return Compactable.for<Compactable<V | V[]>>(compactableVal).compact(omit);\n };\n}\n","import { identity } from './function';\nimport { End } from './type';\n\nexport class Enumerator<T> implements IterableIterator<T> {\n static for<U>(iterator: Iterator<U>): Enumerator<U> {\n return new Enumerator(iterator);\n }\n\n constructor(private iterator: Iterator<T>) {}\n\n all(predFn: (v: T) => boolean): boolean {\n for (const elem of this) {\n if (!predFn(elem)) {\n return false;\n }\n }\n return true;\n }\n\n any(predFn: (v: T) => boolean): boolean {\n for (const elem of this) {\n if (predFn(elem)) {\n return true;\n }\n }\n return false;\n }\n\n each(visitorFn: (v: T) => any) {\n for (const e of this) {\n visitorFn(e);\n }\n }\n\n first<U>(predFn: (v: T) => any = identity, defaultIfAbsesnt: U | undefined = undefined): T | U | undefined {\n for (const e of this) {\n if (predFn(e)) return e;\n }\n return defaultIfAbsesnt;\n }\n\n map<U>(mapFn: (v: T) => U): Enumerator<U> {\n function* gen(iterator: Enumerator<T>) {\n for (const e of iterator) {\n yield mapFn(e);\n }\n }\n return Enumerator.for(gen(this));\n }\n\n // per https://typescript.tv/hands-on/all-you-need-to-know-about-iterators-and-generators/#the-iterator-protocol\n // implement the IterableIterator interface by implementing [Symbol.iterator]() and next()\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n // per https://typescript.tv/hands-on/all-you-need-to-know-about-iterators-and-generators/#the-iterator-protocol\n // implement the IterableIterator interface by implementing [Symbol.iterator]() and next()\n next(): IteratorResult<T> {\n const val = this.produce();\n if (val instanceof End) {\n return { done: true, value: End.instance };\n }\n return { done: false, value: val };\n }\n\n // this produces either the next value in the Enumerator, or it returns End\n produce(): T | End {\n const val: IteratorResult<T> = this.iterator.next();\n if (val.done) {\n return End.instance;\n }\n return val.value;\n }\n\n select(predFn: (v: T) => boolean): Enumerator<T> {\n function* gen(iterator: Enumerator<T>) {\n for (const e of iterator) {\n if (predFn(e)) yield e;\n }\n }\n return Enumerator.for(gen(this));\n }\n\n toArray(): T[] {\n return Array.from(this);\n }\n\n toMap<K, V>(kvMapFn: (v: T) => [K, V]): Map<K, V> {\n return new Map(this.map(kvMapFn));\n }\n\n toSet(): Set<T> {\n return new Set(this);\n }\n}\n","import { Protocol } from './protocol';\nimport type { AnyConstructor } from './protocol';\nimport { Enumerator } from './enumerator';\n\nexport type ImplementsEnumerable = {};\n\nexport class Enumerable<S, T> extends Protocol {\n static each = each;\n\n constructor(public self: S) {\n super();\n }\n\n each(visitorFn: (v: T) => any) {\n return this.toEnumerator().each(visitorFn);\n }\n\n *emit(): Generator<T> {\n throw new Error('emit not implemented');\n }\n\n toArray(): T[] {\n return this.toEnumerator().toArray();\n }\n\n toEnumerator(): Enumerator<T> {\n return Enumerator.for(this.emit());\n }\n\n toSet(): Set<T> {\n return this.toEnumerator().toSet();\n }\n}\n\nexport function each<T>(visitorFn: (v: T) => any) {\n return function (enumerableVal: Iterable<T>, implClass?: AnyConstructor) {\n return Enumerable.for(enumerableVal, implClass).each(visitorFn);\n };\n}\n","import { Protocol, type AnyConstructor } from './protocol';\n\n/**\n * The interpretation of the generic type parameters is:\n * S is the self type. For example: T[]\n *\n * T is the element type that is being iterated over from the self type, S.\n * For example, when S is T[], then the element type is likely going to be T.\n *\n * U is the type that we are transforming T into.\n * For example, when S is T[], then the element type is likely going to be T,\n * and the mapping function from T -> U means that the transformation type is U.\n */\nexport class Mappable<S, T, U> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n map(mapFn: (v: T) => U): any {\n throw new Error('not implemented');\n }\n}\n\nexport function map<T, U>(mapFn: (v: T) => U) {\n return function (mappableVal: any, explicitImplClass?: new (self: any) => Mappable<any, T, U>) {\n return Mappable.for(mappableVal, explicitImplClass).map(mapFn);\n };\n}\n\nexport class AsyncMappable<S, T, U> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n async map(mapFn: (v: T) => Promise<U>): Promise<any> {\n throw new Error('not implemented');\n }\n}\n\nexport function asyncMap<T, U>(mapFn: (v: T) => Promise<U>) {\n return async function (mappableVal: any, explicitImplClass?: new (self: any) => AsyncMappable<any, T, U>) {\n return await AsyncMappable.for(mappableVal, explicitImplClass).map(mapFn);\n };\n}\n","import { Protocol, type AnyConstructor } from './protocol';\n\nexport class Selectable<S, T> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n select(predFn: (e: T) => boolean): any {\n throw new Error('not implemented');\n }\n}\n\nexport function select<T>(predFn: (e: T) => boolean) {\n return function <S>(selectableVal: S, implClass?: AnyConstructor) {\n return Selectable.for(selectableVal, implClass).select(predFn);\n };\n}\n","import { toSet } from './array';\nimport { Compactable } from './compactable';\nimport { Enumerable } from './enumerable';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\n\nclass CompactableArray<T> extends Compactable<T[]> {\n compact(omit?: any[]) {\n omit ||= [null, undefined];\n\n const omitSet = toSet(omit);\n const newArr: any[] = [];\n for (const val of this.self) {\n if (!omitSet.has(val)) {\n newArr.push(val);\n }\n }\n return newArr;\n }\n}\nawait Compactable.register(Array, CompactableArray, true);\n\nclass MappableArray<T, U> extends Mappable<T[], T, U> {\n map(mapFn: (v: T) => U): any {\n return this.self.map(mapFn);\n }\n}\nawait Mappable.register(Array, MappableArray, true);\n\nexport class AsyncMappableArray<T, U> extends AsyncMappable<T[], T, U> {\n async map(mapFn: (v: T) => Promise<U>) {\n const arr: U[] = [];\n for await (const v of this.self) {\n const mappedValue = await mapFn(v);\n arr.push(mappedValue);\n }\n return arr;\n }\n}\nawait AsyncMappable.register(Array, AsyncMappableArray, true);\n\nclass EnumerableArray<T> extends Enumerable<T[], T> {\n *emit() {\n for (const e of this.self) yield e;\n }\n}\nawait Enumerable.register(Array, EnumerableArray, true);\n\nclass SelectableArray<T> extends Selectable<T[], T> {\n select(predFn: (v: T) => boolean): T[] {\n return this.self.filter(predFn);\n }\n}\nawait Selectable.register(Array, SelectableArray, true);\n","import { buildWrapperProxy } from './function';\n\nexport function each<K, V>(eachFn: (pair: [K, V]) => void) {\n return function (map: Map<K, V>): void {\n map.forEach((value, key) => {\n eachFn([key, value]);\n });\n };\n}\n\nexport function isEmpty<K, V>(map: Map<K, V>): boolean {\n return map.size === 0;\n}\n\n/**\n * @returns An array of the map's keys.\n *\n * ```ts\n * keys(\n * new Map([\n * [\"foo\", [1, 2, 3]],\n * [\"bar\", [4, 6, 7]],\n * ])\n * )\n * // [ 'foo', 'bar' ]\n * ```\n */\nexport function keys<K, V>(map: Map<K, V>): K[] {\n return Array.from(map.keys());\n}\n\nexport function map<K, V, T>(mapFn: (pair: [K, V]) => [K, T]) {\n return function (map: Map<K, V>): Map<K, T> {\n const m = new Map<K, T>();\n map.forEach((value, key) => {\n const [newKey, newValue] = mapFn([key, value]);\n m.set(newKey, newValue);\n });\n return m;\n };\n}\n\nexport function select<K, V>(predFn: (pair: [K, V]) => boolean) {\n return function (map: Map<K, V>): Map<K, V> {\n const newMap = new Map<K, V>();\n map.forEach((value, key) => {\n if (predFn([key, value])) {\n newMap.set(key, value);\n }\n });\n return newMap;\n };\n}\n\nexport function toObject<K, V>(map: Map<K, V>): object {\n return Object.fromEntries(map.entries());\n}\n\nexport function values<K, V>(map: Map<K, V>): V[] {\n return Array.from(map.values());\n}\n\n// export const M = buildPipeThroughFunction();\n\n// Object.assign(M, {\n// each,\n// isEmpty,\n// keys,\n// map,\n// select,\n// toObject,\n// values,\n// });\n\nexport const M = buildWrapperProxy();\nM.registerUncurriedFns({ isEmpty, keys, toObject, values });\nM.registerCurriedFns({ each, map, select });\nM.registerStatic({\n each,\n isEmpty,\n keys,\n map,\n select,\n toObject,\n values,\n});\n\nimport './all-protocols';\n","import { Enumerable } from './enumerable';\nimport { M } from './map';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\n\nexport class MapToMap<K, V, T, U> extends Mappable<Map<K, V>, [K, V], [T, U]> {\n map(mapFn: (pair: [K, V]) => [T, U]) {\n const m = new Map<T, U>();\n this.self.forEach((value, key) => {\n const [newKey, newValue] = mapFn([key, value]);\n m.set(newKey, newValue);\n });\n return m;\n }\n}\n\nexport class MapToArray<K, V, T> extends Mappable<Map<K, V>, [K, V], T> {\n map(mapFn: (pair: [K, V]) => T) {\n const arr: T[] = [];\n this.self.forEach((value, key) => {\n const mappedValue = mapFn([key, value]);\n arr.push(mappedValue);\n });\n return arr;\n }\n}\n\nawait Mappable.register(Map, MapToMap, true);\nawait Mappable.register(Map, MapToArray);\n\nexport class AsyncMapToMap<K, V, T, U> extends AsyncMappable<Map<K, V>, [K, V], [T, U]> {\n async map(mapFn: (pair: [K, V]) => Promise<[T, U]>) {\n const m = new Map<T, U>();\n for await (const [key, value] of this.self) {\n const [newKey, newValue] = await mapFn([key, value]);\n m.set(newKey, newValue);\n }\n return m;\n }\n}\n\nexport class AsyncMapToArray<K, V, T> extends AsyncMappable<Map<K, V>, [K, V], T> {\n async map(mapFn: (pair: [K, V]) => Promise<T>) {\n const arr: T[] = [];\n for await (const [key, value] of this.self) {\n const mappedValue = await mapFn([key, value]);\n arr.push(mappedValue);\n }\n return arr;\n }\n}\n\nawait AsyncMappable.register(Map, AsyncMapToMap, true);\nawait AsyncMappable.register(Map, AsyncMapToArray);\n\nexport class EnumerablePair<K, V> extends Enumerable<Map<K, V>, [K, V]> {\n *emit(): Generator<[K, V]> {\n for (const [k, v] of this.self.entries()) {\n yield [k, v];\n }\n }\n}\n\nexport class EnumerableKey<K, V> extends Enumerable<Map<K, V>, K> {\n *emit() {\n for (const k of this.self.keys()) {\n yield k;\n }\n }\n}\n\nexport class EnumerableValue<K, V> extends Enumerable<Map<K, V>, V> {\n *emit() {\n for (const v of this.self.values()) {\n yield v;\n }\n }\n}\n\nawait Enumerable.register(Map, EnumerablePair, true);\nawait Enumerable.register(Map, EnumerableKey);\nawait Enumerable.register(Map, EnumerableValue);\n\nexport class SelectableMap<K, V> extends Selectable<Map<K, V>, [K, V]> {\n select(predFn: (v: [K, V]) => boolean): Map<K, V> {\n return M(this.self).select(predFn);\n }\n}\nawait Selectable.register(Map, SelectableMap, true);\n","import { buildWrapperProxy, type FunctionBag, type BaseWrapperProxy } from './function';\n\n// Interface for the wrapped object O(obj)\nexport interface WrappedObject<V> {\n each: (eachFn: (pair: [string, V]) => void) => void;\n keys: () => string[];\n map: <T>(mapFn: (pair: [string, V]) => [string, T]) => { [s: string]: T };\n pick: (keysToPick: Set<string>) => { [s: string]: V };\n select: (predFn: (pair: [string, V]) => boolean) => { [s: string]: V };\n toMap: () => Map<string, V>;\n values: () => V[];\n}\n\n// Interface for the O proxy object\nexport interface ObjectWrapperProxy extends BaseWrapperProxy {\n <V>(wrappedValue: { [s: string]: V }): WrappedObject<V>;\n\n // Static methods on O - these match the exported function signatures\n each: <V>(eachFn: (pair: [string, V]) => void) => (object: { [s: string]: V }) => void;\n keys: <V>(object: { [s: string]: V }) => string[];\n map: <V, T>(mapFn: (pair: [string, V]) => [string, T]) => (object: { [s: string]: V }) => { [s: string]: T };\n pick: (keys: Set<string>) => <V>(object: { [s: string]: V }) => { [s: string]: V };\n select: <V>(predFn: (pair: [string, V]) => boolean) => (object: { [s: string]: V }) => { [s: string]: V };\n toMap: <V>(object: { [s: string]: V }) => Map<string, V>;\n values: <V>(object: { [s: string]: V }) => V[];\n\n // Note: registerUncurriedFns, registerCurriedFns, registerStatic are inherited from BaseWrapperProxy\n}\n\nexport function each<V>(eachFn: (pair: [string, V]) => void) {\n return function (object: { [s: string]: V }): void {\n Object.entries<V>(object).forEach((kvPair) => {\n eachFn(kvPair);\n });\n };\n}\n\nexport function keys<V>(object: { [s: string]: V }): string[] {\n return Object.keys(object);\n}\n\nexport function map<V, T>(mapFn: (pair: [string, V]) => [string, T]) {\n return function (object: { [s: string]: V }): { [s: string]: T } {\n const obj: { [s: string]: T } = {};\n Object.entries<V>(object).forEach((kvPair) => {\n const [newKey, newValue] = mapFn(kvPair);\n obj[newKey] = newValue;\n });\n return obj;\n };\n}\n\nexport function pick(keysToPick: Set<string>) {\n // Renamed 'keys' to 'keysToPick' for clarity with WrappedObject.pick\n return select<any>(([key, _]) => keysToPick.has(key)); // Use 'any' as placeholder, select's V will be the actual type\n}\n\nexport function select<V>(predFn: (pair: [string, V]) => boolean) {\n return function (object: { [s: string]: V }): { [s: string]: V } {\n const obj: { [s: string]: V } = {};\n Object.entries<V>(object).forEach((kvPair) => {\n if (predFn(kvPair)) {\n const [k, v] = kvPair;\n obj[k] = v;\n }\n });\n return obj;\n };\n}\n\nexport function toMap<V>(object: { [s: string]: V }): Map<string, V> {\n return new Map(Object.entries<V>(object));\n}\n\nexport function values<V>(object: { [s: string]: V }): V[] {\n return Object.values<V>(object);\n}\n\n// const _O = buildPipeThroughFunction();\n\n// Object.assign(_O, {\n// each, // (eachFn)(obj) => ...\n// keys, // (obj) => ...\n// map,\n// pick,\n// select,\n// toMap,\n// values,\n// });\n\n// export const O = _O;\n\nexport const O = buildWrapperProxy() as ObjectWrapperProxy;\nO.registerUncurriedFns({ keys, toMap, values });\nO.registerCurriedFns({ each, map, pick, select });\nO.registerStatic({\n each, // (eachFn)(obj) => ...\n keys, // (obj) => ...\n map,\n pick,\n select,\n toMap,\n values,\n});\n\nimport './all-protocols';\n","import { O } from './object';\nimport { Selectable } from './selectable';\n\nclass SelectableObject<V> extends Selectable<object, [string, V]> {\n select(predFn: (v: [string, V]) => boolean): object {\n return O(this.self).select(predFn);\n }\n}\nawait Selectable.register(Object, SelectableObject, true);\n","import { copyFile, cp, readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, lstatSync } from 'node:fs';\nimport { win32, posix } from 'node:path';\nimport type { ParsedPath } from 'node:path';\nimport { homedir } from 'node:os';\nimport { glob, globSync, globStream, globStreamSync, Glob } from 'glob';\nimport { isWindows } from './platform';\nimport { A } from './array';\nimport { Str } from './string';\nimport { Range } from './range';\nimport { Equal } from './equal';\n\nexport class Path {\n static new(path: Path | string, isWindowsPath: boolean = isWindows()): Path {\n if (path instanceof Path) {\n return path;\n }\n return new Path(path, isWindowsPath);\n }\n\n static cwd(): Path {\n return Path.new(process.cwd());\n }\n\n static homeDir(): Path {\n return Path.new(homedir());\n }\n\n static sep(isWindowsPath: boolean = isWindows()) {\n if (isWindowsPath) {\n return win32.sep;\n } else {\n return posix.sep;\n }\n }\n\n constructor(\n public path: string,\n public isWindowsPath: boolean = isWindows(),\n ) {}\n\n absolute(): Path {\n return this.resolve();\n }\n\n ancestors(): Path[] {\n if (this.isRoot()) {\n return [];\n }\n\n const ancestors: Path[] = [];\n let current: Path = this.directory();\n\n while (true) {\n ancestors.push(current);\n\n if (current.isRoot()) {\n break;\n }\n\n current = current.parent();\n }\n return ancestors;\n }\n\n basename(suffix?: string): Path {\n if (this.isWindowsPath) {\n return this.build(win32.basename(this.path, suffix));\n } else {\n return this.build(posix.basename(this.path, suffix));\n }\n }\n\n build(path: string): Path {\n return new Path(path, this.isWindowsPath);\n }\n\n // returns the path to the destination on success; null otherwise\n async copy(destPath: Path | string, mode?: number): Promise<Path | null> {\n destPath = Path.new(destPath).normalize();\n try {\n if (this.isDirectory()) {\n await cp(this.toString(), destPath.toString(), { mode, recursive: true });\n } else {\n await copyFile(this.toString(), destPath.toString(), mode);\n }\n return destPath;\n } catch (e) {\n return null;\n }\n }\n\n dirContains(filename: string): boolean {\n return this.isDirectory() && this.glob(filename).length > 0;\n }\n\n directory(): Path {\n return this.absolute().dirname();\n }\n\n // given a path like \"bar/bas\", this method converts the path to an absolute path (e.g. \"/foo/bar/bas\"),\n // and then returns the directory tree as an array of the form [\"foo\", \"bar\", \"bas\"]\n directorySegments(): string[] {\n return this.absolute().dirname().split();\n }\n\n dirname(): Path {\n if (this.isWindowsPath) {\n return this.build(win32.dirname(this.path));\n } else {\n return this.build(posix.dirname(this.path));\n }\n }\n\n equals(other: any): boolean {\n if (!(other instanceof Path)) {\n return false;\n }\n return this.path === other.path && this.isWindowsPath === other.isWindowsPath;\n }\n\n exists(): boolean {\n return existsSync(this.path);\n }\n\n ext(): string {\n return this.parse().ext;\n }\n\n glob(pattern: string) {\n const cwd = this.absolute().toString();\n return globSync(pattern, { cwd }).map((path) => this.build(path));\n }\n\n isAbsolute(): boolean {\n if (this.isWindowsPath) {\n return win32.isAbsolute(this.path);\n } else {\n return posix.isAbsolute(this.path);\n }\n }\n\n isDirectory(): boolean {\n return this.exists() && lstatSync(this.path).isDirectory();\n }\n\n isFile(): boolean {\n return this.exists() && lstatSync(this.path).isFile();\n }\n\n isPosix(): boolean {\n return !this.isWindowsPath;\n }\n\n isRoot(): boolean {\n return this.parse().root === this.normalize().toString();\n }\n\n isWindows(): boolean {\n return this.isWindowsPath;\n }\n\n join(...paths: string[]): Path {\n if (this.isWindowsPath) {\n return this.build(win32.join(this.path, ...paths));\n } else {\n return this.build(posix.join(this.path, ...paths));\n }\n }\n\n normalize(): Path {\n if (this.isWindowsPath) {\n return this.build(win32.normalize(this.path));\n } else {\n return this.build(posix.normalize(this.path));\n }\n }\n\n parent(count: number = 1) {\n let path = this.absolute();\n Range.new(1, count).each((i) => {\n path = path.resolve('..');\n });\n return path;\n }\n\n // returns an object of the form: { root, dir, base, ext, name }\n //\n // Posix:\n // >>> path.parse('/home/user/dir/file.txt')\n // { root: '/',\n // dir: '/home/user/dir',\n // base: 'file.txt',\n // ext: '.txt',\n // name: 'file' }\n // ┌─────────────────────┬────────────┐\n // │ dir │ base │\n // ├──────┬ ├──────┬─────┤\n // │ root │ │ name │ ext │\n // \" / home/user/dir / file .txt \"\n // └──────┴──────────────┴──────┴─────┘\n // (All spaces in the \"\" line should be ignored. They are purely for formatting.)\n //\n // Windows:\n // >>> path.parse('C:\\\\path\\\\dir\\\\file.txt');\n // { root: 'C:\\\\',\n // dir: 'C:\\\\path\\\\dir',\n // base: 'file.txt',\n // ext: '.txt',\n // name: 'file' }\n // ┌─────────────────────┬────────────┐\n // │ dir │ base │\n // ├──────┬ ├──────┬─────┤\n // │ root │ │ name │ ext │\n // \" C:\\ path\\dir \\ file .txt \"\n // └──────┴──────────────┴──────┴─────┘\n // (All spaces in the \"\" line should be ignored. They are purely for formatting.)\n parse(): ParsedPath {\n if (this.isWindowsPath) {\n return win32.parse(this.path);\n } else {\n return posix.parse(this.path);\n }\n }\n\n pop(count: number = 1): Path {\n return this.parent(count);\n }\n\n relative(to: string): Path {\n if (this.isWindowsPath) {\n return this.build(win32.relative(this.path, to));\n } else {\n return this.build(posix.relative(this.path, to));\n }\n }\n\n resolve(...paths: string[]): Path {\n if (this.isWindowsPath) {\n return this.build(win32.resolve(this.path, ...paths));\n } else {\n return this.build(posix.resolve(this.path, ...paths));\n }\n }\n\n root(): Path {\n const { root } = this.parse();\n return this.build(root);\n }\n\n selfAndAncestors(): Path[] {\n const ancestors: Path[] = [];\n let current: Path = this.absolute();\n\n while (true) {\n ancestors.push(current);\n\n if (current.isRoot()) {\n break;\n }\n\n current = current.parent();\n }\n return ancestors;\n }\n\n // returns the parts of the path, excluding the root if applicable\n // /home/user/dir/file.txt -> [\"home\", \"user\", \"dir\", \"file.txt\"]\n // C:\\home\\user\\dir\\file.txt -> [\"home\", \"user\", \"dir\", \"file.txt\"]\n // user/dir/file.txt -> [\"user\", \"dir\", \"file.txt\"]\n // user\\dir\\file.txt -> [\"user\", \"dir\", \"file.txt\"]\n split(): string[] {\n const normalized = this.normalize();\n if (normalized.isAbsolute()) {\n const { root } = normalized.parse();\n const relPath = Str(normalized.toString()).trimPrefix(root);\n return relPath.split(Path.sep(this.isWindowsPath));\n } else {\n return normalized.toString().split(Path.sep(this.isWindowsPath));\n }\n }\n\n toString(): string {\n return this.path;\n }\n}\n\nclass PathEqualImpl extends Equal<Path> {\n equal(val: Path): boolean {\n return this.self.equals(val);\n }\n}\n\nawait Equal.register(Path, PathEqualImpl, true);\n","import { platform as nodePlatform } from 'node:process';\n\nexport function isPosix(): boolean {\n const posixPlatforms: NodeJS.Platform[] = ['darwin', 'freebsd', 'linux', 'netbsd', 'openbsd', 'sunos'];\n return posixPlatforms.includes(platform());\n}\n\nexport function isWindows(): boolean {\n return platform() == 'win32';\n}\n\nexport function platform(): NodeJS.Platform {\n return nodePlatform;\n}\n","import { V } from './type';\n\n// Define an interface for the Str object/function\ninterface StringWrapper {\n (str: string): StringProxy; // Callable signature\n isEmpty: typeof isEmpty;\n isNumeric: typeof isNumeric;\n matches: typeof matches;\n}\n\nexport function isEmpty(str: string): boolean {\n return str.length == 0;\n}\n\nexport function isNumeric(str: string): boolean {\n if (typeof str !== 'string') return false;\n const trimmedStr = str.trim();\n if (trimmedStr === '') return false; // Empty or whitespace-only string is not numeric\n const num = Number(trimmedStr);\n // Check if it's a number, finite, and if the string version of the number matches the trimmed original string\n return !isNaN(num) && isFinite(num) && String(num) === trimmedStr;\n}\n\n/**\n * @param regexp must be a global regexp, e.g. /foo/g, and not just /foo/\n * @returns array of matches, or null if no matches present\n * Example:\n * const regexp = /t(e)(st(\\d?))/g;\n * const str = 'test1test2';\n *\n * const array = matches(regexp)(str)\n *\n * > matches(regexp)(str)\n * [\n * [\n * 'test1',\n * 'e',\n * 'st1',\n * '1',\n * index: 0,\n * input: 'test1test2',\n * groups: undefined\n * ],\n * [\n * 'test2',\n * 'e',\n * 'st2',\n * '2',\n * index: 5,\n * input: 'test1test2',\n * groups: undefined\n * ]\n * ]\n *\n * > matches(/foo/g)(\"blah\")\n * null\n */\nexport function matches(regexp: RegExp) {\n const globalRegex = regexp.global ? regexp : new RegExp(regexp.source, regexp.flags + 'g');\n return function (str: string) {\n const matches = [...str.matchAll(globalRegex)];\n if (matches.length == 0) return null;\n return matches;\n };\n}\n\nexport class StringProxy {\n // Add common string properties/methods for TypeScript\n public get length(): number {\n return this.str.length;\n }\n\n public toUpperCase(): string {\n return this.str.toUpperCase();\n }\n\n constructor(public str: string) {}\n\n isEmpty() {\n return isEmpty(this.str);\n }\n\n isNumeric() {\n return isNumeric(this.str);\n }\n\n matches(regexp: RegExp) {\n return matches(regexp)(this.str);\n }\n\n trimPrefix(prefix: string): string {\n if (this.str.startsWith(prefix)) {\n return this.str.slice(prefix.length);\n }\n return this.str;\n }\n\n trimSuffix(suffix: string): string {\n if (this.str.endsWith(suffix)) {\n return this.str.slice(0, this.str.length - suffix.length);\n }\n return this.str;\n }\n}\n\n// Cast Str to the StringWrapper interface\nexport const Str = function (str: string): StringProxy {\n const handler = {\n get(target: StringProxy, property: string | symbol, receiver: any) {\n // target is instance of StringProxy\n // Check if property exists on StringProxy instance itself (e.g. isEmpty, isNumeric)\n // or on its prototype chain.\n const propOnTarget = Reflect.get(target, property, receiver);\n\n if (V.isPresent(propOnTarget)) {\n // V.isPresent checks for null or undefined\n // If propOnTarget is a function (method of StringProxy), it's already correctly bound or doesn't need special binding.\n return propOnTarget;\n }\n\n // Property not found on StringProxy instance. Try the underlying string.\n const underlyingString = target.str;\n // Access the property directly from the string primitive.\n // Using `as any` to allow indexing with symbol, though typical string properties are strings.\n const valueFromPrimitive = (underlyingString as any)[property];\n\n if (typeof valueFromPrimitive === 'function') {\n // If it's a method from the string (e.g., toUpperCase, charAt), bind it to the underlying string.\n return valueFromPrimitive.bind(underlyingString);\n }\n\n // For non-function properties (e.g., 'length'), or if the property doesn't exist on a string (valueFromPrimitive will be undefined).\n return valueFromPrimitive;\n },\n };\n\n return new Proxy(new StringProxy(str), handler);\n} as StringWrapper;\n\nObject.assign(Str, {\n isEmpty,\n isNumeric,\n matches,\n});\n","import { Enumerable } from './enumerable';\n\nexport class Range {\n static new(start: number, end: number, inclusive: boolean = true): Range {\n return new Range(start, end, inclusive);\n }\n\n constructor(\n public start: number,\n public end: number,\n public inclusive: boolean = true,\n ) {}\n\n each(visitorFn: (num: number) => any) {\n const exclusiveEnd = this.inclusive ? this.end + 1 : this.end;\n for (let i = this.start; i < exclusiveEnd; i++) {\n visitorFn(i);\n }\n }\n\n equals(other: any): boolean {\n if (!(other instanceof Range)) {\n return false;\n }\n return this.start === other.start && this.end === other.end && this.inclusive === other.inclusive;\n }\n\n map<T>(mapFn: (num: number) => T): T[] {\n const arr: T[] = [];\n this.each((num) => {\n arr.push(mapFn(num));\n });\n return arr;\n }\n\n toArray(): number[] {\n return Enumerable.for<Enumerable<Range, number>>(this).toArray();\n }\n}\n","import { Protocol } from './protocol';\n\nexport class Equal<S> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n equal(val: S): boolean {\n throw new Error('equal not implemented');\n }\n\n notEqual(val: S): boolean {\n return !this.equal(val);\n }\n\n eq(val: S): boolean {\n return this.equal(val);\n }\n\n neq(val: S): boolean {\n return this.notEqual(val);\n }\n}\n\nexport function equal<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).equal(other);\n}\n\nexport function notEqual<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).notEqual(other);\n}\n\nexport function eq<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).equal(other);\n}\n\nexport function neq<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).neq(other);\n}\n","import { Range } from './range';\nimport { Enumerable } from './enumerable';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\nimport { Equal } from './equal';\n\nclass MappableRange<T> extends Mappable<Range, number, T> {\n map(mapFn: (v: number) => T): T[] {\n return this.self.map(mapFn);\n }\n}\nawait Mappable.register(Range, MappableRange, true);\n\n// export class AsyncMappableRange<T, U> extends AsyncMappable<T[], T, U> {\n// async map(mapFn: (v: T) => Promise<U>) {\n// const arr: U[] = [];\n// for await (const v of this.self) {\n// const mappedValue = await mapFn(v);\n// arr.push(mappedValue);\n// }\n// return arr;\n// }\n// }\n// await AsyncMappable.register(Range, AsyncMappableRange, true);\n\nclass EnumerableRange extends Enumerable<Range, number> {\n *emit() {\n const exclusiveEnd = this.self.inclusive ? this.self.end + 1 : this.self.end;\n for (let i = this.self.start; i < exclusiveEnd; i++) {\n yield i;\n }\n }\n}\nawait Enumerable.register(Range, EnumerableRange, true);\n\nclass EqualRange extends Equal<Range> {\n equal(other: Range): boolean {\n return this.self.equals(other);\n }\n}\nawait Equal.register(Range, EqualRange, true);\n\nclass SelectableRange extends Selectable<Range, number> {\n select(predFn: (v: number) => boolean): number[] {\n let arr: number[] = [];\n this.self.each((num) => {\n if (predFn(num)) {\n arr.push(num);\n }\n });\n return arr;\n }\n}\nawait Selectable.register(Range, SelectableRange, true);\n","import { Enumerable } from './enumerable';\nimport { Mappable } from './mappable';\n\nclass MappableSet<T, U> extends Mappable<Set<T>, T, U> {\n map(mapFn: (v: T) => U) {\n const s = new Set<U>();\n this.self.forEach((value) => {\n const newValue = mapFn(value);\n s.add(newValue);\n });\n return s;\n }\n}\nawait Mappable.register(Set, MappableSet, true);\n\nclass EnumerableSet<T> extends Enumerable<Set<T>, T> {\n // each(visitorFn: (v: T) => any): any {\n // return this.self.forEach((v) => visitorFn(v));\n // }\n *emit() {\n for (const e of this.self) {\n yield e;\n }\n }\n}\nawait Enumerable.register(Set, EnumerableSet, true);\n","import { buildWrapperProxy, identity, type BaseWrapperProxy } from './function';\n\nexport function compact(omit: any[] = [null, undefined]) {\n return function (arr: any[]): any[] {\n const omitSet = toSet(omit);\n const newArr: any[] = [];\n for (const val of arr) {\n if (!omitSet.has(val)) {\n newArr.push(val);\n }\n }\n return newArr;\n };\n}\n\nexport function concat<T>(tail: T[]) {\n return function (arr: T[]): T[] {\n return arr.concat(tail);\n };\n}\n\nexport function each<T>(eachFn: (value: T) => void) {\n return function (arr: Array<T>): void {\n arr.forEach((value) => {\n eachFn(value);\n });\n };\n}\n\nexport function find<T>(predicateFn: (v: T) => any) {\n return function (arr: Array<T>): T | undefined {\n for (const val of arr) {\n if (predicateFn(val)) {\n return val;\n }\n }\n return undefined;\n };\n}\n\n// returns the first n elements\nexport function first<T>(n: number) {\n return function (arr: T[]): T[] {\n return arr.slice(0, n);\n };\n}\n\nexport function head<T>(arr: T[]): T | undefined {\n return arr[0];\n}\n\nexport function isEmpty<T>(arr: Array<T>): boolean {\n return arr.length === 0;\n}\n\nexport function join(separator?: string) {\n return function <T>(arr: T[]): string {\n return arr.join(separator);\n };\n}\n\n// returns the last n elements\nexport function last<T>(n: number) {\n return function (arr: T[]): T[] {\n return arr.slice(arr.length - n, arr.length);\n };\n}\n\nexport function map<T, U>(mapFn: (value: T) => U) {\n return function (arr: Array<T>): Array<U> {\n return arr.map(mapFn);\n };\n}\n\nexport function nth(n: number) {\n return function <T>(arr: T[]): T | undefined {\n return arr[n];\n };\n}\n\nexport function partition<T>(predFn: (e: T) => boolean) {\n return function (arr: T[]): [T[], T[]] {\n const trueArr: T[] = [];\n const falseArr: T[] = [];\n for (const val of arr) {\n if (predFn(val)) {\n trueArr.push(val);\n } else {\n falseArr.push(val);\n }\n }\n return [trueArr, falseArr];\n };\n}\n\nexport function prepend<T>(...values: T[]) {\n return function (arr: T[]): T[] {\n arr.splice(0, 0, ...values);\n return arr;\n };\n}\n\nexport function select<T>(predFn: (e: T) => boolean) {\n return function (arr: T[]): T[] {\n return arr.filter(predFn);\n };\n}\n\n// returns the trailing elements of the array except for the leading n elements\nexport function skipFirst<T>(n: number) {\n return function (arr: T[]): T[] {\n if (n > arr.length) {\n n = arr.length;\n }\n return arr.slice(n, arr.length);\n };\n}\n\n// returns the leading elements of the array except for the trailing n elements\nexport function skipLast<T>(n: number) {\n return function (arr: T[]): T[] {\n if (n > arr.length) {\n n = arr.length;\n }\n return arr.slice(0, arr.length - n);\n };\n}\n\nexport function toSet(arr: Array<any>) {\n return new Set(arr);\n}\n\nexport function uniq(arr: Array<any>) {\n return uniqBy(identity)(arr);\n}\n\nexport function uniqBy<T, U>(comparisonValueFn: (value: T) => U) {\n return function (arr: Array<T>): Array<T> {\n const map = new Map<U, T>();\n for (const val of arr) {\n const key = comparisonValueFn(val);\n if (!map.has(key)) {\n map.set(key, val);\n }\n }\n return Array.from(map.values());\n };\n}\n\nexport function zip<T, U>(other: Array<U>) {\n return function (arr: Array<T>): Array<[T, U]> {\n var len = Math.min(arr.length, other.length);\n var result = Array(len);\n var idx = 0;\n while (idx < len) {\n result[idx] = [arr[idx], other[idx]];\n idx += 1;\n }\n return result;\n };\n}\n\n// export const A = {\n// compact,\n// concat,\n// each,\n// first,\n// map,\n// nth,\n// toSet,\n// uniq,\n// uniqBy,\n// };\n\nexport interface ArrayWrapperProxy extends BaseWrapperProxy {\n // Static methods registered via A.registerStatic\n compact: (omit?: any[]) => (arr: any[]) => any[];\n concat: <T>(tail: T[]) => (arr: T[]) => T[];\n each: <T>(eachFn: (value: T) => void) => (arr: Array<T>) => void;\n filter: <T>(predFn: (e: T) => boolean) => (arr: T[]) => T[]; // alias for select\n find: <T>(predicateFn: (v: T) => any) => (arr: Array<T>) => T | undefined;\n first: <T>(n: number) => (arr: T[]) => T[];\n head: <T>(arr: T[]) => T | undefined;\n isEmpty: <T>(arr: Array<T>) => boolean;\n join: (separator?: string) => <T>(arr: T[]) => string;\n last: <T>(n: number) => (arr: T[]) => T[];\n map: <T, U>(mapFn: (value: T) => U) => (arr: Array<T>) => Array<U>;\n nth: (n: number) => <T>(arr: T[]) => T | undefined;\n partition: <T>(predFn: (e: T) => boolean) => (arr: T[]) => [T[], T[]];\n prepend: <T>(...values: T[]) => (arr: T[]) => T[];\n select: <T>(predFn: (e: T) => boolean) => (arr: T[]) => T[];\n skipFirst: <T>(n: number) => (arr: T[]) => T[];\n skipLast: <T>(n: number) => (arr: T[]) => T[];\n toSet: <T>(arr: Array<T>) => Set<T>;\n uniq: <T>(arr: Array<T>) => T[];\n uniqBy: <T, U>(comparisonValueFn: (value: T) => U) => (arr: Array<T>) => Array<T>;\n zip: <T, U>(other: Array<U>) => (arr: Array<T>) => Array<[T, U]>;\n}\n\nexport const A = buildWrapperProxy() as ArrayWrapperProxy;\n\nA.registerUncurriedFns({ head, isEmpty, toSet, uniq });\nA.registerCurriedFns({\n compact,\n concat,\n each,\n filter: select,\n find,\n first,\n join,\n last,\n map,\n nth,\n partition,\n prepend,\n select,\n skipFirst,\n skipLast,\n uniqBy,\n zip,\n});\nA.registerStatic({\n compact,\n concat,\n each,\n filter: select,\n find,\n first,\n head,\n isEmpty,\n join,\n last,\n map,\n nth,\n partition,\n prepend,\n select,\n skipFirst,\n skipLast,\n toSet,\n uniq,\n uniqBy,\n zip,\n});\n\nimport './all-protocols';\n","import { Enumerable } from './enumerable';\nimport { buildWrapperProxy, type FunctionBag } from './function';\n\nexport interface SetWrapperProxy {\n <T>(wrappedValue: Set<T>): any; // Represents the function signature of S itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n\n // Static methods registered via S.registerStatic\n addAll: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n each: <V>(eachFn: (value: V) => void) => (set: Set<V>) => void;\n intersection: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n isEmpty: <V>(set: Set<V>) => boolean;\n isSubsetOf: (enumerableSuperset: any) => <T>(set: Set<T>) => boolean;\n isSupersetOf: (enumerableSubset: any) => <T>(set: Set<T>) => boolean;\n map: <V, T>(mapFn: (value: V) => T) => (set: Set<V>) => Set<T>;\n toArray: <V>(set: Set<V>) => V[];\n union: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n}\n\nexport function addAll(enumerableVal: any) {\n // console.log(`------------- addAll: ${V(enumerableVal).inspect()}`)\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n enumerable.each((item: T) => set.add(item));\n return set;\n };\n}\n\nexport function each<V>(eachFn: (value: V) => void) {\n return function (set: Set<V>): void {\n set.forEach((value) => {\n eachFn(value);\n });\n };\n}\n\nexport function intersection(enumerableVal: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n return set.intersection(enumerable.toSet());\n };\n}\n\nexport function isEmpty<V>(set: Set<V>): boolean {\n return set.size === 0;\n}\n\nexport function isSubsetOf(enumerableSuperset: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableSuperset);\n return function <T>(set: Set<T>): boolean {\n return set.isSubsetOf(enumerable.toSet());\n };\n}\n\nexport function isSupersetOf(enumerableSubset: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableSubset);\n return function <T>(set: Set<T>): boolean {\n return set.isSupersetOf(enumerable.toSet());\n };\n}\n\nexport function map<V, T>(mapFn: (value: V) => T) {\n return function (set: Set<V>): Set<T> {\n const s = new Set<T>();\n set.forEach((value) => {\n const newValue = mapFn(value);\n s.add(newValue);\n });\n return s;\n };\n}\n\nexport function toArray<V>(set: Set<V>): V[] {\n return Array.from(set.values());\n}\n\nexport function union(enumerableVal: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n return set.union(enumerable.toSet());\n };\n}\n\n// export const S = buildPipeThroughFunction();\n\n// Object.assign(S, {\n// addAll,\n// each,\n// intersection,\n// isEmpty,\n// isSubsetOf,\n// isSupersetOf,\n// map,\n// toArray,\n// union,\n// });\n\nexport const S = buildWrapperProxy() as SetWrapperProxy;\nS.registerUncurriedFns({ isEmpty, toArray });\nS.registerCurriedFns({ addAll, each, intersection, map, union, isSubsetOf, isSupersetOf });\nS.registerStatic({\n addAll,\n each,\n intersection,\n isEmpty,\n isSubsetOf,\n isSupersetOf,\n map,\n toArray,\n union,\n});\n\nimport './all-protocols';\n","import { A } from './array';\nimport { compact } from './compactable';\nimport { Enumerable, each } from './enumerable';\nimport { F } from './function';\nimport { M } from './map';\nimport { asyncMap, map } from './mappable';\nimport { O } from './object';\nimport { select } from './selectable';\nimport { S } from './set';\nimport { Str } from './string';\nimport { V } from './type';\nimport type { AnyConstructor } from './protocol';\n\nclass Pipe {\n constructor(public value: any) {}\n\n // e.g. convertMethodsToPipeline(A([1,2,3]))\n // returns a function that proxies method invocations through to the A([1,2,3]) object but assigns their return value\n // to this.value in the pipeline, and then returns the pipe object, enabling stuff like this:\n // P([1,2,3]).A.compact().A.first().value\n _convertMethodsToPipeline(wrappedValue: any, nameOfMethodBag: string) {\n const self = this;\n\n return new Proxy(wrappedValue, {\n get(target, property, receiver) {\n // function objects, like those returned from `A([1,2,3])`, have function properties attached to them that when invoked\n // will operate on the value supplied to the A function (e.g. [1,2,3]),\n // so we want to return a function that invokes the requested function property specified by the get handler\n // and assigns the result of the evaluation of that function property to the `this.value` member of the Pipe object\n const fn = Reflect.get(target, property, receiver);\n if (fn === undefined) {\n throw Error(`${nameOfMethodBag} does not have a method named ${String(property)}`);\n }\n // we return a function that wraps the function property that is being accessed, such that when invoked, the return value is\n // assigned to self.value and then the pipe object is returned\n return function (...args: any) {\n self.value = fn.apply(receiver, args);\n return self;\n };\n },\n });\n }\n\n get A() {\n return A(this.value);\n }\n\n get a() {\n return this._convertMethodsToPipeline(A(this.value), 'A');\n }\n\n compact(...args: any[]) {\n this.value = compact(...args)(this.value);\n return this;\n }\n\n each(visitorFn: (v: any) => any) {\n this.value = each(visitorFn)(this.value);\n return this;\n }\n\n get F() {\n return F(this.value);\n }\n\n get f() {\n return this._convertMethodsToPipeline(F(this.value), 'F');\n }\n\n // enumerable() {\n // this.value = Enumerable.for(this.value);\n // return this;\n // }\n\n // enumerator() {\n // this.value = Enumerator.for(this.value);\n // return this;\n // }\n\n log() {\n console.log(V.inspect(this.value));\n return this;\n }\n\n get M() {\n return M(this.value);\n }\n\n get m() {\n return this._convertMethodsToPipeline(M(this.value), 'M');\n }\n\n map(mapFn: (v: any) => any, implClass?: AnyConstructor) {\n this.value = map(mapFn)(this.value, implClass);\n return this;\n }\n\n asyncMap(mapFn: (v: any) => Promise<any> | any, implClass?: AnyConstructor) {\n this.value = asyncMap(mapFn)(this.value, implClass);\n return this;\n }\n\n get O() {\n return O(this.value);\n }\n\n get o() {\n return this._convertMethodsToPipeline(O(this.value), 'O');\n }\n\n pipe(fn: (value: any) => any) {\n this.value = fn(this.value);\n return this;\n }\n\n get S() {\n return S(this.value);\n }\n\n get s() {\n return this._convertMethodsToPipeline(S(this.value), 'S');\n }\n\n get Str() {\n return Str(this.value);\n }\n\n get str() {\n return this._convertMethodsToPipeline(Str(this.value), 'Str');\n }\n\n select(predFn: (v: any) => boolean, implClass?: AnyConstructor) {\n this.value = select(predFn)(this.value, implClass);\n return this;\n }\n\n toArray() {\n this.value = Enumerable.for<Enumerable<any, any>>(this.value).toArray();\n return this;\n }\n\n waitAll() {\n this.value = Promise.allSettled(this.value).then((results) => {\n return results.map((result) => {\n if (result.status === 'fulfilled') {\n return result.value;\n } else {\n return new Error(result.reason);\n }\n });\n });\n // .finally(() => {\n // console.log(\"Experiment completed\");\n // });\n return this;\n }\n}\n\nexport const VP = function (initial: any) {\n return new Pipe(initial);\n};\n\n// P([1,2,3,4]).map(v => v * 2).compact().value\n// P([1,2,3,4]).map(v => v * 2).A.compact()\n// P([1,2,3,4]).map(v => v * 2).a.compact().value\n// P([1,2,3,4]).map(v => v * 2).pipe(A.compact).value\n","import { homedir } from 'node:os';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { File } from './flex/file';\nimport { Path } from './flex/path';\n\nexport class TmpFileRegistry {\n private static _instance?: TmpFileRegistry;\n static get instance() {\n const path = File.join(osHomeDir(), '.hostctl', 'tmpstatic');\n this._instance ??= new TmpFileRegistry(path);\n return this._instance;\n }\n\n private rootPath: Path;\n private tempFilePaths: string[];\n\n constructor(rootPath: string | Path) {\n // console.log(`TmpFileRegistry: ${rootPath}`);\n this.rootPath = Path.new(rootPath);\n this.tempFilePaths = [];\n process.on('exit', (code) => this.exitCallback());\n }\n\n randName(): string {\n return Math.random().toString(36).slice(-5) + Math.random().toString(36).slice(-5);\n }\n\n tmpPath(tmpName?: string) {\n tmpName ??= this.randName();\n return this.rootPath.join(tmpName);\n }\n\n // this directory will be automatically cleaned up at program exit\n createNamedTmpDir(subDirName?: string): Path {\n const path = this.tmpPath(subDirName);\n fs.mkdirSync(path.toString(), { recursive: true });\n this.registerTempFileOrDir(path.toString());\n return path;\n }\n\n // this file will be automatically cleaned up at program exit\n writeTmpFile(fileContent: string): Path {\n const path = this.tmpPath();\n fs.writeFileSync(path.toString(), fileContent);\n this.registerTempFileOrDir(path.toString());\n return path;\n }\n\n exitCallback() {\n this.cleanupTempFiles();\n }\n\n registerTempFileOrDir(path: string) {\n this.tempFilePaths.push(path);\n }\n\n cleanupTempFiles() {\n this.tempFilePaths.forEach((path) => {\n this.rmFile(path);\n });\n this.tempFilePaths = [];\n }\n\n rmFile(path: string) {\n try {\n // console.log(`rm tmp file: ${path}`)\n fs.rmSync(path, { force: true, recursive: true });\n } catch (e) {\n // no-op\n }\n }\n}\n\n/**\n * Returns the currently configured tmp dir from os.tmpdir().\n */\nexport function osTmpDir() {\n return path.resolve(os.tmpdir());\n}\n\nexport function osHomeDir() {\n return path.resolve(os.homedir());\n}\n\n// export function createHostCtlDir(): string {\n// const path = File.join(osHomeDir(), \".hostctl\");\n// fs.mkdirSync(path, { recursive: true });\n// return path;\n// }\n\n// export function createNamedTmpDir(subDirName: string = \"tmp\"): string {\n// // const path = File.join(osTmpDir(), subDirName);\n// const path = File.join(osHomeDir(), \".hostctl\", subDirName);\n// fs.mkdirSync(path, { recursive: true });\n// return path;\n// }\n\n// returns the full path to the temp file on disk\nexport function writeTmpFile(fileContents: string): Path {\n return TmpFileRegistry.instance.writeTmpFile(fileContents);\n // return temporaryWriteSync(fileContents);\n}\n\n// export function rmTmpFile(path: string) {\n// try {\n// fs.rmSync(path, { force: true, recursive: true });\n// } catch (e) {\n// // no-op\n// }\n// }\n\n// export function createTmpFile(): string {\n// tmp.setGracefulCleanup();\n\n// return tmp.tmpNameSync();\n// }\n\n// export function createTmpDir(): string {\n// tmp.setGracefulCleanup();\n\n// const tmpDir = tmp.dirSync();\n// return tmpDir.name;\n// }\n","import type { PathLike } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { win32, posix } from 'node:path';\nimport { isWindows } from './platform';\n\nexport function exists(path: PathLike): boolean {\n return existsSync(path);\n}\n\nexport class File {\n static absolutePath(...paths: string[]): string {\n if (isWindows()) {\n return win32.resolve(...paths);\n } else {\n return posix.resolve(...paths);\n }\n }\n\n // basename(\"c:\\\\foo\\\\bar\\\\baz.txt\") => \"baz.txt\"\n // basename(\"/tmp/myfile.html\") => \"myfile.html\"\n static basename(path: string, suffix?: string): string {\n if (isWindows()) {\n return win32.basename(path, suffix);\n } else {\n return posix.basename(path, suffix);\n }\n }\n\n static exists(path: PathLike): boolean {\n return exists(path);\n }\n\n static join(...paths: string[]): string {\n if (isWindows()) {\n return win32.join(...paths);\n } else {\n return posix.join(...paths);\n }\n }\n\n static readSync(path: PathLike): string {\n return readFileSync(path, {\n encoding: 'utf8',\n });\n }\n\n static async readAsync(path: PathLike): Promise<string> {\n return await readFile(path, {\n encoding: 'utf8',\n });\n }\n}\n","import { Perc } from './flex';\nimport { A } from './flex/array';\nimport { O } from './flex/object';\nimport { VP } from './flex/pipe';\nimport { Undefined, V, kind } from './flex/type';\nimport { S } from './flex/set';\nimport { ConfigFile, Secret, SecretRef, SecretValue } from './config-file';\nimport { writeTmpFile } from './tempfile';\n\nexport class Host {\n public hostname: string; // The network hostname or IP address, from the YAML hosts map host field\n public alias: string; // Required alias for the host\n public port: number;\n public user?: string;\n public password?: SecretRef | string;\n public sshKey?: SecretRef | string;\n public tags: string[];\n public tagSet: Set<string>;\n\n constructor(\n public config: ConfigFile,\n opts: {\n hostname: string; // The network hostname or IP from the YAML hosts map host field\n alias: string; // Required alias for the host\n port?: number;\n user?: string;\n password?: SecretRef | string;\n sshKey?: SecretRef | string;\n tags?: string[];\n },\n ) {\n this.hostname = opts.hostname;\n this.alias = opts.alias;\n this.port = opts.port || 22;\n this.user = opts.user;\n this.password = opts.password;\n this.sshKey = opts.sshKey;\n this.tags = opts.tags ?? [];\n this.tagSet = new Set(this.tags);\n }\n\n async decryptedPassword(): Promise<string | undefined> {\n switch (kind(this.password)) {\n case String:\n return this.password as string;\n case SecretRef:\n const secretRef = this.password as SecretRef;\n const secret = this.config.getSecret(secretRef.name);\n return await secret?.plaintext();\n }\n // otherwise, it's undefined, so implicitly return undefined\n }\n\n async decryptedSshKey(): Promise<string | undefined> {\n if (V(this.sshKey).isA(SecretRef)) {\n const secretRef = this.sshKey as SecretRef;\n const secret = this.config.getSecret(secretRef.name);\n return await secret?.plaintext();\n }\n // otherwise, it's either undefined or a string path to a key that is already on the filesystem, so implicitly return undefined\n }\n\n toYAML() {\n let passwordForYaml: string | ReturnType<SecretRef['toYAML']> | undefined = this.password;\n if (this.password && V(this.password).isA(SecretRef)) {\n passwordForYaml = (this.password as SecretRef).toYAML();\n }\n\n let sshKeyForYaml: string | ReturnType<SecretRef['toYAML']> | undefined = this.sshKey;\n if (this.sshKey && V(this.sshKey).isA(SecretRef)) {\n sshKeyForYaml = (this.sshKey as SecretRef).toYAML();\n }\n\n return {\n host: this.hostname, // Always include the host field\n user: this.user,\n port: this.port === 22 ? undefined : this.port, // Only include port if not default\n password: passwordForYaml,\n 'ssh-key': sshKeyForYaml,\n tags: this.tags,\n };\n }\n\n // domain logic\n\n get shortName(): string {\n return this.alias;\n }\n\n isLocal(): boolean {\n // A host is local if its hostname is 'localhost' or '127.0.0.1'.\n // More robust checks could involve os.hostname(), but this is a common simple check.\n return this.hostname === 'localhost' || this.hostname === '127.0.0.1';\n }\n\n get uri(): string {\n return this.port === 22 ? this.hostname : `${this.hostname}:${this.port}`;\n }\n\n // returns the temporary path to the decrypted ssh key\n async writeTmpDecryptedSshKey(): Promise<string | undefined> {\n const content = await this.decryptedSshKey();\n if (content) {\n return writeTmpFile(content).toString();\n }\n }\n\n private _plaintextSshKeyPath: string | undefined = undefined;\n async plaintextSshKeyPath(): Promise<string | undefined> {\n if (this._plaintextSshKeyPath) {\n return this._plaintextSshKeyPath;\n }\n\n switch (kind(this.sshKey)) {\n case String:\n this._plaintextSshKeyPath = this.sshKey as string;\n break;\n case SecretRef:\n this._plaintextSshKeyPath = await this.writeTmpDecryptedSshKey();\n break;\n }\n return this._plaintextSshKeyPath;\n }\n\n toObject() {\n return {\n hostname: this.hostname,\n port: this.port,\n alias: this.alias,\n user: this.user,\n tags: this.tags,\n };\n }\n\n effectiveTags(): Set<string> {\n return new Set([...this.tagSet, this.hostname, this.alias]);\n }\n\n hasTag(tag: string): boolean {\n return this.effectiveTags().has(tag);\n }\n\n // each tag is a string of the form:\n // - foo\n // - bar,baz\n // the interpretation of a 'bar,baz' tag is that the host must have either the 'bar' tag or the 'baz' tag in order to consider the 'bar,baz' tag present\n hasAllTags(tags: Set<string>): boolean {\n const effectiveTagsForMatching = this.effectiveTags();\n for (const tag of tags) {\n const tagParts = tag.split(',');\n const anyTagPartPresent = S(effectiveTagsForMatching).intersection(tagParts).size > 0;\n if (!anyTagPartPresent) return false;\n }\n return true;\n }\n\n // each tag is a string of the form:\n // - foo\n // - bar+baz\n // the interpretation of a 'bar+baz' tag is that the host must have both the 'bar' tag and the 'baz' tag in order to consider the 'bar+baz' tag present\n hasAnyTag(tags: Set<string>): boolean {\n const effectiveTagsForMatching = this.effectiveTags();\n for (const tag of tags) {\n const tagParts = tag.split('+');\n const allTagPartsPresent = S(effectiveTagsForMatching).isSupersetOf(tagParts);\n if (allTagPartsPresent) return true;\n }\n return false;\n }\n}\n","// import { encrypt_with_x25519, decrypt_with_x25519 } from \"@kanru/rage-wasm\";\nimport fs from 'node:fs';\nimport * as age from 'age-encryption';\n\nimport { Process } from './process';\nimport { writeTmpFile } from './tempfile';\n\nconst AGE_ENCRYPTED_FILE_HEADER = '-----BEGIN AGE ENCRYPTED FILE-----';\n\n// Define a common interface for encryption drivers\ninterface IAgeDriver {\n encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string>;\n decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null>;\n}\n\n// Helper function to read identity string from a file (used by LibraryDriver)\nfunction readIdentityStringFromFile(path: string): string {\n const contents = fs.readFileSync(path, {\n encoding: 'utf8',\n });\n const identityString = contents\n .split(/\\r?\\n|\\r|\\n/g)\n .map((line) => line.trim())\n .find((line) => line.startsWith('AGE-SECRET-KEY-1'));\n if (!identityString) throw new Error(`Unable to read identity from file: ${path}`);\n return identityString;\n}\n\nexport class CliDriver implements IAgeDriver {\n async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const recipientArgs = publicKeys.flatMap((key) => ['-r', key]);\n // Capture stderr for better error reporting\n const { stdout, success, stderr } = await Process.spawn('age', ['-e', '-a'].concat(recipientArgs), valueToEncrypt);\n\n if (!success) {\n // Use new Error and include stderr if available\n throw new Error(`Failed to encrypt with age CLI: ${stderr || stdout}`);\n }\n return stdout;\n }\n\n async decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null> {\n if (privateKeyFilePaths.length === 0) {\n // Use new Error for consistency\n throw new Error('Unable to decrypt: No age encryption identity (private key) specified.');\n }\n const identityArgs = privateKeyFilePaths.flatMap((path) => ['-i', path]);\n // Capture stderr for better error reporting\n const { stdout, success, stderr } = await Process.spawn('age', ['-d'].concat(identityArgs), valueToDecrypt);\n\n if (!success) {\n // console.error(`Failed to decrypt with age CLI: ${stderr || stdout}`); // Optional for debugging\n return null; // Return null on failure\n }\n return stdout;\n }\n}\n\n// New LibraryDriver using age-encryption package, implementing IAgeDriver\nexport class LibraryDriver implements IAgeDriver {\n async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const e = new age.Encrypter();\n publicKeys.forEach((key) => e.addRecipient(key));\n const ciphertextBytes = await e.encrypt(valueToEncrypt); // Returns Uint8Array\n return age.armor.encode(ciphertextBytes); // Armor the Uint8Array to string\n }\n\n async decrypt(valueToDecryptArmored: string, privateKeyFilePaths: string[]): Promise<string | null> {\n if (privateKeyFilePaths.length === 0) {\n throw new Error('Unable to decrypt: No age encryption identity (private key) specified.');\n }\n\n const d = new age.Decrypter();\n let identitiesAdded = 0;\n for (const path of privateKeyFilePaths) {\n try {\n const identityString = readIdentityStringFromFile(path);\n d.addIdentity(identityString);\n identitiesAdded++;\n } catch (err) {\n // Log and continue: an invalid key path shouldn't prevent other valid keys from being tried.\n console.warn(`Failed to read or parse identity file ${path}, skipping: ${(err as Error).message}`);\n }\n }\n\n if (identitiesAdded === 0) {\n // console.error(\"Decryption failed: No valid identities could be loaded.\");\n return null; // No valid keys were loaded to attempt decryption.\n }\n\n try {\n const ciphertextBytes = age.armor.decode(valueToDecryptArmored); // De-armor string to Uint8Array\n const decryptedText = await d.decrypt(ciphertextBytes, 'text'); // Decrypts to string\n return decryptedText;\n } catch (error) {\n // Handles errors from age.armor.decode or d.decrypt (e.g., bad armor, no matching identity, corrupted data)\n // console.error(\"Library decryption failed:\", error); // Optional: for debugging\n return null; // Return null on any decryption failure\n }\n }\n}\n\nexport class Identity {\n public identityFilePath: string;\n private identity: string;\n\n // either the path to an identity file or an identity string must be supplied\n constructor({ path, identity }: { path?: string; identity?: string }) {\n if (identity) {\n this.identity = identity;\n this.identityFilePath = this.writeTmpIdentityFile(identity);\n } else if (path) {\n this.identity = this.readIdentityFromFile(path);\n this.identityFilePath = path;\n } else {\n throw 'Either an identity string or an identity file path must be supplied to create an Age Encryption identity';\n }\n }\n\n public get recipient(): Promise<string> {\n return age.identityToRecipient(this.identity);\n }\n\n // returns the path to the temp file\n private writeTmpIdentityFile(identity: string) {\n return writeTmpFile(identity).toString();\n }\n\n private readIdentityFromFile(path: string): string {\n const contents = fs.readFileSync(path, {\n encoding: 'utf8',\n });\n\n const identityString = contents\n .split(/\\r?\\n|\\r|\\n/g)\n .map((line) => line.trim())\n .find((line) => line.startsWith('AGE-SECRET-KEY-1'));\n\n if (!identityString) throw new Error(`Unable to read identity file: ${path}`);\n\n return identityString;\n }\n\n get privateKey(): string {\n return this.identity;\n }\n\n get publicKey(): Promise<string> {\n return this.recipient;\n }\n\n decrypt(encryptedString: string): Promise<string | null> {\n return AgeEncryption.decrypt(encryptedString, [this.identityFilePath]);\n\n ///////////////////////////////////\n\n // const encryptedBytes = new TextEncoder().encode(encryptedString);\n // const plaintextBytes = await decrypt_with_x25519(this.identity, encryptedBytes);\n // return new TextDecoder().decode(plaintextBytes);\n\n ///////////////////////////////////\n\n // const d = new Decrypter();\n // d.addIdentity(this.identity);\n\n // const encryptedBytes = new TextEncoder().encode(encryptedString);\n // return d.decrypt(encryptedBytes, \"text\");\n }\n\n async encrypt(plaintext: string): Promise<string> {\n return AgeEncryption.encrypt(plaintext, [await this.recipient]);\n\n ///////////////////////////////////\n\n // const plaintextBytes = new TextEncoder().encode(plaintext);\n // const encryptedBytes = await encrypt_with_x25519(\n // this.recipient,\n // plaintextBytes,\n // true\n // );\n // return new TextDecoder().decode(encryptedBytes);\n\n ///////////////////////////////////\n\n // const e = new Encrypter();\n // e.addRecipient(this.recipient);\n\n // const encryptedBytes = e.encrypt(plaintext);\n // return new TextDecoder().decode(encryptedBytes);\n }\n}\n\nexport class AgeEncryption {\n static instance: IAgeDriver = new LibraryDriver(); // Use LibraryDriver by default\n\n static async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const encrypted = await this.instance.encrypt(valueToEncrypt, publicKeys);\n // console.log(`encrypting ${valueToEncrypt} with keys ${publicKeys}: ${encrypted}`)\n return encrypted;\n }\n\n static async decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null> {\n return await this.instance.decrypt(valueToDecrypt, privateKeyFilePaths);\n }\n}\n\n// const id = new Identity({ path: \"/home/david/.secrets/age/david.priv\" });\n// console.log(\"identity\", id.privateKey);\n// console.log(\"recipient\", id.publicKey);\n// const encrypted = await id.encrypt(\"food\");\n// console.log(\"encrypt 'food' =>\", encrypted);\n// const plain = await id.decrypt(encrypted);\n// console.log(`decrypt '${encrypted}' =>`, plain);\n","import spawnAsync, { type SpawnResult } from '@expo/spawn-async';\n\nexport type ProcessResult = SpawnResult & { success: boolean };\nexport class Process {\n static spawn(cmd: string, args: string[], stdin?: string): Promise<ProcessResult> {\n return new Process(cmd, args, stdin).spawn();\n }\n\n constructor(\n public cmd: string,\n public args: string[],\n public stdin?: string,\n ) {}\n\n async spawn(): Promise<ProcessResult> {\n try {\n const spawnOptions = {\n ignoreStdio: false,\n // detached: true, // if we wanted to keep child alive after parent exits\n };\n const promise = spawnAsync(this.cmd, this.args, spawnOptions);\n\n if (this.stdin && promise.child) {\n promise.child.stdin?.write(this.stdin);\n promise.child.stdin?.end();\n }\n const result: SpawnResult = await promise;\n\n // const child = procp.child;\n // const stdout = new StringBuilder();\n // const stderr = new StringBuilder();\n\n // child.stdout?.on('data', (data) => {\n // stdout.append(data);\n // });\n\n // child.stderr?.on('data', (data) => {\n // stderr.append(data);\n // });\n\n // child.on('exit', (code, signal) => {\n // console.log(`child process exited with code ${code} and signal ${signal}`);\n // });\n\n return { ...result, success: result.status === 0 };\n } catch (e) {\n // The error object also has the same properties as the result object\n // console.error(e.stack);\n const errorResult = e as SpawnResult;\n return { ...errorResult, success: errorResult.status === 0 };\n }\n }\n}\n","import { Host } from './host';\nimport type { Config, IRecipientGroup, ISecret } from './config';\nimport type { Secret, RecipientGroup } from './config-file'; // Import concrete types for Map values\n\nexport class ConfigUrl implements Config {\n public _hosts: Map<string, Host>;\n public _secrets: Map<string, Secret>;\n public _ids: Map<string, RecipientGroup>;\n\n constructor(public url: string) {\n this._hosts = new Map();\n this._secrets = new Map();\n this._ids = new Map();\n }\n\n // Config interface\n\n hosts(): Host[] {\n return [];\n }\n\n getSecret(name: string): ISecret | undefined {\n return undefined; // ConfigUrl does not manage individual secrets\n }\n\n getRecipientGroups(idRefs: string[]): IRecipientGroup[] {\n return []; // ConfigUrl does not manage recipient groups\n }\n\n secrets(): Map<string, Secret> {\n return this._secrets;\n }\n\n ids(): Map<string, RecipientGroup> {\n return this._ids;\n }\n}\n","import { Readable } from 'node:stream';\nimport { StreamRegex } from 'stream-regex';\nimport { M } from './flex/map';\nimport { VP } from './flex/pipe';\nimport { A } from './flex/array';\nimport type { InputMap } from './util/input-helpers';\n\nexport class InteractionHandler {\n static with(inputs: InputMap): InteractionHandler {\n return new InteractionHandler(new Map(Object.entries(inputs)));\n }\n\n private patternInputMappings: Map<string, string>; // pairs of pattern -> response\n private inputStreamForRegexMatcher: Readable | undefined;\n // private streamRegex: StreamRegex;\n // private matches: Readable;\n private writeFn: ((str: string) => void) | undefined;\n constructor(patternInputMappings: Map<string | RegExp, string> = new Map()) {\n this.patternInputMappings = M(patternInputMappings).map(([pattern, v]: [string | RegExp, string]) => [\n pattern instanceof RegExp ? pattern.source : pattern,\n v,\n ]);\n }\n clone(): InteractionHandler {\n return new InteractionHandler(this.patternInputMappings);\n }\n with(inputs: InputMap): InteractionHandler {\n const clone = this.clone();\n clone.mapInput(inputs);\n return clone;\n }\n mapInput(inputMap: InputMap): InteractionHandler {\n Object.entries(inputMap).forEach(([pattern, response]) => {\n this.map(pattern, response);\n });\n return this;\n }\n map(pattern: RegExp | string, response: string) {\n if (pattern instanceof RegExp) {\n this.patternInputMappings.set(pattern.source, response);\n } else {\n this.patternInputMappings.set(pattern, response);\n }\n return this;\n }\n // builds a regex of the form /(alternative 1)|(alternative 2)|...|(alternative N)/\n compositeRegex(): RegExp | undefined {\n if (M(this.patternInputMappings).isEmpty()) return undefined;\n const compositePattern: string = VP(this.patternInputMappings)\n .m.keys()\n .map((pattern: string) => `(${pattern})`)\n .a.join('|').value;\n return new RegExp(compositePattern, 'g');\n }\n // returns the first pattern that matches\n // the matching pattern will be a key in ioMappings\n firstMatchingPattern(matchStr: string): string | undefined {\n // we know this will not return undefined because the pattern has already been observed, we just need to figure out which regex matched it\n return Array.from(this.patternInputMappings.keys()).find((pattern) => matchStr.match(pattern));\n }\n findReplacementForMatch(matchStr: string): string | undefined {\n const matchingPattern = this.firstMatchingPattern(matchStr);\n if (!matchingPattern) return undefined; // we know this will not return undefined because the pattern has already been observed, we just need to figure out which regex matched it\n const replacementValue = this.patternInputMappings.get(matchingPattern);\n return replacementValue;\n }\n begin() {\n this.inputStreamForRegexMatcher = new Readable();\n this.inputStreamForRegexMatcher._read = () => {};\n const compositeRegex = this.compositeRegex();\n if (compositeRegex) {\n // this.streamRegex = new StreamRegex(compositeRegex);\n // this.matches = this.streamRegex.match(this.inputStreamForRegexMatcher);\n // this.matches.on(\"data\", (matchStr) => {\n const streamRegex = new StreamRegex(compositeRegex);\n const matches: Readable = streamRegex.match(this.inputStreamForRegexMatcher);\n matches.on('data', (matchStr) => {\n // console.log(\"interaction handler match\", matchStr);\n const inputToWrite: string | undefined = this.findReplacementForMatch(matchStr);\n if (inputToWrite !== undefined) {\n this.emitInput(inputToWrite);\n }\n });\n }\n }\n handleInput(inputChunk: string) {\n // console.log(\"interaction handler handle input\", inputChunk);\n if (this.inputStreamForRegexMatcher) {\n this.inputStreamForRegexMatcher.push(inputChunk);\n }\n }\n // either use setOutputToNewReadable XOR setOutputWriter; not both\n setOutputToNewReadable(): Readable {\n const stdinReadable = new Readable();\n this.setOutputWriter((str) => stdinReadable.push(str));\n stdinReadable._read = () => {};\n return stdinReadable;\n }\n // either use setOutputToNewReadable XOR setOutputWriter; not both\n setOutputWriter(writeFn: (str: string) => void) {\n this.writeFn = writeFn;\n }\n private emitInput(input: string): void {\n if (this.writeFn) {\n this.writeFn(input);\n }\n }\n end() {\n if (this.inputStreamForRegexMatcher) {\n this.inputStreamForRegexMatcher.push(null);\n }\n }\n}\n","import Handlebars from 'handlebars';\nimport {\n type IInvocation,\n Invocation,\n type IRuntime,\n type TaskContext,\n type TaskFn,\n type TaskPartialFn,\n type LogLevel,\n task,\n} from './runtime-base';\nimport type { RunFn, TaskParams, RunFnReturnValue } from './task.model';\nimport { RemoteRuntime, RemoteInvocation } from './remote-runtime';\nimport { Host } from './host';\nimport { Path } from './flex/path';\nimport type { App, AppConfig } from './app';\nimport { Verbosity } from './verbosity';\n// LogLevel is now imported from ./runtime\nimport * as fs from 'node:fs';\nimport { ConfigFile } from './config-file';\n// CommandResult is now a value import, Command class is also imported directly\nimport { Command, CommandResult, type EnvVarObj } from './command';\nimport { InteractionHandler } from './interaction-handler';\n// import { PtyCommand } from \"./pty-command\";\nimport { RusPtyCommand } from './ruspty-command';\nimport { O } from './flex/object';\nimport { VP } from './flex/pipe';\nimport { A } from './flex/array';\nimport chalk from 'chalk';\nimport { V } from './flex/type';\nimport { withSudo } from './util/input-helpers';\n\nexport interface FileSystemOperations {\n read: (path: string) => Promise<string>;\n write: (\n path: string,\n content: string | Buffer,\n options?: {\n mode?: string | number | undefined;\n user?: string | undefined;\n group?: string | undefined;\n flag?: string | undefined;\n },\n ) => Promise<void>;\n exists: (path: string) => Promise<boolean>;\n mkdir: (\n path: string,\n options?: { recursive?: boolean | undefined; mode?: string | number | undefined },\n ) => Promise<void>;\n rm: (path: string, options?: { recursive?: boolean | undefined; force?: boolean | undefined }) => Promise<void>;\n}\n\nfunction normalizeMode(mode?: string | number): number | undefined {\n if (mode === undefined) {\n return undefined;\n }\n\n if (typeof mode === 'number') {\n return mode;\n }\n\n const normalized = mode.startsWith('0o') ? mode.slice(2) : mode;\n const parsed = Number.parseInt(normalized, 8);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nexport class LocalInvocation<TParams extends TaskParams, TReturn extends RunFnReturnValue> extends Invocation<TParams> {\n public readonly config: AppConfig;\n public readonly file: FileSystemOperations;\n constructor(\n public runtime: LocalRuntime,\n public taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n parent?: IInvocation<any>,\n ) {\n super(runtime, taskFnDefinition, parent);\n this.description = Handlebars.compile(\n taskFnDefinition.task.description || taskFnDefinition.task.name || 'anonymous_local_task',\n )(params);\n this.config = this.runtime.app.config; // Access getter, not method\n // this.host is undefined for LocalInvocation, which is fine as TaskContext.host is optional.\n\n this.file = {\n read: async (path: string): Promise<string> => fs.promises.readFile(path, 'utf-8'),\n write: async (\n path: string,\n content: string | Buffer,\n options?: {\n mode?: string | number | undefined;\n user?: string | undefined;\n group?: string | undefined;\n flag?: string | undefined;\n },\n ): Promise<void> => {\n const mode = normalizeMode(options?.mode);\n const writeOptions: fs.WriteFileOptions = {\n flag: options?.flag ?? 'w',\n };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n await fs.promises.writeFile(path, content, writeOptions);\n },\n exists: async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path);\n return true;\n } catch {\n return false;\n }\n },\n mkdir: async (\n path: string,\n options?: { recursive?: boolean | undefined; mode?: string | number | undefined },\n ): Promise<void> => {\n await fs.promises.mkdir(path, options as fs.MakeDirectoryOptions | undefined);\n },\n rm: async (\n path: string,\n options?: { recursive?: boolean | undefined; force?: boolean | undefined },\n ): Promise<void> => fs.promises.rm(path, options as fs.RmOptions | undefined),\n };\n }\n\n public log(level: LogLevel, ...message: any[]): void {\n this.runtime.app.log(level, ...message);\n }\n\n override async exec(\n command: string | string[],\n options: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n } = {},\n ): Promise<CommandResult> {\n options = options || {};\n\n const interactionHandler = this.runtime.interactionHandler.clone();\n const stdinForCommand: string | Buffer | undefined = options.stdin;\n\n if (options.input && typeof options.input === 'object') {\n // Input is for interaction handler patterns\n O(options.input).each(([pattern, value]: [string, string]) => {\n interactionHandler.map(pattern, value);\n });\n }\n\n if (options.sudo) {\n const hostPassword = await this.runtime.getPassword();\n interactionHandler.mapInput(withSudo(hostPassword));\n }\n\n // InteractionHandler is for responding to prompts, not for initial stdin.\n\n // TODO: Handle options.user if specified (e.g., via sudo -u)\n // TODO: options.pty is implicitly true due to PtyCommand. If false, would need a non-PTY command runner.\n\n const cwd = options.cwd ?? process.cwd();\n let finalEnv: EnvVarObj = {};\n\n // Always start with current process environment\n Object.keys(process.env).forEach((key) => {\n const value = process.env[key];\n if (value !== undefined) {\n finalEnv[key] = value;\n }\n });\n\n // Merge in provided environment variables\n if (options.env) {\n finalEnv = { ...finalEnv, ...options.env };\n }\n\n // Build the command using RusPtyCommand.build directly\n const commandInstance = RusPtyCommand.build(command, {\n sudo: options.sudo,\n env: finalEnv,\n cwd,\n });\n\n this.debug(\n `Executing command: ${commandInstance.toString()}${options.stdin ? ' with stdin' : ''}${options.input ? ' with interaction patterns' : ''}`,\n );\n await commandInstance.run(interactionHandler, stdinForCommand);\n\n const cmdResult = commandInstance.result;\n if (!cmdResult) {\n this.error('Command execution resulted in undefined result.');\n // Return a new CommandResult instance for the error case\n return new CommandResult('', 'Command execution resulted in undefined result.', -1, undefined);\n }\n this.debug(`Command result: ${V.inspect(cmdResult)}`);\n\n return cmdResult;\n }\n\n override async ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> {\n const targetHosts: Host[] = this.runtime.selectedInventory(tags);\n\n if (targetHosts.length === 0) {\n this.runtime.app.warn(`No hosts found for tags: ${tags.join(', ')} in ssh call from ${this.id}`);\n return {};\n }\n\n const entryPromises = VP(targetHosts).map(async (host: Host): Promise<[string, TRemoteReturn | Error]> => {\n const result = await this.runRemoteTaskOnHost<TRemoteParams, TRemoteReturn>(host, remoteTaskFn);\n return [host.alias, result];\n }).value;\n\n const entries = await Promise.all(entryPromises);\n const record: Record<string, TRemoteReturn | Error> = Object.fromEntries(entries);\n return record;\n }\n\n async runRemoteTaskOnHost<TRemoteParams extends TaskParams, TRemoteReturn extends RunFnReturnValue>(\n host: Host,\n remoteTaskFn: RunFn<TRemoteParams, TRemoteReturn>,\n ): Promise<TRemoteReturn | Error> {\n this.debug(`Run function on: ${chalk.yellow(V.inspect(host.toObject()))}`);\n\n const interactionHandler = new InteractionHandler(this.runtime.app.getSecretsForHost(host.hostname));\n\n const remoteRuntime = new RemoteRuntime(\n this.runtime.app,\n host,\n interactionHandler,\n );\n\n try {\n const connected = await remoteRuntime.connect();\n if (!connected) {\n throw new Error(`Unable to connect to ${host.uri}`);\n }\n\n const adHocRemoteInvocationTaskFn = task<TRemoteParams, TRemoteReturn>(\n async function (context: TaskContext<TRemoteParams>): Promise<TRemoteReturn> {\n return remoteTaskFn(context);\n },\n { description: `Ad-hoc task on ${host.uri} via ssh from ${this.taskFnDefinition.task.name} (${this.id})` },\n );\n\n const rootRemoteInvocation = new RemoteInvocation(\n remoteRuntime,\n adHocRemoteInvocationTaskFn, // This TaskFn is for the container of the ad-hoc operation on this host\n {} as TRemoteParams,\n this, // Parent is the current LocalInvocation\n host,\n );\n await this.appendChildInvocation(rootRemoteInvocation);\n\n const rootRemoteContext = this.runtime.app.taskContextForRunFn(\n rootRemoteInvocation,\n {} as TRemoteParams,\n host,\n ) as TaskContext<TRemoteParams>;\n const resultPromise = remoteTaskFn(rootRemoteContext);\n rootRemoteInvocation.setFutureResult(resultPromise);\n rootRemoteInvocation.setDescription(`SSH to ${host.alias} -> ${host.uri}`);\n\n return await resultPromise;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.runtime.app.error(\n `Error during SSH operation to ${host.uri}: ${errorMessage}`,\n error instanceof Error ? error.stack : undefined,\n );\n return error instanceof Error ? error : new Error(errorMessage);\n } finally {\n await remoteRuntime.disconnect();\n }\n }\n\n public exit(exitCode: number, message?: string): void {\n if (message) {\n this.runtime.app.log(exitCode === 0 ? Verbosity.INFO : Verbosity.ERROR, message);\n }\n // In a library context, actually calling process.exit() is often undesirable.\n // Throwing a specific error might be better for the app to handle.\n // For now, keeping it simple, but this could be a point of future refinement.\n this.runtime.app.warn(`Task ${this.id} requested exit with code ${exitCode}. Forcing process exit.`);\n process.exit(exitCode);\n }\n\n override async run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> {\n return taskPartialFn(this);\n }\n\n override async invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFnDefinition: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn> {\n const childInvocation = new LocalInvocation(this.runtime, childTaskFnDefinition, params, this);\n await this.appendChildInvocation(childInvocation);\n\n const loggedChildResultPromise = childInvocation.result\n .then((value) => {\n if (value instanceof Error) return value;\n if (value === undefined || value === null) return undefined;\n return value;\n })\n .catch((error) => error);\n this.runtime.app.taskTree.add(\n childInvocation.id,\n this.id,\n childTaskFnDefinition.task.name || 'anonymous_child_task',\n loggedChildResultPromise,\n );\n\n const taskContext = this.runtime.app.taskContextForRunFn(\n childInvocation,\n params,\n undefined /* host is undefined for local */,\n ) as TaskContext<TTaskParams>;\n\n try {\n const result = await childTaskFnDefinition.task.runFn.call(childInvocation, taskContext);\n childInvocation.resolveResult(result);\n return result as TTaskReturn;\n } catch (error) {\n childInvocation.rejectResult(error as Error);\n throw error;\n }\n }\n}\n\nexport class LocalRuntime implements IRuntime {\n public config?: { cwd?: string; configFile?: ConfigFile };\n public host: Host; // Represents the local machine\n private memoizedPassword?: string;\n\n constructor(\n public app: App,\n public localBundlePath: Path,\n public interactionHandler: InteractionHandler = new InteractionHandler(),\n ) {\n const appConfigInstance = this.app.config;\n if (appConfigInstance instanceof ConfigFile) {\n this.host = new Host(appConfigInstance, { hostname: 'localhost', alias: 'localhost' });\n } else {\n const configType = appConfigInstance?.constructor?.name || typeof appConfigInstance;\n this.app.error(\n `CRITICAL ERROR: LocalRuntime could not initialize its 'localhost' Host object. The application's configuration (type: ${configType}) is not a file-based configuration (expected ConfigFile).`,\n );\n throw new Error(\n `LocalRuntime init failed: Expected app.config to be an instance of ConfigFile for 'localhost' Host, but got ${configType}.`,\n );\n }\n this.config = {\n cwd: process.cwd(),\n configFile: appConfigInstance instanceof ConfigFile ? appConfigInstance : undefined,\n };\n }\n\n get tmpDirRootPath(): Path {\n return this.app.hostctlTmpDir();\n }\n\n async getPassword(): Promise<string | undefined> {\n if (this.memoizedPassword) {\n return this.memoizedPassword;\n }\n this.memoizedPassword = await this.app.promptPassword('Enter local sudo password:');\n return this.memoizedPassword;\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n const secret = this.app.config.getSecret(name);\n if (!secret) {\n this.app.warn(`Secret ${name} not found in config.`);\n return undefined;\n }\n return secret.plaintext();\n }\n\n getTmpDir(): Path {\n return this.app.createNamedTmpDir();\n }\n\n getTmpFile(prefix?: string | undefined, postfix?: string | undefined, dir?: Path | undefined): Path {\n const tmpDir = dir || this.getTmpDir();\n // Use crypto.randomUUID() for a unique filename component\n const randomName = prefix ? `${prefix}-${crypto.randomUUID()}` : crypto.randomUUID();\n const finalName = postfix ? `${randomName}-${postfix}` : randomName;\n return tmpDir.join(finalName);\n }\n\n inventory(tags: string[]): Host[] {\n return this.app.queryInventory(new Set(tags));\n }\n\n selectedInventory(tags?: string[]): Host[] {\n const tagSet: Set<string> = tags ? new Set(tags) : new Set();\n return this.app.querySelectedInventory(tagSet);\n }\n\n async invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n description?: string,\n ): Promise<LocalInvocation<TParams, TReturn>> {\n const rootInvocation = new LocalInvocation<TParams, TReturn>(\n this,\n taskFnDefinition,\n params,\n undefined /* no parent */,\n );\n if (description) {\n rootInvocation.description = description;\n }\n const loggedRootResultPromise = rootInvocation.result\n .then((value) => {\n if (value instanceof Error) return value;\n if (value === undefined || value === null) return undefined;\n return value;\n })\n .catch((error) => error);\n this.app.taskTree.add(\n rootInvocation.id,\n null,\n taskFnDefinition.task.name || 'anonymous_root_task',\n loggedRootResultPromise,\n );\n\n // Corrected to call taskContextForRunFn on this.app instead of this.app.taskTree\n const taskContext = this.app.taskContextForRunFn(\n rootInvocation,\n params,\n undefined /* host is undefined */,\n ) as TaskContext<TParams>;\n\n taskFnDefinition.task.runFn\n .call(rootInvocation, taskContext)\n .then(rootInvocation.resolveResult)\n .catch(rootInvocation.rejectResult);\n\n return rootInvocation;\n }\n}\n","import StackTracey from 'stacktracey';\n\n// StackTracey {\n// items: [\n// {\n// beforeParse: 'at REPL36:1:1',\n// callee: '',\n// index: false,\n// native: false,\n// file: 'REPL36',\n// line: 1,\n// column: 1,\n// calleeShort: '',\n// fileRelative: 'REPL36',\n// fileShort: 'REPL36',\n// fileName: 'REPL36',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at ContextifyScript.runInThisContext (node:vm:136:12)',\n// callee: 'ContextifyScript.runInThisContext',\n// index: false,\n// native: false,\n// file: 'node:vm',\n// line: 136,\n// column: 12,\n// calleeShort: 'runInThisContext',\n// fileRelative: 'node:vm',\n// fileShort: 'node:vm',\n// fileName: 'node:vm',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.defaultEval (node:repl:598:22)',\n// callee: 'REPLServer.defaultEval',\n// index: false,\n// native: false,\n// file: 'node:repl',\n// line: 598,\n// column: 22,\n// calleeShort: 'defaultEval',\n// fileRelative: 'node:repl',\n// fileShort: 'node:repl',\n// fileName: 'node:repl',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at bound (node:domain:432:15)',\n// callee: 'bound',\n// index: false,\n// native: false,\n// file: 'node:domain',\n// line: 432,\n// column: 15,\n// calleeShort: 'bound',\n// fileRelative: 'node:domain',\n// fileShort: 'node:domain',\n// fileName: 'node:domain',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.runBound (node:domain:443:12)',\n// callee: 'REPLServer.runBound',\n// index: false,\n// native: false,\n// file: 'node:domain',\n// line: 443,\n// column: 12,\n// calleeShort: 'runBound',\n// fileRelative: 'node:domain',\n// fileShort: 'node:domain',\n// fileName: 'node:domain',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.preEval [as eval] (/home/david/.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs:1:366)',\n// callee: 'REPLServer.preEval [as eval]',\n// index: false,\n// native: false,\n// file: '/home/david/.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// line: 1,\n// column: 366,\n// calleeShort: 'preEval [as eval]',\n// fileRelative: '../../../../.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// fileShort: '../../../../.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// fileName: 'patch-repl.cjs',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at process.processTicksAndRejections (node:internal/process/task_queues:105:5)',\n// callee: 'process.processTicksAndRejections',\n// index: false,\n// native: false,\n// file: 'node:internal/process/task_queues',\n// line: 105,\n// column: 5,\n// calleeShort: 'processTicksAndRejections',\n// fileRelative: 'node:internal/process/task_queues',\n// fileShort: 'node:internal/process/task_queues',\n// fileName: 'task_queues',\n// thirdParty: false,\n// externalDomain: undefined\n// }\n// ]\n// }\nexport function callstack() {\n return new StackTracey();\n}\n","import { callstack } from './stacktrace';\nimport { Path } from './flex/path';\nimport { Host } from './host'; // For TaskContext and IInvocation\nimport { Mutex } from 'async-mutex'; // For Invocation\nimport { type CommandResult, type EnvVarObj } from './command'; // For IInvocation & TaskContext\nimport { StringBuilder } from 'typescript-string-operations'; // For Invocation\nimport type { App, AppConfig } from './app'; // For IRuntime and TaskContext\nimport { Verbosity } from './verbosity';\nimport type { ConfigFile } from './config-file'; // For IRuntime\nimport type { InteractionHandler } from './interaction-handler'; // For IRuntime\nimport chalk from 'chalk'; // For Invocation.exit logging\nimport {\n Task, // Value import\n type ObjectType, // Type import for use within this module\n type TaskParams, // Type import for use within this module\n type RunFnReturnValue, // Type import for use within this module\n type RunFn, // Type import for use within this module\n} from './task.model';\n\nexport type LogLevel = number; // Numerical log levels, compatible with Verbosity in app.ts\n// ObjectType, TaskParams, RunFnReturnValue, RunFn are now imported from task.model.ts\n\nexport interface FileSystemOperations {\n read: (path: string) => Promise<string>;\n write: (\n path: string,\n content: string | Buffer,\n options?: { mode?: string | number; user?: string; group?: string; flag?: string },\n ) => Promise<void>;\n exists: (path: string) => Promise<boolean>;\n mkdir: (path: string, options?: { recursive?: boolean; mode?: string | number }) => Promise<void>;\n rm: (path: string, options?: { recursive?: boolean; force?: boolean }) => Promise<void>;\n // Consider adding stat, ls, etc. later\n}\n\nexport interface TaskContext<TParams extends TaskParams = TaskParams> {\n params: TParams;\n readonly id: string;\n readonly host?: Host;\n readonly config: AppConfig; // Access to resolved application configuration\n log: (level: LogLevel, ...message: any[]) => void; // Unified logging with level\n info: (...message: any[]) => void;\n debug: (...message: any[]) => void;\n warn: (...message: any[]) => void;\n error: (...message: any[]) => void;\n\n // exec is for running shell commands on the host\n exec: (\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ) => Promise<CommandResult>; // Renamed from sh\n\n // ssh will ssh into a set of hosts and evaluate the given function for each host\n ssh: <TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ) => Promise<Record<string, TRemoteReturn | Error>>;\n\n // run will run a given task script\n run: <TRunReturn extends RunFnReturnValue>(taskPartialFn: TaskPartialFn<TRunReturn>) => Promise<TRunReturn>;\n\n // getPassword will prompt the user for a password\n getPassword: () => Promise<string | undefined>;\n\n // getSecret will retrieve a secret from the application configuration\n getSecret: (name: string) => Promise<string | undefined>;\n\n // exit will exit the application\n exit: (exitCode: number, message?: string) => void;\n\n // inventory will return a list of hosts that match the given tags\n inventory: (tags: string[]) => Host[];\n\n // selectedInventory will return a list of hosts that match the given tags and are selected\n selectedInventory: (tags?: string[]) => Host[];\n\n // file will provide file system operations contextualized to the host\n file: FileSystemOperations;\n}\n\n// RunFn and Task class are now imported from task.model.ts\n\nexport type TaskPartialFn<TReturn extends RunFnReturnValue = RunFnReturnValue> = (\n parentInvocation: IInvocation,\n) => Promise<TReturn>;\n\n// Task class is imported from task.model.ts\n\nexport interface TaskFn<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n (params?: TParams): TaskPartialFn<TReturn>;\n task: Task<TParams, TReturn>;\n}\n\nexport function task<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n runFn: RunFn<TParams, TReturn>,\n options?: { description?: string; name?: string },\n): TaskFn<TParams, TReturn> {\n const moduleThatTaskIsDefinedIn = Path.new(callstack().items[2].file).absolute().toString();\n const taskName = options?.name || 'anonymous_task';\n const taskInstance = new Task<TParams, TReturn>(runFn, moduleThatTaskIsDefinedIn, options?.description, taskName);\n\n const taskFnObject: TaskFn<TParams, TReturn> = function (params?: TParams) {\n return function (parentInvocation: IInvocation): Promise<TReturn> {\n return parentInvocation.invokeChildTask(taskFnObject, params ?? ({} as TParams)) as Promise<TReturn>;\n };\n } as TaskFn<TParams, TReturn>;\n Object.assign(taskFnObject, { task: taskInstance });\n\n return taskFnObject;\n}\n\nexport interface IInvocation<TParams extends TaskParams = any> {\n id: string;\n runtime: IRuntime;\n host?: Host;\n readonly config: AppConfig;\n log(level: LogLevel, ...message: any[]): void;\n info(...message: any[]): void;\n debug(...message: any[]): void;\n warn(...message: any[]): void;\n error(...message: any[]): void;\n exec(\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult>;\n readonly file: FileSystemOperations;\n ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>>;\n run<TRunReturn extends RunFnReturnValue>(taskPartialFn: TaskPartialFn<TRunReturn>): Promise<TRunReturn>;\n invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFn: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn>;\n getPassword(): Promise<string | undefined>;\n getSecret(name: string): Promise<string | undefined>;\n exit(exitCode: number, message?: string): void;\n inventory(tags: string[]): Host[];\n selectedInventory(tags?: string[]): Host[];\n setDescription(description: string): void;\n setFutureResult(resultPromise: Promise<RunFnReturnValue>): void;\n appendChildInvocation(childInvocation: IInvocation<any>): Promise<void>;\n readonly stderr: string;\n readonly stdout: string;\n resultError(): Promise<Error | undefined>;\n getDescription(): string | undefined;\n getChildren(): ReadonlyArray<IInvocation<any>>;\n getResultPromise(): Promise<RunFnReturnValue>;\n}\n\nexport abstract class Invocation<TParams extends TaskParams = any> implements IInvocation<TParams> {\n public id: string;\n public children: Array<IInvocation<any>>; // Children can have any params\n private childrenMutex: Mutex;\n public description?: string;\n public stderrSB: StringBuilder;\n public stdoutSB: StringBuilder;\n public host?: Host;\n public result: Promise<RunFnReturnValue>;\n public resolveResult: (value: RunFnReturnValue | PromiseLike<RunFnReturnValue>) => void;\n public rejectResult: (reason?: any) => void;\n\n constructor(\n public runtime: IRuntime,\n public taskFnDefinition: TaskFn<TParams, any>,\n public parent?: IInvocation<any>,\n ) {\n this.id = crypto.randomUUID();\n this.children = [];\n this.childrenMutex = new Mutex();\n const { promise, resolve, reject } = Promise.withResolvers<RunFnReturnValue>();\n this.result = promise;\n this.resolveResult = resolve;\n this.rejectResult = reject;\n this.stdoutSB = new StringBuilder();\n this.stderrSB = new StringBuilder();\n }\n\n // Constructor and fields are above\n\n // Concrete method implementations\n getPassword(): Promise<string | undefined> {\n return this.runtime.getPassword();\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n // Ensure config is available, typically via this.runtime.app.config\n // This might need adjustment if 'this.config' is the direct source.\n const secret = this.runtime.app.config.getSecret(name);\n if (!secret) {\n return undefined;\n }\n return secret.plaintext();\n }\n\n get stderr(): string {\n return this.stderrSB.toString();\n }\n\n get stdout(): string {\n return this.stdoutSB.toString();\n }\n\n info(...message: any[]) {\n this.log(Verbosity.INFO, ...message);\n }\n\n debug(...message: any[]) {\n this.log(Verbosity.DEBUG, ...message);\n }\n\n warn(...message: any[]) {\n this.log(Verbosity.WARN, ...message);\n }\n\n error(...message: any[]) {\n this.log(Verbosity.ERROR, ...message);\n }\n\n async resultError(): Promise<Error | undefined> {\n try {\n await this.result;\n return undefined;\n } catch (e) {\n return e as Error;\n }\n }\n\n setDescription(description: string) {\n this.description = description;\n }\n\n setFutureResult(resultPromise: Promise<RunFnReturnValue>) {\n resultPromise.then(this.resolveResult, this.rejectResult);\n }\n\n public getDescription(): string | undefined {\n return this.description;\n }\n public getChildren(): ReadonlyArray<IInvocation<any>> {\n return this.children;\n }\n public getResultPromise(): Promise<RunFnReturnValue> {\n return this.result;\n }\n\n public exit(exitCode: number, message?: string): void {\n if (message) {\n this.runtime.app.warn(\n chalk.yellow(`Task ${this.description || this.id} requested exit with code ${exitCode}: ${message}`),\n );\n }\n process.exit(exitCode);\n }\n\n inventory(tags: string[]): Host[] {\n return this.runtime.inventory(tags);\n }\n\n selectedInventory(tags?: string[]): Host[] {\n return this.runtime.selectedInventory(tags);\n }\n\n async appendChildInvocation(childInvocation: IInvocation<any>) {\n // Ensure IInvocation<any>\n await this.childrenMutex.runExclusive(async () => {\n this.children.push(childInvocation);\n });\n }\n\n // Abstract method declarations (must be implemented by subclasses)\n public abstract readonly config: AppConfig;\n public abstract log(level: LogLevel, ...message: any[]): void;\n public abstract exec(\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult>;\n public abstract readonly file: FileSystemOperations;\n public abstract ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>>;\n public abstract run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn>;\n public abstract invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFn: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn>;\n // Note: 'exit' has a concrete implementation above, so it's not abstract here.\n // Note: 'inventory' has a concrete implementation above, so it's not abstract here.\n}\n\nexport interface IRuntime {\n app: App;\n config?: { cwd?: string; configFile?: ConfigFile };\n interactionHandler: InteractionHandler;\n tmpDirRootPath: Path;\n\n getPassword(): Promise<string | undefined>;\n getSecret(name: string): Promise<string | undefined>;\n getTmpDir(): Path;\n getTmpFile(prefix?: string, postfix?: string, dir?: Path): Path;\n inventory(tags: string[]): Host[];\n selectedInventory(tags?: string[]): Host[];\n invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n description?: string,\n ): Promise<IInvocation<TParams>>;\n}\n","import type { Signal } from 'human-signals';\nexport type { Signal };\nimport { A } from './flex/array';\nimport { V } from './flex/type';\nimport { parse, quote } from 'shell-quote';\nimport Shellwords from 'shellwords-ts';\nimport { O } from './flex/object';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nexport type EnvVarObj = Record<string, string>;\n\nexport function processEnvVars(): EnvVarObj {\n return O(process.env).map(([key, value]: [string, string | undefined]) => [key, String(value)]);\n}\n\n\n\n\nexport class CommandResult {\n constructor(\n public stdout: string,\n public stderr: string,\n public exitCode: number,\n public signal?: Signal,\n ) {}\n\n toJSON() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n signal: this.signal,\n success: this.success,\n failure: this.failure,\n };\n }\n get out() {\n return this.stdout;\n }\n get err() {\n return this.stderr;\n }\n get exit() {\n return this.exitCode;\n }\n get sig() {\n return this.signal;\n }\n get success() {\n return this.exitCode === 0;\n }\n get failure() {\n return !this.success;\n }\n}\n\nexport interface CommandOptions {\n cmd: string;\n args?: string[];\n cwd?: string;\n env?: EnvVarObj;\n result?: CommandResult;\n sudo?: boolean;\n}\n\nexport class Command {\n static parse(\n commandString: string,\n env?: EnvVarObj,\n ): {\n cmd: string;\n args: string[];\n env?: EnvVarObj;\n } {\n if (!commandString || commandString.trim() === '') {\n throw new Error('Command string cannot be empty.');\n }\n // const quotedCmd = quote([commandString]);\n // console.log(`parse: ${commandString} -> ${quotedCmd}`);\n // const parts = parse(quotedCmd);\n // console.log(`parts: ${parts}`);\n\n const parts = Shellwords.split(commandString);\n // console.log(`parts: ${JSON.stringify(parts)}`);\n\n const cmd_unsafe = A.head(parts);\n if (cmd_unsafe === undefined) {\n // This case should be prevented by the check for empty commandString earlier\n throw new Error(`Failed to parse command from string: \"${commandString}\". Resulted in no command part.`);\n }\n const cmd: string = cmd_unsafe;\n // console.log(cmd);\n const parsedArgs = A(parts).skipFirst(1);\n // console.log(parsedArgs);\n\n const args: string[] = A(parsedArgs).compact();\n // console.log(args);\n\n return {\n cmd,\n args,\n env,\n };\n }\n\n /**\n * Builds a Command object from a command string or array with optional sudo and environment variables.\n * This is the main factory method for creating commands that will be executed.\n */\n static build(\n command: string | string[],\n options: {\n sudo?: boolean;\n env?: EnvVarObj;\n cwd?: string;\n } = {},\n ): Command {\n const { sudo = false, env, cwd } = options;\n\n let cmd: string;\n let args: string[];\n\n if (Array.isArray(command)) {\n if (command.length === 0) {\n throw new Error('Command array cannot be empty.');\n }\n cmd = command[0];\n args = command.slice(1).filter(Boolean);\n } else {\n const parsed = Command.parse(command, env);\n cmd = parsed.cmd;\n args = parsed.args;\n }\n\n // Do NOT apply sudo prefixing here; just set the sudo property\n return new Command({ cmd, args, cwd, env, sudo });\n }\n\n\n\n public cmd;\n public args?;\n public cwd?: string;\n public env?: Record<string, string>;\n public result?: CommandResult;\n public sudo?: boolean;\n\n constructor(opts: CommandOptions) {\n const { cmd, args, cwd, env, result, sudo } = opts;\n this.cmd = cmd;\n this.args = args;\n this.cwd = cwd;\n this.env = env;\n this.result = result;\n this.sudo = sudo;\n }\n\n isRunning(): boolean {\n return !!this.result;\n }\n\n /**\n * Returns the command as a string suitable for shell execution.\n * Uses POSIX standard env command for environment variables.\n */\n toString(): string {\n // Build the base command\n const baseCommand = `${this.cmd} ${(this.args || []).join(' ')}`.trim();\n\n // Apply environment variables using POSIX env command\n if (this.env && Object.keys(this.env).length > 0) {\n const envArgs = Object.entries(this.env)\n .map(([key, value]) => `${key}=${value}`)\n .join(' ');\n\n // Apply sudo prefixing if requested (sudo comes before env)\n if (this.sudo) {\n return `sudo env ${envArgs} ${baseCommand}`;\n } else {\n return `env ${envArgs} ${baseCommand}`;\n }\n } else {\n // No environment variables, just apply sudo if requested\n if (this.sudo) {\n return `sudo ${baseCommand}`;\n } else {\n return baseCommand;\n }\n }\n }\n\n /**\n * Returns the command and args as separate components.\n * If env is set, returns env as the command and env assignments as args.\n * If sudo is set, returns sudo as the command and the rest as args.\n */\n toArray(): { cmd: string; args: string[] } {\n const hasEnv = this.env && Object.keys(this.env).length > 0;\n const hasSudo = !!this.sudo;\n const baseCmd = this.cmd;\n const baseArgs = this.args || [];\n\n if (hasSudo && hasEnv) {\n // sudo env VAR=val ... cmd ...args\n const envArgs = Object.entries(this.env!).map(([k, v]) => `${k}=${v}`);\n return {\n cmd: 'sudo',\n args: ['env', ...envArgs, baseCmd, ...baseArgs],\n };\n } else if (hasSudo) {\n // sudo cmd ...args\n return {\n cmd: 'sudo',\n args: [baseCmd, ...baseArgs],\n };\n } else if (hasEnv) {\n // env VAR=val ... cmd ...args\n const envArgs = Object.entries(this.env!).map(([k, v]) => `${k}=${v}`);\n return {\n cmd: 'env',\n args: [...envArgs, baseCmd, ...baseArgs],\n };\n } else {\n // plain\n return {\n cmd: baseCmd,\n args: baseArgs,\n };\n }\n }\n\n toJSON() {\n return {\n cmd: this.cmd,\n args: this.args,\n cwd: this.cwd,\n env: this.env,\n result: this.result?.toJSON(),\n };\n }\n}\n","export const Verbosity = {\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n} as const;\n\nexport type VerbosityLevel = (typeof Verbosity)[keyof typeof Verbosity];\n","// src/task.model.ts\nimport type { TaskContext } from './runtime-base'; // Type-only import for RunFn definition\n\n/**\n * Generic object type for parameters and return values.\n */\nexport type ObjectType = { [key: string]: any };\n\n/**\n * Base type for task-specific parameters.\n */\nexport type TaskParams = ObjectType;\n\n/**\n * Represents the possible return values of a task's run function.\n */\nexport type RunFnReturnValue = ObjectType | void | undefined | null | Error;\n\n/**\n * Defines the signature of a task's main execution function.\n * It receives a TaskContext and returns a Promise of a RunFnReturnValue.\n */\nexport interface RunFn<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n (context: TaskContext<TParams>): Promise<TReturn>;\n}\n\n/**\n * Represents a task definition, including its run function and metadata.\n * This class is instantiated by the `task` factory function.\n */\nexport class Task<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n constructor(\n public runFn: RunFn<TParams, TReturn>,\n public taskModuleAbsolutePath?: string,\n public description?: string,\n public name?: string,\n ) {}\n}\n","import Handlebars from 'handlebars';\nimport {\n type IInvocation,\n Invocation,\n type IRuntime,\n type TaskFn,\n type TaskContext,\n type TaskPartialFn,\n type FileSystemOperations,\n type LogLevel,\n} from './runtime-base';\nimport type { TaskParams, RunFnReturnValue } from './task.model';\nimport * as path from 'node:path';\nimport { Host } from './host';\nimport type { Config as NodeSSHConfig } from 'node-ssh'; // For SSH connection options\nimport { Path } from './flex/path';\nimport type { App, AppConfig } from './app';\nimport { Verbosity } from './verbosity';\n// LogLevel is now imported from ./runtime\nimport { CommandResult, type EnvVarObj, Command, type Signal } from './command';\nimport { InteractionHandler } from './interaction-handler';\nimport { SSHSession } from './ssh-session';\nimport { isError } from './error';\nimport chalk from 'chalk';\nimport * as util from 'node:util';\nimport { StringBuilder } from 'typescript-string-operations';\nimport { ConfigFile } from './config-file';\nimport { O } from './flex/object';\nimport { match, P } from 'ts-pattern';\nimport { V } from './flex/type';\nimport { withSudo, type InputMap } from './util/input-helpers';\n\nfunction normalizeWriteMode(mode?: string | number): number | undefined {\n if (mode === undefined) {\n return undefined;\n }\n\n if (typeof mode === 'number') {\n return mode;\n }\n\n const normalized = mode.startsWith('0o') ? mode.slice(2) : mode;\n const parsed = Number.parseInt(normalized, 8);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nexport class RemoteInvocation<\n TParams extends TaskParams = any,\n TReturn extends RunFnReturnValue = any,\n> extends Invocation<TParams> {\n public readonly config: AppConfig;\n public readonly file: FileSystemOperations;\n // sshSession is removed from RemoteInvocation, it will be managed by RemoteRuntime\n\n constructor(\n runtime: IRuntime,\n public taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n public parent: IInvocation<any>,\n public hostInstance?: Host,\n ) {\n super(runtime, taskFnDefinition, parent);\n this.description = Handlebars.compile(\n taskFnDefinition.task.description || taskFnDefinition.task.name || 'anonymous_remote_task',\n )(params);\n this.host = hostInstance || parent.host; // Inherit host from parent if not provided\n if (!this.host) {\n throw new Error('RemoteInvocation must have a host.');\n }\n this.config = this.runtime.app.config;\n\n this.file = {\n read: async (filePath: string): Promise<string> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n return new Promise<string>((resolve, reject) => {\n sftp.readFile(remotePath, (err: Error | null, data: Buffer | undefined) => {\n if (err) {\n return reject(err);\n }\n if (!data) {\n // Should not happen if err is null, but good practice\n return reject(new Error(`SFTP readFile returned no data for ${remotePath}`));\n }\n resolve(data.toString('utf-8'));\n });\n });\n },\n write: async (\n filePath: string,\n content: string | Buffer,\n options?: { mode?: string | number; flag?: string },\n ): Promise<void> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n\n const mode = normalizeWriteMode(options?.mode);\n\n const streamOptions: Record<string, unknown> = {\n flags: options?.flag ?? 'w',\n };\n\n if (mode !== undefined) {\n streamOptions.mode = mode;\n }\n\n await new Promise<void>((resolve, reject) => {\n const stream = sftp.createWriteStream(remotePath, streamOptions);\n stream.on('error', reject);\n stream.on('finish', resolve);\n stream.on('close', resolve);\n stream.end(content);\n });\n },\n exists: async (filePath: string): Promise<boolean> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n return new Promise((resolve, reject) => {\n sftp.stat(remotePath, (err: Error | null, stats: any) => {\n // stats type might need refinement from ssh2 types\n if (err) {\n // Common SFTP error codes for 'No such file' are 2 (SSH_FX_NO_SUCH_FILE from ssh2-streams constants)\n // node-ssh might wrap this, check error object structure\n const sftpError = err as any;\n if (\n sftpError.code === 2 ||\n sftpError.code === 'ENOENT' ||\n (typeof err.message === 'string' &&\n (err.message.includes('No such file') || err.message.includes('No such entity')))\n ) {\n resolve(false);\n } else {\n reject(err);\n }\n } else {\n resolve(true);\n }\n });\n });\n },\n mkdir: async (dirPath: string, options?: { recursive?: boolean; mode?: string | number }): Promise<void> => {\n const remoteDir = this.resolveRemotePath(dirPath);\n let command = `mkdir ${options?.recursive ? '-p ' : ''}${this.quoteRemoteArg(remoteDir)}`;\n await this.exec(command); // Use this.exec for consistency\n if (options?.mode) {\n await this.exec(`chmod ${this.quoteRemoteArg(String(options.mode))} ${this.quoteRemoteArg(remoteDir)}`);\n }\n },\n rm: async (itemPath: string, options?: { recursive?: boolean; force?: boolean }): Promise<void> => {\n const remoteItem = this.resolveRemotePath(itemPath);\n const command = `rm ${options?.recursive ? '-r ' : ''}${options?.force ? '-f ' : ''}${this.quoteRemoteArg(remoteItem)}`;\n await this.exec(command); // Use this.exec for consistency\n },\n };\n }\n\n private async ensureSftp(): Promise<any> {\n // Return type should be the actual SFTP client type from node-ssh\n if (!(this.runtime instanceof RemoteRuntime)) {\n throw new Error('Runtime is not a RemoteRuntime instance, cannot ensure SFTP.');\n }\n // Delegate to RemoteRuntime to get the SFTP client\n return this.runtime.getSftpClient();\n }\n\n private resolveRemotePath(p: string): string {\n // Assuming paths are either absolute or relative to the user's home directory on the remote host\n // node-ssh's SFTP methods generally treat non-absolute paths as relative to home.\n // For exec, CWD handling is separate.\n return p; // Keep it simple for now, let node-ssh handle path resolution relative to home for SFTP.\n }\n\n private quoteRemoteArg(arg: string): string {\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n }\n\n public log(level: LogLevel, ...message: any[]): void {\n const hostUri = this.host ? `${this.host.user || ''}@${this.host.hostname}` : 'unknown-host'; // Changed host to hostname\n this.runtime.app.log(level, `[${hostUri}|${this.id}|${this.description || 'task'}]`, ...message);\n }\n\n uri(): string {\n if (!this.host) throw new Error('Host is not defined for this remote invocation.');\n return `${this.host.user || this.runtime.app.defaultSshUser()}@${this.host.hostname}`; // Changed host to hostname\n }\n\n override async exec(\n command: string | string[],\n options?: {\n input?: InputMap;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: Record<string, string>;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult> {\n if (!this.host) throw new Error('Host is not defined for exec command in RemoteInvocation.');\n\n if (!(this.runtime instanceof RemoteRuntime)) {\n throw new Error('Runtime is not a RemoteRuntime instance, cannot execute remote command.');\n }\n\n const stdinForRemoteCommand: string | Buffer | undefined = options?.stdin;\n // Start with a clone of the runtime's default handler.\n // This handler can be augmented with exec-specific patterns.\n const execSpecificInteractionHandler = this.runtime.interactionHandler.clone();\n\n if (options?.input) {\n execSpecificInteractionHandler.mapInput(options.input);\n }\n\n if (options?.sudo) {\n const hostPassword = await this.runtime.getPassword();\n execSpecificInteractionHandler.mapInput(withSudo(hostPassword));\n }\n\n // TODO: Add support to run command as another user\n // let commandToRun = Array.isArray(command) ? command.join(\" \") : command;\n // if (options?.user) {\n // commandToRun = `sudo -u ${this.quoteRemoteArg(options.user)} -- /bin/sh -c ${this.quoteRemoteArg(commandToRun)}`;\n // }\n\n // Build the command using the new Command class\n const commandObj = Command.build(command, {\n sudo: options?.sudo,\n env: options?.env,\n cwd: options?.cwd,\n });\n\n this.debug(`Executing remote command on ${this.host.hostname}: ${commandObj.toString()}`); // Changed host to hostname\n\n const cmdOrErr = await this.runtime.executeCommand(commandObj, {\n stdin: stdinForRemoteCommand,\n pty: options?.pty,\n interactionHandler: execSpecificInteractionHandler, // Pass the potentially augmented handler\n });\n\n return match(cmdOrErr)\n .with(P.instanceOf(Error), (err: Error) => {\n throw err;\n })\n .with(P.instanceOf(Command), (command: Command) => {\n return command.result!;\n })\n .exhaustive();\n }\n\n public exit(exitCode: number, message?: string): void {\n const hostUri = this.host ? `${this.host.user || ''}@${this.host.hostname}` : 'unknown-host'; // Changed host to hostname\n const msg = `Remote task ${this.id} on ${hostUri} requested exit with code ${exitCode}${message ? ': ' + message : ''}`;\n this.log(Verbosity.WARN as LogLevel, msg);\n // Throwing an error is more appropriate than trying to force a remote process.exit()\n throw new Error(msg);\n }\n\n override async run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> {\n return taskPartialFn(this);\n }\n\n override async invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFnDefinition: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn> {\n if (!this.host) throw new Error('Host is not defined for invokeChildTask in RemoteInvocation.');\n\n const childInvocation = new RemoteInvocation(this.runtime, childTaskFnDefinition, params, this, this.host);\n await this.appendChildInvocation(childInvocation);\n\n this.runtime.app.taskTree.add(\n childInvocation.id,\n this.id,\n childTaskFnDefinition.task.name || 'anonymous_remote_child_task',\n childInvocation.result.then((r) => (r === null ? undefined : r)) as Promise<string | Error | undefined>,\n );\n\n const taskContext = this.runtime.app.taskContextForRunFn(\n childInvocation,\n params,\n this.host,\n ) as TaskContext<TTaskParams>;\n\n try {\n const result = await childTaskFnDefinition.task.runFn.call(childInvocation, taskContext);\n childInvocation.resolveResult(result);\n return result as TTaskReturn;\n } catch (error) {\n childInvocation.rejectResult(error as Error);\n throw error;\n } // End of catch block for invokeChildTask\n } // End of invokeChildTask method\n\n override ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> {\n throw new Error('ssh from a remote host is not currently supported.');\n }\n} // End of RemoteInvocation class\n\nexport class RemoteRuntime implements IRuntime {\n private sftpClientInstance?: any; // Type should be SFTPWrapper from 'node-ssh'\n public readonly app: App;\n public readonly host: Host;\n public readonly interactionHandler: InteractionHandler;\n private sshSession: SSHSession;\n\n constructor(\n app: App,\n host: Host,\n interactionHandler: InteractionHandler = new InteractionHandler(),\n ) {\n this.app = app;\n this.host = host;\n this.interactionHandler = interactionHandler;\n this.sshSession = new SSHSession(); // Initialize SSH session for this host for context\n }\n\n get tmpDirRootPath(): Path {\n return new Path('/tmp');\n }\n\n async getPassword(): Promise<string | undefined> {\n return await this.host.decryptedPassword();\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n const secret = this.app.config.getSecret(name);\n if (!secret) {\n this.app.warn(`Secret ${name} not found in config.`);\n return undefined;\n }\n return secret.plaintext();\n }\n\n getTmpDir(): Path {\n return this.tmpDirRootPath.join(this.app.randName());\n }\n\n getTmpFile(prefix?: string | undefined, postfix?: string | undefined, dir?: Path | undefined): Path {\n const tmpDir = dir || this.getTmpDir();\n return tmpDir.join(this.app.randName());\n }\n\n inventory(tags: string[]): Host[] {\n return this.app.queryInventory(new Set(tags));\n }\n\n selectedInventory(tags?: string[]): Host[] {\n const tagSet: Set<string> = tags ? new Set(tags) : new Set();\n return this.app.querySelectedInventory(tagSet);\n }\n\n async connect(): Promise<boolean> {\n if (this.sshSession.isConnected() && this.sftpClientInstance) {\n this.app.debug(`RemoteRuntime: SSH session and SFTP already connected to ${this.host.uri}`);\n return true;\n }\n\n this.app.debug(`RemoteRuntime: Connecting SSH to ${this.host.uri}...`);\n\n const sshConnectOpts: NodeSSHConfig = {\n host: this.host.hostname, // Changed from this.host.host\n username: this.host.user || this.app.defaultSshUser(), // Assuming defaultSshUser on App\n port: this.host.port, // node-ssh parses port from host string if present\n privateKey: await this.host.plaintextSshKeyPath(),\n password: await this.host.decryptedPassword(),\n };\n\n try {\n if (!this.sshSession.isConnected()) {\n await this.sshSession.connect(sshConnectOpts);\n this.app.debug(`RemoteRuntime: SSH connected to ${this.host.uri}`);\n }\n\n this.app.debug(`RemoteRuntime: Requesting SFTP client for ${this.host.uri}`);\n this.sftpClientInstance = await this.sshSession.sftp();\n this.app.debug(`RemoteRuntime: SFTP client ready for ${this.host.uri}`);\n } catch (e: any) {\n this.app.error(`RemoteRuntime: SSH connection or SFTP setup to ${this.host.uri} failed: ${e.message}`);\n if (this.sshSession.isConnected()) {\n await this.sshSession.disconnect().catch((err: Error) => {\n this.app.error(`RemoteRuntime: Error during disconnect after failed connect/sftp: ${err.message}`);\n });\n }\n this.sftpClientInstance = undefined; // Clear sftp client on error\n throw e;\n }\n\n return this.sshSession.isConnected();\n }\n\n async getSftpClient(): Promise<any> {\n // Replace 'any' with actual SFTP client type (e.g., from 'node-ssh')\n await this.connect(); // Ensures connection and SFTP client are active and ready\n if (!this.sftpClientInstance) {\n // This should ideally be caught by connect(), but as a safeguard\n throw new Error(`SFTP client not available on SSHSession for ${this.host.uri} after connect call.`);\n }\n return this.sftpClientInstance;\n }\n\n async executeCommand(\n command: Command,\n options?: {\n stdin?: string | Buffer;\n pty?: boolean;\n interactionHandler?: InteractionHandler;\n },\n ): Promise<Command | Error> {\n const commandDisplay = command.toString();\n\n this.app.debug(`RemoteRuntime: Executing on ${this.host.uri}: ${commandDisplay}`);\n\n const handlerToUse = options?.interactionHandler || this.interactionHandler;\n let cmdOrErr: Command | Error;\n\n try {\n if (options?.pty || handlerToUse !== this.interactionHandler) {\n this.app.debug(`RemoteRuntime: Executing command on ${this.host.uri} via sshSession.run (PTY/custom handler)`);\n const commandObj: Command = await this.sshSession.run(command, handlerToUse, {\n stdin: options?.stdin,\n pty: options?.pty,\n });\n cmdOrErr = commandObj;\n } else {\n this.app.debug(\n `RemoteRuntime: Executing command on ${this.host.uri} via sshSession.execCommand (no PTY/default handler)`,\n );\n const commandObj: Command = await this.sshSession.execCommand(command, {\n stdin: options?.stdin,\n });\n cmdOrErr = commandObj;\n }\n this.app.logHostCommandResult(this.host, commandDisplay, cmdOrErr);\n } catch (e: any) {\n this.app.error(`RemoteRuntime: executeCommand failed for '${commandDisplay}': ${e.message}`);\n this.app.error(e.stack);\n cmdOrErr = e;\n this.app.logHostCommandResult(this.host, commandDisplay, cmdOrErr);\n }\n\n return cmdOrErr;\n }\n\n async disconnect(): Promise<void> {\n if (this.sshSession.isConnected()) {\n this.app.debug(`RemoteRuntime: Disconnecting SSH from ${this.host.uri}`);\n this.sftpClientInstance = undefined; // Clear SFTP client instance\n await this.sshSession.disconnect();\n }\n }\n\n async invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n ): Promise<IInvocation> {\n await this.connect();\n if (!this.sshSession) throw new Error('SSH session not established for invokeRootTask.');\n\n // RemoteInvocation will use this RemoteRuntime instance for SSH operations\n const rootInvocation = new RemoteInvocation(\n this,\n taskFnDefinition,\n params,\n { runtime: this, host: this.host } as any,\n this.host,\n );\n\n this.app.taskTree.add(\n rootInvocation.id,\n null,\n taskFnDefinition.task.name || `remote_root_task_on_${this.host.hostname}`, // Changed host to hostname\n rootInvocation.result.then((r) => (r === null ? undefined : r)) as Promise<string | Error | undefined>,\n );\n\n const taskContext = this.app.taskContextForRunFn(rootInvocation, params, this.host) as TaskContext<TParams>;\n\n taskFnDefinition.task.runFn\n .call(rootInvocation, taskContext)\n .then(rootInvocation.resolveResult)\n .catch(rootInvocation.rejectResult);\n\n return rootInvocation;\n }\n}\n","import { signalsByName } from 'human-signals';\nimport { NodeSSH, type Config } from 'node-ssh';\nimport { InteractionHandler } from './interaction-handler';\nimport { PassThrough } from 'stream'; // Added for combining stdin\nimport { Command, CommandResult, type Signal } from './command';\n\n\nexport class SSHSession {\n public ssh: NodeSSH;\n\n constructor() {\n this.ssh = new NodeSSH();\n }\n\n connect(sshConnectOpts: Config): Promise<NodeSSH> {\n return this.ssh.connect(sshConnectOpts);\n }\n\n async deleteFile(remotePath: string) {\n const self = this;\n return new Promise(function (resolve, reject) {\n self.ssh.withSFTP(async (sftp) => {\n sftp.unlink(remotePath, (err: Error | null | undefined) => {\n if (err) {\n // err is Error | null | undefined; if non-null/undefined, it's an Error\n // ENOENT (No such file or directory) often has errno 2 or code 'ENOENT'.\n const errnoError = err as NodeJS.ErrnoException;\n if (errnoError.errno === 2 || errnoError.code === 'ENOENT') {\n resolve(true); // Consider \"file not found\" as success for delete\n } else {\n const errnoError = err as NodeJS.ErrnoException;\n const errorCodeDisplay =\n errnoError.code !== undefined\n ? errnoError.code\n : errnoError.errno !== undefined\n ? errnoError.errno\n : 'N/A';\n reject(`${errnoError.message} (code ${errorCodeDisplay}) ${remotePath}`);\n }\n } else {\n // No error means unlink was successful\n resolve(true);\n }\n });\n });\n });\n }\n\n async sftp() {\n return this.ssh.requestSFTP();\n }\n\n async execCommand(\n command: Command,\n options?: { stdin?: string | Buffer; pty?: boolean | object },\n ) {\n // Use Command's toString() method which handles env inlining\n const finalCommand = command.toString();\n\n const nodeSshCmdOptions: any = {\n cwd: command.cwd,\n stdin:\n typeof options?.stdin === 'string'\n ? options.stdin\n : Buffer.isBuffer(options?.stdin)\n ? options.stdin.toString()\n : undefined,\n };\n\n if (options?.pty !== undefined) {\n // pty and other ssh2-specific options go into a nested 'options' object\n nodeSshCmdOptions.options = {\n ...(nodeSshCmdOptions.options || {}), // Preserve other potential ssh2 options if they were there\n pty: options.pty,\n };\n }\n\n const result = await this.ssh.execCommand(finalCommand, nodeSshCmdOptions as import('node-ssh').SSHExecCommandOptions);\n const exitCode = result.code === null ? -1 : result.code; // Handle null exit code\n const signalString = result.signal; // string | null\n const signalObject = signalString ? (signalsByName as Record<string, Signal>)[signalString] : undefined;\n\n const commandResult = new CommandResult(result.stdout, result.stderr, exitCode, signalObject);\n\n return new Command({\n cmd: command.cmd,\n args: command.args,\n cwd: command.cwd,\n env: command.env,\n result: commandResult,\n sudo: command.sudo,\n });\n }\n\n async getFile(remotePath: string, localPath: string) {\n await this.ssh.getFile(localPath, remotePath);\n }\n\n /**\n * Executes a command on the remote host.\n * @param command The Command object to execute.\n * @param interactionHandler The interaction handler to use.\n * @param execOptions The options for the execution.\n * @returns A promise that resolves to the result of the command.\n */\n async run(\n command: Command,\n interactionHandler = new InteractionHandler(),\n execOptions: {\n stdin?: string | Buffer;\n pty?: boolean | object;\n } = {},\n ): Promise<Command> {\n // Return type reflects node-ssh's ExecResult extended with cmd and args\n const self = this;\n\n const combinedStdin = new PassThrough();\n if (execOptions.stdin) {\n combinedStdin.write(execOptions.stdin);\n // If it's a one-off stdin, we might want to end this part of the stream,\n // but PassThrough will stay open for interactionHandler's pipe.\n // For simplicity, let interactionHandler control the end of its piped content.\n }\n interactionHandler.setOutputToNewReadable().pipe(combinedStdin);\n\n interactionHandler.begin();\n\n // Use Command's toArray() method to get command and args separately\n const { cmd, args } = command.toArray();\n\n const ptyOption = execOptions.pty ?? true;\n\n const { stdout, stderr, code, signal } = await self.ssh.exec(cmd, args, {\n cwd: command.cwd,\n execOptions: { pty: ptyOption },\n stream: 'both',\n stdin: combinedStdin,\n onStdout: (chunk: Buffer) => {\n const output = chunk.toString('utf8');\n interactionHandler.handleInput(output);\n },\n onStderr: (chunk: Buffer) => {\n const errorOutput = chunk.toString('utf8');\n interactionHandler.handleInput(errorOutput); // Send stderr to handler too\n // node-ssh's `exec` still collects stderr for the final result.stderr string\n // so we don't need to explicitly return it from here for collection purposes.\n },\n });\n\n interactionHandler.end();\n\n const signalName = signal as keyof typeof signalsByName | null;\n const signalObj = signalName ? signalsByName[signalName] : undefined;\n const result = new CommandResult(stdout, stderr, code || 0, signalObj);\n\n return new Command({\n cmd: command.cmd,\n args: command.args,\n cwd: command.cwd,\n env: command.env,\n result,\n sudo: command.sudo\n });\n }\n\n async sendFile(localPath: string, remotePath: string): Promise<boolean> {\n try {\n await this.ssh.putFile(localPath, remotePath);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n async disconnect(): Promise<void> {\n this.ssh.dispose();\n }\n\n isConnected() {\n return this.ssh.isConnected();\n }\n}\n","/**\n * An object representing the mapping of expected output (as a regex string)\n * to the input that should be provided in response.\n */\nexport type InputMap = Record<string, string>;\n\nexport const CHECKMARK = '\\u2713';\nexport const XMARK = '\\u2717';\n\n/**\n * A collection of regular expressions to detect various sudo/doas password prompts\n * across different operating systems.\n */\nexport const SUDO_PROMPT_REGEX = {\n /**\n * Matches the default sudo prompt on most Linux distributions.\n * Example: `[sudo] password for <username>:`\n */\n LINUX: '\\\\[sudo\\\\] password',\n\n /**\n * Matches the default sudo prompt on macOS and some BSD systems.\n * Example: `Password:`\n */\n MAC_BSD: '^Password:',\n\n /**\n * Matches the default prompt for `doas` on OpenBSD.\n * Example: `doas (username@hostname) password:`\n */\n DOAS: 'doas \\\\(.*\\\\) password:',\n};\n\n/**\n * A helper function that builds an input map to handle various sudo/doas password prompts.\n * This is useful for building up interaction handlers for commands that require privilege escalation\n * across different operating systems.\n *\n * @param password The sudo/doas password to provide.\n * @param existingInputMap An optional existing map of interactions.\n * @returns A new input map containing the sudo/doas prompt interactions and any existing interactions.\n */\nexport function withSudo(password: string | undefined, existingInputMap: InputMap = {}): InputMap {\n if (!password) {\n return existingInputMap;\n }\n const passwordResponse = `${password}\\n`;\n return {\n ...existingInputMap,\n [SUDO_PROMPT_REGEX.LINUX]: passwordResponse,\n [SUDO_PROMPT_REGEX.MAC_BSD]: passwordResponse,\n [SUDO_PROMPT_REGEX.DOAS]: passwordResponse,\n };\n}\n","import { Pty } from '@replit/ruspty';\nimport { StringBuilder } from 'typescript-string-operations';\n\nimport { Command, CommandResult, type EnvVarObj } from './command';\nimport { InteractionHandler } from './interaction-handler';\nimport { signalsByNumber } from 'human-signals';\nimport { O } from './flex/object';\nimport { A } from './flex/array';\n\nexport class RusPtyCommand extends Command {\n\n /**\n * Builds a RusPtyCommand object from a command string or array with optional sudo and environment variables.\n * This mirrors Command.build but returns a RusPtyCommand object for local execution.\n */\n static build(\n command: string | string[],\n options: {\n sudo?: boolean;\n env?: EnvVarObj;\n cwd?: string;\n } = {},\n ): RusPtyCommand {\n const commandObj = Command.build(command, options);\n\n return new RusPtyCommand({ cmd: commandObj.cmd, args: commandObj.args, cwd: commandObj.cwd, env: commandObj.env, sudo: commandObj.sudo });\n }\n\n public process!: Pty; // Definite assignment assertion\n\n async run(interactionHandler = new InteractionHandler(), stdin?: string | Buffer): Promise<CommandResult> {\n const self = this;\n return new Promise<CommandResult>(function (resolve, reject) {\n const stdout = new StringBuilder();\n // console.log(`Pty> ${self.cmd} ${self.args}`);\n self.process = new Pty({\n command: self.cmd,\n args: self.args,\n dir: self.cwd,\n envs: self.env as Record<string, string>,\n interactive: true,\n size: { rows: 30, cols: 80 },\n onExit: (err: null | Error, exitCode: number) => {\n interactionHandler.end();\n // console.log(`exit code: ${exitCode}`);\n // console.log(`exit signal: ${signal}`);\n // const signalObj = signalsByNumber[signal || 10000];\n const signalObj = undefined;\n const commandResult = new CommandResult(stdout.toString(), '', exitCode, signalObj);\n self.result = commandResult;\n resolve(commandResult);\n },\n });\n\n const read = self.process.read;\n const write = self.process.write;\n\n if (stdin) {\n // console.log(`Pty> stdin: ${stdin}`);\n write.write(stdin);\n // Consider self.process.end() or write.write('\\x04') if EOF is needed.\n }\n\n interactionHandler.begin();\n interactionHandler.setOutputWriter((str) => write.write(str));\n\n read.on('data', (chunk) => {\n stdout.append(chunk);\n interactionHandler.handleInput(chunk);\n });\n });\n }\n}\n","import os from 'node:os';\nimport axios, { type AxiosInstance } from 'axios';\nimport * as cheerio from 'cheerio';\nimport { File } from './flex/file';\nimport { A } from './flex/array';\nimport { O } from './flex/object';\nimport { V } from './flex/type';\nimport { match } from 'ts-pattern';\nimport which from 'which';\nimport { downloadFile } from './http';\n// import { ShellCommand } from './shell-command';\nimport { unarchive } from './unarchive';\nimport type { CommandResult } from './command';\nimport type { Path } from './flex/path';\nimport { RusPtyCommand } from './ruspty-command';\nimport { processEnvVars } from './command';\n\nexport interface NpmInstallOptions {\n pkg?: string;\n omitDev?: boolean;\n cwd?: string;\n prefix?: string; // see https://docs.npmjs.com/cli/v11/configuring-npm/folders#prefix-configuration\n}\n\nexport interface NpmUninstallOptions {\n pkg: string;\n cwd?: string;\n prefix?: string;\n}\n\nexport interface NpmListOptions {\n cwd?: string;\n prefix?: string;\n depth?: number;\n}\n\nexport class NodeRuntime {\n static Name = 'nodejs';\n\n private client: AxiosInstance;\n private alreadyInstalled: boolean;\n private localNode: Path;\n private localNpm: Path;\n\n constructor(public tmpDir: Path) {\n this.client = axios.create({\n baseURL: 'https://nodejs.org/',\n });\n this.alreadyInstalled = false;\n this.localNode = this.tmpDir.join(NodeRuntime.Name, 'bin', 'node');\n this.localNpm = this.tmpDir.join(NodeRuntime.Name, 'bin', 'npm');\n }\n async isNodeInstalledGlobally() {\n const result = await RusPtyCommand.build(`node --version`, { env: processEnvVars() }).run();\n // console.log(`isNodeInstalledGlobally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNodeInstalledLocally() {\n const result = await RusPtyCommand.build(`${this.localNode} --version`, { env: processEnvVars() }).run();\n // console.log(`isNodeInstalledLocally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNpmInstalledGlobally() {\n const result = await RusPtyCommand.build(`npm --version`, { env: processEnvVars() }).run();\n // console.log(`isNpmInstalledGlobally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNpmInstalledLocally() {\n const result = await RusPtyCommand.build(`${this.localNpm} --version`, { env: processEnvVars() }).run();\n // console.log(`isNpmInstalledLocally result: ${V.inspect(result.toJSON())}`);\n // console.log(result.err);\n return result.success;\n }\n\n async nodeCmd() {\n if (await this.isNodeInstalledGlobally()) return 'node';\n\n if (await this.isNodeInstalledLocally()) return this.localNode.toString();\n\n throw new Error('node not installed');\n }\n\n async nodePath(): Promise<string | null> {\n if (await this.isNodeInstalledGlobally()) {\n return await which('node', { nothrow: true });\n }\n\n if (await this.isNodeInstalledLocally()) return this.localNode.toString();\n\n return null;\n }\n\n async npmCmd() {\n if (await this.isNpmInstalledGlobally()) return 'npm';\n\n if (await this.isNpmInstalledLocally()) return this.localNpm.toString();\n\n throw new Error('npm not installed');\n }\n\n async npmPath(): Promise<string | null> {\n if (await this.isNpmInstalledGlobally()) {\n return await which('npm', { nothrow: true });\n }\n\n if (await this.isNpmInstalledLocally()) return this.localNpm.toString();\n\n return null;\n }\n\n async installIfNeeded() {\n if (this.alreadyInstalled || (await this.isNodeInstalledGlobally()) || (await this.isNodeInstalledLocally())) {\n this.alreadyInstalled = true;\n return;\n }\n\n return this.install();\n }\n\n async install() {\n const platform = os.platform();\n const arch = os.arch();\n const packagePath = await this.downloadNodePackage(platform, arch);\n const unzipDir = await this.unzipPackage(packagePath);\n\n this.alreadyInstalled = true;\n\n return unzipDir;\n }\n\n async listPackages(): Promise<string[]> {\n const response = await this.client.get(`/dist/latest/`);\n const doc = await cheerio.load(response.data);\n const allFileLinks = doc('a')\n .map((i, el) => doc(el).attr('href'))\n .toArray();\n const archiveFiles = A(allFileLinks).select((filename: string) => filename.match(/.*\\.(gz|zip|xz)/));\n const urls = A(archiveFiles).map((filename: string) => `https://nodejs.org/dist/latest/${filename}`);\n return urls;\n }\n\n // returns the path to the downloaded zip file\n async downloadNodePackage(platform: string, arch: string): Promise<string> {\n // const url = match([platform, arch])\n // .with([\"linux\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-x64.tar.xz\")\n // .with([\"linux\", \"arm\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-armv7l.tar.xz\")\n // .with([\"linux\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-arm64.tar.xz\")\n // .with([\"win32\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-win-x64.zip\")\n // .with([\"win32\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-win-arm64.zip\")\n // .with([\"darwin\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-darwin-x64.tar.gz\")\n // .with([\"darwin\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-darwin-arm64.tar.gz\")\n // .otherwise(() => {\n // throw new Error(`Unable to download node for OS/architecture: ${os}/${arch}`);\n // });\n\n const platformInFilename = match(platform)\n .with('linux', () => 'linux')\n .with('win32', () => 'win')\n .with('darwin', () => 'darwin')\n .otherwise(() => 'unknown-platform');\n\n const archInFilename = match(arch)\n .with('x64', () => 'x64')\n .with('x86', () => 'x86')\n .with('arm', () => 'armv7l')\n .with('arm64', () => 'arm64')\n .otherwise(() => 'unknown-arch');\n\n const packages = await this.listPackages();\n const url = A(packages).find((url: string) => url.match(`node-v.*-${platformInFilename}-${archInFilename}`));\n if (V.isAbsent(url)) {\n throw new Error(`Unable to download node for ${os}/${arch} OS/architecture`);\n }\n\n const filename = File.basename(url);\n const path = this.tmpDir.join(filename);\n\n if (path.exists()) return path.toString();\n\n // console.log(`downloading ${url} to ${path}`);\n return await downloadFile(url, path.toString());\n }\n\n // returns the path to the unzipped package directory\n async unzipPackage(packagePath: string): Promise<string> {\n const dir = this.tmpDir.join(NodeRuntime.Name);\n\n if (dir.exists()) return dir.toString();\n\n // console.log(`unzipping ${packagePath} to ${dir}`);\n await unarchive(packagePath, dir.toString());\n return dir.toString();\n }\n\n // cwd is the working directory for the npm install command (this is useful for installing local dependencies of a specific package directory)\n // pkg is the package name to install\n // prefix is the NPM prefix directory (see https://docs.npmjs.com/cli/v11/configuring-npm/folders#prefix-configuration)\n async npmInstall(options: NpmInstallOptions = {}): Promise<CommandResult> {\n const { omitDev = true, cwd, pkg, prefix } = options;\n const args = ['install'];\n if (omitDev) {\n args.push('--omit=dev');\n }\n if (prefix) {\n args.push('--prefix', prefix);\n }\n if (pkg) {\n args.push(pkg);\n }\n // console.log(`DEBUG: npmInstall called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npmUninstall(options: NpmUninstallOptions): Promise<CommandResult> {\n const { pkg, cwd, prefix } = options;\n const args = ['uninstall', pkg];\n if (prefix) {\n args.push('--prefix', prefix);\n }\n // console.log(`DEBUG: npmUninstall called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npmList(options: NpmListOptions = {}): Promise<CommandResult> {\n const { cwd, prefix, depth } = options;\n const args = ['list'];\n if (prefix) {\n args.push('--prefix', prefix);\n }\n if (depth !== undefined) {\n args.push('--depth', depth.toString());\n }\n // console.log(`DEBUG: npmList called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npm(npmArgs: string, cwd?: string): Promise<CommandResult> {\n const npmCmd = await this.npmCmd();\n // console.log(`DEBUG: npm called with cwd: ${cwd}, args: ${npmArgs}`);\n\n return RusPtyCommand.build(`${npmCmd} ${npmArgs}`.trim(), {env: processEnvVars(), cwd}).run();\n }\n\n async node(nodeArgs: string, cwd?: string): Promise<CommandResult> {\n const nodeCmd = await this.nodeCmd();\n\n return RusPtyCommand.build(`${nodeCmd} ${nodeArgs}`.trim(), {env: processEnvVars(), cwd}).run();\n }\n}\n","import type { PathLike } from 'node:fs';\nimport { createWriteStream, unlink } from 'node:fs';\nimport { get } from 'node:https';\n\nexport async function downloadFile(url: string, dest: PathLike): Promise<string> {\n return new Promise((resolve, reject) => {\n const file = createWriteStream(dest, { flags: 'wx' });\n\n const request = get(url, (response) => {\n if (response.statusCode === 200) {\n response.pipe(file);\n } else {\n file.close();\n unlink(dest, () => {}); // Delete temp file\n reject(`Server responded with ${response.statusCode}: ${response.statusMessage}`);\n }\n });\n\n request.on('error', (err) => {\n file.close();\n unlink(dest, () => {}); // Delete temp file\n reject(err.message);\n });\n\n file.on('finish', () => {\n resolve(dest.toString());\n });\n\n file.on('error', (err: NodeJS.ErrnoException) => {\n file.close();\n\n if (err.code === 'EEXIST') {\n reject(new Error('File already exists'));\n } else {\n unlink(dest, () => {}); // Delete temp file\n reject(err.message);\n }\n });\n });\n}\n","import { File } from './flex/file';\nimport decompress from 'decompress';\nimport decompressTarGzPlugin from 'decompress-targz';\nimport decompressZipPlugin from 'decompress-unzip';\nimport { match, P } from 'ts-pattern';\n\n// these are for the tar.xz decompress functionality\nimport decompressTarPlugin from 'decompress-tar';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { getStreamAsBuffer } from 'get-stream';\nimport xzdecompress from 'xz-decompress';\n\nexport async function unarchive(inputPath: string, outputPath: string): Promise<void> {\n const filename = File.basename(inputPath);\n return await match(filename)\n .with(P.string.regex(/.tar.xz$/), () => decompressTarXz(inputPath, outputPath))\n .with(P.string.regex(/.tar.gz$/), () => decompressTarGz(inputPath, outputPath))\n .with(P.string.regex(/.zip$/), () => decompressZip(inputPath, outputPath))\n .otherwise(() => {\n throw new Error(`unable to decompress unknown file type: ${inputPath}`);\n });\n}\n\nexport async function decompressTarGz(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressTarGzPlugin()],\n strip: dropRootDir,\n });\n}\n\nasync function decompressTarXzPlugin(input: Buffer): Promise<decompress.File[]> {\n const type = await fileTypeFromBuffer(input);\n\n if (!type || type.ext !== 'xz') {\n // Not an XZ file, or unknown type; plugin should return an empty array.\n return [];\n }\n\n // Input is a Buffer and is an XZ file.\n const blob = new Blob([input]);\n const webReadableStream = blob.stream(); // blob.stream() is ReadableStream<Uint8Array>\n const xzStream = new xzdecompress.XzReadableStream(webReadableStream);\n\n // decompressTarPlugin() returns a function that expects a Buffer.\n // getStreamAsBuffer(xzStream) converts the decompressed stream back to a Buffer.\n const decompressedBuffer = await getStreamAsBuffer(xzStream);\n return decompressTarPlugin()(decompressedBuffer);\n}\n\nexport async function decompressTarXz(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressTarXzPlugin],\n strip: dropRootDir,\n });\n}\n\nexport async function decompressZip(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressZipPlugin()],\n strip: dropRootDir,\n });\n}\n","import AdmZip from 'adm-zip';\n\nexport async function zipDirectory(sourceDir: string, outputFilePath: string): Promise<string> {\n const zip = new AdmZip();\n zip.addLocalFolder(sourceDir);\n await zip.writeZipPromise(outputFilePath);\n // console.log(`Zip file created: ${outputFilePath}`);\n return outputFilePath;\n}\n\nexport async function unzipDirectory(inputFilePath: string, outputDirectory: string): Promise<string> {\n const zip = new AdmZip(inputFilePath);\n return new Promise((resolve, reject) => {\n zip.extractAllToAsync(outputDirectory, true, false, (error?: Error) => {\n if (error) {\n // console.log(error);\n reject(error);\n } else {\n // console.log(`Extracted to \"${outputDirectory}\" successfully`);\n resolve(outputDirectory);\n }\n });\n });\n}\n","import { createHash } from 'node:crypto';\n\n/**\n * Returns a SHA256 hash using SHA-2 for the given `content`.\n */\nexport function sha256(str: string): string {\n return createHash('sha256').update(str).digest('hex');\n}\n","import { A } from './flex/array';\nimport { M } from './flex/map';\nimport { VP } from './flex/pipe';\nimport { Str, isNumeric, matches } from './flex/string';\nimport { V } from './flex/type';\nimport { match } from 'ts-pattern';\n\nexport class ParamMap {\n /**\n * Parses CLI arguments of the form key:value, only supporting top-level keys.\n * Only the first colon is treated as a key/value separator; all subsequent colons are part of the value.\n * This means nested keys are not supported, but values can contain colons (e.g., URLs, JSON, etc.).\n */\n static parse(cliArguments: string[]): ParamMap {\n const root = new ParamMap();\n\n A(cliArguments).each((arg: string) => {\n const idx = arg.indexOf(':');\n if (idx === -1) {\n root.set([arg], 'true');\n return;\n }\n const key = arg.slice(0, idx);\n const value = arg.slice(idx + 1);\n root.set([key], value);\n });\n\n return root;\n }\n\n public map: Map<string, string | ParamMap>;\n\n constructor() {\n this.map = new Map();\n }\n\n get(keyPath: string): any {\n const keys = keyPath.split(':');\n let node: any = this;\n for (let i = 0; i < keys.length; i++) {\n if (!(node instanceof ParamMap)) return undefined;\n node = node.map.get(keys[i]);\n if (node === undefined) return undefined;\n }\n if (node instanceof ParamMap) {\n return node.toObject();\n }\n return this.stringToJsonObj(node);\n }\n\n set(keyPath: string[] | string, value: string | ParamMap) {\n const keyParts = Array.isArray(keyPath) ? keyPath : keyPath.split(':');\n let node: ParamMap = this;\n for (let i = 0; i < keyParts.length - 1; i++) {\n const key = keyParts[i];\n let nextNode = node.map.get(key);\n if (!(nextNode instanceof ParamMap)) {\n nextNode = new ParamMap();\n node.map.set(key, nextNode);\n }\n node = nextNode;\n }\n const lastKey = keyParts[keyParts.length - 1];\n node.map.set(lastKey, value);\n }\n\n toObject(): Object {\n let obj: any = {};\n M(this.map).each(([k, v]: [string, string | ParamMap]) => {\n obj[k] = v instanceof ParamMap ? v.toObject() : this.stringToJsonObj(v);\n });\n return obj;\n }\n\n private stringToJsonObj(str: string) {\n if (typeof str !== 'string') return str;\n\n // Attempt to treat the whole string as JSON first (object or array)\n const trimmed = str.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Fall through to legacy parsing if JSON.parse fails\n }\n }\n\n // Legacy behaviour (comma-lists, numbers, empties, etc.)\n return match(str)\n .when(matches(/,/), (s: string) => {\n return VP(s.split(','))\n .map((v: string) => v.trim())\n .compact([''])\n .map((v: string) => this.stringToJsonObj(v)).value;\n })\n .when(isNumeric, (s: string) => parseFloat(s))\n .when((s: string) => s.trim() === '', () => '')\n .otherwise(() => str);\n }\n}\n","export const version = '0.1.42';\n","import { task, type TaskContext, type TaskFn } from '../../runtime';\n\ninterface RunParams {\n taskFn: TaskFn;\n params: any;\n}\n\ntype RunResult = Record<string, any>;\n\nfunction serializeError(value: unknown): Record<string, any> {\n if (value instanceof Error) {\n const err = value as NodeJS.ErrnoException;\n return {\n error: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack,\n };\n }\n\n if (value && typeof value === 'object') {\n return { error: JSON.stringify(value) };\n }\n\n return { error: String(value) };\n}\n\nasync function run(context: TaskContext<RunParams>): Promise<RunResult> {\n const { params, ssh } = context;\n const { taskFn, params: taskParams } = params;\n\n // The callback to context.ssh runs on the remote host, receiving its own TaskContext.\n const remoteResults = await ssh([], async (remoteContext: TaskContext<RunParams>) => {\n const hostIdentifier = remoteContext.host?.alias || remoteContext.host?.shortName || 'unknown_remote_host';\n remoteContext.debug(`[${hostIdentifier}] Connected via SSH.`);\n\n try {\n const result = await remoteContext.run(taskFn(taskParams));\n remoteContext.debug(`[${hostIdentifier}] Remote task result:`, JSON.stringify(result));\n if (result instanceof Error) {\n remoteContext.warn?.(\n `[${hostIdentifier}] Remote task returned an Error instance. Converting to serializable object.`,\n );\n return serializeError(result);\n }\n return result;\n } catch (e: any) {\n remoteContext.debug(`[${hostIdentifier}] Failed to run remote task:`, e.message);\n return serializeError(e);\n }\n });\n\n const normalizedEntries = Object.entries(remoteResults ?? {}).map(([hostAlias, value]) => {\n if (value instanceof Error) {\n return [hostAlias, serializeError(value)];\n }\n return [hostAlias, value];\n });\n\n return Object.fromEntries(normalizedEntries);\n}\n\nexport default task(run, {\n description: 'run a task on all selected hosts',\n});\n","import { promises as fs } from 'fs';\nimport { App } from '../../app';\nimport { Path } from '../../flex/path';\nimport { NodeRuntime } from '../../node-runtime';\nimport filenamify from 'filenamify';\n\nexport interface PackageInfo {\n name: string;\n version?: string;\n description?: string;\n directory: string;\n source?: string;\n tasks?: TaskInfo[];\n path: string; // Absolute path to the installed package directory\n}\n\nexport interface TaskInfo {\n name: string;\n path: string;\n description?: string;\n}\n\nexport interface InstallResult {\n success: boolean;\n packageInfo: PackageInfo;\n installPath: string;\n error?: string;\n}\n\nexport interface RemoveResult {\n success: boolean;\n packageInfo?: PackageInfo;\n error?: string;\n}\n\nexport interface PackageManifest {\n packages: PackageInfo[];\n version: string;\n}\n\nexport class PackageManager {\n private manifestPath: Path;\n private manifest: PackageManifest;\n\n constructor(private app: App) {\n this.manifestPath = this.app.packagesDir().join('manifest.json');\n this.manifest = { packages: [], version: '1.0' };\n }\n\n private async loadManifest(): Promise<void> {\n try {\n if (await this.manifestPath.exists()) {\n const manifestContent = await fs.readFile(this.manifestPath.toString(), 'utf-8');\n this.manifest = JSON.parse(manifestContent);\n } else {\n this.manifest = { packages: [], version: '1.0' };\n }\n } catch (error) {\n console.warn('Failed to load manifest, creating new one:', error);\n this.manifest = { packages: [], version: '1.0' };\n }\n }\n\n private async saveManifest(): Promise<void> {\n await fs.writeFile(this.manifestPath.toString(), JSON.stringify(this.manifest, null, 2));\n }\n\n // Normalize git URLs to npm-compatible format\n private normalizeSource(source: string): string {\n // Convert http:// to https:// for known git hosts\n if (\n (source.includes('github.com') || source.includes('gitlab.com') || source.includes('bitbucket.org')) &&\n source.startsWith('http://') &&\n !source.startsWith('git@') &&\n !source.startsWith('git+ssh://') &&\n !source.startsWith('git+https://')\n ) {\n return source.replace('http://', 'https://');\n }\n\n // Add https:// to URLs that don't start with a protocol\n if (\n (source.includes('github.com') || source.includes('gitlab.com') || source.includes('bitbucket.org')) &&\n !/^\\w+:\\/\\//.test(source) &&\n !source.startsWith('git@') &&\n !source.startsWith('git+ssh://') &&\n !source.startsWith('git+https://')\n ) {\n return 'https://' + source;\n }\n\n // Convert git URLs to npm-compatible format\n if (source.startsWith('git@')) {\n return source.replace('git@', 'git+ssh://').replace(':', '/');\n }\n\n return source;\n }\n\n async listPackages(): Promise<PackageInfo[]> {\n await this.loadManifest();\n return this.manifest.packages;\n }\n\n async discoverTasks(packagePath: Path): Promise<TaskInfo[]> {\n const tasks: TaskInfo[] = [];\n\n try {\n // Look for TypeScript and JavaScript files that might be tasks\n const entries = await fs.readdir(packagePath.toString(), { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {\n // Skip common non-task files\n if (entry.name === 'index.ts' || entry.name === 'index.js') {\n continue;\n }\n\n const taskPath = packagePath.join(entry.name);\n const taskName = entry.name.replace(/\\.(ts|js)$/, '');\n\n tasks.push({\n name: taskName,\n path: taskPath.toString(),\n });\n }\n }\n\n // Also check for tasks in a 'tasks' or 'src' subdirectory\n const subdirs = ['tasks', 'src'];\n for (const subdir of subdirs) {\n const subdirPath = packagePath.join(subdir);\n if (await subdirPath.exists()) {\n const subEntries = await fs.readdir(subdirPath.toString(), { withFileTypes: true });\n\n for (const entry of subEntries) {\n if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {\n const taskPath = subdirPath.join(entry.name);\n const taskName = entry.name.replace(/\\.(ts|js)$/, '');\n\n tasks.push({\n name: taskName,\n path: taskPath.toString(),\n });\n }\n }\n }\n }\n } catch (error) {\n // Ignore errors during task discovery\n }\n\n // Sort tasks by name before returning\n return tasks.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Enhanced task resolution that supports dotted notation and npm packages\n */\n async resolveTaskPath(\n packageOrTask: string,\n taskName?: string,\n ): Promise<{ packagePath: string; taskPath: string } | null> {\n await this.loadManifest();\n\n // Case 1: Direct task script path\n if (packageOrTask.endsWith('.ts') || packageOrTask.endsWith('.js')) {\n const taskPath = Path.new(packageOrTask);\n if (await taskPath.exists()) {\n return { packagePath: taskPath.parent().toString(), taskPath: taskPath.toString() };\n }\n }\n\n // Case 2: Package name or source URL\n const normalizedSource = this.normalizeSource(packageOrTask);\n\n // Check if this is a package name (not a source URL)\n if (!this.isGitUrl(packageOrTask) && !packageOrTask.includes('/')) {\n // Check for duplicate packages with the same name\n const packagesWithName = this.getPackagesWithName(packageOrTask);\n if (packagesWithName.length > 1) {\n const errorMessage = `Multiple packages found with name '${packageOrTask}':\\n` +\n packagesWithName.map(pkg => ` - ${pkg.source}`).join('\\n') +\n '\\nTo resolve this, use the full source URL instead of just the package name';\n throw new Error(errorMessage);\n }\n }\n\n // Try to find by package name first, then by source\n const packageInfo = this.findPackageByName(packageOrTask) || this.findPackageBySource(normalizedSource);\n if (packageInfo) {\n const packagePath = Path.new(packageInfo.path);\n if (taskName) {\n // Look for specific task\n const taskPath = await this.findTaskInPackage(packagePath, taskName);\n if (taskPath) {\n return { packagePath: packagePath.toString(), taskPath };\n }\n } else {\n // Look for default task\n const defaultTaskPath = await this.findDefaultTask(packagePath);\n if (defaultTaskPath) {\n return { packagePath: packagePath.toString(), taskPath: defaultTaskPath };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a package is installed (by name, source, or directory)\n */\n async isPackageInstalled(identifier: string): Promise<boolean> {\n await this.loadManifest();\n const normalizedIdentifier = this.normalizeSource(identifier);\n return this.manifest.packages.some(\n (pkg) =>\n pkg.name === identifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === identifier ||\n pkg.source === normalizedIdentifier\n );\n }\n\n /**\n * Get package info by any identifier (name, source, or directory)\n */\n async getPackageByIdentifier(identifier: string): Promise<PackageInfo | null> {\n await this.loadManifest();\n const normalizedIdentifier = this.normalizeSource(identifier);\n return this.manifest.packages.find(\n (pkg) =>\n pkg.name === identifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === identifier ||\n pkg.source === normalizedIdentifier\n ) || null;\n }\n\n private async findDefaultTask(packagePath: Path): Promise<string | null> {\n // Look for common default task files\n const defaultFiles = ['index.ts', 'index.js', 'main.ts', 'main.js'];\n\n for (const file of defaultFiles) {\n const filePath = packagePath.join(file);\n if (await filePath.exists()) {\n return filePath.toString();\n }\n }\n\n return null;\n }\n\n /**\n * Check if a string is likely a git URL\n */\n private isGitUrl(str: string): boolean {\n return (\n str.startsWith('git@') ||\n str.startsWith('git+ssh://') ||\n str.startsWith('git+https://') ||\n str.startsWith('https://github.com/') ||\n str.startsWith('https://gitlab.com/') ||\n str.startsWith('https://bitbucket.org/') ||\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('bitbucket.org')\n );\n }\n\n async removePackage(packageIdentifier: string): Promise<RemoveResult> {\n try {\n await this.loadManifest();\n const packageToRemove = this.findPackageToRemove(packageIdentifier);\n if (!packageToRemove) {\n return {\n success: false,\n error: `Package '${packageIdentifier}' not found. Use 'hostctl pkg list' to see installed packages.`,\n };\n }\n await this.removePackageFiles(packageToRemove);\n // Remove from manifest array\n this.manifest.packages = this.manifest.packages.filter(pkg => pkg !== packageToRemove);\n await this.saveManifest();\n return {\n success: true,\n packageInfo: packageToRemove,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private findPackageToRemove(packageIdentifier: string): PackageInfo | undefined {\n const normalizedIdentifier = this.normalizeSource(packageIdentifier);\n return this.manifest.packages.find(\n (pkg) =>\n pkg.name === packageIdentifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === packageIdentifier ||\n pkg.source === normalizedIdentifier\n );\n }\n\n private async removePackageFiles(packageToRemove: PackageInfo): Promise<void> {\n const packagesDir = this.app.packagesDir();\n try {\n const nodeRuntime = new NodeRuntime(this.app.tmpDir);\n await nodeRuntime.npmUninstall({\n pkg: packageToRemove.name,\n prefix: packagesDir.toString(),\n });\n } catch (error) {\n // Ignore errors during uninstall\n console.log(`DEBUG: Error during npm uninstall: ${error}`);\n }\n }\n\n /**\n * Check if a package name already exists in the manifest\n */\n private hasPackageWithName(packageName: string): boolean {\n return this.manifest.packages.some((pkg) => pkg.name === packageName);\n }\n\n /**\n * Get all packages with the same name\n */\n private getPackagesWithName(packageName: string): PackageInfo[] {\n return this.manifest.packages.filter((pkg) => pkg.name === packageName);\n }\n\n /**\n * Find a package by its name\n */\n private findPackageByName(packageName: string): PackageInfo | undefined {\n return this.manifest.packages.find((pkg) => pkg.name === packageName);\n }\n\n /**\n * Find a package by its source\n */\n private findPackageBySource(source: string): PackageInfo | undefined {\n return this.manifest.packages.find((pkg) => pkg.source === source);\n }\n\n /**\n * Find a specific task in a package\n */\n private async findTaskInPackage(packagePath: Path, taskName: string): Promise<string | null> {\n // First check if the task exists in the package's tasks list\n const packageInfo = this.manifest.packages.find(pkg => pkg.path === packagePath.toString());\n if (packageInfo?.tasks) {\n const task = packageInfo.tasks.find(t => t.name === taskName);\n if (task) {\n return task.path;\n }\n }\n\n // Fallback: look for task files in the package directory\n const taskFiles = ['index.ts', 'index.js', `${taskName}.ts`, `${taskName}.js`];\n for (const file of taskFiles) {\n const taskPath = packagePath.join(file);\n if (await taskPath.exists()) {\n return taskPath.toString();\n }\n }\n\n return null;\n }\n\n async installPackage(source: string): Promise<InstallResult> {\n try {\n await this.loadManifest();\n const normalizedSource = this.normalizeSource(source);\n const packagesDir = this.app.packagesDir();\n await fs.mkdir(packagesDir.toString(), { recursive: true });\n const filenamifiedSource = filenamify(normalizedSource, { replacement: '_' });\n const installDir = packagesDir.join(filenamifiedSource);\n\n // Check if already installed\n const existingPackage = this.findPackageBySource(normalizedSource);\n if (existingPackage) {\n console.log(`Package '${existingPackage.name}' is already installed from ${normalizedSource}`);\n return {\n success: true,\n packageInfo: existingPackage,\n installPath: this.app.packagesDir().join(existingPackage.directory).toString(),\n };\n }\n\n // Install via npm\n const installResult = await this.installNpmPackage(normalizedSource, packagesDir, filenamifiedSource);\n\n if (!installResult.success) {\n return installResult;\n }\n\n // Get additional package info and tasks\n const packagePath = Path.new(installResult.installPath);\n const { packageInfo, tasks } = await this.getPackageInfoAndTasks(packagePath, installResult.packageInfo.name);\n const finalPackageInfo: PackageInfo = {\n ...installResult.packageInfo,\n ...(packageInfo || {}),\n source: normalizedSource,\n tasks,\n };\n await this.handleDuplicateNames(finalPackageInfo);\n // Add to manifest array\n this.manifest.packages.push(finalPackageInfo);\n await this.saveManifest();\n return {\n success: true,\n packageInfo: finalPackageInfo,\n installPath: installResult.installPath,\n };\n } catch (error) {\n return this.installErrorResult(\n filenamify(this.normalizeSource(source), { replacement: '_' }),\n this.app.packagesDir().join(filenamify(this.normalizeSource(source), { replacement: '_' })),\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n private async installNpmPackage(source: string, packagesDir: Path, _packageName: string): Promise<InstallResult> {\n // console.log(`DEBUG: Installing npm package from ${source}`);\n await this.ensurePackagesDirHasPackageJson(packagesDir);\n const nodeRuntime = new NodeRuntime(this.app.tmpDir);\n const result = await nodeRuntime.npmInstall({\n pkg: source,\n prefix: packagesDir.toString(),\n });\n if (!result.success) {\n return {\n success: false,\n error: `Failed to install package: ${result.stderr || result.stdout || 'Unknown error'}`,\n packageInfo: {\n name: _packageName,\n directory: _packageName,\n path: packagesDir.join(_packageName).toString(),\n },\n installPath: packagesDir.join(_packageName).toString(),\n };\n }\n // Find the real installed package name and path\n const { path: actualPackagePath, name: realPackageName } = await this.findRealInstalledNpmPackagePath(packagesDir, source);\n if (!actualPackagePath || !realPackageName) {\n return {\n success: false,\n error: 'Could not find installed npm package directory after install.',\n packageInfo: {\n name: _packageName,\n directory: _packageName,\n path: packagesDir.join(_packageName).toString(),\n },\n installPath: packagesDir.join(_packageName).toString(),\n };\n }\n return {\n success: true,\n packageInfo: {\n name: realPackageName,\n directory: realPackageName,\n path: actualPackagePath.toString(),\n },\n installPath: actualPackagePath.toString(),\n };\n }\n\n private async ensurePackagesDirHasPackageJson(packagesDir: Path): Promise<void> {\n const packageJsonPath = packagesDir.join('package.json');\n if (!(await packageJsonPath.exists())) {\n const packageJson = {\n name: 'hostctl-packages',\n version: '1.0.0',\n description: 'Hostctl package management directory',\n private: true,\n };\n await fs.writeFile(packageJsonPath.toString(), JSON.stringify(packageJson, null, 2));\n }\n }\n\n // Scan node_modules for the real installed package (by name or repo match)\n private async findRealInstalledNpmPackagePath(packagesDir: Path, source: string): Promise<{ path: Path | null, name: string | null }> {\n const nodeModulesPath = packagesDir.join('node_modules');\n if (!(await nodeModulesPath.exists())) {\n console.log(`DEBUG: node_modules does not exist at ${nodeModulesPath.toString()}`);\n return { path: null, name: null };\n }\n const entries = await fs.readdir(nodeModulesPath.toString());\n for (const entry of entries) {\n const potentialPackagePath = nodeModulesPath.join(entry);\n if (await potentialPackagePath.isDirectory()) {\n const packageJsonPath = potentialPackagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n // Prefer a repo match, fallback to first package with a repo\n if (\n (packageJson.repository && typeof packageJson.repository.url === 'string' && packageJson.repository.url.includes(source.replace(/^https?:\\/\\//, '').replace(/\\.git$/, '')))\n || (packageJson.homepage && packageJson.homepage.includes(source.replace(/^https?:\\/\\//, '').replace(/\\.git$/, '')))\n ) {\n return { path: potentialPackagePath, name: packageJson.name };\n }\n // Fallback: if the source is a git url, match the last segment\n const lastSegment = source.split('/').pop()?.replace(/\\.git$/, '');\n if (packageJson.name === lastSegment) {\n return { path: potentialPackagePath, name: packageJson.name };\n }\n } catch {\n // ignore\n }\n }\n }\n }\n // Fallback: just return the first package found\n for (const entry of entries) {\n const potentialPackagePath = nodeModulesPath.join(entry);\n const packageJsonPath = potentialPackagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return { path: potentialPackagePath, name: packageJson.name };\n } catch {\n // ignore\n }\n }\n }\n return { path: null, name: null };\n }\n\n private async getPackageInfoAndTasks(packagePath: Path, fallbackName: string): Promise<{ packageInfo: PackageInfo | null; tasks: TaskInfo[] }> {\n const packageInfo = await this.getPackageInfo(packagePath, fallbackName);\n const tasks = await this.discoverTasks(packagePath);\n return { packageInfo, tasks };\n }\n\n private async handleDuplicateNames(finalPackageInfo: PackageInfo): Promise<void> {\n const actualPackageName = finalPackageInfo.name;\n if (this.hasPackageWithName(actualPackageName)) {\n const existingPackages = this.getPackagesWithName(actualPackageName);\n console.warn(`⚠️ Warning: Package name '${actualPackageName}' already exists.`);\n console.warn(` Existing packages:`);\n existingPackages.forEach((pkg) => {\n console.warn(` - ${pkg.source} (${pkg.directory})`);\n });\n console.warn(` You will need to use the full source URL to run tasks from this package.`);\n }\n }\n\n private installErrorResult(packageName: string, installDir: Path, error?: string): InstallResult {\n return {\n success: false,\n error: error || 'Failed to install package',\n packageInfo: {\n name: packageName,\n directory: packageName,\n path: installDir.toString(),\n },\n installPath: installDir.toString(),\n };\n }\n\n private async getPackageInfo(packagePath: Path, fallbackName?: string): Promise<PackageInfo | null> {\n try {\n const packageJsonPath = packagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return {\n name: packageJson.name || fallbackName || packagePath.basename().toString(),\n version: packageJson.version,\n description: packageJson.description,\n directory: packagePath.basename().toString(),\n path: packagePath.toString(),\n };\n }\n } catch (error) {\n // Ignore errors reading package.json\n }\n return null;\n }\n}\n","import { Path } from '../flex/path';\nimport { A } from '../flex/array';\nimport { App } from '../app';\nimport { PackageManager } from '../commands/pkg/package-manager';\n\n/**\n * Resolves the script reference provided to the `hostctl run` command.\n *\n * This function implements a sophisticated task resolution system that follows a specific precedence order:\n * 1. Built-in core tasks (e.g., `core.file.copy`)\n * 2. Local files or directories on the filesystem\n * 3. Remote packages (npm packages or git repositories)\n *\n * ## Argument Format\n * Accepts a single `pkgTaskArgs` array, which is interpreted as:\n * `[packageRef, scriptRef?, ...scriptArgs]`\n *\n * Where:\n * - `packageRef`: The package reference (core task, local path, or remote package)\n * - `scriptRef`: Optional script/task name within the package\n * - `scriptArgs`: Additional arguments to pass to the script\n *\n * ## Parameter Handling\n * If `scriptRef` contains a colon (`:`), it's treated as a parameter and moved to `scriptArgs`.\n * This allows for flexible parameter passing: `hostctl run package param:value` is equivalent to\n * `hostctl run package param:value`.\n *\n * ## Resolution Precedence\n * 1. **Core Tasks**: `core.*` patterns resolve to built-in tasks in `src/core/`\n * 2. **Local Paths**: Existing files/directories on the filesystem\n * 3. **Remote Packages**: npm packages or git repositories (auto-installed)\n *\n * ## Examples\n * ```bash\n * # Core task\n * hostctl run core.file.copy source:file1 dest:file2\n *\n * # Local directory with default entry point\n * hostctl run ./my-project name:value\n *\n * # Local directory with specific task\n * hostctl run ./my-project hello name:value\n *\n * # Remote npm package\n * hostctl run lodash name:value\n *\n * # Git repository\n * hostctl run https://github.com/user/repo task:name\n * ```\n *\n * @param app - The application instance for configuration and debugging\n * @param pkgTaskArgs - Array of arguments to resolve\n * @returns Promise resolving to script reference and arguments\n * @throws Error if the task cannot be resolved or arguments are invalid\n */\nexport async function resolveTaskPathAndArgs(\n app: App,\n pkgTaskArgs: string[],\n): Promise<{ scriptRef: string; scriptArgs: string[] }> {\n app.debug('resolveTaskPathAndArgs', pkgTaskArgs);\n\n if (!pkgTaskArgs || pkgTaskArgs.length === 0) {\n throw new Error('No task specified');\n }\n\n // Parse the arguments\n let packageRef: string | null = null;\n let scriptRef: string | undefined = undefined;\n let scriptArgs: string[] = [];\n\n if (pkgTaskArgs.length === 1) {\n // Single argument: could be a file, directory, or package\n packageRef = pkgTaskArgs[0];\n } else if (pkgTaskArgs.length >= 2) {\n packageRef = pkgTaskArgs[0];\n scriptRef = pkgTaskArgs[1];\n scriptArgs = pkgTaskArgs.slice(2);\n }\n\n // If scriptRef contains a colon (parameter syntax), treat it as a scriptArg\n if (scriptRef && scriptRef.includes(':')) {\n scriptArgs = [scriptRef, ...scriptArgs];\n scriptRef = undefined;\n }\n\n // If no packageRef, error\n if (!packageRef) {\n throw new Error('No task specified');\n }\n\n // Case 1: Built-in core tasks (highest precedence)\n const coreTaskResult = await resolveCoreTask(packageRef, scriptRef, scriptArgs);\n if (coreTaskResult) {\n return coreTaskResult;\n }\n\n // Case 2: Local files or directories\n const localTaskResult = await resolveLocalTask(app, packageRef, scriptRef, scriptArgs);\n if (localTaskResult) {\n return localTaskResult;\n }\n\n // Case 3: Remote packages (npm packages or git repositories)\n const packageManager = new PackageManager(app);\n const remoteTaskResult = await resolveRemoteTask(app, packageManager, packageRef, scriptRef, scriptArgs);\n if (remoteTaskResult) {\n return remoteTaskResult;\n }\n\n // If we get here, we couldn't resolve the task\n throw new Error(`Could not resolve task: ${packageRef}${scriptRef ? `:${scriptRef}` : ''}`);\n}\n\n/**\n * Resolves built-in core tasks.\n *\n * Core tasks are built-in functionality that follows the pattern `core.*` and\n * are located in the `src/core/` directory. The task path is converted from\n * dot notation to directory structure.\n *\n * Examples:\n * - `core.file.copy` → `src/core/file/copy.ts`\n * - `core.process.list` → `src/core/process/list.ts`\n *\n * @param packageRef - The package reference (must start with 'core.')\n * @param scriptRef - Optional script reference (unused for core tasks)\n * @param scriptArgs - Arguments to pass to the core task\n * @returns Promise resolving to script path and arguments, or null if not a core task\n * @throws Error if the core task file doesn't exist\n */\nasync function resolveCoreTask(\n packageRef: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<{ scriptRef: string; scriptArgs: string[] } | null> {\n // Check if this is a core task (e.g., core.file.copy)\n if (packageRef.startsWith('core.')) {\n const taskPath = packageRef.replace(/^core\\./, '').replace(/\\./g, '/');\n const scriptPath = `src/core/${taskPath}.ts`;\n\n // Check if the core task file exists\n const taskFile = Path.new(scriptPath);\n if (!taskFile.exists()) {\n throw new Error('Core task script not found');\n }\n\n return { scriptRef: scriptPath, scriptArgs };\n }\n\n return null;\n}\n\n/**\n * Resolves local files or directories on the filesystem.\n *\n * This function handles local task resolution with the following logic:\n * 1. Skips git URLs and npm package names (handled by remote resolution)\n * 2. Only considers paths that actually exist on the filesystem\n * 3. Handles both directories (with optional task references) and direct file references\n *\n * For directories:\n * - If no scriptRef, looks for default entry points (index.ts, index.js, main.ts, main.js)\n * - If scriptRef provided, resolves using dotted notation or relative paths\n *\n * For files:\n * - Only accepts .ts and .js files\n * - If scriptRef provided, it's prepended to scriptArgs\n *\n * @param app - The application instance\n * @param path - The local filesystem path to resolve\n * @param scriptRef - Optional script/task reference within the path\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments, or null if not a local task\n */\nasync function resolveLocalTask(\n app: App,\n path: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<{ scriptRef: string; scriptArgs: string[] } | null> {\n // Skip git URLs and npm package names - these should be handled by remote resolution\n if (isGitUrl(path) || isNpmPackageName(path)) {\n return null;\n }\n\n const pathObj = Path.new(path);\n\n // Only consider this a local task if the path actually exists on the filesystem\n // This helps distinguish between local paths and package names that might look similar\n if (!pathObj.exists()) {\n return null;\n }\n\n // Handle directories (local directories only)\n if (pathObj.isDirectory()) {\n return await handleDirectory(pathObj, scriptRef, scriptArgs);\n }\n\n // Handle direct file references\n if (pathObj.isFile() && (pathObj.ext() === '.ts' || pathObj.ext() === '.js')) {\n if (scriptRef) {\n A(scriptArgs).prepend(scriptRef);\n }\n return { scriptRef: pathObj.toString(), scriptArgs };\n }\n\n return null;\n}\n\n/**\n * Checks if a string is likely a git URL.\n *\n * This function uses heuristics to identify various git URL formats:\n * - SSH URLs: `git@github.com:user/repo.git`\n * - HTTPS URLs: `https://github.com/user/repo.git`\n * - Git protocol URLs: `git+https://github.com/user/repo.git`\n * - Common git hosting platforms: GitHub, GitLab, Bitbucket\n *\n * The detection is based on URL patterns and domain names rather than\n * attempting to validate the actual URL format.\n *\n * @param str - The string to check\n * @returns true if the string appears to be a git URL, false otherwise\n */\nfunction isGitUrl(str: string): boolean {\n return (\n str.startsWith('git@') ||\n str.startsWith('git+ssh://') ||\n str.startsWith('git+https://') ||\n str.startsWith('https://github.com/') ||\n str.startsWith('https://gitlab.com/') ||\n str.startsWith('https://bitbucket.org/') ||\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('bitbucket.org')\n );\n}\n\n/**\n * Checks if a string is likely an npm package name.\n *\n * This function uses heuristics to distinguish between npm package names\n * and local filesystem paths. The logic prioritizes avoiding false positives\n * for local paths over catching all possible npm package formats.\n *\n * Rules:\n * - Git URLs are never npm packages\n * - Absolute paths (starting with / or \\) are not npm packages\n * - Paths with backslashes are not npm packages (Windows paths)\n * - Scoped packages (@scope/package) are valid npm packages\n * - Simple package names without slashes are valid npm packages\n *\n * @param str - The string to check\n * @returns true if the string appears to be an npm package name, false otherwise\n */\nfunction isNpmPackageName(str: string): boolean {\n // Simple heuristic for npm package names\n if (isGitUrl(str)) {\n return false;\n }\n\n // Absolute paths are not npm packages\n if (str.startsWith('/') || str.startsWith('\\\\')) {\n return false;\n }\n\n // Relative paths with path separators are not npm packages (unless scoped)\n if (str.includes('\\\\')) {\n return false;\n }\n\n // Allow scoped packages (@scope/package) and regular packages\n if (str.includes('/')) {\n return str.startsWith('@') && str.split('/').length === 2;\n }\n\n // Simple package names\n return true;\n}\n\n/**\n * Resolves remote packages (npm packages or git repositories).\n *\n * This function handles remote package resolution by:\n * 1. Checking if the package is already installed\n * 2. Installing the package if not already present (handles both npm and git)\n * 3. Resolving the task path within the installed package\n *\n * The package manager handles the distinction between npm packages and git\n * repositories automatically during installation.\n *\n * @param app - The application instance\n * @param packageManager - The package manager instance for installation and resolution\n * @param packageRef - The remote package reference (npm package name or git URL)\n * @param scriptRef - Optional script/task reference within the package\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments, or null if not a valid remote package\n */\nasync function resolveRemoteTask(\n app: App,\n packageManager: PackageManager,\n packageRef: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<{ scriptRef: string; scriptArgs: string[] } | null> {\n // Check if it's already installed\n const isInstalled = await packageManager.isPackageInstalled(packageRef);\n\n if (!isInstalled) {\n // Try to install it (this handles both git repos and npm packages)\n const installResult = await packageManager.installPackage(packageRef);\n if (!installResult.success) {\n return null; // Not a valid remote package\n }\n }\n\n // Now try to resolve the task\n const result = await packageManager.resolveTaskPath(packageRef, scriptRef);\n\n if (result) {\n return { scriptRef: result.taskPath, scriptArgs };\n }\n\n return null;\n}\n\n/**\n * Handles directory resolution with optional dotted task notation.\n *\n * This function resolves task references within a directory using the following logic:\n *\n * If scriptRef is provided:\n * 1. Treats dots as directory separators (e.g., `a.b.c` → `a/b/c.{ts,js}`)\n * 2. Prefers .ts files over .js files when both exist\n * 3. Falls back to treating scriptRef as a relative path if dotted notation fails\n *\n * If no scriptRef is provided:\n * 1. Looks for default entry points in order: index.ts, index.js, main.ts, main.js\n * 2. Throws an error if no default entry point is found\n *\n * Examples:\n * - `dir/` + `task` → `dir/task.ts` (or `task.js`)\n * - `dir/` + `nested.task` → `dir/nested/task.ts` (or `task.js`)\n * - `dir/` + `none` → `dir/index.ts` (default entry point)\n *\n * @param dirPath - The directory path to resolve within\n * @param scriptRef - Optional script reference using dotted notation\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments\n * @throws Error if no default entry point is found when scriptRef is not provided\n */\nasync function handleDirectory(\n dirPath: Path,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<{ scriptRef: string; scriptArgs: string[] }> {\n if (scriptRef) {\n // Try to resolve dotted task notation\n const taskParts = scriptRef.split('.');\n const taskFileName = taskParts.pop()!;\n const taskDir = taskParts.length > 0 ? taskParts.join('/') : '';\n\n // Try .ts first, then .js\n const tsPath = taskDir ? dirPath.join(taskDir, `${taskFileName}.ts`) : dirPath.join(`${taskFileName}.ts`);\n const jsPath = taskDir ? dirPath.join(taskDir, `${taskFileName}.js`) : dirPath.join(`${taskFileName}.js`);\n\n if (tsPath.exists()) {\n return { scriptRef: tsPath.toString(), scriptArgs };\n }\n\n if (jsPath.exists()) {\n return { scriptRef: jsPath.toString(), scriptArgs };\n }\n\n // Fallback to treating scriptRef as a relative path\n const resolvedPath = dirPath.resolve(scriptRef);\n return { scriptRef: resolvedPath.toString(), scriptArgs };\n }\n\n // Look for default entry point\n const defaultFiles = ['index.ts', 'index.js', 'main.ts', 'main.js'];\n for (const file of defaultFiles) {\n const filePath = dirPath.join(file);\n if (filePath.exists()) {\n return { scriptRef: filePath.toString(), scriptArgs };\n }\n }\n\n throw new Error(`No default entry point found in directory: ${dirPath}`);\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\n\nconst packageJsonTsTemplate = (packageName: string) => `{\n \"name\": \"${packageName}\",\n \"version\": \"1.0.0\",\n \"description\": \"A hostctl task\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"tsc\"\n },\n \"keywords\": [\"hostctl\"],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"hostctl\": \"latest\"\n },\n \"devDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"@types/node\": \"latest\"\n }\n}\n`;\n\nconst packageJsonJsTemplate = (packageName: string) => `{\n \"name\": \"${packageName}\",\n \"version\": \"1.0.0\",\n \"description\": \"A hostctl task\",\n \"type\": \"module\",\n \"main\": \"index.js\",\n \"scripts\": {},\n \"keywords\": [\"hostctl\"],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"hostctl\": \"latest\"\n }\n}\n`;\n\nconst tsconfigTemplate = `{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"outDir\": \"./dist\"\n },\n \"include\": [\"*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n`;\n\nconst indexTsTemplate = (packageName: string) => {\n // Convert package name to valid TypeScript identifier\n const sanitizedName = packageName\n .replace(/[^a-zA-Z0-9]/g, '') // Remove non-alphanumeric characters\n .replace(/^[0-9]/, '_$&'); // Prefix with underscore if starts with number\n\n const interfaceName = sanitizedName.charAt(0).toUpperCase() + sanitizedName.slice(1);\n\n return `import { task, type TaskContext, Verbosity, type LogLevel } from 'hostctl';\n\nexport interface ${interfaceName}Params {\n // Define your parameters here\n message?: string;\n}\n\nexport interface ${interfaceName}Result {\n success: boolean;\n message: string;\n}\n\nasync function run(context: TaskContext<${interfaceName}Params>): Promise<${interfaceName}Result> {\n const { params, info } = context;\n\n const message = params.message || 'Hello from your new hostctl task!';\n info(message);\n\n return {\n success: true,\n message: message\n };\n}\n\nexport default task(run, { name: '${packageName}', description: 'A sample hostctl task' });\n`;\n};\n\nconst indexJsTemplate = `import { task, Verbosity } from 'hostctl';\n\nasync function run(context) {\n const { params, info } = context;\n\n const message = params.message || 'Hello from your new hostctl task!';\n info(message);\n\n return {\n success: true,\n message: message\n };\n}\n\nexport default task(run, { name: 'sample-task', description: 'A sample hostctl task' });\n`;\n\nconst sampleTaskTsTemplate = (packageName: string) => {\n // Convert package name to valid TypeScript identifier for the task name\n const sanitizedName = packageName\n .replace(/[^a-zA-Z0-9]/g, '') // Remove non-alphanumeric characters\n .replace(/^[0-9]/, '_$&'); // Prefix with underscore if starts with number\n\n const taskName = sanitizedName.charAt(0).toUpperCase() + sanitizedName.slice(1);\n\n return `import { task, type TaskContext, Verbosity, type LogLevel } from 'hostctl';\n\nexport interface ${taskName}SampleParams {\n name: string;\n greeting?: string;\n}\n\nexport interface ${taskName}SampleResult {\n success: boolean;\n greeting: string;\n}\n\nasync function run(context: TaskContext<${taskName}SampleParams>): Promise<${taskName}SampleResult> {\n const { params, info } = context;\n\n const greeting = params.greeting || 'Hello';\n const message = \\`\\${greeting}, \\${params.name}!\\`;\n\n info(message);\n\n return {\n success: true,\n greeting: message\n };\n}\n\nexport default task(run, { name: 'sample-task', description: 'Greets {{name}} with {{greeting}}' });\n`;\n};\n\nconst sampleTaskJsTemplate = `import { task, Verbosity } from 'hostctl';\n\nasync function run(context) {\n const { params, info } = context;\n\n const greeting = params.greeting || 'Hello';\n const message = \\`\\${greeting}, \\${params.name}!\\`;\n\n info(message);\n\n return {\n success: true,\n greeting: message\n };\n}\n\nexport default task(run, { name: 'sample-task', description: 'Greets {{name}} with {{greeting}}' });\n`;\n\nconst readmeTemplate = (packageName: string) => `# ${packageName}\n\nThis is a hostctl task package.\n\n## Usage\n\n### Run without installing\n\n\\`\\`\\`\n❯ npx hostctl run https://github.com/yourusername/${packageName} message:Hello\n\\`\\`\\`\n\n### Publish to npm and run\n\n\\`\\`\\`\n❯ npm publish\n❯ npx hostctl run ${packageName} message:Hello\n\\`\\`\\`\n\n### Install locally and run\n\n\\`\\`\\`\n❯ npx hostctl install https://github.com/yourusername/${packageName}\n❯ npx hostctl run ${packageName} message:Hello\n\\`\\`\\`\n\n## About\n\nThis is a hostctl task package that demonstrates the basic structure for creating reusable tasks.\n`;\n\nconst gitignoreTemplate = `node_modules/\ndist/\n*.log\n.DS_Store\n.env\n`;\n\nexport async function createPackage(packageName: string, options: { lang: 'typescript' | 'javascript' }) {\n const packageDir = path.join(process.cwd(), packageName);\n await fs.mkdir(packageDir, { recursive: true });\n\n if (options.lang === 'typescript') {\n await fs.writeFile(path.join(packageDir, 'package.json'), packageJsonTsTemplate(packageName));\n await fs.writeFile(path.join(packageDir, 'tsconfig.json'), tsconfigTemplate);\n await fs.writeFile(path.join(packageDir, 'index.ts'), indexTsTemplate(packageName));\n await fs.writeFile(path.join(packageDir, 'sample-task.ts'), sampleTaskTsTemplate(packageName));\n await fs.writeFile(path.join(packageDir, 'README.md'), readmeTemplate(packageName));\n await fs.writeFile(path.join(packageDir, '.gitignore'), gitignoreTemplate);\n } else {\n await fs.writeFile(path.join(packageDir, 'package.json'), packageJsonJsTemplate(packageName));\n await fs.writeFile(path.join(packageDir, 'index.js'), indexJsTemplate);\n await fs.writeFile(path.join(packageDir, 'sample-task.js'), sampleTaskJsTemplate);\n await fs.writeFile(path.join(packageDir, 'README.md'), readmeTemplate(packageName));\n await fs.writeFile(path.join(packageDir, '.gitignore'), gitignoreTemplate);\n }\n\n console.log(`Created new hostctl package '${packageName}' at ${packageDir}`);\n console.log(`\\nNext steps:`);\n console.log(`1. cd ${packageName}`);\n console.log(`2. npm install`);\n if (options.lang === 'typescript') {\n console.log(`3. Edit index.ts and sample-task.ts to implement your tasks`);\n } else {\n console.log(`3. Edit index.js and sample-task.js to implement your tasks`);\n }\n console.log(`4. Test your package with: npx hostctl run .`);\n console.log(`\\nNote: The package includes 'hostctl' as a dependency for local development.`);\n console.log(`For production, you may want to add it as a peer dependency instead.`);\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\n\nexport async function installPackage(source: string, app: App) {\n const packageManager = new PackageManager(app);\n const result = await packageManager.installPackage(source);\n\n if (result.success) {\n console.log(`Installed package '${result.packageInfo.name}' from ${source} to ${result.installPath}`);\n } else {\n console.error(`Failed to install package from ${source}: ${result.error}`);\n throw new Error(result.error);\n }\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\nimport chalk from 'chalk';\n\nexport async function listPackages(app: App): Promise<void> {\n const packageManager = new PackageManager(app);\n\n try {\n const packages = await packageManager.listPackages();\n\n if (packages.length === 0) {\n console.log('No packages installed.');\n return;\n }\n\n // Group packages by name to detect duplicates\n const packagesByName = new Map<string, typeof packages>();\n packages.forEach((pkg) => {\n if (!packagesByName.has(pkg.name)) {\n packagesByName.set(pkg.name, []);\n }\n packagesByName.get(pkg.name)!.push(pkg);\n });\n\n // Display the packages\n console.log(`Found ${packages.length} package(s):\\n`);\n\n packages.forEach((pkg) => {\n const packagesWithSameName = packagesByName.get(pkg.name)!;\n const hasDuplicates = packagesWithSameName.length > 1;\n\n let output = `• ${pkg.name}`;\n if (pkg.version) {\n output += ` (v${pkg.version})`;\n }\n if (pkg.description) {\n output += ` - ${pkg.description}`;\n }\n\n // Color the package name if it has duplicates\n if (hasDuplicates) {\n output = chalk.yellow(output);\n output += chalk.yellow(' ⚠️ (duplicate name)');\n }\n\n // Show source URL if available\n if (pkg.source) {\n if (pkg.source.startsWith('http') || pkg.source.startsWith('git@')) {\n // Git repository\n output += `\\n 📦 Source: ${pkg.source}`;\n } else if (!pkg.source.startsWith('.') && !pkg.source.startsWith('/')) {\n // NPM package\n output += `\\n 📦 Source: https://www.npmjs.com/package/${pkg.source}`;\n } else {\n // Local directory\n output += `\\n 📦 Source: ${pkg.source}`;\n }\n }\n\n console.log(output);\n\n // Show tasks if available\n if (pkg.tasks && pkg.tasks.length > 0) {\n pkg.tasks.forEach((task) => {\n console.log(` └─ ${task.name}`);\n });\n } else {\n console.log(` └─ (no tasks discovered)`);\n }\n console.log('');\n });\n\n // Show warning for duplicate names\n const duplicateNames = Array.from(packagesByName.entries())\n .filter(([_, pkgs]) => pkgs.length > 1)\n .map(([name, _]) => name);\n\n if (duplicateNames.length > 0) {\n console.log(chalk.yellow('⚠️ Warning: The following package names have duplicates:'));\n duplicateNames.forEach((name) => {\n console.log(chalk.yellow(` - ${name}`));\n });\n console.log(chalk.yellow(' Use the full source URL to run tasks from these packages.'));\n console.log('');\n }\n } catch (error) {\n console.error('Error listing packages:', error);\n throw error;\n }\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\n\nexport async function removePackage(packageIdentifier: string, app: App): Promise<void> {\n const packageManager = new PackageManager(app);\n const result = await packageManager.removePackage(packageIdentifier);\n\n if (result.success && result.packageInfo) {\n console.log(`Successfully removed package '${result.packageInfo.name}' (${result.packageInfo.directory})`);\n } else {\n console.error(`Failed to remove package: ${result.error}`);\n return;\n }\n}\n","#!/usr/bin/env -S npx tsx\n\n// #!/usr/bin/env node\n// #!/usr/bin/env -S npx tsx\n// #!/usr/bin/env -S node --import=tsx/esm\n\nimport { Cli } from '../cli';\n\nconst cli = new Cli();\ncli.program.parseAsync(process.argv).catch((error) => {\n // Minimal top-level error handling for the binary,\n // more detailed errors should be handled within Cli/App.\n console.error('Unhandled error in hostctl binary:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["process","process","fs","homedir","fs","os","path","globSync","each","map","select","each","keys","map","select","values","isEmpty","matches","path","compact","each","isEmpty","map","values","select","A","each","isEmpty","map","A","process","readFile","existsSync","readFileSync","win32","posix","path","existsSync","win32","posix","readFileSync","readFile","path","process","fs","path","fs","path","identity","fs","SecretValue","Secret","A","ConfigFile","path","os","globSync","ConfigFile","matches","util","chalk","Handlebars","Mutex","A","Mutex","Handlebars","errnoError","Handlebars","command","fs","StringBuilder","StringBuilder","chalk","Handlebars","path","chalk","ConfigFile","os","match","match","P","platform","os","A","match","url","path","match","A","keys","Mutex","match","fs","fs","task","path","A","Mutex","task","App","process","homedir","chalk","A","cmd","match","isError","result","ConfigFile","identity","invocation","path","fs","path","chalk","task","isError","App","process"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli.ts","../../src/app.ts","../../src/handlebars.ts","../../src/config.ts","../../src/config-file.ts","../../src/flex/function.ts","../../src/flex/protocol.ts","../../src/flex/type.ts","../../src/flex/compactable.ts","../../src/flex/enumerator.ts","../../src/flex/enumerable.ts","../../src/flex/mappable.ts","../../src/flex/selectable.ts","../../src/flex/array-protocols.ts","../../src/flex/map.ts","../../src/flex/map-protocols.ts","../../src/flex/object.ts","../../src/flex/object-protocols.ts","../../src/flex/path.ts","../../src/flex/platform.ts","../../src/flex/string.ts","../../src/flex/range.ts","../../src/flex/equal.ts","../../src/flex/range-protocols.ts","../../src/flex/set-protocols.ts","../../src/flex/array.ts","../../src/flex/set.ts","../../src/flex/pipe.ts","../../src/tempfile.ts","../../src/flex/file.ts","../../src/host.ts","../../src/age-encryption.ts","../../src/process.ts","../../src/config-provider/provider-config.ts","../../src/config-provider/file-config-provider.ts","../../src/config-provider/http-config-provider.ts","../../src/interaction-handler.ts","../../src/local-runtime.ts","../../src/stacktrace.ts","../../src/runtime-base.ts","../../src/command.ts","../../src/verbosity.ts","../../src/task.model.ts","../../src/remote-runtime.ts","../../src/ssh-session.ts","../../src/util/input-helpers.ts","../../src/ruspty-command.ts","../../src/node-runtime.ts","../../src/http.ts","../../src/unarchive.ts","../../src/zip.ts","../../src/hash.ts","../../src/param-map.ts","../../src/runtime.ts","../../src/version.ts","../../src/core/remote/runAllRemote.ts","../../src/commands/pkg/package-manager.ts","../../src/task-registry-loader.ts","../../src/cli/resolve-task-and-args.ts","../../src/commands/pkg/create.ts","../../src/commands/pkg/install.ts","../../src/commands/pkg/list.ts","../../src/commands/pkg/remove.ts","../../src/task-discovery.ts","../../src/config-provider/memory-config-provider.ts","../../src/bin/hostctl.ts"],"sourcesContent":["import process from 'node:process';\nimport path from 'node:path';\nimport * as cmdr from 'commander';\nimport * as Z from 'zod';\n\nimport { App } from './app';\nimport { Verbosity } from './verbosity';\nimport { File } from './flex/file';\nimport { version } from './version';\nimport { createPackage } from './commands/pkg/create';\nimport { installPackage } from './commands/pkg/install';\nimport { listPackages } from './commands/pkg/list';\nimport { removePackage } from './commands/pkg/remove';\n\nimport JSON5 from 'json5';\nimport { Path } from './flex/path';\n\nimport { resolveTaskPathAndArgs } from './cli/resolve-task-and-args';\nimport { PackageManager } from './commands/pkg/package-manager';\nimport { collectTaskMeta } from './task-discovery';\nimport { MemoryConfigProvider } from './config-provider/memory-config-provider';\n\n/**\n * Type guard to check if an `unknown` value is an `Error` object.\n *\n * @param value - The value to check.\n *\n * @returns `true` if the value is an `Error` object, otherwise `false`.\n */\nexport const isError = (value: unknown): value is Error =>\n !!value &&\n typeof value === 'object' &&\n 'message' in value &&\n typeof value.message === 'string' &&\n 'stack' in value &&\n typeof value.stack === 'string';\n\nconst logError = (message: string, error: unknown): void => {\n console.error(`Error: ${message}`); // Print the primary message to stderr\n if (isError(error)) {\n console.error(error.stack); // Print stack to stderr\n } else {\n try {\n // For unknown errors, create a new error to get a stack trace pointing to this logError call\n const unknownError = new Error(\n `Unexpected value thrown: ${typeof error === 'object' ? JSON.stringify(error) : String(error)}`,\n );\n console.error(unknownError.stack);\n } catch {\n console.error(new Error(`Unexpected value thrown: non-stringifiable object`).stack);\n }\n }\n};\n\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch (_) {\n return false;\n }\n}\n\nfunction shouldSkipConfig(envValue: string | undefined): boolean {\n if (!envValue) return false;\n const normalized = envValue.trim().toLowerCase();\n return normalized === '1' || normalized === 'true';\n}\n\nfunction collectConfigHeader(value: string, previous: string[]): string[] {\n return previous.concat(value);\n}\n\nfunction parseHeaderEntry(entry: string): [string, string] {\n const index = entry.indexOf(':');\n if (index === -1) {\n throw new Error(`Invalid config header \"${entry}\". Expected \"Header-Name: value\".`);\n }\n const name = entry.slice(0, index).trim();\n const value = entry.slice(index + 1).trim();\n if (!name) {\n throw new Error(`Invalid config header \"${entry}\". Header name is required.`);\n }\n return [name, value];\n}\n\nfunction parseHeaderMap(raw: string | undefined): Record<string, string> {\n if (!raw) return {};\n const parsed = JSON5.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('HOSTCTL_CONFIG_HEADERS must be a JSON object map of header names to values.');\n }\n return Object.entries(parsed).reduce<Record<string, string>>((acc, [key, value]) => {\n if (typeof value === 'string') {\n acc[key] = value;\n return acc;\n }\n acc[key] = String(value);\n return acc;\n }, {});\n}\n\nfunction buildConfigAuthOptions(options: Record<string, any>): { token?: string; headers?: Record<string, string> } {\n const token = options.configToken ?? process.env.HOSTCTL_CONFIG_TOKEN;\n const envHeaders = parseHeaderMap(process.env.HOSTCTL_CONFIG_HEADERS);\n const headerEntries = options.configHeader ?? [];\n const headerList = Array.isArray(headerEntries) ? headerEntries : [headerEntries];\n const optionHeaders = headerList.reduce<Record<string, string>>((acc, entry) => {\n if (typeof entry !== 'string') {\n return acc;\n }\n const [name, value] = parseHeaderEntry(entry);\n acc[name] = value;\n return acc;\n }, {});\n const headers = { ...envHeaders, ...optionHeaders };\n return {\n token,\n headers: Object.keys(headers).length ? headers : undefined,\n };\n}\n\n// per example at https://github.com/tj/commander.js/blob/HEAD/examples/options-custom-processing.js\nfunction increaseVerbosity(dummyValue: any, previous: number) {\n return previous + 1;\n}\n\nfunction decreaseVerbosity(dummyValue: any, previous: number) {\n return previous - 1;\n}\n\nexport class Cli {\n public app: App;\n public program: cmdr.Command;\n\n constructor() {\n this.app = new App();\n\n this.program = new cmdr.Command();\n\n this.program\n .configureHelp({ showGlobalOptions: true })\n .name('hostctl')\n .version(version)\n .option('-q, --quiet', 'quiet; be less verbose; may be specified multiple times', decreaseVerbosity, 0)\n .option(\n '-v, --verbose',\n 'verbose; may be specified multiple times for increased verbosity',\n increaseVerbosity,\n Verbosity.WARN,\n )\n .option('-c, --config <file path>', 'config file path or http endpoint')\n .option('--config-token <token>', 'bearer token for HTTP config requests')\n .option(\n '--config-header <header>',\n 'additional HTTP config header (repeatable, format: \"Header-Name: value\")',\n collectConfigHeader,\n [],\n )\n .option('--json', 'output should be json formatted')\n .option('-p, --password', 'should prompt for sudo password?', false)\n .option('-t, --tag <tags...>', 'specify a tag (repeat for multiple tags)');\n\n this.program\n .command('exec')\n .alias('e')\n .argument(\n '<command...>',\n `the command string to run, with optional arguments (e.g. hostctl exec sudo sh -c 'echo \"$(whoami)\"')`,\n )\n .description('execute a command on the selected hosts (default)')\n .action(this.handleExec.bind(this));\n\n const inventoryCmd = this.program.command('inventory').alias('i').description('manage inventory and view reports');\n\n inventoryCmd\n .command('report', { isDefault: true })\n .description('print out an inventory report (default)')\n .action(this.handleInventory.bind(this));\n\n inventoryCmd\n .command('encrypt')\n .alias('e')\n .description('encrypt the inventory file')\n .action(this.handleInventoryEncrypt.bind(this));\n\n inventoryCmd\n .command('decrypt')\n .alias('d')\n .description('decrypt the inventory file')\n .action(this.handleInventoryDecrypt.bind(this));\n\n inventoryCmd\n .command('list')\n .alias('ls')\n .alias('l')\n .description('list the hosts in the inventory file')\n .action(this.handleInventoryList.bind(this));\n\n const pkgCmd = this.program.command('pkg').description('manage hostctl packages');\n\n pkgCmd\n .command('create <package-path>')\n .description('create a new hostctl package (path is relative to cwd unless absolute)')\n .option('--lang <language>', 'the language for the package (typescript or javascript)', 'typescript')\n .hook('preAction', (thisCommand, actionCommand) => {\n const options = actionCommand.opts();\n const supportedLanguages = ['typescript', 'javascript'];\n if (!supportedLanguages.includes(options.lang)) {\n console.error(\n `Error: Unsupported language '${options.lang}'. Supported languages are: ${supportedLanguages.join(', ')}`,\n );\n process.exit(1);\n }\n })\n .action(this.handlePkgCreate.bind(this));\n\n pkgCmd\n .command('install <package-source>')\n .description('install a hostctl package')\n .action(this.handlePkgInstall.bind(this));\n\n pkgCmd\n .command('list')\n .alias('ls')\n .description('list installed hostctl packages')\n .action(this.handlePkgList.bind(this));\n\n pkgCmd\n .command('remove <package-identifier>')\n .alias('rm')\n .description('remove an installed hostctl package')\n .action(this.handlePkgRemove.bind(this));\n\n this.program\n .command('run')\n .alias('r')\n .argument(\n '[pkgTaskArgs...]',\n `The package, task, and arguments to run. Examples:\n - hostctl run ./my-script.ts\n - hostctl run ./my-package/ mytask param1:foo param2:bar\n - hostctl run hostctl-hello goodbye name:Phil\n - hostctl run https://github.com/hostctl/core echo args:hello,world\n `,\n )\n .description('run a hostctl script (default)')\n .option(\n '-f, --file <path>',\n 'runtime parameters should be read from file at <path> containing json object representing params to supply to the script',\n )\n .option(\n '-p, --params \"<json object>\"',\n 'runtime parameters supplied as a string to be parsed as a json object representing params to supply to the script',\n )\n .option('-r, --remote', 'run the script on remote hosts specified by tags via SSH orchestration')\n .action(this.handleRun.bind(this));\n\n const runtimeCmd = this.program\n .command('runtime')\n .alias('rt')\n .description('print out a report of the runtime environment')\n .action(this.handleRuntime.bind(this));\n\n runtimeCmd\n .command('install')\n .alias('i')\n .description('install a temporary runtime environment on the local host if needed')\n .action(this.handleRuntimeInstall.bind(this));\n\n this.program\n .command('tasks')\n .description('list tasks available in a package or path')\n .argument('[package-or-path...]', 'npm package spec, installed package name, or local path')\n .option('--task <name>', 'filter to a specific task name')\n .option('--json', 'output should be json formatted')\n .action(this.handleTasksList.bind(this));\n }\n\n async handleInventory(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.printInventoryReport();\n }\n\n async handleInventoryEncrypt(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.encryptInventoryFile();\n }\n\n async handleInventoryDecrypt(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.decryptInventoryFile();\n }\n\n async handleInventoryList(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n if (!this.app.config) {\n console.log('Configuration could not be loaded. Cannot list hosts.');\n if (!this.app.configRef) {\n console.log('(Also, no configuration file path was found by the app instance)');\n }\n return;\n }\n\n console.log('Config file: ' + this.app.configRef);\n\n const hosts = this.app.selectedInventory(); // Use tags from options if provided\n if (hosts.length > 0) {\n console.log('\\nHosts in inventory:');\n hosts.forEach((host) => {\n let hostIdentifier = host.shortName || '(Unnamed host)';\n console.log(` - ${hostIdentifier}`);\n if (host.tags && host.tags.length > 0) {\n console.log(` Tags: ${host.tags.join(', ')}`);\n }\n });\n } else {\n const selectedTagsSet = this.app.selectedTags;\n const selectedTagsArray = Array.from(selectedTagsSet);\n if (selectedTagsArray.length > 0) {\n console.log(`No hosts found matching tags: ${selectedTagsArray.join(', ')}`);\n } else {\n console.log('No hosts found in the inventory.');\n }\n }\n }\n\n async handleExec(commandParts: string | string[], options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.warn(`Executing command: ${commandParts}`);\n\n const result = await this.app.execute(commandParts);\n\n // Propagate exit status so that callers can detect failures\n if (!result.success) {\n // Non-zero indicates at least one host failed\n process.exitCode = 1;\n }\n }\n\n async handleRun(pkgTaskArgs: string[], options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n this.app.debug(`tags: ${opts.tag}, remote: ${opts.remote}`);\n\n // Resolve script path using helper\n let resolved;\n try {\n resolved = await resolveTaskPathAndArgs(this.app, pkgTaskArgs);\n } catch (error) {\n if (error instanceof Error && error.message.includes('Multiple packages found with name')) {\n console.error('Error:', error.message);\n console.error('\\nTo resolve this, use the full source URL instead of just the package name.');\n console.error('For example:');\n console.error(' ./hostctl run <full-source-url> <task-name>');\n process.exitCode = 1;\n return;\n }\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n return;\n }\n const scriptArgs = resolved.scriptArgs;\n\n let params: object = {};\n try {\n if (options.params) {\n params = JSON5.parse(options.params);\n } else if (options.file) {\n const contents = File.readSync(options.file);\n params = JSON5.parse(contents);\n } else {\n params = this.app.parseParams(scriptArgs);\n }\n } catch (err) {\n this.app.error(\n `Failed to parse params as JSON5: ${(err as Error).message}`,\n `params: ${JSON5.stringify(options.params)}`,\n );\n throw new Error(`Failed to parse params as JSON5: ${(err as Error).message}`);\n }\n\n if (resolved.kind === 'script' && !resolved.scriptRef) {\n this.program.help();\n }\n\n if (resolved.kind === 'registry') {\n const taskName = resolved.task.task?.name ?? 'unknown';\n this.app.debug(`Resolved registry task: ${taskName}`);\n } else {\n this.app.debug(`Resolved script: ${resolved.scriptRef}`);\n }\n this.app.debug(`Script params: ${JSON.stringify(params)}`);\n\n let result;\n if (resolved.kind === 'registry') {\n result = await this.app.runTaskDefinition(resolved.task, params, { remote: opts.remote });\n } else if (opts.remote) {\n result = await this.app.runScriptRemote(resolved.scriptRef, params);\n } else {\n result = await this.app.runScript(resolved.scriptRef, params);\n }\n\n // Set exit code based on result type and content\n if (result instanceof Error) {\n // If the result is an Error object, it's an unexpected error\n process.exitCode = 1;\n } else if (result && typeof result === 'object') {\n // For remote results (map of host -> result), check if any host failed\n if (Object.values(result).some((v: any) => v instanceof Error)) {\n process.exitCode = 1;\n } else if (\n Object.values(result).some((v: any) => v && typeof v === 'object' && 'success' in v && v.success === false)\n ) {\n // Check if any host has success: false\n process.exitCode = 1;\n } else if (\n Object.values(result).some((v: any) => v && typeof v === 'object' && 'success' in v && v.success === true)\n ) {\n // If any host has success: true, set exit code to 0\n process.exitCode = 0;\n } else {\n // Default to success if no success field is found\n process.exitCode = 0;\n }\n } else {\n // For non-object results, assume success\n process.exitCode = 0;\n }\n }\n\n deriveConfigRef(suppliedConfigRef?: string): string {\n // 1. If suppliedConfigRef is an existing file, use it.\n if (suppliedConfigRef && Path.new(suppliedConfigRef).isFile()) {\n return Path.new(suppliedConfigRef).toString();\n }\n\n // 2. Search CWD and ancestors for hostctl.yaml\n const foundPath = Path.cwd()\n .selfAndAncestors()\n .find((p) => p.join('hostctl.yaml').isFile());\n if (foundPath) {\n return foundPath.join('hostctl.yaml').toString();\n }\n\n // 3. Check for ~/.hostctl/hostctl.yaml\n const homeConfigPath = Path.homeDir().join('.hostctl', 'hostctl.yaml');\n if (homeConfigPath.isFile()) {\n return homeConfigPath.toString();\n }\n\n // 4. If a configRef was supplied (e.g. -c URL or -c non-existent-file), use that.\n // This allows `load()` to handle it as a ConfigUrl or report non-existence.\n if (suppliedConfigRef && isValidUrl(suppliedConfigRef)) {\n return suppliedConfigRef;\n }\n\n // 5. Otherwise, error out\n throw new Error(\n \"Could not find a hostctl configuration file. Searched for 'hostctl.yaml' in the current directory, ancestor directories, and '~/.hostctl/hostctl.yaml'. If you intended to use a URL or a specific file path, please ensure it's correct and accessible via the -c option.\",\n );\n }\n\n async loadApp(opts: Record<string, any>) {\n const configAuth = buildConfigAuthOptions(opts);\n if (opts.config) {\n await this.app.loadConfig(opts.config, configAuth);\n } else if (shouldSkipConfig(process.env.HOSTCTL_E2E_SKIP_CONFIG)) {\n await this.app.loadConfigFromProvider(new MemoryConfigProvider());\n } else {\n await this.app.loadConfig(undefined, configAuth);\n }\n\n const verbosity = opts.quiet + opts.verbose;\n this.app.setVerbosity(verbosity);\n if (opts.json) {\n this.app.setOutputStyle('json');\n } else {\n this.app.setOutputStyle('plain');\n }\n let tagsToSet: string[] = [];\n if (typeof opts.tag === 'string') {\n tagsToSet = [opts.tag];\n } else if (Array.isArray(opts.tag)) {\n tagsToSet = opts.tag;\n }\n this.app.setSelectedTags(tagsToSet);\n }\n\n async run() {\n try {\n await this.program.parseAsync(process.argv);\n } catch (e) {\n logError('hostctl error:', e);\n }\n }\n\n async handleRuntime(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.printRuntimeReport();\n }\n\n async handleRuntimeInstall(options: Record<string, any>, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n await this.app.installRuntime();\n }\n\n async handlePkgCreate(packageName: string, options: { lang: 'typescript' | 'javascript' }) {\n await createPackage(packageName, options);\n }\n\n async handlePkgInstall(source: string) {\n await this.loadApp(this.program.opts());\n try {\n await installPackage(source, this.app);\n } catch (error) {\n console.error(\n `Failed to install package from ${source}: ${error instanceof Error ? error.message : String(error)}`,\n );\n process.exitCode = 1;\n }\n }\n\n async handlePkgList() {\n await this.loadApp(this.program.opts());\n await listPackages(this.app);\n }\n\n async handlePkgRemove(packageIdentifier: string) {\n await this.loadApp(this.program.opts());\n await removePackage(packageIdentifier, this.app);\n }\n\n async handleTasksList(specParts: string[] | string, options: { task?: string }, cmd: cmdr.Command) {\n const opts = cmd.optsWithGlobals();\n await this.loadApp(opts);\n\n const packageManager = new PackageManager(this.app);\n\n // Normalize spec input\n let spec: string | undefined;\n let taskFilter = options.task as string | undefined;\n if (Array.isArray(specParts)) {\n if (specParts.length === 0) {\n spec = '.';\n } else if (specParts[0] === 'list' && specParts.length >= 2) {\n spec = specParts[1];\n } else {\n spec = specParts[0];\n }\n } else {\n spec = specParts || '.';\n }\n\n // Allow \"hostctl tasks <taskName>\" to default to the current directory\n if (!taskFilter && spec && spec.includes('.') && !Path.new(spec).exists()) {\n taskFilter = spec;\n spec = '.';\n }\n\n // Determine package path\n const specPath = Path.new(spec);\n let packagePath: string | null = null;\n\n if (specPath.exists()) {\n packagePath = specPath.isFile() ? specPath.parent().absolute().toString() : specPath.absolute().toString();\n } else {\n const installed = await packageManager.getPackageByIdentifier(spec);\n if (installed) {\n packagePath = Path.new(installed.path).absolute().toString();\n } else {\n const installResult = await packageManager.installPackage(spec);\n if (!installResult.success) {\n console.error(`Failed to resolve package '${spec}': ${installResult.error}`);\n process.exitCode = 1;\n return;\n }\n packagePath = Path.new(installResult.packageInfo.path).absolute().toString();\n }\n }\n\n if (!packagePath) {\n console.error(`Could not resolve package or path: ${spec}`);\n process.exitCode = 1;\n return;\n }\n\n const metas = await collectTaskMeta(packagePath);\n const rows = metas\n .filter((m) => (taskFilter ? m.name === taskFilter : true))\n .map((m) => {\n const moduleRel = m.modulePath\n ? path.relative(packagePath, m.modulePath) || path.basename(m.modulePath)\n : undefined;\n return {\n name: m.name,\n description: m.description ?? '',\n module: moduleRel,\n inputSchema: m.inputSchema,\n outputSchema: m.outputSchema,\n schemaSource: m.schemaSource,\n };\n });\n\n if (opts.json) {\n const sanitized = rows.map((r) => ({\n name: r.name,\n description: r.description,\n module: r.module,\n inputSchema: Boolean(r.inputSchema),\n outputSchema: Boolean(r.outputSchema),\n schemaSource: r.schemaSource,\n }));\n console.log(JSON.stringify(sanitized, null, 2));\n return;\n }\n\n if (rows.length === 0) {\n const target = taskFilter ? `${taskFilter} in ${packagePath}` : packagePath;\n console.log(`No tasks found in ${target}`);\n return;\n }\n\n console.log(`Tasks in ${packagePath}${taskFilter ? ` (filtered to ${taskFilter})` : ''}:`);\n rows.forEach((row) => {\n console.log(`- ${row.name}${row.module ? ` (${row.module})` : ''}`);\n console.log(` description: ${row.description || 'no description'}`);\n if (row.inputSchema) {\n const lines = formatSchemaLines(row.inputSchema);\n if (lines.length) {\n console.log(' input:');\n lines.forEach((line) => console.log(` ${line}`));\n }\n }\n if (row.outputSchema) {\n const lines = formatSchemaLines(row.outputSchema);\n if (lines.length) {\n console.log(' output:');\n lines.forEach((line) => console.log(` ${line}`));\n }\n }\n });\n }\n}\n\nfunction summarizeType(val: any): { type?: string; desc?: string } {\n const def = val?._def ?? val?.def;\n const tn = def?.typeName || def?.type;\n if (!tn) return {};\n const desc = def?.description;\n switch (tn) {\n case 'ZodOptional':\n case 'optional':\n case 'ZodNullable':\n case 'nullable':\n return summarizeType(def.innerType || def.type);\n case 'ZodEffects':\n return summarizeType(def.schema);\n case 'ZodString':\n case 'string':\n return { type: 'string', desc };\n case 'ZodNumber':\n case 'number':\n return { type: 'number', desc };\n case 'ZodBoolean':\n case 'boolean':\n return { type: 'boolean', desc };\n case 'ZodArray':\n case 'array': {\n const innerSource = def.element ?? def.type;\n const inner = summarizeType(innerSource);\n return inner.type ? { type: `array<${inner.type}>`, desc: desc || inner.desc } : {};\n }\n case 'ZodUnion':\n case 'union': {\n const options = def.options || [];\n const types = options.map((o: any) => summarizeType(o).type).filter(Boolean);\n return types.length ? { type: types.join(' | '), desc } : {};\n }\n case 'ZodLiteral':\n case 'literal':\n return { type: JSON.stringify(def.value), desc };\n case 'ZodObject':\n case 'object':\n return { type: 'object', desc };\n default:\n return { type: String(tn).replace(/^Zod/, '').toLowerCase(), desc };\n }\n}\n\nfunction formatSchemaLines(schema: any): string[] {\n if (!schema) return ['none'];\n const def = schema._def ?? schema.def;\n const shapeSource = def?.shape || def?.shape_;\n const shape = shapeSource ? (typeof shapeSource === 'function' ? shapeSource.call(def) : shapeSource) : undefined;\n if (shape && typeof shape === 'object') {\n const lines = Object.entries(shape)\n .map(([key, val]) => {\n const summary = summarizeType(val);\n const anyVal: any = val;\n const tn = anyVal?._def?.typeName || anyVal?.def?.type;\n const typeString = summary.type || (tn ? String(tn).replace(/^Zod/, '').toLowerCase() : undefined);\n const desc = summary.desc;\n const optional = tn === 'ZodOptional' || tn === 'ZodNullable';\n const typePart = typeString ? `: ${typeString}` : '';\n const descPart = desc ? ` - ${desc}` : '';\n return `- ${key}${optional ? '?' : ''}${typePart}${descPart}`;\n })\n .filter(Boolean) as string[];\n return lines;\n }\n const summary = summarizeType(schema);\n return summary.type ? [`- ${summary.type}${summary.desc ? ` - ${summary.desc}` : ''}`] : [];\n}\n","import process from 'node:process';\nimport * as fs from 'node:fs';\nimport { homedir } from 'node:os';\nimport Handlebars from './handlebars';\n\n// import Emittery from \"emittery\"; // Believed to be unused\nimport { type Config, load } from './config';\nimport type { ConfigProvider } from './config-provider';\nimport { ProviderConfig } from './config-provider/provider-config';\nimport { FileConfigProvider } from './config-provider/file-config-provider';\nimport { HttpConfigProvider } from './config-provider/http-config-provider';\nimport type { ISecret, IRecipientGroup } from './config';\n\nexport type AppConfig = Config; // Alias for the main application configuration type\nimport { Host } from './host';\nimport { InteractionHandler } from './interaction-handler';\n\nimport { A } from './flex/array';\nimport { Path } from './flex/path';\nimport * as util from 'node:util';\nimport { ConfigFile } from './config-file';\nimport chalk from 'chalk';\nimport { S } from './flex/set';\nimport { password as promptPassword } from '@inquirer/prompts';\nimport { Listr } from 'listr2';\nimport { isError } from './cli';\nimport { LocalRuntime, type LocalInvocation } from './local-runtime';\nimport { TmpFileRegistry } from './tempfile';\nimport { NodeRuntime } from './node-runtime';\nimport { zipDirectory } from './zip';\nimport { sha256 } from './hash';\nimport { ParamMap } from './param-map';\nimport { Verbosity, type VerbosityLevel } from './verbosity';\nimport {\n type IInvocation,\n type RunFnReturnValue,\n type TaskFn,\n type TaskContext,\n type LogLevel,\n type TaskParams,\n type TaskPartialFn,\n type RunFn,\n} from './runtime';\nimport { Task } from './task.model';\nimport { RemoteInvocation, RemoteRuntime } from './remote-runtime';\nimport { version } from './version';\nimport { retryUntilDefined } from 'ts-retry';\nimport { Mutex } from 'async-mutex';\nimport { Command } from './command';\nimport { type CommandResult, type EnvVarObj } from './command'; // EnvVarObj from command.ts\nimport { VP } from './flex/pipe';\nimport { match } from 'ts-pattern';\nimport { SSHSession } from './ssh-session';\nimport runAllRemote, {\n type RunParams as RemoteRunParams,\n type RunResult as RemoteRunResult,\n} from './core/remote/runAllRemote';\nimport { CHECKMARK, withSudo, XMARK } from './util/input-helpers';\nimport { resolveTaskPathAndArgs } from './cli/resolve-task-and-args';\n\ntype HostSelector = { names?: string[]; tags?: string[] };\n\nexport type TaskTreeNode = {\n id: string;\n parentId: string | null;\n parent: TaskTreeNode | undefined;\n children: Set<TaskTreeNode>;\n name: string;\n result?: Promise<string | Error | undefined>;\n};\ntype NewTaskEvent = { id: string; parentId: string; name: string };\ntype TaskCompleteEvent = { id: string; result: any };\n\nexport class TaskTree {\n // private taskEventBus: Emittery<{ newTask: NewTaskEvent; taskComplete: TaskCompleteEvent }>;\n private listr: Listr;\n private subLists: Map<string, Promise<Listr>>;\n private nodes: Map<string, TaskTreeNode>;\n private mutex: Mutex;\n\n constructor() {\n this.mutex = new Mutex();\n this.nodes = new Map();\n this.subLists = new Map();\n // this.taskEventBus = new Emittery();\n // this.taskEventBus.on(\"newTask\", (newTaskEvent) => {\n // this.handleNewTask(newTaskEvent);\n // });\n // this.taskEventBus.on(\"taskComplete\", (taskCompleteEvent) => {\n // this.handleTaskComplete(taskCompleteEvent);\n // });\n this.listr = new Listr([], {\n // exitOnError: false,\n concurrent: true,\n rendererOptions: { collapseSubtasks: false },\n });\n }\n\n clear() {\n this.nodes.clear();\n this.subLists.clear();\n this.listr = new Listr([], {\n // exitOnError: false,\n concurrent: true,\n rendererOptions: { collapseSubtasks: false },\n });\n }\n\n async add(\n id: string,\n parentId: string | null,\n name: string,\n result?: Promise<string | Error | undefined>,\n ): Promise<TaskTreeNode> {\n return await this.mutex.runExclusive(async () => {\n const parent = this.get(parentId as string);\n const newNode: TaskTreeNode = { id, parentId, parent, children: new Set(), name, result };\n this.nodes.set(id, newNode);\n\n this.listr.add({\n title: newNode.name,\n task: async (ctx, task): Promise<void> => {\n await result;\n },\n });\n\n return newNode;\n });\n }\n\n get(id: string): TaskTreeNode | undefined {\n return this.nodes.get(id);\n }\n\n async getWithTimeout(id: string): Promise<TaskTreeNode | undefined> {\n try {\n return await retryUntilDefined(\n () => {\n return this.get(id);\n },\n { delay: 50, maxTry: 5 },\n );\n } catch (err) {\n return undefined;\n }\n }\n\n // setResult(id: string, result: Promise<string | Error | undefined>): TaskTreeNode | undefined {\n // const node = this.get(id);\n // if (node) {\n // node.result = result;\n // }\n // return node;\n // }\n\n run(ctx?: any) {\n return this.listr.run(ctx);\n }\n\n // emit(name: any, event: any) {\n // this.taskEventBus.emit(name, event);\n // }\n}\n\nexport interface LoadAppOptions {\n /** Optional configuration file path or URL */\n config?: string;\n /** Optional programmatic configuration provider */\n configProvider?: ConfigProvider;\n /** Optional bearer token for HTTP config requests */\n configToken?: string;\n /** Optional headers for HTTP config requests */\n configHeaders?: Record<string, string>;\n /** Optional verbosity level (0-4, where 0 is error only, 4 is trace) */\n verbosity?: number;\n /** Optional output style (plain, json, api) */\n outputStyle?: 'plain' | 'json' | 'api';\n /** Whether interactive prompts are allowed (defaults to true; set false for API/CI contexts) */\n interactive?: boolean;\n /** Provide a sudo/password string or async provider to avoid prompts */\n password?: string | (() => Promise<string | undefined>);\n}\n\ntype ConfigAuthOptions = {\n token?: string;\n headers?: Record<string, string>;\n};\n\nexport interface ExecuteResult {\n /** Overall success indicator - true if all hosts succeeded */\n success: boolean;\n /** Results for each host, keyed by hostname */\n hosts: Record<\n string,\n {\n /** Host alias if available */\n alias: string;\n /** Whether the command succeeded on this host */\n success: boolean;\n /** Command output */\n stdout: string;\n /** Command error output */\n stderr: string;\n /** Exit code */\n exitCode: number;\n /** Signal if the process was terminated by a signal */\n signal?: string;\n }\n >;\n /** Total number of hosts that were targeted */\n totalHosts: number;\n /** Number of hosts that succeeded */\n successfulHosts: number;\n /** Number of hosts that failed */\n failedHosts: number;\n}\n\nexport class App {\n public static async loadApiMode(options: LoadAppOptions): Promise<App> {\n return App.load({ ...options, outputStyle: 'api', interactive: options.interactive ?? false });\n }\n\n public static async load(options: LoadAppOptions): Promise<App> {\n const app = new App();\n app.setInteractive(options.interactive ?? true);\n if (options.password !== undefined) {\n const provider: () => Promise<string | undefined> =\n typeof options.password === 'function'\n ? (options.password as () => Promise<string | undefined>)\n : async () => options.password as string | undefined;\n app.setPasswordProvider(provider);\n }\n const provider =\n options.configProvider ??\n (await app.resolveConfigProvider(options.config, {\n token: options.configToken,\n headers: options.configHeaders,\n }));\n await app.loadConfigFromProvider(provider);\n app.setVerbosity(options.verbosity ?? Verbosity.WARN);\n app.setOutputStyle(options.outputStyle ?? 'plain');\n return app;\n }\n\n public configRef?: string;\n public configProvider?: ConfigProvider;\n private _config?: Config;\n private hostSelector?: HostSelector;\n private outputStyle: 'plain' | 'json' | 'api';\n private _tmpDir?: Path;\n private tmpFileRegistry: TmpFileRegistry;\n\n public taskTree: TaskTree;\n public verbosity: VerbosityLevel = Verbosity.ERROR;\n private passwordProvider?: () => Promise<string | undefined>;\n private providedPassword?: string;\n private interactive: boolean = true;\n\n constructor() {\n this.taskTree = new TaskTree();\n this.outputStyle = 'plain';\n this.tmpFileRegistry = new TmpFileRegistry(this.hostctlTmpDir());\n this.configRef = undefined;\n this.hostSelector = undefined;\n process.on('exit', (code) => this.appExitCallback());\n }\n\n appExitCallback() {\n // This callback is registered for the process 'exit' event.\n // Cleanup tasks, if any, can be performed here.\n // The TmpFileRegistry has its own exit handler to cleanup temporary files.\n }\n\n get config(): Config {\n if (!this._config) {\n throw new Error('Configuration has not been loaded. Call loadConfig() first.');\n }\n return this._config;\n }\n\n get tmpDir(): Path {\n if (!this._tmpDir) {\n // Ensure hostctlDir exists before creating a subdirectory in it.\n if (!fs.existsSync(this.hostctlDir().toString())) {\n fs.mkdirSync(this.hostctlDir().toString(), { recursive: true });\n }\n this._tmpDir = this.createNamedTmpDir(version);\n }\n return this._tmpDir;\n }\n\n async loadConfig(configRef?: string, auth?: ConfigAuthOptions) {\n const provider = await this.resolveConfigProvider(configRef, auth);\n await this.loadConfigFromProvider(provider);\n }\n\n async loadConfigFromProvider(provider: ConfigProvider) {\n this.configProvider = provider;\n if (provider instanceof FileConfigProvider) {\n this.configRef = provider.path;\n } else {\n this.configRef = 'provider';\n }\n this._config = await ProviderConfig.load(provider);\n }\n\n isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch (_) {\n return false;\n }\n }\n\n deriveConfigRef(configRef?: string): string {\n // 1. If configRef is an existing file, use it.\n if (configRef && Path.new(configRef).isFile()) {\n return Path.new(configRef).toString();\n }\n\n // 2. Search CWD and ancestors for hostctl.yaml\n const foundPath = Path.cwd()\n .selfAndAncestors()\n .find((p) => p.join('hostctl.yaml').isFile());\n if (foundPath) {\n return foundPath.join('hostctl.yaml').toString();\n }\n\n // 3. Check for ~/.hostctl/hostctl.yaml\n const homeConfigPath = Path.homeDir().join('.hostctl', 'hostctl.yaml');\n if (homeConfigPath.isFile()) {\n return homeConfigPath.toString();\n }\n\n // 4. If a configRef was supplied (e.g. -c URL or -c non-existent-file), use that.\n if (configRef) {\n return configRef;\n }\n\n // 5. Otherwise, error out\n throw new Error(\n \"Could not find a hostctl configuration file. Searched for 'hostctl.yaml' in the current directory, ancestor directories, and '~/.hostctl/hostctl.yaml'. If you intended to use a URL or a specific file path, please ensure it's correct and accessible via the -c option.\",\n );\n }\n\n log(level: LogLevel, ...args: any[]): void {\n if (this.outputStyle === 'plain' && this.verbosity >= level) {\n console.log(...args);\n }\n }\n\n public async resolveConfigProvider(configRef?: string, auth?: ConfigAuthOptions): Promise<ConfigProvider> {\n // Prefer file if it exists\n if (configRef && Path.new(configRef).isFile()) {\n return new FileConfigProvider(Path.new(configRef).toString());\n }\n\n // If no ref, try search as before\n const derived = this.deriveConfigRef(configRef);\n if (Path.new(derived).isFile()) {\n return new FileConfigProvider(Path.new(derived).toString());\n }\n\n // If URL, use HTTP provider\n if (this.isValidUrl(derived)) {\n const headers = this.buildHttpConfigHeaders(auth);\n return new HttpConfigProvider({\n url: derived,\n format: derived.endsWith('.yaml') ? 'yaml' : 'json',\n headers,\n });\n }\n\n // Fallback to error\n throw new Error(`Could not resolve a configuration provider for reference: ${configRef ?? '(none)'}`);\n }\n\n private buildHttpConfigHeaders(auth?: ConfigAuthOptions): Record<string, string> | undefined {\n if (!auth?.headers && !auth?.token) return undefined;\n const headers: Record<string, string> = {};\n const token = auth?.token;\n const rawHeaders = auth?.headers ?? {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (token && key.toLowerCase() === 'authorization') {\n continue;\n }\n headers[key] = value;\n }\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n }\n\n debug(...args: any[]): void {\n this.log(Verbosity.DEBUG, ...args);\n }\n\n info(...args: any[]): void {\n this.log(Verbosity.INFO, ...args);\n }\n\n warn(...args: any[]): void {\n this.log(Verbosity.WARN, ...args);\n }\n\n error(...args: any[]): void {\n this.log(Verbosity.ERROR, ...args);\n }\n\n osHomeDir(): Path {\n return Path.new(homedir()).absolute();\n }\n\n hostctlDir(): Path {\n return this.osHomeDir().join('.hostctl');\n }\n\n hostctlTmpDir() {\n return this.hostctlDir().join('tmp');\n }\n\n packagesDir(): Path {\n const envPkgDir = process.env.HOSTCTL_PKG_DIR;\n if (envPkgDir) {\n return Path.new(envPkgDir);\n }\n return this.hostctlDir().join('packages');\n }\n\n randName(): string {\n return Math.random().toString(36).slice(-5) + Math.random().toString(36).slice(-5);\n }\n\n hostctlTmpPath(tmpName?: string) {\n tmpName ??= this.randName();\n return this.hostctlTmpDir().join(tmpName);\n }\n\n // this directory will be automatically cleaned up at program exit\n createNamedTmpDir(subDirName?: string): Path {\n return this.tmpFileRegistry.createNamedTmpDir(subDirName);\n }\n\n // this file will be automatically cleaned up at program exit\n writeTmpFile(fileContent: string): Path {\n return this.tmpFileRegistry.writeTmpFile(fileContent);\n }\n\n shouldRunRemote(): boolean {\n // If any explicitly selected host is remote, assume remote intent for those.\n // If all selected hosts are local or no hosts are specified (implying local), run locally.\n const selectedHosts = this.selectedInventory();\n if (selectedHosts.length === 0 && !this.hostSelector) return false; // Default to local if no selector/hosts specified\n return selectedHosts.some((h) => !h.isLocal()); // True if any selected host is remote\n }\n\n logHostCommandResult(\n host: Host,\n command: string | string[],\n cmdOrErr: Command | Error,\n isErrorResult: boolean = false,\n ) {\n const hostName = host.uri || (host.isLocal() ? 'localhost' : 'unknown-host');\n if (cmdOrErr instanceof Error || isErrorResult) {\n const error = cmdOrErr as Error;\n this.debug(chalk.red(`[${hostName}] Error executing command \"${command}\": ${error.message}`));\n if (error.stack && this.verbosity >= Verbosity.DEBUG) {\n this.debug(chalk.red(error.stack));\n }\n } else {\n const cmdRes = cmdOrErr.result!;\n this.debug(chalk.green(`[${hostName}] Success executing \"${command}\" (exit code: ${cmdRes.exitCode})`));\n if (cmdRes.stdout) {\n this.debug(chalk.cyan(`[${hostName}] STDOUT:\\n${cmdRes.stdout.trim()}`));\n }\n if (cmdRes.stderr) {\n this.debug(chalk.yellow(`[${hostName}] STDERR:\\n${cmdRes.stderr.trim()}`));\n }\n }\n }\n\n defaultSshUser(): string | undefined {\n return undefined; // Placeholder for future global defaults\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-jill.priv tsx bin/ops.ts e whoami -t ubuntu\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/ops.ts -c david.yaml exec \"whoami\" -t synology blog 4gb web1\n async execute(cmd: string | string[]): Promise<ExecuteResult> {\n const selectedHosts = this.selectedInventory();\n\n const cmdResults: Array<Promise<Command | Error>> = A(selectedHosts).map((host: Host) => this.runRemote(host, cmd));\n\n const hostResultQuads = await VP(selectedHosts)\n .a.zip(cmdResults)\n .a.map(([host, cmdPromise]: [Host, Promise<Command | Error>]) => {\n return cmdPromise.then((cmd) =>\n match(cmd)\n .when(isError, (err) => [host, false, '', chalk.red(err.message), -1, undefined])\n .otherwise((cmd) => [\n host,\n cmd.result?.success ?? false,\n cmd.result?.stdout ?? '',\n cmd.result?.stderr ?? '',\n cmd.result?.exitCode ?? -1,\n cmd.result?.signal?.name,\n ]),\n );\n })\n .waitAll().value;\n\n // Build the detailed result structure using extracted methods\n const result = this.buildExecuteResult(hostResultQuads, selectedHosts.length);\n\n if (this.outputStyle === 'plain') {\n this.warn(chalk.yellow('=== Result ==='));\n A(hostResultQuads).each(([host, success, stdout, stderr]: [Host, boolean, string, string]) => {\n this.warn(\n `${success ? chalk.green(CHECKMARK) : chalk.red(XMARK)} ${chalk.cyan(host.hostname)}${host.alias ? ` (${host.alias})` : ''}`,\n );\n if (stdout) {\n this.warn(stdout);\n }\n if (stderr) {\n this.warn(chalk.red(stderr));\n }\n this.warn(chalk.yellow('--------------'));\n });\n } else if (this.outputStyle === 'json') {\n const result = A(hostResultQuads).reduce(\n (\n acc: Record<string, { alias: string; success: boolean; stdout: string; stderr: string }>,\n [host, success, stdout, stderr]: [Host, boolean, string, string],\n ) => {\n acc[host.hostname] = {\n alias: host.alias || '',\n success,\n stdout,\n stderr,\n };\n return acc;\n },\n {} as Record<string, { alias: string; success: boolean; stdout: string; stderr: string }>,\n );\n console.log(JSON.stringify(result, null, 2));\n }\n\n return result;\n }\n\n // used by execute to run a command on the remote host\n async runRemote(host: Host, cmd: string | string[]): Promise<Command | Error> {\n try {\n const hostPassword = await host.decryptedPassword();\n const sshConnection = {\n host: host.hostname,\n port: host.port,\n username: host.user,\n password: hostPassword,\n privateKeyPath: await host.plaintextSshKeyPath(),\n };\n\n const interactionHandler = InteractionHandler.with(withSudo(hostPassword));\n\n const session = new SSHSession();\n await session.connect(sshConnection);\n\n const command = Command.build(cmd);\n\n const commandObj = await session.run(command, interactionHandler);\n\n session.disconnect();\n\n return commandObj;\n } catch (e) {\n return e as Error;\n }\n }\n\n /**\n * Builds the hosts record from host result quads\n */\n private buildHostsRecord(\n hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>,\n ): Record<string, any> {\n const hosts: Record<string, any> = {};\n\n A(hostResultQuads).each(\n ([host, success, stdout, stderr, exitCode, signal]: [\n Host,\n boolean,\n string,\n string,\n number,\n string | undefined,\n ]) => {\n // Use alias as the key to ensure uniqueness, fallback to hostname:port if no alias\n const key = host.alias || `${host.hostname}:${host.port}`;\n hosts[key] = {\n alias: host.alias || '',\n success,\n stdout,\n stderr,\n exitCode,\n signal,\n };\n },\n );\n\n return hosts;\n }\n\n /**\n * Counts successful and failed hosts from host result quads\n */\n private countHostResults(hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>): {\n successfulHosts: number;\n failedHosts: number;\n } {\n let successfulHosts = 0;\n let failedHosts = 0;\n\n A(hostResultQuads).each(([_, success]: [Host, boolean]) => {\n if (success) {\n successfulHosts++;\n } else {\n failedHosts++;\n }\n });\n\n return { successfulHosts, failedHosts };\n }\n\n /**\n * Determines overall success from host result quads\n */\n private determineOverallSuccess(\n hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>,\n ): boolean {\n return hostResultQuads.every((quad) => quad[1]);\n }\n\n /**\n * Constructs the detailed ExecuteResult from host result quads and total host count\n */\n private buildExecuteResult(\n hostResultQuads: Array<[Host, boolean, string, string, number, string | undefined]>,\n totalHosts: number,\n ): ExecuteResult {\n const hosts = this.buildHostsRecord(hostResultQuads);\n const { successfulHosts, failedHosts } = this.countHostResults(hostResultQuads);\n const success = this.determineOverallSuccess(hostResultQuads);\n\n return {\n success,\n hosts,\n totalHosts,\n successfulHosts,\n failedHosts,\n };\n }\n\n getSecretsForHost(hostId: string): Map<string | RegExp, string> {\n const secretsMap = new Map<string | RegExp, string>();\n if (!this._config) {\n return secretsMap; // No config loaded\n }\n // Placeholder: Actual logic to populate secretsMap based on hostId and _config needed here.\n // For now, it correctly returns an empty map if no config or no specific secrets found.\n return secretsMap;\n }\n\n public taskContextForRunFn<TParams extends TaskParams>(\n invocation: IInvocation<TParams>,\n params: TParams,\n hostForContext?: Host, // Optional host, primarily for remote tasks. The invocation itself might have a host.\n ): TaskContext<TParams> {\n const effectiveHost = hostForContext || invocation.host;\n\n return {\n // Properties from TaskContext\n params,\n id: invocation.id,\n host: effectiveHost,\n config: invocation.config, // Delegated from invocation\n\n // Methods from TaskContext, delegating to invocation\n log: (level: LogLevel, ...message: any[]) => {\n invocation.log(level, ...message);\n },\n info: (...message: any[]) => {\n invocation.info(...message);\n },\n debug: (...message: any[]) => {\n invocation.debug(...message);\n },\n warn: (...message: any[]) => {\n invocation.warn(...message);\n },\n error: (...message: any[]) => {\n invocation.error(...message);\n },\n exec: async (\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ) => {\n return await invocation.exec(command, options);\n },\n ssh: async <TRemoteParams extends TaskParams, TRemoteReturn extends RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> => {\n return await invocation.ssh(tags, remoteTaskFn);\n },\n run: async <TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> => {\n return await invocation.run(taskPartialFn);\n },\n getPassword: async (): Promise<string | undefined> => {\n return await invocation.getPassword();\n },\n getSecret: async (name: string): Promise<string | undefined> => {\n return await invocation.getSecret(name);\n },\n exit: (exitCode: number, message?: string): void => {\n invocation.exit(exitCode, message);\n },\n inventory: (tags: string[]): Host[] => {\n return invocation.inventory(tags);\n },\n selectedInventory: (tags?: string[]): Host[] => {\n return invocation.selectedInventory(tags);\n },\n file: invocation.file,\n };\n }\n\n get selectedTags(): Set<string> {\n return new Set(this.hostSelector?.tags ?? []);\n }\n\n setSelectedTags(selectedTags: string[]) {\n this.setHostSelector({ tags: selectedTags });\n }\n\n setHostSelector(selector?: HostSelector) {\n if (!selector) {\n this.hostSelector = undefined;\n return;\n }\n const normalized: HostSelector = {\n names: selector.names ? [...selector.names] : undefined,\n tags: selector.tags ? [...selector.tags] : undefined,\n };\n this.hostSelector = normalized;\n }\n\n getHostSelector(): HostSelector | undefined {\n if (!this.hostSelector) {\n return undefined;\n }\n return {\n names: this.hostSelector.names ? [...this.hostSelector.names] : undefined,\n tags: this.hostSelector.tags ? [...this.hostSelector.tags] : undefined,\n };\n }\n\n setOutputStyle(outputStyle: 'plain' | 'json' | 'api') {\n this.outputStyle = outputStyle;\n }\n\n setVerbosity(level: number) {\n this.verbosity = level as VerbosityLevel;\n return this.verbosity;\n }\n\n setPasswordProvider(provider?: () => Promise<string | undefined>) {\n this.passwordProvider = provider;\n this.providedPassword = undefined;\n }\n\n setInteractive(interactive: boolean) {\n this.interactive = interactive;\n return this.interactive;\n }\n\n isInteractive(): boolean {\n return this.interactive;\n }\n\n outputApiMode() {\n return this.outputStyle == 'api';\n }\n\n outputJson() {\n return this.outputStyle == 'json';\n }\n\n outputPlain() {\n return this.outputStyle == 'plain';\n }\n\n querySelectedInventory(tags: Set<string> = new Set()): Host[] {\n return this.selectInventory(this.selectedInventory(), tags);\n }\n\n selectedInventory(selector?: string[] | { names?: string[]; tags?: string[] }): Host[] {\n if (Array.isArray(selector)) {\n return this.queryInventory(new Set(selector));\n }\n if (selector && typeof selector === 'object') {\n return this.queryInventoryWithSelector(selector);\n }\n if (this.hostSelector) {\n return this.queryInventoryWithSelector(this.hostSelector);\n }\n return this.queryInventory(new Set());\n }\n\n // returns hosts that have *all* of the given tags\n // each tag is a string of the form:\n // - foo\n // - bar+baz\n // the tags are interpreted to be in disjunctive-normal-form: a disjunction of conjunctions\n queryInventory(tags: Set<string> = new Set()): Host[] {\n if (!this._config) {\n this.warn('Warning: Configuration not loaded, cannot query inventory.');\n return [];\n }\n const allHosts = this._config.hosts(); // Changed from inventory() to hosts()\n if (tags.size === 0) {\n return allHosts;\n }\n return this.selectInventory(allHosts, new Set(tags));\n }\n\n queryInventoryWithSelector(selector: { names?: string[]; tags?: string[] }): Host[] {\n const tags = new Set(selector.tags ?? []);\n const names = new Set((selector.names ?? []).map((n) => n.toLowerCase()));\n\n const allHosts = this._config?.hosts() ?? [];\n if (names.size === 0 && tags.size === 0) {\n return allHosts;\n }\n\n return allHosts.filter((host) => {\n const matchesName =\n names.size > 0 && (names.has(host.hostname.toLowerCase()) || names.has(host.alias.toLowerCase()));\n const matchesTags = tags.size === 0 ? false : host.hasAnyTag(tags);\n if (names.size > 0 && tags.size > 0) {\n return matchesName || matchesTags;\n }\n if (names.size > 0) {\n return matchesName;\n }\n return matchesTags;\n });\n }\n\n selectInventory(hosts: Host[], tags: Set<string> = new Set()): Host[] {\n if (S(tags).isEmpty()) {\n return hosts;\n }\n\n return A(hosts).select((host: Host) => host.hasAnyTag(tags));\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-jill.priv tsx bin/hostctl.ts inventory -t ubuntu\n printInventoryReport() {\n const configFromGetter = this.config;\n const config: Config = configFromGetter; // Explicitly type 'config'\n const allHosts = config.hosts(); // Gets all hosts if no tags are specified\n const allSecrets = config.secrets(); // Map<string, ISecret>\n const allIds = config.ids(); // Map<string, IRecipientGroup>\n\n if (this.outputPlain()) {\n let output = 'Config file: ' + this.configRef + '\\n\\nHosts:\\n';\n if (allHosts.length > 0) {\n allHosts.forEach((host) => {\n output += ` - ${host.uri}:\\n`;\n output += ` alias: ${host.alias || ''}\\n`;\n output += ` user: ${host.user || ''}\\n`;\n output += ` port: ${host.port || ''}\\n`;\n output += ` tags: ${host.tags.join(', ')}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n\n output += '\\nSecrets:\\n';\n if (allSecrets.size > 0) {\n allSecrets.forEach((secret: ISecret, name: string) => {\n output += ` - ${name}:\\n`;\n output += ` encrypted: ${Boolean(secret.ciphertext)}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n\n output += '\\nIdentities (Public Keys):\\n';\n if (allIds.size > 0) {\n allIds.forEach((idGroup: IRecipientGroup, name: string) => {\n output += ` - ${name}:\\n`;\n output += ` publicKeys: ${idGroup.recipients().join(', ')}\\n`;\n });\n } else {\n output += ' {}\\n';\n }\n console.log(output.trim());\n } else if (this.outputJson()) {\n const jsonData: any = {\n hosts: allHosts.map((h) => h.toObject()),\n secrets: {},\n identities: {},\n };\n allSecrets.forEach((secret: ISecret, name: string) => {\n jsonData.secrets[name] = {\n name: secret.name,\n encrypted: false,\n // Consider if ids/recipients should be exposed here\n };\n });\n allIds.forEach((idGroup: IRecipientGroup, name: string) => {\n jsonData.identities[name] = {\n name: name,\n publicKeys: idGroup.recipients(),\n idRefs: [],\n };\n });\n console.log(JSON.stringify(jsonData, null, 2));\n }\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/test-david.priv tsx bin/hostctl.ts inventory encrypt\n async encryptInventoryFile() {\n if (!(this.configProvider instanceof FileConfigProvider)) {\n throw new Error('Encrypt is only supported for file-based configuration.');\n }\n const cfg = await this.configProvider.getConfigFile();\n this.warn(`Encrypting inventory file: ${this.configProvider.path}`);\n await cfg.encryptAll();\n await cfg.save(this.configProvider.path);\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts inventory decrypt\n async decryptInventoryFile() {\n if (!(this.configProvider instanceof FileConfigProvider)) {\n throw new Error('Decrypt is only supported for file-based configuration.');\n }\n const configFile = await this.configProvider.getConfigFile();\n\n let hasEncryptedSecrets = false;\n for (const secret of configFile._secrets.values()) {\n if (secret.value.isEncrypted()) {\n hasEncryptedSecrets = true;\n break;\n }\n }\n\n if (!hasEncryptedSecrets) {\n this.info('No encrypted secrets found to decrypt. Inventory is already decrypted.');\n return;\n }\n\n // Only warn if we are actually proceeding with decryption\n this.warn(`Decrypting inventory file: ${this.configProvider.path}`);\n\n try {\n await configFile.decryptAllIfPossible();\n\n // Log successfully used keys. This part might need refinement if loadPrivateKeys doesn't accurately reflect *used* keys.\n const successfullyUsedIdentityPaths = configFile\n .loadPrivateKeys() // This loads all keys specified by AGE_IDS\n .filter((identity) => {\n // A more robust check would be to see if AgeEncryption.decrypt reported success with this key.\n // For now, just checking existence, assuming if it was bad, decryptAllIfPossible would have failed.\n try {\n return fs.existsSync(identity.identityFilePath);\n } catch (e) {\n return false;\n }\n })\n .map((i) => i.identityFilePath)\n .join('\\n');\n\n if (this.verbosity >= Verbosity.INFO && successfullyUsedIdentityPaths.length > 0) {\n this.info(`Decrypted with one or more of the following private keys:\\n${successfullyUsedIdentityPaths}`);\n } else if (\n this.verbosity >= Verbosity.INFO &&\n hasEncryptedSecrets &&\n successfullyUsedIdentityPaths.length === 0\n ) {\n // This case implies decryption was attempted but no specified keys worked or were found,\n // though decryptAllIfPossible should ideally throw if it can't decrypt anything it needs to.\n this.warn('Encrypted secrets found, but no specified AGE identities were successfully used or found.');\n }\n\n const targetPath =\n this.configProvider instanceof FileConfigProvider ? this.configProvider.path : this.configRef || 'hostctl.yaml';\n await configFile.save(targetPath);\n } catch (error: any) {\n if (error.message?.includes('Unable to read identity file')) {\n // Match the test's expected error message pattern for unreadable/missing keys\n throw new Error('Decryption failed: no identity matched or failed to decrypt due to key issue.');\n }\n // Handle cases where decryption fails for other reasons e.g. no matching identity for a secret\n if (error.message?.includes('No identity matched secret')) {\n // Assuming AgeEncryption.decrypt might throw this\n throw new Error('Decryption failed: no identity matched the encrypted secrets.');\n }\n throw error; // Re-throw other errors\n }\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -t ubuntu -- script.ts\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -c david.yaml -t synology blog 4gb web1 -- script.ts\n async runScript(scriptRef: string, params: TaskParams) {\n const selectedHosts = this.selectedInventory();\n this.info(`Selected hosts: ${selectedHosts.length}`);\n\n const absoluteScriptRef = Path.new(scriptRef).absolute();\n this.debug(`absoluteScriptRef=${absoluteScriptRef}`);\n this.debug(`params=${util.inspect(params)}`);\n const mod = await this.loadScriptAsModule(absoluteScriptRef.toString());\n\n this.debug(`mod=${util.inspect(mod)}`);\n\n const packageFileDir = this.pathOfPackageJsonFile(absoluteScriptRef.toString());\n if (!packageFileDir) {\n console.error(\n chalk.red(`Bundle failure. \"${absoluteScriptRef}\" nor any ancestor directory contains a package.json file.`),\n );\n return;\n }\n\n const taskFn: TaskFn = this.resolveTaskFnFromModule(mod, absoluteScriptRef.toString());\n\n const interactionHandler = new InteractionHandler();\n const localRuntime = new LocalRuntime(this, absoluteScriptRef, interactionHandler);\n\n if (this.outputPlain()) {\n this.info(`run: ${chalk.yellow(absoluteScriptRef.toString())} ${chalk.cyan(util.inspect(params))}`);\n }\n\n let invocation: LocalInvocation<any, any> | undefined;\n let scriptResult: RunFnReturnValue | Error;\n try {\n invocation = await (localRuntime as LocalRuntime).invokeRootTask(taskFn, params, `Running ${scriptRef}`);\n if (!invocation) {\n this.error(`Failed to invoke task for script: ${scriptRef}`);\n scriptResult = new Error(`Failed to invoke task for script: ${scriptRef}`);\n } else {\n scriptResult = await invocation.result;\n this.reportScriptResult(invocation, scriptResult);\n }\n } catch (e) {\n scriptResult = e as Error;\n if (this.outputPlain()) {\n this.error(`Error running script ${scriptRef}: ${scriptResult.message}`);\n if (this.verbosity >= Verbosity.DEBUG && scriptResult.stack) {\n this.error(scriptResult.stack);\n }\n }\n if (invocation) {\n this.reportScriptResult(invocation, scriptResult);\n }\n }\n\n return scriptResult;\n }\n\n // entrypoint for the cli: AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -t ubuntu -- script.ts\n // e.g. AGE_IDS=~/.secrets/age/david.priv tsx bin/hostctl.ts -c david.yaml -t synology blog 4gb web1 -- script.ts\n async runScriptRemote(scriptRef: string, params: TaskParams) {\n const selectedHosts = this.selectedInventory();\n this.info(`Selected hosts: ${selectedHosts.length}`);\n\n const absoluteScriptRef = Path.new(scriptRef).absolute();\n this.debug(`absoluteScriptRef=${absoluteScriptRef}`);\n this.debug(`params=${util.inspect(params)}`);\n const mod = await this.loadScriptAsModule(absoluteScriptRef.toString());\n\n this.debug(`mod=${util.inspect(mod)}`);\n\n const packageFileDir = this.pathOfPackageJsonFile(absoluteScriptRef.toString());\n if (!packageFileDir) {\n console.error(\n chalk.red(`Bundle failure. \"${absoluteScriptRef}\" nor any ancestor directory contains a package.json file.`),\n );\n return;\n }\n\n const taskFn: TaskFn = this.resolveTaskFnFromModule(mod, absoluteScriptRef.toString());\n\n const interactionHandler = new InteractionHandler();\n const localRuntime = new LocalRuntime(this, absoluteScriptRef, interactionHandler);\n\n this.info(`run: ${chalk.yellow(absoluteScriptRef.toString())} ${chalk.cyan(util.inspect(params))}`);\n\n let invocation: LocalInvocation<any, any> | undefined;\n let scriptResult: RunFnReturnValue | Error;\n try {\n const runAllRemoteParams = { taskFn, params };\n invocation = await (localRuntime as LocalRuntime).invokeRootTask(\n runAllRemote,\n runAllRemoteParams,\n `Running ${scriptRef} on selected hosts`,\n );\n if (!invocation) {\n this.error(`Failed to invoke task for script: ${scriptRef}`);\n scriptResult = new Error(`Failed to invoke task for script: ${scriptRef}`);\n } else {\n scriptResult = await invocation.result;\n this.reportScriptResult(invocation, scriptResult);\n }\n } catch (e) {\n scriptResult = e as Error;\n if (this.outputPlain()) {\n this.error(`Error running script ${scriptRef}: ${scriptResult.message}`);\n if (this.verbosity >= Verbosity.DEBUG && scriptResult.stack) {\n this.error(scriptResult.stack);\n }\n }\n if (invocation) {\n this.reportScriptResult(invocation, scriptResult);\n }\n }\n\n return scriptResult;\n }\n\n async runTaskDefinition<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFn: TaskFn<TParams, TReturn>,\n params: TParams,\n options?: { remote?: boolean },\n ): Promise<TReturn> {\n const selectedHosts = this.selectedInventory();\n this.info(`Selected hosts: ${selectedHosts.length}`);\n\n const modulePath = taskFn.task.taskModuleAbsolutePath || taskFn.task.name || process.cwd();\n const absoluteScriptRef = Path.new(modulePath).absolute();\n\n const packageFileDir = this.pathOfPackageJsonFile(absoluteScriptRef.toString());\n if (!packageFileDir) {\n console.error(\n chalk.red(`Bundle failure. \"${absoluteScriptRef}\" nor any ancestor directory contains a package.json file.`),\n );\n return undefined as TReturn;\n }\n\n const interactionHandler = new InteractionHandler();\n const localRuntime = new LocalRuntime(this, absoluteScriptRef, interactionHandler);\n\n const description = options?.remote\n ? `Running ${taskFn.task.name || absoluteScriptRef.toString()} on selected hosts`\n : `Running ${taskFn.task.name || absoluteScriptRef.toString()}`;\n\n let invocation: LocalInvocation<any, any> | undefined;\n let scriptResult: RunFnReturnValue | Error;\n try {\n if (options?.remote) {\n const remoteParams: RemoteRunParams = {\n taskFn: taskFn as unknown as TaskFn<TaskParams, RunFnReturnValue>,\n params: params as TaskParams,\n };\n invocation = await localRuntime.invokeRootTask<RemoteRunParams, RemoteRunResult>(\n runAllRemote as TaskFn<RemoteRunParams, RemoteRunResult>,\n remoteParams,\n description,\n );\n } else {\n invocation = await localRuntime.invokeRootTask(taskFn, params, description);\n }\n\n if (!invocation) {\n this.error(`Failed to invoke task: ${taskFn.task.name || absoluteScriptRef.toString()}`);\n scriptResult = new Error(`Failed to invoke task: ${taskFn.task.name || absoluteScriptRef.toString()}`);\n } else {\n scriptResult = await invocation.result;\n this.reportScriptResult(invocation, scriptResult);\n }\n } catch (e) {\n scriptResult = e as Error;\n if (this.outputPlain()) {\n this.error(`Error running task ${taskFn.task.name || absoluteScriptRef.toString()}: ${scriptResult.message}`);\n if (this.verbosity >= Verbosity.DEBUG && scriptResult.stack) {\n this.error(scriptResult.stack);\n }\n }\n if (invocation) {\n this.reportScriptResult(invocation, scriptResult);\n }\n }\n\n return scriptResult as TReturn;\n }\n\n async walkInvocationTreePreorder(\n invocation: IInvocation<any>,\n visitFn: (invocation: IInvocation<any>, depth: number) => Promise<void>,\n visited: Set<IInvocation<any>> = new Set(),\n depth = 0,\n ) {\n if (visited.has(invocation)) return;\n\n visited.add(invocation);\n await visitFn(invocation, depth);\n\n for (const childInvocation of invocation.getChildren() as IInvocation<any>[]) {\n await this.walkInvocationTreePreorder(childInvocation, visitFn, visited, depth + 1);\n }\n }\n\n async reportScriptResult(invocation: LocalInvocation<any, any>, scriptResult: RunFnReturnValue | Error) {\n if (this.outputPlain()) {\n this.warn('=== Evaluation ===');\n await this.walkInvocationTreePreorder(invocation, async (invocation, depth) => {\n const indent = ' '.repeat(depth);\n if (invocation.getDescription() || invocation.id) {\n const err = await invocation.resultError();\n if (err) {\n if (this.verbosity >= Verbosity.WARN) {\n this.warn(\n `${indent}${chalk.red(XMARK)} ${invocation.getDescription() || invocation.id} ${chalk.red(util.inspect(err))}`,\n );\n if (this.verbosity >= Verbosity.INFO) {\n this.info(`${indent} ${chalk.red(err.message)}`);\n if (this.verbosity >= Verbosity.DEBUG) {\n invocation.stdout && this.debug(`${indent} ${chalk.bgGreen(invocation.stdout.trimEnd())}`);\n invocation.stderr && this.debug(`${indent} ${chalk.bgRed(invocation.stderr.trimEnd())}`);\n }\n }\n }\n } else {\n if (this.verbosity >= Verbosity.WARN) {\n this.warn(`${indent}${chalk.green(CHECKMARK)} ${invocation.getDescription() || invocation.id}`);\n if (this.verbosity >= Verbosity.INFO) {\n this.info(`${indent} ${chalk.green(util.inspect(await invocation.getResultPromise()))}`);\n if (this.verbosity >= Verbosity.DEBUG) {\n invocation.stdout && this.debug(`${indent} ${chalk.bgGreen(invocation.stdout.trimEnd())}`);\n invocation.stderr && this.debug(`${indent} ${chalk.bgRed(invocation.stderr.trimEnd())}`);\n }\n }\n }\n }\n }\n });\n\n this.warn('=== Result ===');\n if (isError(scriptResult)) {\n this.warn(chalk.red(`${invocation.getDescription() || invocation.id} failed:`));\n this.warn(chalk.red(scriptResult.message));\n if (scriptResult.stack) {\n this.warn(chalk.red(scriptResult.stack));\n }\n } else if (\n scriptResult &&\n typeof scriptResult === 'object' &&\n 'exitCode' in scriptResult &&\n typeof scriptResult.exitCode === 'number'\n ) {\n // This case handles an intentional exit requested by the script returning an object like { exitCode: number, message?: string }\n const exitCode = scriptResult.exitCode;\n const message = (scriptResult as any).message || '';\n this.warn(\n chalk.yellow(\n `${invocation.getDescription() || invocation.id} requested exit with code ${exitCode}: ${message}`,\n ),\n );\n } else if (scriptResult === undefined) {\n this.warn(chalk.green(`${invocation.getDescription() || invocation.id} completed successfully.`));\n } else {\n this.warn(\n chalk.green(\n `${invocation.getDescription() || invocation.id} completed with result: ${util.inspect(scriptResult, { depth: 3 })}`,\n ),\n );\n }\n } else if (this.outputJson()) {\n // When JSON output is requested, print the stringified result directly,\n // bypassing the general verbosity-controlled logging system.\n if (!(scriptResult instanceof Error)) {\n console.log(JSON.stringify(scriptResult, null, 2));\n } else {\n // For errors in JSON mode, output a JSON error object to stdout\n const errorJson = {\n error: scriptResult.message,\n stack: scriptResult.stack,\n };\n console.log(JSON.stringify(errorJson, null, 2));\n }\n }\n }\n\n async loadScriptAsModule(scriptRef: string) {\n const mod = await import(scriptRef);\n return mod;\n }\n\n private isTaskInstanceLike(candidate: unknown): candidate is Task {\n return (\n !!candidate &&\n typeof candidate === 'object' &&\n 'runFn' in (candidate as Record<string, unknown>) &&\n typeof (candidate as { runFn?: unknown }).runFn === 'function'\n );\n }\n\n private wrapTaskInstance<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskInstance: Task<TParams, TReturn>,\n ): TaskFn<TParams, TReturn> {\n const taskFnObject: TaskFn<TParams, TReturn> = function (params?: TParams) {\n return function (parentInvocation: IInvocation): Promise<TReturn> {\n return parentInvocation.invokeChildTask(taskFnObject, params ?? ({} as TParams)) as Promise<TReturn>;\n };\n } as TaskFn<TParams, TReturn>;\n Object.assign(taskFnObject, { task: taskInstance });\n return taskFnObject;\n }\n\n private isTaskFnLike(candidate: unknown): candidate is TaskFn {\n if (typeof candidate !== 'function') {\n return false;\n }\n const task = (candidate as { task?: unknown }).task;\n return typeof task === 'object' && task !== null;\n }\n\n private isTaskExport(candidate: unknown): candidate is TaskFn | Task {\n return this.isTaskFnLike(candidate) || candidate instanceof Task || this.isTaskInstanceLike(candidate);\n }\n\n private resolveTaskExport(candidate: unknown): TaskFn | undefined {\n if (this.isTaskFnLike(candidate)) {\n return candidate as TaskFn;\n }\n if (candidate instanceof Task || this.isTaskInstanceLike(candidate)) {\n return this.wrapTaskInstance(candidate as Task);\n }\n return undefined;\n }\n\n private resolveTaskFnFromModule(mod: Record<string, unknown>, modulePath: string): TaskFn {\n const exports = Object.entries(mod ?? {});\n const taskExports = exports.filter(([, exported]) => this.isTaskExport(exported));\n const defaultTask = this.resolveTaskExport(mod.default);\n\n if (!defaultTask) {\n const namedTasks = taskExports.filter(([key]) => key !== 'default').map(([key]) => key);\n const hint = namedTasks.length ? ` Found named task exports: ${namedTasks.join(', ')}.` : '';\n throw new Error(`Task module ${modulePath} must export a default task.${hint}`);\n }\n\n const namedTaskExports = taskExports.filter(([key]) => key !== 'default');\n if (namedTaskExports.length > 0) {\n const names = namedTaskExports.map(([key]) => key).join(', ');\n this.warn(`Task module ${modulePath} exports multiple tasks (${names}). Only the default export is used.`);\n }\n\n return defaultTask;\n }\n\n parseParams(scriptArgs: string[]): Object {\n return ParamMap.parse(scriptArgs).toObject();\n }\n\n // walks the directory tree that contains the given path from leaf to root searching for the deepest directory\n // containing a package.json file and returns the absolute path of that directory\n pathOfPackageJsonFile(path: string): Path | null {\n let p = Path.new(path);\n while (true) {\n if (p.dirContains('package.json')) {\n return p.absolute();\n }\n if (p.isRoot()) {\n return null;\n }\n\n p = p.parent();\n }\n }\n\n async printRuntimeReport() {\n const nodeRuntime = new NodeRuntime(this.tmpDir);\n\n const reportObj = {\n nodePath: await nodeRuntime.nodePath(),\n npmPath: await nodeRuntime.npmPath(),\n // summary: report?.getReport(),\n };\n this.info(reportObj);\n }\n\n async promptPasswordInteractively(message = 'Enter your password') {\n if (this.providedPassword !== undefined) {\n return this.providedPassword;\n }\n\n if (this.passwordProvider) {\n this.providedPassword = await this.passwordProvider();\n if (this.providedPassword !== undefined) {\n return this.providedPassword;\n }\n }\n\n if (!this.interactive) {\n throw new Error(\n 'Password requested but App is in non-interactive mode. Provide LoadAppOptions.password or allow prompts by setting interactive:true.',\n );\n }\n\n this.providedPassword = await promptPassword({ message });\n return this.providedPassword;\n }\n\n async installRuntime() {\n this.info(`creating node runtime with ${this.tmpDir.toString()}`);\n const nodeRuntime = new NodeRuntime(this.tmpDir);\n await nodeRuntime.installIfNeeded();\n }\n\n /**\n * Executes a command on the selected hosts\n *\n * @param options - Configuration options for running the task\n * @returns Promise resolving to the task's result\n */\n\n async apiExecute(options: {\n /** The host tags to scope the run to */\n hostTags?: string[];\n /** The command to execute */\n command: string | string[];\n }): Promise<ExecuteResult> {\n if (options.hostTags) {\n this.setSelectedTags(options.hostTags);\n }\n\n const result = await this.execute(options.command);\n return result;\n }\n\n /**\n * Resolves a task from a package reference and runs it\n *\n * This method provides a simple way to resolve and execute tasks using the same\n * logic as the CLI, but as a method on an App instance.\n *\n * @param options - Configuration options for running the task\n * @returns Promise resolving to the task's result\n */\n async apiRunTask(options: {\n /** Whether to run the task remotely (if not provided, runs locally) */\n remote?: boolean;\n /** The host tags to scope the run to */\n hostTags?: string[];\n /** The package reference (core task, local path, or remote package) */\n package: string;\n /** Optional task name within the package */\n task?: string;\n /** Parameters to pass to the task */\n params: TaskParams;\n }): Promise<RunFnReturnValue> {\n // Build the package and task arguments for resolution\n const pkgTaskArgs = [options.package];\n if (options.task) {\n pkgTaskArgs.push(options.task);\n }\n\n // Resolve the task path\n const resolved = await resolveTaskPathAndArgs(this, pkgTaskArgs);\n\n if (options.hostTags) {\n this.setSelectedTags(options.hostTags);\n }\n\n if (resolved.kind === 'registry') {\n return await this.runTaskDefinition(resolved.task, options.params, { remote: options.remote });\n }\n\n if (options.remote) {\n return await this.runScriptRemote(resolved.scriptRef, options.params);\n }\n return await this.runScript(resolved.scriptRef, options.params);\n }\n}\n","import Handlebars from 'handlebars';\n\n// per https://github.com/handlebars-lang/handlebars.js/issues/133#issuecomment-2585143\nHandlebars.registerHelper('join', function (items, block) {\n var delimiter = block.hash.delimiter || ',',\n start = block.hash.start || 0,\n len = items ? items.length : 0,\n end = block.hash.end || len,\n out = '';\n\n if (end > len) end = len;\n\n if ('function' === typeof block) {\n for (let i = start; i < end; i++) {\n if (i > start) out += delimiter;\n if ('string' === typeof items[i]) out += items[i];\n else out += block(items[i]);\n }\n return out;\n } else {\n return [].concat(items).slice(start, end).join(delimiter);\n }\n});\nexport default Handlebars;\n","import * as fs from 'node:fs';\nimport { ConfigFile } from './config-file';\nimport { Host } from './host';\nimport { ConfigUrl } from './config-url';\n\nexport interface ISecret {\n name: string;\n recipients(): string[]; // array of strings representing public keys of the identities that may decrypt the secret\n ciphertext(): Promise<string>;\n plaintext(): Promise<string | undefined>;\n}\n\nexport interface IRecipientGroup {\n recipients(): string[]; // returns an array of public keys associated with all immediate and transitive recipients\n}\n\nexport interface Config {\n hosts(): Host[]; // Renamed from inventory()\n secrets(): Map<string, ISecret>; // Changed from property to method\n ids(): Map<string, IRecipientGroup>; // Changed from property to method\n getSecret(name: string): ISecret | undefined; // Unchanged\n getRecipientGroups(idRefs: string[]): IRecipientGroup[]; // Unchanged\n}\n\nexport async function load(configRef: string | undefined): Promise<Config> {\n if (configRef && fs.existsSync(configRef)) {\n const configFile = new ConfigFile(configRef);\n await configFile.load();\n return configFile;\n } else if (configRef) {\n return new ConfigUrl(configRef);\n } else {\n throw new Error('No config specified.');\n }\n}\n","import fsa from 'node:fs/promises';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { glob, globSync, globStream, globStreamSync, Glob } from 'glob';\nimport { base16, base32, base64, base58, bech32 } from '@scure/base';\nimport * as R from 'rambda';\nimport yaml from 'js-yaml';\n// import * as yaml from \"yaml\";\nimport { Host } from './host';\nimport { AgeEncryption, Identity } from './age-encryption';\nimport { A } from './flex/array';\nimport { File } from './flex/file';\nimport { S } from './flex/set';\nimport { VP } from './flex/pipe';\nimport type { Config, IRecipientGroup, ISecret } from './config';\nimport { Undefined, V } from './flex/type';\nimport { M } from './flex/map';\n\ntype YamlHost = {\n host?: string; // The actual hostname/IP address\n port?: number; // SSH port (defaults to 22)\n user?: string;\n password?: SecretRef | string;\n 'ssh-key'?: SecretRef | string;\n tags?: string[];\n};\n\ntype YamlHostsMapping = { [key: string]: YamlHost };\n\ntype YamlSecret = {\n ids: string | string[];\n value: string;\n};\n\ntype YamlSecretsMapping = { [key: string]: YamlSecret };\n\ntype YamlIdsMapping = { [key: string]: string | string[] };\n\ntype YamlConfigFile = {\n hosts?: YamlHostsMapping;\n secrets?: YamlSecretsMapping;\n ids?: YamlIdsMapping;\n};\n\nexport class SecretRef {\n constructor(public name: string) {}\n\n toYAML() {\n return this;\n }\n}\n\nexport class SecretValue {\n constructor(private value: string) {}\n\n async encrypt(recipients: string[]): Promise<string> {\n if (!this.isEncrypted()) {\n this.value = await AgeEncryption.encrypt(this.value, recipients);\n // console.log(`encrypted: ${this.value}`)\n }\n return this.value;\n }\n\n async decrypt(identities: Identity[]): Promise<string | undefined> {\n if (this.isEncrypted()) {\n const decryptedValue = await AgeEncryption.decrypt(\n this.value,\n identities.map((i) => i.identityFilePath),\n );\n if (!decryptedValue) {\n return undefined;\n }\n this.value = decryptedValue;\n }\n return this.value;\n }\n\n isEncrypted() {\n return this.value.includes('AGE ENCRYPTED FILE');\n }\n\n toYAML() {\n return this.value;\n }\n}\n\nexport class Secret implements ISecret {\n constructor(\n public config: ConfigFile,\n public name: string,\n public ids: RecipientGroup,\n public value: SecretValue,\n ) {}\n\n recipients(): string[] {\n return this.ids.recipients();\n }\n\n async ciphertext(): Promise<string> {\n // console.log(`encrypting ${this.name} with ${this.recipients()}`);\n return await this.value.encrypt(this.recipients());\n }\n\n async plaintext(): Promise<string | undefined> {\n const identities = this.config.loadPrivateKeys();\n return await this.value.decrypt(identities);\n }\n\n async encrypt(): Promise<string> {\n return await this.ciphertext();\n }\n\n async decrypt(): Promise<string | undefined> {\n return await this.plaintext();\n }\n\n toYAML() {\n return {\n ids: this.ids.toYAML(),\n value: this.value.toYAML(),\n };\n }\n}\n\nexport class RecipientGroup implements IRecipientGroup {\n constructor(\n public config: ConfigFile,\n public publicKeys: string[],\n public idRefs: string[],\n ) {}\n\n // returns an array of public keys associated with all immediate and transitive recipients\n recipients(): string[] {\n const accumulatedPublicKeys: Set<string> = A(this.publicKeys).toSet();\n\n // console.log(\"111\")\n this.walkRecipientGroups((rg: RecipientGroup) => {\n // console.log(\"222\")\n // VP(accumulatedPublicKeys).pipe(S.addAll(rg.publicKeys));\n S(accumulatedPublicKeys).addAll(rg.publicKeys);\n });\n\n return S(accumulatedPublicKeys).toArray();\n }\n\n walkRecipientGroups(visitFn: (rg: RecipientGroup) => void, visited: Set<RecipientGroup> = new Set()) {\n if (visited.has(this)) return;\n\n visited.add(this);\n visitFn(this);\n\n this.config.getRecipientGroups(this.idRefs).forEach((rg) => rg.walkRecipientGroups(visitFn, visited));\n }\n\n toYAML() {\n return this.publicKeys.concat(this.idRefs);\n }\n}\n\nexport class NamedRecipientGroup extends RecipientGroup {\n constructor(\n public config: ConfigFile,\n public name: string,\n public publicKeys: string[],\n public idRefs: string[],\n ) {\n super(config, publicKeys, idRefs);\n }\n}\n\nconst SecretRefYamlType = new yaml.Type('!secret', {\n kind: 'scalar', // 'scalar' means string\n\n // Loader must check if the input object is suitable for this type.\n resolve(data): boolean {\n return !!data && typeof data === 'string' && data.trim().length > 0;\n },\n\n // If a node is resolved, use it to create a SecretRef instance.\n construct(yamlObj) {\n return new SecretRef(yamlObj); // yamlObj should be a string\n },\n\n // Dumper must process instances of Point by rules of this YAML type.\n instanceOf: SecretRef,\n\n // Dumper must represent SecretRef objects as string in YAML.\n represent(secretRef) {\n return (secretRef as SecretRef).name;\n },\n});\n\nconst HOSTCTL_CONFIG_SCHEMA = yaml.DEFAULT_SCHEMA.extend([SecretRefYamlType]);\n\nexport class ConfigFile implements Config {\n public _hosts: Map<string, Host>;\n public _ids: Map<string, RecipientGroup>;\n public _secrets: Map<string, Secret>;\n\n constructor(public path: string) {\n this._hosts = new Map();\n this._ids = new Map();\n this._secrets = new Map();\n }\n\n // serialization and deserialization\n\n async load() {\n if (!File.exists(this.path)) {\n throw new Error(`Config file ${this.path} doesn't exist. Unable to load.`);\n }\n\n const yamlFileContents = await fsa.readFile(this.path, {\n encoding: 'utf8',\n });\n\n const yamlDocument: YamlConfigFile = yaml.load(yamlFileContents, {\n schema: HOSTCTL_CONFIG_SCHEMA,\n }) as YamlConfigFile;\n\n this.parse(yamlDocument);\n }\n\n parse(yamlDocument: YamlConfigFile) {\n this._hosts = this.parseHosts(yamlDocument.hosts || {});\n this._ids = this.parseIdsMap(yamlDocument.ids || {});\n this._secrets = this.parseSecrets(yamlDocument.secrets || {});\n }\n\n parseSecretValue(yamlSecretValue: SecretRef | string | undefined): SecretRef | string | undefined {\n switch (V(yamlSecretValue).kind()) {\n case Undefined:\n return yamlSecretValue as undefined;\n case SecretRef:\n return yamlSecretValue as SecretRef;\n case String:\n return yamlSecretValue as string;\n // return new SecretValue(yamlSecretValue as string);\n default:\n throw new Error(`unknown secret type: ${V.inspect(yamlSecretValue)}`);\n }\n }\n\n // yamlHosts is an object\n parseHosts(yamlHosts: YamlHostsMapping): Map<string, Host> {\n const hosts = Object.entries(yamlHosts).reduce((hostMap: Map<string, Host>, [alias, hostObj]) => {\n hostObj ||= {};\n const password = this.parseSecretValue(hostObj.password);\n const sshKey = this.parseSecretValue(hostObj['ssh-key']);\n\n // Determine the hostname - use 'host' field if present, otherwise fall back to alias (for backward compatibility)\n const hostname = hostObj.host || alias;\n\n hostMap.set(\n alias, // Use the key as the alias\n new Host(this, {\n hostname, // Use the resolved hostname\n alias, // The key becomes the alias\n port: hostObj.port, // SSH port (defaults to 22 in Host constructor)\n user: hostObj.user,\n password,\n sshKey,\n tags: hostObj.tags,\n }),\n );\n return hostMap;\n }, new Map());\n return hosts;\n }\n\n parseIdsMap(yamlIds: YamlIdsMapping): Map<string, RecipientGroup> {\n const ids = Object.entries(yamlIds).reduce((secretsMap: Map<string, RecipientGroup>, [name, value]) => {\n value ||= [];\n const rg = this.parseRecipients(value as string[]);\n secretsMap.set(name, new NamedRecipientGroup(this, name, rg.publicKeys, rg.idRefs));\n return secretsMap;\n }, new Map());\n return ids;\n }\n\n parseRecipients(ids: string | string[] | (string | string[])[]): RecipientGroup {\n let idStrings: string[];\n if (V(ids).isA(String)) {\n idStrings = [ids as string];\n } else if (Array.isArray(ids) && ids.every((item: any) => V(item).isA(String))) {\n idStrings = ids as string[]; // ids is string[]\n } else if (Array.isArray(ids)) {\n // Handles (string | string[])[]\n idStrings = (ids as (string | string[])[]).flat(1) as string[];\n } else {\n // ids is not a string and not an array (e.g. undefined, null from YAML parsing)\n // This situation should ideally be handled based on how YAML treats missing/null recipient lists.\n // For now, default to an empty array to prevent further errors, with a warning.\n // console.warn(`[ConfigFile.parseRecipients] 'ids' field has unexpected type: ${typeof ids}. Expected string or array. Defaulting to empty recipient list.`);\n idStrings = [];\n }\n const publicKeysAndIdRefs = idStrings.flatMap((str) => str.split(',')).map((str) => str.trim());\n const [publicKeys, idRefs] = A(publicKeysAndIdRefs).partition(this.isValidPublicKey);\n return new RecipientGroup(this, publicKeys, idRefs);\n }\n\n // returns true if the key is an Age encryption public key (i.e. a bech32 key with a prefix of 'age')\n isValidPublicKey(str: string): boolean {\n try {\n const { prefix, words } = bech32.decode(str as any);\n return prefix === 'age';\n } catch (e) {\n return false;\n }\n }\n\n // yamlSecrets is an object\n parseSecrets(yamlSecrets: YamlSecretsMapping): Map<string, Secret> {\n const secrets = Object.entries(yamlSecrets).reduce((secretsMap: Map<string, Secret>, [name, yamlSecret]) => {\n // yamlSecret ||= {};\n\n const recipients = this.parseRecipients(yamlSecret.ids);\n\n secretsMap.set(name, new Secret(this, name, recipients, new SecretValue(yamlSecret.value)));\n return secretsMap;\n }, new Map());\n return secrets;\n }\n\n async save(destinationPath: string = this.path) {\n const hosts = this.serializeHosts();\n const secrets = this.serializeSecrets();\n const ids = this.serializeIds();\n const yamlFileObj = {\n hosts,\n secrets,\n ids,\n };\n const yamlFileContents = yaml.dump(yamlFileObj, {\n schema: HOSTCTL_CONFIG_SCHEMA,\n noRefs: true,\n });\n await fsa.writeFile(destinationPath, yamlFileContents);\n }\n\n serializeHosts() {\n // return M.toObject(M.map(([name, host]) => [name, host.toYAML()])(this.hosts));\n return VP(this._hosts)\n .map(([name, host]: [string, Host]) => [name, host.toYAML()])\n .m.toObject().value;\n }\n\n serializeSecrets() {\n // return M.toObject(\n // M.map(([name, secret]) => [name, secret.toYAML()])(this.secrets)\n // );\n return VP(this._secrets)\n .map(([name, secret]) => [name, secret.toYAML()])\n .m.toObject().value;\n }\n\n serializeIds() {\n // return M.toObject(M.map(([name, id]) => [name, id.toYAML()])(this.ids));\n return VP(this._ids)\n .map(([name, id]) => [name, id.toYAML()])\n .m.toObject().value;\n }\n\n // domain logic\n\n // loads private keys from the AGE_IDS environment variable, or defaults to $HOME/.hostctl/age/*.priv\n loadPrivateKeys(): Identity[] {\n let ageIds = process.env.AGE_IDS;\n if (!ageIds) {\n const home = os.homedir();\n if (home) {\n ageIds = path.join(home, '.hostctl', 'age', '*.priv');\n }\n }\n if (ageIds) {\n const paths = globSync(ageIds);\n const ids = paths.map((path) => new Identity({ path }));\n return ids;\n }\n return [];\n }\n\n getSecret(name: string): Secret | undefined {\n return this._secrets.get(name);\n }\n\n getRecipientGroups(idRefs: string[]): RecipientGroup[] {\n // return pipe(idRefs, A.map(this.ids.get), A.compact());\n return VP(idRefs)\n .map((idRef: string) => this._ids.get(idRef))\n .compact().value;\n }\n\n async decryptAllIfPossible(): Promise<void> {\n await VP(this._secrets)\n .m.values()\n .map((secret: Secret) => secret.decrypt())\n .waitAll().value;\n }\n\n async encryptAll(): Promise<void> {\n await VP(this._secrets)\n .m.values()\n .map((secret: Secret) => secret.encrypt())\n .waitAll().value;\n }\n\n // Config interface\n\n hosts(): Host[] {\n return M(this._hosts).values();\n }\n\n secrets(): Map<string, Secret> {\n return this._secrets;\n }\n\n ids(): Map<string, RecipientGroup> {\n return this._ids;\n }\n}\n","export const GeneratorFunction = function* () {}.constructor;\n\nexport interface BaseWrapperProxy {\n <T>(wrappedValue: T): any; // Generic call signature for the proxy itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\ninterface InternalFunctionWithRegMethods extends Function {\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\n// export function buildPipeThroughFunction() {\n// function func(wrappedValue) {\n// // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n// return new Proxy(wrappedValue, {\n// get(target, property, receiver) {\n// // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n// const fn = Reflect.get(func, property, receiver);\n// if (fn === undefined) {\n// return Reflect.get(target, property, receiver); // target === wrappedValue\n// }\n// const fnParams = parameters(fn);\n// const noParameters = fnParams.length === 0;\n// return function (...args: any) {\n// if (noParameters || args.length === 0) {\n// // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n// return fn.call(receiver, target);\n// } else {\n// // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n// return fn.apply(receiver, args)(target);\n// }\n// };\n// },\n// });\n// }\n// return func;\n// }\n\nexport type FunctionBag = { [key: string]: Function };\nexport class MethodBag {\n public methods: Map<string, [Function, number]>;\n public staticMethods: Map<string, Function>;\n constructor() {\n this.methods = new Map();\n this.staticMethods = new Map();\n }\n registerUncurriedFns(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.methods.set(functionName, [functionObj, 1]);\n });\n }\n registerCurriedFns(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.methods.set(functionName, [functionObj, 2]);\n });\n }\n registerStatic(fnBag: FunctionBag) {\n Object.entries(fnBag).forEach(([functionName, functionObj]) => {\n this.staticMethods.set(functionName, functionObj);\n });\n }\n lookup(fnName: string): [Function, number] | undefined {\n const pair = this.methods.get(fnName);\n if (!pair) {\n return undefined;\n }\n return pair;\n }\n lookupStatic(fnName: string): Function | undefined {\n const fn = this.staticMethods.get(fnName);\n if (!fn) {\n return undefined;\n }\n return fn;\n }\n}\n\nexport function buildWrapperProxy(): BaseWrapperProxy {\n const methods = new MethodBag();\n function func(wrappedValue: any): any {\n // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n return new Proxy(wrappedValue, {\n get(target: any, property: string | symbol, receiver: any) {\n // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n const fnArityPair = methods.lookup(property.toString());\n if (fnArityPair === undefined) {\n return Reflect.get(target, property, receiver); // target === wrappedValue\n }\n const [fn, arity] = fnArityPair;\n return function (...args: any) {\n if (arity === 1) {\n // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n return fn.call(receiver, target);\n } else {\n // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n return fn.apply(receiver, args)(target);\n }\n };\n },\n });\n }\n Object.assign(func, {\n registerUncurriedFns: (fnBag: FunctionBag): void => {\n methods.registerUncurriedFns(fnBag);\n },\n registerCurriedFns: (fnBag: FunctionBag): void => {\n methods.registerCurriedFns(fnBag);\n },\n registerStatic: (fnBag: FunctionBag): void => {\n methods.registerStatic(fnBag);\n },\n });\n const funcWithMethods = func as unknown as InternalFunctionWithRegMethods;\n return new Proxy(funcWithMethods, {\n get(target: any, property: string | symbol, receiver: any) {\n const fn = methods.lookupStatic(property.toString());\n if (fn === undefined) {\n return Reflect.get(target, property, receiver); // target === func\n }\n return fn;\n },\n }) as BaseWrapperProxy;\n}\n\n// taken from https://javascript.info/currying-partials\nexport function curry(func: (...args: any[]) => any) {\n return function curried(this: any, ...args: any[]): any {\n if (args.length >= func.length) {\n return func.apply(this, args);\n } else {\n return function (this: any, ...args2: any[]): any {\n return curried.apply(this, args.concat(args2));\n };\n }\n };\n}\n\nexport function identity(val: any): any {\n return val;\n}\n\n// taken from https://stackoverflow.com/questions/1007981/how-to-get-function-parameter-names-values-dynamically\nexport function parameters(func: any): string[] {\n const ARROW = true;\n const FUNC_ARGS = ARROW ? /^(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m : /^(function)\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\n const FUNC_ARG_SPLIT = /,/;\n const FUNC_ARG = /^\\s*(_?)(.+?)\\1\\s*$/;\n const STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n return ((func || '').toString().replace(STRIP_COMMENTS, '').match(FUNC_ARGS) || ['', '', ''])[2]\n .split(FUNC_ARG_SPLIT)\n .map(function (arg: string) {\n return arg.replace(FUNC_ARG, function (all: string, underscore: string, name: string) {\n return name.split('=')[0].trim();\n });\n })\n .filter(String);\n}\n\nexport function thread(...args: ((arg: any) => any)[]) {\n return function (firstArg: any | undefined = undefined) {\n let pipeline = args;\n if (firstArg !== undefined) {\n pipeline.unshift(firstArg);\n }\n return pipeline.reduce((arg: any, fn: (arg: any) => any) => fn(arg));\n };\n}\n\nexport function threadR(...fns: ((arg: any) => any)[]) {\n return function (firstArg: any = undefined) {\n let pipeline = fns;\n if (firstArg !== undefined) {\n pipeline.push(firstArg);\n }\n return pipeline.reduceRight((arg: any, fn: (arg: any) => any) => fn(arg));\n };\n}\n\nexport interface FunctionUtilWrapperProxy extends BaseWrapperProxy {\n curry: (func: (...args: any[]) => any) => (...args: any[]) => any;\n identity: (val: any) => any;\n parameters: (func: any) => string[];\n thread: (...args: any[]) => (firstArg?: any) => any;\n threadR: (...fns: any[]) => (firstArg?: any) => any;\n}\n\n// export const F = {\n// curry,\n// identity,\n// thread,\n// };\n\nexport const F = buildWrapperProxy() as FunctionUtilWrapperProxy;\nF.registerUncurriedFns({ parameters });\n// F.registerCurriedFns({ });\nF.registerStatic({\n curry,\n identity,\n parameters,\n thread,\n threadR,\n});\n","import { Mutex } from 'async-mutex';\n\nimport { V, kind } from './type';\n\nexport type AnyConstructor = new (...args: any[]) => any;\n\n// This represents a set of implementations of the same protocol for the same type.\n// The implementations are named for disambuation purposes.\nclass NamedImplementations<StoredItemType> {\n constructor(\n public impls: Map<string, StoredItemType> = new Map(),\n public defaultImpl: string = '',\n ) {}\n\n register<SpecificItemType extends StoredItemType>(\n name: string,\n implClass: SpecificItemType,\n makeDefault: boolean = false,\n ) {\n if (this.impls.size === 0 || makeDefault) {\n this.setDefaultImpl(name);\n }\n this.impls.set(name, implClass);\n }\n\n get(name?: string): StoredItemType | undefined {\n return this.impls.get(name || this.defaultImpl);\n }\n\n setDefaultImpl(name: string) {\n this.defaultImpl = name;\n }\n}\n\n// This class captures all the named implementations of a particular typeclass/protocol associated with a given type.\n// There will be one of these ImplementationRegistry objects for every typeclass/protocol.\n// This class is responsible for associating types with their corresponding implementations of the typeclass/protocol that this\n// instance represents.\n// For example:\n// const mappableImplementations = new ImplementationRegistry(\"Mappable\");\n// In this example, mappableImplementations would represent all of the named implementations of the Mappable typeclass/protocol\n// for any type. The implementations private member would store all of the per-type named implementations of the Mappable typeclass/protocol\n// as (type => named implementations) pairs.\nclass ImplementationRegistry {\n // implementations is a Map of (type constructor function => ProtocolImplGroup) pairs\n // It stores all the named implementations of the typeclass/protocol associated with the type stored in the key of the map\n private implementations: Map<AnyConstructor, NamedImplementations<AnyConstructor>> = new Map();\n\n constructor(public name: string) {}\n\n register(classConstructor: AnyConstructor, implClass: AnyConstructor, makeDefault: boolean = false) {\n let protocolImplGroup = this.implementations.get(classConstructor);\n if (!protocolImplGroup) {\n protocolImplGroup = new NamedImplementations<AnyConstructor>();\n this.implementations.set(classConstructor, protocolImplGroup);\n }\n\n protocolImplGroup.register(implClass.name, implClass, makeDefault);\n }\n\n use(classConstructor: AnyConstructor, implClass: AnyConstructor) {\n this.register(classConstructor, implClass, true);\n }\n\n public clear() {\n this.implementations.clear();\n }\n\n // returns a class object that implements the typeclass/protocol - this is an implementation of the typeclass/protocol for a given type\n get(classConstructor: AnyConstructor, name?: string) {\n const protocolImplGroup = this.implementations.get(classConstructor);\n if (!protocolImplGroup) {\n throw new Error(`Protocol ${this.name} not implemented by ${classConstructor}`);\n }\n const impl = protocolImplGroup.get(name);\n if (!impl) {\n throw new Error(\n `Named implementation '${\n name || protocolImplGroup.defaultImpl\n }' of protocol ${this.name} not implemented by ${classConstructor}`,\n );\n }\n return impl;\n }\n}\n\n// declare global {\n// var protocolRegistry: Map<string, ImplementationRegistry>;\n// var protocolRegistryLock: Mutex;\n// }\n// global.protocolRegistryLock = global.protocolRegistryLock || new Mutex();\n// await global.protocolRegistryLock.runExclusive(async () => {\n// global.protocolRegistry = global.protocolRegistry || new Map();\n// });\n\n// Every implementation of the protocol must conform to the same interface.\n// The interface defines which methods a user of the protocol implementation may invoke.\nexport class Protocol {\n static protocolRegistryLock: Mutex;\n static registry: Map<string, ImplementationRegistry>;\n\n static {\n Protocol.protocolRegistryLock = Protocol.protocolRegistryLock || new Mutex();\n Protocol.registry = Protocol.registry || new Map();\n }\n\n static getTypeclass(): ImplementationRegistry {\n if (this.registry.has(this.name)) {\n return this.registry.get(this.name) as ImplementationRegistry;\n } else {\n const newTypeclass = new ImplementationRegistry(this.name);\n this.registry.set(this.name, newTypeclass);\n return newTypeclass;\n }\n }\n\n // static getTypeclass(): ImplementationRegistry {\n // if (global.protocolRegistry.has(this.name)) {\n // return global.protocolRegistry.get(this.name) as ImplementationRegistry;\n // } else {\n // const newTypeclass = new ImplementationRegistry(this.name);\n // global.protocolRegistry.set(this.name, newTypeclass);\n // return newTypeclass;\n // }\n // }\n\n static async register(classConstructor: AnyConstructor, implClass: AnyConstructor, makeDefault: boolean = false) {\n await Protocol.protocolRegistryLock.runExclusive(async () => {\n let typeclass = this.getTypeclass();\n typeclass.register(classConstructor, implClass, makeDefault);\n });\n }\n\n static async use(classConstructor: AnyConstructor, implClass: AnyConstructor) {\n await Protocol.protocolRegistryLock.runExclusive(async () => {\n let typeclass = this.getTypeclass();\n typeclass.use(classConstructor, implClass);\n });\n }\n\n // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n static get(classConstructor: AnyConstructor, name?: string) {\n const typeclass = this.getTypeclass();\n // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n return typeclass.get(classConstructor, name);\n }\n\n // returns an instance of the class that implements the typeclass\n // For example, Enumerable.for([1,2,3]) returns a new instance of the EnumerableArray implementation of the\n // Enumerable typeclass on the Array type, initialized with [1,2,3] in the constructor\n static for<S extends Protocol>(\n instance: any,\n // Allow passing the implementation class constructor directly.\n // The 'implClass' parameter from the original signature was used for named lookup,\n // which is handled by this.get() when explicitImplClass is not provided.\n explicitImplClass?: new (self: any) => S,\n ) {\n let finalImplConstructor: new (self: any) => S;\n\n if (explicitImplClass) {\n finalImplConstructor = explicitImplClass;\n } else {\n // Lookup in registry if no explicit class is provided.\n // this.get will retrieve the default implementation for kind(instance).\n finalImplConstructor = this.get(\n kind(instance),\n // No name needed here for the default lookup via this.get(typeConstructor)\n ) as new (self: any) => S;\n }\n return new finalImplConstructor(instance);\n }\n}\n\n// // TC is the class that represents the typeclass, e.g. Mappable\n// class NamedImplementations<TC extends Protocol> {\n// constructor(\n// // new () => TypeclassClass means the constructor function for the TypeclassClass\n// public impls: Map<string, ImplCtor<any, TC>> = new Map(), // this map stores named references to implementations of typeclass classes, e.g. 'MappableArray' -> MappableArray class that extends Mappable, etc.\n// public defaultImpl: string = \"\"\n// ) {}\n\n// register<Impl extends TC>(\n// name: string,\n// implClass: ImplCtor<TC, Impl>,\n// makeDefault: boolean = false\n// ) {\n// if (this.impls.size === 0 || makeDefault) {\n// this.setDefaultImpl(name);\n// }\n// this.impls.set(name, implClass);\n// }\n\n// get<Impl extends TC>(name?: string): Impl | undefined {\n// return this.impls.get(name || this.defaultImpl) as Impl | undefined;\n// }\n\n// setDefaultImpl(name: string) {\n// this.defaultImpl = name;\n// }\n// }\n\n// type EmptyConstructorFor<T> = {\n// new (): T;\n// }\n\n// type ImplCtor<TC extends Protocol, ImplClass extends TC> = EmptyConstructorFor<ImplClass>\n\n// type TCCtor<TC extends Protocol> = EmptyConstructorFor<TC>;\n\n// type TypeThatImplementsATypeclass = Function;\n\n// // Every implementation of the protocol must conform to the same interface.\n// // The interface defines which methods a user of the protocol implementation may invoke.\n// export abstract class Protocol {\n// // // Protocl has two parts, static and instance.\n// // // the static bits have to do with the registry at the class level, e.g. Mappable is a static registry for Mappable implementations\n// // // the instance bits are the implementation of the Mappable\n\n// // // this field is shared among all subclasses of Protocol\n// // private static registry: Map<string, Protocol> = new Map(); // this is a map of (typeclass name -> typeclass instance) pairs.\n\n// // static getTypeclass<TC extends Protocol>(): TC {\n// // if (this.registry.has(this.name)) {\n// // // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// // return this.registry.get(this.name) as unknown as TC;\n// // } else {\n// // const newTypeclass = new (this as unknown as TCCtor<TC>)(); // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// // this.registry.set(this.name, newTypeclass);\n// // return newTypeclass;\n// // }\n// // }\n\n// // static register(\n// // classConstructor: TypeThatImplementsATypeclass,\n// // implClass,\n// // makeDefault: boolean = false\n// // ) {\n// // let typeclass = this.getTypeclass<TC>();\n// // typeclass.register(classConstructor, implClass, makeDefault);\n// // }\n\n// // static use(classConstructor: TypeThatImplementsATypeclass, implClass) {\n// // let typeclass = this.getTypeclass();\n// // typeclass.use(classConstructor, implClass);\n// // }\n\n// // // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n// // static get<TC extends Protocol, ImplClass extends TC>(\n// // classConstructor: TypeThatImplementsATypeclass,\n// // name?: string\n// // ): ImplCtor<TC, ImplClass> {\n// // const typeclass = this.getTypeclass();\n// // // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n// // return typeclass.get(classConstructor, name);\n// // }\n\n// // returns an instance of the class that implements the typeclass\n// // For example, Enumerable.for([1,2,3]) returns a new instance of the EnumerableArray implementation of the\n// // Enumerable typeclass on the Array type, initialized with [1,2,3] in the constructor\n// static for<TC extends Protocol, ImplClass extends TC>(\n// instance,\n// implClassConstructor = undefined\n// ): ImplClass {\n// const implConstructor = ProtocolRegistry.get(this, kind(instance), implClassConstructor?.name);\n// return new implConstructor(instance);\n// }\n\n// // implementations is a Map of (type => NamedImplementations<typeclass class>) pairs\n// // e.g. 'String' -> NamedImplementations<Mappable>\n// // It stores all the named implementations of the typeclass/protocol associated with the type stored in the key of the map\n// private implementations: Map<\n// TypeThatImplementsATypeclass,\n// NamedImplementations<typeof this>\n// > = new Map();\n\n// // constructor(public name: string) {} // we don't need the name anymore because the this.constructor.name is the name of the typeclass, e.g. class Mappable extends Protocol; new Mappable().name is the name \"Mappable\"\n\n// register<ImplClass extends typeof this>(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassConstructor: EmptyConstructorFor<ImplClass>,\n// makeDefault: boolean = false\n// ) {\n// let protocolImplGroup = this.implementations.get(classConstructor);\n// if (!protocolImplGroup) {\n// protocolImplGroup = new NamedImplementations<typeof this>();\n// this.implementations.set(classConstructor, protocolImplGroup);\n// }\n\n// protocolImplGroup.register(\n// implClassConstructor.name,\n// implClassConstructor,\n// makeDefault\n// );\n// }\n\n// use<ImplClass extends typeof this>(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassConstructor: EmptyConstructorFor<ImplClass>,\n// ) {\n// this.register(classConstructor, implClassConstructor, true);\n// }\n\n// // returns a class object that implements the typeclass/protocol - this is an implementation of the typeclass/protocol for a given type\n// get(\n// classConstructor: TypeThatImplementsATypeclass,\n// name?: string\n// ): typeof this {\n// const protocolImplGroup = this.implementations.get(classConstructor);\n// if (!protocolImplGroup) {\n// throw `Protocol ${this.constructor.name} not implemented by ${classConstructor}`;\n// }\n// const impl = protocolImplGroup.get(name);\n// if (!impl) {\n// throw `Named implementation '${\n// name || protocolImplGroup.defaultImpl\n// }' of protocol ${\n// this.constructor.name\n// } not implemented by ${classConstructor}`;\n// }\n// return impl;\n// }\n// }\n\n// // Every implementation of the protocol must conform to the same interface.\n// // The interface defines which methods a user of the protocol implementation may invoke.\n// export abstract class ProtocolRegistry {\n// private static registry: Map<string, Protocol> = new Map(); // this is a map of (typeclass name -> typeclass instance) pairs.\n\n// static getTypeclassForImpl<TC extends Protocol>(implClassCtor): TC {\n// const typeclassCtor = V(implClassCtor).superclass();\n// return this.getTypeclass(typeclassCtor.name);\n// }\n\n// static getTypeclass<TC extends Protocol>(typeclassName): TC {\n// if (this.registry.has(typeclassName)) {\n// return this.registry.get(typeclassName) as unknown as TC;\n// } else {\n// const newTypeclass = new (this as unknown as TCCtor<TC>)(); // in this context, this will not be `Protocol`, it will be a subclass of `Protocol`, like `Mappable`.\n// this.registry.set(typeclassName, newTypeclass);\n// return newTypeclass;\n// }\n// }\n\n// static register(\n// classConstructor: TypeThatImplementsATypeclass,\n// implClassCtor,\n// makeDefault: boolean = false\n// ) {\n// let typeclass = this.getTypeclassForImpl<typeof implClassCtor>(implClassCtor);\n// typeclass.register(classConstructor, implClassCtor, makeDefault);\n// }\n\n// static use(classConstructor: TypeThatImplementsATypeclass, implClassCtor) {\n// let typeclass = this.getTypeclassForImpl<typeof implClassCtor>(implClassCtor);\n// typeclass.use(classConstructor, implClassCtor);\n// }\n\n// // returns a class object that implements the typeclass - this is an implementation of the typeclass for a given type\n// static get<TC extends Protocol, ImplClass extends TC>(\n// typeclassCtor,\n// classConstructor: TypeThatImplementsATypeclass,\n// name?: string\n// ) {\n// // console.log(`looking up typeclass ${typeclass.name} implementation for ${classConstructor.name} named ${name}`)\n// const typeclass = this.registry.get(typeclassCtor.name) as Protocol;\n// return typeclass.get(classConstructor, name);\n// }\n// }\n","import { inspect as nodeInspect } from 'node:util';\nimport { MethodBag, type FunctionBag } from './function';\n\nexport class End {\n private static _instance: End;\n\n private constructor() {}\n\n public static get instance(): End {\n if (!this._instance) {\n this._instance = new End();\n }\n return this._instance;\n }\n}\nexport class Undefined {}\nexport class Null {}\nexport class Class {}\n\nexport function inspect(valueToInspect: any) {\n return nodeInspect(valueToInspect, { showProxy: true });\n}\n\nexport function isA(predicateType: any) {\n return function (value: any): boolean {\n return (\n value instanceof predicateType ||\n kind(value) === predicateType ||\n (value != null &&\n (value.constructor === predicateType || (predicateType.name === 'Object' && typeof value === 'object')))\n );\n };\n}\n\nexport function isAbsent(value: any): boolean {\n return value === null || value === undefined;\n}\n\nexport function isDefined(value: any): boolean {\n return value !== undefined;\n}\n\nconst BUILT_IN_CONSTRUCTORS = [\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Map,\n Set,\n Error,\n Promise,\n Symbol,\n BigInt,\n];\n\nexport function isClass(fn: any): boolean {\n if (typeof fn !== 'function') {\n return false;\n }\n // Check for class keyword syntax for user-defined classes\n if (/^class\\s/.test(Function.prototype.toString.call(fn))) {\n return true;\n }\n // Check if it's one of the built-in constructors that should be treated as a class\n if (BUILT_IN_CONSTRUCTORS.includes(fn)) {\n return true;\n }\n return false;\n}\n\n// true for arrays, functions, objects\nexport function isObject(val: any): boolean {\n return val !== null && (typeof val === 'function' || typeof val === 'object');\n}\n\nexport function isPresent(value: any): boolean {\n return !isAbsent(value);\n}\n\n// returns Null | Undefined | Boolean | Number | BigInt | String | Symbol | Function | Class | class object\n// the returned type should always have a name property\n// kind(new Set()).name -> 'Set'\n// kind(new Set()).name -> 'Set'\nexport function kind(value: any) {\n if (value === null) {\n return Null;\n }\n switch (typeof value) {\n case 'undefined':\n return Undefined;\n case 'boolean':\n return Boolean;\n case 'number':\n return Number;\n case 'bigint':\n return BigInt;\n case 'string':\n return String;\n case 'symbol':\n return Symbol;\n case 'function': // matches class constructors (class objects) and functions\n if (isClass(value)) {\n return Class;\n } else {\n return value.constructor;\n }\n break;\n case 'object': // matches instances of classes (e.g. arrays, ) and objects\n return value.constructor;\n break;\n }\n}\n\nexport function klass(objOrClass: any) {\n if (isClass(objOrClass)) {\n // Use the updated isClass\n return Function; // The 'class' of a class is Function, as per tests\n }\n // It's an instance or a non-class function/object\n const proto = Object.getPrototypeOf(objOrClass);\n if (proto === null || proto === undefined) {\n return undefined; // Or handle as appropriate if tests cover this\n }\n return proto.constructor;\n}\n\nexport function superclass(objOrClass: any) {\n if (objOrClass === Object) {\n return null; // Object has no superclass, as per tests\n }\n\n if (isClass(objOrClass)) {\n // Use the updated isClass\n const proto = Object.getPrototypeOf(objOrClass);\n // For built-ins like String, or base user classes like 'class A {}',\n // their prototype is Function.prototype. Their superclass is Object.\n if (proto === Function.prototype) {\n return Object;\n }\n // For derived classes like 'class C extends B {}', proto is B.\n return proto;\n } else {\n // It's an instance\n const instanceProto = Object.getPrototypeOf(objOrClass);\n if (instanceProto === null || instanceProto === undefined) {\n return undefined;\n }\n const superProto = Object.getPrototypeOf(instanceProto);\n if (superProto === null || superProto === undefined) {\n // This instance's class directly inherits from Object (or has no explicit superclass)\n // or it's an object created with Object.create(null)\n return superProto === null ? null : undefined; // if superProto is null, its constructor is undefined. if it's Object.prototype, constructor is Object\n }\n // If superProto is Object.prototype, then superProto.constructor is Object.\n // If instanceProto is, e.g. an Array instance, instanceProto is Array.prototype.\n // superProto is Object.prototype. superProto.constructor is Object.\n return superProto.constructor;\n }\n}\n\n// export const T = buildPipeThroughFunction();\n// Object.assign(T, {\n// kind,\n// });\n\nclass Value<T> {\n public isWrappedValue = true;\n constructor(public value: T) {}\n\n // isA(predicateType: any): boolean {\n // return isA(predicateType)(this.value);\n // }\n\n // isAbsent(value: any) {\n // return isAbsent(value);\n // }\n\n // isClass(value: unknown) {\n // isClass(value);\n // }\n\n // isPresent(value: any) {\n // return isPresent(value);\n // }\n\n // isError(value: unknown): value is Error {\n // return isError(value);\n // }\n\n // inspect() {\n // return inspect(this.value);\n // }\n\n // kind() {\n // return kind(this.value);\n // }\n\n // klass() {\n // return klass(this.value);\n // }\n\n // superclass() {\n // return superclass(this.value);\n // }\n}\n\n// export const V = function <T>(value: T): Value<T> {\n// return new Value(value);\n// };\n\n// Object.assign(V, {\n// isA,\n// isAbsent,\n// isClass,\n// isPresent,\n// inspect,\n// kind,\n// klass,\n// superclass,\n// });\n\ninterface FunctionWithRegistrationMethods {\n (wrappedValue: any): any; // Original signature of func\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n}\n\nexport interface ValueWrapperProxy extends FunctionWithRegistrationMethods {\n <T>(wrappedValue: T): any; // Represents the function signature of V itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n // Add other static methods if V is supposed to have them directly, e.g., isA, inspect, etc.\n // For now, focusing on the registration methods as per the errors.\n // Static methods registered via V.registerStatic\n isA: (predicateType: any) => (value: any) => boolean;\n isAbsent: (value: any) => boolean;\n isClass: (fn: any) => boolean;\n isDefined: (value: any) => boolean;\n isObject: (val: any) => boolean;\n isPresent: (value: any) => boolean;\n inspect: (valueToInspect: any) => string;\n kind: (value: any) => any; // Adjust 'any' to the actual return type of kind if more specific\n klass: (objOrClass: any) => any; // Adjust 'any' if more specific\n superclass: (objOrClass: any) => any; // Adjust 'any' if more specific\n}\n\nexport function buildValueWrapperProxy(): ValueWrapperProxy {\n const methods = new MethodBag();\n function func(wrappedValue: any): any {\n // wrappedValue is the value passed to the object wrapper function. e.g. A([1,2,3]) the wrappedValue is [1,2,3] and A is the wrapper function called func in this context\n if (!isObject(wrappedValue)) {\n wrappedValue = new Value(wrappedValue);\n }\n return new Proxy(wrappedValue, {\n get(target, property, receiver) {\n // function objects, like O, don't have any properties, so the only properties present will be the function objects we assign to the 'O' function object\n const fnArityPair = methods.lookup(property.toString());\n if (fnArityPair === undefined) {\n if (target.isWrappedValue) {\n return Reflect.get(target.value, property, receiver); // target === Value(wrappedValue)\n } else {\n return Reflect.get(target, property, receiver); // target === wrappedValue\n }\n }\n const [fn, arity] = fnArityPair;\n return function (...args: any) {\n if (arity === 1) {\n // then we are going to treat fn as a function expecting the obj to be supplied as an argument\n if (target.isWrappedValue) {\n // console.log(`111. ${fn}.call(${inspect(receiver)}, ${inspect(target.value)})`);\n\n // target === Value(wrappedValue)\n return fn.call(receiver, target.value);\n } else {\n // console.log(`222. ${fn}.call(${inspect(receiver)}, ${inspect(target)})`);\n return fn.call(receiver, target);\n }\n } else {\n // otherwise, we are going to treat fn as a function expecting the args to be supplied as the argument, which will return a second function that expects the obj to be supplied as its argument\n if (target.isWrappedValue) {\n // console.log(`333. ${fn}.apply(${inspect(receiver)}, ${inspect(args)})(${inspect(target.value)})`);\n return fn.apply(receiver, args)(target.value);\n } else {\n // console.log(`444. ${fn}.apply(${inspect(receiver)}, ${inspect(args)})(${inspect(target)})`);\n return fn.apply(receiver, args)(target);\n }\n }\n };\n },\n });\n }\n Object.assign(func, {\n registerUncurriedFns(fnBag: FunctionBag) {\n return methods.registerUncurriedFns(fnBag);\n },\n registerCurriedFns(fnBag: FunctionBag) {\n return methods.registerCurriedFns(fnBag);\n },\n registerStatic(fnBag: FunctionBag) {\n return methods.registerStatic(fnBag);\n },\n });\n const funcWithMethods = func as FunctionWithRegistrationMethods;\n return new Proxy(funcWithMethods, {\n get(target: any, property: string | symbol, receiver: any) {\n const fn = methods.lookupStatic(property.toString());\n if (fn === undefined) {\n // If the property is not a registered static method,\n // delegate to the target (funcWithMethods), which has registerUncurriedFns etc.\n return Reflect.get(target, property, receiver);\n }\n return fn;\n },\n }) as ValueWrapperProxy;\n}\n\nexport const V = buildValueWrapperProxy() as ValueWrapperProxy;\nV.registerUncurriedFns({\n isAbsent,\n isClass,\n isDefined,\n isObject,\n isPresent,\n inspect,\n kind,\n klass,\n superclass,\n});\nV.registerCurriedFns({ isA });\nV.registerStatic({\n isA,\n isAbsent,\n isClass,\n isDefined,\n isObject,\n isPresent,\n inspect,\n kind,\n klass,\n superclass,\n});\n","import { Protocol } from './protocol';\n\nexport class Compactable<S> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n compact(omit?: any[]): any {\n throw new Error('not implemented');\n }\n}\n\nexport function compact(omit?: any[]) {\n return function <V>(compactableVal: V | V[]): V | V[] | undefined {\n return Compactable.for<Compactable<V | V[]>>(compactableVal).compact(omit);\n };\n}\n","import { identity } from './function';\nimport { End } from './type';\n\nexport class Enumerator<T> implements IterableIterator<T> {\n static for<U>(iterator: Iterator<U>): Enumerator<U> {\n return new Enumerator(iterator);\n }\n\n constructor(private iterator: Iterator<T>) {}\n\n all(predFn: (v: T) => boolean): boolean {\n for (const elem of this) {\n if (!predFn(elem)) {\n return false;\n }\n }\n return true;\n }\n\n any(predFn: (v: T) => boolean): boolean {\n for (const elem of this) {\n if (predFn(elem)) {\n return true;\n }\n }\n return false;\n }\n\n each(visitorFn: (v: T) => any) {\n for (const e of this) {\n visitorFn(e);\n }\n }\n\n first<U>(predFn: (v: T) => any = identity, defaultIfAbsesnt: U | undefined = undefined): T | U | undefined {\n for (const e of this) {\n if (predFn(e)) return e;\n }\n return defaultIfAbsesnt;\n }\n\n map<U>(mapFn: (v: T) => U): Enumerator<U> {\n function* gen(iterator: Enumerator<T>) {\n for (const e of iterator) {\n yield mapFn(e);\n }\n }\n return Enumerator.for(gen(this));\n }\n\n // per https://typescript.tv/hands-on/all-you-need-to-know-about-iterators-and-generators/#the-iterator-protocol\n // implement the IterableIterator interface by implementing [Symbol.iterator]() and next()\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n // per https://typescript.tv/hands-on/all-you-need-to-know-about-iterators-and-generators/#the-iterator-protocol\n // implement the IterableIterator interface by implementing [Symbol.iterator]() and next()\n next(): IteratorResult<T> {\n const val = this.produce();\n if (val instanceof End) {\n return { done: true, value: End.instance };\n }\n return { done: false, value: val };\n }\n\n // this produces either the next value in the Enumerator, or it returns End\n produce(): T | End {\n const val: IteratorResult<T> = this.iterator.next();\n if (val.done) {\n return End.instance;\n }\n return val.value;\n }\n\n select(predFn: (v: T) => boolean): Enumerator<T> {\n function* gen(iterator: Enumerator<T>) {\n for (const e of iterator) {\n if (predFn(e)) yield e;\n }\n }\n return Enumerator.for(gen(this));\n }\n\n toArray(): T[] {\n return Array.from(this);\n }\n\n toMap<K, V>(kvMapFn: (v: T) => [K, V]): Map<K, V> {\n return new Map(this.map(kvMapFn));\n }\n\n toSet(): Set<T> {\n return new Set(this);\n }\n}\n","import { Protocol } from './protocol';\nimport type { AnyConstructor } from './protocol';\nimport { Enumerator } from './enumerator';\n\nexport type ImplementsEnumerable = {};\n\nexport class Enumerable<S, T> extends Protocol {\n static each = each;\n\n constructor(public self: S) {\n super();\n }\n\n each(visitorFn: (v: T) => any) {\n return this.toEnumerator().each(visitorFn);\n }\n\n *emit(): Generator<T> {\n throw new Error('emit not implemented');\n }\n\n toArray(): T[] {\n return this.toEnumerator().toArray();\n }\n\n toEnumerator(): Enumerator<T> {\n return Enumerator.for(this.emit());\n }\n\n toSet(): Set<T> {\n return this.toEnumerator().toSet();\n }\n}\n\nexport function each<T>(visitorFn: (v: T) => any) {\n return function (enumerableVal: Iterable<T>, implClass?: AnyConstructor) {\n return Enumerable.for(enumerableVal, implClass).each(visitorFn);\n };\n}\n","import { Protocol, type AnyConstructor } from './protocol';\n\n/**\n * The interpretation of the generic type parameters is:\n * S is the self type. For example: T[]\n *\n * T is the element type that is being iterated over from the self type, S.\n * For example, when S is T[], then the element type is likely going to be T.\n *\n * U is the type that we are transforming T into.\n * For example, when S is T[], then the element type is likely going to be T,\n * and the mapping function from T -> U means that the transformation type is U.\n */\nexport class Mappable<S, T, U> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n map(mapFn: (v: T) => U): any {\n throw new Error('not implemented');\n }\n}\n\nexport function map<T, U>(mapFn: (v: T) => U) {\n return function (mappableVal: any, explicitImplClass?: new (self: any) => Mappable<any, T, U>) {\n return Mappable.for(mappableVal, explicitImplClass).map(mapFn);\n };\n}\n\nexport class AsyncMappable<S, T, U> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n async map(mapFn: (v: T) => Promise<U>): Promise<any> {\n throw new Error('not implemented');\n }\n}\n\nexport function asyncMap<T, U>(mapFn: (v: T) => Promise<U>) {\n return async function (mappableVal: any, explicitImplClass?: new (self: any) => AsyncMappable<any, T, U>) {\n return await AsyncMappable.for(mappableVal, explicitImplClass).map(mapFn);\n };\n}\n","import { Protocol, type AnyConstructor } from './protocol';\n\nexport class Selectable<S, T> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n select(predFn: (e: T) => boolean): any {\n throw new Error('not implemented');\n }\n}\n\nexport function select<T>(predFn: (e: T) => boolean) {\n return function <S>(selectableVal: S, implClass?: AnyConstructor) {\n return Selectable.for(selectableVal, implClass).select(predFn);\n };\n}\n","import { toSet } from './array';\nimport { Compactable } from './compactable';\nimport { Enumerable } from './enumerable';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\n\nclass CompactableArray<T> extends Compactable<T[]> {\n compact(omit?: any[]) {\n omit ||= [null, undefined];\n\n const omitSet = toSet(omit);\n const newArr: any[] = [];\n for (const val of this.self) {\n if (!omitSet.has(val)) {\n newArr.push(val);\n }\n }\n return newArr;\n }\n}\nawait Compactable.register(Array, CompactableArray, true);\n\nclass MappableArray<T, U> extends Mappable<T[], T, U> {\n map(mapFn: (v: T) => U): any {\n return this.self.map(mapFn);\n }\n}\nawait Mappable.register(Array, MappableArray, true);\n\nexport class AsyncMappableArray<T, U> extends AsyncMappable<T[], T, U> {\n async map(mapFn: (v: T) => Promise<U>) {\n const arr: U[] = [];\n for await (const v of this.self) {\n const mappedValue = await mapFn(v);\n arr.push(mappedValue);\n }\n return arr;\n }\n}\nawait AsyncMappable.register(Array, AsyncMappableArray, true);\n\nclass EnumerableArray<T> extends Enumerable<T[], T> {\n *emit() {\n for (const e of this.self) yield e;\n }\n}\nawait Enumerable.register(Array, EnumerableArray, true);\n\nclass SelectableArray<T> extends Selectable<T[], T> {\n select(predFn: (v: T) => boolean): T[] {\n return this.self.filter(predFn);\n }\n}\nawait Selectable.register(Array, SelectableArray, true);\n","import { buildWrapperProxy } from './function';\n\nexport function each<K, V>(eachFn: (pair: [K, V]) => void) {\n return function (map: Map<K, V>): void {\n map.forEach((value, key) => {\n eachFn([key, value]);\n });\n };\n}\n\nexport function isEmpty<K, V>(map: Map<K, V>): boolean {\n return map.size === 0;\n}\n\n/**\n * @returns An array of the map's keys.\n *\n * ```ts\n * keys(\n * new Map([\n * [\"foo\", [1, 2, 3]],\n * [\"bar\", [4, 6, 7]],\n * ])\n * )\n * // [ 'foo', 'bar' ]\n * ```\n */\nexport function keys<K, V>(map: Map<K, V>): K[] {\n return Array.from(map.keys());\n}\n\nexport function map<K, V, T>(mapFn: (pair: [K, V]) => [K, T]) {\n return function (map: Map<K, V>): Map<K, T> {\n const m = new Map<K, T>();\n map.forEach((value, key) => {\n const [newKey, newValue] = mapFn([key, value]);\n m.set(newKey, newValue);\n });\n return m;\n };\n}\n\nexport function select<K, V>(predFn: (pair: [K, V]) => boolean) {\n return function (map: Map<K, V>): Map<K, V> {\n const newMap = new Map<K, V>();\n map.forEach((value, key) => {\n if (predFn([key, value])) {\n newMap.set(key, value);\n }\n });\n return newMap;\n };\n}\n\nexport function toObject<K, V>(map: Map<K, V>): object {\n return Object.fromEntries(map.entries());\n}\n\nexport function values<K, V>(map: Map<K, V>): V[] {\n return Array.from(map.values());\n}\n\n// export const M = buildPipeThroughFunction();\n\n// Object.assign(M, {\n// each,\n// isEmpty,\n// keys,\n// map,\n// select,\n// toObject,\n// values,\n// });\n\nexport const M = buildWrapperProxy();\nM.registerUncurriedFns({ isEmpty, keys, toObject, values });\nM.registerCurriedFns({ each, map, select });\nM.registerStatic({\n each,\n isEmpty,\n keys,\n map,\n select,\n toObject,\n values,\n});\n\nimport './all-protocols';\n","import { Enumerable } from './enumerable';\nimport { M } from './map';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\n\nexport class MapToMap<K, V, T, U> extends Mappable<Map<K, V>, [K, V], [T, U]> {\n map(mapFn: (pair: [K, V]) => [T, U]) {\n const m = new Map<T, U>();\n this.self.forEach((value, key) => {\n const [newKey, newValue] = mapFn([key, value]);\n m.set(newKey, newValue);\n });\n return m;\n }\n}\n\nexport class MapToArray<K, V, T> extends Mappable<Map<K, V>, [K, V], T> {\n map(mapFn: (pair: [K, V]) => T) {\n const arr: T[] = [];\n this.self.forEach((value, key) => {\n const mappedValue = mapFn([key, value]);\n arr.push(mappedValue);\n });\n return arr;\n }\n}\n\nawait Mappable.register(Map, MapToMap, true);\nawait Mappable.register(Map, MapToArray);\n\nexport class AsyncMapToMap<K, V, T, U> extends AsyncMappable<Map<K, V>, [K, V], [T, U]> {\n async map(mapFn: (pair: [K, V]) => Promise<[T, U]>) {\n const m = new Map<T, U>();\n for await (const [key, value] of this.self) {\n const [newKey, newValue] = await mapFn([key, value]);\n m.set(newKey, newValue);\n }\n return m;\n }\n}\n\nexport class AsyncMapToArray<K, V, T> extends AsyncMappable<Map<K, V>, [K, V], T> {\n async map(mapFn: (pair: [K, V]) => Promise<T>) {\n const arr: T[] = [];\n for await (const [key, value] of this.self) {\n const mappedValue = await mapFn([key, value]);\n arr.push(mappedValue);\n }\n return arr;\n }\n}\n\nawait AsyncMappable.register(Map, AsyncMapToMap, true);\nawait AsyncMappable.register(Map, AsyncMapToArray);\n\nexport class EnumerablePair<K, V> extends Enumerable<Map<K, V>, [K, V]> {\n *emit(): Generator<[K, V]> {\n for (const [k, v] of this.self.entries()) {\n yield [k, v];\n }\n }\n}\n\nexport class EnumerableKey<K, V> extends Enumerable<Map<K, V>, K> {\n *emit() {\n for (const k of this.self.keys()) {\n yield k;\n }\n }\n}\n\nexport class EnumerableValue<K, V> extends Enumerable<Map<K, V>, V> {\n *emit() {\n for (const v of this.self.values()) {\n yield v;\n }\n }\n}\n\nawait Enumerable.register(Map, EnumerablePair, true);\nawait Enumerable.register(Map, EnumerableKey);\nawait Enumerable.register(Map, EnumerableValue);\n\nexport class SelectableMap<K, V> extends Selectable<Map<K, V>, [K, V]> {\n select(predFn: (v: [K, V]) => boolean): Map<K, V> {\n return M(this.self).select(predFn);\n }\n}\nawait Selectable.register(Map, SelectableMap, true);\n","import { buildWrapperProxy, type FunctionBag, type BaseWrapperProxy } from './function';\n\n// Interface for the wrapped object O(obj)\nexport interface WrappedObject<V> {\n each: (eachFn: (pair: [string, V]) => void) => void;\n keys: () => string[];\n map: <T>(mapFn: (pair: [string, V]) => [string, T]) => { [s: string]: T };\n pick: (keysToPick: Set<string>) => { [s: string]: V };\n select: (predFn: (pair: [string, V]) => boolean) => { [s: string]: V };\n toMap: () => Map<string, V>;\n values: () => V[];\n}\n\n// Interface for the O proxy object\nexport interface ObjectWrapperProxy extends BaseWrapperProxy {\n <V>(wrappedValue: { [s: string]: V }): WrappedObject<V>;\n\n // Static methods on O - these match the exported function signatures\n each: <V>(eachFn: (pair: [string, V]) => void) => (object: { [s: string]: V }) => void;\n keys: <V>(object: { [s: string]: V }) => string[];\n map: <V, T>(mapFn: (pair: [string, V]) => [string, T]) => (object: { [s: string]: V }) => { [s: string]: T };\n pick: (keys: Set<string>) => <V>(object: { [s: string]: V }) => { [s: string]: V };\n select: <V>(predFn: (pair: [string, V]) => boolean) => (object: { [s: string]: V }) => { [s: string]: V };\n toMap: <V>(object: { [s: string]: V }) => Map<string, V>;\n values: <V>(object: { [s: string]: V }) => V[];\n\n // Note: registerUncurriedFns, registerCurriedFns, registerStatic are inherited from BaseWrapperProxy\n}\n\nexport function each<V>(eachFn: (pair: [string, V]) => void) {\n return function (object: { [s: string]: V }): void {\n Object.entries<V>(object).forEach((kvPair) => {\n eachFn(kvPair);\n });\n };\n}\n\nexport function keys<V>(object: { [s: string]: V }): string[] {\n return Object.keys(object);\n}\n\nexport function map<V, T>(mapFn: (pair: [string, V]) => [string, T]) {\n return function (object: { [s: string]: V }): { [s: string]: T } {\n const obj: { [s: string]: T } = {};\n Object.entries<V>(object).forEach((kvPair) => {\n const [newKey, newValue] = mapFn(kvPair);\n obj[newKey] = newValue;\n });\n return obj;\n };\n}\n\nexport function pick(keysToPick: Set<string>) {\n // Renamed 'keys' to 'keysToPick' for clarity with WrappedObject.pick\n return select<any>(([key, _]) => keysToPick.has(key)); // Use 'any' as placeholder, select's V will be the actual type\n}\n\nexport function select<V>(predFn: (pair: [string, V]) => boolean) {\n return function (object: { [s: string]: V }): { [s: string]: V } {\n const obj: { [s: string]: V } = {};\n Object.entries<V>(object).forEach((kvPair) => {\n if (predFn(kvPair)) {\n const [k, v] = kvPair;\n obj[k] = v;\n }\n });\n return obj;\n };\n}\n\nexport function toMap<V>(object: { [s: string]: V }): Map<string, V> {\n return new Map(Object.entries<V>(object));\n}\n\nexport function values<V>(object: { [s: string]: V }): V[] {\n return Object.values<V>(object);\n}\n\n// const _O = buildPipeThroughFunction();\n\n// Object.assign(_O, {\n// each, // (eachFn)(obj) => ...\n// keys, // (obj) => ...\n// map,\n// pick,\n// select,\n// toMap,\n// values,\n// });\n\n// export const O = _O;\n\nexport const O = buildWrapperProxy() as ObjectWrapperProxy;\nO.registerUncurriedFns({ keys, toMap, values });\nO.registerCurriedFns({ each, map, pick, select });\nO.registerStatic({\n each, // (eachFn)(obj) => ...\n keys, // (obj) => ...\n map,\n pick,\n select,\n toMap,\n values,\n});\n\nimport './all-protocols';\n","import { O } from './object';\nimport { Selectable } from './selectable';\n\nclass SelectableObject<V> extends Selectable<object, [string, V]> {\n select(predFn: (v: [string, V]) => boolean): object {\n return O(this.self).select(predFn);\n }\n}\nawait Selectable.register(Object, SelectableObject, true);\n","import { copyFile, cp, readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, lstatSync } from 'node:fs';\nimport { win32, posix } from 'node:path';\nimport type { ParsedPath } from 'node:path';\nimport { homedir } from 'node:os';\nimport { glob, globSync, globStream, globStreamSync, Glob } from 'glob';\nimport { isWindows } from './platform';\nimport { A } from './array';\nimport { Str } from './string';\nimport { Range } from './range';\nimport { Equal } from './equal';\n\nexport class Path {\n static new(path: Path | string, isWindowsPath: boolean = isWindows()): Path {\n if (path instanceof Path) {\n return path;\n }\n return new Path(path, isWindowsPath);\n }\n\n static cwd(): Path {\n return Path.new(process.cwd());\n }\n\n static homeDir(): Path {\n return Path.new(homedir());\n }\n\n static sep(isWindowsPath: boolean = isWindows()) {\n if (isWindowsPath) {\n return win32.sep;\n } else {\n return posix.sep;\n }\n }\n\n constructor(\n public path: string,\n public isWindowsPath: boolean = isWindows(),\n ) {}\n\n absolute(): Path {\n return this.resolve();\n }\n\n ancestors(): Path[] {\n if (this.isRoot()) {\n return [];\n }\n\n const ancestors: Path[] = [];\n let current: Path = this.directory();\n\n while (true) {\n ancestors.push(current);\n\n if (current.isRoot()) {\n break;\n }\n\n current = current.parent();\n }\n return ancestors;\n }\n\n basename(suffix?: string): Path {\n if (this.isWindowsPath) {\n return this.build(win32.basename(this.path, suffix));\n } else {\n return this.build(posix.basename(this.path, suffix));\n }\n }\n\n build(path: string): Path {\n return new Path(path, this.isWindowsPath);\n }\n\n // returns the path to the destination on success; null otherwise\n async copy(destPath: Path | string, mode?: number): Promise<Path | null> {\n destPath = Path.new(destPath).normalize();\n try {\n if (this.isDirectory()) {\n await cp(this.toString(), destPath.toString(), { mode, recursive: true });\n } else {\n await copyFile(this.toString(), destPath.toString(), mode);\n }\n return destPath;\n } catch (e) {\n return null;\n }\n }\n\n dirContains(filename: string): boolean {\n return this.isDirectory() && this.glob(filename).length > 0;\n }\n\n directory(): Path {\n return this.absolute().dirname();\n }\n\n // given a path like \"bar/bas\", this method converts the path to an absolute path (e.g. \"/foo/bar/bas\"),\n // and then returns the directory tree as an array of the form [\"foo\", \"bar\", \"bas\"]\n directorySegments(): string[] {\n return this.absolute().dirname().split();\n }\n\n dirname(): Path {\n if (this.isWindowsPath) {\n return this.build(win32.dirname(this.path));\n } else {\n return this.build(posix.dirname(this.path));\n }\n }\n\n equals(other: any): boolean {\n if (!(other instanceof Path)) {\n return false;\n }\n return this.path === other.path && this.isWindowsPath === other.isWindowsPath;\n }\n\n exists(): boolean {\n return existsSync(this.path);\n }\n\n ext(): string {\n return this.parse().ext;\n }\n\n glob(pattern: string) {\n const cwd = this.absolute().toString();\n return globSync(pattern, { cwd }).map((path) => this.build(path));\n }\n\n isAbsolute(): boolean {\n if (this.isWindowsPath) {\n return win32.isAbsolute(this.path);\n } else {\n return posix.isAbsolute(this.path);\n }\n }\n\n isDirectory(): boolean {\n return this.exists() && lstatSync(this.path).isDirectory();\n }\n\n isFile(): boolean {\n return this.exists() && lstatSync(this.path).isFile();\n }\n\n isPosix(): boolean {\n return !this.isWindowsPath;\n }\n\n isRoot(): boolean {\n return this.parse().root === this.normalize().toString();\n }\n\n isWindows(): boolean {\n return this.isWindowsPath;\n }\n\n join(...paths: string[]): Path {\n if (this.isWindowsPath) {\n return this.build(win32.join(this.path, ...paths));\n } else {\n return this.build(posix.join(this.path, ...paths));\n }\n }\n\n normalize(): Path {\n if (this.isWindowsPath) {\n return this.build(win32.normalize(this.path));\n } else {\n return this.build(posix.normalize(this.path));\n }\n }\n\n parent(count: number = 1) {\n let path = this.absolute();\n Range.new(1, count).each((i) => {\n path = path.resolve('..');\n });\n return path;\n }\n\n // returns an object of the form: { root, dir, base, ext, name }\n //\n // Posix:\n // >>> path.parse('/home/user/dir/file.txt')\n // { root: '/',\n // dir: '/home/user/dir',\n // base: 'file.txt',\n // ext: '.txt',\n // name: 'file' }\n // ┌─────────────────────┬────────────┐\n // │ dir │ base │\n // ├──────┬ ├──────┬─────┤\n // │ root │ │ name │ ext │\n // \" / home/user/dir / file .txt \"\n // └──────┴──────────────┴──────┴─────┘\n // (All spaces in the \"\" line should be ignored. They are purely for formatting.)\n //\n // Windows:\n // >>> path.parse('C:\\\\path\\\\dir\\\\file.txt');\n // { root: 'C:\\\\',\n // dir: 'C:\\\\path\\\\dir',\n // base: 'file.txt',\n // ext: '.txt',\n // name: 'file' }\n // ┌─────────────────────┬────────────┐\n // │ dir │ base │\n // ├──────┬ ├──────┬─────┤\n // │ root │ │ name │ ext │\n // \" C:\\ path\\dir \\ file .txt \"\n // └──────┴──────────────┴──────┴─────┘\n // (All spaces in the \"\" line should be ignored. They are purely for formatting.)\n parse(): ParsedPath {\n if (this.isWindowsPath) {\n return win32.parse(this.path);\n } else {\n return posix.parse(this.path);\n }\n }\n\n pop(count: number = 1): Path {\n return this.parent(count);\n }\n\n relative(to: string): Path {\n if (this.isWindowsPath) {\n return this.build(win32.relative(this.path, to));\n } else {\n return this.build(posix.relative(this.path, to));\n }\n }\n\n resolve(...paths: string[]): Path {\n if (this.isWindowsPath) {\n return this.build(win32.resolve(this.path, ...paths));\n } else {\n return this.build(posix.resolve(this.path, ...paths));\n }\n }\n\n root(): Path {\n const { root } = this.parse();\n return this.build(root);\n }\n\n selfAndAncestors(): Path[] {\n const ancestors: Path[] = [];\n let current: Path = this.absolute();\n\n while (true) {\n ancestors.push(current);\n\n if (current.isRoot()) {\n break;\n }\n\n current = current.parent();\n }\n return ancestors;\n }\n\n // returns the parts of the path, excluding the root if applicable\n // /home/user/dir/file.txt -> [\"home\", \"user\", \"dir\", \"file.txt\"]\n // C:\\home\\user\\dir\\file.txt -> [\"home\", \"user\", \"dir\", \"file.txt\"]\n // user/dir/file.txt -> [\"user\", \"dir\", \"file.txt\"]\n // user\\dir\\file.txt -> [\"user\", \"dir\", \"file.txt\"]\n split(): string[] {\n const normalized = this.normalize();\n if (normalized.isAbsolute()) {\n const { root } = normalized.parse();\n const relPath = Str(normalized.toString()).trimPrefix(root);\n return relPath.split(Path.sep(this.isWindowsPath));\n } else {\n return normalized.toString().split(Path.sep(this.isWindowsPath));\n }\n }\n\n toString(): string {\n return this.path;\n }\n}\n\nclass PathEqualImpl extends Equal<Path> {\n equal(val: Path): boolean {\n return this.self.equals(val);\n }\n}\n\nawait Equal.register(Path, PathEqualImpl, true);\n","import { platform as nodePlatform } from 'node:process';\n\nexport function isPosix(): boolean {\n const posixPlatforms: NodeJS.Platform[] = ['darwin', 'freebsd', 'linux', 'netbsd', 'openbsd', 'sunos'];\n return posixPlatforms.includes(platform());\n}\n\nexport function isWindows(): boolean {\n return platform() == 'win32';\n}\n\nexport function platform(): NodeJS.Platform {\n return nodePlatform;\n}\n","import { V } from './type';\n\n// Define an interface for the Str object/function\ninterface StringWrapper {\n (str: string): StringProxy; // Callable signature\n isEmpty: typeof isEmpty;\n isNumeric: typeof isNumeric;\n matches: typeof matches;\n}\n\nexport function isEmpty(str: string): boolean {\n return str.length == 0;\n}\n\nexport function isNumeric(str: string): boolean {\n if (typeof str !== 'string') return false;\n const trimmedStr = str.trim();\n if (trimmedStr === '') return false; // Empty or whitespace-only string is not numeric\n const num = Number(trimmedStr);\n // Check if it's a number, finite, and if the string version of the number matches the trimmed original string\n return !isNaN(num) && isFinite(num) && String(num) === trimmedStr;\n}\n\n/**\n * @param regexp must be a global regexp, e.g. /foo/g, and not just /foo/\n * @returns array of matches, or null if no matches present\n * Example:\n * const regexp = /t(e)(st(\\d?))/g;\n * const str = 'test1test2';\n *\n * const array = matches(regexp)(str)\n *\n * > matches(regexp)(str)\n * [\n * [\n * 'test1',\n * 'e',\n * 'st1',\n * '1',\n * index: 0,\n * input: 'test1test2',\n * groups: undefined\n * ],\n * [\n * 'test2',\n * 'e',\n * 'st2',\n * '2',\n * index: 5,\n * input: 'test1test2',\n * groups: undefined\n * ]\n * ]\n *\n * > matches(/foo/g)(\"blah\")\n * null\n */\nexport function matches(regexp: RegExp) {\n const globalRegex = regexp.global ? regexp : new RegExp(regexp.source, regexp.flags + 'g');\n return function (str: string) {\n const matches = [...str.matchAll(globalRegex)];\n if (matches.length == 0) return null;\n return matches;\n };\n}\n\nexport class StringProxy {\n // Add common string properties/methods for TypeScript\n public get length(): number {\n return this.str.length;\n }\n\n public toUpperCase(): string {\n return this.str.toUpperCase();\n }\n\n constructor(public str: string) {}\n\n isEmpty() {\n return isEmpty(this.str);\n }\n\n isNumeric() {\n return isNumeric(this.str);\n }\n\n matches(regexp: RegExp) {\n return matches(regexp)(this.str);\n }\n\n trimPrefix(prefix: string): string {\n if (this.str.startsWith(prefix)) {\n return this.str.slice(prefix.length);\n }\n return this.str;\n }\n\n trimSuffix(suffix: string): string {\n if (this.str.endsWith(suffix)) {\n return this.str.slice(0, this.str.length - suffix.length);\n }\n return this.str;\n }\n}\n\n// Cast Str to the StringWrapper interface\nexport const Str = function (str: string): StringProxy {\n const handler = {\n get(target: StringProxy, property: string | symbol, receiver: any) {\n // target is instance of StringProxy\n // Check if property exists on StringProxy instance itself (e.g. isEmpty, isNumeric)\n // or on its prototype chain.\n const propOnTarget = Reflect.get(target, property, receiver);\n\n if (V.isPresent(propOnTarget)) {\n // V.isPresent checks for null or undefined\n // If propOnTarget is a function (method of StringProxy), it's already correctly bound or doesn't need special binding.\n return propOnTarget;\n }\n\n // Property not found on StringProxy instance. Try the underlying string.\n const underlyingString = target.str;\n // Access the property directly from the string primitive.\n // Using `as any` to allow indexing with symbol, though typical string properties are strings.\n const valueFromPrimitive = (underlyingString as any)[property];\n\n if (typeof valueFromPrimitive === 'function') {\n // If it's a method from the string (e.g., toUpperCase, charAt), bind it to the underlying string.\n return valueFromPrimitive.bind(underlyingString);\n }\n\n // For non-function properties (e.g., 'length'), or if the property doesn't exist on a string (valueFromPrimitive will be undefined).\n return valueFromPrimitive;\n },\n };\n\n return new Proxy(new StringProxy(str), handler);\n} as StringWrapper;\n\nObject.assign(Str, {\n isEmpty,\n isNumeric,\n matches,\n});\n","import { Enumerable } from './enumerable';\n\nexport class Range {\n static new(start: number, end: number, inclusive: boolean = true): Range {\n return new Range(start, end, inclusive);\n }\n\n constructor(\n public start: number,\n public end: number,\n public inclusive: boolean = true,\n ) {}\n\n each(visitorFn: (num: number) => any) {\n const exclusiveEnd = this.inclusive ? this.end + 1 : this.end;\n for (let i = this.start; i < exclusiveEnd; i++) {\n visitorFn(i);\n }\n }\n\n equals(other: any): boolean {\n if (!(other instanceof Range)) {\n return false;\n }\n return this.start === other.start && this.end === other.end && this.inclusive === other.inclusive;\n }\n\n map<T>(mapFn: (num: number) => T): T[] {\n const arr: T[] = [];\n this.each((num) => {\n arr.push(mapFn(num));\n });\n return arr;\n }\n\n toArray(): number[] {\n return Enumerable.for<Enumerable<Range, number>>(this).toArray();\n }\n}\n","import { Protocol } from './protocol';\n\nexport class Equal<S> extends Protocol {\n constructor(public self: S) {\n super();\n }\n\n equal(val: S): boolean {\n throw new Error('equal not implemented');\n }\n\n notEqual(val: S): boolean {\n return !this.equal(val);\n }\n\n eq(val: S): boolean {\n return this.equal(val);\n }\n\n neq(val: S): boolean {\n return this.notEqual(val);\n }\n}\n\nexport function equal<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).equal(other);\n}\n\nexport function notEqual<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).notEqual(other);\n}\n\nexport function eq<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).equal(other);\n}\n\nexport function neq<T>(self: T, other: T, implClass?: new (self: T) => Equal<T>) {\n return Equal.for(self, implClass).neq(other);\n}\n","import { Range } from './range';\nimport { Enumerable } from './enumerable';\nimport { Mappable, AsyncMappable } from './mappable';\nimport { Selectable } from './selectable';\nimport { Equal } from './equal';\n\nclass MappableRange<T> extends Mappable<Range, number, T> {\n map(mapFn: (v: number) => T): T[] {\n return this.self.map(mapFn);\n }\n}\nawait Mappable.register(Range, MappableRange, true);\n\n// export class AsyncMappableRange<T, U> extends AsyncMappable<T[], T, U> {\n// async map(mapFn: (v: T) => Promise<U>) {\n// const arr: U[] = [];\n// for await (const v of this.self) {\n// const mappedValue = await mapFn(v);\n// arr.push(mappedValue);\n// }\n// return arr;\n// }\n// }\n// await AsyncMappable.register(Range, AsyncMappableRange, true);\n\nclass EnumerableRange extends Enumerable<Range, number> {\n *emit() {\n const exclusiveEnd = this.self.inclusive ? this.self.end + 1 : this.self.end;\n for (let i = this.self.start; i < exclusiveEnd; i++) {\n yield i;\n }\n }\n}\nawait Enumerable.register(Range, EnumerableRange, true);\n\nclass EqualRange extends Equal<Range> {\n equal(other: Range): boolean {\n return this.self.equals(other);\n }\n}\nawait Equal.register(Range, EqualRange, true);\n\nclass SelectableRange extends Selectable<Range, number> {\n select(predFn: (v: number) => boolean): number[] {\n let arr: number[] = [];\n this.self.each((num) => {\n if (predFn(num)) {\n arr.push(num);\n }\n });\n return arr;\n }\n}\nawait Selectable.register(Range, SelectableRange, true);\n","import { Enumerable } from './enumerable';\nimport { Mappable } from './mappable';\n\nclass MappableSet<T, U> extends Mappable<Set<T>, T, U> {\n map(mapFn: (v: T) => U) {\n const s = new Set<U>();\n this.self.forEach((value) => {\n const newValue = mapFn(value);\n s.add(newValue);\n });\n return s;\n }\n}\nawait Mappable.register(Set, MappableSet, true);\n\nclass EnumerableSet<T> extends Enumerable<Set<T>, T> {\n // each(visitorFn: (v: T) => any): any {\n // return this.self.forEach((v) => visitorFn(v));\n // }\n *emit() {\n for (const e of this.self) {\n yield e;\n }\n }\n}\nawait Enumerable.register(Set, EnumerableSet, true);\n","import { buildWrapperProxy, identity, type BaseWrapperProxy } from './function';\n\nexport function compact(omit: any[] = [null, undefined]) {\n return function (arr: any[]): any[] {\n const omitSet = toSet(omit);\n const newArr: any[] = [];\n for (const val of arr) {\n if (!omitSet.has(val)) {\n newArr.push(val);\n }\n }\n return newArr;\n };\n}\n\nexport function concat<T>(tail: T[]) {\n return function (arr: T[]): T[] {\n return arr.concat(tail);\n };\n}\n\nexport function each<T>(eachFn: (value: T) => void) {\n return function (arr: Array<T>): void {\n arr.forEach((value) => {\n eachFn(value);\n });\n };\n}\n\nexport function find<T>(predicateFn: (v: T) => any) {\n return function (arr: Array<T>): T | undefined {\n for (const val of arr) {\n if (predicateFn(val)) {\n return val;\n }\n }\n return undefined;\n };\n}\n\n// returns the first n elements\nexport function first<T>(n: number) {\n return function (arr: T[]): T[] {\n return arr.slice(0, n);\n };\n}\n\nexport function head<T>(arr: T[]): T | undefined {\n return arr[0];\n}\n\nexport function isEmpty<T>(arr: Array<T>): boolean {\n return arr.length === 0;\n}\n\nexport function join(separator?: string) {\n return function <T>(arr: T[]): string {\n return arr.join(separator);\n };\n}\n\n// returns the last n elements\nexport function last<T>(n: number) {\n return function (arr: T[]): T[] {\n return arr.slice(arr.length - n, arr.length);\n };\n}\n\nexport function map<T, U>(mapFn: (value: T) => U) {\n return function (arr: Array<T>): Array<U> {\n return arr.map(mapFn);\n };\n}\n\nexport function nth(n: number) {\n return function <T>(arr: T[]): T | undefined {\n return arr[n];\n };\n}\n\nexport function partition<T>(predFn: (e: T) => boolean) {\n return function (arr: T[]): [T[], T[]] {\n const trueArr: T[] = [];\n const falseArr: T[] = [];\n for (const val of arr) {\n if (predFn(val)) {\n trueArr.push(val);\n } else {\n falseArr.push(val);\n }\n }\n return [trueArr, falseArr];\n };\n}\n\nexport function prepend<T>(...values: T[]) {\n return function (arr: T[]): T[] {\n arr.splice(0, 0, ...values);\n return arr;\n };\n}\n\nexport function select<T>(predFn: (e: T) => boolean) {\n return function (arr: T[]): T[] {\n return arr.filter(predFn);\n };\n}\n\n// returns the trailing elements of the array except for the leading n elements\nexport function skipFirst<T>(n: number) {\n return function (arr: T[]): T[] {\n if (n > arr.length) {\n n = arr.length;\n }\n return arr.slice(n, arr.length);\n };\n}\n\n// returns the leading elements of the array except for the trailing n elements\nexport function skipLast<T>(n: number) {\n return function (arr: T[]): T[] {\n if (n > arr.length) {\n n = arr.length;\n }\n return arr.slice(0, arr.length - n);\n };\n}\n\nexport function toSet(arr: Array<any>) {\n return new Set(arr);\n}\n\nexport function uniq(arr: Array<any>) {\n return uniqBy(identity)(arr);\n}\n\nexport function uniqBy<T, U>(comparisonValueFn: (value: T) => U) {\n return function (arr: Array<T>): Array<T> {\n const map = new Map<U, T>();\n for (const val of arr) {\n const key = comparisonValueFn(val);\n if (!map.has(key)) {\n map.set(key, val);\n }\n }\n return Array.from(map.values());\n };\n}\n\nexport function zip<T, U>(other: Array<U>) {\n return function (arr: Array<T>): Array<[T, U]> {\n var len = Math.min(arr.length, other.length);\n var result = Array(len);\n var idx = 0;\n while (idx < len) {\n result[idx] = [arr[idx], other[idx]];\n idx += 1;\n }\n return result;\n };\n}\n\n// export const A = {\n// compact,\n// concat,\n// each,\n// first,\n// map,\n// nth,\n// toSet,\n// uniq,\n// uniqBy,\n// };\n\nexport interface ArrayWrapperProxy extends BaseWrapperProxy {\n // Static methods registered via A.registerStatic\n compact: (omit?: any[]) => (arr: any[]) => any[];\n concat: <T>(tail: T[]) => (arr: T[]) => T[];\n each: <T>(eachFn: (value: T) => void) => (arr: Array<T>) => void;\n filter: <T>(predFn: (e: T) => boolean) => (arr: T[]) => T[]; // alias for select\n find: <T>(predicateFn: (v: T) => any) => (arr: Array<T>) => T | undefined;\n first: <T>(n: number) => (arr: T[]) => T[];\n head: <T>(arr: T[]) => T | undefined;\n isEmpty: <T>(arr: Array<T>) => boolean;\n join: (separator?: string) => <T>(arr: T[]) => string;\n last: <T>(n: number) => (arr: T[]) => T[];\n map: <T, U>(mapFn: (value: T) => U) => (arr: Array<T>) => Array<U>;\n nth: (n: number) => <T>(arr: T[]) => T | undefined;\n partition: <T>(predFn: (e: T) => boolean) => (arr: T[]) => [T[], T[]];\n prepend: <T>(...values: T[]) => (arr: T[]) => T[];\n select: <T>(predFn: (e: T) => boolean) => (arr: T[]) => T[];\n skipFirst: <T>(n: number) => (arr: T[]) => T[];\n skipLast: <T>(n: number) => (arr: T[]) => T[];\n toSet: <T>(arr: Array<T>) => Set<T>;\n uniq: <T>(arr: Array<T>) => T[];\n uniqBy: <T, U>(comparisonValueFn: (value: T) => U) => (arr: Array<T>) => Array<T>;\n zip: <T, U>(other: Array<U>) => (arr: Array<T>) => Array<[T, U]>;\n}\n\nexport const A = buildWrapperProxy() as ArrayWrapperProxy;\n\nA.registerUncurriedFns({ head, isEmpty, toSet, uniq });\nA.registerCurriedFns({\n compact,\n concat,\n each,\n filter: select,\n find,\n first,\n join,\n last,\n map,\n nth,\n partition,\n prepend,\n select,\n skipFirst,\n skipLast,\n uniqBy,\n zip,\n});\nA.registerStatic({\n compact,\n concat,\n each,\n filter: select,\n find,\n first,\n head,\n isEmpty,\n join,\n last,\n map,\n nth,\n partition,\n prepend,\n select,\n skipFirst,\n skipLast,\n toSet,\n uniq,\n uniqBy,\n zip,\n});\n\nimport './all-protocols';\n","import { Enumerable } from './enumerable';\nimport { buildWrapperProxy, type FunctionBag } from './function';\n\nexport interface SetWrapperProxy {\n <T>(wrappedValue: Set<T>): any; // Represents the function signature of S itself\n registerUncurriedFns: (fns: FunctionBag) => void;\n registerCurriedFns: (fns: FunctionBag) => void;\n registerStatic: (fns: FunctionBag) => void;\n\n // Static methods registered via S.registerStatic\n addAll: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n each: <V>(eachFn: (value: V) => void) => (set: Set<V>) => void;\n intersection: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n isEmpty: <V>(set: Set<V>) => boolean;\n isSubsetOf: (enumerableSuperset: any) => <T>(set: Set<T>) => boolean;\n isSupersetOf: (enumerableSubset: any) => <T>(set: Set<T>) => boolean;\n map: <V, T>(mapFn: (value: V) => T) => (set: Set<V>) => Set<T>;\n toArray: <V>(set: Set<V>) => V[];\n union: (enumerableVal: any) => <T>(set: Set<T>) => Set<T>;\n}\n\nexport function addAll(enumerableVal: any) {\n // console.log(`------------- addAll: ${V(enumerableVal).inspect()}`)\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n enumerable.each((item: T) => set.add(item));\n return set;\n };\n}\n\nexport function each<V>(eachFn: (value: V) => void) {\n return function (set: Set<V>): void {\n set.forEach((value) => {\n eachFn(value);\n });\n };\n}\n\nexport function intersection(enumerableVal: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n return set.intersection(enumerable.toSet());\n };\n}\n\nexport function isEmpty<V>(set: Set<V>): boolean {\n return set.size === 0;\n}\n\nexport function isSubsetOf(enumerableSuperset: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableSuperset);\n return function <T>(set: Set<T>): boolean {\n return set.isSubsetOf(enumerable.toSet());\n };\n}\n\nexport function isSupersetOf(enumerableSubset: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableSubset);\n return function <T>(set: Set<T>): boolean {\n return set.isSupersetOf(enumerable.toSet());\n };\n}\n\nexport function map<V, T>(mapFn: (value: V) => T) {\n return function (set: Set<V>): Set<T> {\n const s = new Set<T>();\n set.forEach((value) => {\n const newValue = mapFn(value);\n s.add(newValue);\n });\n return s;\n };\n}\n\nexport function toArray<V>(set: Set<V>): V[] {\n return Array.from(set.values());\n}\n\nexport function union(enumerableVal: any) {\n const enumerable = Enumerable.for<Enumerable<any, any>>(enumerableVal);\n return function <T>(set: Set<T>): Set<T> {\n return set.union(enumerable.toSet());\n };\n}\n\n// export const S = buildPipeThroughFunction();\n\n// Object.assign(S, {\n// addAll,\n// each,\n// intersection,\n// isEmpty,\n// isSubsetOf,\n// isSupersetOf,\n// map,\n// toArray,\n// union,\n// });\n\nexport const S = buildWrapperProxy() as SetWrapperProxy;\nS.registerUncurriedFns({ isEmpty, toArray });\nS.registerCurriedFns({ addAll, each, intersection, map, union, isSubsetOf, isSupersetOf });\nS.registerStatic({\n addAll,\n each,\n intersection,\n isEmpty,\n isSubsetOf,\n isSupersetOf,\n map,\n toArray,\n union,\n});\n\nimport './all-protocols';\n","import { A } from './array';\nimport { compact } from './compactable';\nimport { Enumerable, each } from './enumerable';\nimport { F } from './function';\nimport { M } from './map';\nimport { asyncMap, map } from './mappable';\nimport { O } from './object';\nimport { select } from './selectable';\nimport { S } from './set';\nimport { Str } from './string';\nimport { V } from './type';\nimport type { AnyConstructor } from './protocol';\n\nclass Pipe {\n constructor(public value: any) {}\n\n // e.g. convertMethodsToPipeline(A([1,2,3]))\n // returns a function that proxies method invocations through to the A([1,2,3]) object but assigns their return value\n // to this.value in the pipeline, and then returns the pipe object, enabling stuff like this:\n // P([1,2,3]).A.compact().A.first().value\n _convertMethodsToPipeline(wrappedValue: any, nameOfMethodBag: string) {\n const self = this;\n\n return new Proxy(wrappedValue, {\n get(target, property, receiver) {\n // function objects, like those returned from `A([1,2,3])`, have function properties attached to them that when invoked\n // will operate on the value supplied to the A function (e.g. [1,2,3]),\n // so we want to return a function that invokes the requested function property specified by the get handler\n // and assigns the result of the evaluation of that function property to the `this.value` member of the Pipe object\n const fn = Reflect.get(target, property, receiver);\n if (fn === undefined) {\n throw Error(`${nameOfMethodBag} does not have a method named ${String(property)}`);\n }\n // we return a function that wraps the function property that is being accessed, such that when invoked, the return value is\n // assigned to self.value and then the pipe object is returned\n return function (...args: any) {\n self.value = fn.apply(receiver, args);\n return self;\n };\n },\n });\n }\n\n get A() {\n return A(this.value);\n }\n\n get a() {\n return this._convertMethodsToPipeline(A(this.value), 'A');\n }\n\n compact(...args: any[]) {\n this.value = compact(...args)(this.value);\n return this;\n }\n\n each(visitorFn: (v: any) => any) {\n this.value = each(visitorFn)(this.value);\n return this;\n }\n\n get F() {\n return F(this.value);\n }\n\n get f() {\n return this._convertMethodsToPipeline(F(this.value), 'F');\n }\n\n // enumerable() {\n // this.value = Enumerable.for(this.value);\n // return this;\n // }\n\n // enumerator() {\n // this.value = Enumerator.for(this.value);\n // return this;\n // }\n\n log() {\n console.log(V.inspect(this.value));\n return this;\n }\n\n get M() {\n return M(this.value);\n }\n\n get m() {\n return this._convertMethodsToPipeline(M(this.value), 'M');\n }\n\n map(mapFn: (v: any) => any, implClass?: AnyConstructor) {\n this.value = map(mapFn)(this.value, implClass);\n return this;\n }\n\n asyncMap(mapFn: (v: any) => Promise<any> | any, implClass?: AnyConstructor) {\n this.value = asyncMap(mapFn)(this.value, implClass);\n return this;\n }\n\n get O() {\n return O(this.value);\n }\n\n get o() {\n return this._convertMethodsToPipeline(O(this.value), 'O');\n }\n\n pipe(fn: (value: any) => any) {\n this.value = fn(this.value);\n return this;\n }\n\n get S() {\n return S(this.value);\n }\n\n get s() {\n return this._convertMethodsToPipeline(S(this.value), 'S');\n }\n\n get Str() {\n return Str(this.value);\n }\n\n get str() {\n return this._convertMethodsToPipeline(Str(this.value), 'Str');\n }\n\n select(predFn: (v: any) => boolean, implClass?: AnyConstructor) {\n this.value = select(predFn)(this.value, implClass);\n return this;\n }\n\n toArray() {\n this.value = Enumerable.for<Enumerable<any, any>>(this.value).toArray();\n return this;\n }\n\n waitAll() {\n this.value = Promise.allSettled(this.value).then((results) => {\n return results.map((result) => {\n if (result.status === 'fulfilled') {\n return result.value;\n } else {\n return new Error(result.reason);\n }\n });\n });\n // .finally(() => {\n // console.log(\"Experiment completed\");\n // });\n return this;\n }\n}\n\nexport const VP = function (initial: any) {\n return new Pipe(initial);\n};\n\n// P([1,2,3,4]).map(v => v * 2).compact().value\n// P([1,2,3,4]).map(v => v * 2).A.compact()\n// P([1,2,3,4]).map(v => v * 2).a.compact().value\n// P([1,2,3,4]).map(v => v * 2).pipe(A.compact).value\n","import { homedir } from 'node:os';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { File } from './flex/file';\nimport { Path } from './flex/path';\n\nexport class TmpFileRegistry {\n private static _instance?: TmpFileRegistry;\n static get instance() {\n const path = File.join(osHomeDir(), '.hostctl', 'tmpstatic');\n this._instance ??= new TmpFileRegistry(path);\n return this._instance;\n }\n\n private rootPath: Path;\n private tempFilePaths: string[];\n\n constructor(rootPath: string | Path) {\n // console.log(`TmpFileRegistry: ${rootPath}`);\n this.rootPath = Path.new(rootPath);\n this.tempFilePaths = [];\n process.on('exit', (code) => this.exitCallback());\n }\n\n randName(): string {\n return Math.random().toString(36).slice(-5) + Math.random().toString(36).slice(-5);\n }\n\n tmpPath(tmpName?: string) {\n tmpName ??= this.randName();\n return this.rootPath.join(tmpName);\n }\n\n // this directory will be automatically cleaned up at program exit\n createNamedTmpDir(subDirName?: string): Path {\n const path = this.tmpPath(subDirName);\n fs.mkdirSync(path.toString(), { recursive: true });\n this.registerTempFileOrDir(path.toString());\n return path;\n }\n\n // this file will be automatically cleaned up at program exit\n writeTmpFile(fileContent: string): Path {\n const path = this.tmpPath();\n fs.writeFileSync(path.toString(), fileContent);\n this.registerTempFileOrDir(path.toString());\n return path;\n }\n\n exitCallback() {\n this.cleanupTempFiles();\n }\n\n registerTempFileOrDir(path: string) {\n this.tempFilePaths.push(path);\n }\n\n cleanupTempFiles() {\n this.tempFilePaths.forEach((path) => {\n this.rmFile(path);\n });\n this.tempFilePaths = [];\n }\n\n rmFile(path: string) {\n try {\n // console.log(`rm tmp file: ${path}`)\n fs.rmSync(path, { force: true, recursive: true });\n } catch (e) {\n // no-op\n }\n }\n}\n\n/**\n * Returns the currently configured tmp dir from os.tmpdir().\n */\nexport function osTmpDir() {\n return path.resolve(os.tmpdir());\n}\n\nexport function osHomeDir() {\n return path.resolve(os.homedir());\n}\n\n// export function createHostCtlDir(): string {\n// const path = File.join(osHomeDir(), \".hostctl\");\n// fs.mkdirSync(path, { recursive: true });\n// return path;\n// }\n\n// export function createNamedTmpDir(subDirName: string = \"tmp\"): string {\n// // const path = File.join(osTmpDir(), subDirName);\n// const path = File.join(osHomeDir(), \".hostctl\", subDirName);\n// fs.mkdirSync(path, { recursive: true });\n// return path;\n// }\n\n// returns the full path to the temp file on disk\nexport function writeTmpFile(fileContents: string): Path {\n return TmpFileRegistry.instance.writeTmpFile(fileContents);\n // return temporaryWriteSync(fileContents);\n}\n\n// export function rmTmpFile(path: string) {\n// try {\n// fs.rmSync(path, { force: true, recursive: true });\n// } catch (e) {\n// // no-op\n// }\n// }\n\n// export function createTmpFile(): string {\n// tmp.setGracefulCleanup();\n\n// return tmp.tmpNameSync();\n// }\n\n// export function createTmpDir(): string {\n// tmp.setGracefulCleanup();\n\n// const tmpDir = tmp.dirSync();\n// return tmpDir.name;\n// }\n","import type { PathLike } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { win32, posix } from 'node:path';\nimport { isWindows } from './platform';\n\nexport function exists(path: PathLike): boolean {\n return existsSync(path);\n}\n\nexport class File {\n static absolutePath(...paths: string[]): string {\n if (isWindows()) {\n return win32.resolve(...paths);\n } else {\n return posix.resolve(...paths);\n }\n }\n\n // basename(\"c:\\\\foo\\\\bar\\\\baz.txt\") => \"baz.txt\"\n // basename(\"/tmp/myfile.html\") => \"myfile.html\"\n static basename(path: string, suffix?: string): string {\n if (isWindows()) {\n return win32.basename(path, suffix);\n } else {\n return posix.basename(path, suffix);\n }\n }\n\n static exists(path: PathLike): boolean {\n return exists(path);\n }\n\n static join(...paths: string[]): string {\n if (isWindows()) {\n return win32.join(...paths);\n } else {\n return posix.join(...paths);\n }\n }\n\n static readSync(path: PathLike): string {\n return readFileSync(path, {\n encoding: 'utf8',\n });\n }\n\n static async readAsync(path: PathLike): Promise<string> {\n return await readFile(path, {\n encoding: 'utf8',\n });\n }\n}\n","import { Perc } from './flex';\nimport { A } from './flex/array';\nimport { O } from './flex/object';\nimport { VP } from './flex/pipe';\nimport { Undefined, V, kind } from './flex/type';\nimport { S } from './flex/set';\nimport type { ISecret } from './config';\nimport { ConfigFile, Secret, SecretRef, SecretValue } from './config-file';\nimport { writeTmpFile } from './tempfile';\n\nexport class Host {\n public hostname: string; // The network hostname or IP address, from the YAML hosts map host field\n public alias: string; // Required alias for the host\n public port: number;\n public user?: string;\n public password?: SecretRef | string;\n public sshKey?: SecretRef | string;\n public tags: string[];\n public tagSet: Set<string>;\n\n constructor(\n public config: { getSecret(name: string): ISecret | undefined },\n opts: {\n hostname: string; // The network hostname or IP from the YAML hosts map host field\n alias: string; // Required alias for the host\n port?: number;\n user?: string;\n password?: SecretRef | string;\n sshKey?: SecretRef | string;\n tags?: string[];\n },\n ) {\n this.hostname = opts.hostname;\n this.alias = opts.alias;\n this.port = opts.port || 22;\n this.user = opts.user;\n this.password = opts.password;\n this.sshKey = opts.sshKey;\n this.tags = opts.tags ?? [];\n this.tagSet = new Set(this.tags);\n }\n\n async decryptedPassword(): Promise<string | undefined> {\n switch (kind(this.password)) {\n case String:\n return this.password as string;\n case SecretRef:\n const secretRef = this.password as SecretRef;\n const secret = this.config.getSecret(secretRef.name);\n return await secret?.plaintext();\n }\n // otherwise, it's undefined, so implicitly return undefined\n }\n\n async decryptedSshKey(): Promise<string | undefined> {\n if (V(this.sshKey).isA(SecretRef)) {\n const secretRef = this.sshKey as SecretRef;\n const secret = this.config.getSecret(secretRef.name);\n return await secret?.plaintext();\n }\n // otherwise, it's either undefined or a string path to a key that is already on the filesystem, so implicitly return undefined\n }\n\n toYAML() {\n let passwordForYaml: string | ReturnType<SecretRef['toYAML']> | undefined = this.password;\n if (this.password && V(this.password).isA(SecretRef)) {\n passwordForYaml = (this.password as SecretRef).toYAML();\n }\n\n let sshKeyForYaml: string | ReturnType<SecretRef['toYAML']> | undefined = this.sshKey;\n if (this.sshKey && V(this.sshKey).isA(SecretRef)) {\n sshKeyForYaml = (this.sshKey as SecretRef).toYAML();\n }\n\n return {\n host: this.hostname, // Always include the host field\n user: this.user,\n port: this.port === 22 ? undefined : this.port, // Only include port if not default\n password: passwordForYaml,\n 'ssh-key': sshKeyForYaml,\n tags: this.tags,\n };\n }\n\n // domain logic\n\n get shortName(): string {\n return this.alias;\n }\n\n isLocal(): boolean {\n // A host is local if its hostname is 'localhost' or '127.0.0.1'.\n // More robust checks could involve os.hostname(), but this is a common simple check.\n return this.hostname === 'localhost' || this.hostname === '127.0.0.1';\n }\n\n get uri(): string {\n return this.port === 22 ? this.hostname : `${this.hostname}:${this.port}`;\n }\n\n // returns the temporary path to the decrypted ssh key\n async writeTmpDecryptedSshKey(): Promise<string | undefined> {\n const content = await this.decryptedSshKey();\n if (content) {\n return writeTmpFile(content).toString();\n }\n }\n\n private _plaintextSshKeyPath: string | undefined = undefined;\n async plaintextSshKeyPath(): Promise<string | undefined> {\n if (this._plaintextSshKeyPath) {\n return this._plaintextSshKeyPath;\n }\n\n switch (kind(this.sshKey)) {\n case String:\n this._plaintextSshKeyPath = this.sshKey as string;\n break;\n case SecretRef:\n this._plaintextSshKeyPath = await this.writeTmpDecryptedSshKey();\n break;\n }\n return this._plaintextSshKeyPath;\n }\n\n toObject() {\n return {\n hostname: this.hostname,\n port: this.port,\n alias: this.alias,\n user: this.user,\n tags: this.tags,\n };\n }\n\n effectiveTags(): Set<string> {\n return new Set([...this.tagSet, this.hostname, this.alias]);\n }\n\n hasTag(tag: string): boolean {\n return this.effectiveTags().has(tag);\n }\n\n // each tag is a string of the form:\n // - foo\n // - bar,baz\n // the interpretation of a 'bar,baz' tag is that the host must have either the 'bar' tag or the 'baz' tag in order to consider the 'bar,baz' tag present\n hasAllTags(tags: Set<string>): boolean {\n const effectiveTagsForMatching = this.effectiveTags();\n for (const tag of tags) {\n const tagParts = tag.split(',');\n const anyTagPartPresent = S(effectiveTagsForMatching).intersection(tagParts).size > 0;\n if (!anyTagPartPresent) return false;\n }\n return true;\n }\n\n // each tag is a string of the form:\n // - foo\n // - bar+baz\n // the interpretation of a 'bar+baz' tag is that the host must have both the 'bar' tag and the 'baz' tag in order to consider the 'bar+baz' tag present\n hasAnyTag(tags: Set<string>): boolean {\n const effectiveTagsForMatching = this.effectiveTags();\n for (const tag of tags) {\n const tagParts = tag.split('+');\n const allTagPartsPresent = S(effectiveTagsForMatching).isSupersetOf(tagParts);\n if (allTagPartsPresent) return true;\n }\n return false;\n }\n}\n","// import { encrypt_with_x25519, decrypt_with_x25519 } from \"@kanru/rage-wasm\";\nimport fs from 'node:fs';\nimport * as age from 'age-encryption';\n\nimport { Process } from './process';\nimport { writeTmpFile } from './tempfile';\n\nconst AGE_ENCRYPTED_FILE_HEADER = '-----BEGIN AGE ENCRYPTED FILE-----';\n\n// Define a common interface for encryption drivers\ninterface IAgeDriver {\n encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string>;\n decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null>;\n}\n\n// Helper function to read identity string from a file (used by LibraryDriver)\nfunction readIdentityStringFromFile(path: string): string {\n const contents = fs.readFileSync(path, {\n encoding: 'utf8',\n });\n const identityString = contents\n .split(/\\r?\\n|\\r|\\n/g)\n .map((line) => line.trim())\n .find((line) => line.startsWith('AGE-SECRET-KEY-1'));\n if (!identityString) throw new Error(`Unable to read identity from file: ${path}`);\n return identityString;\n}\n\nexport class CliDriver implements IAgeDriver {\n async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const recipientArgs = publicKeys.flatMap((key) => ['-r', key]);\n // Capture stderr for better error reporting\n const { stdout, success, stderr } = await Process.spawn('age', ['-e', '-a'].concat(recipientArgs), valueToEncrypt);\n\n if (!success) {\n // Use new Error and include stderr if available\n throw new Error(`Failed to encrypt with age CLI: ${stderr || stdout}`);\n }\n return stdout;\n }\n\n async decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null> {\n if (privateKeyFilePaths.length === 0) {\n // Use new Error for consistency\n throw new Error('Unable to decrypt: No age encryption identity (private key) specified.');\n }\n const identityArgs = privateKeyFilePaths.flatMap((path) => ['-i', path]);\n // Capture stderr for better error reporting\n const { stdout, success, stderr } = await Process.spawn('age', ['-d'].concat(identityArgs), valueToDecrypt);\n\n if (!success) {\n // console.error(`Failed to decrypt with age CLI: ${stderr || stdout}`); // Optional for debugging\n return null; // Return null on failure\n }\n return stdout;\n }\n}\n\n// New LibraryDriver using age-encryption package, implementing IAgeDriver\nexport class LibraryDriver implements IAgeDriver {\n async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const e = new age.Encrypter();\n publicKeys.forEach((key) => e.addRecipient(key));\n const ciphertextBytes = await e.encrypt(valueToEncrypt); // Returns Uint8Array\n return age.armor.encode(ciphertextBytes); // Armor the Uint8Array to string\n }\n\n async decrypt(valueToDecryptArmored: string, privateKeyFilePaths: string[]): Promise<string | null> {\n if (privateKeyFilePaths.length === 0) {\n throw new Error('Unable to decrypt: No age encryption identity (private key) specified.');\n }\n\n const d = new age.Decrypter();\n let identitiesAdded = 0;\n for (const path of privateKeyFilePaths) {\n try {\n const identityString = readIdentityStringFromFile(path);\n d.addIdentity(identityString);\n identitiesAdded++;\n } catch (err) {\n // Log and continue: an invalid key path shouldn't prevent other valid keys from being tried.\n console.warn(`Failed to read or parse identity file ${path}, skipping: ${(err as Error).message}`);\n }\n }\n\n if (identitiesAdded === 0) {\n // console.error(\"Decryption failed: No valid identities could be loaded.\");\n return null; // No valid keys were loaded to attempt decryption.\n }\n\n try {\n const ciphertextBytes = age.armor.decode(valueToDecryptArmored); // De-armor string to Uint8Array\n const decryptedText = await d.decrypt(ciphertextBytes, 'text'); // Decrypts to string\n return decryptedText;\n } catch (error) {\n // Handles errors from age.armor.decode or d.decrypt (e.g., bad armor, no matching identity, corrupted data)\n // console.error(\"Library decryption failed:\", error); // Optional: for debugging\n return null; // Return null on any decryption failure\n }\n }\n}\n\nexport class Identity {\n public identityFilePath: string;\n private identity: string;\n\n // either the path to an identity file or an identity string must be supplied\n constructor({ path, identity }: { path?: string; identity?: string }) {\n if (identity) {\n this.identity = identity;\n this.identityFilePath = this.writeTmpIdentityFile(identity);\n } else if (path) {\n this.identity = this.readIdentityFromFile(path);\n this.identityFilePath = path;\n } else {\n throw 'Either an identity string or an identity file path must be supplied to create an Age Encryption identity';\n }\n }\n\n public get recipient(): Promise<string> {\n return age.identityToRecipient(this.identity);\n }\n\n // returns the path to the temp file\n private writeTmpIdentityFile(identity: string) {\n return writeTmpFile(identity).toString();\n }\n\n private readIdentityFromFile(path: string): string {\n const contents = fs.readFileSync(path, {\n encoding: 'utf8',\n });\n\n const identityString = contents\n .split(/\\r?\\n|\\r|\\n/g)\n .map((line) => line.trim())\n .find((line) => line.startsWith('AGE-SECRET-KEY-1'));\n\n if (!identityString) throw new Error(`Unable to read identity file: ${path}`);\n\n return identityString;\n }\n\n get privateKey(): string {\n return this.identity;\n }\n\n get publicKey(): Promise<string> {\n return this.recipient;\n }\n\n decrypt(encryptedString: string): Promise<string | null> {\n return AgeEncryption.decrypt(encryptedString, [this.identityFilePath]);\n\n ///////////////////////////////////\n\n // const encryptedBytes = new TextEncoder().encode(encryptedString);\n // const plaintextBytes = await decrypt_with_x25519(this.identity, encryptedBytes);\n // return new TextDecoder().decode(plaintextBytes);\n\n ///////////////////////////////////\n\n // const d = new Decrypter();\n // d.addIdentity(this.identity);\n\n // const encryptedBytes = new TextEncoder().encode(encryptedString);\n // return d.decrypt(encryptedBytes, \"text\");\n }\n\n async encrypt(plaintext: string): Promise<string> {\n return AgeEncryption.encrypt(plaintext, [await this.recipient]);\n\n ///////////////////////////////////\n\n // const plaintextBytes = new TextEncoder().encode(plaintext);\n // const encryptedBytes = await encrypt_with_x25519(\n // this.recipient,\n // plaintextBytes,\n // true\n // );\n // return new TextDecoder().decode(encryptedBytes);\n\n ///////////////////////////////////\n\n // const e = new Encrypter();\n // e.addRecipient(this.recipient);\n\n // const encryptedBytes = e.encrypt(plaintext);\n // return new TextDecoder().decode(encryptedBytes);\n }\n}\n\nexport class AgeEncryption {\n static instance: IAgeDriver = new LibraryDriver(); // Use LibraryDriver by default\n\n static async encrypt(valueToEncrypt: string, publicKeys: string[]): Promise<string> {\n const encrypted = await this.instance.encrypt(valueToEncrypt, publicKeys);\n // console.log(`encrypting ${valueToEncrypt} with keys ${publicKeys}: ${encrypted}`)\n return encrypted;\n }\n\n static async decrypt(valueToDecrypt: string, privateKeyFilePaths: string[]): Promise<string | null> {\n return await this.instance.decrypt(valueToDecrypt, privateKeyFilePaths);\n }\n}\n\n// const id = new Identity({ path: \"/home/david/.secrets/age/david.priv\" });\n// console.log(\"identity\", id.privateKey);\n// console.log(\"recipient\", id.publicKey);\n// const encrypted = await id.encrypt(\"food\");\n// console.log(\"encrypt 'food' =>\", encrypted);\n// const plain = await id.decrypt(encrypted);\n// console.log(`decrypt '${encrypted}' =>`, plain);\n","import spawnAsync, { type SpawnResult } from '@expo/spawn-async';\n\nexport type ProcessResult = SpawnResult & { success: boolean };\nexport class Process {\n static spawn(cmd: string, args: string[], stdin?: string): Promise<ProcessResult> {\n return new Process(cmd, args, stdin).spawn();\n }\n\n constructor(\n public cmd: string,\n public args: string[],\n public stdin?: string,\n ) {}\n\n async spawn(): Promise<ProcessResult> {\n try {\n const spawnOptions = {\n ignoreStdio: false,\n // detached: true, // if we wanted to keep child alive after parent exits\n };\n const promise = spawnAsync(this.cmd, this.args, spawnOptions);\n\n if (this.stdin && promise.child) {\n promise.child.stdin?.write(this.stdin);\n promise.child.stdin?.end();\n }\n const result: SpawnResult = await promise;\n\n // const child = procp.child;\n // const stdout = new StringBuilder();\n // const stderr = new StringBuilder();\n\n // child.stdout?.on('data', (data) => {\n // stdout.append(data);\n // });\n\n // child.stderr?.on('data', (data) => {\n // stderr.append(data);\n // });\n\n // child.on('exit', (code, signal) => {\n // console.log(`child process exited with code ${code} and signal ${signal}`);\n // });\n\n return { ...result, success: result.status === 0 };\n } catch (e) {\n // The error object also has the same properties as the result object\n // console.error(e.stack);\n const errorResult = e as SpawnResult;\n return { ...errorResult, success: errorResult.status === 0 };\n }\n }\n}\n","import type { Config, IRecipientGroup, ISecret } from '../config';\nimport type { ConfigProvider, HostInput } from '../config-provider';\nimport { Host } from '../host';\n\nclass ProviderRecipientGroup implements IRecipientGroup {\n constructor(private keys: string[]) {}\n recipients(): string[] {\n return this.keys;\n }\n}\n\nclass ProviderSecret implements ISecret {\n constructor(\n private nameValue: string,\n private value: string,\n private recipientKeys: string[],\n ) {}\n get name(): string {\n return this.nameValue;\n }\n recipients(): string[] {\n return this.recipientKeys;\n }\n async ciphertext(): Promise<string> {\n return this.value;\n }\n async plaintext(): Promise<string | undefined> {\n return this.value;\n }\n}\n\nexport class ProviderConfig implements Config {\n private hostsCache: Host[];\n private secretsCache: Map<string, ISecret>;\n private idsCache: Map<string, IRecipientGroup>;\n\n private constructor(hosts: Host[], secrets: Map<string, ISecret>, ids: Map<string, IRecipientGroup>) {\n this.hostsCache = hosts;\n this.secretsCache = secrets;\n this.idsCache = ids;\n }\n\n static async load(provider: ConfigProvider): Promise<ProviderConfig> {\n const hostInputs = await provider.hosts();\n const secretsInput = await provider.secrets();\n const idsInput = await provider.ids();\n\n const ids = new Map<string, IRecipientGroup>(\n idsInput.map((i) => [i.name, new ProviderRecipientGroup([...(i.recipients ?? []), ...(i.groups ?? [])])]),\n );\n\n const secrets = new Map<string, ISecret>(\n secretsInput.map((s) => [s.name, new ProviderSecret(s.name, s.value, s.ids)]),\n );\n\n const config = new ProviderConfig([], secrets, ids);\n const hosts = hostInputs.map((h) => config.hostFromInput(h));\n config.hostsCache = hosts;\n return config;\n }\n\n private hostFromInput(input: HostInput): Host {\n return new Host(this as any, {\n hostname: input.hostname,\n alias: input.name,\n port: input.port,\n user: input.user,\n password: input.password as any,\n sshKey: input.sshKey as any,\n tags: input.tags,\n });\n }\n\n hosts(): Host[] {\n return this.hostsCache;\n }\n\n secrets(): Map<string, ISecret> {\n return this.secretsCache;\n }\n\n ids(): Map<string, IRecipientGroup> {\n return this.idsCache;\n }\n\n getSecret(name: string): ISecret | undefined {\n return this.secretsCache.get(name);\n }\n\n getRecipientGroups(idRefs: string[]): IRecipientGroup[] {\n return idRefs.map((id) => this.idsCache.get(id)).filter((v): v is IRecipientGroup => Boolean(v));\n }\n}\n","import { ConfigFile } from '../config-file';\nimport type { ConfigProvider, HostInput, SecretInput, RecipientGroupInput } from '../config-provider';\n\nexport class FileConfigProvider implements ConfigProvider {\n private configFile?: ConfigFile;\n\n constructor(public path: string) {}\n\n async getConfigFile(): Promise<ConfigFile> {\n if (!this.configFile) {\n const cfg = new ConfigFile(this.path);\n await cfg.load();\n this.configFile = cfg;\n }\n return this.configFile;\n }\n\n async hosts(): Promise<HostInput[]> {\n const cfg = await this.getConfigFile();\n return cfg.hosts().map((h) => ({\n name: h.alias || h.hostname,\n hostname: h.hostname,\n user: h.user,\n port: h.port,\n password: h.password,\n sshKey: h.sshKey,\n tags: h.tags,\n }));\n }\n\n async secrets(): Promise<SecretInput[]> {\n const cfg = await this.getConfigFile();\n return Array.from(cfg.secrets().entries()).map(([name, secret]) => ({\n name,\n value: secret.value.toYAML(),\n ids: secret.ids.toYAML().filter((v) => typeof v === 'string') as string[],\n }));\n }\n\n async ids(): Promise<RecipientGroupInput[]> {\n const cfg = await this.getConfigFile();\n return Array.from(cfg.ids().entries()).map(([name, rg]) => ({\n name,\n recipients: rg.publicKeys,\n groups: rg.idRefs,\n }));\n }\n\n async getSecret(name: string) {\n const cfg = await this.getConfigFile();\n return cfg.getSecret(name);\n }\n\n async getRecipientGroups(idRefs: string[]) {\n const cfg = await this.getConfigFile();\n return cfg.getRecipientGroups(idRefs);\n }\n}\n","import axios, { type AxiosRequestConfig } from 'axios';\nimport yaml from 'js-yaml';\nimport type { ConfigProvider, HostInput, RecipientGroupInput, SecretInput } from '../config-provider';\n\ntype HttpConfigProviderOptions = {\n url: string;\n headers?: Record<string, string>;\n auth?: () => Promise<{ headers?: Record<string, string> }>;\n format?: 'json' | 'yaml';\n cacheTtlMs?: number;\n};\n\nexport class HttpConfigProvider implements ConfigProvider {\n private cache?: {\n expiresAt: number;\n data: HostInput[];\n };\n\n constructor(private opts: HttpConfigProviderOptions) {}\n\n private async fetchData(): Promise<HostInput[]> {\n const now = Date.now();\n if (this.cache && this.cache.expiresAt > now) {\n return this.cache.data;\n }\n\n const headers = { ...(this.opts.headers || {}) };\n if (this.opts.auth) {\n const authHeaders = await this.opts.auth();\n Object.assign(headers, authHeaders.headers);\n }\n\n const axiosOpts: AxiosRequestConfig = { headers };\n const resp = await axios.get(this.opts.url, axiosOpts);\n const format = this.opts.format ?? 'json';\n const payload =\n format === 'yaml'\n ? (yaml.load(resp.data) as any)\n : typeof resp.data === 'string'\n ? JSON.parse(resp.data)\n : resp.data;\n\n const data = Array.isArray(payload) ? payload : (payload?.hosts ?? []);\n const hosts = Array.isArray(data) ? (data as HostInput[]) : [];\n\n const ttl = this.opts.cacheTtlMs ?? 0;\n this.cache = { expiresAt: ttl > 0 ? now + ttl : 0, data: hosts };\n return hosts;\n }\n\n async hosts(): Promise<HostInput[]> {\n return await this.fetchData();\n }\n\n async secrets(): Promise<SecretInput[]> {\n return [];\n }\n\n async ids(): Promise<RecipientGroupInput[]> {\n return [];\n }\n\n async getSecret(_name: string) {\n return undefined;\n }\n\n async getRecipientGroups(_idRefs: string[]): Promise<RecipientGroupInput[]> {\n return [];\n }\n}\n","import { Readable } from 'node:stream';\nimport { StreamRegex } from 'stream-regex';\nimport { M } from './flex/map';\nimport { VP } from './flex/pipe';\nimport { A } from './flex/array';\nimport type { InputMap } from './util/input-helpers';\n\nexport class InteractionHandler {\n static with(inputs: InputMap): InteractionHandler {\n return new InteractionHandler(new Map(Object.entries(inputs)));\n }\n\n private patternInputMappings: Map<string, string>; // pairs of pattern -> response\n private inputStreamForRegexMatcher: Readable | undefined;\n // private streamRegex: StreamRegex;\n // private matches: Readable;\n private writeFn: ((str: string) => void) | undefined;\n constructor(patternInputMappings: Map<string | RegExp, string> = new Map()) {\n this.patternInputMappings = M(patternInputMappings).map(([pattern, v]: [string | RegExp, string]) => [\n pattern instanceof RegExp ? pattern.source : pattern,\n v,\n ]);\n }\n clone(): InteractionHandler {\n return new InteractionHandler(this.patternInputMappings);\n }\n with(inputs: InputMap): InteractionHandler {\n const clone = this.clone();\n clone.mapInput(inputs);\n return clone;\n }\n mapInput(inputMap: InputMap): InteractionHandler {\n Object.entries(inputMap).forEach(([pattern, response]) => {\n this.map(pattern, response);\n });\n return this;\n }\n map(pattern: RegExp | string, response: string) {\n if (pattern instanceof RegExp) {\n this.patternInputMappings.set(pattern.source, response);\n } else {\n this.patternInputMappings.set(pattern, response);\n }\n return this;\n }\n // builds a regex of the form /(alternative 1)|(alternative 2)|...|(alternative N)/\n compositeRegex(): RegExp | undefined {\n if (M(this.patternInputMappings).isEmpty()) return undefined;\n const compositePattern: string = VP(this.patternInputMappings)\n .m.keys()\n .map((pattern: string) => `(${pattern})`)\n .a.join('|').value;\n return new RegExp(compositePattern, 'g');\n }\n // returns the first pattern that matches\n // the matching pattern will be a key in ioMappings\n firstMatchingPattern(matchStr: string): string | undefined {\n // we know this will not return undefined because the pattern has already been observed, we just need to figure out which regex matched it\n return Array.from(this.patternInputMappings.keys()).find((pattern) => matchStr.match(pattern));\n }\n findReplacementForMatch(matchStr: string): string | undefined {\n const matchingPattern = this.firstMatchingPattern(matchStr);\n if (!matchingPattern) return undefined; // we know this will not return undefined because the pattern has already been observed, we just need to figure out which regex matched it\n const replacementValue = this.patternInputMappings.get(matchingPattern);\n return replacementValue;\n }\n begin() {\n this.inputStreamForRegexMatcher = new Readable();\n this.inputStreamForRegexMatcher._read = () => {};\n const compositeRegex = this.compositeRegex();\n if (compositeRegex) {\n // this.streamRegex = new StreamRegex(compositeRegex);\n // this.matches = this.streamRegex.match(this.inputStreamForRegexMatcher);\n // this.matches.on(\"data\", (matchStr) => {\n const streamRegex = new StreamRegex(compositeRegex);\n const matches: Readable = streamRegex.match(this.inputStreamForRegexMatcher);\n matches.on('data', (matchStr) => {\n // console.log(\"interaction handler match\", matchStr);\n const inputToWrite: string | undefined = this.findReplacementForMatch(matchStr);\n if (inputToWrite !== undefined) {\n this.emitInput(inputToWrite);\n }\n });\n }\n }\n handleInput(inputChunk: string) {\n // console.log(\"interaction handler handle input\", inputChunk);\n if (this.inputStreamForRegexMatcher) {\n this.inputStreamForRegexMatcher.push(inputChunk);\n }\n }\n // either use setOutputToNewReadable XOR setOutputWriter; not both\n setOutputToNewReadable(): Readable {\n const stdinReadable = new Readable();\n this.setOutputWriter((str) => stdinReadable.push(str));\n stdinReadable._read = () => {};\n return stdinReadable;\n }\n // either use setOutputToNewReadable XOR setOutputWriter; not both\n setOutputWriter(writeFn: (str: string) => void) {\n this.writeFn = writeFn;\n }\n private emitInput(input: string): void {\n if (this.writeFn) {\n this.writeFn(input);\n }\n }\n end() {\n if (this.inputStreamForRegexMatcher) {\n this.inputStreamForRegexMatcher.push(null);\n }\n }\n}\n","import Handlebars from 'handlebars';\nimport {\n type IInvocation,\n Invocation,\n type IRuntime,\n type TaskContext,\n type TaskFn,\n type TaskPartialFn,\n type LogLevel,\n task,\n} from './runtime-base';\nimport type { RunFn, TaskParams, RunFnReturnValue } from './task.model';\nimport { RemoteRuntime, RemoteInvocation } from './remote-runtime';\nimport { Host } from './host';\nimport { Path } from './flex/path';\nimport type { App, AppConfig } from './app';\nimport { Verbosity } from './verbosity';\n// LogLevel is now imported from ./runtime\nimport * as fs from 'node:fs';\nimport { ConfigFile } from './config-file';\n// CommandResult is now a value import, Command class is also imported directly\nimport { Command, CommandResult, type EnvVarObj } from './command';\nimport { InteractionHandler } from './interaction-handler';\n// import { PtyCommand } from \"./pty-command\";\nimport { RusPtyCommand } from './ruspty-command';\nimport { O } from './flex/object';\nimport { VP } from './flex/pipe';\nimport { A } from './flex/array';\nimport chalk from 'chalk';\nimport { V } from './flex/type';\nimport { withSudo } from './util/input-helpers';\n\nexport interface FileSystemOperations {\n read: (path: string) => Promise<string>;\n write: (\n path: string,\n content: string | Buffer,\n options?: {\n mode?: string | number | undefined;\n user?: string | undefined;\n group?: string | undefined;\n flag?: string | undefined;\n },\n ) => Promise<void>;\n exists: (path: string) => Promise<boolean>;\n mkdir: (\n path: string,\n options?: { recursive?: boolean | undefined; mode?: string | number | undefined },\n ) => Promise<void>;\n rm: (path: string, options?: { recursive?: boolean | undefined; force?: boolean | undefined }) => Promise<void>;\n}\n\nfunction normalizeMode(mode?: string | number): number | undefined {\n if (mode === undefined) {\n return undefined;\n }\n\n if (typeof mode === 'number') {\n return mode;\n }\n\n const normalized = mode.startsWith('0o') ? mode.slice(2) : mode;\n const parsed = Number.parseInt(normalized, 8);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nexport class LocalInvocation<TParams extends TaskParams, TReturn extends RunFnReturnValue> extends Invocation<TParams> {\n public readonly config: AppConfig;\n public readonly file: FileSystemOperations;\n constructor(\n public runtime: LocalRuntime,\n public taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n parent?: IInvocation<any>,\n ) {\n super(runtime, taskFnDefinition, parent);\n this.description = Handlebars.compile(\n taskFnDefinition.task.description || taskFnDefinition.task.name || 'anonymous_local_task',\n )(params);\n this.config = this.runtime.app.config; // Access getter, not method\n // this.host is undefined for LocalInvocation, which is fine as TaskContext.host is optional.\n\n this.file = {\n read: async (path: string): Promise<string> => fs.promises.readFile(path, 'utf-8'),\n write: async (\n path: string,\n content: string | Buffer,\n options?: {\n mode?: string | number | undefined;\n user?: string | undefined;\n group?: string | undefined;\n flag?: string | undefined;\n },\n ): Promise<void> => {\n const mode = normalizeMode(options?.mode);\n const writeOptions: fs.WriteFileOptions = {\n flag: options?.flag ?? 'w',\n };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n await fs.promises.writeFile(path, content, writeOptions);\n },\n exists: async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path);\n return true;\n } catch {\n return false;\n }\n },\n mkdir: async (\n path: string,\n options?: { recursive?: boolean | undefined; mode?: string | number | undefined },\n ): Promise<void> => {\n await fs.promises.mkdir(path, options as fs.MakeDirectoryOptions | undefined);\n },\n rm: async (\n path: string,\n options?: { recursive?: boolean | undefined; force?: boolean | undefined },\n ): Promise<void> => fs.promises.rm(path, options as fs.RmOptions | undefined),\n };\n }\n\n public log(level: LogLevel, ...message: any[]): void {\n this.runtime.app.log(level, ...message);\n }\n\n override async exec(\n command: string | string[],\n options: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n } = {},\n ): Promise<CommandResult> {\n options = options || {};\n\n const interactionHandler = this.runtime.interactionHandler.clone();\n const stdinForCommand: string | Buffer | undefined = options.stdin;\n let hostPassword: string | undefined;\n\n if (options.input && typeof options.input === 'object') {\n // Input is for interaction handler patterns\n O(options.input).each(([pattern, value]: [string, string]) => {\n interactionHandler.map(pattern, value);\n });\n }\n\n if (options.sudo) {\n hostPassword = await this.runtime.getPassword();\n if (!this.runtime.app.isInteractive() && !hostPassword) {\n throw new Error(\n 'sudo requested but no password was provided in non-interactive mode. Pass a password to App.loadApiMode or avoid sudo for API calls.',\n );\n }\n interactionHandler.mapInput(withSudo(hostPassword));\n }\n\n // InteractionHandler is for responding to prompts, not for initial stdin.\n\n // TODO: Handle options.user if specified (e.g., via sudo -u)\n // TODO: options.pty is implicitly true due to PtyCommand. If false, would need a non-PTY command runner.\n\n const cwd = options.cwd ?? process.cwd();\n let finalEnv: EnvVarObj = {};\n\n // Always start with current process environment\n Object.keys(process.env).forEach((key) => {\n const value = process.env[key];\n if (value !== undefined) {\n finalEnv[key] = value;\n }\n });\n\n // Merge in provided environment variables\n if (options.env) {\n finalEnv = { ...finalEnv, ...options.env };\n }\n\n // Build the command using RusPtyCommand.build directly\n const commandInstance = RusPtyCommand.build(command, {\n sudo: options.sudo,\n env: finalEnv,\n cwd,\n });\n\n this.debug(\n `Executing command: ${commandInstance.toString()}${options.stdin ? ' with stdin' : ''}${options.input ? ' with interaction patterns' : ''}`,\n );\n await commandInstance.run(interactionHandler, stdinForCommand);\n\n const cmdResult = commandInstance.result;\n if (!cmdResult) {\n this.error('Command execution resulted in undefined result.');\n // Return a new CommandResult instance for the error case\n return new CommandResult('', 'Command execution resulted in undefined result.', -1, undefined);\n }\n this.debug(`Command result: ${V.inspect(cmdResult)}`);\n\n return cmdResult;\n }\n\n override async ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> {\n const targetHosts: Host[] = this.runtime.selectedInventory(tags);\n\n if (targetHosts.length === 0) {\n this.runtime.app.warn(`No hosts found for tags: ${tags.join(', ')} in ssh call from ${this.id}`);\n return {};\n }\n\n const entryPromises = VP(targetHosts).map(async (host: Host): Promise<[string, TRemoteReturn | Error]> => {\n const result = await this.runRemoteTaskOnHost<TRemoteParams, TRemoteReturn>(host, remoteTaskFn);\n return [host.alias, result];\n }).value;\n\n const entries = await Promise.all(entryPromises);\n const record: Record<string, TRemoteReturn | Error> = Object.fromEntries(entries);\n return record;\n }\n\n async runRemoteTaskOnHost<TRemoteParams extends TaskParams, TRemoteReturn extends RunFnReturnValue>(\n host: Host,\n remoteTaskFn: RunFn<TRemoteParams, TRemoteReturn>,\n ): Promise<TRemoteReturn | Error> {\n this.debug(`Run function on: ${chalk.yellow(V.inspect(host.toObject()))}`);\n\n const interactionHandler = new InteractionHandler(this.runtime.app.getSecretsForHost(host.hostname));\n\n const remoteRuntime = new RemoteRuntime(this.runtime.app, host, interactionHandler);\n\n try {\n const connected = await remoteRuntime.connect();\n if (!connected) {\n throw new Error(`Unable to connect to ${host.uri}`);\n }\n\n const adHocRemoteInvocationTaskFn = task<TRemoteParams, TRemoteReturn>(\n async function (context: TaskContext<TRemoteParams>): Promise<TRemoteReturn> {\n return remoteTaskFn(context);\n },\n { description: `Ad-hoc task on ${host.uri} via ssh from ${this.taskFnDefinition.task.name} (${this.id})` },\n );\n\n const rootRemoteInvocation = new RemoteInvocation(\n remoteRuntime,\n adHocRemoteInvocationTaskFn, // This TaskFn is for the container of the ad-hoc operation on this host\n {} as TRemoteParams,\n this, // Parent is the current LocalInvocation\n host,\n );\n await this.appendChildInvocation(rootRemoteInvocation);\n\n const rootRemoteContext = this.runtime.app.taskContextForRunFn(\n rootRemoteInvocation,\n {} as TRemoteParams,\n host,\n ) as TaskContext<TRemoteParams>;\n const resultPromise = remoteTaskFn(rootRemoteContext);\n rootRemoteInvocation.setFutureResult(resultPromise);\n rootRemoteInvocation.setDescription(`SSH to ${host.alias} -> ${host.uri}`);\n\n return await resultPromise;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.runtime.app.error(\n `Error during SSH operation to ${host.uri}: ${errorMessage}`,\n error instanceof Error ? error.stack : undefined,\n );\n return error instanceof Error ? error : new Error(errorMessage);\n } finally {\n await remoteRuntime.disconnect();\n }\n }\n\n public exit(exitCode: number, message?: string): void {\n if (message) {\n this.runtime.app.log(exitCode === 0 ? Verbosity.INFO : Verbosity.ERROR, message);\n }\n // In a library context, actually calling process.exit() is often undesirable.\n // Throwing a specific error might be better for the app to handle.\n // For now, keeping it simple, but this could be a point of future refinement.\n this.runtime.app.warn(`Task ${this.id} requested exit with code ${exitCode}. Forcing process exit.`);\n process.exit(exitCode);\n }\n\n override async run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> {\n return taskPartialFn(this);\n }\n\n override async invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFnDefinition: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn> {\n const childInvocation = new LocalInvocation(this.runtime, childTaskFnDefinition, params, this);\n await this.appendChildInvocation(childInvocation);\n\n const loggedChildResultPromise = childInvocation.result\n .then((value) => {\n if (value instanceof Error) return value;\n if (value === undefined || value === null) return undefined;\n return value;\n })\n .catch((error) => error);\n this.runtime.app.taskTree.add(\n childInvocation.id,\n this.id,\n childTaskFnDefinition.task.name || 'anonymous_child_task',\n loggedChildResultPromise,\n );\n\n const taskContext = this.runtime.app.taskContextForRunFn(\n childInvocation,\n params,\n undefined /* host is undefined for local */,\n ) as TaskContext<TTaskParams>;\n\n try {\n const result = await childTaskFnDefinition.task.runFn.call(childInvocation, taskContext);\n childInvocation.resolveResult(result);\n return result as TTaskReturn;\n } catch (error) {\n childInvocation.rejectResult(error as Error);\n throw error;\n }\n }\n}\n\nexport class LocalRuntime implements IRuntime {\n public config?: { cwd?: string; configFile?: ConfigFile };\n public host: Host; // Represents the local machine\n private memoizedPassword?: string;\n\n constructor(\n public app: App,\n public localBundlePath: Path,\n public interactionHandler: InteractionHandler = new InteractionHandler(),\n ) {\n const appConfigInstance = this.app.config;\n this.host = new Host(appConfigInstance as any, { hostname: 'localhost', alias: 'localhost' });\n this.config = {\n cwd: process.cwd(),\n configFile: appConfigInstance instanceof ConfigFile ? appConfigInstance : undefined,\n };\n }\n\n get tmpDirRootPath(): Path {\n return this.app.hostctlTmpDir();\n }\n\n async getPassword(): Promise<string | undefined> {\n if (this.memoizedPassword) {\n return this.memoizedPassword;\n }\n this.memoizedPassword = await this.app.promptPasswordInteractively('Enter local sudo password:');\n return this.memoizedPassword;\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n const secret = this.app.config.getSecret(name);\n if (!secret) {\n this.app.warn(`Secret ${name} not found in config.`);\n return undefined;\n }\n return secret.plaintext();\n }\n\n getTmpDir(): Path {\n return this.app.createNamedTmpDir();\n }\n\n getTmpFile(prefix?: string | undefined, postfix?: string | undefined, dir?: Path | undefined): Path {\n const tmpDir = dir || this.getTmpDir();\n // Use crypto.randomUUID() for a unique filename component\n const randomName = prefix ? `${prefix}-${crypto.randomUUID()}` : crypto.randomUUID();\n const finalName = postfix ? `${randomName}-${postfix}` : randomName;\n return tmpDir.join(finalName);\n }\n\n inventory(tags: string[]): Host[] {\n return this.app.queryInventory(new Set(tags));\n }\n\n selectedInventory(tags?: string[]): Host[] {\n const tagSet: Set<string> = tags ? new Set(tags) : new Set();\n return this.app.querySelectedInventory(tagSet);\n }\n\n async invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n description?: string,\n ): Promise<LocalInvocation<TParams, TReturn>> {\n const rootInvocation = new LocalInvocation<TParams, TReturn>(\n this,\n taskFnDefinition,\n params,\n undefined /* no parent */,\n );\n if (description) {\n rootInvocation.description = description;\n }\n const loggedRootResultPromise = rootInvocation.result\n .then((value) => {\n if (value instanceof Error) return value;\n if (value === undefined || value === null) return undefined;\n return value;\n })\n .catch((error) => error);\n this.app.taskTree.add(\n rootInvocation.id,\n null,\n taskFnDefinition.task.name || 'anonymous_root_task',\n loggedRootResultPromise,\n );\n\n // Corrected to call taskContextForRunFn on this.app instead of this.app.taskTree\n const taskContext = this.app.taskContextForRunFn(\n rootInvocation,\n params,\n undefined /* host is undefined */,\n ) as TaskContext<TParams>;\n\n taskFnDefinition.task.runFn\n .call(rootInvocation, taskContext)\n .then(rootInvocation.resolveResult)\n .catch(rootInvocation.rejectResult);\n\n return rootInvocation;\n }\n}\n","import StackTracey from 'stacktracey';\n\n// StackTracey {\n// items: [\n// {\n// beforeParse: 'at REPL36:1:1',\n// callee: '',\n// index: false,\n// native: false,\n// file: 'REPL36',\n// line: 1,\n// column: 1,\n// calleeShort: '',\n// fileRelative: 'REPL36',\n// fileShort: 'REPL36',\n// fileName: 'REPL36',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at ContextifyScript.runInThisContext (node:vm:136:12)',\n// callee: 'ContextifyScript.runInThisContext',\n// index: false,\n// native: false,\n// file: 'node:vm',\n// line: 136,\n// column: 12,\n// calleeShort: 'runInThisContext',\n// fileRelative: 'node:vm',\n// fileShort: 'node:vm',\n// fileName: 'node:vm',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.defaultEval (node:repl:598:22)',\n// callee: 'REPLServer.defaultEval',\n// index: false,\n// native: false,\n// file: 'node:repl',\n// line: 598,\n// column: 22,\n// calleeShort: 'defaultEval',\n// fileRelative: 'node:repl',\n// fileShort: 'node:repl',\n// fileName: 'node:repl',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at bound (node:domain:432:15)',\n// callee: 'bound',\n// index: false,\n// native: false,\n// file: 'node:domain',\n// line: 432,\n// column: 15,\n// calleeShort: 'bound',\n// fileRelative: 'node:domain',\n// fileShort: 'node:domain',\n// fileName: 'node:domain',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.runBound (node:domain:443:12)',\n// callee: 'REPLServer.runBound',\n// index: false,\n// native: false,\n// file: 'node:domain',\n// line: 443,\n// column: 12,\n// calleeShort: 'runBound',\n// fileRelative: 'node:domain',\n// fileShort: 'node:domain',\n// fileName: 'node:domain',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at REPLServer.preEval [as eval] (/home/david/.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs:1:366)',\n// callee: 'REPLServer.preEval [as eval]',\n// index: false,\n// native: false,\n// file: '/home/david/.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// line: 1,\n// column: 366,\n// calleeShort: 'preEval [as eval]',\n// fileRelative: '../../../../.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// fileShort: '../../../../.local/share/mise/installs/node/22.7.0/lib/node_modules/tsx/dist/patch-repl.cjs',\n// fileName: 'patch-repl.cjs',\n// thirdParty: false,\n// externalDomain: undefined\n// },\n// {\n// beforeParse: 'at process.processTicksAndRejections (node:internal/process/task_queues:105:5)',\n// callee: 'process.processTicksAndRejections',\n// index: false,\n// native: false,\n// file: 'node:internal/process/task_queues',\n// line: 105,\n// column: 5,\n// calleeShort: 'processTicksAndRejections',\n// fileRelative: 'node:internal/process/task_queues',\n// fileShort: 'node:internal/process/task_queues',\n// fileName: 'task_queues',\n// thirdParty: false,\n// externalDomain: undefined\n// }\n// ]\n// }\nexport function callstack() {\n return new StackTracey();\n}\n","import { callstack } from './stacktrace';\nimport { Path } from './flex/path';\nimport { Host } from './host'; // For TaskContext and IInvocation\nimport { Mutex } from 'async-mutex'; // For Invocation\nimport { type CommandResult, type EnvVarObj } from './command'; // For IInvocation & TaskContext\nimport { StringBuilder } from 'typescript-string-operations'; // For Invocation\nimport type { App, AppConfig } from './app'; // For IRuntime and TaskContext\nimport type { ZodTypeAny } from 'zod';\nimport { Verbosity } from './verbosity';\nimport type { ConfigFile } from './config-file'; // For IRuntime\nimport type { InteractionHandler } from './interaction-handler'; // For IRuntime\nimport chalk from 'chalk'; // For Invocation.exit logging\nimport {\n Task, // Value import\n type ObjectType, // Type import for use within this module\n type TaskParams, // Type import for use within this module\n type RunFnReturnValue, // Type import for use within this module\n type RunFn, // Type import for use within this module\n} from './task.model';\n\nexport type LogLevel = number; // Numerical log levels, compatible with Verbosity in app.ts\n// ObjectType, TaskParams, RunFnReturnValue, RunFn are now imported from task.model.ts\n\nexport interface FileSystemOperations {\n read: (path: string) => Promise<string>;\n write: (\n path: string,\n content: string | Buffer,\n options?: { mode?: string | number; user?: string; group?: string; flag?: string },\n ) => Promise<void>;\n exists: (path: string) => Promise<boolean>;\n mkdir: (path: string, options?: { recursive?: boolean; mode?: string | number }) => Promise<void>;\n rm: (path: string, options?: { recursive?: boolean; force?: boolean }) => Promise<void>;\n // Consider adding stat, ls, etc. later\n}\n\nexport interface TaskContext<TParams extends TaskParams = TaskParams> {\n params: TParams;\n readonly id: string;\n readonly host?: Host;\n readonly config: AppConfig; // Access to resolved application configuration\n log: (level: LogLevel, ...message: any[]) => void; // Unified logging with level\n info: (...message: any[]) => void;\n debug: (...message: any[]) => void;\n warn: (...message: any[]) => void;\n error: (...message: any[]) => void;\n\n // exec is for running shell commands on the host\n exec: (\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ) => Promise<CommandResult>; // Renamed from sh\n\n // ssh will ssh into a set of hosts and evaluate the given function for each host\n ssh: <TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ) => Promise<Record<string, TRemoteReturn | Error>>;\n\n // run will run a given task script\n run: <TRunReturn extends RunFnReturnValue>(taskPartialFn: TaskPartialFn<TRunReturn>) => Promise<TRunReturn>;\n\n // getPassword will prompt the user for a password\n getPassword: () => Promise<string | undefined>;\n\n // getSecret will retrieve a secret from the application configuration\n getSecret: (name: string) => Promise<string | undefined>;\n\n // exit will exit the application\n exit: (exitCode: number, message?: string) => void;\n\n // inventory will return a list of hosts that match the given tags\n inventory: (tags: string[]) => Host[];\n\n // selectedInventory will return a list of hosts that match the given tags and are selected\n selectedInventory: (tags?: string[]) => Host[];\n\n // file will provide file system operations contextualized to the host\n file: FileSystemOperations;\n}\n\n// RunFn and Task class are now imported from task.model.ts\n\nexport type TaskPartialFn<TReturn extends RunFnReturnValue = RunFnReturnValue> = (\n parentInvocation: IInvocation,\n) => Promise<TReturn>;\n\n// Task class is imported from task.model.ts\n\nexport interface TaskFn<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n (params?: TParams): TaskPartialFn<TReturn>;\n task: Task<TParams, TReturn>;\n}\n\nexport interface TaskOptions {\n description?: string;\n name?: string;\n inputSchema?: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n}\n\nexport function task<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n runFn: RunFn<TParams, TReturn>,\n options?: TaskOptions,\n): TaskFn<TParams, TReturn> {\n const moduleThatTaskIsDefinedIn = Path.new(callstack().items[2].file).absolute().toString();\n const inferredName = Path.new(moduleThatTaskIsDefinedIn)\n .basename()\n .toString()\n .replace(/\\.[^.]+$/, '');\n const taskName = options?.name || inferredName || 'anonymous_task';\n const taskInstance = new Task<TParams, TReturn>(\n runFn,\n moduleThatTaskIsDefinedIn,\n options?.description,\n taskName,\n options?.inputSchema,\n options?.outputSchema,\n );\n\n const taskFnObject: TaskFn<TParams, TReturn> = function (params?: TParams) {\n return function (parentInvocation: IInvocation): Promise<TReturn> {\n return parentInvocation.invokeChildTask(taskFnObject, params ?? ({} as TParams)) as Promise<TReturn>;\n };\n } as TaskFn<TParams, TReturn>;\n Object.assign(taskFnObject, { task: taskInstance });\n\n return taskFnObject;\n}\n\nexport interface IInvocation<TParams extends TaskParams = any> {\n id: string;\n runtime: IRuntime;\n host?: Host;\n readonly config: AppConfig;\n log(level: LogLevel, ...message: any[]): void;\n info(...message: any[]): void;\n debug(...message: any[]): void;\n warn(...message: any[]): void;\n error(...message: any[]): void;\n exec(\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult>;\n readonly file: FileSystemOperations;\n ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>>;\n run<TRunReturn extends RunFnReturnValue>(taskPartialFn: TaskPartialFn<TRunReturn>): Promise<TRunReturn>;\n invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFn: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn>;\n getPassword(): Promise<string | undefined>;\n getSecret(name: string): Promise<string | undefined>;\n exit(exitCode: number, message?: string): void;\n inventory(tags: string[]): Host[];\n selectedInventory(tags?: string[]): Host[];\n setDescription(description: string): void;\n setFutureResult(resultPromise: Promise<RunFnReturnValue>): void;\n appendChildInvocation(childInvocation: IInvocation<any>): Promise<void>;\n readonly stderr: string;\n readonly stdout: string;\n resultError(): Promise<Error | undefined>;\n getDescription(): string | undefined;\n getChildren(): ReadonlyArray<IInvocation<any>>;\n getResultPromise(): Promise<RunFnReturnValue>;\n}\n\nexport abstract class Invocation<TParams extends TaskParams = any> implements IInvocation<TParams> {\n public id: string;\n public children: Array<IInvocation<any>>; // Children can have any params\n private childrenMutex: Mutex;\n public description?: string;\n public stderrSB: StringBuilder;\n public stdoutSB: StringBuilder;\n public host?: Host;\n public result: Promise<RunFnReturnValue>;\n public resolveResult: (value: RunFnReturnValue | PromiseLike<RunFnReturnValue>) => void;\n public rejectResult: (reason?: any) => void;\n\n constructor(\n public runtime: IRuntime,\n public taskFnDefinition: TaskFn<TParams, any>,\n public parent?: IInvocation<any>,\n ) {\n this.id = crypto.randomUUID();\n this.children = [];\n this.childrenMutex = new Mutex();\n const { promise, resolve, reject } = Promise.withResolvers<RunFnReturnValue>();\n this.result = promise;\n this.resolveResult = resolve;\n this.rejectResult = reject;\n this.stdoutSB = new StringBuilder();\n this.stderrSB = new StringBuilder();\n }\n\n // Constructor and fields are above\n\n // Concrete method implementations\n getPassword(): Promise<string | undefined> {\n return this.runtime.getPassword();\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n // Ensure config is available, typically via this.runtime.app.config\n // This might need adjustment if 'this.config' is the direct source.\n const secret = this.runtime.app.config.getSecret(name);\n if (!secret) {\n return undefined;\n }\n return secret.plaintext();\n }\n\n get stderr(): string {\n return this.stderrSB.toString();\n }\n\n get stdout(): string {\n return this.stdoutSB.toString();\n }\n\n info(...message: any[]) {\n this.log(Verbosity.INFO, ...message);\n }\n\n debug(...message: any[]) {\n this.log(Verbosity.DEBUG, ...message);\n }\n\n warn(...message: any[]) {\n this.log(Verbosity.WARN, ...message);\n }\n\n error(...message: any[]) {\n this.log(Verbosity.ERROR, ...message);\n }\n\n async resultError(): Promise<Error | undefined> {\n try {\n await this.result;\n return undefined;\n } catch (e) {\n return e as Error;\n }\n }\n\n setDescription(description: string) {\n this.description = description;\n }\n\n setFutureResult(resultPromise: Promise<RunFnReturnValue>) {\n resultPromise.then(this.resolveResult, this.rejectResult);\n }\n\n public getDescription(): string | undefined {\n return this.description;\n }\n public getChildren(): ReadonlyArray<IInvocation<any>> {\n return this.children;\n }\n public getResultPromise(): Promise<RunFnReturnValue> {\n return this.result;\n }\n\n public exit(exitCode: number, message?: string): void {\n if (message) {\n this.runtime.app.warn(\n chalk.yellow(`Task ${this.description || this.id} requested exit with code ${exitCode}: ${message}`),\n );\n }\n process.exit(exitCode);\n }\n\n inventory(tags: string[]): Host[] {\n return this.runtime.inventory(tags);\n }\n\n selectedInventory(tags?: string[]): Host[] {\n return this.runtime.selectedInventory(tags);\n }\n\n async appendChildInvocation(childInvocation: IInvocation<any>) {\n // Ensure IInvocation<any>\n await this.childrenMutex.runExclusive(async () => {\n this.children.push(childInvocation);\n });\n }\n\n // Abstract method declarations (must be implemented by subclasses)\n public abstract readonly config: AppConfig;\n public abstract log(level: LogLevel, ...message: any[]): void;\n public abstract exec(\n command: string | string[],\n options?: {\n input?: Record<string, string>;\n sudo: boolean;\n stdin?: string | Buffer;\n env?: EnvVarObj;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult>;\n public abstract readonly file: FileSystemOperations;\n public abstract ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>>;\n public abstract run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn>;\n public abstract invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFn: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn>;\n // Note: 'exit' has a concrete implementation above, so it's not abstract here.\n // Note: 'inventory' has a concrete implementation above, so it's not abstract here.\n}\n\nexport interface IRuntime {\n app: App;\n config?: { cwd?: string; configFile?: ConfigFile };\n interactionHandler: InteractionHandler;\n tmpDirRootPath: Path;\n\n getPassword(): Promise<string | undefined>;\n getSecret(name: string): Promise<string | undefined>;\n getTmpDir(): Path;\n getTmpFile(prefix?: string, postfix?: string, dir?: Path): Path;\n inventory(tags: string[]): Host[];\n selectedInventory(tags?: string[]): Host[];\n invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n description?: string,\n ): Promise<IInvocation<TParams>>;\n}\n","import type { Signal } from 'human-signals';\nexport type { Signal };\nimport { A } from './flex/array';\nimport { V } from './flex/type';\nimport { parse, quote } from 'shell-quote';\nimport Shellwords from 'shellwords-ts';\nimport { O } from './flex/object';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nexport type EnvVarObj = Record<string, string>;\n\nexport function processEnvVars(): EnvVarObj {\n return O(process.env).map(([key, value]: [string, string | undefined]) => [key, String(value)]);\n}\n\nexport class CommandResult {\n constructor(\n public stdout: string,\n public stderr: string,\n public exitCode: number,\n public signal?: Signal,\n ) {}\n\n toJSON() {\n return {\n stdout: this.stdout,\n stderr: this.stderr,\n exitCode: this.exitCode,\n signal: this.signal,\n success: this.success,\n failure: this.failure,\n };\n }\n get out() {\n return this.stdout;\n }\n get err() {\n return this.stderr;\n }\n get exit() {\n return this.exitCode;\n }\n get sig() {\n return this.signal;\n }\n get success() {\n return this.exitCode === 0;\n }\n get failure() {\n return !this.success;\n }\n}\n\nexport interface CommandOptions {\n cmd: string;\n args?: string[];\n cwd?: string;\n env?: EnvVarObj;\n result?: CommandResult;\n sudo?: boolean;\n}\n\nexport class Command {\n static parse(\n commandString: string,\n env?: EnvVarObj,\n ): {\n cmd: string;\n args: string[];\n env?: EnvVarObj;\n } {\n if (!commandString || commandString.trim() === '') {\n throw new Error('Command string cannot be empty.');\n }\n // const quotedCmd = quote([commandString]);\n // console.log(`parse: ${commandString} -> ${quotedCmd}`);\n // const parts = parse(quotedCmd);\n // console.log(`parts: ${parts}`);\n\n const parts = Shellwords.split(commandString);\n // console.log(`parts: ${JSON.stringify(parts)}`);\n\n const cmd_unsafe = A.head(parts);\n if (cmd_unsafe === undefined) {\n // This case should be prevented by the check for empty commandString earlier\n throw new Error(`Failed to parse command from string: \"${commandString}\". Resulted in no command part.`);\n }\n const cmd: string = cmd_unsafe;\n // console.log(cmd);\n const parsedArgs = A(parts).skipFirst(1);\n // console.log(parsedArgs);\n\n const args: string[] = A(parsedArgs).compact();\n // console.log(args);\n\n return {\n cmd,\n args,\n env,\n };\n }\n\n /**\n * Builds a Command object from a command string or array with optional sudo and environment variables.\n * This is the main factory method for creating commands that will be executed.\n */\n static build(\n command: string | string[],\n options: {\n sudo?: boolean;\n env?: EnvVarObj;\n cwd?: string;\n } = {},\n ): Command {\n const { sudo = false, env, cwd } = options;\n\n let cmd: string;\n let args: string[];\n\n if (Array.isArray(command)) {\n if (command.length === 0) {\n throw new Error('Command array cannot be empty.');\n }\n cmd = command[0];\n args = command.slice(1).filter(Boolean);\n } else {\n const parsed = Command.parse(command, env);\n cmd = parsed.cmd;\n args = parsed.args;\n }\n\n // Do NOT apply sudo prefixing here; just set the sudo property\n return new Command({ cmd, args, cwd, env, sudo });\n }\n\n public cmd;\n public args?;\n public cwd?: string;\n public env?: Record<string, string>;\n public result?: CommandResult;\n public sudo?: boolean;\n\n constructor(opts: CommandOptions) {\n const { cmd, args, cwd, env, result, sudo } = opts;\n this.cmd = cmd;\n this.args = args;\n this.cwd = cwd;\n this.env = env;\n this.result = result;\n this.sudo = sudo;\n }\n\n isRunning(): boolean {\n return !!this.result;\n }\n\n /**\n * Returns the command as a string suitable for shell execution.\n * Uses POSIX standard env command for environment variables.\n */\n toString(): string {\n // Build the base command\n const baseCommand = `${this.cmd} ${(this.args || []).join(' ')}`.trim();\n\n // Apply environment variables using POSIX env command\n if (this.env && Object.keys(this.env).length > 0) {\n const envArgs = Object.entries(this.env)\n .map(([key, value]) => `${key}=${value}`)\n .join(' ');\n\n // Apply sudo prefixing if requested (sudo comes before env)\n if (this.sudo) {\n return `sudo env ${envArgs} ${baseCommand}`;\n } else {\n return `env ${envArgs} ${baseCommand}`;\n }\n } else {\n // No environment variables, just apply sudo if requested\n if (this.sudo) {\n return `sudo ${baseCommand}`;\n } else {\n return baseCommand;\n }\n }\n }\n\n /**\n * Returns the command and args as separate components.\n * If env is set, returns env as the command and env assignments as args.\n * If sudo is set, returns sudo as the command and the rest as args.\n */\n toArray(): { cmd: string; args: string[] } {\n const hasEnv = this.env && Object.keys(this.env).length > 0;\n const hasSudo = !!this.sudo;\n const baseCmd = this.cmd;\n const baseArgs = this.args || [];\n\n if (hasSudo && hasEnv) {\n // sudo env VAR=val ... cmd ...args\n const envArgs = Object.entries(this.env!).map(([k, v]) => `${k}=${v}`);\n return {\n cmd: 'sudo',\n args: ['env', ...envArgs, baseCmd, ...baseArgs],\n };\n } else if (hasSudo) {\n // sudo cmd ...args\n return {\n cmd: 'sudo',\n args: [baseCmd, ...baseArgs],\n };\n } else if (hasEnv) {\n // env VAR=val ... cmd ...args\n const envArgs = Object.entries(this.env!).map(([k, v]) => `${k}=${v}`);\n return {\n cmd: 'env',\n args: [...envArgs, baseCmd, ...baseArgs],\n };\n } else {\n // plain\n return {\n cmd: baseCmd,\n args: baseArgs,\n };\n }\n }\n\n toJSON() {\n return {\n cmd: this.cmd,\n args: this.args,\n cwd: this.cwd,\n env: this.env,\n result: this.result?.toJSON(),\n };\n }\n}\n","export const Verbosity = {\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n} as const;\n\nexport type VerbosityLevel = (typeof Verbosity)[keyof typeof Verbosity];\n","// src/task.model.ts\nimport type { ZodTypeAny } from 'zod';\nimport type { TaskContext } from './runtime-base'; // Type-only import for RunFn definition\n\n/**\n * Generic object type for parameters and return values.\n */\nexport type ObjectType = { [key: string]: any };\n\n/**\n * Base type for task-specific parameters.\n */\nexport type TaskParams = ObjectType;\n\n/**\n * Represents the possible return values of a task's run function.\n */\nexport type RunFnReturnValue = ObjectType | void | undefined | null | Error;\n\n/**\n * Defines the signature of a task's main execution function.\n * It receives a TaskContext and returns a Promise of a RunFnReturnValue.\n */\nexport interface RunFn<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n (context: TaskContext<TParams>): Promise<TReturn>;\n}\n\n/**\n * Represents a task definition, including its run function and metadata.\n * This class is instantiated by the `task` factory function.\n */\nexport class Task<TParams extends TaskParams = TaskParams, TReturn extends RunFnReturnValue = RunFnReturnValue> {\n constructor(\n public runFn: RunFn<TParams, TReturn>,\n public taskModuleAbsolutePath?: string,\n public description?: string,\n public name?: string,\n public inputSchema?: ZodTypeAny,\n public outputSchema?: ZodTypeAny,\n ) {}\n}\n","import Handlebars from 'handlebars';\nimport {\n type IInvocation,\n Invocation,\n type IRuntime,\n type TaskFn,\n type TaskContext,\n type TaskPartialFn,\n type FileSystemOperations,\n type LogLevel,\n} from './runtime-base';\nimport type { TaskParams, RunFnReturnValue } from './task.model';\nimport * as path from 'node:path';\nimport { Host } from './host';\nimport type { Config as NodeSSHConfig } from 'node-ssh'; // For SSH connection options\nimport { Path } from './flex/path';\nimport type { App, AppConfig } from './app';\nimport { Verbosity } from './verbosity';\n// LogLevel is now imported from ./runtime\nimport { CommandResult, type EnvVarObj, Command, type Signal } from './command';\nimport { InteractionHandler } from './interaction-handler';\nimport { SSHSession } from './ssh-session';\nimport { isError } from './error';\nimport chalk from 'chalk';\nimport * as util from 'node:util';\nimport { StringBuilder } from 'typescript-string-operations';\nimport { ConfigFile } from './config-file';\nimport { O } from './flex/object';\nimport { match, P } from 'ts-pattern';\nimport { V } from './flex/type';\nimport { withSudo, type InputMap } from './util/input-helpers';\n\nfunction normalizeWriteMode(mode?: string | number): number | undefined {\n if (mode === undefined) {\n return undefined;\n }\n\n if (typeof mode === 'number') {\n return mode;\n }\n\n const normalized = mode.startsWith('0o') ? mode.slice(2) : mode;\n const parsed = Number.parseInt(normalized, 8);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nexport class RemoteInvocation<\n TParams extends TaskParams = any,\n TReturn extends RunFnReturnValue = any,\n> extends Invocation<TParams> {\n public readonly config: AppConfig;\n public readonly file: FileSystemOperations;\n // sshSession is removed from RemoteInvocation, it will be managed by RemoteRuntime\n\n constructor(\n runtime: IRuntime,\n public taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n public parent: IInvocation<any>,\n public hostInstance?: Host,\n ) {\n super(runtime, taskFnDefinition, parent);\n this.description = Handlebars.compile(\n taskFnDefinition.task.description || taskFnDefinition.task.name || 'anonymous_remote_task',\n )(params);\n this.host = hostInstance || parent.host; // Inherit host from parent if not provided\n if (!this.host) {\n throw new Error('RemoteInvocation must have a host.');\n }\n this.config = this.runtime.app.config;\n\n this.file = {\n read: async (filePath: string): Promise<string> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n return new Promise<string>((resolve, reject) => {\n sftp.readFile(remotePath, (err: Error | null, data: Buffer | undefined) => {\n if (err) {\n return reject(err);\n }\n if (!data) {\n // Should not happen if err is null, but good practice\n return reject(new Error(`SFTP readFile returned no data for ${remotePath}`));\n }\n resolve(data.toString('utf-8'));\n });\n });\n },\n write: async (\n filePath: string,\n content: string | Buffer,\n options?: { mode?: string | number; flag?: string },\n ): Promise<void> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n\n const mode = normalizeWriteMode(options?.mode);\n\n const streamOptions: Record<string, unknown> = {\n flags: options?.flag ?? 'w',\n };\n\n if (mode !== undefined) {\n streamOptions.mode = mode;\n }\n\n await new Promise<void>((resolve, reject) => {\n const stream = sftp.createWriteStream(remotePath, streamOptions);\n stream.on('error', reject);\n stream.on('finish', resolve);\n stream.on('close', resolve);\n stream.end(content);\n });\n },\n exists: async (filePath: string): Promise<boolean> => {\n const sftp = await this.ensureSftp();\n const remotePath = this.resolveRemotePath(filePath);\n return new Promise((resolve, reject) => {\n sftp.stat(remotePath, (err: Error | null, stats: any) => {\n // stats type might need refinement from ssh2 types\n if (err) {\n // Common SFTP error codes for 'No such file' are 2 (SSH_FX_NO_SUCH_FILE from ssh2-streams constants)\n // node-ssh might wrap this, check error object structure\n const sftpError = err as any;\n if (\n sftpError.code === 2 ||\n sftpError.code === 'ENOENT' ||\n (typeof err.message === 'string' &&\n (err.message.includes('No such file') || err.message.includes('No such entity')))\n ) {\n resolve(false);\n } else {\n reject(err);\n }\n } else {\n resolve(true);\n }\n });\n });\n },\n mkdir: async (dirPath: string, options?: { recursive?: boolean; mode?: string | number }): Promise<void> => {\n const remoteDir = this.resolveRemotePath(dirPath);\n let command = `mkdir ${options?.recursive ? '-p ' : ''}${this.quoteRemoteArg(remoteDir)}`;\n await this.exec(command); // Use this.exec for consistency\n if (options?.mode) {\n await this.exec(`chmod ${this.quoteRemoteArg(String(options.mode))} ${this.quoteRemoteArg(remoteDir)}`);\n }\n },\n rm: async (itemPath: string, options?: { recursive?: boolean; force?: boolean }): Promise<void> => {\n const remoteItem = this.resolveRemotePath(itemPath);\n const command = `rm ${options?.recursive ? '-r ' : ''}${options?.force ? '-f ' : ''}${this.quoteRemoteArg(remoteItem)}`;\n await this.exec(command); // Use this.exec for consistency\n },\n };\n }\n\n private async ensureSftp(): Promise<any> {\n // Return type should be the actual SFTP client type from node-ssh\n if (!(this.runtime instanceof RemoteRuntime)) {\n throw new Error('Runtime is not a RemoteRuntime instance, cannot ensure SFTP.');\n }\n // Delegate to RemoteRuntime to get the SFTP client\n return this.runtime.getSftpClient();\n }\n\n private resolveRemotePath(p: string): string {\n // Assuming paths are either absolute or relative to the user's home directory on the remote host\n // node-ssh's SFTP methods generally treat non-absolute paths as relative to home.\n // For exec, CWD handling is separate.\n return p; // Keep it simple for now, let node-ssh handle path resolution relative to home for SFTP.\n }\n\n private quoteRemoteArg(arg: string): string {\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n }\n\n public log(level: LogLevel, ...message: any[]): void {\n const hostUri = this.host ? `${this.host.user || ''}@${this.host.hostname}` : 'unknown-host'; // Changed host to hostname\n this.runtime.app.log(level, `[${hostUri}|${this.id}|${this.description || 'task'}]`, ...message);\n }\n\n uri(): string {\n if (!this.host) throw new Error('Host is not defined for this remote invocation.');\n return `${this.host.user || this.runtime.app.defaultSshUser()}@${this.host.hostname}`; // Changed host to hostname\n }\n\n override async exec(\n command: string | string[],\n options?: {\n input?: InputMap;\n sudo?: boolean;\n stdin?: string | Buffer;\n env?: Record<string, string>;\n cwd?: string;\n user?: string;\n pty?: boolean;\n },\n ): Promise<CommandResult> {\n if (!this.host) throw new Error('Host is not defined for exec command in RemoteInvocation.');\n\n if (!(this.runtime instanceof RemoteRuntime)) {\n throw new Error('Runtime is not a RemoteRuntime instance, cannot execute remote command.');\n }\n\n const stdinForRemoteCommand: string | Buffer | undefined = options?.stdin;\n // Start with a clone of the runtime's default handler.\n // This handler can be augmented with exec-specific patterns.\n const execSpecificInteractionHandler = this.runtime.interactionHandler.clone();\n\n if (options?.input) {\n execSpecificInteractionHandler.mapInput(options.input);\n }\n\n if (options?.sudo) {\n const hostPassword = await this.runtime.getPassword();\n execSpecificInteractionHandler.mapInput(withSudo(hostPassword));\n }\n\n // TODO: Add support to run command as another user\n // let commandToRun = Array.isArray(command) ? command.join(\" \") : command;\n // if (options?.user) {\n // commandToRun = `sudo -u ${this.quoteRemoteArg(options.user)} -- /bin/sh -c ${this.quoteRemoteArg(commandToRun)}`;\n // }\n\n // Build the command using the new Command class\n const commandObj = Command.build(command, {\n sudo: options?.sudo,\n env: options?.env,\n cwd: options?.cwd,\n });\n\n this.debug(`Executing remote command on ${this.host.hostname}: ${commandObj.toString()}`); // Changed host to hostname\n\n const cmdOrErr = await this.runtime.executeCommand(commandObj, {\n stdin: stdinForRemoteCommand,\n pty: options?.pty,\n interactionHandler: execSpecificInteractionHandler, // Pass the potentially augmented handler\n });\n\n return match(cmdOrErr)\n .with(P.instanceOf(Error), (err: Error) => {\n throw err;\n })\n .with(P.instanceOf(Command), (command: Command) => {\n return command.result!;\n })\n .exhaustive();\n }\n\n public exit(exitCode: number, message?: string): void {\n const hostUri = this.host ? `${this.host.user || ''}@${this.host.hostname}` : 'unknown-host'; // Changed host to hostname\n const msg = `Remote task ${this.id} on ${hostUri} requested exit with code ${exitCode}${message ? ': ' + message : ''}`;\n this.log(Verbosity.WARN as LogLevel, msg);\n // Throwing an error is more appropriate than trying to force a remote process.exit()\n throw new Error(msg);\n }\n\n override async run<TRunReturn extends RunFnReturnValue>(\n taskPartialFn: TaskPartialFn<TRunReturn>,\n ): Promise<TRunReturn> {\n return taskPartialFn(this);\n }\n\n override async invokeChildTask<TTaskParams extends TaskParams, TTaskReturn extends RunFnReturnValue>(\n childTaskFnDefinition: TaskFn<TTaskParams, TTaskReturn>,\n params: TTaskParams,\n ): Promise<TTaskReturn> {\n if (!this.host) throw new Error('Host is not defined for invokeChildTask in RemoteInvocation.');\n\n const childInvocation = new RemoteInvocation(this.runtime, childTaskFnDefinition, params, this, this.host);\n await this.appendChildInvocation(childInvocation);\n\n this.runtime.app.taskTree.add(\n childInvocation.id,\n this.id,\n childTaskFnDefinition.task.name || 'anonymous_remote_child_task',\n childInvocation.result.then((r) => (r === null ? undefined : r)) as Promise<string | Error | undefined>,\n );\n\n const taskContext = this.runtime.app.taskContextForRunFn(\n childInvocation,\n params,\n this.host,\n ) as TaskContext<TTaskParams>;\n\n try {\n const result = await childTaskFnDefinition.task.runFn.call(childInvocation, taskContext);\n childInvocation.resolveResult(result);\n return result as TTaskReturn;\n } catch (error) {\n childInvocation.rejectResult(error as Error);\n throw error;\n } // End of catch block for invokeChildTask\n } // End of invokeChildTask method\n\n override ssh<TRemoteParams extends TaskParams = {}, TRemoteReturn extends RunFnReturnValue = RunFnReturnValue>(\n tags: string[],\n remoteTaskFn: (remoteContext: TaskContext<TRemoteParams>) => Promise<TRemoteReturn>,\n ): Promise<Record<string, TRemoteReturn | Error>> {\n throw new Error('ssh from a remote host is not currently supported.');\n }\n} // End of RemoteInvocation class\n\nexport class RemoteRuntime implements IRuntime {\n private sftpClientInstance?: any; // Type should be SFTPWrapper from 'node-ssh'\n public readonly app: App;\n public readonly host: Host;\n public readonly interactionHandler: InteractionHandler;\n private sshSession: SSHSession;\n\n constructor(app: App, host: Host, interactionHandler: InteractionHandler = new InteractionHandler()) {\n this.app = app;\n this.host = host;\n this.interactionHandler = interactionHandler;\n this.sshSession = new SSHSession(); // Initialize SSH session for this host for context\n }\n\n get tmpDirRootPath(): Path {\n return new Path('/tmp');\n }\n\n async getPassword(): Promise<string | undefined> {\n return await this.host.decryptedPassword();\n }\n\n async getSecret(name: string): Promise<string | undefined> {\n const secret = this.app.config.getSecret(name);\n if (!secret) {\n this.app.warn(`Secret ${name} not found in config.`);\n return undefined;\n }\n return secret.plaintext();\n }\n\n getTmpDir(): Path {\n return this.tmpDirRootPath.join(this.app.randName());\n }\n\n getTmpFile(prefix?: string | undefined, postfix?: string | undefined, dir?: Path | undefined): Path {\n const tmpDir = dir || this.getTmpDir();\n return tmpDir.join(this.app.randName());\n }\n\n inventory(tags: string[]): Host[] {\n return this.app.queryInventory(new Set(tags));\n }\n\n selectedInventory(tags?: string[]): Host[] {\n const tagSet: Set<string> = tags ? new Set(tags) : new Set();\n return this.app.querySelectedInventory(tagSet);\n }\n\n async connect(): Promise<boolean> {\n if (this.sshSession.isConnected() && this.sftpClientInstance) {\n this.app.debug(`RemoteRuntime: SSH session and SFTP already connected to ${this.host.uri}`);\n return true;\n }\n\n this.app.debug(`RemoteRuntime: Connecting SSH to ${this.host.uri}...`);\n\n const sshConnectOpts: NodeSSHConfig = {\n host: this.host.hostname, // Changed from this.host.host\n username: this.host.user || this.app.defaultSshUser(), // Assuming defaultSshUser on App\n port: this.host.port, // node-ssh parses port from host string if present\n privateKey: await this.host.plaintextSshKeyPath(),\n password: await this.host.decryptedPassword(),\n };\n\n try {\n if (!this.sshSession.isConnected()) {\n await this.sshSession.connect(sshConnectOpts);\n this.app.debug(`RemoteRuntime: SSH connected to ${this.host.uri}`);\n }\n\n this.app.debug(`RemoteRuntime: Requesting SFTP client for ${this.host.uri}`);\n this.sftpClientInstance = await this.sshSession.sftp();\n this.app.debug(`RemoteRuntime: SFTP client ready for ${this.host.uri}`);\n } catch (e: any) {\n this.app.error(`RemoteRuntime: SSH connection or SFTP setup to ${this.host.uri} failed: ${e.message}`);\n if (this.sshSession.isConnected()) {\n await this.sshSession.disconnect().catch((err: Error) => {\n this.app.error(`RemoteRuntime: Error during disconnect after failed connect/sftp: ${err.message}`);\n });\n }\n this.sftpClientInstance = undefined; // Clear sftp client on error\n throw e;\n }\n\n return this.sshSession.isConnected();\n }\n\n async getSftpClient(): Promise<any> {\n // Replace 'any' with actual SFTP client type (e.g., from 'node-ssh')\n await this.connect(); // Ensures connection and SFTP client are active and ready\n if (!this.sftpClientInstance) {\n // This should ideally be caught by connect(), but as a safeguard\n throw new Error(`SFTP client not available on SSHSession for ${this.host.uri} after connect call.`);\n }\n return this.sftpClientInstance;\n }\n\n async executeCommand(\n command: Command,\n options?: {\n stdin?: string | Buffer;\n pty?: boolean;\n interactionHandler?: InteractionHandler;\n },\n ): Promise<Command | Error> {\n const commandDisplay = command.toString();\n\n this.app.debug(`RemoteRuntime: Executing on ${this.host.uri}: ${commandDisplay}`);\n\n const handlerToUse = options?.interactionHandler || this.interactionHandler;\n // const forceNonPty = options?.pty === false;\n let cmdOrErr: Command | Error;\n\n try {\n // if (forceNonPty) {\n // this.app.debug(\n // `RemoteRuntime: Executing command on ${this.host.uri} via sshSession.execCommand (explicit non-PTY)`,\n // );\n // const commandObj: Command = await this.sshSession.execCommand(command, {\n // stdin: options?.stdin,\n // pty: options?.pty,\n // });\n // cmdOrErr = commandObj;\n // } else if (options?.pty || handlerToUse !== this.interactionHandler) {\n if (options?.pty || handlerToUse !== this.interactionHandler) {\n this.app.debug(`RemoteRuntime: Executing command on ${this.host.uri} via sshSession.run (PTY/custom handler)`);\n const commandObj: Command = await this.sshSession.run(command, handlerToUse, {\n stdin: options?.stdin,\n pty: options?.pty,\n });\n cmdOrErr = commandObj;\n } else {\n this.app.debug(\n `RemoteRuntime: Executing command on ${this.host.uri} via sshSession.execCommand (no PTY/default handler)`,\n );\n const commandObj: Command = await this.sshSession.execCommand(command, {\n stdin: options?.stdin,\n pty: false,\n });\n cmdOrErr = commandObj;\n }\n this.app.logHostCommandResult(this.host, commandDisplay, cmdOrErr);\n } catch (e: any) {\n this.app.error(`RemoteRuntime: executeCommand failed for '${commandDisplay}': ${e.message}`);\n this.app.error(e.stack);\n cmdOrErr = e;\n this.app.logHostCommandResult(this.host, commandDisplay, cmdOrErr);\n }\n\n return cmdOrErr;\n }\n\n async disconnect(): Promise<void> {\n if (this.sshSession.isConnected()) {\n this.app.debug(`RemoteRuntime: Disconnecting SSH from ${this.host.uri}`);\n this.sftpClientInstance = undefined; // Clear SFTP client instance\n await this.sshSession.disconnect();\n }\n }\n\n async invokeRootTask<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n taskFnDefinition: TaskFn<TParams, TReturn>,\n params: TParams,\n ): Promise<IInvocation> {\n await this.connect();\n if (!this.sshSession) throw new Error('SSH session not established for invokeRootTask.');\n\n // RemoteInvocation will use this RemoteRuntime instance for SSH operations\n const rootInvocation = new RemoteInvocation(\n this,\n taskFnDefinition,\n params,\n { runtime: this, host: this.host } as any,\n this.host,\n );\n\n this.app.taskTree.add(\n rootInvocation.id,\n null,\n taskFnDefinition.task.name || `remote_root_task_on_${this.host.hostname}`, // Changed host to hostname\n rootInvocation.result.then((r) => (r === null ? undefined : r)) as Promise<string | Error | undefined>,\n );\n\n const taskContext = this.app.taskContextForRunFn(rootInvocation, params, this.host) as TaskContext<TParams>;\n\n taskFnDefinition.task.runFn\n .call(rootInvocation, taskContext)\n .then(rootInvocation.resolveResult)\n .catch(rootInvocation.rejectResult);\n\n return rootInvocation;\n }\n}\n","import { signalsByName } from 'human-signals';\nimport { NodeSSH, type Config } from 'node-ssh';\nimport { InteractionHandler } from './interaction-handler';\nimport { PassThrough } from 'stream'; // Added for combining stdin\nimport { Command, CommandResult, type Signal } from './command';\n\nexport class SSHSession {\n public ssh: NodeSSH;\n\n constructor() {\n this.ssh = new NodeSSH();\n }\n\n async connect(sshConnectOpts: Config): Promise<NodeSSH> {\n const session = await this.ssh.connect(sshConnectOpts);\n\n const connection: any = (this.ssh as any).connection;\n if (connection && typeof connection.on === 'function' && connection.listenerCount?.('error') === 0) {\n connection.on('error', (err: any) => {\n const code = String((err as any)?.code ?? '').toUpperCase();\n if (code === 'ECONNRESET') {\n // Dropped connections during reboots are expected; ignore the socket error.\n console.warn(`SSH connection reset: ${err?.message ?? err}`);\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(`SSH connection error: ${err?.message ?? err}`);\n });\n }\n\n return session;\n }\n\n async deleteFile(remotePath: string) {\n const self = this;\n return new Promise(function (resolve, reject) {\n self.ssh.withSFTP(async (sftp) => {\n sftp.unlink(remotePath, (err: Error | null | undefined) => {\n if (err) {\n // err is Error | null | undefined; if non-null/undefined, it's an Error\n // ENOENT (No such file or directory) often has errno 2 or code 'ENOENT'.\n const errnoError = err as NodeJS.ErrnoException;\n if (errnoError.errno === 2 || errnoError.code === 'ENOENT') {\n resolve(true); // Consider \"file not found\" as success for delete\n } else {\n const errnoError = err as NodeJS.ErrnoException;\n const errorCodeDisplay =\n errnoError.code !== undefined\n ? errnoError.code\n : errnoError.errno !== undefined\n ? errnoError.errno\n : 'N/A';\n reject(`${errnoError.message} (code ${errorCodeDisplay}) ${remotePath}`);\n }\n } else {\n // No error means unlink was successful\n resolve(true);\n }\n });\n });\n });\n }\n\n async sftp() {\n return this.ssh.requestSFTP();\n }\n\n async execCommand(command: Command, options?: { stdin?: string | Buffer; pty?: boolean | object }) {\n // Use Command's toString() method which handles env inlining\n const finalCommand = command.toString();\n\n const nodeSshCmdOptions: any = {\n cwd: command.cwd,\n stdin:\n typeof options?.stdin === 'string'\n ? options.stdin\n : Buffer.isBuffer(options?.stdin)\n ? options.stdin.toString()\n : undefined,\n };\n\n if (options?.pty !== undefined) {\n // pty and other ssh2-specific options go into a nested 'options' object\n nodeSshCmdOptions.options = {\n ...(nodeSshCmdOptions.options || {}), // Preserve other potential ssh2 options if they were there\n pty: options.pty,\n };\n }\n\n const result = await this.ssh.execCommand(\n finalCommand,\n nodeSshCmdOptions as import('node-ssh').SSHExecCommandOptions,\n );\n const exitCode = result.code === null ? -1 : result.code; // Handle null exit code\n const signalString = result.signal; // string | null\n const signalObject = signalString ? (signalsByName as Record<string, Signal>)[signalString] : undefined;\n\n const commandResult = new CommandResult(result.stdout, result.stderr, exitCode, signalObject);\n\n return new Command({\n cmd: command.cmd,\n args: command.args,\n cwd: command.cwd,\n env: command.env,\n result: commandResult,\n sudo: command.sudo,\n });\n }\n\n async getFile(remotePath: string, localPath: string) {\n await this.ssh.getFile(localPath, remotePath);\n }\n\n /**\n * Executes a command on the remote host.\n * @param command The Command object to execute.\n * @param interactionHandler The interaction handler to use.\n * @param execOptions The options for the execution.\n * @returns A promise that resolves to the result of the command.\n */\n async run(\n command: Command,\n interactionHandler = new InteractionHandler(),\n execOptions: {\n stdin?: string | Buffer;\n pty?: boolean | object;\n } = {},\n ): Promise<Command> {\n // Return type reflects node-ssh's ExecResult extended with cmd and args\n const self = this;\n\n const combinedStdin = new PassThrough();\n if (execOptions.stdin) {\n combinedStdin.write(execOptions.stdin);\n // If it's a one-off stdin, we might want to end this part of the stream,\n // but PassThrough will stay open for interactionHandler's pipe.\n // For simplicity, let interactionHandler control the end of its piped content.\n }\n interactionHandler.setOutputToNewReadable().pipe(combinedStdin);\n\n interactionHandler.begin();\n\n // Use Command's toArray() method to get command and args separately\n const { cmd, args } = command.toArray();\n\n const ptyOption = execOptions.pty ?? true;\n\n const { stdout, stderr, code, signal } = await self.ssh.exec(cmd, args, {\n cwd: command.cwd,\n execOptions: { pty: ptyOption },\n stream: 'both',\n stdin: combinedStdin,\n onStdout: (chunk: Buffer) => {\n const output = chunk.toString('utf8');\n interactionHandler.handleInput(output);\n },\n onStderr: (chunk: Buffer) => {\n const errorOutput = chunk.toString('utf8');\n interactionHandler.handleInput(errorOutput); // Send stderr to handler too\n // node-ssh's `exec` still collects stderr for the final result.stderr string\n // so we don't need to explicitly return it from here for collection purposes.\n },\n });\n\n interactionHandler.end();\n\n const signalName = signal as keyof typeof signalsByName | null;\n const signalObj = signalName ? signalsByName[signalName] : undefined;\n const result = new CommandResult(stdout, stderr, code || 0, signalObj);\n\n return new Command({\n cmd: command.cmd,\n args: command.args,\n cwd: command.cwd,\n env: command.env,\n result,\n sudo: command.sudo,\n });\n }\n\n async sendFile(localPath: string, remotePath: string): Promise<boolean> {\n try {\n await this.ssh.putFile(localPath, remotePath);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n async disconnect(): Promise<void> {\n this.ssh.dispose();\n }\n\n isConnected() {\n return this.ssh.isConnected();\n }\n}\n","/**\n * An object representing the mapping of expected output (as a regex string)\n * to the input that should be provided in response.\n */\nexport type InputMap = Record<string, string>;\n\nexport const CHECKMARK = '\\u2713';\nexport const XMARK = '\\u2717';\n\n/**\n * A collection of regular expressions to detect various sudo/doas password prompts\n * across different operating systems.\n */\nexport const SUDO_PROMPT_REGEX = {\n /**\n * Matches the default sudo prompt on most Linux distributions.\n * Example: `[sudo] password for <username>:`\n */\n LINUX: '\\\\[sudo\\\\] password',\n\n /**\n * Matches the default sudo prompt on macOS and some BSD systems.\n * Example: `Password:`\n */\n MAC_BSD: '^Password:',\n\n /**\n * Matches the default prompt for `doas` on OpenBSD.\n * Example: `doas (username@hostname) password:`\n */\n DOAS: 'doas \\\\(.*\\\\) password:',\n};\n\n/**\n * A helper function that builds an input map to handle various sudo/doas password prompts.\n * This is useful for building up interaction handlers for commands that require privilege escalation\n * across different operating systems.\n *\n * @param password The sudo/doas password to provide.\n * @param existingInputMap An optional existing map of interactions.\n * @returns A new input map containing the sudo/doas prompt interactions and any existing interactions.\n */\nexport function withSudo(password: string | undefined, existingInputMap: InputMap = {}): InputMap {\n if (!password) {\n return existingInputMap;\n }\n const passwordResponse = `${password}\\n`;\n return {\n ...existingInputMap,\n [SUDO_PROMPT_REGEX.LINUX]: passwordResponse,\n [SUDO_PROMPT_REGEX.MAC_BSD]: passwordResponse,\n [SUDO_PROMPT_REGEX.DOAS]: passwordResponse,\n };\n}\n","import { Pty } from '@replit/ruspty';\nimport { StringBuilder } from 'typescript-string-operations';\n\nimport { Command, CommandResult, type EnvVarObj } from './command';\nimport { InteractionHandler } from './interaction-handler';\nimport { signalsByNumber } from 'human-signals';\nimport { O } from './flex/object';\nimport { A } from './flex/array';\n\nexport class RusPtyCommand extends Command {\n /**\n * Builds a RusPtyCommand object from a command string or array with optional sudo and environment variables.\n * This mirrors Command.build but returns a RusPtyCommand object for local execution.\n */\n static build(\n command: string | string[],\n options: {\n sudo?: boolean;\n env?: EnvVarObj;\n cwd?: string;\n } = {},\n ): RusPtyCommand {\n const commandObj = Command.build(command, options);\n\n return new RusPtyCommand({\n cmd: commandObj.cmd,\n args: commandObj.args,\n cwd: commandObj.cwd,\n env: commandObj.env,\n sudo: commandObj.sudo,\n });\n }\n\n public process!: Pty; // Definite assignment assertion\n\n async run(interactionHandler = new InteractionHandler(), stdin?: string | Buffer): Promise<CommandResult> {\n const self = this;\n return new Promise<CommandResult>(function (resolve, reject) {\n const stdout = new StringBuilder();\n // console.log(`Pty> ${self.cmd} ${self.args}`);\n self.process = new Pty({\n command: self.cmd,\n args: self.args,\n dir: self.cwd,\n envs: self.env as Record<string, string>,\n interactive: true,\n size: { rows: 30, cols: 80 },\n onExit: (err: null | Error, exitCode: number) => {\n interactionHandler.end();\n // console.log(`exit code: ${exitCode}`);\n // console.log(`exit signal: ${signal}`);\n // const signalObj = signalsByNumber[signal || 10000];\n const signalObj = undefined;\n const commandResult = new CommandResult(stdout.toString(), '', exitCode, signalObj);\n self.result = commandResult;\n resolve(commandResult);\n },\n });\n\n const read = self.process.read;\n const write = self.process.write;\n\n if (stdin) {\n // console.log(`Pty> stdin: ${stdin}`);\n write.write(stdin);\n // Consider self.process.end() or write.write('\\x04') if EOF is needed.\n // See also KeySequence.CTRL_D\n }\n\n interactionHandler.begin();\n interactionHandler.setOutputWriter((str) => write.write(str));\n\n read.on('data', (chunk) => {\n stdout.append(chunk);\n interactionHandler.handleInput(chunk);\n });\n });\n }\n}\n","import os from 'node:os';\nimport axios, { type AxiosInstance } from 'axios';\nimport * as cheerio from 'cheerio';\nimport { File } from './flex/file';\nimport { A } from './flex/array';\nimport { O } from './flex/object';\nimport { V } from './flex/type';\nimport { match } from 'ts-pattern';\nimport which from 'which';\nimport { downloadFile } from './http';\n// import { ShellCommand } from './shell-command';\nimport { unarchive } from './unarchive';\nimport type { CommandResult } from './command';\nimport type { Path } from './flex/path';\nimport { RusPtyCommand } from './ruspty-command';\nimport { processEnvVars } from './command';\n\nexport interface NpmInstallOptions {\n pkg?: string;\n omitDev?: boolean;\n cwd?: string;\n prefix?: string; // see https://docs.npmjs.com/cli/v11/configuring-npm/folders#prefix-configuration\n}\n\nexport interface NpmUninstallOptions {\n pkg: string;\n cwd?: string;\n prefix?: string;\n}\n\nexport interface NpmListOptions {\n cwd?: string;\n prefix?: string;\n depth?: number;\n}\n\nexport class NodeRuntime {\n static Name = 'nodejs';\n\n private client: AxiosInstance;\n private alreadyInstalled: boolean;\n private localNode: Path;\n private localNpm: Path;\n\n constructor(public tmpDir: Path) {\n this.client = axios.create({\n baseURL: 'https://nodejs.org/',\n });\n this.alreadyInstalled = false;\n this.localNode = this.tmpDir.join(NodeRuntime.Name, 'bin', 'node');\n this.localNpm = this.tmpDir.join(NodeRuntime.Name, 'bin', 'npm');\n }\n async isNodeInstalledGlobally() {\n const result = await RusPtyCommand.build(`node --version`, { env: processEnvVars() }).run();\n // console.log(`isNodeInstalledGlobally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNodeInstalledLocally() {\n const result = await RusPtyCommand.build(`${this.localNode} --version`, { env: processEnvVars() }).run();\n // console.log(`isNodeInstalledLocally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNpmInstalledGlobally() {\n const result = await RusPtyCommand.build(`npm --version`, { env: processEnvVars() }).run();\n // console.log(`isNpmInstalledGlobally result: ${V.inspect(result.toJSON())}`);\n return result.success;\n }\n\n async isNpmInstalledLocally() {\n const result = await RusPtyCommand.build(`${this.localNpm} --version`, { env: processEnvVars() }).run();\n // console.log(`isNpmInstalledLocally result: ${V.inspect(result.toJSON())}`);\n // console.log(result.err);\n return result.success;\n }\n\n async nodeCmd() {\n if (await this.isNodeInstalledGlobally()) return 'node';\n\n if (await this.isNodeInstalledLocally()) return this.localNode.toString();\n\n throw new Error('node not installed');\n }\n\n async nodePath(): Promise<string | null> {\n if (await this.isNodeInstalledGlobally()) {\n return await which('node', { nothrow: true });\n }\n\n if (await this.isNodeInstalledLocally()) return this.localNode.toString();\n\n return null;\n }\n\n async npmCmd() {\n if (await this.isNpmInstalledGlobally()) return 'npm';\n\n if (await this.isNpmInstalledLocally()) return this.localNpm.toString();\n\n throw new Error('npm not installed');\n }\n\n async npmPath(): Promise<string | null> {\n if (await this.isNpmInstalledGlobally()) {\n return await which('npm', { nothrow: true });\n }\n\n if (await this.isNpmInstalledLocally()) return this.localNpm.toString();\n\n return null;\n }\n\n async installIfNeeded() {\n if (this.alreadyInstalled || (await this.isNodeInstalledGlobally()) || (await this.isNodeInstalledLocally())) {\n this.alreadyInstalled = true;\n return;\n }\n\n return this.install();\n }\n\n async install() {\n const platform = os.platform();\n const arch = os.arch();\n const packagePath = await this.downloadNodePackage(platform, arch);\n const unzipDir = await this.unzipPackage(packagePath);\n\n this.alreadyInstalled = true;\n\n return unzipDir;\n }\n\n async listPackages(): Promise<string[]> {\n const response = await this.client.get(`/dist/latest/`);\n const doc = await cheerio.load(response.data);\n const allFileLinks = doc('a')\n .map((i, el) => doc(el).attr('href'))\n .toArray();\n const archiveFiles = A(allFileLinks).select((filename: string) => filename.match(/.*\\.(gz|zip|xz)/));\n const urls = A(archiveFiles).map((filename: string) => `https://nodejs.org/dist/latest/${filename}`);\n return urls;\n }\n\n // returns the path to the downloaded zip file\n async downloadNodePackage(platform: string, arch: string): Promise<string> {\n // const url = match([platform, arch])\n // .with([\"linux\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-x64.tar.xz\")\n // .with([\"linux\", \"arm\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-armv7l.tar.xz\")\n // .with([\"linux\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-linux-arm64.tar.xz\")\n // .with([\"win32\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-win-x64.zip\")\n // .with([\"win32\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-win-arm64.zip\")\n // .with([\"darwin\", \"x64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-darwin-x64.tar.gz\")\n // .with([\"darwin\", \"arm64\"], () => \"https://nodejs.org/dist/v22.4.1/node-v22.4.1-darwin-arm64.tar.gz\")\n // .otherwise(() => {\n // throw new Error(`Unable to download node for OS/architecture: ${os}/${arch}`);\n // });\n\n const platformInFilename = match(platform)\n .with('linux', () => 'linux')\n .with('win32', () => 'win')\n .with('darwin', () => 'darwin')\n .otherwise(() => 'unknown-platform');\n\n const archInFilename = match(arch)\n .with('x64', () => 'x64')\n .with('x86', () => 'x86')\n .with('arm', () => 'armv7l')\n .with('arm64', () => 'arm64')\n .otherwise(() => 'unknown-arch');\n\n const packages = await this.listPackages();\n const url = A(packages).find((url: string) => url.match(`node-v.*-${platformInFilename}-${archInFilename}`));\n if (V.isAbsent(url)) {\n throw new Error(`Unable to download node for ${os}/${arch} OS/architecture`);\n }\n\n const filename = File.basename(url);\n const path = this.tmpDir.join(filename);\n\n if (path.exists()) return path.toString();\n\n // console.log(`downloading ${url} to ${path}`);\n return await downloadFile(url, path.toString());\n }\n\n // returns the path to the unzipped package directory\n async unzipPackage(packagePath: string): Promise<string> {\n const dir = this.tmpDir.join(NodeRuntime.Name);\n\n if (dir.exists()) return dir.toString();\n\n // console.log(`unzipping ${packagePath} to ${dir}`);\n await unarchive(packagePath, dir.toString());\n return dir.toString();\n }\n\n // cwd is the working directory for the npm install command (this is useful for installing local dependencies of a specific package directory)\n // pkg is the package name to install\n // prefix is the NPM prefix directory (see https://docs.npmjs.com/cli/v11/configuring-npm/folders#prefix-configuration)\n async npmInstall(options: NpmInstallOptions = {}): Promise<CommandResult> {\n const { omitDev = true, cwd, pkg, prefix } = options;\n const args = ['install'];\n if (omitDev) {\n args.push('--omit=dev');\n }\n if (prefix) {\n args.push('--prefix', prefix);\n }\n if (pkg) {\n args.push(pkg);\n }\n // console.log(`DEBUG: npmInstall called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npmUninstall(options: NpmUninstallOptions): Promise<CommandResult> {\n const { pkg, cwd, prefix } = options;\n const args = ['uninstall', pkg];\n if (prefix) {\n args.push('--prefix', prefix);\n }\n // console.log(`DEBUG: npmUninstall called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npmList(options: NpmListOptions = {}): Promise<CommandResult> {\n const { cwd, prefix, depth } = options;\n const args = ['list'];\n if (prefix) {\n args.push('--prefix', prefix);\n }\n if (depth !== undefined) {\n args.push('--depth', depth.toString());\n }\n // console.log(`DEBUG: npmList called with cwd: ${cwd}, prefix: ${prefix}, args: ${args.join(' ')}`);\n return this.npm(args.join(' '), cwd);\n }\n\n async npm(npmArgs: string, cwd?: string): Promise<CommandResult> {\n const npmCmd = await this.npmCmd();\n // console.log(`DEBUG: npm called with cwd: ${cwd}, args: ${npmArgs}`);\n\n return RusPtyCommand.build(`${npmCmd} ${npmArgs}`.trim(), { env: processEnvVars(), cwd }).run();\n }\n\n async node(nodeArgs: string, cwd?: string): Promise<CommandResult> {\n const nodeCmd = await this.nodeCmd();\n\n return RusPtyCommand.build(`${nodeCmd} ${nodeArgs}`.trim(), { env: processEnvVars(), cwd }).run();\n }\n}\n","import type { PathLike } from 'node:fs';\nimport { createWriteStream, unlink } from 'node:fs';\nimport { get } from 'node:https';\n\nexport async function downloadFile(url: string, dest: PathLike): Promise<string> {\n return new Promise((resolve, reject) => {\n const file = createWriteStream(dest, { flags: 'wx' });\n\n const request = get(url, (response) => {\n if (response.statusCode === 200) {\n response.pipe(file);\n } else {\n file.close();\n unlink(dest, () => {}); // Delete temp file\n reject(`Server responded with ${response.statusCode}: ${response.statusMessage}`);\n }\n });\n\n request.on('error', (err) => {\n file.close();\n unlink(dest, () => {}); // Delete temp file\n reject(err.message);\n });\n\n file.on('finish', () => {\n resolve(dest.toString());\n });\n\n file.on('error', (err: NodeJS.ErrnoException) => {\n file.close();\n\n if (err.code === 'EEXIST') {\n reject(new Error('File already exists'));\n } else {\n unlink(dest, () => {}); // Delete temp file\n reject(err.message);\n }\n });\n });\n}\n","import { File } from './flex/file';\nimport decompress from 'decompress';\nimport decompressTarGzPlugin from 'decompress-targz';\nimport decompressZipPlugin from 'decompress-unzip';\nimport { match, P } from 'ts-pattern';\n\n// these are for the tar.xz decompress functionality\nimport decompressTarPlugin from 'decompress-tar';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { getStreamAsBuffer } from 'get-stream';\nimport xzdecompress from 'xz-decompress';\n\nexport async function unarchive(inputPath: string, outputPath: string): Promise<void> {\n const filename = File.basename(inputPath);\n return await match(filename)\n .with(P.string.regex(/.tar.xz$/), () => decompressTarXz(inputPath, outputPath))\n .with(P.string.regex(/.tar.gz$/), () => decompressTarGz(inputPath, outputPath))\n .with(P.string.regex(/.zip$/), () => decompressZip(inputPath, outputPath))\n .otherwise(() => {\n throw new Error(`unable to decompress unknown file type: ${inputPath}`);\n });\n}\n\nexport async function decompressTarGz(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressTarGzPlugin()],\n strip: dropRootDir,\n });\n}\n\nasync function decompressTarXzPlugin(input: Buffer): Promise<decompress.File[]> {\n const type = await fileTypeFromBuffer(input);\n\n if (!type || type.ext !== 'xz') {\n // Not an XZ file, or unknown type; plugin should return an empty array.\n return [];\n }\n\n // Input is a Buffer and is an XZ file.\n const blob = new Blob([input]);\n const webReadableStream = blob.stream(); // blob.stream() is ReadableStream<Uint8Array>\n const xzStream = new xzdecompress.XzReadableStream(webReadableStream);\n\n // decompressTarPlugin() returns a function that expects a Buffer.\n // getStreamAsBuffer(xzStream) converts the decompressed stream back to a Buffer.\n const decompressedBuffer = await getStreamAsBuffer(xzStream);\n return decompressTarPlugin()(decompressedBuffer);\n}\n\nexport async function decompressTarXz(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressTarXzPlugin],\n strip: dropRootDir,\n });\n}\n\nexport async function decompressZip(inputPath: string, outputPath: string, dropRootDir = 1) {\n await decompress(inputPath, outputPath, {\n plugins: [decompressZipPlugin()],\n strip: dropRootDir,\n });\n}\n","import AdmZip from 'adm-zip';\n\nexport async function zipDirectory(sourceDir: string, outputFilePath: string): Promise<string> {\n const zip = new AdmZip();\n zip.addLocalFolder(sourceDir);\n await zip.writeZipPromise(outputFilePath);\n // console.log(`Zip file created: ${outputFilePath}`);\n return outputFilePath;\n}\n\nexport async function unzipDirectory(inputFilePath: string, outputDirectory: string): Promise<string> {\n const zip = new AdmZip(inputFilePath);\n return new Promise((resolve, reject) => {\n zip.extractAllToAsync(outputDirectory, true, false, (error?: Error) => {\n if (error) {\n // console.log(error);\n reject(error);\n } else {\n // console.log(`Extracted to \"${outputDirectory}\" successfully`);\n resolve(outputDirectory);\n }\n });\n });\n}\n","import { createHash } from 'node:crypto';\n\n/**\n * Returns a SHA256 hash using SHA-2 for the given `content`.\n */\nexport function sha256(str: string): string {\n return createHash('sha256').update(str).digest('hex');\n}\n","import { A } from './flex/array';\nimport { M } from './flex/map';\nimport { VP } from './flex/pipe';\nimport { Str, isNumeric, matches } from './flex/string';\nimport { V } from './flex/type';\nimport { match } from 'ts-pattern';\n\nexport class ParamMap {\n /**\n * Parses CLI arguments of the form key:value, only supporting top-level keys.\n * Only the first colon is treated as a key/value separator; all subsequent colons are part of the value.\n * This means nested keys are not supported, but values can contain colons (e.g., URLs, JSON, etc.).\n */\n static parse(cliArguments: string[]): ParamMap {\n const root = new ParamMap();\n\n A(cliArguments).each((arg: string) => {\n const idx = arg.indexOf(':');\n if (idx === -1) {\n root.set([arg], 'true');\n return;\n }\n const key = arg.slice(0, idx);\n const value = arg.slice(idx + 1);\n root.set([key], value);\n });\n\n return root;\n }\n\n public map: Map<string, string | ParamMap>;\n\n constructor() {\n this.map = new Map();\n }\n\n get(keyPath: string): any {\n const keys = keyPath.split(':');\n let node: any = this;\n for (let i = 0; i < keys.length; i++) {\n if (!(node instanceof ParamMap)) return undefined;\n node = node.map.get(keys[i]);\n if (node === undefined) return undefined;\n }\n if (node instanceof ParamMap) {\n return node.toObject();\n }\n return this.stringToJsonObj(node);\n }\n\n set(keyPath: string[] | string, value: string | ParamMap) {\n const keyParts = Array.isArray(keyPath) ? keyPath : keyPath.split(':');\n let node: ParamMap = this;\n for (let i = 0; i < keyParts.length - 1; i++) {\n const key = keyParts[i];\n let nextNode = node.map.get(key);\n if (!(nextNode instanceof ParamMap)) {\n nextNode = new ParamMap();\n node.map.set(key, nextNode);\n }\n node = nextNode;\n }\n const lastKey = keyParts[keyParts.length - 1];\n node.map.set(lastKey, value);\n }\n\n toObject(): Object {\n let obj: any = {};\n M(this.map).each(([k, v]: [string, string | ParamMap]) => {\n obj[k] = v instanceof ParamMap ? v.toObject() : this.stringToJsonObj(v);\n });\n return obj;\n }\n\n private stringToJsonObj(str: string) {\n if (typeof str !== 'string') return str;\n\n // Attempt to treat the whole string as JSON first (object or array)\n const trimmed = str.trim();\n if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Fall through to legacy parsing if JSON.parse fails\n }\n }\n\n // Legacy behaviour (comma-lists, numbers, empties, etc.)\n return match(str)\n .when(matches(/,/), (s: string) => {\n return VP(s.split(','))\n .map((v: string) => v.trim())\n .compact([''])\n .map((v: string) => this.stringToJsonObj(v)).value;\n })\n .when(isNumeric, (s: string) => parseFloat(s))\n .when(\n (s: string) => s.trim() === '',\n () => '',\n )\n .otherwise(() => str);\n }\n}\n","// src/runtime.ts - Re-exporting from the new runtime modules\n\n// From task.model.ts (new source for these core task-related types and class)\nexport {\n Task, // Class\n type ObjectType,\n type TaskParams,\n type RunFnReturnValue,\n type RunFn,\n} from './task.model';\n\n// From runtime-base.ts (exports its own specific types and the task factory)\nexport {\n type TaskContext,\n type TaskPartialFn,\n type TaskFn, // This interface uses Task and RunFn types, which will resolve correctly\n type TaskOptions,\n task, // The factory function, now uses the imported Task class\n type IInvocation,\n Invocation, // Exporting the abstract class\n type IRuntime,\n type LogLevel,\n type FileSystemOperations,\n} from './runtime-base';\n\n// Re-exporting other commonly used types that were previously available from runtime.ts\nexport { type EnvVarObj, CommandResult } from './command';\nexport type { App } from './app'; // If App type was used from runtime context\nexport { Host } from './host'; // If Host was used from runtime context\nexport { ConfigFile } from './config-file'; // If ConfigFile was used from runtime context\nexport * as z from 'zod';\n","export const version = '0.1.44';\n","import { task, type TaskContext, type TaskFn, type TaskParams, type RunFnReturnValue, z } from '../../runtime';\n\nexport interface RunParams<TParams extends TaskParams = TaskParams> {\n taskFn: TaskFn<TParams, RunFnReturnValue>;\n params: TParams;\n}\n\nexport const RunParamsSchema = z.object({\n taskFn: z.custom<TaskFn<TaskParams, RunFnReturnValue>>((value) => typeof value === 'function', {\n message: 'taskFn must be a function',\n }),\n params: z.any(),\n});\n\nexport const RunResultSchema = z.record(z.string(), z.any());\nexport type RunResult = z.infer<typeof RunResultSchema>;\n\nfunction serializeError(value: unknown): Record<string, any> {\n if (value instanceof Error) {\n const err = value as NodeJS.ErrnoException;\n return {\n error: err.message,\n name: err.name,\n code: err.code,\n stack: err.stack,\n };\n }\n\n if (value && typeof value === 'object') {\n return { error: JSON.stringify(value) };\n }\n\n return { error: String(value) };\n}\n\nasync function run(context: TaskContext<RunParams>): Promise<RunResult> {\n const { params, ssh } = context;\n const { taskFn, params: taskParams } = params;\n\n // The callback to context.ssh runs on the remote host, receiving its own TaskContext.\n const remoteResults = await ssh([], async (remoteContext: TaskContext<RunParams>) => {\n const hostIdentifier = remoteContext.host?.alias || remoteContext.host?.shortName || 'unknown_remote_host';\n remoteContext.debug(`[${hostIdentifier}] Connected via SSH.`);\n\n try {\n const result = await remoteContext.run(taskFn(taskParams));\n remoteContext.debug(`[${hostIdentifier}] Remote task result:`, JSON.stringify(result));\n if (result instanceof Error) {\n remoteContext.warn?.(\n `[${hostIdentifier}] Remote task returned an Error instance. Converting to serializable object.`,\n );\n return serializeError(result);\n }\n return result;\n } catch (e: any) {\n remoteContext.debug(`[${hostIdentifier}] Failed to run remote task:`, e.message);\n return serializeError(e);\n }\n });\n\n const normalizedEntries = Object.entries(remoteResults ?? {}).map(([hostAlias, value]) => {\n if (value instanceof Error) {\n return [hostAlias, serializeError(value)];\n }\n return [hostAlias, value];\n });\n\n return Object.fromEntries(normalizedEntries);\n}\n\nexport default task(run, {\n description: 'run a task on all selected hosts',\n inputSchema: RunParamsSchema,\n outputSchema: RunResultSchema,\n});\n","import { promises as fs } from 'fs';\nimport { App } from '../../app';\nimport { Path } from '../../flex/path';\nimport { NodeRuntime } from '../../node-runtime';\nimport filenamify from 'filenamify';\n\nexport interface PackageInfo {\n name: string;\n version?: string;\n description?: string;\n directory: string;\n source?: string;\n path: string; // Absolute path to the installed package directory\n}\n\nexport interface TaskInfo {\n name: string;\n path: string;\n description?: string;\n}\n\nexport interface InstallResult {\n success: boolean;\n packageInfo: PackageInfo;\n installPath: string;\n error?: string;\n}\n\nexport interface RemoveResult {\n success: boolean;\n packageInfo?: PackageInfo;\n error?: string;\n}\n\nexport interface PackageManifest {\n packages: PackageInfo[];\n version: string;\n}\n\nexport class PackageManager {\n private manifestPath: Path;\n private manifest: PackageManifest;\n\n constructor(private app: App) {\n this.manifestPath = this.app.packagesDir().join('manifest.json');\n this.manifest = { packages: [], version: '1.0' };\n }\n\n private async loadManifest(): Promise<void> {\n try {\n if (await this.manifestPath.exists()) {\n const manifestContent = await fs.readFile(this.manifestPath.toString(), 'utf-8');\n this.manifest = JSON.parse(manifestContent);\n } else {\n this.manifest = { packages: [], version: '1.0' };\n }\n } catch (error) {\n console.warn('Failed to load manifest, creating new one:', error);\n this.manifest = { packages: [], version: '1.0' };\n }\n }\n\n private async saveManifest(): Promise<void> {\n await fs.writeFile(this.manifestPath.toString(), JSON.stringify(this.manifest, null, 2));\n }\n\n private isLocalPath(source: string): boolean {\n if (source.startsWith('file:')) {\n return true;\n }\n if (source.startsWith('./') || source.startsWith('../') || source.startsWith('~')) {\n return true;\n }\n if (/[a-zA-Z]:\\\\/.test(source) || source.includes('\\\\')) {\n return true;\n }\n const path = Path.new(source);\n return path.isAbsolute() || path.exists();\n }\n\n // Normalize git URLs to npm-compatible format\n private normalizeSource(source: string): string {\n // Convert http:// to https:// for known git hosts\n if (\n (source.includes('github.com') || source.includes('gitlab.com') || source.includes('bitbucket.org')) &&\n source.startsWith('http://') &&\n !source.startsWith('git@') &&\n !source.startsWith('git+ssh://') &&\n !source.startsWith('git+https://')\n ) {\n return source.replace('http://', 'https://');\n }\n\n // Add https:// to URLs that don't start with a protocol\n if (\n (source.includes('github.com') || source.includes('gitlab.com') || source.includes('bitbucket.org')) &&\n !/^\\w+:\\/\\//.test(source) &&\n !source.startsWith('git@') &&\n !source.startsWith('git+ssh://') &&\n !source.startsWith('git+https://')\n ) {\n return 'https://' + source;\n }\n\n // Convert git URLs to npm-compatible format\n if (source.startsWith('git@')) {\n return source.replace('git@', 'git+ssh://').replace(':', '/');\n }\n\n return source;\n }\n\n async listPackages(): Promise<PackageInfo[]> {\n await this.loadManifest();\n return this.manifest.packages;\n }\n\n async discoverTasks(packagePath: Path): Promise<TaskInfo[]> {\n const tasks: TaskInfo[] = [];\n\n try {\n // Look for TypeScript and JavaScript files that might be tasks\n const entries = await fs.readdir(packagePath.toString(), { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {\n // Skip common non-task files\n if (entry.name === 'index.ts' || entry.name === 'index.js') {\n continue;\n }\n\n const taskPath = packagePath.join(entry.name);\n const taskName = entry.name.replace(/\\.(ts|js)$/, '');\n\n tasks.push({\n name: taskName,\n path: taskPath.toString(),\n });\n }\n }\n\n // Also check for tasks in a 'tasks' or 'src' subdirectory\n const subdirs = ['tasks', 'src'];\n for (const subdir of subdirs) {\n const subdirPath = packagePath.join(subdir);\n if (await subdirPath.exists()) {\n const subEntries = await fs.readdir(subdirPath.toString(), { withFileTypes: true });\n\n for (const entry of subEntries) {\n if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {\n const taskPath = subdirPath.join(entry.name);\n const taskName = entry.name.replace(/\\.(ts|js)$/, '');\n\n tasks.push({\n name: taskName,\n path: taskPath.toString(),\n });\n }\n }\n }\n }\n } catch (error) {\n // Ignore errors during task discovery\n }\n\n // Sort tasks by name before returning\n return tasks.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Enhanced task resolution that supports dotted notation and npm packages\n */\n async resolveTaskPath(\n packageOrTask: string,\n taskName?: string,\n ): Promise<{ packagePath: string; taskPath: string } | null> {\n await this.loadManifest();\n\n // Case 1: Direct task script path\n if (packageOrTask.endsWith('.ts') || packageOrTask.endsWith('.js')) {\n const taskPath = Path.new(packageOrTask);\n if (await taskPath.exists()) {\n return { packagePath: taskPath.parent().toString(), taskPath: taskPath.toString() };\n }\n }\n\n // Case 2: Package name or source URL\n const normalizedSource = this.normalizeSource(packageOrTask);\n\n // Check if this is a package name (not a source URL)\n if (!this.isGitUrl(packageOrTask) && !packageOrTask.includes('/')) {\n // Check for duplicate packages with the same name\n const packagesWithName = this.getPackagesWithName(packageOrTask);\n if (packagesWithName.length > 1) {\n const errorMessage =\n `Multiple packages found with name '${packageOrTask}':\\n` +\n packagesWithName.map((pkg) => ` - ${pkg.source}`).join('\\n') +\n '\\nTo resolve this, use the full source URL instead of just the package name';\n throw new Error(errorMessage);\n }\n }\n\n // Try to find by package name first, then by source\n const packageInfo = this.findPackageByName(packageOrTask) || this.findPackageBySource(normalizedSource);\n if (packageInfo) {\n const packagePath = Path.new(packageInfo.path);\n if (taskName) {\n // Look for specific task\n const resolved = await this.findTaskInPackage(packagePath, taskName);\n if (resolved) {\n return { packagePath: packagePath.toString(), taskPath: resolved.taskPath };\n }\n } else {\n // Look for default task\n const defaultTaskPath = await this.findDefaultTask(packagePath);\n if (defaultTaskPath) {\n return { packagePath: packagePath.toString(), taskPath: defaultTaskPath };\n }\n const discovered = await this.discoverTasks(packagePath);\n if (discovered.length === 1) {\n const onlyTask = discovered[0];\n return { packagePath: packagePath.toString(), taskPath: onlyTask.path };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a package is installed (by name, source, or directory)\n */\n async isPackageInstalled(identifier: string): Promise<boolean> {\n await this.loadManifest();\n const normalizedIdentifier = this.normalizeSource(identifier);\n return this.manifest.packages.some(\n (pkg) =>\n pkg.name === identifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === identifier ||\n pkg.source === normalizedIdentifier,\n );\n }\n\n /**\n * Get package info by any identifier (name, source, or directory)\n */\n async getPackageByIdentifier(identifier: string): Promise<PackageInfo | null> {\n await this.loadManifest();\n const normalizedIdentifier = this.normalizeSource(identifier);\n return (\n this.manifest.packages.find(\n (pkg) =>\n pkg.name === identifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === identifier ||\n pkg.source === normalizedIdentifier,\n ) || null\n );\n }\n\n private async findDefaultTask(packagePath: Path): Promise<string | null> {\n // Look for common default task files\n const defaultFiles = ['index.ts', 'index.js', 'main.ts', 'main.js'];\n\n for (const file of defaultFiles) {\n const filePath = packagePath.join(file);\n if (await filePath.exists()) {\n return filePath.toString();\n }\n }\n\n return null;\n }\n\n /**\n * Check if a string is likely a git URL\n */\n private isGitUrl(str: string): boolean {\n return (\n str.startsWith('git@') ||\n str.startsWith('git+ssh://') ||\n str.startsWith('git+https://') ||\n str.startsWith('https://github.com/') ||\n str.startsWith('https://gitlab.com/') ||\n str.startsWith('https://bitbucket.org/') ||\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('bitbucket.org')\n );\n }\n\n async removePackage(packageIdentifier: string): Promise<RemoveResult> {\n try {\n await this.loadManifest();\n const packageToRemove = this.findPackageToRemove(packageIdentifier);\n if (!packageToRemove) {\n return {\n success: false,\n error: `Package '${packageIdentifier}' not found. Use 'hostctl pkg list' to see installed packages.`,\n };\n }\n await this.removePackageFiles(packageToRemove);\n // Remove from manifest array\n this.manifest.packages = this.manifest.packages.filter((pkg) => pkg !== packageToRemove);\n await this.saveManifest();\n return {\n success: true,\n packageInfo: packageToRemove,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private findPackageToRemove(packageIdentifier: string): PackageInfo | undefined {\n const normalizedIdentifier = this.normalizeSource(packageIdentifier);\n return this.manifest.packages.find(\n (pkg) =>\n pkg.name === packageIdentifier ||\n pkg.name === normalizedIdentifier ||\n pkg.source === packageIdentifier ||\n pkg.source === normalizedIdentifier,\n );\n }\n\n private async removePackageFiles(packageToRemove: PackageInfo): Promise<void> {\n const packagesDir = this.app.packagesDir();\n try {\n const nodeRuntime = new NodeRuntime(this.app.tmpDir);\n await nodeRuntime.npmUninstall({\n pkg: packageToRemove.name,\n prefix: packagesDir.toString(),\n });\n } catch (error) {\n // Ignore errors during uninstall\n console.log(`DEBUG: Error during npm uninstall: ${error}`);\n }\n }\n\n /**\n * Check if a package name already exists in the manifest\n */\n private hasPackageWithName(packageName: string): boolean {\n return this.manifest.packages.some((pkg) => pkg.name === packageName);\n }\n\n /**\n * Get all packages with the same name\n */\n private getPackagesWithName(packageName: string): PackageInfo[] {\n return this.manifest.packages.filter((pkg) => pkg.name === packageName);\n }\n\n /**\n * Find a package by its name\n */\n private findPackageByName(packageName: string): PackageInfo | undefined {\n return this.manifest.packages.find((pkg) => pkg.name === packageName);\n }\n\n /**\n * Find a package by its source\n */\n private findPackageBySource(source: string): PackageInfo | undefined {\n return this.manifest.packages.find((pkg) => pkg.source === source);\n }\n\n /**\n * Find a specific task in a package\n */\n private async findTaskInPackage(packagePath: Path, taskName: string): Promise<{ taskPath: string } | null> {\n const taskFiles = [`${taskName}.ts`, `${taskName}.js`];\n if (taskName.includes('.')) {\n const dottedPath = taskName.replace(/\\./g, '/');\n taskFiles.push(`${dottedPath}.ts`, `${dottedPath}.js`);\n }\n\n // Fallback: look for task files in the package directory\n for (const file of taskFiles) {\n const taskPath = packagePath.join(file);\n if (await taskPath.exists()) {\n return { taskPath: taskPath.toString() };\n }\n }\n\n return null;\n }\n\n async installPackage(source: string): Promise<InstallResult> {\n try {\n await this.loadManifest();\n if (this.isLocalPath(source)) {\n throw new Error(\n `Local directories and files are not installable. Run them directly with 'hostctl run ${source} ...' or publish to npm/git and install that package.`,\n );\n }\n const normalizedSource = this.normalizeSource(source);\n const packagesDir = this.app.packagesDir();\n await fs.mkdir(packagesDir.toString(), { recursive: true });\n const filenamifiedSource = filenamify(normalizedSource, { replacement: '_' });\n const installDir = packagesDir.join(filenamifiedSource);\n\n // Check if already installed\n const existingPackage = this.findPackageBySource(normalizedSource);\n if (existingPackage) {\n console.log(`Package '${existingPackage.name}' is already installed from ${normalizedSource}`);\n return {\n success: true,\n packageInfo: existingPackage,\n installPath: this.app.packagesDir().join(existingPackage.directory).toString(),\n };\n }\n\n // Install via npm\n const installResult = await this.installNpmPackage(normalizedSource, packagesDir, filenamifiedSource);\n\n if (!installResult.success) {\n return installResult;\n }\n\n // Get additional package info\n const packagePath = Path.new(installResult.installPath);\n const packageInfo = await this.getPackageInfo(packagePath, installResult.packageInfo.name);\n const finalPackageInfo: PackageInfo = {\n ...installResult.packageInfo,\n ...(packageInfo || {}),\n source: normalizedSource,\n };\n await this.handleDuplicateNames(finalPackageInfo);\n // Add to manifest array\n this.manifest.packages.push(finalPackageInfo);\n await this.saveManifest();\n return {\n success: true,\n packageInfo: finalPackageInfo,\n installPath: installResult.installPath,\n };\n } catch (error) {\n return this.installErrorResult(\n filenamify(this.normalizeSource(source), { replacement: '_' }),\n this.app.packagesDir().join(filenamify(this.normalizeSource(source), { replacement: '_' })),\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n private async installNpmPackage(source: string, packagesDir: Path, _packageName: string): Promise<InstallResult> {\n // console.log(`DEBUG: Installing npm package from ${source}`);\n await this.ensurePackagesDirHasPackageJson(packagesDir);\n const nodeRuntime = new NodeRuntime(this.app.tmpDir);\n const result = await nodeRuntime.npmInstall({\n pkg: source,\n prefix: packagesDir.toString(),\n });\n if (!result.success) {\n return {\n success: false,\n error: `Failed to install package: ${result.stderr || result.stdout || 'Unknown error'}`,\n packageInfo: {\n name: _packageName,\n directory: _packageName,\n path: packagesDir.join(_packageName).toString(),\n },\n installPath: packagesDir.join(_packageName).toString(),\n };\n }\n // Find the real installed package name and path\n const { path: actualPackagePath, name: realPackageName } = await this.findRealInstalledNpmPackagePath(\n packagesDir,\n source,\n );\n if (!actualPackagePath || !realPackageName) {\n return {\n success: false,\n error: 'Could not find installed npm package directory after install.',\n packageInfo: {\n name: _packageName,\n directory: _packageName,\n path: packagesDir.join(_packageName).toString(),\n },\n installPath: packagesDir.join(_packageName).toString(),\n };\n }\n return {\n success: true,\n packageInfo: {\n name: realPackageName,\n directory: realPackageName,\n path: actualPackagePath.toString(),\n },\n installPath: actualPackagePath.toString(),\n };\n }\n\n private async ensurePackagesDirHasPackageJson(packagesDir: Path): Promise<void> {\n const packageJsonPath = packagesDir.join('package.json');\n if (!(await packageJsonPath.exists())) {\n const packageJson = {\n name: 'hostctl-packages',\n version: '1.0.0',\n description: 'Hostctl package management directory',\n private: true,\n };\n await fs.writeFile(packageJsonPath.toString(), JSON.stringify(packageJson, null, 2));\n }\n }\n\n // Scan node_modules for the real installed package (by name or repo match)\n private async findRealInstalledNpmPackagePath(\n packagesDir: Path,\n source: string,\n ): Promise<{ path: Path | null; name: string | null }> {\n const nodeModulesPath = packagesDir.join('node_modules');\n if (!(await nodeModulesPath.exists())) {\n console.log(`DEBUG: node_modules does not exist at ${nodeModulesPath.toString()}`);\n return { path: null, name: null };\n }\n const entries = await fs.readdir(nodeModulesPath.toString());\n for (const entry of entries) {\n const potentialPackagePath = nodeModulesPath.join(entry);\n if (await potentialPackagePath.isDirectory()) {\n const packageJsonPath = potentialPackagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n // Prefer a repo match, fallback to first package with a repo\n if (\n (packageJson.repository &&\n typeof packageJson.repository.url === 'string' &&\n packageJson.repository.url.includes(source.replace(/^https?:\\/\\//, '').replace(/\\.git$/, ''))) ||\n (packageJson.homepage &&\n packageJson.homepage.includes(source.replace(/^https?:\\/\\//, '').replace(/\\.git$/, '')))\n ) {\n return { path: potentialPackagePath, name: packageJson.name };\n }\n // Fallback: if the source is a git url, match the last segment\n const lastSegment = source\n .split('/')\n .pop()\n ?.replace(/\\.git$/, '');\n if (packageJson.name === lastSegment) {\n return { path: potentialPackagePath, name: packageJson.name };\n }\n } catch {\n // ignore\n }\n }\n }\n }\n // Fallback: just return the first package found\n for (const entry of entries) {\n const potentialPackagePath = nodeModulesPath.join(entry);\n const packageJsonPath = potentialPackagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n try {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return { path: potentialPackagePath, name: packageJson.name };\n } catch {\n // ignore\n }\n }\n }\n return { path: null, name: null };\n }\n\n private async handleDuplicateNames(finalPackageInfo: PackageInfo): Promise<void> {\n const actualPackageName = finalPackageInfo.name;\n if (this.hasPackageWithName(actualPackageName)) {\n const existingPackages = this.getPackagesWithName(actualPackageName);\n console.warn(`⚠️ Warning: Package name '${actualPackageName}' already exists.`);\n console.warn(` Existing packages:`);\n existingPackages.forEach((pkg) => {\n console.warn(` - ${pkg.source} (${pkg.directory})`);\n });\n console.warn(` You will need to use the full source URL to run tasks from this package.`);\n }\n }\n\n private installErrorResult(packageName: string, installDir: Path, error?: string): InstallResult {\n return {\n success: false,\n error: error || 'Failed to install package',\n packageInfo: {\n name: packageName,\n directory: packageName,\n path: installDir.toString(),\n },\n installPath: installDir.toString(),\n };\n }\n\n private async getPackageInfo(packagePath: Path, fallbackName?: string): Promise<PackageInfo | null> {\n try {\n const packageJsonPath = packagePath.join('package.json');\n if (await packageJsonPath.exists()) {\n const packageJsonContent = await fs.readFile(packageJsonPath.toString(), 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return {\n name: packageJson.name || fallbackName || packagePath.basename().toString(),\n version: packageJson.version,\n description: packageJson.description,\n directory: packagePath.basename().toString(),\n path: packagePath.toString(),\n };\n }\n } catch (error) {\n // Ignore errors reading package.json\n }\n return null;\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { TaskRegistry } from './task-registry';\n\ntype PackageJson = {\n main?: string;\n module?: string;\n exports?: unknown;\n};\n\nfunction resolveExportsEntry(exportsField: unknown): string | undefined {\n if (!exportsField) return undefined;\n if (typeof exportsField === 'string') return exportsField;\n if (typeof exportsField !== 'object') return undefined;\n\n const root = (exportsField as Record<string, unknown>)['.'] ?? exportsField;\n if (typeof root === 'string') return root;\n if (typeof root !== 'object' || !root) return undefined;\n\n const rootRecord = root as Record<string, unknown>;\n if (typeof rootRecord.import === 'string') return rootRecord.import;\n if (typeof rootRecord.default === 'string') return rootRecord.default;\n return undefined;\n}\n\nasync function readPackageJson(packagePath: string): Promise<PackageJson | null> {\n const packageJsonPath = path.join(packagePath, 'package.json');\n try {\n const raw = await fs.readFile(packageJsonPath, 'utf8');\n return JSON.parse(raw) as PackageJson;\n } catch {\n return null;\n }\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\nasync function resolvePackageEntries(packagePath: string): Promise<string[]> {\n const pkg = await readPackageJson(packagePath);\n if (!pkg) return [];\n\n const candidates = [\n resolveExportsEntry(pkg.exports),\n pkg.module,\n pkg.main,\n 'src/index.ts',\n 'src/index.js',\n 'src/index.mjs',\n 'src/index.cjs',\n 'index.ts',\n 'index.js',\n 'index.mjs',\n 'index.cjs',\n ].filter((candidate): candidate is string => typeof candidate === 'string' && candidate.length > 0);\n\n const entries: string[] = [];\n const seen = new Set<string>();\n for (const candidate of candidates) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(packagePath, candidate);\n if (seen.has(resolved)) continue;\n seen.add(resolved);\n if (await fileExists(resolved)) {\n entries.push(resolved);\n }\n }\n\n return entries;\n}\n\nfunction isRegistryLike(candidate: unknown): candidate is TaskRegistry {\n return (\n !!candidate &&\n typeof candidate === 'object' &&\n typeof (candidate as TaskRegistry).get === 'function' &&\n typeof (candidate as TaskRegistry).tasks === 'function' &&\n typeof (candidate as TaskRegistry).register === 'function'\n );\n}\n\nexport async function loadRegistryFromPackage(packagePath: string): Promise<TaskRegistry | null> {\n const entries = await resolvePackageEntries(packagePath);\n if (entries.length === 0) {\n return null;\n }\n\n for (const entry of entries) {\n try {\n const mod = await import(pathToFileURL(entry).href);\n const registry = (mod as Record<string, unknown>).registry;\n if (isRegistryLike(registry)) {\n return registry;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n}\n","import { Path } from '../flex/path';\nimport { A } from '../flex/array';\nimport { App } from '../app';\nimport { PackageManager } from '../commands/pkg/package-manager';\nimport { loadRegistryFromPackage } from '../task-registry-loader';\nimport type { TaskFn } from '../runtime-base';\n\nexport type ResolvedTask =\n | { kind: 'script'; scriptRef: string; scriptArgs: string[] }\n | { kind: 'registry'; task: TaskFn; scriptArgs: string[] };\n\n/**\n * Resolves the script reference provided to the `hostctl run` command.\n *\n * This function implements a sophisticated task resolution system that follows a specific precedence order:\n * 1. Built-in core tasks (e.g., `core.file.copy`)\n * 2. Local files or directories on the filesystem\n * 3. Remote packages (npm packages or git repositories)\n *\n * ## Argument Format\n * Accepts a single `pkgTaskArgs` array, which is interpreted as:\n * `[packageRef, scriptRef?, ...scriptArgs]`\n *\n * Where:\n * - `packageRef`: The package reference (core task, local path, or remote package)\n * - `scriptRef`: Optional script/task name within the package\n * - `scriptArgs`: Additional arguments to pass to the script\n *\n * ## Parameter Handling\n * If `scriptRef` contains a colon (`:`), it's treated as a parameter and moved to `scriptArgs`.\n * This allows for flexible parameter passing: `hostctl run package param:value` is equivalent to\n * `hostctl run package param:value`.\n *\n * ## Resolution Precedence\n * 1. **Core Tasks**: `core.*` patterns resolve to built-in tasks in `src/core/`\n * 2. **Local Paths**: Existing files/directories on the filesystem\n * 3. **Remote Packages**: npm packages or git repositories (auto-installed)\n *\n * ## Examples\n * ```bash\n * # Core task\n * hostctl run core.file.copy source:file1 dest:file2\n *\n * # Local directory with default entry point\n * hostctl run ./my-project name:value\n *\n * # Local directory with specific task\n * hostctl run ./my-project hello name:value\n *\n * # Remote npm package\n * hostctl run lodash name:value\n *\n * # Git repository\n * hostctl run https://github.com/user/repo task:name\n * ```\n *\n * @param app - The application instance for configuration and debugging\n * @param pkgTaskArgs - Array of arguments to resolve\n * @returns Promise resolving to script reference and arguments\n * @throws Error if the task cannot be resolved or arguments are invalid\n */\nexport async function resolveTaskPathAndArgs(app: App, pkgTaskArgs: string[]): Promise<ResolvedTask> {\n app.debug('resolveTaskPathAndArgs', pkgTaskArgs);\n\n if (!pkgTaskArgs || pkgTaskArgs.length === 0) {\n throw new Error('No task specified');\n }\n\n // Parse the arguments\n let packageRef: string | null = null;\n let scriptRef: string | undefined = undefined;\n let scriptArgs: string[] = [];\n\n if (pkgTaskArgs.length === 1) {\n // Single argument: could be a file, directory, or package\n packageRef = pkgTaskArgs[0];\n } else if (pkgTaskArgs.length >= 2) {\n packageRef = pkgTaskArgs[0];\n scriptRef = pkgTaskArgs[1];\n scriptArgs = pkgTaskArgs.slice(2);\n }\n\n // If scriptRef contains a colon (parameter syntax), treat it as a scriptArg\n if (scriptRef && scriptRef.includes(':')) {\n scriptArgs = [scriptRef, ...scriptArgs];\n scriptRef = undefined;\n }\n\n // If no packageRef, error\n if (!packageRef) {\n throw new Error('No task specified');\n }\n\n // Case 1: Built-in core tasks (highest precedence)\n const coreTaskResult = await resolveCoreTask(packageRef, scriptRef, scriptArgs);\n if (coreTaskResult) {\n return coreTaskResult;\n }\n\n // Case 2: Local files or directories\n const localTaskResult = await resolveLocalTask(app, packageRef, scriptRef, scriptArgs);\n if (localTaskResult) {\n return localTaskResult;\n }\n if (looksLikeLocalPath(packageRef)) {\n const missingPath = Path.new(packageRef);\n const localReason = missingPath.exists()\n ? `local path is not a supported task entry: ${missingPath.toString()}`\n : `local path not found: ${missingPath.toString()}`;\n throw new Error(\n `Could not resolve task: ${localReason}. Local directories are run directly (no install); double-check the path or publish the package to npm/git.`,\n );\n }\n\n // Case 3: Remote packages (npm packages or git repositories)\n const packageManager = new PackageManager(app);\n const remoteTaskResult = await resolveRemoteTask(app, packageManager, packageRef, scriptRef, scriptArgs);\n if (remoteTaskResult) {\n return remoteTaskResult;\n }\n\n // If we get here, we couldn't resolve the task\n throw new Error(`Could not resolve task: ${packageRef}${scriptRef ? `:${scriptRef}` : ''}`);\n}\n\n/**\n * Resolves built-in core tasks.\n *\n * Core tasks are built-in functionality that follows the pattern `core.*` and\n * are located in the `src/core/` directory. The task path is converted from\n * dot notation to directory structure.\n *\n * Examples:\n * - `core.file.copy` → `src/core/file/copy.ts`\n * - `core.process.list` → `src/core/process/list.ts`\n *\n * @param packageRef - The package reference (must start with 'core.')\n * @param scriptRef - Optional script reference (unused for core tasks)\n * @param scriptArgs - Arguments to pass to the core task\n * @returns Promise resolving to script path and arguments, or null if not a core task\n * @throws Error if the core task file doesn't exist\n */\nasync function resolveCoreTask(\n packageRef: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<ResolvedTask | null> {\n // Check if this is a core task (e.g., core.file.copy)\n const prefixMap: Array<{ prefix: string; buildPath: (tail: string) => string }> = [\n { prefix: 'core.', buildPath: (tail) => `src/core/${tail}.ts` },\n { prefix: 'host.', buildPath: (tail) => `src/core/host/${tail}.ts` },\n ];\n\n for (const entry of prefixMap) {\n if (!packageRef.startsWith(entry.prefix)) {\n continue;\n }\n const tail = packageRef.slice(entry.prefix.length).replace(/\\./g, '/');\n const scriptPath = entry.buildPath(tail);\n\n // Check if the core task file exists\n const taskFile = Path.new(scriptPath);\n if (!taskFile.exists()) {\n throw new Error(`Could not resolve task: Core task script not found (${packageRef}).`);\n }\n\n return { kind: 'script', scriptRef: scriptPath, scriptArgs };\n }\n\n return null;\n}\n\n/**\n * Resolves local files or directories on the filesystem.\n *\n * This function handles local task resolution with the following logic:\n * 1. Skips git URLs and npm package names (handled by remote resolution)\n * 2. Only considers paths that actually exist on the filesystem\n * 3. Handles both directories (with optional task references) and direct file references\n *\n * For directories:\n * - If no scriptRef, looks for default entry points (index.ts, index.js, main.ts, main.js)\n * - If scriptRef provided, resolves using dotted notation or relative paths\n *\n * For files:\n * - Only accepts .ts and .js files\n * - If scriptRef provided, it's prepended to scriptArgs\n *\n * @param app - The application instance\n * @param path - The local filesystem path to resolve\n * @param scriptRef - Optional script/task reference within the path\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments, or null if not a local task\n */\nasync function resolveLocalTask(\n app: App,\n path: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<ResolvedTask | null> {\n // Skip git URLs and npm package names - these should be handled by remote resolution\n if (isGitUrl(path) || isNpmPackageName(path)) {\n return null;\n }\n\n const pathObj = Path.new(path);\n\n // Only consider this a local task if the path actually exists on the filesystem\n // This helps distinguish between local paths and package names that might look similar\n if (!pathObj.exists()) {\n return null;\n }\n\n // Handle directories (local directories only)\n if (pathObj.isDirectory()) {\n const registryTask = await resolveRegistryTask(pathObj.absolute().toString(), scriptRef);\n if (registryTask) {\n return { kind: 'registry', task: registryTask, scriptArgs };\n }\n return await handleDirectory(pathObj, scriptRef, scriptArgs);\n }\n\n // Handle direct file references\n if (pathObj.isFile() && (pathObj.ext() === '.ts' || pathObj.ext() === '.js')) {\n if (scriptRef) {\n A(scriptArgs).prepend(scriptRef);\n }\n return { kind: 'script', scriptRef: pathObj.toString(), scriptArgs };\n }\n\n return null;\n}\n\n/**\n * Checks if a string is likely a git URL.\n *\n * This function uses heuristics to identify various git URL formats:\n * - SSH URLs: `git@github.com:user/repo.git`\n * - HTTPS URLs: `https://github.com/user/repo.git`\n * - Git protocol URLs: `git+https://github.com/user/repo.git`\n * - Common git hosting platforms: GitHub, GitLab, Bitbucket\n *\n * The detection is based on URL patterns and domain names rather than\n * attempting to validate the actual URL format.\n *\n * @param str - The string to check\n * @returns true if the string appears to be a git URL, false otherwise\n */\nfunction isGitUrl(str: string): boolean {\n return (\n str.startsWith('git@') ||\n str.startsWith('git+ssh://') ||\n str.startsWith('git+https://') ||\n str.startsWith('https://github.com/') ||\n str.startsWith('https://gitlab.com/') ||\n str.startsWith('https://bitbucket.org/') ||\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('bitbucket.org')\n );\n}\n\n/**\n * Checks if a string is likely an npm package name.\n *\n * This function uses heuristics to distinguish between npm package names\n * and local filesystem paths. The logic prioritizes avoiding false positives\n * for local paths over catching all possible npm package formats.\n *\n * Rules:\n * - Git URLs are never npm packages\n * - Absolute paths (starting with / or \\) are not npm packages\n * - Paths with backslashes are not npm packages (Windows paths)\n * - Scoped packages (@scope/package) are valid npm packages\n * - Simple package names without slashes are valid npm packages\n *\n * @param str - The string to check\n * @returns true if the string appears to be an npm package name, false otherwise\n */\nfunction isNpmPackageName(str: string): boolean {\n // Simple heuristic for npm package names\n if (isGitUrl(str)) {\n return false;\n }\n\n // Absolute paths are not npm packages\n if (str.startsWith('/') || str.startsWith('\\\\')) {\n return false;\n }\n\n // Relative paths with path separators are not npm packages (unless scoped)\n if (str.includes('\\\\')) {\n return false;\n }\n\n // Allow scoped packages (@scope/package) and regular packages\n if (str.includes('/')) {\n return str.startsWith('@') && str.split('/').length === 2;\n }\n\n // Simple package names\n return true;\n}\n\nfunction looksLikeLocalPath(ref: string): boolean {\n if (ref.startsWith('file:')) {\n return true;\n }\n if (ref === '.' || ref === '..') {\n return true;\n }\n if (ref.startsWith('./') || ref.startsWith('../') || ref.startsWith('~') || ref.startsWith('/')) {\n return true;\n }\n if (/[a-zA-Z]:\\\\/.test(ref) || ref.includes('\\\\')) {\n return true;\n }\n return false;\n}\n\n/**\n * Resolves remote packages (npm packages or git repositories).\n *\n * This function handles remote package resolution by:\n * 1. Checking if the package is already installed\n * 2. Installing the package if not already present (handles both npm and git)\n * 3. Resolving the task path within the installed package\n *\n * The package manager handles the distinction between npm packages and git\n * repositories automatically during installation.\n *\n * @param app - The application instance\n * @param packageManager - The package manager instance for installation and resolution\n * @param packageRef - The remote package reference (npm package name or git URL)\n * @param scriptRef - Optional script/task reference within the package\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments, or null if not a valid remote package\n */\nasync function resolveRemoteTask(\n app: App,\n packageManager: PackageManager,\n packageRef: string,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<ResolvedTask | null> {\n // Check if it's already installed\n const isInstalled = await packageManager.isPackageInstalled(packageRef);\n\n if (!isInstalled) {\n // Try to install it (this handles both git repos and npm packages)\n const installResult = await packageManager.installPackage(packageRef);\n if (!installResult.success) {\n const installError = installResult.error ? ` (${installResult.error})` : '';\n throw new Error(\n `Could not resolve task: failed to install npm/git package '${packageRef}'. Local directories are run directly; otherwise provide a valid npm package name or git URL${installError}.`,\n );\n }\n }\n\n const installed = await packageManager.getPackageByIdentifier(packageRef);\n if (!installed) {\n throw new Error(`Could not resolve task: installed package '${packageRef}' not found in manifest.`);\n }\n\n const registryTask = await resolveRegistryTask(installed.path, scriptRef);\n if (registryTask) {\n return { kind: 'registry', task: registryTask, scriptArgs };\n }\n\n // Now try to resolve the task\n const result = await packageManager.resolveTaskPath(packageRef, scriptRef);\n\n if (result) {\n return { kind: 'script', scriptRef: result.taskPath, scriptArgs };\n }\n\n throw new Error(\n `Could not resolve task: installed package '${packageRef}' but could not find ${scriptRef ? `task '${scriptRef}'` : 'a default task'}.`,\n );\n}\n\n/**\n * Handles directory resolution with optional dotted task notation.\n *\n * This function resolves task references within a directory using the following logic:\n *\n * If scriptRef is provided:\n * 1. Treats dots as directory separators (e.g., `a.b.c` → `a/b/c.{ts,js}`)\n * 2. Prefers .ts files over .js files when both exist\n * 3. Falls back to treating scriptRef as a relative path if dotted notation fails\n *\n * If no scriptRef is provided:\n * 1. Looks for default entry points in order: index.ts, index.js, main.ts, main.js\n * 2. Throws an error if no default entry point is found\n *\n * Examples:\n * - `dir/` + `task` → `dir/task.ts` (or `task.js`)\n * - `dir/` + `nested.task` → `dir/nested/task.ts` (or `task.js`)\n * - `dir/` + `none` → `dir/index.ts` (default entry point)\n *\n * @param dirPath - The directory path to resolve within\n * @param scriptRef - Optional script reference using dotted notation\n * @param scriptArgs - Arguments to pass to the script\n * @returns Promise resolving to script path and arguments\n * @throws Error if no default entry point is found when scriptRef is not provided\n */\nasync function handleDirectory(\n dirPath: Path,\n scriptRef: string | undefined,\n scriptArgs: string[],\n): Promise<ResolvedTask> {\n if (scriptRef) {\n // Try to resolve dotted task notation\n const taskParts = scriptRef.split('.');\n const taskFileName = taskParts.pop()!;\n const taskDir = taskParts.length > 0 ? taskParts.join('/') : '';\n\n // Try .ts first, then .js\n const tsPath = taskDir ? dirPath.join(taskDir, `${taskFileName}.ts`) : dirPath.join(`${taskFileName}.ts`);\n const jsPath = taskDir ? dirPath.join(taskDir, `${taskFileName}.js`) : dirPath.join(`${taskFileName}.js`);\n\n if (tsPath.exists()) {\n return { kind: 'script', scriptRef: tsPath.toString(), scriptArgs };\n }\n\n if (jsPath.exists()) {\n return { kind: 'script', scriptRef: jsPath.toString(), scriptArgs };\n }\n\n // Fallback to treating scriptRef as a relative path\n const resolvedPath = dirPath.resolve(scriptRef);\n return { kind: 'script', scriptRef: resolvedPath.toString(), scriptArgs };\n }\n\n // Look for default entry point\n const defaultFiles = ['index.ts', 'index.js', 'main.ts', 'main.js'];\n for (const file of defaultFiles) {\n const filePath = dirPath.join(file);\n if (filePath.exists()) {\n return { kind: 'script', scriptRef: filePath.toString(), scriptArgs };\n }\n }\n\n throw new Error(`No default entry point found in directory: ${dirPath}`);\n}\n\nasync function resolveRegistryTask(packagePath: string, taskName: string | undefined): Promise<TaskFn | null> {\n const registry = await loadRegistryFromPackage(packagePath);\n if (!registry) return null;\n\n if (taskName) {\n const task = registry.get(taskName);\n if (!task) {\n const names = registryNames(registry);\n const hint = names.length ? ` Available tasks: ${names.join(', ')}` : '';\n throw new Error(`Task '${taskName}' not found in registry.${hint}`);\n }\n if (task.task) {\n task.task.name = taskName;\n }\n return task;\n }\n\n const tasks = registry.tasks();\n if (tasks.length === 1) {\n const [name, task] = tasks[0];\n if (task.task) {\n task.task.name = name;\n }\n return task;\n }\n\n const names = registryNames(registry);\n const hint = names.length ? `: ${names.join(', ')}` : '';\n throw new Error(`Package exports ${registrySize(registry)} tasks; specify one${hint}.`);\n}\n\nfunction registryNames(registry: { names?: () => string[]; tasks: () => Array<[string, TaskFn]> }): string[] {\n if (typeof registry.names === 'function') {\n return registry.names();\n }\n return registry.tasks().map(([name]) => name);\n}\n\nfunction registrySize(registry: { size?: () => number; tasks: () => Array<[string, TaskFn]> }): number {\n if (typeof registry.size === 'function') {\n return registry.size();\n }\n return registry.tasks().length;\n}\n","import { promises as fs } from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nfunction expandTildePath(input: string): string {\n if (!input.startsWith('~')) return input;\n if (input === '~') return os.homedir();\n if (input.startsWith('~/') || input.startsWith('~\\\\')) {\n return path.join(os.homedir(), input.slice(2));\n }\n return input;\n}\n\nconst packageJsonTsTemplate = (packageName: string) => `{\n \"name\": \"${packageName}\",\n \"version\": \"0.1.0\",\n \"description\": \"hostctl task package\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\"dist\", \"src\", \"README.md\", \"LICENSE\"],\n \"scripts\": {\n \"build\": \"tsc -p tsconfig.json\"\n },\n \"keywords\": [\"hostctl\"],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"hostctl\": \"^0.1.42\",\n \"zod\": \"^4.1.13\"\n },\n \"devDependencies\": {\n \"typescript\": \"^5.8.3\",\n \"@types/node\": \"^24.0.0\"\n },\n \"engines\": {\n \"node\": \">=24\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n`;\n\nconst packageJsonJsTemplate = (packageName: string) => `{\n \"name\": \"${packageName}\",\n \"version\": \"0.1.0\",\n \"description\": \"hostctl task package\",\n \"type\": \"module\",\n \"main\": \"./src/index.js\",\n \"module\": \"./src/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./src/index.js\",\n \"default\": \"./src/index.js\"\n }\n },\n \"files\": [\"src\", \"README.md\", \"LICENSE\"],\n \"scripts\": {},\n \"keywords\": [\"hostctl\"],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"hostctl\": \"^0.1.42\",\n \"zod\": \"^4.1.13\"\n },\n \"engines\": {\n \"node\": \">=24\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n`;\n\nconst tsconfigTemplate = `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"rootDir\": \"src\",\n \"outDir\": \"dist\",\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true\n },\n \"include\": [\"src/**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n`;\n\nfunction registryPrefixFromPackageName(packageName: string): string {\n const withoutScope = packageName.replace(/^@[^/]+\\//, '');\n const withoutPrefix = withoutScope.replace(/^hostctl[-_]?/, '');\n const normalized = withoutPrefix.replace(/[^a-zA-Z0-9]+/g, '.').replace(/^\\.|\\.$/g, '');\n return normalized || 'example';\n}\n\nconst indexTsTemplate = (registryPrefix: string) => `import { createRegistry } from './registry.js';\nimport hello from './tasks/hello.js';\n\nexport { hello };\n\nexport const registry = createRegistry().register('${registryPrefix}.hello', hello);\n`;\n\nconst indexJsTemplate = (registryPrefix: string) => `import { createRegistry } from './registry.js';\nimport hello from './tasks/hello.js';\n\nexport { hello };\n\nexport const registry = createRegistry().register('${registryPrefix}.hello', hello);\n`;\n\nconst registryTsTemplate = `import type { TaskFn } from 'hostctl';\n\nexport type TaskRegistry = {\n register: (name: string, task: TaskFn) => TaskRegistry;\n get: (name: string) => TaskFn | undefined;\n tasks: () => Array<[string, TaskFn]>;\n has: (name: string) => boolean;\n names: () => string[];\n size: () => number;\n};\n\nfunction isTaskFnLike(candidate: unknown): candidate is TaskFn {\n return (\n typeof candidate === 'function' &&\n !!candidate &&\n 'task' in (candidate as Record<string, unknown>) &&\n typeof (candidate as { task?: unknown }).task === 'object'\n );\n}\n\nexport function createRegistry(): TaskRegistry {\n const entries = new Map<string, TaskFn>();\n\n const registry: TaskRegistry = {\n register(name: string, task: TaskFn) {\n if (!name || typeof name !== 'string') {\n throw new Error('Registry task name must be a non-empty string.');\n }\n if (!isTaskFnLike(task)) {\n throw new Error(\\`Registry task '\\${name}' must be a TaskFn.\\`);\n }\n if (entries.has(name)) {\n throw new Error(\\`Registry already has a task named '\\${name}'.\\`);\n }\n if (task.task) {\n task.task.name = name;\n }\n entries.set(name, task);\n return registry;\n },\n get(name: string) {\n return entries.get(name);\n },\n tasks() {\n return Array.from(entries.entries()).sort(([a], [b]) => a.localeCompare(b));\n },\n has(name: string) {\n return entries.has(name);\n },\n names() {\n return Array.from(entries.keys()).sort((a, b) => a.localeCompare(b));\n },\n size() {\n return entries.size;\n },\n };\n\n return registry;\n}\n`;\n\nconst registryJsTemplate = `export function createRegistry() {\n const entries = new Map();\n\n const registry = {\n register(name, task) {\n if (!name || typeof name !== 'string') {\n throw new Error('Registry task name must be a non-empty string.');\n }\n if (!task || typeof task !== 'function' || !task.task) {\n throw new Error(\\`Registry task '\\${name}' must be a TaskFn.\\`);\n }\n if (entries.has(name)) {\n throw new Error(\\`Registry already has a task named '\\${name}'.\\`);\n }\n if (task.task) {\n task.task.name = name;\n }\n entries.set(name, task);\n return registry;\n },\n get(name) {\n return entries.get(name);\n },\n tasks() {\n return Array.from(entries.entries()).sort(([a], [b]) => a.localeCompare(b));\n },\n has(name) {\n return entries.has(name);\n },\n names() {\n return Array.from(entries.keys()).sort((a, b) => a.localeCompare(b));\n },\n size() {\n return entries.size;\n },\n };\n\n return registry;\n}\n`;\n\nconst taskWrapperTsTemplate = `import { task as baseTask, type RunFn, type RunFnReturnValue, type TaskFn, type TaskOptions, type TaskParams } from 'hostctl';\nimport type { ZodTypeAny } from 'zod';\n\nexport type TaskOptionsWithSchema = TaskOptions & {\n inputSchema?: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n};\n\nexport function task<TParams extends TaskParams, TReturn extends RunFnReturnValue>(\n runFn: RunFn<TParams, TReturn>,\n options?: TaskOptionsWithSchema,\n): TaskFn<TParams, TReturn> {\n const taskFn = baseTask(runFn, options as TaskOptions);\n if (options?.inputSchema) {\n (taskFn.task as any).inputSchema = options.inputSchema;\n }\n if (options?.outputSchema) {\n (taskFn.task as any).outputSchema = options.outputSchema;\n }\n return taskFn;\n}\n`;\n\nconst taskWrapperJsTemplate = `import { task as baseTask } from 'hostctl';\n\nexport function task(runFn, options) {\n const taskFn = baseTask(runFn, options);\n if (options?.inputSchema) {\n taskFn.task.inputSchema = options.inputSchema;\n }\n if (options?.outputSchema) {\n taskFn.task.outputSchema = options.outputSchema;\n }\n return taskFn;\n}\n`;\n\nconst sampleTaskTsTemplate = `import { task, type TaskContext } from '../task.js';\nimport { z } from 'zod';\n\nconst HelloInputSchema = z.object({\n name: z.string().optional(),\n excited: z.boolean().optional(),\n});\n\ntype HelloParams = z.infer<typeof HelloInputSchema>;\n\nconst HelloOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n});\n\ntype HelloResult = z.infer<typeof HelloOutputSchema>;\n\nasync function run(context: TaskContext<HelloParams>): Promise<HelloResult> {\n const { params, info } = context;\n const name = params.name ?? 'world';\n const suffix = params.excited ? '!' : '.';\n const message = \\`Hello, \\${name}\\${suffix}\\`;\n\n info(message);\n return { success: true, message };\n}\n\nexport default task(run, {\n name: 'hello',\n description: 'Prints a greeting.',\n inputSchema: HelloInputSchema,\n outputSchema: HelloOutputSchema,\n});\n`;\n\nconst sampleTaskJsTemplate = `import { task } from '../task.js';\nimport { z } from 'zod';\n\nconst HelloInputSchema = z.object({\n name: z.string().optional(),\n excited: z.boolean().optional(),\n});\n\nconst HelloOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n});\n\nasync function run(context) {\n const { params, info } = context;\n const name = params.name ?? 'world';\n const suffix = params.excited ? '!' : '.';\n const message = \\`Hello, \\${name}\\${suffix}\\`;\n\n info(message);\n return { success: true, message };\n}\n\nexport default task(run, {\n name: 'hello',\n description: 'Prints a greeting.',\n inputSchema: HelloInputSchema,\n outputSchema: HelloOutputSchema,\n});\n`;\n\nconst readmeTemplate = (packageName: string, registryPrefix: string, usesBuild: boolean) => `# ${packageName}\n\nThis is a hostctl task package.\n\n## Quick start\n\n\\`\\`\\`bash\nnpm install\n${usesBuild ? 'npm run build\\n' : ''}hostctl tasks .\nhostctl run . ${registryPrefix}.hello name:Hostctl excited:true\n\\`\\`\\`\n\n## Conventions\n\n- Tasks live under \\`src/\\` and export a default \\`task(...)\\`.\n- \\`src/index.(ts|js)\\` re-exports tasks and publishes a registry for discovery.\n- Task names are unqualified; the registry assigns qualified names.\n- Schema helpers come from \\`zod\\` and are attached to tasks for discovery.\n\n## Publish\n\n\\`\\`\\`bash\nnpm login\n${usesBuild ? 'npm run build\\n' : ''}npm publish --access public\n\\`\\`\\`\n\nThen run from the registry:\n\n\\`\\`\\`bash\nnpx hostctl run ${packageName} ${registryPrefix}.hello name:Hostctl\n\\`\\`\\`\n\n## About\n\nThis package was scaffolded by \\`hostctl pkg create\\`. See\n\\`docs/task-package-authoring.md\\` in the hostctl repository for full guidance.\n`;\n\nconst gitignoreTemplate = `node_modules/\ndist/\n*.log\n.DS_Store\n.env\n`;\n\nexport async function createPackage(packageName: string, options: { lang: 'typescript' | 'javascript' }) {\n const resolvedName = expandTildePath(packageName);\n const packageDir = path.isAbsolute(resolvedName) ? resolvedName : path.join(process.cwd(), resolvedName);\n const packageSlug = path.basename(resolvedName);\n const packageJsonName = packageName.startsWith('@') ? packageName : packageSlug;\n const registryPrefix = registryPrefixFromPackageName(packageSlug);\n await fs.mkdir(packageDir, { recursive: true });\n\n if (options.lang === 'typescript') {\n await fs.writeFile(path.join(packageDir, 'package.json'), packageJsonTsTemplate(packageJsonName));\n await fs.writeFile(path.join(packageDir, 'tsconfig.json'), tsconfigTemplate);\n await fs.mkdir(path.join(packageDir, 'src', 'tasks'), { recursive: true });\n await fs.writeFile(path.join(packageDir, 'src', 'index.ts'), indexTsTemplate(registryPrefix));\n await fs.writeFile(path.join(packageDir, 'src', 'registry.ts'), registryTsTemplate);\n await fs.writeFile(path.join(packageDir, 'src', 'task.ts'), taskWrapperTsTemplate);\n await fs.writeFile(path.join(packageDir, 'src', 'tasks', 'hello.ts'), sampleTaskTsTemplate);\n await fs.writeFile(path.join(packageDir, 'README.md'), readmeTemplate(packageJsonName, registryPrefix, true));\n await fs.writeFile(path.join(packageDir, '.gitignore'), gitignoreTemplate);\n } else {\n await fs.writeFile(path.join(packageDir, 'package.json'), packageJsonJsTemplate(packageJsonName));\n await fs.mkdir(path.join(packageDir, 'src', 'tasks'), { recursive: true });\n await fs.writeFile(path.join(packageDir, 'src', 'index.js'), indexJsTemplate(registryPrefix));\n await fs.writeFile(path.join(packageDir, 'src', 'registry.js'), registryJsTemplate);\n await fs.writeFile(path.join(packageDir, 'src', 'task.js'), taskWrapperJsTemplate);\n await fs.writeFile(path.join(packageDir, 'src', 'tasks', 'hello.js'), sampleTaskJsTemplate);\n await fs.writeFile(path.join(packageDir, 'README.md'), readmeTemplate(packageJsonName, registryPrefix, false));\n await fs.writeFile(path.join(packageDir, '.gitignore'), gitignoreTemplate);\n }\n\n console.log(`Created new hostctl package '${resolvedName}' at ${packageDir}`);\n console.log(`\\nNext steps:`);\n console.log(`1. cd ${packageDir}`);\n console.log(`2. npm install`);\n let step = 3;\n if (options.lang === 'typescript') {\n console.log(`${step}. Edit src/index.ts and src/tasks/hello.ts to implement your tasks`);\n step += 1;\n console.log(`${step}. npm run build`);\n step += 1;\n } else {\n console.log(`${step}. Edit src/index.js and src/tasks/hello.js to implement your tasks`);\n step += 1;\n }\n console.log(`${step}. Test your package with: hostctl tasks .`);\n step += 1;\n console.log(`${step}. Run it with: hostctl run . ${registryPrefix}.hello`);\n console.log(`\\nNote: The package includes 'hostctl' as a dependency for local development.`);\n console.log(`For production, you may want to add it as a peer dependency instead.`);\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\n\nexport async function installPackage(source: string, app: App) {\n const packageManager = new PackageManager(app);\n const result = await packageManager.installPackage(source);\n\n if (result.success) {\n console.log(`Installed package '${result.packageInfo.name}' from ${source} to ${result.installPath}`);\n } else {\n console.error(`Failed to install package from ${source}: ${result.error}`);\n throw new Error(result.error);\n }\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\nimport chalk from 'chalk';\n\nexport async function listPackages(app: App): Promise<void> {\n const packageManager = new PackageManager(app);\n\n try {\n const packages = await packageManager.listPackages();\n\n if (packages.length === 0) {\n console.log('No packages installed.');\n return;\n }\n\n // Group packages by name to detect duplicates\n const packagesByName = new Map<string, typeof packages>();\n packages.forEach((pkg) => {\n if (!packagesByName.has(pkg.name)) {\n packagesByName.set(pkg.name, []);\n }\n packagesByName.get(pkg.name)!.push(pkg);\n });\n\n // Display the packages\n console.log(`Found ${packages.length} package(s):\\n`);\n\n packages.forEach((pkg) => {\n const packagesWithSameName = packagesByName.get(pkg.name)!;\n const hasDuplicates = packagesWithSameName.length > 1;\n\n let output = `• ${pkg.name}`;\n if (pkg.version) {\n output += ` (v${pkg.version})`;\n }\n if (pkg.description) {\n output += ` - ${pkg.description}`;\n }\n\n // Color the package name if it has duplicates\n if (hasDuplicates) {\n output = chalk.yellow(output);\n output += chalk.yellow(' ⚠️ (duplicate name)');\n }\n\n // Show source URL if available\n if (pkg.source) {\n if (pkg.source.startsWith('http') || pkg.source.startsWith('git@')) {\n // Git repository\n output += `\\n 📦 Source: ${pkg.source}`;\n } else if (!pkg.source.startsWith('.') && !pkg.source.startsWith('/')) {\n // NPM package\n output += `\\n 📦 Source: https://www.npmjs.com/package/${pkg.source}`;\n } else {\n // Local directory\n output += `\\n 📦 Source: ${pkg.source}`;\n }\n }\n\n console.log(output);\n\n console.log(` └─ (run \"hostctl tasks ${pkg.name}\" to list tasks)`);\n console.log('');\n });\n\n // Show warning for duplicate names\n const duplicateNames = Array.from(packagesByName.entries())\n .filter(([_, pkgs]) => pkgs.length > 1)\n .map(([name, _]) => name);\n\n if (duplicateNames.length > 0) {\n console.log(chalk.yellow('⚠️ Warning: The following package names have duplicates:'));\n duplicateNames.forEach((name) => {\n console.log(chalk.yellow(` - ${name}`));\n });\n console.log(chalk.yellow(' Use the full source URL to run tasks from these packages.'));\n console.log('');\n }\n } catch (error) {\n console.error('Error listing packages:', error);\n throw error;\n }\n}\n","import { App } from '../../app';\nimport { PackageManager } from './package-manager';\n\nexport async function removePackage(packageIdentifier: string, app: App): Promise<void> {\n const packageManager = new PackageManager(app);\n const result = await packageManager.removePackage(packageIdentifier);\n\n if (result.success && result.packageInfo) {\n console.log(`Successfully removed package '${result.packageInfo.name}' (${result.packageInfo.directory})`);\n } else {\n console.error(`Failed to remove package: ${result.error}`);\n return;\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { glob } from 'glob';\nimport type { ZodTypeAny } from 'zod';\nimport { Task } from './task.model';\nimport { loadRegistryFromPackage } from './task-registry-loader';\nimport type { TaskFn } from './runtime-base';\n\nexport type TaskMeta = {\n name: string;\n description?: string;\n modulePath?: string;\n package: {\n name?: string;\n version?: string;\n path: string;\n };\n inputSchema?: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n schemaSource: 'present' | 'absent' | 'unknown';\n};\n\nexport type CollectTaskMetaOptions = {\n includeSchemas?: boolean;\n cache?: boolean;\n ignore?: string[];\n};\n\nconst metaCache = new Map<string, TaskMeta[]>();\n\nasync function readPackageJson(pkgPath: string): Promise<{ name?: string; version?: string }> {\n try {\n const pkgJson = await fs.readFile(path.join(pkgPath, 'package.json'), 'utf8');\n const parsed = JSON.parse(pkgJson);\n return { name: parsed.name, version: parsed.version };\n } catch {\n return {};\n }\n}\n\nfunction cacheKey(packagePath: string, includeSchemas: boolean): string {\n return `${packagePath}::schemas=${includeSchemas ? '1' : '0'}`;\n}\n\nfunction deriveNameFromPath(filePath: string, pkgPath: string): string {\n const relative = path.relative(pkgPath, filePath);\n const withoutExt = relative.replace(/\\.[^.]+$/, '');\n return withoutExt.replace(new RegExp(`\\\\${path.sep}`, 'g'), '.');\n}\n\nfunction isTaskInstanceLike(candidate: unknown): candidate is Task {\n return (\n !!candidate &&\n typeof candidate === 'object' &&\n 'runFn' in (candidate as Record<string, unknown>) &&\n typeof (candidate as { runFn?: unknown }).runFn === 'function'\n );\n}\n\nfunction resolveTaskInstance(candidate: unknown): Task | undefined {\n if (!candidate) return undefined;\n if (candidate instanceof Task) {\n return candidate;\n }\n if (isTaskInstanceLike(candidate)) {\n return candidate as Task;\n }\n if (typeof candidate === 'function') {\n const taskInstance = (candidate as { task?: unknown }).task;\n if (taskInstance instanceof Task || isTaskInstanceLike(taskInstance)) {\n return taskInstance as Task;\n }\n }\n return undefined;\n}\n\nfunction isTaskFnLike(candidate: unknown): candidate is TaskFn {\n if (typeof candidate !== 'function') {\n return false;\n }\n const task = (candidate as { task?: unknown }).task;\n return typeof task === 'object' && task !== null;\n}\n\nfunction buildMetaFromTaskFn(\n taskName: string,\n taskFn: TaskFn,\n packagePath: string,\n pkgInfo: { name?: string; version?: string },\n): TaskMeta {\n const taskInstance = taskFn.task;\n return {\n name: taskName,\n description: taskInstance.description,\n modulePath: undefined,\n package: { ...pkgInfo, path: packagePath },\n inputSchema: taskInstance.inputSchema,\n outputSchema: taskInstance.outputSchema,\n schemaSource: taskInstance.inputSchema || taskInstance.outputSchema ? 'present' : 'absent',\n };\n}\n\nfunction buildMetaFromTaskInstance(\n taskName: string,\n taskInstance: Task,\n packagePath: string,\n pkgInfo: { name?: string; version?: string },\n): TaskMeta {\n return {\n name: taskName,\n description: taskInstance.description,\n modulePath: taskInstance.taskModuleAbsolutePath ?? packagePath,\n package: { ...pkgInfo, path: packagePath },\n inputSchema: taskInstance.inputSchema,\n outputSchema: taskInstance.outputSchema,\n schemaSource: taskInstance.inputSchema || taskInstance.outputSchema ? 'present' : 'absent',\n };\n}\n\nexport async function collectTaskMeta(packagePath: string, opts: CollectTaskMetaOptions = {}): Promise<TaskMeta[]> {\n const absPackagePath = path.resolve(packagePath);\n const includeSchemas = opts.includeSchemas ?? false;\n const cacheId = cacheKey(absPackagePath, includeSchemas);\n if (opts.cache !== false && metaCache.has(cacheId)) {\n return metaCache.get(cacheId)!;\n }\n\n const pkgInfo = await readPackageJson(absPackagePath);\n const registry = await loadRegistryFromPackage(absPackagePath);\n if (registry) {\n const metas: TaskMeta[] = [];\n for (const [name, taskFn] of registry.tasks()) {\n if (!isTaskFnLike(taskFn)) {\n continue;\n }\n metas.push(buildMetaFromTaskFn(name, taskFn, absPackagePath, pkgInfo));\n }\n\n metas.sort((a, b) => a.name.localeCompare(b.name));\n if (opts.cache !== false) {\n metaCache.set(cacheId, metas);\n }\n return metas;\n }\n\n const ignore = opts.ignore ?? [];\n const candidates = await glob('**/*.{ts,js,mjs,cjs}', {\n cwd: absPackagePath,\n absolute: true,\n nodir: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/coverage/**', '**/.turbo/**', ...ignore],\n });\n\n const metas: TaskMeta[] = [];\n const seenTasks = new Set<Task>();\n const seenKeys = new Set<string>();\n for (const file of candidates) {\n try {\n const mod = await import(pathToFileURL(file).href);\n const exports = Object.entries(mod ?? {});\n const taskExports = exports\n .map(([key, exported]) => ({ key, task: resolveTaskInstance(exported) }))\n .filter((entry) => entry.task);\n\n const defaultTask = resolveTaskInstance(mod.default);\n if (!defaultTask) {\n if (taskExports.length > 0) {\n const namedTasks = taskExports.filter((entry) => entry.key !== 'default').map((entry) => entry.key);\n const hint = namedTasks.length ? ` Named exports: ${namedTasks.join(', ')}.` : '';\n console.warn(`Task module ${file} has task exports but no default task.${hint}`);\n }\n continue;\n }\n\n const namedTaskExports = taskExports.filter((entry) => entry.key !== 'default');\n if (namedTaskExports.length > 0) {\n const names = namedTaskExports.map((entry) => entry.key).join(', ');\n console.warn(`Task module ${file} exports multiple tasks (${names}). Only the default export is used.`);\n }\n\n if (seenTasks.has(defaultTask)) {\n continue;\n }\n\n const taskFile = defaultTask.taskModuleAbsolutePath ?? file;\n if (seenKeys.has(taskFile)) {\n continue;\n }\n\n seenTasks.add(defaultTask);\n seenKeys.add(taskFile);\n\n metas.push(\n buildMetaFromTaskInstance(deriveNameFromPath(taskFile, absPackagePath), defaultTask, absPackagePath, pkgInfo),\n );\n } catch (err) {\n // Ignore modules that fail to load; enumeration should be best-effort.\n continue;\n }\n }\n\n metas.sort((a, b) => a.name.localeCompare(b.name));\n if (opts.cache !== false) {\n metaCache.set(cacheId, metas);\n }\n return metas;\n}\n","import type { Secret } from '../config-file';\nimport type { ConfigProvider, HostInput, SecretInput, RecipientGroupInput } from '../config-provider';\n\ntype MemoryConfigProviderOptions = {\n hosts?: HostInput[];\n secrets?: SecretInput[];\n ids?: RecipientGroupInput[];\n secretResolver?: (name: string) => Promise<string | undefined>;\n};\n\nexport class MemoryConfigProvider implements ConfigProvider {\n private hostsData: HostInput[];\n private secretsData: SecretInput[];\n private idsData: RecipientGroupInput[];\n private resolver?: MemoryConfigProviderOptions['secretResolver'];\n\n constructor(opts: MemoryConfigProviderOptions = {}) {\n this.hostsData = opts.hosts ?? [];\n this.secretsData = opts.secrets ?? [];\n this.idsData = opts.ids ?? [];\n this.resolver = opts.secretResolver;\n }\n\n async hosts(): Promise<HostInput[]> {\n return this.hostsData;\n }\n\n async secrets(): Promise<SecretInput[]> {\n return this.secretsData;\n }\n\n async ids(): Promise<RecipientGroupInput[]> {\n return this.idsData;\n }\n\n async getSecret(name: string): Promise<Secret | string | undefined> {\n const direct = this.secretsData.find((s) => s.name === name);\n if (direct) {\n return direct.value;\n }\n if (this.resolver) {\n return this.resolver(name);\n }\n return undefined;\n }\n\n async getRecipientGroups(idRefs: string[]) {\n const groups = this.idsData.filter((g) => idRefs.includes(g.name));\n return groups.map((g) => ({ name: g.name, recipients: g.recipients ?? [], groups: g.groups ?? [] }));\n }\n}\n","#!/usr/bin/env -S npx tsx\n\n// #!/usr/bin/env node\n// #!/usr/bin/env -S npx tsx\n// #!/usr/bin/env -S node --import=tsx/esm\n\nimport { Cli } from '../cli';\n\nconst cli = new Cli();\ncli.program.parseAsync(process.argv).catch((error) => {\n // Minimal top-level error handling for the binary,\n // more detailed errors should be handled within Cli/App.\n console.error('Unhandled error in hostctl binary:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["process","path","process","fs","homedir","fs","os","path","globSync","each","map","select","each","keys","map","select","values","isEmpty","matches","path","compact","each","isEmpty","map","values","select","A","each","isEmpty","map","A","process","readFile","existsSync","readFileSync","win32","posix","path","existsSync","win32","posix","readFileSync","readFile","path","process","fs","path","fs","path","identity","fs","SecretValue","Secret","A","ConfigFile","path","os","globSync","keys","path","ConfigFile","yaml","matches","util","chalk","Handlebars","Mutex","A","Mutex","Handlebars","errnoError","Handlebars","command","fs","StringBuilder","StringBuilder","chalk","Handlebars","path","chalk","ConfigFile","os","axios","match","match","P","axios","platform","os","A","match","url","path","match","A","keys","Mutex","match","fs","fs","path","fs","path","path","A","task","names","hint","Mutex","task","App","provider","process","homedir","chalk","A","cmd","match","isError","result","identity","invocation","path","fs","os","path","chalk","fs","path","pathToFileURL","glob","readPackageJson","fs","path","task","metas","glob","pathToFileURL","isError","process","App","path","summary"]}
|