moneyos 0.6.0 → 0.6.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/core/backup-file.ts","../../src/core/encrypted-wallet.ts","../../src/cli/config.ts","../../src/cli/prompt.ts","../../src/cli/session.ts","../../src/core/gasless.ts","../../packages/core/src/tokens.ts","../../packages/core/src/chains.ts","../../src/core/chains.ts","../../src/core/eoa.ts","../../src/core/signer.ts","../../src/cli/commands/balance.ts","../../src/core/client.ts","../../src/core/assets.ts","../../src/core/no-executor.ts","../../src/local-session.ts","../../src/cli/gasless.ts","../../src/cli/wallet.ts","../../src/cli/commands/send.ts","../../src/cli/contacts.ts","../../src/cli/commands/keystore.ts","../../src/cli/wallet-status.ts","../../src/cli/commands/auth.ts","../../src/cli/commands/backup.ts","../../src/cli/commands/contact.ts","../../src/cli/commands/gasless.ts","../../src/cli/commands/tools.ts","../../src/cli/tools/manager.ts","../../src/cli/tools/runtime.ts","../../src/cli/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { initCommand } from \"./commands/init.js\";\nimport { balanceCommand } from \"./commands/balance.js\";\nimport { sendCommand } from \"./commands/send.js\";\nimport { keystoreCommand } from \"./commands/keystore.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { backupCommand } from \"./commands/backup.js\";\nimport { contactCommand } from \"./commands/contact.js\";\nimport { gaslessCommand } from \"./commands/gasless.js\";\nimport {\n createAddToolCommand,\n createRemoveToolCommand,\n createToolsCommand,\n createUpdateToolCommand,\n} from \"./commands/tools.js\";\nimport { runSessionDaemonProcess } from \"./session.js\";\nimport { createCliToolManager } from \"./tools/manager.js\";\nimport { version } from \"./version.js\";\n\nexport interface CreateProgramOptions {\n toolManager?: ReturnType<typeof createCliToolManager>;\n}\n\nexport function createProgram(options: CreateProgramOptions = {}): Command {\n const program = new Command();\n const toolManager = options.toolManager ?? createCliToolManager();\n\n program\n .name(\"moneyos\")\n .description(\"The operating system for money\")\n .version(version);\n\n program.addCommand(initCommand);\n program.addCommand(balanceCommand);\n program.addCommand(sendCommand);\n program.addCommand(keystoreCommand);\n program.addCommand(authCommand);\n program.addCommand(backupCommand);\n program.addCommand(contactCommand);\n program.addCommand(gaslessCommand);\n program.addCommand(createAddToolCommand(toolManager));\n program.addCommand(createRemoveToolCommand(toolManager));\n program.addCommand(createUpdateToolCommand(toolManager));\n program.addCommand(createToolsCommand(toolManager));\n program\n .command(\"__session-daemon\", { hidden: true })\n .action(async () => {\n await runSessionDaemonProcess();\n });\n toolManager.mountInstalledToolCommands(program);\n\n return program;\n}\n\nfunction resolveEntrypointPath(path: string): string {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n}\n\nexport function isEntrypointPath(cliEntry: string | undefined, moduleUrl: string): boolean {\n return typeof cliEntry === \"string\"\n && resolveEntrypointPath(cliEntry) === fileURLToPath(moduleUrl);\n}\n\nif (isEntrypointPath(process.argv[1], import.meta.url)) {\n void createProgram().parseAsync(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import { Command } from \"commander\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport {\n FileBackupProvider,\n type BackupProvider,\n} from \"../../core/backup-file.js\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletStore,\n} from \"../../core/encrypted-wallet.js\";\nimport {\n type CLIConfig,\n getBackupDir,\n getConfigPath,\n getLegacyPlaintextWalletStorageMessage,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n getRemovedOnePasswordStorageMessage,\n hasRemovedOnePasswordConfig,\n hasLegacyPlaintextWalletConfig,\n loadFileConfig,\n saveConfig,\n} from \"../config.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport { lockSession } from \"../session.js\";\n\nfunction parseChainId(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid chain ID: \"${value}\"`);\n }\n return parsed;\n}\n\nexport interface InitCommandOptions {\n key?: string;\n force?: boolean;\n chain?: string;\n rpc?: string;\n}\n\nexport interface InitCommandDependencies {\n loadFileConfig: () => CLIConfig;\n getWalletPath: (config?: CLIConfig) => string;\n getBackupDir: (config?: CLIConfig) => string;\n getConfigPath: () => string;\n createWalletStore: (walletPath: string) => EncryptedWalletStore;\n createBackupProvider: (params: {\n walletPath: string;\n backupDir: string;\n }) => BackupProvider;\n hasRemovedOnePasswordConfig: (config: CLIConfig) => boolean;\n getRemovedOnePasswordStorageMessage: () => string;\n hasLegacyPlaintextWalletConfig: (config: CLIConfig) => boolean;\n getLegacyPlaintextWalletStorageMessage: () => string;\n promptHidden: (question: string) => Promise<string>;\n lockSession: (socketPath: string, tokenPath: string) => Promise<boolean>;\n getSessionSocketPath: () => string;\n getSessionTokenPath: () => string;\n saveConfig: (config: CLIConfig) => void;\n generatePrivateKey: () => Hex;\n log: (message: string) => void;\n error: (message: string) => void;\n}\n\nconst defaultInitCommandDependencies: InitCommandDependencies = {\n loadFileConfig,\n getWalletPath,\n getBackupDir,\n getConfigPath,\n createWalletStore: (walletPath) => new FileEncryptedWalletStore(walletPath),\n createBackupProvider: (params) => new FileBackupProvider(params),\n hasRemovedOnePasswordConfig,\n getRemovedOnePasswordStorageMessage,\n hasLegacyPlaintextWalletConfig,\n getLegacyPlaintextWalletStorageMessage,\n promptHidden,\n lockSession,\n getSessionSocketPath,\n getSessionTokenPath,\n saveConfig,\n generatePrivateKey,\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n};\n\nexport async function runInitCommand(\n options: InitCommandOptions,\n deps: InitCommandDependencies = defaultInitCommandDependencies,\n): Promise<void> {\n const existing = deps.loadFileConfig();\n const walletPath = deps.getWalletPath(existing);\n const backupDir = deps.getBackupDir(existing);\n const wallet = deps.createWalletStore(walletPath);\n\n if (wallet.exists() && !options.force) {\n const metadata = await wallet.metadata();\n deps.log(`Already initialized.`);\n if (metadata?.address) {\n deps.log(`Address: ${metadata.address}`);\n }\n deps.log(`Wallet: ${walletPath}`);\n deps.log(`Config: ${deps.getConfigPath()}`);\n deps.log(`\\nTo reinitialize, run: moneyos init --force --key <privateKey>`);\n return;\n }\n\n if (deps.hasRemovedOnePasswordConfig(existing) && !options.key) {\n deps.error(deps.getRemovedOnePasswordStorageMessage());\n deps.error(`Config: ${deps.getConfigPath()}`);\n return;\n }\n\n try {\n const privateKey =\n options.key ??\n (deps.hasLegacyPlaintextWalletConfig(existing)\n ? existing.privateKey!\n : deps.generatePrivateKey());\n const account = privateKeyToAccount(privateKey as Hex);\n const chainId = parseChainId(options.chain, existing.chainId ?? 42161);\n const rpcUrl = options.rpc ?? existing.rpcUrl;\n const passphrase = await deps.promptHidden(\"Choose wallet password: \");\n if (passphrase.length < 8) {\n throw new Error(\"Wallet password must be at least 8 characters long.\");\n }\n const confirmPassphrase = await deps.promptHidden(\"Confirm wallet password: \");\n if (passphrase !== confirmPassphrase) {\n throw new Error(\"Wallet password confirmation did not match.\");\n }\n\n await wallet.save({\n privateKey: privateKey as Hex,\n passphrase,\n });\n await deps.lockSession(\n deps.getSessionSocketPath(),\n deps.getSessionTokenPath(),\n );\n\n deps.saveConfig({\n chainId,\n rpcUrl,\n walletPath: existing.walletPath,\n backupDir: existing.backupDir,\n });\n\n const backupProvider = deps.createBackupProvider({\n walletPath,\n backupDir,\n });\n const backupPath = await backupProvider.exportWallet();\n\n deps.log(`MoneyOS initialized.`);\n deps.log(`Address: ${account.address}`);\n deps.log(`Wallet: ${walletPath}`);\n deps.log(`Config: ${deps.getConfigPath()}`);\n deps.log(`Backup: ${backupPath}`);\n deps.log(\n `\\nSave your wallet password in your password manager of choice. MoneyOS does not store or sync it for you.`,\n );\n\n if (deps.hasLegacyPlaintextWalletConfig(existing) && !options.key) {\n deps.log(`\\nImported legacy plaintext wallet into the encrypted wallet file.`);\n deps.log(deps.getLegacyPlaintextWalletStorageMessage());\n } else if (!options.key) {\n deps.log(\n `\\nThis is a new account. Fund it before sending transactions.`,\n );\n }\n } catch (error) {\n deps.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize MoneyOS with a new or imported encrypted wallet\")\n .option(\"-k, --key <privateKey>\", \"Import an existing private key\")\n .option(\"--force\", \"Overwrite the existing encrypted wallet\")\n .option(\"--chain <chainId>\", \"Default chain ID (default: 42161 Arbitrum)\")\n .option(\"--rpc <url>\", \"Custom RPC URL\")\n .action(async (options) => {\n await runInitCommand(options);\n });\n","import {\n existsSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { Address } from \"viem\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletMetadata,\n readEncryptedWalletFile,\n verifyEncryptedWalletPassphrase,\n writeEncryptedWalletFile,\n} from \"./encrypted-wallet.js\";\n\nexport interface BackupProvider {\n readonly kind: \"file\";\n exportWallet(options?: { outPath?: string; allowOverwrite?: boolean }): Promise<string>;\n restoreWallet(\n fromPath: string,\n options: { passphrase: string; allowOverwrite?: boolean },\n ): Promise<EncryptedWalletMetadata>;\n status(): Promise<{\n walletPath: string;\n backupDir: string;\n exists: boolean;\n latestBackupPath?: string;\n backupCount: number;\n address?: Address;\n }>;\n}\n\nfunction formatTimestamp(now: Date): string {\n const pad = (value: number) => value.toString().padStart(2, \"0\");\n return [\n now.getUTCFullYear().toString(),\n pad(now.getUTCMonth() + 1),\n pad(now.getUTCDate()),\n \"-\",\n pad(now.getUTCHours()),\n pad(now.getUTCMinutes()),\n pad(now.getUTCSeconds()),\n ].join(\"\");\n}\n\nexport class FileBackupProvider implements BackupProvider {\n readonly kind = \"file\" as const;\n private readonly store: FileEncryptedWalletStore;\n private readonly backupDir: string;\n\n constructor(params: { walletPath: string; backupDir: string }) {\n this.store = new FileEncryptedWalletStore(params.walletPath);\n this.backupDir = params.backupDir;\n }\n\n private defaultBackupPath(address: Address): string {\n return join(\n this.backupDir,\n `wallet-${address}-${formatTimestamp(new Date())}.json`,\n );\n }\n\n async exportWallet(\n options: { outPath?: string; allowOverwrite?: boolean } = {},\n ): Promise<string> {\n if (options.outPath === \"-\") {\n throw new Error(\"Refusing to export an encrypted wallet backup to stdout.\");\n }\n const wallet = await this.store.exportData();\n const targetPath = options.outPath\n ? resolve(options.outPath)\n : this.defaultBackupPath(wallet.address);\n if (existsSync(targetPath) && !options.allowOverwrite) {\n throw new Error(\n \"Backup file already exists. Re-run with `--force` if you really want to overwrite it.\",\n );\n }\n await writeEncryptedWalletFile(targetPath, wallet, {\n parentDescription: \"Backup export destination directory\",\n fileDescription: \"Backup export file\",\n });\n return targetPath;\n }\n\n async restoreWallet(\n fromPath: string,\n options: { passphrase: string; allowOverwrite?: boolean },\n ): Promise<EncryptedWalletMetadata> {\n if (this.store.exists() && !options.allowOverwrite) {\n throw new Error(\n \"A wallet already exists. Re-run with `--force` if you really want to overwrite it.\",\n );\n }\n\n const sourcePath = resolve(fromPath);\n const wallet = await readEncryptedWalletFile(sourcePath);\n await verifyEncryptedWalletPassphrase(wallet, options.passphrase);\n return this.store.restore(wallet);\n }\n\n async status(): Promise<{\n walletPath: string;\n backupDir: string;\n exists: boolean;\n latestBackupPath?: string;\n backupCount: number;\n address?: Address;\n }> {\n const exists = this.store.exists();\n const metadata = exists ? await this.store.metadata() : undefined;\n\n if (!existsSync(this.backupDir)) {\n return {\n walletPath: this.store.walletPath,\n backupDir: this.backupDir,\n exists,\n backupCount: 0,\n address: metadata?.address,\n };\n }\n\n const files = readdirSync(this.backupDir)\n .filter((name) => name.endsWith(\".json\"))\n .map((name) => join(this.backupDir, name))\n .sort(\n (a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs,\n );\n\n return {\n walletPath: this.store.walletPath,\n backupDir: this.backupDir,\n exists,\n latestBackupPath: files[0],\n backupCount: files.length,\n address: metadata?.address,\n };\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n scryptSync,\n} from \"node:crypto\";\nimport {\n chmodSync,\n closeSync,\n existsSync,\n fsyncSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { recoverMessageAddress, type Address, type Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport interface EncryptedWalletKdfConfig {\n name: \"scrypt\";\n N: number;\n r: number;\n p: number;\n keyLength: number;\n}\n\nexport interface EncryptedWalletCrypto {\n cipher: \"aes-256-gcm\";\n salt: string;\n nonce: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface EncryptedWalletFile {\n version: 1;\n kind: \"encrypted-local-eoa\";\n address: Address;\n createdAt: string;\n addressProof: Hex;\n kdf: EncryptedWalletKdfConfig;\n crypto: EncryptedWalletCrypto;\n}\n\nexport interface EncryptedWalletMetadata {\n version: 1;\n kind: \"encrypted-local-eoa\";\n address: Address;\n createdAt: string;\n}\n\nexport interface SecureWriteLabels {\n parentDescription: string;\n fileDescription: string;\n}\n\ntype WalletIdentityMetadata = Pick<\n EncryptedWalletFile,\n \"version\" | \"kind\" | \"address\" | \"createdAt\" | \"addressProof\"\n>;\n\nexport interface EncryptedWalletStore {\n readonly walletPath: string;\n exists(): boolean;\n metadata(): Promise<EncryptedWalletMetadata | undefined>;\n save(params: { privateKey: Hex; passphrase: string }): Promise<EncryptedWalletMetadata>;\n rotatePassphrase(params: {\n oldPassphrase: string;\n newPassphrase: string;\n }): Promise<EncryptedWalletMetadata>;\n decrypt(passphrase: string): Promise<Hex>;\n exportData(): Promise<EncryptedWalletFile>;\n restore(data: EncryptedWalletFile): Promise<EncryptedWalletMetadata>;\n}\n\nconst DEFAULT_KDF: EncryptedWalletKdfConfig = {\n name: \"scrypt\",\n N: 131072,\n r: 8,\n p: 1,\n keyLength: 32,\n};\n\nconst SECURE_FILE_MODE = 0o600;\nconst SECURE_PARENT_MODE = 0o700;\nconst WALLET_WRITE_LABELS: SecureWriteLabels = {\n parentDescription: \"Wallet directory\",\n fileDescription: \"Wallet file\",\n};\n\nfunction shouldEnforcePosixPermissions(): boolean {\n // Windows ACLs do not map cleanly to Node's POSIX-style mode bits.\n return process.platform !== \"win32\";\n}\n\nfunction normalizePassphrase(passphrase: string): string {\n return passphrase.normalize(\"NFC\");\n}\n\nfunction walletProofMessage(wallet: Pick<\n EncryptedWalletFile,\n \"version\" | \"kind\" | \"address\" | \"createdAt\"\n>): string {\n return [\n \"MoneyOS wallet metadata\",\n `v=${wallet.version}`,\n `kind=${wallet.kind}`,\n `address=${wallet.address}`,\n `createdAt=${wallet.createdAt}`,\n ].join(\"|\");\n}\n\nfunction ensureParentDir(path: string, label: string): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: SECURE_PARENT_MODE });\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(dir).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `${label} ${dir} has insecure permissions (${mode.toString(8)}). Restrict it to 700 before continuing.`,\n );\n }\n}\n\nfunction assertSecureFileMode(path: string, label: string): void {\n if (!existsSync(path)) {\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(path).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `${label} at ${path} has insecure permissions (${mode.toString(8)}). Restrict it to 600 before continuing.`,\n );\n }\n}\n\nfunction parseWalletFile(raw: string, path: string): EncryptedWalletFile {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new Error(\n `Encrypted wallet at ${path} is not valid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(`Encrypted wallet at ${path} must be a JSON object`);\n }\n\n const wallet = parsed as Partial<EncryptedWalletFile>;\n if (wallet.version !== 1) {\n throw new Error(`Encrypted wallet at ${path} has unsupported version`);\n }\n if (wallet.kind !== \"encrypted-local-eoa\") {\n throw new Error(`Encrypted wallet at ${path} has unsupported kind`);\n }\n if (typeof wallet.address !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing address metadata`);\n }\n if (typeof wallet.addressProof !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing address proof`);\n }\n if (\n !wallet.kdf ||\n wallet.kdf.name !== \"scrypt\" ||\n !Number.isInteger(wallet.kdf.N) ||\n !Number.isInteger(wallet.kdf.r) ||\n !Number.isInteger(wallet.kdf.p) ||\n !Number.isInteger(wallet.kdf.keyLength)\n ) {\n throw new Error(`Encrypted wallet at ${path} has invalid KDF parameters`);\n }\n if (\n !wallet.crypto ||\n wallet.crypto.cipher !== \"aes-256-gcm\" ||\n typeof wallet.crypto.salt !== \"string\" ||\n typeof wallet.crypto.nonce !== \"string\" ||\n typeof wallet.crypto.authTag !== \"string\" ||\n typeof wallet.crypto.ciphertext !== \"string\"\n ) {\n throw new Error(`Encrypted wallet at ${path} has invalid crypto metadata`);\n }\n if (typeof wallet.createdAt !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing createdAt`);\n }\n\n return wallet as EncryptedWalletFile;\n}\n\nfunction toMetadata(wallet: EncryptedWalletFile): EncryptedWalletMetadata {\n return {\n version: wallet.version,\n kind: wallet.kind,\n address: wallet.address,\n createdAt: wallet.createdAt,\n };\n}\n\nasync function verifyWalletAddressProof(\n wallet: EncryptedWalletFile,\n path: string,\n): Promise<void> {\n let recovered: Address;\n try {\n recovered = await recoverMessageAddress({\n message: walletProofMessage(wallet),\n signature: wallet.addressProof,\n });\n } catch {\n throw new Error(`Encrypted wallet at ${path} has an invalid address proof`);\n }\n\n if (recovered.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(`Encrypted wallet at ${path} failed address proof validation`);\n }\n}\n\nfunction deriveKey(\n passphrase: string,\n salt: Buffer,\n kdf: EncryptedWalletKdfConfig,\n): Buffer {\n return scryptSync(normalizePassphrase(passphrase), salt, kdf.keyLength, {\n N: kdf.N,\n r: kdf.r,\n p: kdf.p,\n maxmem: 256 * 1024 * 1024,\n }) as Buffer;\n}\n\nfunction walletAad(kdf: EncryptedWalletKdfConfig): Buffer {\n // If the KDF shape changes in a future wallet version, update this payload so\n // all KDF fields remain bound to the AEAD tag.\n return Buffer.from(\n JSON.stringify({\n name: kdf.name,\n N: kdf.N,\n r: kdf.r,\n p: kdf.p,\n keyLength: kdf.keyLength,\n }),\n \"utf8\",\n );\n}\n\nfunction writeFileAtomicSecure(\n path: string,\n contents: string,\n labels: SecureWriteLabels = WALLET_WRITE_LABELS,\n): void {\n ensureParentDir(path, labels.parentDescription);\n assertSecureFileMode(path, labels.fileDescription);\n\n const tmpPath = join(\n dirname(path),\n `.${basename(path)}.${randomBytes(6).toString(\"hex\")}.tmp`,\n );\n const fd = openSync(tmpPath, \"wx\", SECURE_FILE_MODE);\n let writeError: unknown;\n\n try {\n writeSync(fd, contents);\n fsyncSync(fd);\n } catch (error) {\n writeError = error;\n } finally {\n closeSync(fd);\n }\n\n if (writeError) {\n try {\n unlinkSync(tmpPath);\n } catch {\n // best effort cleanup\n }\n throw writeError;\n }\n\n renameSync(tmpPath, path);\n if (shouldEnforcePosixPermissions()) {\n chmodSync(path, SECURE_FILE_MODE);\n }\n}\n\nasync function encryptWallet(params: {\n privateKey: Hex;\n passphrase: string;\n identity?: WalletIdentityMetadata;\n}): Promise<EncryptedWalletFile> {\n const account = privateKeyToAccount(params.privateKey);\n const createdAt = params.identity?.createdAt ?? new Date().toISOString();\n const salt = randomBytes(16);\n const nonce = randomBytes(12);\n const key = deriveKey(params.passphrase, salt, DEFAULT_KDF);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n cipher.setAAD(walletAad(DEFAULT_KDF));\n const plaintext = Buffer.from(\n JSON.stringify({ privateKey: params.privateKey }),\n \"utf8\",\n );\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const authTag = cipher.getAuthTag();\n const addressProof =\n params.identity?.addressProof ??\n (await account.signMessage({\n message: walletProofMessage({\n version: 1,\n kind: \"encrypted-local-eoa\",\n address: account.address,\n createdAt,\n }),\n }));\n\n if (\n params.identity &&\n account.address.toLowerCase() !== params.identity.address.toLowerCase()\n ) {\n throw new Error(\"wallet address metadata mismatch\");\n }\n\n return {\n version: params.identity?.version ?? 1,\n kind: params.identity?.kind ?? \"encrypted-local-eoa\",\n address: params.identity?.address ?? account.address,\n createdAt,\n addressProof,\n kdf: DEFAULT_KDF,\n crypto: {\n cipher: \"aes-256-gcm\",\n salt: salt.toString(\"base64\"),\n nonce: nonce.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\"),\n },\n };\n}\n\nfunction walletIdentity(wallet: EncryptedWalletFile): WalletIdentityMetadata {\n return {\n version: wallet.version,\n kind: wallet.kind,\n address: wallet.address,\n createdAt: wallet.createdAt,\n addressProof: wallet.addressProof,\n };\n}\n\nasync function decryptWalletFile(\n wallet: EncryptedWalletFile,\n passphrase: string,\n): Promise<Hex> {\n try {\n const salt = Buffer.from(wallet.crypto.salt, \"base64\");\n const nonce = Buffer.from(wallet.crypto.nonce, \"base64\");\n const authTag = Buffer.from(wallet.crypto.authTag, \"base64\");\n const ciphertext = Buffer.from(wallet.crypto.ciphertext, \"base64\");\n const key = deriveKey(passphrase, salt, wallet.kdf);\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAAD(walletAad(wallet.kdf));\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]).toString(\"utf8\");\n const parsed = JSON.parse(plaintext) as { privateKey?: unknown };\n if (typeof parsed.privateKey !== \"string\") {\n throw new Error(\"wallet payload missing privateKey\");\n }\n const privateKey = parsed.privateKey as Hex;\n const derivedAddress = privateKeyToAccount(privateKey).address;\n if (derivedAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"wallet address metadata mismatch\");\n }\n\n return privateKey;\n } catch {\n throw new Error(\"Invalid password or corrupted wallet.\");\n }\n}\n\nexport class FileEncryptedWalletStore implements EncryptedWalletStore {\n readonly walletPath: string;\n\n constructor(walletPath: string) {\n this.walletPath = walletPath;\n }\n\n exists(): boolean {\n return existsSync(this.walletPath);\n }\n\n async metadata(): Promise<EncryptedWalletMetadata | undefined> {\n if (!this.exists()) {\n return undefined;\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return toMetadata(wallet);\n }\n\n async save(params: {\n privateKey: Hex;\n passphrase: string;\n }): Promise<EncryptedWalletMetadata> {\n const wallet = await encryptWallet(params);\n writeFileAtomicSecure(\n this.walletPath,\n JSON.stringify(wallet, null, 2),\n WALLET_WRITE_LABELS,\n );\n return toMetadata(wallet);\n }\n\n async rotatePassphrase(params: {\n oldPassphrase: string;\n newPassphrase: string;\n }): Promise<EncryptedWalletMetadata> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n const privateKey = await decryptWalletFile(wallet, params.oldPassphrase);\n const rotated = await encryptWallet({\n privateKey,\n passphrase: params.newPassphrase,\n identity: walletIdentity(wallet),\n });\n writeFileAtomicSecure(this.walletPath, JSON.stringify(rotated, null, 2));\n return toMetadata(rotated);\n }\n\n async decrypt(passphrase: string): Promise<Hex> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return decryptWalletFile(wallet, passphrase);\n }\n\n async exportData(): Promise<EncryptedWalletFile> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return wallet;\n }\n\n async restore(data: EncryptedWalletFile): Promise<EncryptedWalletMetadata> {\n const wallet = parseWalletFile(JSON.stringify(data), this.walletPath);\n await verifyWalletAddressProof(wallet, this.walletPath);\n writeFileAtomicSecure(\n this.walletPath,\n JSON.stringify(wallet, null, 2),\n WALLET_WRITE_LABELS,\n );\n return toMetadata(wallet);\n }\n}\n\nexport async function writeEncryptedWalletFile(\n path: string,\n data: EncryptedWalletFile,\n labels: SecureWriteLabels = WALLET_WRITE_LABELS,\n): Promise<EncryptedWalletMetadata> {\n const wallet = parseWalletFile(JSON.stringify(data), path);\n await verifyWalletAddressProof(wallet, path);\n writeFileAtomicSecure(path, JSON.stringify(wallet, null, 2), labels);\n return toMetadata(wallet);\n}\n\nexport async function readEncryptedWalletFile(\n path: string,\n): Promise<EncryptedWalletFile> {\n assertSecureFileMode(path, \"Wallet file\");\n const wallet = parseWalletFile(readFileSync(path, \"utf8\"), path);\n await verifyWalletAddressProof(wallet, path);\n return wallet;\n}\n\nexport async function verifyEncryptedWalletPassphrase(\n wallet: EncryptedWalletFile,\n passphrase: string,\n): Promise<EncryptedWalletMetadata> {\n await verifyWalletAddressProof(wallet, \"(in-memory wallet)\");\n await decryptWalletFile(wallet, passphrase);\n return toMetadata(wallet);\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Address, Hex } from \"viem\";\n\nconst CONFIG_DIR = join(homedir(), \".moneyos\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/**\n * Local CLI configuration persisted at `~/.moneyos/config.json`.\n *\n * Only non-secret settings should be persisted here. Wallet secrets now live\n * in the encrypted wallet file, while `privateKey` remains as a legacy-only\n * field so older configs can be detected and upgraded through `moneyos init`.\n */\nexport interface CLIConfig {\n chainId?: number;\n rpcUrl?: string;\n walletPath?: string;\n backupDir?: string;\n gasless?: {\n enabled?: boolean;\n relayUrl?: string;\n account?: string;\n sponsor?: string;\n };\n /**\n * Legacy plaintext wallet field from earlier MoneyOS versions. This should\n * never be written by the current CLI.\n */\n privateKey?: Hex;\n}\n\ninterface RemovedOnePasswordConfigShape {\n keyStore?: {\n kind?: unknown;\n address?: unknown;\n };\n}\n\nexport function hasRemovedOnePasswordConfig(config: CLIConfig): boolean {\n return (\n (config as CLIConfig & RemovedOnePasswordConfigShape).keyStore?.kind ===\n \"1password\"\n );\n}\n\nexport function getRemovedOnePasswordCachedAddress(\n config: CLIConfig,\n): Address | undefined {\n const address = (config as CLIConfig & RemovedOnePasswordConfigShape)\n .keyStore?.address;\n return typeof address === \"string\" ? (address as Address) : undefined;\n}\n\nexport function getRemovedOnePasswordStorageMessage(): string {\n return \"This repo no longer supports the old 1Password-backed private-key storage path. Re-import the wallet into the local file path with `moneyos init --key <privateKey>`.\";\n}\n\n/**\n * Read the CLI config file.\n *\n * @param path Optional absolute path to the config file. Defaults to\n * `~/.moneyos/config.json`. Primarily exposed so tests can point at a\n * tmpdir without mocking `homedir`.\n */\nexport function loadFileConfig(path: string = CONFIG_FILE): CLIConfig {\n if (!existsSync(path)) {\n return {};\n }\n return JSON.parse(readFileSync(path, \"utf-8\")) as CLIConfig;\n}\n\nexport function loadConfig(): CLIConfig {\n const config: CLIConfig = { ...loadFileConfig() };\n\n // Env vars override file config — standard for agents/CI\n if (process.env.MONEYOS_PRIVATE_KEY) {\n config.privateKey = process.env.MONEYOS_PRIVATE_KEY as Hex;\n }\n if (process.env.MONEYOS_RPC_URL) {\n config.rpcUrl = process.env.MONEYOS_RPC_URL;\n }\n if (process.env.MONEYOS_CHAIN_ID) {\n const parsed = Number(process.env.MONEYOS_CHAIN_ID);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\n `Invalid MONEYOS_CHAIN_ID: \"${process.env.MONEYOS_CHAIN_ID}\" — must be a positive integer`,\n );\n }\n config.chainId = parsed;\n }\n if (process.env.MONEYOS_GASLESS_ENABLED !== undefined) {\n config.gasless = {\n ...config.gasless,\n enabled: parseBooleanEnv(\n process.env.MONEYOS_GASLESS_ENABLED,\n \"MONEYOS_GASLESS_ENABLED\",\n ),\n };\n }\n\n return config;\n}\n\nexport function parseBooleanEnv(value: string, key: string): boolean {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n\n throw new Error(\n `Invalid ${key}: \"${value}\" — expected true/false, 1/0, yes/no, or on/off`,\n );\n}\n\n/**\n * Write the CLI config file.\n *\n * @param config The config to persist.\n * @param path Optional absolute path to the config file. Defaults to\n * `~/.moneyos/config.json`. Primarily exposed so tests can point at a\n * tmpdir without mocking `homedir`. When a custom path is passed, the\n * parent directory is created with mode 0o700 if it does not already\n * exist.\n */\nexport function saveConfig(\n config: CLIConfig,\n path: string = CONFIG_FILE,\n): void {\n const safeConfig = { ...config };\n delete safeConfig.privateKey;\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n writeFileSync(path, JSON.stringify(safeConfig, null, 2), {\n mode: 0o600,\n });\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport function getMoneyOSDir(): string {\n return CONFIG_DIR;\n}\n\nexport function getToolHomeDir(): string {\n return join(CONFIG_DIR, \"tools\");\n}\n\nexport function getToolHomePackageJsonPath(): string {\n return join(getToolHomeDir(), \"package.json\");\n}\n\nexport function getToolHomeLockPath(): string {\n return join(getToolHomeDir(), \"package-lock.json\");\n}\n\nexport function getToolHomeNodeModulesPath(): string {\n return join(getToolHomeDir(), \"node_modules\");\n}\n\nexport function getToolRegistryPath(): string {\n return join(getToolHomeDir(), \"registry.json\");\n}\n\nexport function getWalletPath(config?: CLIConfig): string {\n return config?.walletPath ?? join(CONFIG_DIR, \"wallet.json\");\n}\n\nexport function getContactsPath(): string {\n return join(CONFIG_DIR, \"contacts.json\");\n}\n\nexport function getBackupDir(config?: CLIConfig): string {\n return config?.backupDir ?? join(CONFIG_DIR, \"backups\");\n}\n\nexport function getSessionSocketPath(): string {\n if (process.platform === \"win32\") {\n const suffix = createHash(\"sha256\")\n .update(CONFIG_DIR)\n .digest(\"hex\")\n .slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\moneyos-session-${suffix}`;\n }\n\n return join(CONFIG_DIR, \"session.sock\");\n}\n\nexport function getSessionTokenPath(): string {\n return join(CONFIG_DIR, \"session.token\");\n}\n\nexport function hasLegacyPlaintextWalletConfig(config: CLIConfig): boolean {\n return typeof config.privateKey === \"string\";\n}\n\nexport function getLegacyPlaintextWalletStorageMessage(): string {\n return \"Plaintext local wallet configs are no longer used for runtime access. Run `moneyos init` locally to encrypt your wallet into the new MoneyOS wallet file.\";\n}\n","export async function promptHidden(question: string): Promise<string> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\n \"This action requires a local terminal. Run it directly in your terminal, not through a non-interactive agent session.\",\n );\n }\n\n return new Promise<string>((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n let value = \"\";\n\n const cleanup = () => {\n stdin.off(\"data\", onData);\n stdin.pause();\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(false);\n }\n };\n\n const finish = (result?: string, error?: Error) => {\n cleanup();\n stdout.write(\"\\n\");\n if (error) {\n reject(error);\n return;\n }\n resolve(result ?? \"\");\n };\n\n const onData = (chunk: Buffer | string) => {\n const text = chunk.toString(\"utf8\");\n for (const char of text) {\n if (char === \"\\u0003\") {\n finish(undefined, new Error(\"Cancelled.\"));\n return;\n }\n if (char === \"\\r\" || char === \"\\n\") {\n finish(value);\n return;\n }\n if (char === \"\\u007f\" || char === \"\\b\") {\n value = value.slice(0, -1);\n continue;\n }\n value += char;\n }\n };\n\n stdout.write(question);\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.on(\"data\", onData);\n });\n}\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport net from \"node:net\";\nimport { EOL } from \"node:os\";\nimport { dirname } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { Address } from \"viem\";\nimport type { CallRequest, ExecutionClient, ExecutionResult } from \"@moneyos/core\";\nimport type { GaslessExecutionConfig } from \"../core/gasless.js\";\nimport { createGaslessExecutionClient } from \"../core/gasless.js\";\nimport { EOAExecutor } from \"../core/eoa.js\";\nimport { privateKeyToManagedAccount } from \"../core/signer.js\";\n\nexport type SessionExecutionMode = ExecutionClient[\"mode\"];\n\nexport interface SessionGaslessStartConfig {\n account: Address;\n sponsor: Address;\n relayUrl: string;\n nonceKey?: string;\n validityWindowSeconds?: number;\n}\n\nexport interface SessionServerStartMessage {\n type: \"start\";\n privateKey: `0x${string}`;\n chainId: number;\n rpcUrl?: string;\n socketPath: string;\n tokenPath: string;\n ttlMs: number;\n gasless?: SessionGaslessStartConfig;\n}\n\nexport interface SessionStatusResult {\n address: Address;\n expiresAt: string;\n mode: SessionExecutionMode;\n}\n\nexport interface SessionServerHandle {\n readonly address: Address;\n readonly expiresAt: string;\n readonly mode: SessionExecutionMode;\n close(): Promise<void>;\n}\n\ninterface SessionSendParams {\n to: Address;\n chainId: number;\n data?: `0x${string}`;\n value?: string;\n}\n\ntype SessionRequest =\n | { id: string; token: string; type: \"status\" }\n | { id: string; token: string; type: \"lock\" }\n | { id: string; token: string; type: \"send\"; params: SessionSendParams };\n\ntype SessionRequestWithoutToken =\n | { id: string; type: \"status\" }\n | { id: string; type: \"lock\" }\n | { id: string; type: \"send\"; params: SessionSendParams };\n\ntype SessionResponse =\n | {\n id: string;\n ok: true;\n result: SessionStatusResult | ExecutionResult | { locked: true };\n }\n | { id: string; ok: false; error: string };\n\ninterface StoredSendResponse {\n fingerprint: string;\n response: Promise<SessionResponse>;\n}\n\nconst SESSION_CONTROL_TIMEOUT_MS = 750;\n// Intentionally much longer than control operations: on-chain submission does\n// real RPC work, and PR #12 fixed a live timeout-after-broadcast bug here.\nconst SESSION_SEND_TIMEOUT_MS = 60_000;\nconst MAX_MESSAGE_BYTES = 32 * 1024;\nconst SECURE_DIR_MODE = 0o700;\nconst SECURE_FILE_MODE = 0o600;\nconst SERVER_SOCKET_TIMEOUT_MS = 5000;\nconst SESSION_SHUTDOWN_TIMEOUT_MS = 15000;\n\nfunction shouldEnforcePosixPermissions(): boolean {\n // Windows ACLs do not map cleanly to Node's POSIX-style mode bits.\n return process.platform !== \"win32\";\n}\n\nfunction isWindowsPipe(path: string): boolean {\n return path.startsWith(\"\\\\\\\\.\\\\pipe\\\\\");\n}\n\nfunction removeFileIfPresent(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { force: true });\n }\n}\n\nfunction ensureSecureParent(path: string): void {\n if (isWindowsPipe(path)) {\n return;\n }\n\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: SECURE_DIR_MODE });\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(dir).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `MoneyOS directory ${dir} has insecure permissions (${mode.toString(8)}). Restrict it to 700 before continuing.`,\n );\n }\n}\n\nfunction createRequestId(): string {\n return `${Date.now()}-${Math.random().toString(16).slice(2, 10)}`;\n}\n\nfunction createSendRequestFingerprint(request: Extract<SessionRequest, { type: \"send\" }>): string {\n return JSON.stringify(request.params);\n}\n\nfunction toGaslessExecutionConfig(\n config: SessionGaslessStartConfig,\n): GaslessExecutionConfig {\n return {\n account: config.account,\n sponsor: config.sponsor,\n relayUrl: config.relayUrl,\n nonceKey:\n config.nonceKey !== undefined && config.nonceKey.trim() !== \"\"\n ? BigInt(config.nonceKey)\n : undefined,\n validityWindowSeconds: config.validityWindowSeconds,\n };\n}\n\nfunction loadSessionToken(tokenPath: string): string {\n try {\n return readFileSync(tokenPath, \"utf8\").trim();\n } catch {\n throw new Error(\"No active local MoneyOS session found.\");\n }\n}\n\nfunction writeSecureToken(tokenPath: string, token: string): void {\n ensureSecureParent(tokenPath);\n writeFileSync(tokenPath, `${token}\\n`, { mode: SECURE_FILE_MODE });\n if (shouldEnforcePosixPermissions()) {\n chmodSync(tokenPath, SECURE_FILE_MODE);\n }\n}\n\nfunction sessionFilesGone(socketPath: string, tokenPath: string): boolean {\n const tokenMissing = !existsSync(tokenPath);\n const socketMissing = isWindowsPipe(socketPath) ? true : !existsSync(socketPath);\n return tokenMissing && socketMissing;\n}\n\nasync function waitForSessionShutdown(\n socketPath: string,\n tokenPath: string,\n timeoutMs: number = SESSION_SHUTDOWN_TIMEOUT_MS,\n): Promise<void> {\n const startedAt = Date.now();\n while (!sessionFilesGone(socketPath, tokenPath)) {\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(\n \"Timed out waiting for the previous MoneyOS session to shut down cleanly.\",\n );\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n}\n\nfunction tokensMatch(expectedToken: string, receivedToken: string): boolean {\n const expected = Buffer.from(expectedToken, \"utf8\");\n const received = Buffer.from(receivedToken, \"utf8\");\n return (\n expected.length === received.length &&\n timingSafeEqual(expected, received)\n );\n}\n\nfunction readLine(socket: net.Socket): Promise<string> {\n return new Promise((resolve, reject) => {\n let buffer = \"\";\n\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString(\"utf8\");\n if (buffer.length > MAX_MESSAGE_BYTES) {\n cleanup();\n reject(new Error(\"Session response exceeded the maximum allowed size.\"));\n return;\n }\n const index = buffer.indexOf(\"\\n\");\n if (index >= 0) {\n cleanup();\n resolve(buffer.slice(0, index));\n }\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error(\"Session daemon closed the connection unexpectedly.\"));\n };\n\n const cleanup = () => {\n socket.off(\"data\", onData);\n socket.off(\"error\", onError);\n socket.off(\"close\", onClose);\n };\n\n socket.on(\"data\", onData);\n socket.once(\"error\", onError);\n socket.once(\"close\", onClose);\n });\n}\n\nasync function sendSessionRequest(\n socketPath: string,\n tokenPath: string,\n request: SessionRequestWithoutToken,\n timeoutMs: number = SESSION_CONTROL_TIMEOUT_MS,\n): Promise<SessionResponse> {\n const fullRequest = {\n ...request,\n token: loadSessionToken(tokenPath),\n } as SessionRequest;\n const socket = net.createConnection(socketPath);\n\n return new Promise<SessionResponse>((resolve, reject) => {\n let settled = false;\n const timer = setTimeout(() => {\n settled = true;\n socket.destroy();\n reject(new Error(\"Timed out waiting for local MoneyOS session.\"));\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timer);\n socket.removeAllListeners();\n };\n\n socket.once(\"connect\", async () => {\n try {\n socket.write(`${JSON.stringify(fullRequest)}${EOL}`);\n const line = await readLine(socket);\n settled = true;\n cleanup();\n socket.end();\n resolve(JSON.parse(line) as SessionResponse);\n } catch (error) {\n settled = true;\n cleanup();\n socket.destroy();\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n socket.once(\"error\", (error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n });\n });\n}\n\nfunction isRetryableSessionTransportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n if (\n error.message === \"Session daemon closed the connection unexpectedly.\"\n || error.message === \"Timed out waiting for local MoneyOS session.\"\n ) {\n return true;\n }\n\n const code = (error as NodeJS.ErrnoException).code;\n return (\n code === \"ECONNRESET\"\n || code === \"EPIPE\"\n || code === \"ETIMEDOUT\"\n || code === \"ERR_STREAM_DESTROYED\"\n );\n}\n\nfunction unwrapSessionSendResponse(response: SessionResponse): ExecutionResult {\n if (!response.ok) {\n throw new Error(response.error);\n }\n\n return response.result as ExecutionResult;\n}\n\nexport async function getSessionStatus(\n socketPath: string,\n tokenPath: string,\n): Promise<SessionStatusResult | undefined> {\n try {\n const response = await sendSessionRequest(\n socketPath,\n tokenPath,\n {\n id: createRequestId(),\n type: \"status\",\n },\n SESSION_CONTROL_TIMEOUT_MS,\n );\n if (!response.ok) {\n return undefined;\n }\n\n const result = response.result as Partial<SessionStatusResult> & {\n address: Address;\n expiresAt: string;\n };\n return {\n address: result.address,\n expiresAt: result.expiresAt,\n mode: result.mode ?? \"eoa\",\n };\n } catch {\n removeFileIfPresent(socketPath);\n removeFileIfPresent(tokenPath);\n return undefined;\n }\n}\n\nexport async function lockSession(\n socketPath: string,\n tokenPath: string,\n): Promise<boolean> {\n try {\n const response = await sendSessionRequest(\n socketPath,\n tokenPath,\n {\n id: createRequestId(),\n type: \"lock\",\n },\n SESSION_CONTROL_TIMEOUT_MS,\n );\n return response.ok;\n } catch {\n removeFileIfPresent(socketPath);\n removeFileIfPresent(tokenPath);\n return false;\n }\n}\n\nexport class SessionExecutionClient implements ExecutionClient {\n readonly mode: SessionExecutionMode;\n private readonly socketPath: string;\n private readonly tokenPath: string;\n private readonly address: Address;\n\n constructor(params: {\n socketPath: string;\n tokenPath: string;\n address: Address;\n mode?: SessionExecutionMode;\n }) {\n this.socketPath = params.socketPath;\n this.tokenPath = params.tokenPath;\n this.address = params.address;\n this.mode = params.mode ?? \"eoa\";\n }\n\n getAddress(): Address {\n return this.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const requestId = createRequestId();\n\n try {\n return await this.sendWithRequestId(requestId, call);\n } catch (error) {\n if (!isRetryableSessionTransportError(error)) {\n throw error;\n }\n\n return this.sendWithRequestId(requestId, call);\n }\n }\n\n private async sendWithRequestId(\n requestId: string,\n call: CallRequest,\n ): Promise<ExecutionResult> {\n const response = await sendSessionRequest(\n this.socketPath,\n this.tokenPath,\n {\n id: requestId,\n type: \"send\",\n params: {\n to: call.to,\n chainId: call.chainId,\n data: call.data,\n value: call.value?.toString(),\n },\n },\n SESSION_SEND_TIMEOUT_MS,\n );\n return unwrapSessionSendResponse(response);\n }\n\n capabilities() {\n const smartAccount = this.mode === \"smart-account\";\n return {\n sponsoredGas: smartAccount,\n batching: false,\n simulation: smartAccount,\n };\n }\n}\n\nexport async function startSessionServer(\n start: SessionServerStartMessage,\n hooks: {\n executor?: ExecutionClient;\n onError?: (error: Error) => void;\n onExit?: () => void;\n } = {},\n): Promise<SessionServerHandle> {\n ensureSecureParent(start.tokenPath);\n ensureSecureParent(start.socketPath);\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n\n const signer = privateKeyToManagedAccount(start.privateKey);\n const executor = hooks.executor ?? (start.gasless\n ? createGaslessExecutionClient({\n signer,\n chainId: start.chainId,\n rpcUrl: start.rpcUrl,\n gasless: toGaslessExecutionConfig(start.gasless),\n })\n : new EOAExecutor(signer, {\n defaultChainId: start.chainId,\n rpcUrl: start.rpcUrl,\n }));\n const expiresAt = new Date(Date.now() + start.ttlMs);\n const token = randomBytes(32).toString(\"hex\");\n // Retain send results for the session lifetime so a retry with the same\n // request ID never rebroadcasts after a late disconnect.\n const sendResponses = new Map<string, StoredSendResponse>();\n writeSecureToken(start.tokenPath, token);\n\n let closed = false;\n\n const close = async () => {\n if (closed) return;\n closed = true;\n await new Promise<void>((resolve) => {\n server.close(() => {\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n hooks.onExit?.();\n resolve();\n });\n });\n };\n\n const server = net.createServer((socket) => {\n let buffer = \"\";\n socket.setTimeout(SERVER_SOCKET_TIMEOUT_MS, () => {\n socket.destroy();\n });\n\n socket.on(\"data\", async (chunk) => {\n buffer += chunk.toString(\"utf8\");\n if (buffer.length > MAX_MESSAGE_BYTES) {\n socket.write(\n `${JSON.stringify({\n id: \"unknown\",\n ok: false,\n error: \"Session request exceeded the maximum allowed size.\",\n })}${EOL}`,\n );\n socket.end();\n return;\n }\n\n const index = buffer.indexOf(\"\\n\");\n if (index < 0) {\n return;\n }\n\n const raw = buffer.slice(0, index);\n buffer = buffer.slice(index + 1);\n let request: SessionRequest;\n try {\n request = JSON.parse(raw) as SessionRequest;\n } catch {\n socket.write(\n `${JSON.stringify({\n id: \"unknown\",\n ok: false,\n error: \"Invalid session request.\",\n })}${EOL}`,\n );\n socket.end();\n return;\n }\n\n const respond = (response: SessionResponse) => {\n socket.write(`${JSON.stringify(response)}${EOL}`);\n socket.end();\n };\n\n try {\n if (!tokensMatch(token, String(request.token ?? \"\"))) {\n respond({\n id: request.id,\n ok: false,\n error: \"Session authentication failed.\",\n });\n return;\n }\n\n if (request.type === \"status\") {\n respond({\n id: request.id,\n ok: true,\n result: {\n address: executor.getAddress(),\n expiresAt: expiresAt.toISOString(),\n mode: executor.mode,\n },\n });\n return;\n }\n\n if (request.type === \"lock\") {\n respond({\n id: request.id,\n ok: true,\n result: { locked: true },\n });\n setImmediate(() => {\n void close();\n });\n return;\n }\n\n socket.setTimeout(SESSION_SEND_TIMEOUT_MS, () => {\n socket.destroy();\n });\n const fingerprint = createSendRequestFingerprint(request);\n const existing = sendResponses.get(request.id);\n if (existing) {\n if (existing.fingerprint !== fingerprint) {\n respond({\n id: request.id,\n ok: false,\n error: \"Session send request IDs cannot be reused with different parameters.\",\n });\n return;\n }\n\n respond(await existing.response);\n return;\n }\n\n const responsePromise = (async (): Promise<SessionResponse> => {\n try {\n const result = await executor.send({\n to: request.params.to,\n chainId: request.params.chainId,\n data: request.params.data,\n value:\n request.params.value !== undefined\n ? BigInt(request.params.value)\n : undefined,\n });\n\n return {\n id: request.id,\n ok: true,\n result,\n };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n })();\n sendResponses.set(request.id, {\n fingerprint,\n response: responsePromise,\n });\n\n respond(await responsePromise);\n } catch (error) {\n respond({\n id: request.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", (error) => {\n hooks.onError?.(error instanceof Error ? error : new Error(String(error)));\n reject(error);\n });\n server.listen(start.socketPath, () => {\n if (\n shouldEnforcePosixPermissions()\n && !isWindowsPipe(start.socketPath)\n ) {\n chmodSync(start.socketPath, SECURE_FILE_MODE);\n }\n resolve();\n });\n });\n\n const timer = setTimeout(() => {\n void close();\n }, start.ttlMs);\n timer.unref();\n\n return {\n address: executor.getAddress(),\n expiresAt: expiresAt.toISOString(),\n mode: executor.mode,\n close,\n };\n}\n\nexport async function startDetachedSessionDaemon(\n params: SessionServerStartMessage,\n): Promise<SessionStatusResult> {\n const existing = await getSessionStatus(params.socketPath, params.tokenPath);\n if (existing) {\n const locked = await lockSession(params.socketPath, params.tokenPath);\n if (!locked && !sessionFilesGone(params.socketPath, params.tokenPath)) {\n throw new Error(\n \"Failed to replace the existing MoneyOS session. Run `moneyos auth lock` and try again.\",\n );\n }\n if (locked) {\n await waitForSessionShutdown(params.socketPath, params.tokenPath);\n }\n } else {\n removeFileIfPresent(params.socketPath);\n removeFileIfPresent(params.tokenPath);\n }\n\n return new Promise<SessionStatusResult>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [...process.execArgv, process.argv[1], \"__session-daemon\"],\n {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"],\n },\n );\n\n let settled = false;\n\n const finish = (error?: Error, status?: SessionStatusResult) => {\n if (settled) return;\n settled = true;\n child.removeAllListeners();\n if (error) {\n reject(error);\n return;\n }\n resolve(status as SessionStatusResult);\n };\n\n child.once(\"error\", (error) => finish(error));\n child.once(\"exit\", (code) => {\n if (!settled) {\n finish(\n new Error(\n `Session daemon exited unexpectedly with code ${code ?? \"unknown\"}.`,\n ),\n );\n }\n });\n child.on(\"message\", (message: unknown) => {\n const payload = message as\n | { type: \"ready\"; address: Address; expiresAt: string; mode: SessionExecutionMode }\n | { type: \"error\"; error: string };\n if (payload?.type === \"ready\") {\n child.disconnect();\n child.unref();\n finish(undefined, {\n address: payload.address,\n expiresAt: payload.expiresAt,\n mode: payload.mode,\n });\n } else if (payload?.type === \"error\") {\n finish(new Error(payload.error));\n }\n });\n\n child.send(params);\n });\n}\n\nexport async function runSessionDaemonProcess(): Promise<void> {\n if (!process.send) {\n throw new Error(\"Session daemon must be started through MoneyOS.\");\n }\n\n const start = await new Promise<SessionServerStartMessage>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Session daemon did not receive startup parameters.\"));\n }, 1000);\n\n process.once(\"message\", (message: unknown) => {\n clearTimeout(timeout);\n const payload = message as SessionServerStartMessage;\n if (payload?.type !== \"start\") {\n reject(new Error(\"Session daemon received invalid startup message.\"));\n return;\n }\n resolve(payload);\n });\n });\n\n const shutdown = (code: number = 0) => {\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n process.exit(code);\n };\n\n const handle = await startSessionServer(start, {\n onError: (error) => {\n process.send?.({\n type: \"error\",\n error: error.message,\n });\n shutdown(1);\n },\n onExit: () => shutdown(),\n });\n\n process.send?.({\n type: \"ready\",\n address: handle.address,\n expiresAt: handle.expiresAt,\n mode: handle.mode,\n });\n process.on(\"SIGTERM\", () => {\n void handle.close().then(() => shutdown());\n });\n process.on(\"SIGINT\", () => {\n void handle.close().then(() => shutdown());\n });\n}\n","import type { ExecutionClient, RuntimeConfig } from \"@moneyos/core\";\nimport {\n GaslessExecutor,\n RelayClient,\n moneyOSAccountV1Abi,\n type NonceResolverInput,\n} from \"@moneyos/gasless\";\nimport { createPublicClient, http, type Account, type Address } from \"viem\";\nimport type { LocalAccount } from \"viem/accounts\";\nimport { resolveChainTransport } from \"./chains.js\";\n\nexport interface GaslessExecutionConfig {\n account: Address;\n sponsor: Address;\n relayUrl: string;\n nonceKey?: bigint;\n validityWindowSeconds?: number;\n}\n\nfunction asLocalAccount(signer: Account): LocalAccount {\n if (typeof (signer as LocalAccount).signTypedData !== \"function\") {\n throw new Error(\n \"Gasless mode requires a local signer that can sign typed data.\",\n );\n }\n\n return signer as LocalAccount;\n}\n\nexport function createGaslessExecutionClient(params: {\n signer: Account;\n chainId: number;\n rpcUrl?: string;\n gasless: GaslessExecutionConfig;\n}): ExecutionClient {\n const runtimeConfig: RuntimeConfig = {\n defaultChainId: params.chainId,\n rpcUrl: params.rpcUrl,\n };\n const { chain, rpcUrl } = resolveChainTransport(params.chainId, runtimeConfig);\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n const relay = new RelayClient({\n baseUrl: params.gasless.relayUrl,\n });\n\n const nonceResolver = async (input: NonceResolverInput): Promise<bigint> => {\n const code = await publicClient.getCode({\n address: params.gasless.account,\n });\n if (!code || code === \"0x\") {\n return 0n;\n }\n\n return publicClient.readContract({\n address: params.gasless.account,\n abi: moneyOSAccountV1Abi,\n functionName: \"getNonce\",\n args: [input.signer, input.nonceKey],\n }) as Promise<bigint>;\n };\n\n return new GaslessExecutor({\n account: params.gasless.account,\n sponsor: params.gasless.sponsor,\n chainId: params.chainId,\n signer: asLocalAccount(params.signer),\n relay,\n nonceResolver,\n nonceKey: params.gasless.nonceKey,\n validityWindowSeconds: params.gasless.validityWindowSeconds,\n });\n}\n","import type { Address } from \"viem\";\n\nexport interface Token {\n symbol: string;\n name: string;\n decimals: number;\n addresses: Record<number, Address>;\n}\n\nexport const NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\n USDC: {\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n addresses: {\n 42161: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n 1: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n 137: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n },\n },\n USDT: {\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n addresses: {\n 42161: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n 1: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n 137: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n },\n },\n WETH: {\n symbol: \"WETH\",\n name: \"Wrapped Ether\",\n decimals: 18,\n addresses: {\n 42161: \"0x82af49447d8a07e3bd95bd0d56f35241523fbab1\",\n 1: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n },\n },\n RYZE: {\n symbol: \"RYZE\",\n name: \"RYZE\",\n decimals: 18,\n addresses: {\n 42161: \"0x7712da72127d5dD213B621497D6E4899d5989e5C\",\n },\n },\n};\n\nexport function getToken(symbol: string): Token | undefined {\n return tokens[symbol.toUpperCase()];\n}\n\nexport function getTokenAddress(\n symbol: string,\n chainId: number,\n): Address | undefined {\n return getToken(symbol)?.addresses[chainId];\n}\n\n/**\n * Return the built-in tokens that have an address on the given chain.\n *\n * Order matches declaration order in the `tokens` record so callers get\n * stable output. Tokens that are not registered on `chainId` are omitted.\n */\nexport function listTokens(chainId: number): Token[] {\n return Object.values(tokens).filter(\n (token) => token.addresses[chainId] !== undefined,\n );\n}\n","import type { Chain } from \"./types.js\";\n\nexport const chains: Record<string, Chain> = {\n arbitrum: {\n id: 42161,\n name: \"Arbitrum One\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://arbiscan.io\",\n },\n ethereum: {\n id: 1,\n name: \"Ethereum\",\n rpcUrl: \"https://ethereum-rpc.publicnode.com\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://etherscan.io\",\n },\n polygon: {\n id: 137,\n name: \"Polygon\",\n rpcUrl: \"https://polygon-bor-rpc.publicnode.com\",\n nativeCurrency: { name: \"POL\", symbol: \"POL\", decimals: 18 },\n blockExplorer: \"https://polygonscan.com\",\n },\n};\n\nexport const defaultChain = chains.arbitrum;\n\nexport function getChain(idOrName: number | string): Chain | undefined {\n if (typeof idOrName === \"number\") {\n return Object.values(chains).find((c) => c.id === idOrName);\n }\n return chains[idOrName.toLowerCase()];\n}\n","export { chains, defaultChain, getChain } from \"@moneyos/core\";\n\nimport type { Chain as ViemChain } from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain as getCoreChain, type RuntimeConfig } from \"@moneyos/core\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nexport function getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\nfunction getSupportedChainLabel(chainId: number): string {\n const chain = getCoreChain(chainId);\n return chain ? `${chainId} (${chain.name})` : String(chainId);\n}\n\nfunction unsupportedChainError(chainId: number): Error {\n const supported = Object.keys(viemChainMap)\n .map(Number)\n .sort((a, b) => a - b)\n .map(getSupportedChainLabel)\n .join(\", \");\n\n return new Error(\n `Unsupported chain ${chainId}. Supported chains: ${supported}.`,\n );\n}\n\nexport function resolveChainTransport(\n chainId: number,\n config: RuntimeConfig,\n): { chain: ViemChain; rpcUrl: string } {\n const chain = getViemChain(chainId);\n const chainInfo = getCoreChain(chainId);\n if (!chain || !chainInfo) {\n throw unsupportedChainError(chainId);\n }\n\n return {\n chain,\n rpcUrl:\n chainId === config.defaultChainId && config.rpcUrl\n ? config.rpcUrl\n : chainInfo.rpcUrl,\n };\n}\n","import {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\nimport { resolveChainTransport } from \"./chains.js\";\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import { Command } from \"commander\";\nimport { listTokens } from \"@moneyos/core\";\nimport { MoneyOS } from \"../../core/client.js\";\nimport { loadConfig } from \"../config.js\";\nimport type { Address } from \"viem\";\nimport { buildCliMoneyOSConfig, loadCliAddress } from \"../wallet.js\";\n\nexport const balanceCommand = new Command(\"balance\")\n .description(\"Check token balance\")\n .argument(\"[token]\", \"Token symbol (e.g. USDC, ETH, RYZE). Omit with --all.\")\n .option(\"-a, --address <address>\", \"Address to check (defaults to your own)\")\n .option(\"-c, --chain <chainId>\", \"Chain ID (default: 42161 Arbitrum)\")\n .option(\"--all\", \"Show balances for every built-in token on the selected chain\")\n .action(async (token: string | undefined, options) => {\n if (options.all && token !== undefined) {\n console.error(\"Cannot combine a token argument with --all.\");\n process.exitCode = 1;\n return;\n }\n if (!options.all && token === undefined) {\n console.error(\"Missing token. Pass a token symbol or use --all.\");\n process.exitCode = 1;\n return;\n }\n\n const config = loadConfig();\n const chainId = options.chain ? parseInt(options.chain) : config.chainId;\n let address = options.address as Address | undefined;\n\n let moneyos: MoneyOS;\n try {\n if (!address) {\n const resolved = await loadCliAddress(config);\n address = resolved.address;\n }\n\n moneyos = new MoneyOS(\n await buildCliMoneyOSConfig(config, {\n chainId: chainId ?? 42161,\n requireSigner: false,\n }),\n );\n } catch (error) {\n console.error(\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n return;\n }\n\n if (options.all) {\n const resolvedChainId = chainId ?? 42161;\n const candidates = listTokens(resolvedChainId);\n if (candidates.length === 0) {\n console.error(\n `No built-in tokens registered on chain ${resolvedChainId}.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const results = await Promise.allSettled(\n candidates.map((t) =>\n moneyos.balance(t.symbol, { address, chainId: resolvedChainId }),\n ),\n );\n\n const width = Math.max(...candidates.map((t) => t.symbol.length));\n let anyFailed = false;\n results.forEach((result, i) => {\n const symbol = candidates[i].symbol.padEnd(width);\n if (result.status === \"fulfilled\") {\n console.log(`${symbol} ${result.value.amount}`);\n } else {\n anyFailed = true;\n const message =\n result.reason instanceof Error\n ? result.reason.message\n : String(result.reason);\n console.log(`${symbol} error: ${message}`);\n }\n });\n if (anyFailed) process.exitCode = 1;\n return;\n }\n\n const result = await moneyos.balance(token as string, {\n address,\n chainId,\n });\n\n console.log(`${result.amount} ${result.symbol}`);\n });\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n defaultChain,\n listTokens,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { DefaultAssetRegistry } from \"./assets.js\";\nimport { NO_SIGNING_ACCOUNT_ERROR } from \"./no-executor.js\";\n\nconst ERC20_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"symbol\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n] as const;\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(NO_SIGNING_ACCOUNT_ERROR);\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\n return {\n token: tokenInfo.name,\n symbol: tokenInfo.symbol,\n amount: formatUnits(raw, tokenInfo.decimals),\n rawAmount: raw,\n decimals: tokenInfo.decimals,\n chainId,\n };\n }\n\n const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\n });\n\n return {\n token: tokenInfo.name,\n symbol: tokenInfo.symbol,\n amount: formatUnits(raw, tokenInfo.decimals),\n rawAmount: raw,\n decimals: tokenInfo.decimals,\n chainId,\n };\n }\n\n /**\n * Read balances for every token the configured asset registry can enumerate\n * on the given chain.\n *\n * Fails fast if any underlying read fails — callers that need partial\n * results should iterate `listTokens(chainId)` and call {@link balance}\n * with their own error handling.\n */\n async balances(\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance[]> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n const candidates =\n this.assets.listTokens?.(chainId) ??\n listTokens(chainId).filter(\n (token) =>\n this.assets.getToken(token.symbol) !== undefined &&\n this.assets.getTokenAddress(token.symbol, chainId) !== undefined,\n );\n return Promise.all(\n candidates.map((token) =>\n this.balance(token.symbol, { address: account, chainId }),\n ),\n );\n }\n\n async send(\n token: string,\n to: Address,\n amount: string,\n options?: { chainId?: number },\n ): Promise<SendResult> {\n const execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n}\n","import {\n getChain,\n getToken,\n getTokenAddress,\n listTokens as listBuiltInTokens,\n NATIVE_TOKEN_ADDRESS,\n type AssetRegistry,\n} from \"@moneyos/core\";\n\nexport class DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n listTokens = listBuiltInTokens;\n getChain = getChain;\n}\n","import type { ExecutionClient, ExecutionResult, CallRequest } from \"@moneyos/core\";\n\nexport const NO_SIGNING_ACCOUNT_ERROR =\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\";\n\nfunction throwNoSigningAccount(): never {\n throw new Error(NO_SIGNING_ACCOUNT_ERROR);\n}\n\nexport function createNoExecutorClient(): ExecutionClient {\n return {\n mode: \"eoa\",\n getAddress(): never {\n return throwNoSigningAccount();\n },\n async send(_call: CallRequest): Promise<ExecutionResult> {\n return throwNoSigningAccount();\n },\n async sendBatch(_calls: CallRequest[]): Promise<ExecutionResult> {\n return throwNoSigningAccount();\n },\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n },\n };\n}\n","import type { ExecutionClient } from \"@moneyos/core\";\nimport {\n getSessionSocketPath,\n getSessionTokenPath,\n} from \"./cli/config.js\";\nimport { getSessionStatus, SessionExecutionClient } from \"./cli/session.js\";\n\nexport interface ConnectLocalSessionOptions {\n socketPath?: string;\n tokenPath?: string;\n}\n\nexport async function connectLocalSession(\n options: ConnectLocalSessionOptions = {},\n): Promise<ExecutionClient> {\n const socketPath = options.socketPath ?? getSessionSocketPath();\n const tokenPath = options.tokenPath ?? getSessionTokenPath();\n const session = await getSessionStatus(socketPath, tokenPath);\n\n if (!session) {\n throw new Error(\n \"No active local MoneyOS session found. Run `moneyos auth unlock` locally first.\",\n );\n }\n\n return new SessionExecutionClient({\n socketPath,\n tokenPath,\n address: session.address,\n mode: session.mode,\n });\n}\n","import type { Address } from \"viem\";\nimport {\n deriveDefaultGaslessAccount,\n getGaslessNetworkDefaults,\n} from \"@moneyos/gasless\";\nimport type { GaslessExecutionConfig } from \"../core/gasless.js\";\nimport type { CLIConfig } from \"./config.js\";\n\nconst GASLESS_ENABLED_ENV = \"MONEYOS_GASLESS_ENABLED\";\nconst GASLESS_RELAY_URL_ENV = \"MONEYOS_GASLESS_RELAY_URL\";\nconst GASLESS_ACCOUNT_ENV = \"MONEYOS_GASLESS_ACCOUNT\";\nconst GASLESS_SPONSOR_ENV = \"MONEYOS_GASLESS_SPONSOR\";\n\nexport const gaslessEnvVarNames = {\n enabled: GASLESS_ENABLED_ENV,\n relayUrl: GASLESS_RELAY_URL_ENV,\n account: GASLESS_ACCOUNT_ENV,\n sponsor: GASLESS_SPONSOR_ENV,\n} as const;\n\nfunction parseGaslessEnabledEnv(value: string): boolean {\n const normalized = value.trim().toLowerCase();\n return [\"1\", \"true\", \"yes\", \"on\"].includes(normalized);\n}\n\nexport function isGaslessEnabled(config: CLIConfig): boolean {\n if (typeof process.env[GASLESS_ENABLED_ENV] === \"string\") {\n return parseGaslessEnabledEnv(process.env[GASLESS_ENABLED_ENV]);\n }\n\n return config.gasless?.enabled === true;\n}\n\nexport function getGaslessRequiredEnvPresence(config: CLIConfig): {\n relayUrl: boolean;\n account: boolean;\n sponsor: boolean;\n} {\n const defaults = config.chainId\n ? getGaslessNetworkDefaults(config.chainId)\n : undefined;\n\n return {\n relayUrl: Boolean(\n process.env[GASLESS_RELAY_URL_ENV] ??\n config.gasless?.relayUrl ??\n defaults?.relayUrl,\n ),\n account: Boolean(process.env[GASLESS_ACCOUNT_ENV] ?? config.gasless?.account),\n sponsor: Boolean(\n process.env[GASLESS_SPONSOR_ENV] ??\n config.gasless?.sponsor ??\n defaults?.sponsor,\n ),\n };\n}\n\nexport async function resolveGaslessExecutionConfig(\n config: CLIConfig,\n options: {\n ownerAddress?: Address;\n rpcUrl?: string;\n chainId?: number;\n } = {},\n): Promise<GaslessExecutionConfig | undefined> {\n if (!isGaslessEnabled(config)) {\n return undefined;\n }\n\n const chainId = options.chainId ?? config.chainId;\n const defaults = chainId ? getGaslessNetworkDefaults(chainId) : undefined;\n const relayUrl =\n process.env[GASLESS_RELAY_URL_ENV] ??\n config.gasless?.relayUrl ??\n defaults?.relayUrl;\n const sponsor =\n (process.env[GASLESS_SPONSOR_ENV] as Address | undefined) ??\n (config.gasless?.sponsor as Address | undefined) ??\n defaults?.sponsor;\n\n let account =\n (process.env[GASLESS_ACCOUNT_ENV] as Address | undefined) ??\n (config.gasless?.account as Address | undefined);\n\n if (!account && chainId && options.ownerAddress) {\n account = await deriveDefaultGaslessAccount({\n chainId,\n owner: options.ownerAddress,\n rpcUrl: options.rpcUrl,\n });\n }\n\n if (!relayUrl || !account || !sponsor) {\n return undefined;\n }\n\n return { relayUrl, account, sponsor };\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport type { Address, Hex } from \"viem\";\nimport { FileEncryptedWalletStore } from \"../core/encrypted-wallet.js\";\nimport { createGaslessExecutionClient } from \"../core/gasless.js\";\nimport { privateKeyToManagedAccount } from \"../core/signer.js\";\nimport {\n getLegacyPlaintextWalletStorageMessage,\n getRemovedOnePasswordStorageMessage,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n hasLegacyPlaintextWalletConfig,\n hasRemovedOnePasswordConfig,\n type CLIConfig,\n} from \"./config.js\";\nimport { connectLocalSession } from \"../local-session.js\";\nimport { isGaslessEnabled, resolveGaslessExecutionConfig } from \"./gasless.js\";\n\nexport type CliWalletBackendKind = \"env\" | \"wallet-file\" | \"session\";\n\nexport interface ResolvedCliAddress {\n kind: \"env\" | \"wallet-file\";\n address: Address;\n source: \"env\" | \"encrypted-wallet\";\n}\n\nexport interface ResolveCliWalletOptions {\n walletPath?: string;\n sessionSocketPath?: string;\n sessionTokenPath?: string;\n envPrivateKey?: Hex;\n}\n\nexport interface BuildCliMoneyOSConfigOptions extends ResolveCliWalletOptions {\n chainId?: number;\n requireSigner?: boolean;\n}\n\nfunction resolveEnvPrivateKey(explicit?: Hex): Hex | undefined {\n return explicit ?? (process.env.MONEYOS_PRIVATE_KEY as Hex | undefined);\n}\n\nfunction getWalletStore(\n config: CLIConfig,\n options: ResolveCliWalletOptions = {},\n): FileEncryptedWalletStore {\n return new FileEncryptedWalletStore(options.walletPath ?? getWalletPath(config));\n}\n\nfunction getSessionPath(options: ResolveCliWalletOptions = {}): string {\n return options.sessionSocketPath ?? getSessionSocketPath();\n}\n\nfunction getTokenPath(options: ResolveCliWalletOptions = {}): string {\n return options.sessionTokenPath ?? getSessionTokenPath();\n}\n\n/**\n * Resolve the address the CLI should use for read-only \"my wallet\" commands.\n *\n * This prefers cheap wallet metadata over any signing path so read-only\n * balance checks do not require an unlocked session.\n */\nexport async function loadCliAddress(\n config: CLIConfig,\n options: ResolveCliWalletOptions = {},\n): Promise<ResolvedCliAddress> {\n const envPrivateKey = resolveEnvPrivateKey(options.envPrivateKey);\n if (envPrivateKey) {\n const signer = privateKeyToManagedAccount(envPrivateKey);\n return {\n kind: \"env\",\n address: signer.address,\n source: \"env\",\n };\n }\n\n if (hasRemovedOnePasswordConfig(config)) {\n throw new Error(getRemovedOnePasswordStorageMessage());\n }\n\n const wallet = getWalletStore(config, options);\n const metadata = await wallet.metadata();\n if (metadata?.address) {\n return {\n kind: \"wallet-file\",\n address: metadata.address,\n source: \"encrypted-wallet\",\n };\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n throw new Error(getLegacyPlaintextWalletStorageMessage());\n }\n\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n}\n\nexport async function buildCliMoneyOSConfig(\n config: CLIConfig,\n options: BuildCliMoneyOSConfigOptions = {},\n): Promise<MoneyOSConfig> {\n const moneyosConfig: MoneyOSConfig = {\n chainId: options.chainId ?? config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n };\n\n if (!options.requireSigner) {\n return moneyosConfig;\n }\n\n const gaslessEnabled = isGaslessEnabled(config);\n\n const envPrivateKey = resolveEnvPrivateKey(options.envPrivateKey);\n if (envPrivateKey) {\n const signer = privateKeyToManagedAccount(envPrivateKey);\n const gasless = await resolveGaslessExecutionConfig(config, {\n ownerAddress: signer.address,\n chainId: moneyosConfig.chainId,\n rpcUrl: moneyosConfig.rpcUrl,\n });\n if (!gasless) {\n if (gaslessEnabled) {\n throw new Error(\n \"Gasless mode is enabled but required environment variables are missing. Set MONEYOS_GASLESS_RELAY_URL, MONEYOS_GASLESS_ACCOUNT, and MONEYOS_GASLESS_SPONSOR.\",\n );\n }\n return {\n ...moneyosConfig,\n signer,\n };\n }\n\n return {\n ...moneyosConfig,\n execute: createGaslessExecutionClient({\n signer,\n chainId: moneyosConfig.chainId,\n rpcUrl: moneyosConfig.rpcUrl,\n gasless,\n }),\n };\n }\n\n if (hasRemovedOnePasswordConfig(config)) {\n throw new Error(getRemovedOnePasswordStorageMessage());\n }\n\n const socketPath = getSessionPath(options);\n const tokenPath = getTokenPath(options);\n try {\n const sessionExecute = await connectLocalSession({\n socketPath,\n tokenPath,\n });\n\n if (gaslessEnabled && sessionExecute.mode !== \"smart-account\") {\n throw new Error(\n \"Gasless mode is enabled, but the active wallet session is still using the EOA executor. Run `moneyos auth unlock` again.\",\n );\n }\n\n if (!gaslessEnabled && sessionExecute.mode === \"smart-account\") {\n throw new Error(\n \"Gasless mode is disabled, but the active wallet session is still gasless. Run `moneyos auth unlock` again.\",\n );\n }\n\n return {\n ...moneyosConfig,\n execute: sessionExecute,\n };\n } catch (error) {\n if (error instanceof Error && /active wallet session is still/.test(error.message)) {\n throw error;\n }\n // Fall through so the CLI preserves the current locked-wallet error path.\n }\n\n const wallet = getWalletStore(config, options);\n if (wallet.exists()) {\n throw new Error(\n \"Wallet is locked. Run `moneyos auth unlock` locally before using write commands.\",\n );\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n throw new Error(getLegacyPlaintextWalletStorageMessage());\n }\n\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n}\n","import { Command } from \"commander\";\nimport { getChain } from \"@moneyos/core\";\nimport type { Address } from \"viem\";\nimport { isAddress } from \"viem\";\nimport { MoneyOS } from \"../../core/client.js\";\nimport { loadConfig } from \"../config.js\";\nimport { resolveContact } from \"../contacts.js\";\nimport { buildCliMoneyOSConfig } from \"../wallet.js\";\n\nexport function resolveSendRecipient(input: string): Address {\n if (isAddress(input)) {\n return input as Address;\n }\n\n const contact = resolveContact(input);\n if (contact) {\n console.log(`Resolved ${input} → ${contact}`);\n return contact;\n }\n\n throw new Error(\n `Could not resolve \"${input}\". Use a 0x address or add a contact with \"moneyos contact set ${input} 0x...\".`,\n );\n}\n\nexport const sendCommand = new Command(\"send\")\n .description(\"Send tokens to an address or a saved contact name\")\n .argument(\"<amount>\", \"Amount to send (e.g. 10)\")\n .argument(\"<token>\", \"Token symbol (e.g. USDC, ETH, RYZE)\")\n .argument(\"<to>\", \"Recipient address (0x...) or saved contact name\")\n .option(\"-c, --chain <chainId>\", \"Chain ID (default: 42161 Arbitrum)\")\n .action(async (amount: string, token: string, to: string, options) => {\n const config = loadConfig();\n\n const chainId = options.chain\n ? parseInt(options.chain)\n : config.chainId ?? 42161;\n\n let recipient: Address;\n try {\n recipient = resolveSendRecipient(to);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n return;\n }\n\n let moneyos: MoneyOS;\n try {\n moneyos = new MoneyOS(\n await buildCliMoneyOSConfig(config, {\n chainId,\n requireSigner: true,\n }),\n );\n } catch (error) {\n console.error(\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n return;\n }\n\n const chain = getChain(chainId);\n console.log(\n `Sending ${amount} ${token.toUpperCase()} to ${recipient} on ${chain?.name ?? chainId}...`,\n );\n\n const result = await moneyos.send(token, recipient, amount, {\n chainId,\n });\n\n console.log(`Sent. tx: ${result.hash}`);\n });\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { Address } from \"viem\";\nimport { getAddress, isAddress } from \"viem\";\nimport { getContactsPath } from \"./config.js\";\n\n/**\n * Local, per-user address book stored at `~/.moneyos/contacts.json`.\n *\n * Flat `name → address` mapping. No shared namespace, no network access, no\n * resolver abstraction — see issue #89. Names are case-sensitive.\n */\nexport type ContactsFile = Record<string, Address>;\n\nconst NAME_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function validateContactName(name: string): string {\n if (typeof name !== \"string\") {\n throw new Error(\"Contact name must be a string.\");\n }\n const trimmed = name.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Contact name cannot be empty.\");\n }\n if (trimmed.includes(\":\")) {\n throw new Error(\n \"Contact name cannot contain ':' (reserved for future resolver prefixes).\",\n );\n }\n if (!NAME_PATTERN.test(trimmed)) {\n throw new Error(\n \"Contact name may only contain letters, numbers, dots, dashes, and underscores.\",\n );\n }\n if (isAddress(trimmed)) {\n throw new Error(\"Contact name cannot look like an Ethereum address.\");\n }\n return trimmed;\n}\n\nexport function validateContactAddress(address: string): Address {\n if (typeof address !== \"string\" || !isAddress(address)) {\n throw new Error(`\"${address}\" is not a valid Ethereum address.`);\n }\n return getAddress(address);\n}\n\nconst FILE_MODE = 0o600;\nconst DIR_MODE = 0o700;\n\nfunction shouldEnforcePosixPermissions(): boolean {\n return process.platform !== \"win32\";\n}\n\nfunction hasOwn(record: ContactsFile, name: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, name);\n}\n\nexport function loadContacts(path: string = getContactsPath()): ContactsFile {\n if (!existsSync(path)) {\n return {};\n }\n\n const raw = readFileSync(path, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Contacts file at ${path} is not valid JSON.`);\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Contacts file at ${path} must be a JSON object.`);\n }\n\n return parsed as ContactsFile;\n}\n\nexport function saveContacts(\n contacts: ContactsFile,\n path: string = getContactsPath(),\n): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: DIR_MODE });\n }\n writeFileSync(path, `${JSON.stringify(contacts, null, 2)}\\n`, {\n mode: FILE_MODE,\n });\n // `writeFileSync`'s `mode` option only applies on create. Enforce the mode\n // explicitly on overwrite so the file never drifts back to 0644, matching\n // the pattern used in src/cli/session.ts for the session token.\n if (shouldEnforcePosixPermissions()) {\n chmodSync(path, FILE_MODE);\n }\n}\n\nexport interface SavedContact {\n name: string;\n address: Address;\n}\n\nexport function setContact(\n name: string,\n address: string,\n path?: string,\n): SavedContact {\n const normalizedName = validateContactName(name);\n const normalizedAddress = validateContactAddress(address);\n const contacts = loadContacts(path);\n contacts[normalizedName] = normalizedAddress;\n saveContacts(contacts, path);\n return { name: normalizedName, address: normalizedAddress };\n}\n\nexport function removeContact(name: string, path?: string): boolean {\n const normalizedName = validateContactName(name);\n const contacts = loadContacts(path);\n if (!hasOwn(contacts, normalizedName)) {\n return false;\n }\n delete contacts[normalizedName];\n saveContacts(contacts, path);\n return true;\n}\n\nexport function listContacts(path?: string): SavedContact[] {\n const contacts = loadContacts(path);\n return Object.entries(contacts)\n .map(([name, address]) => ({ name, address: address as Address }))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Look up a name in the local contacts file.\n *\n * Returns `undefined` if the name is not found. Does not throw on bad input —\n * callers are expected to handle missing contacts as \"not a contact, try\n * something else.\"\n *\n * Uses an own-property check so names that collide with Object prototype\n * members (e.g. `toString`, `constructor`) do not silently resolve to\n * inherited values.\n */\nexport function resolveContact(\n name: string,\n path?: string,\n): Address | undefined {\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const contacts = loadContacts(path);\n if (!hasOwn(contacts, name)) {\n return undefined;\n }\n return contacts[name];\n}\n","import { Command } from \"commander\";\nimport {\n loadFileConfig,\n} from \"../config.js\";\nimport {\n formatWalletStatus,\n resolveWalletStatus,\n} from \"../wallet-status.js\";\n\nexport const keystoreCommand = new Command(\"keystore\").description(\n \"Compatibility alias for wallet status\",\n);\n\nkeystoreCommand\n .command(\"status\")\n .description(\"Show the current wallet storage status\")\n .action(async () => {\n const config = loadFileConfig();\n const status = await resolveWalletStatus(config);\n console.log(formatWalletStatus(status));\n });\n","import type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { FileEncryptedWalletStore } from \"../core/encrypted-wallet.js\";\nimport {\n getLegacyPlaintextWalletStorageMessage,\n getRemovedOnePasswordCachedAddress,\n getRemovedOnePasswordStorageMessage,\n getWalletPath,\n hasLegacyPlaintextWalletConfig,\n hasRemovedOnePasswordConfig,\n type CLIConfig,\n} from \"./config.js\";\n\nexport type WalletStatusKind =\n | \"encrypted\"\n | \"none\"\n | \"legacy\"\n | \"unsupported\"\n | \"invalid\";\n\nexport interface ResolvedWalletStatus {\n kind: WalletStatusKind;\n address?: Address;\n walletPath: string;\n reason?: string;\n}\n\nexport async function resolveWalletStatus(\n config: CLIConfig,\n walletPath: string = getWalletPath(config),\n): Promise<ResolvedWalletStatus> {\n if (hasRemovedOnePasswordConfig(config)) {\n return {\n kind: \"unsupported\",\n address: getRemovedOnePasswordCachedAddress(config),\n walletPath,\n reason: getRemovedOnePasswordStorageMessage(),\n };\n }\n\n const store = new FileEncryptedWalletStore(walletPath);\n if (store.exists()) {\n try {\n const metadata = await store.metadata();\n return {\n kind: metadata ? \"encrypted\" : \"none\",\n address: metadata?.address,\n walletPath,\n };\n } catch (error) {\n return {\n kind: \"invalid\",\n walletPath,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n try {\n const address = privateKeyToAccount(config.privateKey!).address;\n return {\n kind: \"legacy\",\n walletPath,\n address,\n reason: getLegacyPlaintextWalletStorageMessage(),\n };\n } catch (error) {\n return {\n kind: \"legacy\",\n walletPath,\n reason:\n error instanceof Error\n ? `${getLegacyPlaintextWalletStorageMessage()} (${error.message})`\n : getLegacyPlaintextWalletStorageMessage(),\n };\n }\n }\n\n return {\n kind: \"none\",\n walletPath,\n };\n}\n\nexport function formatWalletStatus(status: ResolvedWalletStatus): string {\n const lines: string[] = [];\n\n if (status.kind === \"none\") {\n lines.push(\"Wallet: (none)\");\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\"Status: no wallet configured — run `moneyos init`\");\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"unsupported\") {\n lines.push(\"Wallet: removed legacy model\");\n if (status.address) {\n lines.push(`Address: ${status.address} (cached metadata)`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\n `Status: removed — ${status.reason ?? \"unsupported legacy config\"}`,\n );\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"legacy\") {\n lines.push(\"Wallet: legacy plaintext config\");\n if (status.address) {\n lines.push(`Address: ${status.address}`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\n `Status: upgrade required — ${status.reason ?? 'run `moneyos init`'}`,\n );\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"invalid\") {\n lines.push(\"Wallet: encrypted local wallet\");\n lines.push(`Path: ${status.walletPath}`);\n lines.push(`Status: invalid — ${status.reason ?? \"wallet file is unreadable\"}`);\n return lines.join(\"\\n\");\n }\n\n lines.push(\"Wallet: encrypted local wallet\");\n if (status.address) {\n lines.push(`Address: ${status.address}`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\"Status: ready\");\n return lines.join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletStore,\n} from \"../../core/encrypted-wallet.js\";\nimport {\n type CLIConfig,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n loadFileConfig,\n} from \"../config.js\";\nimport { resolveGaslessExecutionConfig } from \"../gasless.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport {\n getSessionStatus,\n lockSession,\n startDetachedSessionDaemon,\n} from \"../session.js\";\n\nconst DEFAULT_TTL_MS = 15 * 60 * 1000;\n\nfunction formatSessionStatus(params: {\n state: \"locked\" | \"unlocked\";\n address?: string;\n expiresAt?: string;\n mode?: \"eoa\" | \"smart-account\" | \"delegated\";\n}): string {\n const lines: string[] = [];\n lines.push(`Session: ${params.state}`);\n if (params.address) {\n lines.push(`Address: ${params.address}`);\n }\n if (params.expiresAt) {\n lines.push(`Expires: ${params.expiresAt}`);\n }\n if (params.mode) {\n lines.push(`Executor: ${params.mode}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport interface ChangePasswordCommandDependencies {\n loadFileConfig: () => CLIConfig;\n getWalletPath: (config?: CLIConfig) => string;\n createWalletStore: (walletPath: string) => EncryptedWalletStore;\n promptHidden: (question: string) => Promise<string>;\n lockSession: (socketPath: string, tokenPath: string) => Promise<boolean>;\n getSessionSocketPath: () => string;\n getSessionTokenPath: () => string;\n log: (message: string) => void;\n error: (message: string) => void;\n}\n\nconst defaultChangePasswordCommandDependencies: ChangePasswordCommandDependencies = {\n loadFileConfig,\n getWalletPath,\n createWalletStore: (walletPath) => new FileEncryptedWalletStore(walletPath),\n promptHidden,\n lockSession,\n getSessionSocketPath,\n getSessionTokenPath,\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n};\n\nexport async function runChangePasswordCommand(\n deps: ChangePasswordCommandDependencies = defaultChangePasswordCommandDependencies,\n): Promise<void> {\n const config = deps.loadFileConfig();\n const walletPath = deps.getWalletPath(config);\n const wallet = deps.createWalletStore(walletPath);\n\n if (!wallet.exists()) {\n deps.error(\"No encrypted wallet found. Run `moneyos init` first.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const currentPassphrase = await deps.promptHidden(\"Current wallet password: \");\n if (currentPassphrase.length === 0) {\n throw new Error(\"Current wallet password cannot be empty.\");\n }\n\n const newPassphrase = await deps.promptHidden(\"New wallet password: \");\n if (newPassphrase.length < 8) {\n throw new Error(\"New wallet password must be at least 8 characters long.\");\n }\n if (newPassphrase === currentPassphrase) {\n throw new Error(\n \"New wallet password must differ from the current password.\",\n );\n }\n\n const confirmPassphrase = await deps.promptHidden(\n \"Confirm new wallet password: \",\n );\n if (newPassphrase !== confirmPassphrase) {\n throw new Error(\"New wallet password confirmation did not match.\");\n }\n\n const metadata = await wallet.rotatePassphrase({\n oldPassphrase: currentPassphrase,\n newPassphrase,\n });\n await deps.lockSession(\n deps.getSessionSocketPath(),\n deps.getSessionTokenPath(),\n );\n\n deps.log(\"Wallet password changed.\");\n deps.log(`Address: ${metadata.address}`);\n deps.log(formatSessionStatus({ state: \"locked\" }));\n deps.log(\n \"Existing backup files and exported copies still require the old wallet password.\",\n );\n deps.log(\n \"Run `moneyos backup export` to create a backup encrypted with the new wallet password.\",\n );\n } catch (error) {\n deps.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n}\n\nexport const authCommand = new Command(\"auth\").description(\n \"Unlock, inspect, lock, and change the local MoneyOS wallet password\",\n);\n\nauthCommand\n .command(\"unlock\")\n .description(\"Unlock the local wallet and start a short-lived session\")\n .action(async () => {\n const config = loadFileConfig();\n const walletPath = getWalletPath(config);\n const wallet = new FileEncryptedWalletStore(walletPath);\n\n if (!wallet.exists()) {\n console.error(\"No encrypted wallet found. Run `moneyos init` first.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const passphrase = await promptHidden(\"Wallet password: \");\n if (passphrase.length === 0) {\n throw new Error(\"Wallet password cannot be empty.\");\n }\n\n const privateKey = await wallet.decrypt(passphrase);\n const ownerAddress = privateKeyToAccount(privateKey).address;\n const gasless = await resolveGaslessExecutionConfig(config, {\n ownerAddress,\n chainId: config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n });\n const status = await startDetachedSessionDaemon({\n type: \"start\",\n privateKey,\n chainId: config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n socketPath: getSessionSocketPath(),\n tokenPath: getSessionTokenPath(),\n ttlMs: DEFAULT_TTL_MS,\n gasless: gasless\n ? {\n account: gasless.account,\n sponsor: gasless.sponsor,\n relayUrl: gasless.relayUrl,\n nonceKey: gasless.nonceKey?.toString(),\n validityWindowSeconds: gasless.validityWindowSeconds,\n }\n : undefined,\n });\n\n console.log(\"Wallet unlocked.\");\n console.log(\n formatSessionStatus({\n state: \"unlocked\",\n address: status.address,\n expiresAt: status.expiresAt,\n mode: status.mode,\n }),\n );\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nauthCommand\n .command(\"change-password\")\n .description(\"Change the local wallet password and lock the current session\")\n .action(async () => {\n await runChangePasswordCommand();\n });\n\nauthCommand\n .command(\"lock\")\n .description(\"Lock the local MoneyOS wallet session\")\n .action(async () => {\n const locked = await lockSession(\n getSessionSocketPath(),\n getSessionTokenPath(),\n );\n console.log(\n formatSessionStatus({\n state: \"locked\",\n }),\n );\n if (!locked) {\n console.log(\"No active local session was running.\");\n }\n });\n\nauthCommand\n .command(\"status\")\n .description(\"Show whether the local wallet session is unlocked\")\n .action(async () => {\n const status = await getSessionStatus(\n getSessionSocketPath(),\n getSessionTokenPath(),\n );\n if (!status) {\n console.log(\n formatSessionStatus({\n state: \"locked\",\n }),\n );\n return;\n }\n\n console.log(\n formatSessionStatus({\n state: \"unlocked\",\n address: status.address,\n expiresAt: status.expiresAt,\n mode: status.mode,\n }),\n );\n });\n","import { Command } from \"commander\";\nimport { FileBackupProvider } from \"../../core/backup-file.js\";\nimport {\n getBackupDir,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n loadFileConfig,\n} from \"../config.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport { lockSession } from \"../session.js\";\n\nfunction formatBackupStatus(params: {\n walletPath: string;\n backupDir: string;\n exists: boolean;\n backupCount: number;\n latestBackupPath?: string;\n address?: string;\n}): string {\n const lines: string[] = [];\n lines.push(`Wallet: ${params.exists ? \"present\" : \"missing\"}`);\n if (params.address) {\n lines.push(`Address: ${params.address}`);\n }\n lines.push(`Wallet at: ${params.walletPath}`);\n lines.push(`Backups: ${params.backupCount}`);\n lines.push(`Directory: ${params.backupDir}`);\n if (params.latestBackupPath) {\n lines.push(`Latest: ${params.latestBackupPath}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function getBackupExportPasswordGuidance(): string {\n return [\n \"This backup is encrypted with the same wallet password as your active wallet.\",\n \"You will need that same wallet password to restore it.\",\n \"MoneyOS does not store or sync it for you.\",\n ].join(\" \");\n}\n\nexport const backupCommand = new Command(\"backup\").description(\n \"Export, restore, and inspect encrypted wallet backups\",\n);\n\nbackupCommand\n .command(\"export\")\n .description(\"Write a copy of the encrypted wallet backup\")\n .option(\"-o, --out <path>\", \"Custom path for the backup file\")\n .option(\"--force\", \"Overwrite an existing backup file at --out\")\n .action(async (options) => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n\n try {\n const targetPath = await provider.exportWallet({\n outPath: options.out,\n allowOverwrite: Boolean(options.force),\n });\n console.log(`Backup exported to ${targetPath}`);\n console.log(getBackupExportPasswordGuidance());\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nbackupCommand\n .command(\"restore\")\n .description(\"Restore the encrypted wallet from a backup file\")\n .argument(\"<path>\", \"Path to the encrypted backup file\")\n .option(\"--force\", \"Overwrite an existing encrypted wallet\")\n .action(async (path: string, options) => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n\n try {\n const passphrase = await promptHidden(\n \"Wallet password for backup verification: \",\n );\n const metadata = await provider.restoreWallet(path, {\n passphrase,\n allowOverwrite: Boolean(options.force),\n });\n await lockSession(getSessionSocketPath(), getSessionTokenPath());\n console.log(\"Encrypted wallet restored.\");\n console.log(`Address: ${metadata.address}`);\n console.log(`Wallet: ${getWalletPath(config)}`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nbackupCommand\n .command(\"status\")\n .description(\"Show the local wallet backup status\")\n .action(async () => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n const status = await provider.status();\n console.log(formatBackupStatus(status));\n });\n","import { Command } from \"commander\";\nimport { listContacts, removeContact, setContact } from \"../contacts.js\";\n\nexport const contactCommand = new Command(\"contact\").description(\n \"Manage the local contacts address book\",\n);\n\ncontactCommand\n .command(\"set\")\n .description(\"Add or overwrite a contact\")\n .argument(\"<name>\", \"Contact name (e.g. dad)\")\n .argument(\"<address>\", \"Ethereum address (0x...)\")\n .action((name: string, address: string) => {\n try {\n const saved = setContact(name, address);\n console.log(`Saved contact ${saved.name} → ${saved.address}`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\ncontactCommand\n .command(\"list\")\n .description(\"List all saved contacts\")\n .action(() => {\n try {\n const entries = listContacts();\n if (entries.length === 0) {\n console.log(\n 'No contacts saved. Add one with \"moneyos contact set <name> <address>\".',\n );\n return;\n }\n const width = Math.max(...entries.map((e) => e.name.length));\n for (const { name, address } of entries) {\n console.log(`${name.padEnd(width)} ${address}`);\n }\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\ncontactCommand\n .command(\"remove\")\n .description(\"Remove a saved contact\")\n .argument(\"<name>\", \"Contact name to remove\")\n .action((name: string) => {\n try {\n const removed = removeContact(name);\n if (!removed) {\n console.error(`No contact named \"${name}\".`);\n process.exitCode = 1;\n return;\n }\n console.log(`Removed contact ${name}.`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n","import { Command } from \"commander\";\nimport { getGaslessNetworkDefaults } from \"@moneyos/gasless\";\nimport {\n getConfigPath,\n getSessionSocketPath,\n getSessionTokenPath,\n loadFileConfig,\n saveConfig,\n} from \"../config.js\";\nimport {\n gaslessEnvVarNames,\n getGaslessRequiredEnvPresence,\n isGaslessEnabled,\n resolveGaslessExecutionConfig,\n} from \"../gasless.js\";\nimport { lockSession } from \"../session.js\";\nimport { loadCliAddress } from \"../wallet.js\";\n\nfunction formatEnabled(enabled: boolean): string {\n return enabled ? \"enabled\" : \"disabled\";\n}\n\nasync function refreshSessionAfterToggle(): Promise<void> {\n const locked = await lockSession(getSessionSocketPath(), getSessionTokenPath());\n if (locked) {\n console.log(\n \"Active wallet session locked so the new gasless mode takes effect on next `moneyos auth unlock`.\",\n );\n return;\n }\n\n console.log(\"No active wallet session was running.\");\n}\n\nasync function runGaslessToggle(enabled: boolean): Promise<void> {\n const config = loadFileConfig();\n const previous = config.gasless?.enabled === true;\n let nextGasless = {\n ...config.gasless,\n enabled,\n };\n\n if (enabled) {\n const enabledConfig = {\n ...config,\n gasless: {\n ...config.gasless,\n enabled: true,\n },\n };\n const ownerAddress = (await loadCliAddress(config)).address;\n const defaults = config.chainId\n ? getGaslessNetworkDefaults(config.chainId)\n : undefined;\n const derived = ownerAddress\n ? await resolveGaslessExecutionConfig(enabledConfig, {\n ownerAddress,\n chainId: config.chainId,\n rpcUrl: config.rpcUrl ?? defaults?.rpcUrl,\n })\n : undefined;\n\n nextGasless = {\n ...nextGasless,\n relayUrl: nextGasless.relayUrl ?? derived?.relayUrl ?? defaults?.relayUrl,\n sponsor: nextGasless.sponsor ?? derived?.sponsor ?? defaults?.sponsor,\n account: nextGasless.account ?? derived?.account,\n };\n }\n\n if (previous === enabled) {\n console.log(`Gasless is already ${formatEnabled(enabled)}.`);\n } else {\n console.log(`Gasless ${formatEnabled(enabled)} in ${getConfigPath()}.`);\n }\n\n saveConfig({\n ...config,\n gasless: nextGasless,\n });\n\n if (enabled) {\n const missing = Object.entries(getGaslessRequiredEnvPresence({\n ...config,\n gasless: nextGasless,\n }))\n .filter(([, present]) => !present)\n .map(([key]) => key);\n\n if (missing.length > 0) {\n console.log(\n `Warning: gasless is enabled, but these values are still missing: ${missing.join(\", \")}.`,\n );\n }\n }\n\n await refreshSessionAfterToggle();\n}\n\nasync function runGaslessStatus(): Promise<void> {\n const config = loadFileConfig();\n const enabled = isGaslessEnabled(config);\n const envPresence = getGaslessRequiredEnvPresence(config);\n const missing = Object.entries(envPresence)\n .filter(([, present]) => !present)\n .map(([key]) => key);\n\n console.log(`Gasless: ${formatEnabled(enabled)}`);\n if (process.env[gaslessEnvVarNames.enabled] !== undefined) {\n console.log(`Mode source: ${gaslessEnvVarNames.enabled} environment override`);\n }\n\n console.log(\n `${gaslessEnvVarNames.relayUrl}: ${envPresence.relayUrl ? \"set\" : \"missing\"}`,\n );\n console.log(\n `${gaslessEnvVarNames.account}: ${envPresence.account ? \"set\" : \"missing\"}`,\n );\n console.log(\n `${gaslessEnvVarNames.sponsor}: ${envPresence.sponsor ? \"set\" : \"missing\"}`,\n );\n\n if (enabled && missing.length > 0) {\n console.log(\n `Gasless is enabled but not runnable until missing values are set: ${missing.join(\", \")}.`,\n );\n process.exitCode = 1;\n }\n}\n\nexport const gaslessCommand = new Command(\"gasless\")\n .description(\"Inspect and toggle gasless execution mode\")\n .addCommand(\n new Command(\"status\")\n .description(\"Show whether gasless mode is enabled and whether required config is present\")\n .action(async () => {\n await runGaslessStatus();\n }),\n )\n .addCommand(\n new Command(\"enable\")\n .description(\"Enable gasless execution mode and persist chain defaults when available\")\n .action(async () => {\n await runGaslessToggle(true);\n }),\n )\n .addCommand(\n new Command(\"disable\")\n .description(\"Disable gasless execution mode and use the EOA executor\")\n .action(async () => {\n await runGaslessToggle(false);\n }),\n );\n","import { Command } from \"commander\";\nimport {\n createCliToolManager,\n formatToolStatusTable,\n formatToolUpdateTable,\n type ToolUpdateResult,\n} from \"../tools/manager.js\";\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatToolUpdateOutput(results: ToolUpdateResult[]): string {\n if (results.length === 0) return \"No tools installed.\";\n const visible = results.filter((result) => result.state !== \"up-to-date\");\n if (visible.length === 0) return \"All installed tools are up to date.\";\n return formatToolUpdateTable(visible);\n}\n\nexport function createAddToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"add\")\n .description(\"Install or update a MoneyOS CLI tool into the user tool home\")\n .argument(\"<tool>\", \"Tool alias or npm package spec\")\n .action(async (tool: string) => {\n try {\n const entry = await toolManager.addTool(tool);\n console.log(\n `Installed ${entry.packageName}@${entry.packageVersion} as \\`moneyos ${entry.commandPath.join(\" \")}\\`.`,\n );\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createRemoveToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"remove\")\n .description(\"Remove an installed MoneyOS CLI tool from the user tool home\")\n .argument(\"<tool>\", \"Installed tool name, command path, or npm package\")\n .action(async (tool: string) => {\n try {\n const entry = await toolManager.removeTool(tool);\n console.log(\n `Removed ${entry.packageName} from \\`moneyos ${entry.commandPath.join(\" \")}\\`.`,\n );\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createUpdateToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"update\")\n .description(\"Update installed MoneyOS CLI tools in the user tool home\")\n .argument(\"[tool]\", \"Installed tool name, command path, or npm package\")\n .option(\"--check\", \"Show what would update without applying changes\")\n .action(async (tool: string | undefined, options: { check?: boolean }) => {\n try {\n const results = await toolManager.updateTools({\n tool,\n check: options.check === true,\n });\n console.log(formatToolUpdateOutput(results));\n if (\n results.some(\n (result) =>\n result.state === \"failed\" || result.state === \"broken\",\n )\n ) {\n process.exitCode = 1;\n }\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createToolsCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"tools\")\n .description(\"List installed MoneyOS CLI tools from the registry\")\n .action(async () => {\n try {\n console.log(formatToolStatusTable(await toolManager.listTools()));\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport type { MoneyOSCliContext, MoneyOSCliTool } from \"../../cli-tool.js\";\nimport { getToolHomeDir, getToolHomePackageJsonPath, getToolRegistryPath } from \"../config.js\";\nimport { createMoneyOSCliContext } from \"./runtime.js\";\n\nconst SUPPORTED_CLI_TOOL_VERSION = 1 as const;\nconst DEFAULT_RESERVED_ROOT_COMMANDS = new Set([\"init\", \"auth\", \"backup\", \"balance\", \"send\", \"keystore\", \"add\", \"remove\", \"update\", \"tools\", \"help\", \"__session-daemon\"]);\nconst FIRST_PARTY_TOOL_ALIASES: Record<string, string> = { swap: \"@moneyos/swap\" };\nconst VALID_COMMAND_SEGMENT = /^[A-Za-z0-9][A-Za-z0-9-]*$/;\n\nexport interface ToolRegistryEntry {\n packageName: string;\n packageVersion: string;\n toolVersion: 1;\n name: string;\n commandPath: string[];\n description: string;\n}\n\ntype ToolStatus = ToolRegistryEntry & { state: \"ok\" | \"broken\" | \"conflict\"; problems: string[] };\ntype Paths = { rootDir: string; packageJsonPath: string; registryPath: string };\ntype LoadedTool = ToolRegistryEntry & { createCommand: MoneyOSCliTool[\"createCommand\"] };\ntype LoadedToolSource = {\n packageName: string;\n packageVersion: string;\n cliTool: unknown;\n};\ntype SharedToolHomeDependencies = Record<string, string>;\ntype RootPackageMetadata = {\n dependencies?: Record<string, string>;\n moneyos?: {\n toolHomeDependencies?: Record<string, string>;\n };\n};\n\nexport interface ToolUpdateResult {\n current: ToolRegistryEntry;\n next?: ToolRegistryEntry;\n state: \"up-to-date\" | \"would-update\" | \"updated\" | \"skipped\" | \"failed\" | \"broken\";\n reason?: string;\n}\n\nclass UnsupportedToolContractVersionError extends Error {\n readonly packageName: string;\n readonly packageVersion: string;\n readonly actualVersion: number;\n readonly expectedVersion: number;\n\n constructor(\n packageName: string,\n packageVersion: string,\n actualVersion: number,\n expectedVersion: number = SUPPORTED_CLI_TOOL_VERSION,\n ) {\n super(\n `Package ${packageName}@${packageVersion} exports unsupported moneyosCliTool.version ${actualVersion}. Expected ${expectedVersion}.`,\n );\n this.name = \"UnsupportedToolContractVersionError\";\n this.packageName = packageName;\n this.packageVersion = packageVersion;\n this.actualVersion = actualVersion;\n this.expectedVersion = expectedVersion;\n }\n}\n\nconst getPaths = (): Paths => ({\n rootDir: getToolHomeDir(),\n packageJsonPath: getToolHomePackageJsonPath(),\n registryPath: getToolRegistryPath(),\n});\n\nfunction findRootPackageJsonPath(): string {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n while (true) {\n const candidate = join(currentDir, \"package.json\");\n if (existsSync(candidate)) {\n const packageJson = JSON.parse(readFileSync(candidate, \"utf8\")) as { name?: string };\n if (packageJson.name === \"moneyos\") return candidate;\n }\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n throw new Error(\"Could not find the root moneyos package.json.\");\n }\n currentDir = parentDir;\n }\n}\n\nfunction getSharedToolHomeDependencies(): SharedToolHomeDependencies {\n const rootPackageJsonPath = findRootPackageJsonPath();\n const packageJson = JSON.parse(readFileSync(rootPackageJsonPath, \"utf8\")) as RootPackageMetadata;\n const coreVersion = packageJson.moneyos?.toolHomeDependencies?.[\"@moneyos/core\"];\n const viemVersion = packageJson.dependencies?.viem;\n if (typeof coreVersion !== \"string\" || typeof viemVersion !== \"string\") {\n throw new Error(`Root package metadata at ${rootPackageJsonPath} is missing tool-home dependency versions.`);\n }\n return { \"@moneyos/core\": coreVersion, viem: viemVersion };\n}\n\nfunction collectReservedRootCommandNames(program: Command): Set<string> {\n return new Set([\n \"help\",\n ...program.commands.flatMap((command) => [command.name(), ...command.aliases()]),\n ]);\n}\n\nfunction ensureToolHome(paths: Paths, sharedToolHomeDependencies: SharedToolHomeDependencies): void {\n if (!existsSync(paths.rootDir)) mkdirSync(paths.rootDir, { recursive: true, mode: 0o700 });\n const exists = existsSync(paths.packageJsonPath);\n const parsed = exists\n ? JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as {\n name?: string;\n private?: boolean;\n description?: string;\n dependencies?: Record<string, string>;\n }\n : undefined;\n const packageJson = {\n name: parsed?.name ?? \"moneyos-tools\",\n private: parsed?.private ?? true,\n description: parsed?.description ?? \"User-level installed MoneyOS CLI tools\",\n dependencies: { ...(parsed?.dependencies ?? {}) },\n };\n let changed = !exists;\n for (const [name, version] of Object.entries(sharedToolHomeDependencies)) {\n if (packageJson.dependencies[name] !== version) {\n packageJson.dependencies[name] = version;\n changed = true;\n }\n }\n if (changed) writeFileSync(paths.packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, { mode: 0o600 });\n if (!existsSync(paths.registryPath)) writeFileSync(paths.registryPath, \"[]\\n\", { mode: 0o600 });\n}\n\nfunction parseRegistryEntry(value: unknown): ToolRegistryEntry {\n if (typeof value !== \"object\" || value === null) throw new Error(\"Invalid tool registry entry.\");\n const entry = value as Partial<ToolRegistryEntry>;\n if (\n typeof entry.packageName !== \"string\"\n || typeof entry.packageVersion !== \"string\"\n || entry.toolVersion !== 1\n || typeof entry.name !== \"string\"\n || typeof entry.description !== \"string\"\n || !Array.isArray(entry.commandPath)\n || entry.commandPath.length === 0\n || entry.commandPath.some((segment) => typeof segment !== \"string\" || !VALID_COMMAND_SEGMENT.test(segment))\n ) throw new Error(\"Invalid tool registry entry.\");\n return { packageName: entry.packageName, packageVersion: entry.packageVersion, toolVersion: 1, name: entry.name, commandPath: [...entry.commandPath], description: entry.description };\n}\n\nfunction parseLoadedTool(packageName: string, packageVersion: string, value: unknown): LoadedTool {\n if (typeof value !== \"object\" || value === null) throw new Error(`Package ${packageName} does not export \\`moneyosCliTool\\`.`);\n const tool = value as Partial<MoneyOSCliTool>;\n if (tool.version !== SUPPORTED_CLI_TOOL_VERSION) {\n if (typeof tool.version === \"number\") {\n throw new UnsupportedToolContractVersionError(\n packageName,\n packageVersion,\n tool.version,\n );\n }\n throw new Error(\n `Package ${packageName}@${packageVersion} exports an invalid \\`moneyosCliTool\\`.`,\n );\n }\n if (\n typeof tool.name !== \"string\"\n || typeof tool.description !== \"string\"\n || !Array.isArray(tool.commandPath)\n || tool.commandPath.length === 0\n || tool.commandPath.some((segment) => typeof segment !== \"string\" || !VALID_COMMAND_SEGMENT.test(segment))\n || typeof tool.createCommand !== \"function\"\n ) throw new Error(`Package ${packageName}@${packageVersion} exports an invalid \\`moneyosCliTool\\`.`);\n return {\n packageName,\n packageVersion,\n toolVersion: SUPPORTED_CLI_TOOL_VERSION,\n name: tool.name,\n commandPath: [...tool.commandPath],\n description: tool.description,\n createCommand: tool.createCommand,\n };\n}\n\nfunction getConflict(entry: ToolRegistryEntry, entries: ToolRegistryEntry[], reservedRootCommands: Set<string>): string | undefined {\n const path = entry.commandPath.join(\" \");\n if (reservedRootCommands.has(entry.name) || reservedRootCommands.has(entry.commandPath[0])) {\n return `reserved root command collision for ${path}`;\n }\n for (const other of entries) {\n if (other.packageName === entry.packageName) continue;\n const otherPath = other.commandPath.join(\" \");\n if (path === otherPath || path.startsWith(`${otherPath} `) || otherPath.startsWith(`${path} `)) {\n return `command path ${path} collides with installed tool path ${otherPath}`;\n }\n }\n}\n\nasync function runNpm(paths: Paths, args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"npm\", args, { cwd: paths.rootDir, stdio: \"pipe\" });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk: Buffer | string) => { stderr += chunk.toString(); });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => code === 0 ? resolve() : reject(new Error(stderr.trim() || `npm ${args[0]} failed with exit code ${String(code)}.`)));\n });\n}\n\nasync function runNpmWithOutput(paths: Paths, args: string[]): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const child = spawn(\"npm\", args, { cwd: paths.rootDir, stdio: \"pipe\" });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n reject(\n new Error(\n stderr.trim()\n || stdout.trim()\n || `npm ${args[0]} failed with exit code ${String(code)}.`,\n ),\n );\n });\n });\n}\n\nasync function viewLatestPackageVersion(\n paths: Paths,\n packageName: string,\n): Promise<string> {\n const stdout = await runNpmWithOutput(paths, [\n \"view\",\n packageName,\n \"version\",\n \"--json\",\n ]);\n const parsed = JSON.parse(stdout) as unknown;\n if (typeof parsed !== \"string\" || parsed.length === 0) {\n throw new Error(`npm view ${packageName} returned an invalid version.`);\n }\n return parsed;\n}\n\nasync function loadInstalledToolFromFsRaw(\n paths: Paths,\n packageName: string,\n): Promise<LoadedToolSource> {\n const toolRequire = createRequire(paths.packageJsonPath);\n let entryPath: string;\n try {\n entryPath = toolRequire.resolve(packageName);\n } catch {\n throw new Error(`Package ${packageName} is missing from ${join(paths.rootDir, \"node_modules\")}.`);\n }\n for (let root = dirname(entryPath); root !== dirname(root); root = dirname(root)) {\n const packageJsonPath = join(root, \"package.json\");\n if (!existsSync(packageJsonPath)) continue;\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { name?: string; version?: string };\n if (packageJson.name === packageName && typeof packageJson.version === \"string\") {\n const moduleNamespace = await import(pathToFileURL(entryPath).href);\n return {\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n cliTool:\n (moduleNamespace as Record<string, unknown>).moneyosCliTool\n ?? ((moduleNamespace as Record<string, unknown>).default as Record<string, unknown> | undefined)?.moneyosCliTool,\n };\n }\n }\n throw new Error(`Could not find package.json for installed package ${packageName}.`);\n}\n\nasync function loadInstalledToolFromFs(paths: Paths, packageName: string): Promise<LoadedTool> {\n const loaded = await loadInstalledToolFromFsRaw(paths, packageName);\n return parseLoadedTool(loaded.packageName, loaded.packageVersion, loaded.cliTool);\n}\n\nfunction toRegistryEntry(loaded: LoadedTool): ToolRegistryEntry {\n return {\n packageName: loaded.packageName,\n packageVersion: loaded.packageVersion,\n toolVersion: loaded.toolVersion,\n name: loaded.name,\n commandPath: loaded.commandPath,\n description: loaded.description,\n };\n}\n\nfunction formatBrokenInstalledToolMessage(\n entry: ToolRegistryEntry,\n error: unknown,\n): string {\n const message = error instanceof Error ? error.message : String(error);\n return `Installed tool ${entry.commandPath.join(\" \")} is broken: ${message}. Run \\`moneyos add ${entry.packageName}\\` to repair it or \\`moneyos remove ${entry.packageName}\\` to uninstall it.`;\n}\n\nexport function createCliToolManager(params: {\n paths?: Paths;\n packageManager?: {\n install(paths: Paths, spec: string): Promise<void>;\n uninstall(paths: Paths, packageName: string): Promise<void>;\n viewLatestVersion?(paths: Paths, packageName: string): Promise<string>;\n inspectLatest?(paths: Paths, packageName: string): Promise<LoadedToolSource>;\n };\n moduleLoader?: (paths: Paths, packageName: string) => Promise<LoadedToolSource>;\n cliContext?: MoneyOSCliContext;\n reservedRootCommands?: Iterable<string>;\n sharedToolHomeDependencies?: SharedToolHomeDependencies;\n} = {}) {\n const paths = params.paths ?? getPaths();\n const cliContext = params.cliContext ?? createMoneyOSCliContext();\n const sharedToolHomeDependencies = params.sharedToolHomeDependencies ?? getSharedToolHomeDependencies();\n const sharedToolHomeDependencyNames = new Set(Object.keys(sharedToolHomeDependencies));\n let reservedRootCommands = new Set(params.reservedRootCommands ?? DEFAULT_RESERVED_ROOT_COMMANDS);\n const rawInstall = params.packageManager?.install ?? ((toolPaths: Paths, spec: string) => runNpm(toolPaths, [\"install\", \"--save-exact\", \"--no-fund\", \"--no-audit\", spec]));\n const rawUninstall = params.packageManager?.uninstall ?? ((toolPaths: Paths, packageName: string) => runNpm(toolPaths, [\"uninstall\", \"--no-fund\", \"--no-audit\", packageName]));\n const viewLatestVersion = params.packageManager?.viewLatestVersion\n ?? viewLatestPackageVersion;\n const loadToolFromPaths = params.moduleLoader\n ? async (toolPaths: Paths, packageName: string) => {\n const loaded = await params.moduleLoader!(toolPaths, packageName);\n return parseLoadedTool(\n loaded.packageName,\n loaded.packageVersion,\n loaded.cliTool,\n );\n }\n : loadInstalledToolFromFs;\n const loadInstalledTool = loadToolFromPaths;\n const inspectLatest = params.packageManager?.inspectLatest\n ? async (toolPaths: Paths, packageName: string) => {\n const loaded = await params.packageManager!.inspectLatest!(\n toolPaths,\n packageName,\n );\n return parseLoadedTool(loaded.packageName, loaded.packageVersion, loaded.cliTool);\n }\n : async (_toolPaths: Paths, packageName: string) => {\n const rootDir = mkdtempSync(join(tmpdir(), \"moneyos-tool-inspect-\"));\n const inspectPaths: Paths = {\n rootDir,\n packageJsonPath: join(rootDir, \"package.json\"),\n registryPath: join(rootDir, \"registry.json\"),\n };\n try {\n ensureToolHome(inspectPaths, sharedToolHomeDependencies);\n await runNpm(inspectPaths, [\n \"install\",\n \"--save-exact\",\n \"--no-fund\",\n \"--no-audit\",\n `${packageName}@latest`,\n ]);\n return await loadToolFromPaths(inspectPaths, packageName);\n } finally {\n rmSync(rootDir, { recursive: true, force: true });\n }\n };\n const install = async (toolPaths: Paths, spec: string): Promise<void> => {\n await rawInstall(toolPaths, spec);\n ensureToolHome(toolPaths, sharedToolHomeDependencies);\n };\n const uninstall = async (\n toolPaths: Paths,\n packageName: string,\n ): Promise<void> => {\n await rawUninstall(toolPaths, packageName);\n ensureToolHome(toolPaths, sharedToolHomeDependencies);\n };\n const sameMetadata = (left: ToolRegistryEntry, right: ToolRegistryEntry) =>\n left.packageName === right.packageName\n && left.packageVersion === right.packageVersion\n && left.toolVersion === right.toolVersion\n && left.name === right.name\n && left.description === right.description\n && left.commandPath.join(\"\\0\") === right.commandPath.join(\"\\0\");\n const resolveInstalledTool = (input: string, entries: ToolRegistryEntry[]) =>\n entries.find((entry) => entry.packageName === input)\n ?? entries.find((entry) => entry.packageName === FIRST_PARTY_TOOL_ALIASES[input])\n ?? (() => {\n const matches = entries.filter((entry) => entry.name === input || entry.commandPath.join(\" \") === input);\n return matches.length === 1 ? matches[0] : undefined;\n })();\n const getRegistryEntries = (): ToolRegistryEntry[] => {\n ensureToolHome(paths, sharedToolHomeDependencies);\n const parsed = JSON.parse(readFileSync(paths.registryPath, \"utf8\")) as unknown;\n if (!Array.isArray(parsed)) throw new Error(`Tool registry at ${paths.registryPath} is invalid.`);\n return parsed.map(parseRegistryEntry);\n };\n const writeRegistryEntries = (entries: ToolRegistryEntry[]): void => {\n ensureToolHome(paths, sharedToolHomeDependencies);\n writeFileSync(paths.registryPath, `${JSON.stringify(entries, null, 2)}\\n`, { mode: 0o600 });\n };\n\n async function invoke(entry: ToolRegistryEntry, args: string[]): Promise<void> {\n let command: Command;\n try {\n // Load/validation failures mean the installed tool itself is broken.\n const loaded = await loadInstalledTool(paths, entry.packageName);\n if (!sameMetadata(entry, loaded)) throw new Error(\"installed metadata does not match registry\");\n command = loaded.createCommand(cliContext);\n if (!(command instanceof Command) || command.name() !== entry.commandPath[entry.commandPath.length - 1]) {\n throw new Error(\"createCommand() did not return the expected command\");\n }\n command.exitOverride();\n } catch (error) {\n throw new Error(formatBrokenInstalledToolMessage(entry, error));\n }\n\n try {\n await command.parseAsync([process.execPath, entry.commandPath[entry.commandPath.length - 1], ...args]);\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code !== \"commander.helpDisplayed\") process.exitCode = error.exitCode || 1;\n return;\n }\n throw error;\n }\n }\n\n return {\n getRegistryEntries(): ToolRegistryEntry[] {\n return getRegistryEntries();\n },\n mountInstalledToolCommands(program: Command): void {\n let entries: ToolRegistryEntry[];\n try {\n entries = getRegistryEntries();\n } catch {\n return;\n }\n reservedRootCommands = collectReservedRootCommandNames(program);\n const groups = new Map<string, Command>();\n for (const entry of entries) {\n if (getConflict(entry, entries, reservedRootCommands)) continue;\n let parent = program;\n const segments: string[] = [];\n for (const segment of entry.commandPath.slice(0, -1)) {\n segments.push(segment);\n const key = segments.join(\" \");\n const group = groups.get(key) ?? new Command(segment).description(\"Installed MoneyOS tool commands\");\n if (!groups.has(key)) {\n groups.set(key, group);\n parent.addCommand(group);\n }\n parent = group;\n }\n parent.addCommand(\n new Command(entry.commandPath[entry.commandPath.length - 1])\n .description(entry.description)\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .helpOption(false)\n .argument(\"[args...]\")\n .action(async (args: string[]) => { await invoke(entry, args); }),\n );\n }\n },\n async addTool(input: string): Promise<ToolRegistryEntry> {\n const spec = FIRST_PARTY_TOOL_ALIASES[input] ?? input;\n const entries = getRegistryEntries();\n const previous = resolveInstalledTool(input, entries);\n ensureToolHome(paths, sharedToolHomeDependencies);\n const before = (JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as { dependencies?: Record<string, string> }).dependencies ?? {};\n await install(paths, spec);\n const after = (JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as { dependencies?: Record<string, string> }).dependencies ?? {};\n const changed = previous?.packageName ?? Object.keys(after).find((name) => before[name] !== after[name] && !sharedToolHomeDependencyNames.has(name));\n try {\n const loaded = await loadInstalledTool(paths, changed ?? spec);\n const next = previous ? entries.filter((entry) => entry.packageName !== previous.packageName) : entries;\n const conflict = getConflict(loaded, next, reservedRootCommands);\n if (conflict) throw new Error(conflict);\n const entry = { packageName: loaded.packageName, packageVersion: loaded.packageVersion, toolVersion: loaded.toolVersion, name: loaded.name, commandPath: loaded.commandPath, description: loaded.description };\n writeRegistryEntries([...next, entry]);\n return entry;\n } catch (error) {\n try {\n if (previous) await install(paths, `${previous.packageName}@${previous.packageVersion}`);\n else if (changed) await uninstall(paths, changed);\n } catch {\n // Best-effort rollback only.\n }\n throw error;\n }\n },\n async removeTool(input: string): Promise<ToolRegistryEntry> {\n const entries = getRegistryEntries();\n const entry = resolveInstalledTool(input, entries);\n if (!entry) throw new Error(`Tool ${input} is not installed.`);\n await uninstall(paths, entry.packageName);\n writeRegistryEntries(entries.filter((installed) => installed.packageName !== entry.packageName));\n return entry;\n },\n async listTools(): Promise<ToolStatus[]> {\n const entries = getRegistryEntries();\n const tools = await Promise.all(entries.map(async (entry) => {\n const conflict = getConflict(entry, entries, reservedRootCommands);\n if (conflict) return { ...entry, state: \"conflict\" as const, problems: [conflict] };\n try {\n const loaded = await loadInstalledTool(paths, entry.packageName);\n if (!sameMetadata(entry, loaded)) throw new Error(\"installed metadata does not match registry\");\n return { ...entry, state: \"ok\" as const, problems: [] };\n } catch (error) {\n return { ...entry, state: \"broken\" as const, problems: [error instanceof Error ? error.message : String(error)] };\n }\n }));\n return tools.sort((left, right) => left.commandPath.join(\" \").localeCompare(right.commandPath.join(\" \")));\n },\n async updateTools(\n params: { tool?: string; check?: boolean } = {},\n ): Promise<ToolUpdateResult[]> {\n let entries = getRegistryEntries();\n const targets = params.tool\n ? (() => {\n const entry = resolveInstalledTool(params.tool!, entries);\n if (!entry) throw new Error(`Tool ${params.tool} is not installed.`);\n return [entry];\n })()\n : [...entries].sort((left, right) =>\n left.commandPath.join(\" \").localeCompare(right.commandPath.join(\" \")),\n );\n const results: ToolUpdateResult[] = [];\n\n for (const target of targets) {\n const current =\n entries.find((entry) => entry.packageName === target.packageName)\n ?? target;\n try {\n const installed = await loadInstalledTool(paths, current.packageName);\n if (!sameMetadata(current, installed)) {\n throw new Error(\"installed metadata does not match registry\");\n }\n } catch (error) {\n results.push({\n current,\n state: \"broken\",\n reason: formatBrokenInstalledToolMessage(current, error),\n });\n continue;\n }\n\n let latestVersion: string;\n try {\n latestVersion = await viewLatestVersion(paths, current.packageName);\n } catch (error) {\n results.push({\n current,\n state: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n if (latestVersion === current.packageVersion) {\n results.push({ current, next: current, state: \"up-to-date\" });\n continue;\n }\n\n let latest: LoadedTool;\n try {\n latest = await inspectLatest(paths, current.packageName);\n } catch (error) {\n results.push({\n current,\n state:\n error instanceof UnsupportedToolContractVersionError\n ? \"skipped\"\n : \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n\n const next = toRegistryEntry(latest);\n const otherEntries = entries.filter(\n (entry) => entry.packageName !== current.packageName,\n );\n const conflict = getConflict(next, otherEntries, reservedRootCommands);\n if (conflict) {\n results.push({ current, next, state: \"skipped\", reason: conflict });\n continue;\n }\n\n if (params.check) {\n results.push({ current, next, state: \"would-update\" });\n continue;\n }\n\n try {\n await install(paths, `${current.packageName}@${next.packageVersion}`);\n const applied = toRegistryEntry(\n await loadInstalledTool(paths, current.packageName),\n );\n const appliedConflict = getConflict(\n applied,\n otherEntries,\n reservedRootCommands,\n );\n if (appliedConflict) throw new Error(appliedConflict);\n if (applied.packageVersion !== next.packageVersion) {\n throw new Error(\n `Installed ${applied.packageName}@${applied.packageVersion}, expected ${next.packageVersion}.`,\n );\n }\n entries = entries.map((entry) =>\n entry.packageName === current.packageName ? applied : entry,\n );\n writeRegistryEntries(entries);\n results.push({ current, next: applied, state: \"updated\" });\n } catch (error) {\n try {\n await install(paths, `${current.packageName}@${current.packageVersion}`);\n } catch {\n // Best-effort rollback only.\n }\n results.push({\n current,\n next,\n state: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n },\n };\n}\n\nexport function formatToolStatusTable(tools: ToolStatus[]): string {\n if (tools.length === 0) return \"No tools installed.\";\n const commandWidth = Math.max(\"COMMAND\".length, ...tools.map((tool) => tool.commandPath.join(\" \").length));\n const packageWidth = Math.max(\"PACKAGE\".length, ...tools.map((tool) => tool.packageName.length));\n const versionWidth = Math.max(\"VERSION\".length, ...tools.map((tool) => tool.packageVersion.length));\n const lines = [`${\"COMMAND\".padEnd(commandWidth)} ${\"PACKAGE\".padEnd(packageWidth)} ${\"VERSION\".padEnd(versionWidth)} STATE`];\n for (const tool of tools) {\n lines.push(`${tool.commandPath.join(\" \").padEnd(commandWidth)} ${tool.packageName.padEnd(packageWidth)} ${tool.packageVersion.padEnd(versionWidth)} ${tool.state}`);\n for (const problem of tool.problems) lines.push(` ${problem}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatToolUpdateTable(results: ToolUpdateResult[]): string {\n if (results.length === 0) return \"No tool updates to show.\";\n const commandWidth = Math.max(\n \"COMMAND\".length,\n ...results.map((result) =>\n (result.next?.commandPath ?? result.current.commandPath).join(\" \").length,\n ),\n );\n const packageWidth = Math.max(\n \"PACKAGE\".length,\n ...results.map((result) => result.current.packageName.length),\n );\n const currentWidth = Math.max(\n \"CURRENT\".length,\n ...results.map((result) => result.current.packageVersion.length),\n );\n const latestWidth = Math.max(\n \"LATEST\".length,\n ...results.map((result) => (result.next?.packageVersion ?? \"-\").length),\n );\n const lines = [\n `${\"COMMAND\".padEnd(commandWidth)} ${\"PACKAGE\".padEnd(packageWidth)} ${\"CURRENT\".padEnd(currentWidth)} ${\"LATEST\".padEnd(latestWidth)} STATUS`,\n ];\n for (const result of results) {\n const commandPath = (result.next?.commandPath ?? result.current.commandPath)\n .join(\" \");\n lines.push(\n `${commandPath.padEnd(commandWidth)} ${result.current.packageName.padEnd(packageWidth)} ${result.current.packageVersion.padEnd(currentWidth)} ${(result.next?.packageVersion ?? \"-\").padEnd(latestWidth)} ${result.state}`,\n );\n if (result.reason) lines.push(` ${result.reason}`);\n }\n return lines.join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport type { AssetRegistry, MoneyOSRuntime, ReadClient } from \"@moneyos/core\";\nimport type { ConnectLocalSessionOptions } from \"../../local-session.js\";\nimport { connectLocalSession } from \"../../local-session.js\";\nimport { ViemReadClient } from \"../../core/eoa.js\";\nimport { DefaultAssetRegistry } from \"../../core/assets.js\";\nimport { createNoExecutorClient } from \"../../core/no-executor.js\";\nimport type { CLIConfig } from \"../config.js\";\nimport { loadConfig } from \"../config.js\";\nimport type { MoneyOSCliContext } from \"../../cli-tool.js\";\n\nexport interface CreateMoneyOSCliContextDependencies {\n loadConfig: () => CLIConfig;\n connectLocalSession: (\n options?: ConnectLocalSessionOptions,\n ) => Promise<MoneyOSRuntime[\"execute\"]>;\n createReadClient: (params: {\n chainId: number;\n rpcUrl?: string;\n }) => ReadClient;\n createAssets: () => AssetRegistry;\n}\n\nconst defaultCreateMoneyOSCliContextDependencies: CreateMoneyOSCliContextDependencies = {\n loadConfig,\n connectLocalSession,\n createReadClient: ({ chainId, rpcUrl }) =>\n new ViemReadClient({\n defaultChainId: chainId,\n rpcUrl,\n }),\n createAssets: () => new DefaultAssetRegistry(),\n};\n\nexport function createMoneyOSCliContext(\n deps: CreateMoneyOSCliContextDependencies = defaultCreateMoneyOSCliContextDependencies,\n): MoneyOSCliContext {\n return {\n Command,\n async getRuntime(options = {}): Promise<MoneyOSRuntime> {\n const config = deps.loadConfig();\n const chainId = options.chainId ?? config.chainId ?? 42161;\n const rpcUrl = config.rpcUrl;\n\n return {\n read: deps.createReadClient({ chainId, rpcUrl }),\n execute: options.requireSession\n ? await deps.connectLocalSession()\n : createNoExecutorClient(),\n assets: deps.createAssets(),\n config: {\n defaultChainId: chainId,\n rpcUrl,\n },\n };\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nconst packageJsonPath = resolve(\n dirname(fileURLToPath(import.meta.url)),\n \"../../package.json\",\n);\n\ntype PackageJson = {\n version: string;\n};\n\nexport const version = (JSON.parse(\n readFileSync(packageJsonPath, \"utf8\"),\n) as PackageJson).version;\n"],"mappings":"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","names":["Command","resolve","fileURLToPath","privateKeyToAccount","existsSync","statSync","join","join","existsSync","statSync","readFileSync","existsSync","mkdirSync","dirname","join","join","join","resolve","randomBytes","chmodSync","existsSync","mkdirSync","readFileSync","statSync","writeFileSync","dirname","createPublicClient","http","privateKeyToAccount","createPublicClient","http","SECURE_FILE_MODE","shouldEnforcePosixPermissions","existsSync","dirname","mkdirSync","statSync","readFileSync","writeFileSync","chmodSync","resolve","randomBytes","privateKeyToAccount","Command","raw","result","Command","result","Command","isAddress","chmodSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","shouldEnforcePosixPermissions","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","chmodSync","isAddress","Command","Command","privateKeyToAccount","privateKeyToAccount","Command","Command","privateKeyToAccount","Command","privateKeyToAccount","Command","Command","Command","Command","Command","getGaslessNetworkDefaults","getGaslessNetworkDefaults","Command","Command","spawn","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","Command","Command","Command","dirname","join","existsSync","readFileSync","mkdirSync","version","writeFileSync","resolve","spawn","packageJsonPath","rmSync","Command","entry","params","Command","readFileSync","fileURLToPath","dirname","resolve","Command","resolve","fileURLToPath"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/core/backup-file.ts","../../src/core/encrypted-wallet.ts","../../src/cli/config.ts","../../src/cli/prompt.ts","../../src/cli/session.ts","../../src/core/gasless.ts","../../packages/core/src/tokens.ts","../../packages/core/src/chains.ts","../../src/core/chains.ts","../../src/core/eoa.ts","../../src/core/signer.ts","../../src/cli/commands/balance.ts","../../src/core/client.ts","../../src/core/assets.ts","../../src/core/no-executor.ts","../../src/local-session.ts","../../src/cli/gasless.ts","../../src/cli/wallet.ts","../../src/cli/commands/send.ts","../../src/cli/contacts.ts","../../src/cli/commands/keystore.ts","../../src/cli/wallet-status.ts","../../src/cli/commands/auth.ts","../../src/cli/commands/backup.ts","../../src/cli/commands/contact.ts","../../src/cli/commands/gasless.ts","../../src/cli/commands/tools.ts","../../src/cli/tools/manager.ts","../../src/cli/tools/runtime.ts","../../src/cli/version.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { initCommand } from \"./commands/init.js\";\nimport { balanceCommand } from \"./commands/balance.js\";\nimport { sendCommand } from \"./commands/send.js\";\nimport { keystoreCommand } from \"./commands/keystore.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { backupCommand } from \"./commands/backup.js\";\nimport { contactCommand } from \"./commands/contact.js\";\nimport { gaslessCommand } from \"./commands/gasless.js\";\nimport {\n createAddToolCommand,\n createRemoveToolCommand,\n createToolsCommand,\n createUpdateToolCommand,\n} from \"./commands/tools.js\";\nimport { runSessionDaemonProcess } from \"./session.js\";\nimport { createCliToolManager } from \"./tools/manager.js\";\nimport { version } from \"./version.js\";\n\nexport interface CreateProgramOptions {\n toolManager?: ReturnType<typeof createCliToolManager>;\n}\n\nexport function createProgram(options: CreateProgramOptions = {}): Command {\n const program = new Command();\n const toolManager = options.toolManager ?? createCliToolManager();\n\n program\n .name(\"moneyos\")\n .description(\"The operating system for money\")\n .version(version);\n\n program.addCommand(initCommand);\n program.addCommand(balanceCommand);\n program.addCommand(sendCommand);\n program.addCommand(keystoreCommand);\n program.addCommand(authCommand);\n program.addCommand(backupCommand);\n program.addCommand(contactCommand);\n program.addCommand(gaslessCommand);\n program.addCommand(createAddToolCommand(toolManager));\n program.addCommand(createRemoveToolCommand(toolManager));\n program.addCommand(createUpdateToolCommand(toolManager));\n program.addCommand(createToolsCommand(toolManager));\n program\n .command(\"__session-daemon\", { hidden: true })\n .action(async () => {\n await runSessionDaemonProcess();\n });\n toolManager.mountInstalledToolCommands(program);\n\n return program;\n}\n\nfunction resolveEntrypointPath(path: string): string {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n}\n\nexport function isEntrypointPath(cliEntry: string | undefined, moduleUrl: string): boolean {\n return typeof cliEntry === \"string\"\n && resolveEntrypointPath(cliEntry) === fileURLToPath(moduleUrl);\n}\n\nif (isEntrypointPath(process.argv[1], import.meta.url)) {\n void createProgram().parseAsync(process.argv).catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n","import { Command } from \"commander\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport {\n FileBackupProvider,\n type BackupProvider,\n} from \"../../core/backup-file.js\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletStore,\n} from \"../../core/encrypted-wallet.js\";\nimport {\n type CLIConfig,\n getBackupDir,\n getConfigPath,\n getLegacyPlaintextWalletStorageMessage,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n getRemovedOnePasswordStorageMessage,\n hasRemovedOnePasswordConfig,\n hasLegacyPlaintextWalletConfig,\n loadFileConfig,\n saveConfig,\n} from \"../config.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport { lockSession } from \"../session.js\";\n\nfunction parseChainId(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid chain ID: \"${value}\"`);\n }\n return parsed;\n}\n\nexport interface InitCommandOptions {\n key?: string;\n force?: boolean;\n chain?: string;\n rpc?: string;\n}\n\nexport interface InitCommandDependencies {\n loadFileConfig: () => CLIConfig;\n getWalletPath: (config?: CLIConfig) => string;\n getBackupDir: (config?: CLIConfig) => string;\n getConfigPath: () => string;\n createWalletStore: (walletPath: string) => EncryptedWalletStore;\n createBackupProvider: (params: {\n walletPath: string;\n backupDir: string;\n }) => BackupProvider;\n hasRemovedOnePasswordConfig: (config: CLIConfig) => boolean;\n getRemovedOnePasswordStorageMessage: () => string;\n hasLegacyPlaintextWalletConfig: (config: CLIConfig) => boolean;\n getLegacyPlaintextWalletStorageMessage: () => string;\n promptHidden: (question: string) => Promise<string>;\n lockSession: (socketPath: string, tokenPath: string) => Promise<boolean>;\n getSessionSocketPath: () => string;\n getSessionTokenPath: () => string;\n saveConfig: (config: CLIConfig) => void;\n generatePrivateKey: () => Hex;\n log: (message: string) => void;\n error: (message: string) => void;\n}\n\nconst defaultInitCommandDependencies: InitCommandDependencies = {\n loadFileConfig,\n getWalletPath,\n getBackupDir,\n getConfigPath,\n createWalletStore: (walletPath) => new FileEncryptedWalletStore(walletPath),\n createBackupProvider: (params) => new FileBackupProvider(params),\n hasRemovedOnePasswordConfig,\n getRemovedOnePasswordStorageMessage,\n hasLegacyPlaintextWalletConfig,\n getLegacyPlaintextWalletStorageMessage,\n promptHidden,\n lockSession,\n getSessionSocketPath,\n getSessionTokenPath,\n saveConfig,\n generatePrivateKey,\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n};\n\nexport async function runInitCommand(\n options: InitCommandOptions,\n deps: InitCommandDependencies = defaultInitCommandDependencies,\n): Promise<void> {\n const existing = deps.loadFileConfig();\n const walletPath = deps.getWalletPath(existing);\n const backupDir = deps.getBackupDir(existing);\n const wallet = deps.createWalletStore(walletPath);\n\n if (wallet.exists() && !options.force) {\n const metadata = await wallet.metadata();\n deps.log(`Already initialized.`);\n if (metadata?.address) {\n deps.log(`Address: ${metadata.address}`);\n }\n deps.log(`Wallet: ${walletPath}`);\n deps.log(`Config: ${deps.getConfigPath()}`);\n deps.log(`\\nTo reinitialize, run: moneyos init --force --key <privateKey>`);\n return;\n }\n\n if (deps.hasRemovedOnePasswordConfig(existing) && !options.key) {\n deps.error(deps.getRemovedOnePasswordStorageMessage());\n deps.error(`Config: ${deps.getConfigPath()}`);\n return;\n }\n\n try {\n const privateKey =\n options.key ??\n (deps.hasLegacyPlaintextWalletConfig(existing)\n ? existing.privateKey!\n : deps.generatePrivateKey());\n const account = privateKeyToAccount(privateKey as Hex);\n const chainId = parseChainId(options.chain, existing.chainId ?? 42161);\n const rpcUrl = options.rpc ?? existing.rpcUrl;\n const passphrase = await deps.promptHidden(\"Choose wallet password: \");\n if (passphrase.length < 8) {\n throw new Error(\"Wallet password must be at least 8 characters long.\");\n }\n const confirmPassphrase = await deps.promptHidden(\"Confirm wallet password: \");\n if (passphrase !== confirmPassphrase) {\n throw new Error(\"Wallet password confirmation did not match.\");\n }\n\n await wallet.save({\n privateKey: privateKey as Hex,\n passphrase,\n });\n await deps.lockSession(\n deps.getSessionSocketPath(),\n deps.getSessionTokenPath(),\n );\n\n deps.saveConfig({\n chainId,\n rpcUrl,\n walletPath: existing.walletPath,\n backupDir: existing.backupDir,\n });\n\n const backupProvider = deps.createBackupProvider({\n walletPath,\n backupDir,\n });\n const backupPath = await backupProvider.exportWallet();\n\n deps.log(`MoneyOS initialized.`);\n deps.log(`Address: ${account.address}`);\n deps.log(`Wallet: ${walletPath}`);\n deps.log(`Config: ${deps.getConfigPath()}`);\n deps.log(`Backup: ${backupPath}`);\n deps.log(\n `\\nSave your wallet password in your password manager of choice. MoneyOS does not store or sync it for you.`,\n );\n\n if (deps.hasLegacyPlaintextWalletConfig(existing) && !options.key) {\n deps.log(`\\nImported legacy plaintext wallet into the encrypted wallet file.`);\n deps.log(deps.getLegacyPlaintextWalletStorageMessage());\n } else if (!options.key) {\n deps.log(\n `\\nThis is a new account. Fund it before sending transactions.`,\n );\n }\n } catch (error) {\n deps.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Initialize MoneyOS with a new or imported encrypted wallet\")\n .option(\"-k, --key <privateKey>\", \"Import an existing private key\")\n .option(\"--force\", \"Overwrite the existing encrypted wallet\")\n .option(\"--chain <chainId>\", \"Default chain ID (default: 42161 Arbitrum)\")\n .option(\"--rpc <url>\", \"Custom RPC URL\")\n .action(async (options) => {\n await runInitCommand(options);\n });\n","import {\n existsSync,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { Address } from \"viem\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletMetadata,\n readEncryptedWalletFile,\n verifyEncryptedWalletPassphrase,\n writeEncryptedWalletFile,\n} from \"./encrypted-wallet.js\";\n\nexport interface BackupProvider {\n readonly kind: \"file\";\n exportWallet(options?: { outPath?: string; allowOverwrite?: boolean }): Promise<string>;\n restoreWallet(\n fromPath: string,\n options: { passphrase: string; allowOverwrite?: boolean },\n ): Promise<EncryptedWalletMetadata>;\n status(): Promise<{\n walletPath: string;\n backupDir: string;\n exists: boolean;\n latestBackupPath?: string;\n backupCount: number;\n address?: Address;\n }>;\n}\n\nfunction formatTimestamp(now: Date): string {\n const pad = (value: number) => value.toString().padStart(2, \"0\");\n return [\n now.getUTCFullYear().toString(),\n pad(now.getUTCMonth() + 1),\n pad(now.getUTCDate()),\n \"-\",\n pad(now.getUTCHours()),\n pad(now.getUTCMinutes()),\n pad(now.getUTCSeconds()),\n ].join(\"\");\n}\n\nexport class FileBackupProvider implements BackupProvider {\n readonly kind = \"file\" as const;\n private readonly store: FileEncryptedWalletStore;\n private readonly backupDir: string;\n\n constructor(params: { walletPath: string; backupDir: string }) {\n this.store = new FileEncryptedWalletStore(params.walletPath);\n this.backupDir = params.backupDir;\n }\n\n private defaultBackupPath(address: Address): string {\n return join(\n this.backupDir,\n `wallet-${address}-${formatTimestamp(new Date())}.json`,\n );\n }\n\n async exportWallet(\n options: { outPath?: string; allowOverwrite?: boolean } = {},\n ): Promise<string> {\n if (options.outPath === \"-\") {\n throw new Error(\"Refusing to export an encrypted wallet backup to stdout.\");\n }\n const wallet = await this.store.exportData();\n const targetPath = options.outPath\n ? resolve(options.outPath)\n : this.defaultBackupPath(wallet.address);\n if (existsSync(targetPath) && !options.allowOverwrite) {\n throw new Error(\n \"Backup file already exists. Re-run with `--force` if you really want to overwrite it.\",\n );\n }\n await writeEncryptedWalletFile(targetPath, wallet, {\n parentDescription: \"Backup export destination directory\",\n fileDescription: \"Backup export file\",\n });\n return targetPath;\n }\n\n async restoreWallet(\n fromPath: string,\n options: { passphrase: string; allowOverwrite?: boolean },\n ): Promise<EncryptedWalletMetadata> {\n if (this.store.exists() && !options.allowOverwrite) {\n throw new Error(\n \"A wallet already exists. Re-run with `--force` if you really want to overwrite it.\",\n );\n }\n\n const sourcePath = resolve(fromPath);\n const wallet = await readEncryptedWalletFile(sourcePath);\n await verifyEncryptedWalletPassphrase(wallet, options.passphrase);\n return this.store.restore(wallet);\n }\n\n async status(): Promise<{\n walletPath: string;\n backupDir: string;\n exists: boolean;\n latestBackupPath?: string;\n backupCount: number;\n address?: Address;\n }> {\n const exists = this.store.exists();\n const metadata = exists ? await this.store.metadata() : undefined;\n\n if (!existsSync(this.backupDir)) {\n return {\n walletPath: this.store.walletPath,\n backupDir: this.backupDir,\n exists,\n backupCount: 0,\n address: metadata?.address,\n };\n }\n\n const files = readdirSync(this.backupDir)\n .filter((name) => name.endsWith(\".json\"))\n .map((name) => join(this.backupDir, name))\n .sort(\n (a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs,\n );\n\n return {\n walletPath: this.store.walletPath,\n backupDir: this.backupDir,\n exists,\n latestBackupPath: files[0],\n backupCount: files.length,\n address: metadata?.address,\n };\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n scryptSync,\n} from \"node:crypto\";\nimport {\n chmodSync,\n closeSync,\n existsSync,\n fsyncSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeSync,\n} from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { recoverMessageAddress, type Address, type Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport interface EncryptedWalletKdfConfig {\n name: \"scrypt\";\n N: number;\n r: number;\n p: number;\n keyLength: number;\n}\n\nexport interface EncryptedWalletCrypto {\n cipher: \"aes-256-gcm\";\n salt: string;\n nonce: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface EncryptedWalletFile {\n version: 1;\n kind: \"encrypted-local-eoa\";\n address: Address;\n createdAt: string;\n addressProof: Hex;\n kdf: EncryptedWalletKdfConfig;\n crypto: EncryptedWalletCrypto;\n}\n\nexport interface EncryptedWalletMetadata {\n version: 1;\n kind: \"encrypted-local-eoa\";\n address: Address;\n createdAt: string;\n}\n\nexport interface SecureWriteLabels {\n parentDescription: string;\n fileDescription: string;\n}\n\ntype WalletIdentityMetadata = Pick<\n EncryptedWalletFile,\n \"version\" | \"kind\" | \"address\" | \"createdAt\" | \"addressProof\"\n>;\n\nexport interface EncryptedWalletStore {\n readonly walletPath: string;\n exists(): boolean;\n metadata(): Promise<EncryptedWalletMetadata | undefined>;\n save(params: { privateKey: Hex; passphrase: string }): Promise<EncryptedWalletMetadata>;\n rotatePassphrase(params: {\n oldPassphrase: string;\n newPassphrase: string;\n }): Promise<EncryptedWalletMetadata>;\n decrypt(passphrase: string): Promise<Hex>;\n exportData(): Promise<EncryptedWalletFile>;\n restore(data: EncryptedWalletFile): Promise<EncryptedWalletMetadata>;\n}\n\nconst DEFAULT_KDF: EncryptedWalletKdfConfig = {\n name: \"scrypt\",\n N: 131072,\n r: 8,\n p: 1,\n keyLength: 32,\n};\n\nconst SECURE_FILE_MODE = 0o600;\nconst SECURE_PARENT_MODE = 0o700;\nconst WALLET_WRITE_LABELS: SecureWriteLabels = {\n parentDescription: \"Wallet directory\",\n fileDescription: \"Wallet file\",\n};\n\nfunction shouldEnforcePosixPermissions(): boolean {\n // Windows ACLs do not map cleanly to Node's POSIX-style mode bits.\n return process.platform !== \"win32\";\n}\n\nfunction normalizePassphrase(passphrase: string): string {\n return passphrase.normalize(\"NFC\");\n}\n\nfunction walletProofMessage(wallet: Pick<\n EncryptedWalletFile,\n \"version\" | \"kind\" | \"address\" | \"createdAt\"\n>): string {\n return [\n \"MoneyOS wallet metadata\",\n `v=${wallet.version}`,\n `kind=${wallet.kind}`,\n `address=${wallet.address}`,\n `createdAt=${wallet.createdAt}`,\n ].join(\"|\");\n}\n\nfunction ensureParentDir(path: string, label: string): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: SECURE_PARENT_MODE });\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(dir).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `${label} ${dir} has insecure permissions (${mode.toString(8)}). Restrict it to 700 before continuing.`,\n );\n }\n}\n\nfunction assertSecureFileMode(path: string, label: string): void {\n if (!existsSync(path)) {\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(path).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `${label} at ${path} has insecure permissions (${mode.toString(8)}). Restrict it to 600 before continuing.`,\n );\n }\n}\n\nfunction parseWalletFile(raw: string, path: string): EncryptedWalletFile {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new Error(\n `Encrypted wallet at ${path} is not valid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(`Encrypted wallet at ${path} must be a JSON object`);\n }\n\n const wallet = parsed as Partial<EncryptedWalletFile>;\n if (wallet.version !== 1) {\n throw new Error(`Encrypted wallet at ${path} has unsupported version`);\n }\n if (wallet.kind !== \"encrypted-local-eoa\") {\n throw new Error(`Encrypted wallet at ${path} has unsupported kind`);\n }\n if (typeof wallet.address !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing address metadata`);\n }\n if (typeof wallet.addressProof !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing address proof`);\n }\n if (\n !wallet.kdf ||\n wallet.kdf.name !== \"scrypt\" ||\n !Number.isInteger(wallet.kdf.N) ||\n !Number.isInteger(wallet.kdf.r) ||\n !Number.isInteger(wallet.kdf.p) ||\n !Number.isInteger(wallet.kdf.keyLength)\n ) {\n throw new Error(`Encrypted wallet at ${path} has invalid KDF parameters`);\n }\n if (\n !wallet.crypto ||\n wallet.crypto.cipher !== \"aes-256-gcm\" ||\n typeof wallet.crypto.salt !== \"string\" ||\n typeof wallet.crypto.nonce !== \"string\" ||\n typeof wallet.crypto.authTag !== \"string\" ||\n typeof wallet.crypto.ciphertext !== \"string\"\n ) {\n throw new Error(`Encrypted wallet at ${path} has invalid crypto metadata`);\n }\n if (typeof wallet.createdAt !== \"string\") {\n throw new Error(`Encrypted wallet at ${path} is missing createdAt`);\n }\n\n return wallet as EncryptedWalletFile;\n}\n\nfunction toMetadata(wallet: EncryptedWalletFile): EncryptedWalletMetadata {\n return {\n version: wallet.version,\n kind: wallet.kind,\n address: wallet.address,\n createdAt: wallet.createdAt,\n };\n}\n\nasync function verifyWalletAddressProof(\n wallet: EncryptedWalletFile,\n path: string,\n): Promise<void> {\n let recovered: Address;\n try {\n recovered = await recoverMessageAddress({\n message: walletProofMessage(wallet),\n signature: wallet.addressProof,\n });\n } catch {\n throw new Error(`Encrypted wallet at ${path} has an invalid address proof`);\n }\n\n if (recovered.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(`Encrypted wallet at ${path} failed address proof validation`);\n }\n}\n\nfunction deriveKey(\n passphrase: string,\n salt: Buffer,\n kdf: EncryptedWalletKdfConfig,\n): Buffer {\n return scryptSync(normalizePassphrase(passphrase), salt, kdf.keyLength, {\n N: kdf.N,\n r: kdf.r,\n p: kdf.p,\n maxmem: 256 * 1024 * 1024,\n }) as Buffer;\n}\n\nfunction walletAad(kdf: EncryptedWalletKdfConfig): Buffer {\n // If the KDF shape changes in a future wallet version, update this payload so\n // all KDF fields remain bound to the AEAD tag.\n return Buffer.from(\n JSON.stringify({\n name: kdf.name,\n N: kdf.N,\n r: kdf.r,\n p: kdf.p,\n keyLength: kdf.keyLength,\n }),\n \"utf8\",\n );\n}\n\nfunction writeFileAtomicSecure(\n path: string,\n contents: string,\n labels: SecureWriteLabels = WALLET_WRITE_LABELS,\n): void {\n ensureParentDir(path, labels.parentDescription);\n assertSecureFileMode(path, labels.fileDescription);\n\n const tmpPath = join(\n dirname(path),\n `.${basename(path)}.${randomBytes(6).toString(\"hex\")}.tmp`,\n );\n const fd = openSync(tmpPath, \"wx\", SECURE_FILE_MODE);\n let writeError: unknown;\n\n try {\n writeSync(fd, contents);\n fsyncSync(fd);\n } catch (error) {\n writeError = error;\n } finally {\n closeSync(fd);\n }\n\n if (writeError) {\n try {\n unlinkSync(tmpPath);\n } catch {\n // best effort cleanup\n }\n throw writeError;\n }\n\n renameSync(tmpPath, path);\n if (shouldEnforcePosixPermissions()) {\n chmodSync(path, SECURE_FILE_MODE);\n }\n}\n\nasync function encryptWallet(params: {\n privateKey: Hex;\n passphrase: string;\n identity?: WalletIdentityMetadata;\n}): Promise<EncryptedWalletFile> {\n const account = privateKeyToAccount(params.privateKey);\n const createdAt = params.identity?.createdAt ?? new Date().toISOString();\n const salt = randomBytes(16);\n const nonce = randomBytes(12);\n const key = deriveKey(params.passphrase, salt, DEFAULT_KDF);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n cipher.setAAD(walletAad(DEFAULT_KDF));\n const plaintext = Buffer.from(\n JSON.stringify({ privateKey: params.privateKey }),\n \"utf8\",\n );\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const authTag = cipher.getAuthTag();\n const addressProof =\n params.identity?.addressProof ??\n (await account.signMessage({\n message: walletProofMessage({\n version: 1,\n kind: \"encrypted-local-eoa\",\n address: account.address,\n createdAt,\n }),\n }));\n\n if (\n params.identity &&\n account.address.toLowerCase() !== params.identity.address.toLowerCase()\n ) {\n throw new Error(\"wallet address metadata mismatch\");\n }\n\n return {\n version: params.identity?.version ?? 1,\n kind: params.identity?.kind ?? \"encrypted-local-eoa\",\n address: params.identity?.address ?? account.address,\n createdAt,\n addressProof,\n kdf: DEFAULT_KDF,\n crypto: {\n cipher: \"aes-256-gcm\",\n salt: salt.toString(\"base64\"),\n nonce: nonce.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\"),\n },\n };\n}\n\nfunction walletIdentity(wallet: EncryptedWalletFile): WalletIdentityMetadata {\n return {\n version: wallet.version,\n kind: wallet.kind,\n address: wallet.address,\n createdAt: wallet.createdAt,\n addressProof: wallet.addressProof,\n };\n}\n\nasync function decryptWalletFile(\n wallet: EncryptedWalletFile,\n passphrase: string,\n): Promise<Hex> {\n try {\n const salt = Buffer.from(wallet.crypto.salt, \"base64\");\n const nonce = Buffer.from(wallet.crypto.nonce, \"base64\");\n const authTag = Buffer.from(wallet.crypto.authTag, \"base64\");\n const ciphertext = Buffer.from(wallet.crypto.ciphertext, \"base64\");\n const key = deriveKey(passphrase, salt, wallet.kdf);\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAAD(walletAad(wallet.kdf));\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]).toString(\"utf8\");\n const parsed = JSON.parse(plaintext) as { privateKey?: unknown };\n if (typeof parsed.privateKey !== \"string\") {\n throw new Error(\"wallet payload missing privateKey\");\n }\n const privateKey = parsed.privateKey as Hex;\n const derivedAddress = privateKeyToAccount(privateKey).address;\n if (derivedAddress.toLowerCase() !== wallet.address.toLowerCase()) {\n throw new Error(\"wallet address metadata mismatch\");\n }\n\n return privateKey;\n } catch {\n throw new Error(\"Invalid password or corrupted wallet.\");\n }\n}\n\nexport class FileEncryptedWalletStore implements EncryptedWalletStore {\n readonly walletPath: string;\n\n constructor(walletPath: string) {\n this.walletPath = walletPath;\n }\n\n exists(): boolean {\n return existsSync(this.walletPath);\n }\n\n async metadata(): Promise<EncryptedWalletMetadata | undefined> {\n if (!this.exists()) {\n return undefined;\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return toMetadata(wallet);\n }\n\n async save(params: {\n privateKey: Hex;\n passphrase: string;\n }): Promise<EncryptedWalletMetadata> {\n const wallet = await encryptWallet(params);\n writeFileAtomicSecure(\n this.walletPath,\n JSON.stringify(wallet, null, 2),\n WALLET_WRITE_LABELS,\n );\n return toMetadata(wallet);\n }\n\n async rotatePassphrase(params: {\n oldPassphrase: string;\n newPassphrase: string;\n }): Promise<EncryptedWalletMetadata> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n const privateKey = await decryptWalletFile(wallet, params.oldPassphrase);\n const rotated = await encryptWallet({\n privateKey,\n passphrase: params.newPassphrase,\n identity: walletIdentity(wallet),\n });\n writeFileAtomicSecure(this.walletPath, JSON.stringify(rotated, null, 2));\n return toMetadata(rotated);\n }\n\n async decrypt(passphrase: string): Promise<Hex> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return decryptWalletFile(wallet, passphrase);\n }\n\n async exportData(): Promise<EncryptedWalletFile> {\n if (!this.exists()) {\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n }\n\n assertSecureFileMode(this.walletPath, \"Wallet file\");\n const wallet = parseWalletFile(\n readFileSync(this.walletPath, \"utf8\"),\n this.walletPath,\n );\n await verifyWalletAddressProof(wallet, this.walletPath);\n return wallet;\n }\n\n async restore(data: EncryptedWalletFile): Promise<EncryptedWalletMetadata> {\n const wallet = parseWalletFile(JSON.stringify(data), this.walletPath);\n await verifyWalletAddressProof(wallet, this.walletPath);\n writeFileAtomicSecure(\n this.walletPath,\n JSON.stringify(wallet, null, 2),\n WALLET_WRITE_LABELS,\n );\n return toMetadata(wallet);\n }\n}\n\nexport async function writeEncryptedWalletFile(\n path: string,\n data: EncryptedWalletFile,\n labels: SecureWriteLabels = WALLET_WRITE_LABELS,\n): Promise<EncryptedWalletMetadata> {\n const wallet = parseWalletFile(JSON.stringify(data), path);\n await verifyWalletAddressProof(wallet, path);\n writeFileAtomicSecure(path, JSON.stringify(wallet, null, 2), labels);\n return toMetadata(wallet);\n}\n\nexport async function readEncryptedWalletFile(\n path: string,\n): Promise<EncryptedWalletFile> {\n assertSecureFileMode(path, \"Wallet file\");\n const wallet = parseWalletFile(readFileSync(path, \"utf8\"), path);\n await verifyWalletAddressProof(wallet, path);\n return wallet;\n}\n\nexport async function verifyEncryptedWalletPassphrase(\n wallet: EncryptedWalletFile,\n passphrase: string,\n): Promise<EncryptedWalletMetadata> {\n await verifyWalletAddressProof(wallet, \"(in-memory wallet)\");\n await decryptWalletFile(wallet, passphrase);\n return toMetadata(wallet);\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Address, Hex } from \"viem\";\n\nconst CONFIG_DIR = join(homedir(), \".moneyos\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n/**\n * Local CLI configuration persisted at `~/.moneyos/config.json`.\n *\n * Only non-secret settings should be persisted here. Wallet secrets now live\n * in the encrypted wallet file, while `privateKey` remains as a legacy-only\n * field so older configs can be detected and upgraded through `moneyos init`.\n */\nexport interface CLIConfig {\n chainId?: number;\n rpcUrl?: string;\n walletPath?: string;\n backupDir?: string;\n gasless?: {\n enabled?: boolean;\n relayUrl?: string;\n account?: string;\n sponsor?: string;\n };\n /**\n * Legacy plaintext wallet field from earlier MoneyOS versions. This should\n * never be written by the current CLI.\n */\n privateKey?: Hex;\n}\n\ninterface RemovedOnePasswordConfigShape {\n keyStore?: {\n kind?: unknown;\n address?: unknown;\n };\n}\n\nexport function hasRemovedOnePasswordConfig(config: CLIConfig): boolean {\n return (\n (config as CLIConfig & RemovedOnePasswordConfigShape).keyStore?.kind ===\n \"1password\"\n );\n}\n\nexport function getRemovedOnePasswordCachedAddress(\n config: CLIConfig,\n): Address | undefined {\n const address = (config as CLIConfig & RemovedOnePasswordConfigShape)\n .keyStore?.address;\n return typeof address === \"string\" ? (address as Address) : undefined;\n}\n\nexport function getRemovedOnePasswordStorageMessage(): string {\n return \"This repo no longer supports the old 1Password-backed private-key storage path. Re-import the wallet into the local file path with `moneyos init --key <privateKey>`.\";\n}\n\n/**\n * Read the CLI config file.\n *\n * @param path Optional absolute path to the config file. Defaults to\n * `~/.moneyos/config.json`. Primarily exposed so tests can point at a\n * tmpdir without mocking `homedir`.\n */\nexport function loadFileConfig(path: string = CONFIG_FILE): CLIConfig {\n if (!existsSync(path)) {\n return {};\n }\n return JSON.parse(readFileSync(path, \"utf-8\")) as CLIConfig;\n}\n\nexport function loadConfig(): CLIConfig {\n const config: CLIConfig = { ...loadFileConfig() };\n\n // Env vars override file config — standard for agents/CI\n if (process.env.MONEYOS_PRIVATE_KEY) {\n config.privateKey = process.env.MONEYOS_PRIVATE_KEY as Hex;\n }\n if (process.env.MONEYOS_RPC_URL) {\n config.rpcUrl = process.env.MONEYOS_RPC_URL;\n }\n if (process.env.MONEYOS_CHAIN_ID) {\n const parsed = Number(process.env.MONEYOS_CHAIN_ID);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\n `Invalid MONEYOS_CHAIN_ID: \"${process.env.MONEYOS_CHAIN_ID}\" — must be a positive integer`,\n );\n }\n config.chainId = parsed;\n }\n if (process.env.MONEYOS_GASLESS_ENABLED !== undefined) {\n config.gasless = {\n ...config.gasless,\n enabled: parseBooleanEnv(\n process.env.MONEYOS_GASLESS_ENABLED,\n \"MONEYOS_GASLESS_ENABLED\",\n ),\n };\n }\n\n return config;\n}\n\nexport function parseBooleanEnv(value: string, key: string): boolean {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n\n throw new Error(\n `Invalid ${key}: \"${value}\" — expected true/false, 1/0, yes/no, or on/off`,\n );\n}\n\n/**\n * Write the CLI config file.\n *\n * @param config The config to persist.\n * @param path Optional absolute path to the config file. Defaults to\n * `~/.moneyos/config.json`. Primarily exposed so tests can point at a\n * tmpdir without mocking `homedir`. When a custom path is passed, the\n * parent directory is created with mode 0o700 if it does not already\n * exist.\n */\nexport function saveConfig(\n config: CLIConfig,\n path: string = CONFIG_FILE,\n): void {\n const safeConfig = { ...config };\n delete safeConfig.privateKey;\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n writeFileSync(path, JSON.stringify(safeConfig, null, 2), {\n mode: 0o600,\n });\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport function getMoneyOSDir(): string {\n return CONFIG_DIR;\n}\n\nexport function getToolHomeDir(): string {\n return join(CONFIG_DIR, \"tools\");\n}\n\nexport function getToolHomePackageJsonPath(): string {\n return join(getToolHomeDir(), \"package.json\");\n}\n\nexport function getToolHomeLockPath(): string {\n return join(getToolHomeDir(), \"package-lock.json\");\n}\n\nexport function getToolHomeNodeModulesPath(): string {\n return join(getToolHomeDir(), \"node_modules\");\n}\n\nexport function getToolRegistryPath(): string {\n return join(getToolHomeDir(), \"registry.json\");\n}\n\nexport function getWalletPath(config?: CLIConfig): string {\n return config?.walletPath ?? join(CONFIG_DIR, \"wallet.json\");\n}\n\nexport function getContactsPath(): string {\n return join(CONFIG_DIR, \"contacts.json\");\n}\n\nexport function getBackupDir(config?: CLIConfig): string {\n return config?.backupDir ?? join(CONFIG_DIR, \"backups\");\n}\n\nexport function getSessionSocketPath(): string {\n if (process.platform === \"win32\") {\n const suffix = createHash(\"sha256\")\n .update(CONFIG_DIR)\n .digest(\"hex\")\n .slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\moneyos-session-${suffix}`;\n }\n\n return join(CONFIG_DIR, \"session.sock\");\n}\n\nexport function getSessionTokenPath(): string {\n return join(CONFIG_DIR, \"session.token\");\n}\n\nexport function hasLegacyPlaintextWalletConfig(config: CLIConfig): boolean {\n return typeof config.privateKey === \"string\";\n}\n\nexport function getLegacyPlaintextWalletStorageMessage(): string {\n return \"Plaintext local wallet configs are no longer used for runtime access. Run `moneyos init` locally to encrypt your wallet into the new MoneyOS wallet file.\";\n}\n","export async function promptHidden(question: string): Promise<string> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\n \"This action requires a local terminal. Run it directly in your terminal, not through a non-interactive agent session.\",\n );\n }\n\n return new Promise<string>((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n let value = \"\";\n\n const cleanup = () => {\n stdin.off(\"data\", onData);\n stdin.pause();\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(false);\n }\n };\n\n const finish = (result?: string, error?: Error) => {\n cleanup();\n stdout.write(\"\\n\");\n if (error) {\n reject(error);\n return;\n }\n resolve(result ?? \"\");\n };\n\n const onData = (chunk: Buffer | string) => {\n const text = chunk.toString(\"utf8\");\n for (const char of text) {\n if (char === \"\\u0003\") {\n finish(undefined, new Error(\"Cancelled.\"));\n return;\n }\n if (char === \"\\r\" || char === \"\\n\") {\n finish(value);\n return;\n }\n if (char === \"\\u007f\" || char === \"\\b\") {\n value = value.slice(0, -1);\n continue;\n }\n value += char;\n }\n };\n\n stdout.write(question);\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.on(\"data\", onData);\n });\n}\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport net from \"node:net\";\nimport { EOL } from \"node:os\";\nimport { dirname } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type { Address } from \"viem\";\nimport type { CallRequest, ExecutionClient, ExecutionResult } from \"@moneyos/core\";\nimport type { GaslessExecutionConfig } from \"../core/gasless.js\";\nimport { createGaslessExecutionClient } from \"../core/gasless.js\";\nimport { EOAExecutor } from \"../core/eoa.js\";\nimport { privateKeyToManagedAccount } from \"../core/signer.js\";\n\nexport type SessionExecutionMode = ExecutionClient[\"mode\"];\n\nexport type SessionExecutionCapabilities = ReturnType<\n ExecutionClient[\"capabilities\"]\n>;\n\nexport interface SessionGaslessStartConfig {\n account: Address;\n sponsor: Address;\n relayUrl: string;\n nonceKey?: string;\n validityWindowSeconds?: number;\n}\n\nexport interface SessionServerStartMessage {\n type: \"start\";\n privateKey: `0x${string}`;\n chainId: number;\n rpcUrl?: string;\n socketPath: string;\n tokenPath: string;\n ttlMs: number;\n gasless?: SessionGaslessStartConfig;\n}\n\nexport interface SessionStatusResult {\n address: Address;\n expiresAt: string;\n mode: SessionExecutionMode;\n capabilities: SessionExecutionCapabilities;\n}\n\nexport interface SessionServerHandle {\n readonly address: Address;\n readonly expiresAt: string;\n readonly mode: SessionExecutionMode;\n readonly capabilities: SessionExecutionCapabilities;\n close(): Promise<void>;\n}\n\ninterface SessionSendParams {\n to: Address;\n chainId: number;\n data?: `0x${string}`;\n value?: string;\n}\n\ninterface SessionSendBatchParams {\n calls: SessionSendParams[];\n}\n\ntype SessionRequest =\n | { id: string; token: string; type: \"status\" }\n | { id: string; token: string; type: \"lock\" }\n | { id: string; token: string; type: \"send\"; params: SessionSendParams }\n | {\n id: string;\n token: string;\n type: \"sendBatch\";\n params: SessionSendBatchParams;\n };\n\ntype SessionRequestWithoutToken =\n | { id: string; type: \"status\" }\n | { id: string; type: \"lock\" }\n | { id: string; type: \"send\"; params: SessionSendParams }\n | { id: string; type: \"sendBatch\"; params: SessionSendBatchParams };\n\ntype SessionResponse =\n | {\n id: string;\n ok: true;\n result: SessionStatusResult | ExecutionResult | { locked: true };\n }\n | { id: string; ok: false; error: string };\n\ninterface StoredSendResponse {\n fingerprint: string;\n response: Promise<SessionResponse>;\n}\n\nconst SESSION_CONTROL_TIMEOUT_MS = 750;\n// Intentionally much longer than control operations: on-chain submission does\n// real RPC work, and PR #12 fixed a live timeout-after-broadcast bug here.\nconst SESSION_SEND_TIMEOUT_MS = 60_000;\nconst MAX_MESSAGE_BYTES = 32 * 1024;\nconst SECURE_DIR_MODE = 0o700;\nconst SECURE_FILE_MODE = 0o600;\nconst SERVER_SOCKET_TIMEOUT_MS = 5000;\nconst SESSION_SHUTDOWN_TIMEOUT_MS = 15000;\n\nfunction shouldEnforcePosixPermissions(): boolean {\n // Windows ACLs do not map cleanly to Node's POSIX-style mode bits.\n return process.platform !== \"win32\";\n}\n\nfunction isWindowsPipe(path: string): boolean {\n return path.startsWith(\"\\\\\\\\.\\\\pipe\\\\\");\n}\n\nfunction removeFileIfPresent(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { force: true });\n }\n}\n\nfunction ensureSecureParent(path: string): void {\n if (isWindowsPipe(path)) {\n return;\n }\n\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: SECURE_DIR_MODE });\n return;\n }\n\n if (!shouldEnforcePosixPermissions()) {\n return;\n }\n\n const mode = statSync(dir).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(\n `MoneyOS directory ${dir} has insecure permissions (${mode.toString(8)}). Restrict it to 700 before continuing.`,\n );\n }\n}\n\nfunction createRequestId(): string {\n return `${Date.now()}-${Math.random().toString(16).slice(2, 10)}`;\n}\n\nfunction createSendRequestFingerprint(\n request: Extract<SessionRequest, { type: \"send\" | \"sendBatch\" }>,\n): string {\n return JSON.stringify({ type: request.type, params: request.params });\n}\n\nfunction toGaslessExecutionConfig(\n config: SessionGaslessStartConfig,\n): GaslessExecutionConfig {\n return {\n account: config.account,\n sponsor: config.sponsor,\n relayUrl: config.relayUrl,\n nonceKey:\n config.nonceKey !== undefined && config.nonceKey.trim() !== \"\"\n ? BigInt(config.nonceKey)\n : undefined,\n validityWindowSeconds: config.validityWindowSeconds,\n };\n}\n\nfunction loadSessionToken(tokenPath: string): string {\n try {\n return readFileSync(tokenPath, \"utf8\").trim();\n } catch {\n throw new Error(\"No active local MoneyOS session found.\");\n }\n}\n\nfunction writeSecureToken(tokenPath: string, token: string): void {\n ensureSecureParent(tokenPath);\n writeFileSync(tokenPath, `${token}\\n`, { mode: SECURE_FILE_MODE });\n if (shouldEnforcePosixPermissions()) {\n chmodSync(tokenPath, SECURE_FILE_MODE);\n }\n}\n\nfunction sessionFilesGone(socketPath: string, tokenPath: string): boolean {\n const tokenMissing = !existsSync(tokenPath);\n const socketMissing = isWindowsPipe(socketPath) ? true : !existsSync(socketPath);\n return tokenMissing && socketMissing;\n}\n\nasync function waitForSessionShutdown(\n socketPath: string,\n tokenPath: string,\n timeoutMs: number = SESSION_SHUTDOWN_TIMEOUT_MS,\n): Promise<void> {\n const startedAt = Date.now();\n while (!sessionFilesGone(socketPath, tokenPath)) {\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(\n \"Timed out waiting for the previous MoneyOS session to shut down cleanly.\",\n );\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n}\n\nfunction tokensMatch(expectedToken: string, receivedToken: string): boolean {\n const expected = Buffer.from(expectedToken, \"utf8\");\n const received = Buffer.from(receivedToken, \"utf8\");\n return (\n expected.length === received.length &&\n timingSafeEqual(expected, received)\n );\n}\n\nfunction readLine(socket: net.Socket): Promise<string> {\n return new Promise((resolve, reject) => {\n let buffer = \"\";\n\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString(\"utf8\");\n if (buffer.length > MAX_MESSAGE_BYTES) {\n cleanup();\n reject(new Error(\"Session response exceeded the maximum allowed size.\"));\n return;\n }\n const index = buffer.indexOf(\"\\n\");\n if (index >= 0) {\n cleanup();\n resolve(buffer.slice(0, index));\n }\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error(\"Session daemon closed the connection unexpectedly.\"));\n };\n\n const cleanup = () => {\n socket.off(\"data\", onData);\n socket.off(\"error\", onError);\n socket.off(\"close\", onClose);\n };\n\n socket.on(\"data\", onData);\n socket.once(\"error\", onError);\n socket.once(\"close\", onClose);\n });\n}\n\nasync function sendSessionRequest(\n socketPath: string,\n tokenPath: string,\n request: SessionRequestWithoutToken,\n timeoutMs: number = SESSION_CONTROL_TIMEOUT_MS,\n): Promise<SessionResponse> {\n const fullRequest = {\n ...request,\n token: loadSessionToken(tokenPath),\n } as SessionRequest;\n const socket = net.createConnection(socketPath);\n\n return new Promise<SessionResponse>((resolve, reject) => {\n let settled = false;\n const timer = setTimeout(() => {\n settled = true;\n socket.destroy();\n reject(new Error(\"Timed out waiting for local MoneyOS session.\"));\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timer);\n socket.removeAllListeners();\n };\n\n socket.once(\"connect\", async () => {\n try {\n socket.write(`${JSON.stringify(fullRequest)}${EOL}`);\n const line = await readLine(socket);\n settled = true;\n cleanup();\n socket.end();\n resolve(JSON.parse(line) as SessionResponse);\n } catch (error) {\n settled = true;\n cleanup();\n socket.destroy();\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n socket.once(\"error\", (error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n });\n });\n}\n\nfunction isRetryableSessionTransportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n if (\n error.message === \"Session daemon closed the connection unexpectedly.\"\n || error.message === \"Timed out waiting for local MoneyOS session.\"\n ) {\n return true;\n }\n\n const code = (error as NodeJS.ErrnoException).code;\n return (\n code === \"ECONNRESET\"\n || code === \"EPIPE\"\n || code === \"ETIMEDOUT\"\n || code === \"ERR_STREAM_DESTROYED\"\n );\n}\n\nfunction unwrapSessionSendResponse(response: SessionResponse): ExecutionResult {\n if (!response.ok) {\n throw new Error(response.error);\n }\n\n return response.result as ExecutionResult;\n}\n\nfunction capabilitiesForMode(\n mode: SessionExecutionMode,\n): SessionExecutionCapabilities {\n const smartAccount = mode === \"smart-account\";\n return {\n sponsoredGas: smartAccount,\n batching: false,\n simulation: smartAccount,\n };\n}\n\nexport async function getSessionStatus(\n socketPath: string,\n tokenPath: string,\n): Promise<SessionStatusResult | undefined> {\n try {\n const response = await sendSessionRequest(\n socketPath,\n tokenPath,\n {\n id: createRequestId(),\n type: \"status\",\n },\n SESSION_CONTROL_TIMEOUT_MS,\n );\n if (!response.ok) {\n return undefined;\n }\n\n const result = response.result as Partial<SessionStatusResult> & {\n address: Address;\n expiresAt: string;\n };\n const mode = result.mode ?? \"eoa\";\n return {\n address: result.address,\n expiresAt: result.expiresAt,\n mode,\n capabilities: result.capabilities ?? capabilitiesForMode(mode),\n };\n } catch {\n removeFileIfPresent(socketPath);\n removeFileIfPresent(tokenPath);\n return undefined;\n }\n}\n\nexport async function lockSession(\n socketPath: string,\n tokenPath: string,\n): Promise<boolean> {\n try {\n const response = await sendSessionRequest(\n socketPath,\n tokenPath,\n {\n id: createRequestId(),\n type: \"lock\",\n },\n SESSION_CONTROL_TIMEOUT_MS,\n );\n return response.ok;\n } catch {\n removeFileIfPresent(socketPath);\n removeFileIfPresent(tokenPath);\n return false;\n }\n}\n\nfunction serializeCallForSession(call: CallRequest): SessionSendParams {\n return {\n to: call.to,\n chainId: call.chainId,\n data: call.data,\n value: call.value?.toString(),\n };\n}\n\nexport class SessionExecutionClient implements ExecutionClient {\n readonly mode: SessionExecutionMode;\n private readonly socketPath: string;\n private readonly tokenPath: string;\n private readonly address: Address;\n private readonly caps: SessionExecutionCapabilities;\n\n constructor(params: {\n socketPath: string;\n tokenPath: string;\n address: Address;\n mode?: SessionExecutionMode;\n capabilities?: SessionExecutionCapabilities;\n }) {\n this.socketPath = params.socketPath;\n this.tokenPath = params.tokenPath;\n this.address = params.address;\n this.mode = params.mode ?? \"eoa\";\n this.caps = params.capabilities ?? capabilitiesForMode(this.mode);\n }\n\n getAddress(): Address {\n return this.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const requestId = createRequestId();\n\n try {\n return await this.sendWithRequestId(requestId, call);\n } catch (error) {\n if (!isRetryableSessionTransportError(error)) {\n throw error;\n }\n\n return this.sendWithRequestId(requestId, call);\n }\n }\n\n async sendBatch(calls: CallRequest[]): Promise<ExecutionResult> {\n if (calls.length === 0) {\n throw new Error(\"sendBatch requires at least one call\");\n }\n const requestId = createRequestId();\n\n try {\n return await this.sendBatchWithRequestId(requestId, calls);\n } catch (error) {\n if (!isRetryableSessionTransportError(error)) {\n throw error;\n }\n\n return this.sendBatchWithRequestId(requestId, calls);\n }\n }\n\n private async sendWithRequestId(\n requestId: string,\n call: CallRequest,\n ): Promise<ExecutionResult> {\n const response = await sendSessionRequest(\n this.socketPath,\n this.tokenPath,\n {\n id: requestId,\n type: \"send\",\n params: serializeCallForSession(call),\n },\n SESSION_SEND_TIMEOUT_MS,\n );\n return unwrapSessionSendResponse(response);\n }\n\n private async sendBatchWithRequestId(\n requestId: string,\n calls: CallRequest[],\n ): Promise<ExecutionResult> {\n const response = await sendSessionRequest(\n this.socketPath,\n this.tokenPath,\n {\n id: requestId,\n type: \"sendBatch\",\n params: {\n calls: calls.map(serializeCallForSession),\n },\n },\n SESSION_SEND_TIMEOUT_MS,\n );\n return unwrapSessionSendResponse(response);\n }\n\n capabilities(): SessionExecutionCapabilities {\n return { ...this.caps };\n }\n}\n\nfunction deserializeSessionCall(params: SessionSendParams): CallRequest {\n return {\n to: params.to,\n chainId: params.chainId,\n data: params.data,\n value: params.value !== undefined ? BigInt(params.value) : undefined,\n };\n}\n\nasync function executeSendLikeRequest(\n executor: ExecutionClient,\n request: Extract<SessionRequest, { type: \"send\" | \"sendBatch\" }>,\n): Promise<SessionResponse> {\n try {\n let result: ExecutionResult;\n if (request.type === \"send\") {\n result = await executor.send(deserializeSessionCall(request.params));\n } else {\n if (typeof executor.sendBatch !== \"function\") {\n return {\n id: request.id,\n ok: false,\n error: \"Session executor does not support batched execution.\",\n };\n }\n if (request.params.calls.length === 0) {\n return {\n id: request.id,\n ok: false,\n error: \"sendBatch requires at least one call\",\n };\n }\n result = await executor.sendBatch(\n request.params.calls.map(deserializeSessionCall),\n );\n }\n\n return {\n id: request.id,\n ok: true,\n result,\n };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function startSessionServer(\n start: SessionServerStartMessage,\n hooks: {\n executor?: ExecutionClient;\n onError?: (error: Error) => void;\n onExit?: () => void;\n } = {},\n): Promise<SessionServerHandle> {\n ensureSecureParent(start.tokenPath);\n ensureSecureParent(start.socketPath);\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n\n const signer = privateKeyToManagedAccount(start.privateKey);\n const executor = hooks.executor ?? (start.gasless\n ? createGaslessExecutionClient({\n signer,\n chainId: start.chainId,\n rpcUrl: start.rpcUrl,\n gasless: toGaslessExecutionConfig(start.gasless),\n })\n : new EOAExecutor(signer, {\n defaultChainId: start.chainId,\n rpcUrl: start.rpcUrl,\n }));\n const expiresAt = new Date(Date.now() + start.ttlMs);\n const token = randomBytes(32).toString(\"hex\");\n // Retain send results for the session lifetime so a retry with the same\n // request ID never rebroadcasts after a late disconnect.\n const sendResponses = new Map<string, StoredSendResponse>();\n writeSecureToken(start.tokenPath, token);\n\n let closed = false;\n\n const close = async () => {\n if (closed) return;\n closed = true;\n await new Promise<void>((resolve) => {\n server.close(() => {\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n hooks.onExit?.();\n resolve();\n });\n });\n };\n\n const server = net.createServer((socket) => {\n let buffer = \"\";\n socket.setTimeout(SERVER_SOCKET_TIMEOUT_MS, () => {\n socket.destroy();\n });\n\n socket.on(\"data\", async (chunk) => {\n buffer += chunk.toString(\"utf8\");\n if (buffer.length > MAX_MESSAGE_BYTES) {\n socket.write(\n `${JSON.stringify({\n id: \"unknown\",\n ok: false,\n error: \"Session request exceeded the maximum allowed size.\",\n })}${EOL}`,\n );\n socket.end();\n return;\n }\n\n const index = buffer.indexOf(\"\\n\");\n if (index < 0) {\n return;\n }\n\n const raw = buffer.slice(0, index);\n buffer = buffer.slice(index + 1);\n let request: SessionRequest;\n try {\n request = JSON.parse(raw) as SessionRequest;\n } catch {\n socket.write(\n `${JSON.stringify({\n id: \"unknown\",\n ok: false,\n error: \"Invalid session request.\",\n })}${EOL}`,\n );\n socket.end();\n return;\n }\n\n const respond = (response: SessionResponse) => {\n socket.write(`${JSON.stringify(response)}${EOL}`);\n socket.end();\n };\n\n try {\n if (!tokensMatch(token, String(request.token ?? \"\"))) {\n respond({\n id: request.id,\n ok: false,\n error: \"Session authentication failed.\",\n });\n return;\n }\n\n if (request.type === \"status\") {\n respond({\n id: request.id,\n ok: true,\n result: {\n address: executor.getAddress(),\n expiresAt: expiresAt.toISOString(),\n mode: executor.mode,\n capabilities: executor.capabilities(),\n },\n });\n return;\n }\n\n if (request.type === \"lock\") {\n respond({\n id: request.id,\n ok: true,\n result: { locked: true },\n });\n setImmediate(() => {\n void close();\n });\n return;\n }\n\n socket.setTimeout(SESSION_SEND_TIMEOUT_MS, () => {\n socket.destroy();\n });\n const fingerprint = createSendRequestFingerprint(request);\n const existing = sendResponses.get(request.id);\n if (existing) {\n if (existing.fingerprint !== fingerprint) {\n respond({\n id: request.id,\n ok: false,\n error: \"Session send request IDs cannot be reused with different parameters.\",\n });\n return;\n }\n\n respond(await existing.response);\n return;\n }\n\n const responsePromise = executeSendLikeRequest(executor, request);\n sendResponses.set(request.id, {\n fingerprint,\n response: responsePromise,\n });\n\n respond(await responsePromise);\n } catch (error) {\n respond({\n id: request.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", (error) => {\n hooks.onError?.(error instanceof Error ? error : new Error(String(error)));\n reject(error);\n });\n server.listen(start.socketPath, () => {\n if (\n shouldEnforcePosixPermissions()\n && !isWindowsPipe(start.socketPath)\n ) {\n chmodSync(start.socketPath, SECURE_FILE_MODE);\n }\n resolve();\n });\n });\n\n const timer = setTimeout(() => {\n void close();\n }, start.ttlMs);\n timer.unref();\n\n return {\n address: executor.getAddress(),\n expiresAt: expiresAt.toISOString(),\n mode: executor.mode,\n capabilities: executor.capabilities(),\n close,\n };\n}\n\nexport async function startDetachedSessionDaemon(\n params: SessionServerStartMessage,\n): Promise<SessionStatusResult> {\n const existing = await getSessionStatus(params.socketPath, params.tokenPath);\n if (existing) {\n const locked = await lockSession(params.socketPath, params.tokenPath);\n if (!locked && !sessionFilesGone(params.socketPath, params.tokenPath)) {\n throw new Error(\n \"Failed to replace the existing MoneyOS session. Run `moneyos auth lock` and try again.\",\n );\n }\n if (locked) {\n await waitForSessionShutdown(params.socketPath, params.tokenPath);\n }\n } else {\n removeFileIfPresent(params.socketPath);\n removeFileIfPresent(params.tokenPath);\n }\n\n return new Promise<SessionStatusResult>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [...process.execArgv, process.argv[1], \"__session-daemon\"],\n {\n detached: true,\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"],\n },\n );\n\n let settled = false;\n\n const finish = (error?: Error, status?: SessionStatusResult) => {\n if (settled) return;\n settled = true;\n child.removeAllListeners();\n if (error) {\n reject(error);\n return;\n }\n resolve(status as SessionStatusResult);\n };\n\n child.once(\"error\", (error) => finish(error));\n child.once(\"exit\", (code) => {\n if (!settled) {\n finish(\n new Error(\n `Session daemon exited unexpectedly with code ${code ?? \"unknown\"}.`,\n ),\n );\n }\n });\n child.on(\"message\", (message: unknown) => {\n const payload = message as\n | {\n type: \"ready\";\n address: Address;\n expiresAt: string;\n mode: SessionExecutionMode;\n capabilities?: SessionExecutionCapabilities;\n }\n | { type: \"error\"; error: string };\n if (payload?.type === \"ready\") {\n child.disconnect();\n child.unref();\n finish(undefined, {\n address: payload.address,\n expiresAt: payload.expiresAt,\n mode: payload.mode,\n capabilities:\n payload.capabilities ?? capabilitiesForMode(payload.mode),\n });\n } else if (payload?.type === \"error\") {\n finish(new Error(payload.error));\n }\n });\n\n child.send(params);\n });\n}\n\nexport async function runSessionDaemonProcess(): Promise<void> {\n if (!process.send) {\n throw new Error(\"Session daemon must be started through MoneyOS.\");\n }\n\n const start = await new Promise<SessionServerStartMessage>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Session daemon did not receive startup parameters.\"));\n }, 1000);\n\n process.once(\"message\", (message: unknown) => {\n clearTimeout(timeout);\n const payload = message as SessionServerStartMessage;\n if (payload?.type !== \"start\") {\n reject(new Error(\"Session daemon received invalid startup message.\"));\n return;\n }\n resolve(payload);\n });\n });\n\n const shutdown = (code: number = 0) => {\n removeFileIfPresent(start.socketPath);\n removeFileIfPresent(start.tokenPath);\n process.exit(code);\n };\n\n const handle = await startSessionServer(start, {\n onError: (error) => {\n process.send?.({\n type: \"error\",\n error: error.message,\n });\n shutdown(1);\n },\n onExit: () => shutdown(),\n });\n\n process.send?.({\n type: \"ready\",\n address: handle.address,\n expiresAt: handle.expiresAt,\n mode: handle.mode,\n capabilities: handle.capabilities,\n });\n process.on(\"SIGTERM\", () => {\n void handle.close().then(() => shutdown());\n });\n process.on(\"SIGINT\", () => {\n void handle.close().then(() => shutdown());\n });\n}\n","import type { ExecutionClient, RuntimeConfig } from \"@moneyos/core\";\nimport {\n GaslessExecutor,\n RelayClient,\n moneyOSAccountV1Abi,\n type NonceResolverInput,\n} from \"@moneyos/smart-account\";\nimport { createPublicClient, http, type Account, type Address } from \"viem\";\nimport type { LocalAccount } from \"viem/accounts\";\nimport { resolveChainTransport } from \"./chains.js\";\n\nexport interface GaslessExecutionConfig {\n account: Address;\n sponsor: Address;\n relayUrl: string;\n nonceKey?: bigint;\n validityWindowSeconds?: number;\n}\n\nfunction asLocalAccount(signer: Account): LocalAccount {\n if (typeof (signer as LocalAccount).signTypedData !== \"function\") {\n throw new Error(\n \"Gasless mode requires a local signer that can sign typed data.\",\n );\n }\n\n return signer as LocalAccount;\n}\n\nexport function createGaslessExecutionClient(params: {\n signer: Account;\n chainId: number;\n rpcUrl?: string;\n gasless: GaslessExecutionConfig;\n}): ExecutionClient {\n const runtimeConfig: RuntimeConfig = {\n defaultChainId: params.chainId,\n rpcUrl: params.rpcUrl,\n };\n const { chain, rpcUrl } = resolveChainTransport(params.chainId, runtimeConfig);\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n const relay = new RelayClient({\n baseUrl: params.gasless.relayUrl,\n });\n\n const nonceResolver = async (input: NonceResolverInput): Promise<bigint> => {\n const code = await publicClient.getCode({\n address: params.gasless.account,\n });\n if (!code || code === \"0x\") {\n return 0n;\n }\n\n return publicClient.readContract({\n address: params.gasless.account,\n abi: moneyOSAccountV1Abi,\n functionName: \"getNonce\",\n args: [input.signer, input.nonceKey],\n }) as Promise<bigint>;\n };\n\n return new GaslessExecutor({\n account: params.gasless.account,\n sponsor: params.gasless.sponsor,\n chainId: params.chainId,\n signer: asLocalAccount(params.signer),\n relay,\n nonceResolver,\n nonceKey: params.gasless.nonceKey,\n validityWindowSeconds: params.gasless.validityWindowSeconds,\n });\n}\n","import type { Address } from \"viem\";\n\nexport interface Token {\n symbol: string;\n name: string;\n decimals: number;\n addresses: Record<number, Address>;\n}\n\nexport const NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\n USDC: {\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n addresses: {\n 42161: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n 1: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n 137: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n },\n },\n USDT: {\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n addresses: {\n 42161: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n 1: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n 137: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n },\n },\n WETH: {\n symbol: \"WETH\",\n name: \"Wrapped Ether\",\n decimals: 18,\n addresses: {\n 42161: \"0x82af49447d8a07e3bd95bd0d56f35241523fbab1\",\n 1: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n },\n },\n RYZE: {\n symbol: \"RYZE\",\n name: \"RYZE\",\n decimals: 18,\n addresses: {\n 42161: \"0x7712da72127d5dD213B621497D6E4899d5989e5C\",\n },\n },\n};\n\nexport function getToken(symbol: string): Token | undefined {\n return tokens[symbol.toUpperCase()];\n}\n\nexport function getTokenAddress(\n symbol: string,\n chainId: number,\n): Address | undefined {\n return getToken(symbol)?.addresses[chainId];\n}\n\n/**\n * Return the built-in tokens that have an address on the given chain.\n *\n * Order matches declaration order in the `tokens` record so callers get\n * stable output. Tokens that are not registered on `chainId` are omitted.\n */\nexport function listTokens(chainId: number): Token[] {\n return Object.values(tokens).filter(\n (token) => token.addresses[chainId] !== undefined,\n );\n}\n","import type { Chain } from \"./types.js\";\n\nexport const chains: Record<string, Chain> = {\n arbitrum: {\n id: 42161,\n name: \"Arbitrum One\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://arbiscan.io\",\n },\n ethereum: {\n id: 1,\n name: \"Ethereum\",\n rpcUrl: \"https://ethereum-rpc.publicnode.com\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://etherscan.io\",\n },\n polygon: {\n id: 137,\n name: \"Polygon\",\n rpcUrl: \"https://polygon-bor-rpc.publicnode.com\",\n nativeCurrency: { name: \"POL\", symbol: \"POL\", decimals: 18 },\n blockExplorer: \"https://polygonscan.com\",\n },\n};\n\nexport const defaultChain = chains.arbitrum;\n\nexport function getChain(idOrName: number | string): Chain | undefined {\n if (typeof idOrName === \"number\") {\n return Object.values(chains).find((c) => c.id === idOrName);\n }\n return chains[idOrName.toLowerCase()];\n}\n","export { chains, defaultChain, getChain } from \"@moneyos/core\";\n\nimport type { Chain as ViemChain } from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain as getCoreChain, type RuntimeConfig } from \"@moneyos/core\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nexport function getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\nfunction getSupportedChainLabel(chainId: number): string {\n const chain = getCoreChain(chainId);\n return chain ? `${chainId} (${chain.name})` : String(chainId);\n}\n\nfunction unsupportedChainError(chainId: number): Error {\n const supported = Object.keys(viemChainMap)\n .map(Number)\n .sort((a, b) => a - b)\n .map(getSupportedChainLabel)\n .join(\", \");\n\n return new Error(\n `Unsupported chain ${chainId}. Supported chains: ${supported}.`,\n );\n}\n\nexport function resolveChainTransport(\n chainId: number,\n config: RuntimeConfig,\n): { chain: ViemChain; rpcUrl: string } {\n const chain = getViemChain(chainId);\n const chainInfo = getCoreChain(chainId);\n if (!chain || !chainInfo) {\n throw unsupportedChainError(chainId);\n }\n\n return {\n chain,\n rpcUrl:\n chainId === config.defaultChainId && config.rpcUrl\n ? config.rpcUrl\n : chainInfo.rpcUrl,\n };\n}\n","import {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\nimport { resolveChainTransport } from \"./chains.js\";\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const { chain, rpcUrl } = resolveChainTransport(chainId, this.config);\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import { Command } from \"commander\";\nimport { listTokens } from \"@moneyos/core\";\nimport { MoneyOS } from \"../../core/client.js\";\nimport { loadConfig } from \"../config.js\";\nimport type { Address } from \"viem\";\nimport {\n buildCliMoneyOSConfig,\n resolveCliOwnedAddresses,\n} from \"../wallet.js\";\n\ninterface BalanceTarget {\n address: Address;\n label?: \"EOA\" | \"Smart account\";\n}\n\nfunction shortenAddress(address: Address): string {\n return `${address.slice(0, 6)}…${address.slice(-4)}`;\n}\n\nfunction formatTargetLabel(target: BalanceTarget): string {\n return `${target.label} (${shortenAddress(target.address)}):`;\n}\n\nfunction targetLineWidth(targets: BalanceTarget[]): number {\n return Math.max(...targets.map((target) => formatTargetLabel(target).length));\n}\n\nasync function resolveBalanceTargets(\n config: ReturnType<typeof loadConfig>,\n chainId: number,\n address?: Address,\n): Promise<BalanceTarget[]> {\n if (address) {\n return [{ address }];\n }\n\n const resolved = await resolveCliOwnedAddresses(config, { chainId });\n if (\n resolved.smartAccount &&\n resolved.smartAccount.toLowerCase() !== resolved.eoa.toLowerCase()\n ) {\n return [\n { label: \"EOA\", address: resolved.eoa },\n { label: \"Smart account\", address: resolved.smartAccount },\n ];\n }\n\n return [{ address: resolved.eoa }];\n}\n\nexport const balanceCommand = new Command(\"balance\")\n .description(\"Check token balance\")\n .argument(\"[token]\", \"Token symbol (e.g. USDC, ETH, RYZE). Omit with --all.\")\n .option(\"-a, --address <address>\", \"Address to check (defaults to your own)\")\n .option(\"-c, --chain <chainId>\", \"Chain ID (default: 42161 Arbitrum)\")\n .option(\"--all\", \"Show balances for every built-in token on the selected chain\")\n .action(async (token: string | undefined, options) => {\n if (options.all && token !== undefined) {\n console.error(\"Cannot combine a token argument with --all.\");\n process.exitCode = 1;\n return;\n }\n if (!options.all && token === undefined) {\n console.error(\"Missing token. Pass a token symbol or use --all.\");\n process.exitCode = 1;\n return;\n }\n\n const config = loadConfig();\n const chainId = options.chain ? parseInt(options.chain) : (config.chainId ?? 42161);\n const address = options.address as Address | undefined;\n\n let moneyos: MoneyOS;\n let targets: BalanceTarget[];\n try {\n targets = await resolveBalanceTargets(config, chainId, address);\n moneyos = new MoneyOS(\n await buildCliMoneyOSConfig(config, {\n chainId,\n requireSigner: false,\n }),\n );\n } catch (error) {\n console.error(\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n return;\n }\n\n if (options.all) {\n const candidates = listTokens(chainId);\n if (candidates.length === 0) {\n console.error(\n `No built-in tokens registered on chain ${chainId}.`,\n );\n process.exitCode = 1;\n return;\n }\n\n let anyFailed = false;\n for (const [index, target] of targets.entries()) {\n if (target.label) {\n if (index > 0) console.log(\"\");\n console.log(formatTargetLabel(target));\n }\n\n const results = await Promise.allSettled(\n candidates.map((candidate) =>\n moneyos.balance(candidate.symbol, { address: target.address, chainId }),\n ),\n );\n\n const width = Math.max(...candidates.map((candidate) => candidate.symbol.length));\n results.forEach((result, resultIndex) => {\n const symbol = candidates[resultIndex].symbol.padEnd(width);\n if (result.status === \"fulfilled\") {\n console.log(`${symbol} ${result.value.amount}`);\n return;\n }\n\n anyFailed = true;\n const message =\n result.reason instanceof Error\n ? result.reason.message\n : String(result.reason);\n console.log(`${symbol} error: ${message}`);\n });\n }\n\n if (anyFailed) process.exitCode = 1;\n return;\n }\n\n if (targets.length === 1) {\n const result = await moneyos.balance(token as string, {\n address: targets[0].address,\n chainId,\n });\n\n console.log(`${result.amount} ${result.symbol}`);\n return;\n }\n\n const width = targetLineWidth(targets);\n const results = await Promise.all(\n targets.map((target) =>\n moneyos.balance(token as string, {\n address: target.address,\n chainId,\n }),\n ),\n );\n\n results.forEach((result, index) => {\n console.log(\n `${formatTargetLabel(targets[index]).padEnd(width)} ${result.symbol} ${result.amount}`,\n );\n });\n });\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n defaultChain,\n listTokens,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { DefaultAssetRegistry } from \"./assets.js\";\nimport { NO_SIGNING_ACCOUNT_ERROR } from \"./no-executor.js\";\n\nconst ERC20_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"symbol\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n] as const;\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(NO_SIGNING_ACCOUNT_ERROR);\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\n return {\n token: tokenInfo.name,\n symbol: tokenInfo.symbol,\n amount: formatUnits(raw, tokenInfo.decimals),\n rawAmount: raw,\n decimals: tokenInfo.decimals,\n chainId,\n };\n }\n\n const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\n });\n\n return {\n token: tokenInfo.name,\n symbol: tokenInfo.symbol,\n amount: formatUnits(raw, tokenInfo.decimals),\n rawAmount: raw,\n decimals: tokenInfo.decimals,\n chainId,\n };\n }\n\n /**\n * Read balances for every token the configured asset registry can enumerate\n * on the given chain.\n *\n * Fails fast if any underlying read fails — callers that need partial\n * results should iterate `listTokens(chainId)` and call {@link balance}\n * with their own error handling.\n */\n async balances(\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance[]> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n const candidates =\n this.assets.listTokens?.(chainId) ??\n listTokens(chainId).filter(\n (token) =>\n this.assets.getToken(token.symbol) !== undefined &&\n this.assets.getTokenAddress(token.symbol, chainId) !== undefined,\n );\n return Promise.all(\n candidates.map((token) =>\n this.balance(token.symbol, { address: account, chainId }),\n ),\n );\n }\n\n async send(\n token: string,\n to: Address,\n amount: string,\n options?: { chainId?: number },\n ): Promise<SendResult> {\n const execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n}\n","import {\n getChain,\n getToken,\n getTokenAddress,\n listTokens as listBuiltInTokens,\n NATIVE_TOKEN_ADDRESS,\n type AssetRegistry,\n} from \"@moneyos/core\";\n\nexport class DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n listTokens = listBuiltInTokens;\n getChain = getChain;\n}\n","import type { ExecutionClient, ExecutionResult, CallRequest } from \"@moneyos/core\";\n\nexport const NO_SIGNING_ACCOUNT_ERROR =\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\";\n\nfunction throwNoSigningAccount(): never {\n throw new Error(NO_SIGNING_ACCOUNT_ERROR);\n}\n\nexport function createNoExecutorClient(): ExecutionClient {\n return {\n mode: \"eoa\",\n getAddress(): never {\n return throwNoSigningAccount();\n },\n async send(_call: CallRequest): Promise<ExecutionResult> {\n return throwNoSigningAccount();\n },\n async sendBatch(_calls: CallRequest[]): Promise<ExecutionResult> {\n return throwNoSigningAccount();\n },\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n },\n };\n}\n","import type { ExecutionClient } from \"@moneyos/core\";\nimport {\n getSessionSocketPath,\n getSessionTokenPath,\n} from \"./cli/config.js\";\nimport { getSessionStatus, SessionExecutionClient } from \"./cli/session.js\";\n\nexport interface ConnectLocalSessionOptions {\n socketPath?: string;\n tokenPath?: string;\n}\n\nexport async function connectLocalSession(\n options: ConnectLocalSessionOptions = {},\n): Promise<ExecutionClient> {\n const socketPath = options.socketPath ?? getSessionSocketPath();\n const tokenPath = options.tokenPath ?? getSessionTokenPath();\n const session = await getSessionStatus(socketPath, tokenPath);\n\n if (!session) {\n throw new Error(\n \"No active local MoneyOS session found. Run `moneyos auth unlock` locally first.\",\n );\n }\n\n return new SessionExecutionClient({\n socketPath,\n tokenPath,\n address: session.address,\n mode: session.mode,\n capabilities: session.capabilities,\n });\n}\n","import type { Address } from \"viem\";\nimport {\n deriveDefaultGaslessAccount,\n getGaslessNetworkDefaults,\n} from \"@moneyos/smart-account\";\nimport type { GaslessExecutionConfig } from \"../core/gasless.js\";\nimport type { CLIConfig } from \"./config.js\";\n\nconst GASLESS_ENABLED_ENV = \"MONEYOS_GASLESS_ENABLED\";\nconst GASLESS_RELAY_URL_ENV = \"MONEYOS_GASLESS_RELAY_URL\";\nconst GASLESS_ACCOUNT_ENV = \"MONEYOS_GASLESS_ACCOUNT\";\nconst GASLESS_SPONSOR_ENV = \"MONEYOS_GASLESS_SPONSOR\";\n\nexport const gaslessEnvVarNames = {\n enabled: GASLESS_ENABLED_ENV,\n relayUrl: GASLESS_RELAY_URL_ENV,\n account: GASLESS_ACCOUNT_ENV,\n sponsor: GASLESS_SPONSOR_ENV,\n} as const;\n\nfunction parseGaslessEnabledEnv(value: string): boolean {\n const normalized = value.trim().toLowerCase();\n return [\"1\", \"true\", \"yes\", \"on\"].includes(normalized);\n}\n\nexport function isGaslessEnabled(config: CLIConfig): boolean {\n if (typeof process.env[GASLESS_ENABLED_ENV] === \"string\") {\n return parseGaslessEnabledEnv(process.env[GASLESS_ENABLED_ENV]);\n }\n\n return config.gasless?.enabled === true;\n}\n\nexport function getGaslessRequiredEnvPresence(config: CLIConfig): {\n relayUrl: boolean;\n account: boolean;\n sponsor: boolean;\n} {\n const defaults = config.chainId\n ? getGaslessNetworkDefaults(config.chainId)\n : undefined;\n\n return {\n relayUrl: Boolean(\n process.env[GASLESS_RELAY_URL_ENV] ??\n config.gasless?.relayUrl ??\n defaults?.relayUrl,\n ),\n account: Boolean(process.env[GASLESS_ACCOUNT_ENV] ?? config.gasless?.account),\n sponsor: Boolean(\n process.env[GASLESS_SPONSOR_ENV] ??\n config.gasless?.sponsor ??\n defaults?.sponsor,\n ),\n };\n}\n\nexport async function resolveGaslessExecutionConfig(\n config: CLIConfig,\n options: {\n ownerAddress?: Address;\n rpcUrl?: string;\n chainId?: number;\n } = {},\n): Promise<GaslessExecutionConfig | undefined> {\n if (!isGaslessEnabled(config)) {\n return undefined;\n }\n\n const chainId = options.chainId ?? config.chainId;\n const defaults = chainId ? getGaslessNetworkDefaults(chainId) : undefined;\n const relayUrl =\n process.env[GASLESS_RELAY_URL_ENV] ??\n config.gasless?.relayUrl ??\n defaults?.relayUrl;\n const sponsor =\n (process.env[GASLESS_SPONSOR_ENV] as Address | undefined) ??\n (config.gasless?.sponsor as Address | undefined) ??\n defaults?.sponsor;\n\n let account =\n (process.env[GASLESS_ACCOUNT_ENV] as Address | undefined) ??\n (config.gasless?.account as Address | undefined);\n\n if (!account && chainId && options.ownerAddress) {\n account = await deriveDefaultGaslessAccount({\n chainId,\n owner: options.ownerAddress,\n rpcUrl: options.rpcUrl,\n });\n }\n\n if (!relayUrl || !account || !sponsor) {\n return undefined;\n }\n\n return { relayUrl, account, sponsor };\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport type { Address, Hex } from \"viem\";\nimport { FileEncryptedWalletStore } from \"../core/encrypted-wallet.js\";\nimport { createGaslessExecutionClient } from \"../core/gasless.js\";\nimport { privateKeyToManagedAccount } from \"../core/signer.js\";\nimport {\n getLegacyPlaintextWalletStorageMessage,\n getRemovedOnePasswordStorageMessage,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n hasLegacyPlaintextWalletConfig,\n hasRemovedOnePasswordConfig,\n type CLIConfig,\n} from \"./config.js\";\nimport { connectLocalSession } from \"../local-session.js\";\nimport { isGaslessEnabled, resolveGaslessExecutionConfig } from \"./gasless.js\";\n\nconst GASLESS_MISSING_ENV_ERROR =\n \"Gasless mode is enabled but required environment variables are missing. Set MONEYOS_GASLESS_RELAY_URL, MONEYOS_GASLESS_ACCOUNT, and MONEYOS_GASLESS_SPONSOR.\";\n\nexport type CliWalletBackendKind = \"env\" | \"wallet-file\" | \"session\";\n\nexport interface ResolvedCliAddress {\n kind: \"env\" | \"wallet-file\";\n address: Address;\n source: \"env\" | \"encrypted-wallet\";\n}\n\nexport interface ResolveCliWalletOptions {\n walletPath?: string;\n sessionSocketPath?: string;\n sessionTokenPath?: string;\n envPrivateKey?: Hex;\n}\n\nexport interface BuildCliMoneyOSConfigOptions extends ResolveCliWalletOptions {\n chainId?: number;\n requireSigner?: boolean;\n}\n\nexport interface ResolvedCliOwnedAddresses {\n eoa: Address;\n smartAccount?: Address;\n}\n\nfunction resolveEnvPrivateKey(explicit?: Hex): Hex | undefined {\n return explicit ?? (process.env.MONEYOS_PRIVATE_KEY as Hex | undefined);\n}\n\nfunction getWalletStore(\n config: CLIConfig,\n options: ResolveCliWalletOptions = {},\n): FileEncryptedWalletStore {\n return new FileEncryptedWalletStore(options.walletPath ?? getWalletPath(config));\n}\n\nfunction getSessionPath(options: ResolveCliWalletOptions = {}): string {\n return options.sessionSocketPath ?? getSessionSocketPath();\n}\n\nfunction getTokenPath(options: ResolveCliWalletOptions = {}): string {\n return options.sessionTokenPath ?? getSessionTokenPath();\n}\n\n/**\n * Resolve the address the CLI should use for read-only \"my wallet\" commands.\n *\n * This prefers cheap wallet metadata over any signing path so read-only\n * balance checks do not require an unlocked session.\n */\nexport async function loadCliAddress(\n config: CLIConfig,\n options: ResolveCliWalletOptions = {},\n): Promise<ResolvedCliAddress> {\n const envPrivateKey = resolveEnvPrivateKey(options.envPrivateKey);\n if (envPrivateKey) {\n const signer = privateKeyToManagedAccount(envPrivateKey);\n return {\n kind: \"env\",\n address: signer.address,\n source: \"env\",\n };\n }\n\n if (hasRemovedOnePasswordConfig(config)) {\n throw new Error(getRemovedOnePasswordStorageMessage());\n }\n\n const wallet = getWalletStore(config, options);\n const metadata = await wallet.metadata();\n if (metadata?.address) {\n return {\n kind: \"wallet-file\",\n address: metadata.address,\n source: \"encrypted-wallet\",\n };\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n throw new Error(getLegacyPlaintextWalletStorageMessage());\n }\n\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n}\n\nexport async function resolveCliOwnedAddresses(\n config: CLIConfig,\n options: BuildCliMoneyOSConfigOptions = {},\n): Promise<ResolvedCliOwnedAddresses> {\n const { address } = await loadCliAddress(config, options);\n\n if (!isGaslessEnabled(config)) {\n return { eoa: address };\n }\n\n const gasless = await resolveGaslessExecutionConfig(config, {\n ownerAddress: address,\n chainId: options.chainId ?? config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n });\n\n if (!gasless) {\n throw new Error(GASLESS_MISSING_ENV_ERROR);\n }\n\n return {\n eoa: address,\n smartAccount: gasless.account,\n };\n}\n\nexport async function buildCliMoneyOSConfig(\n config: CLIConfig,\n options: BuildCliMoneyOSConfigOptions = {},\n): Promise<MoneyOSConfig> {\n const moneyosConfig: MoneyOSConfig = {\n chainId: options.chainId ?? config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n };\n\n if (!options.requireSigner) {\n return moneyosConfig;\n }\n\n const gaslessEnabled = isGaslessEnabled(config);\n\n const envPrivateKey = resolveEnvPrivateKey(options.envPrivateKey);\n if (envPrivateKey) {\n const signer = privateKeyToManagedAccount(envPrivateKey);\n const gasless = await resolveGaslessExecutionConfig(config, {\n ownerAddress: signer.address,\n chainId: moneyosConfig.chainId,\n rpcUrl: moneyosConfig.rpcUrl,\n });\n if (!gasless) {\n if (gaslessEnabled) {\n throw new Error(GASLESS_MISSING_ENV_ERROR);\n }\n return {\n ...moneyosConfig,\n signer,\n };\n }\n\n return {\n ...moneyosConfig,\n execute: createGaslessExecutionClient({\n signer,\n chainId: moneyosConfig.chainId,\n rpcUrl: moneyosConfig.rpcUrl,\n gasless,\n }),\n };\n }\n\n if (hasRemovedOnePasswordConfig(config)) {\n throw new Error(getRemovedOnePasswordStorageMessage());\n }\n\n const socketPath = getSessionPath(options);\n const tokenPath = getTokenPath(options);\n try {\n const sessionExecute = await connectLocalSession({\n socketPath,\n tokenPath,\n });\n\n if (gaslessEnabled && sessionExecute.mode !== \"smart-account\") {\n throw new Error(\n \"Gasless mode is enabled, but the active wallet session is still using the EOA executor. Run `moneyos auth unlock` again.\",\n );\n }\n\n if (!gaslessEnabled && sessionExecute.mode === \"smart-account\") {\n throw new Error(\n \"Gasless mode is disabled, but the active wallet session is still gasless. Run `moneyos auth unlock` again.\",\n );\n }\n\n return {\n ...moneyosConfig,\n execute: sessionExecute,\n };\n } catch (error) {\n if (error instanceof Error && /active wallet session is still/.test(error.message)) {\n throw error;\n }\n // Fall through so the CLI preserves the current locked-wallet error path.\n }\n\n const wallet = getWalletStore(config, options);\n if (wallet.exists()) {\n throw new Error(\n \"Wallet is locked. Run `moneyos auth unlock` locally before using write commands.\",\n );\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n throw new Error(getLegacyPlaintextWalletStorageMessage());\n }\n\n throw new Error(\"No wallet configured. Run `moneyos init`.\");\n}\n","import { Command } from \"commander\";\nimport { getChain } from \"@moneyos/core\";\nimport type { Address } from \"viem\";\nimport { isAddress } from \"viem\";\nimport { MoneyOS } from \"../../core/client.js\";\nimport { loadConfig } from \"../config.js\";\nimport { resolveContact } from \"../contacts.js\";\nimport { buildCliMoneyOSConfig } from \"../wallet.js\";\n\nexport function resolveSendRecipient(input: string): Address {\n if (isAddress(input)) {\n return input as Address;\n }\n\n const contact = resolveContact(input);\n if (contact) {\n console.log(`Resolved ${input} → ${contact}`);\n return contact;\n }\n\n throw new Error(\n `Could not resolve \"${input}\". Use a 0x address or add a contact with \"moneyos contact set ${input} 0x...\".`,\n );\n}\n\nexport const sendCommand = new Command(\"send\")\n .description(\"Send tokens to an address or a saved contact name\")\n .argument(\"<amount>\", \"Amount to send (e.g. 10)\")\n .argument(\"<token>\", \"Token symbol (e.g. USDC, ETH, RYZE)\")\n .argument(\"<to>\", \"Recipient address (0x...) or saved contact name\")\n .option(\"-c, --chain <chainId>\", \"Chain ID (default: 42161 Arbitrum)\")\n .action(async (amount: string, token: string, to: string, options) => {\n const config = loadConfig();\n\n const chainId = options.chain\n ? parseInt(options.chain)\n : config.chainId ?? 42161;\n\n let recipient: Address;\n try {\n recipient = resolveSendRecipient(to);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n return;\n }\n\n let moneyos: MoneyOS;\n try {\n moneyos = new MoneyOS(\n await buildCliMoneyOSConfig(config, {\n chainId,\n requireSigner: true,\n }),\n );\n } catch (error) {\n console.error(\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n return;\n }\n\n const chain = getChain(chainId);\n console.log(\n `Sending ${amount} ${token.toUpperCase()} to ${recipient} on ${chain?.name ?? chainId}...`,\n );\n\n const result = await moneyos.send(token, recipient, amount, {\n chainId,\n });\n\n console.log(`Sent. tx: ${result.hash}`);\n });\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { Address } from \"viem\";\nimport { getAddress, isAddress } from \"viem\";\nimport { getContactsPath } from \"./config.js\";\n\n/**\n * Local, per-user address book stored at `~/.moneyos/contacts.json`.\n *\n * Flat `name → address` mapping. No shared namespace, no network access, no\n * resolver abstraction — see issue #89. Names are case-sensitive.\n */\nexport type ContactsFile = Record<string, Address>;\n\nconst NAME_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function validateContactName(name: string): string {\n if (typeof name !== \"string\") {\n throw new Error(\"Contact name must be a string.\");\n }\n const trimmed = name.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Contact name cannot be empty.\");\n }\n if (trimmed.includes(\":\")) {\n throw new Error(\n \"Contact name cannot contain ':' (reserved for future resolver prefixes).\",\n );\n }\n if (!NAME_PATTERN.test(trimmed)) {\n throw new Error(\n \"Contact name may only contain letters, numbers, dots, dashes, and underscores.\",\n );\n }\n if (isAddress(trimmed)) {\n throw new Error(\"Contact name cannot look like an Ethereum address.\");\n }\n return trimmed;\n}\n\nexport function validateContactAddress(address: string): Address {\n if (typeof address !== \"string\" || !isAddress(address)) {\n throw new Error(`\"${address}\" is not a valid Ethereum address.`);\n }\n return getAddress(address);\n}\n\nconst FILE_MODE = 0o600;\nconst DIR_MODE = 0o700;\n\nfunction shouldEnforcePosixPermissions(): boolean {\n return process.platform !== \"win32\";\n}\n\nfunction hasOwn(record: ContactsFile, name: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, name);\n}\n\nexport function loadContacts(path: string = getContactsPath()): ContactsFile {\n if (!existsSync(path)) {\n return {};\n }\n\n const raw = readFileSync(path, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Contacts file at ${path} is not valid JSON.`);\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Contacts file at ${path} must be a JSON object.`);\n }\n\n return parsed as ContactsFile;\n}\n\nexport function saveContacts(\n contacts: ContactsFile,\n path: string = getContactsPath(),\n): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: DIR_MODE });\n }\n writeFileSync(path, `${JSON.stringify(contacts, null, 2)}\\n`, {\n mode: FILE_MODE,\n });\n // `writeFileSync`'s `mode` option only applies on create. Enforce the mode\n // explicitly on overwrite so the file never drifts back to 0644, matching\n // the pattern used in src/cli/session.ts for the session token.\n if (shouldEnforcePosixPermissions()) {\n chmodSync(path, FILE_MODE);\n }\n}\n\nexport interface SavedContact {\n name: string;\n address: Address;\n}\n\nexport function setContact(\n name: string,\n address: string,\n path?: string,\n): SavedContact {\n const normalizedName = validateContactName(name);\n const normalizedAddress = validateContactAddress(address);\n const contacts = loadContacts(path);\n contacts[normalizedName] = normalizedAddress;\n saveContacts(contacts, path);\n return { name: normalizedName, address: normalizedAddress };\n}\n\nexport function removeContact(name: string, path?: string): boolean {\n const normalizedName = validateContactName(name);\n const contacts = loadContacts(path);\n if (!hasOwn(contacts, normalizedName)) {\n return false;\n }\n delete contacts[normalizedName];\n saveContacts(contacts, path);\n return true;\n}\n\nexport function listContacts(path?: string): SavedContact[] {\n const contacts = loadContacts(path);\n return Object.entries(contacts)\n .map(([name, address]) => ({ name, address: address as Address }))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Look up a name in the local contacts file.\n *\n * Returns `undefined` if the name is not found. Does not throw on bad input —\n * callers are expected to handle missing contacts as \"not a contact, try\n * something else.\"\n *\n * Uses an own-property check so names that collide with Object prototype\n * members (e.g. `toString`, `constructor`) do not silently resolve to\n * inherited values.\n */\nexport function resolveContact(\n name: string,\n path?: string,\n): Address | undefined {\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const contacts = loadContacts(path);\n if (!hasOwn(contacts, name)) {\n return undefined;\n }\n return contacts[name];\n}\n","import { Command } from \"commander\";\nimport {\n loadFileConfig,\n} from \"../config.js\";\nimport {\n formatWalletStatus,\n resolveWalletStatus,\n} from \"../wallet-status.js\";\n\nexport const keystoreCommand = new Command(\"keystore\").description(\n \"Compatibility alias for wallet status\",\n);\n\nkeystoreCommand\n .command(\"status\")\n .description(\"Show the current wallet storage status\")\n .action(async () => {\n const config = loadFileConfig();\n const status = await resolveWalletStatus(config);\n console.log(formatWalletStatus(status));\n });\n","import type { Address } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { FileEncryptedWalletStore } from \"../core/encrypted-wallet.js\";\nimport {\n getLegacyPlaintextWalletStorageMessage,\n getRemovedOnePasswordCachedAddress,\n getRemovedOnePasswordStorageMessage,\n getWalletPath,\n hasLegacyPlaintextWalletConfig,\n hasRemovedOnePasswordConfig,\n type CLIConfig,\n} from \"./config.js\";\n\nexport type WalletStatusKind =\n | \"encrypted\"\n | \"none\"\n | \"legacy\"\n | \"unsupported\"\n | \"invalid\";\n\nexport interface ResolvedWalletStatus {\n kind: WalletStatusKind;\n address?: Address;\n walletPath: string;\n reason?: string;\n}\n\nexport async function resolveWalletStatus(\n config: CLIConfig,\n walletPath: string = getWalletPath(config),\n): Promise<ResolvedWalletStatus> {\n if (hasRemovedOnePasswordConfig(config)) {\n return {\n kind: \"unsupported\",\n address: getRemovedOnePasswordCachedAddress(config),\n walletPath,\n reason: getRemovedOnePasswordStorageMessage(),\n };\n }\n\n const store = new FileEncryptedWalletStore(walletPath);\n if (store.exists()) {\n try {\n const metadata = await store.metadata();\n return {\n kind: metadata ? \"encrypted\" : \"none\",\n address: metadata?.address,\n walletPath,\n };\n } catch (error) {\n return {\n kind: \"invalid\",\n walletPath,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n if (hasLegacyPlaintextWalletConfig(config)) {\n try {\n const address = privateKeyToAccount(config.privateKey!).address;\n return {\n kind: \"legacy\",\n walletPath,\n address,\n reason: getLegacyPlaintextWalletStorageMessage(),\n };\n } catch (error) {\n return {\n kind: \"legacy\",\n walletPath,\n reason:\n error instanceof Error\n ? `${getLegacyPlaintextWalletStorageMessage()} (${error.message})`\n : getLegacyPlaintextWalletStorageMessage(),\n };\n }\n }\n\n return {\n kind: \"none\",\n walletPath,\n };\n}\n\nexport function formatWalletStatus(status: ResolvedWalletStatus): string {\n const lines: string[] = [];\n\n if (status.kind === \"none\") {\n lines.push(\"Wallet: (none)\");\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\"Status: no wallet configured — run `moneyos init`\");\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"unsupported\") {\n lines.push(\"Wallet: removed legacy model\");\n if (status.address) {\n lines.push(`Address: ${status.address} (cached metadata)`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\n `Status: removed — ${status.reason ?? \"unsupported legacy config\"}`,\n );\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"legacy\") {\n lines.push(\"Wallet: legacy plaintext config\");\n if (status.address) {\n lines.push(`Address: ${status.address}`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\n `Status: upgrade required — ${status.reason ?? 'run `moneyos init`'}`,\n );\n return lines.join(\"\\n\");\n }\n\n if (status.kind === \"invalid\") {\n lines.push(\"Wallet: encrypted local wallet\");\n lines.push(`Path: ${status.walletPath}`);\n lines.push(`Status: invalid — ${status.reason ?? \"wallet file is unreadable\"}`);\n return lines.join(\"\\n\");\n }\n\n lines.push(\"Wallet: encrypted local wallet\");\n if (status.address) {\n lines.push(`Address: ${status.address}`);\n }\n lines.push(`Path: ${status.walletPath}`);\n lines.push(\"Status: ready\");\n return lines.join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n FileEncryptedWalletStore,\n type EncryptedWalletStore,\n} from \"../../core/encrypted-wallet.js\";\nimport {\n type CLIConfig,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n loadFileConfig,\n} from \"../config.js\";\nimport { resolveGaslessExecutionConfig } from \"../gasless.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport {\n getSessionStatus,\n lockSession,\n startDetachedSessionDaemon,\n} from \"../session.js\";\n\nconst DEFAULT_TTL_MS = 15 * 60 * 1000;\n\nfunction formatSessionStatus(params: {\n state: \"locked\" | \"unlocked\";\n address?: string;\n expiresAt?: string;\n mode?: \"eoa\" | \"smart-account\" | \"delegated\";\n}): string {\n const lines: string[] = [];\n lines.push(`Session: ${params.state}`);\n if (params.address) {\n lines.push(`Address: ${params.address}`);\n }\n if (params.expiresAt) {\n lines.push(`Expires: ${params.expiresAt}`);\n }\n if (params.mode) {\n lines.push(`Executor: ${params.mode}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport interface ChangePasswordCommandDependencies {\n loadFileConfig: () => CLIConfig;\n getWalletPath: (config?: CLIConfig) => string;\n createWalletStore: (walletPath: string) => EncryptedWalletStore;\n promptHidden: (question: string) => Promise<string>;\n lockSession: (socketPath: string, tokenPath: string) => Promise<boolean>;\n getSessionSocketPath: () => string;\n getSessionTokenPath: () => string;\n log: (message: string) => void;\n error: (message: string) => void;\n}\n\nconst defaultChangePasswordCommandDependencies: ChangePasswordCommandDependencies = {\n loadFileConfig,\n getWalletPath,\n createWalletStore: (walletPath) => new FileEncryptedWalletStore(walletPath),\n promptHidden,\n lockSession,\n getSessionSocketPath,\n getSessionTokenPath,\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n};\n\nexport async function runChangePasswordCommand(\n deps: ChangePasswordCommandDependencies = defaultChangePasswordCommandDependencies,\n): Promise<void> {\n const config = deps.loadFileConfig();\n const walletPath = deps.getWalletPath(config);\n const wallet = deps.createWalletStore(walletPath);\n\n if (!wallet.exists()) {\n deps.error(\"No encrypted wallet found. Run `moneyos init` first.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const currentPassphrase = await deps.promptHidden(\"Current wallet password: \");\n if (currentPassphrase.length === 0) {\n throw new Error(\"Current wallet password cannot be empty.\");\n }\n\n const newPassphrase = await deps.promptHidden(\"New wallet password: \");\n if (newPassphrase.length < 8) {\n throw new Error(\"New wallet password must be at least 8 characters long.\");\n }\n if (newPassphrase === currentPassphrase) {\n throw new Error(\n \"New wallet password must differ from the current password.\",\n );\n }\n\n const confirmPassphrase = await deps.promptHidden(\n \"Confirm new wallet password: \",\n );\n if (newPassphrase !== confirmPassphrase) {\n throw new Error(\"New wallet password confirmation did not match.\");\n }\n\n const metadata = await wallet.rotatePassphrase({\n oldPassphrase: currentPassphrase,\n newPassphrase,\n });\n await deps.lockSession(\n deps.getSessionSocketPath(),\n deps.getSessionTokenPath(),\n );\n\n deps.log(\"Wallet password changed.\");\n deps.log(`Address: ${metadata.address}`);\n deps.log(formatSessionStatus({ state: \"locked\" }));\n deps.log(\n \"Existing backup files and exported copies still require the old wallet password.\",\n );\n deps.log(\n \"Run `moneyos backup export` to create a backup encrypted with the new wallet password.\",\n );\n } catch (error) {\n deps.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n}\n\nexport const authCommand = new Command(\"auth\").description(\n \"Unlock, inspect, lock, and change the local MoneyOS wallet password\",\n);\n\nauthCommand\n .command(\"unlock\")\n .description(\"Unlock the local wallet and start a short-lived session\")\n .action(async () => {\n const config = loadFileConfig();\n const walletPath = getWalletPath(config);\n const wallet = new FileEncryptedWalletStore(walletPath);\n\n if (!wallet.exists()) {\n console.error(\"No encrypted wallet found. Run `moneyos init` first.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const passphrase = await promptHidden(\"Wallet password: \");\n if (passphrase.length === 0) {\n throw new Error(\"Wallet password cannot be empty.\");\n }\n\n const privateKey = await wallet.decrypt(passphrase);\n const ownerAddress = privateKeyToAccount(privateKey).address;\n const gasless = await resolveGaslessExecutionConfig(config, {\n ownerAddress,\n chainId: config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n });\n const status = await startDetachedSessionDaemon({\n type: \"start\",\n privateKey,\n chainId: config.chainId ?? 42161,\n rpcUrl: config.rpcUrl,\n socketPath: getSessionSocketPath(),\n tokenPath: getSessionTokenPath(),\n ttlMs: DEFAULT_TTL_MS,\n gasless: gasless\n ? {\n account: gasless.account,\n sponsor: gasless.sponsor,\n relayUrl: gasless.relayUrl,\n nonceKey: gasless.nonceKey?.toString(),\n validityWindowSeconds: gasless.validityWindowSeconds,\n }\n : undefined,\n });\n\n console.log(\"Wallet unlocked.\");\n console.log(\n formatSessionStatus({\n state: \"unlocked\",\n address: status.address,\n expiresAt: status.expiresAt,\n mode: status.mode,\n }),\n );\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nauthCommand\n .command(\"change-password\")\n .description(\"Change the local wallet password and lock the current session\")\n .action(async () => {\n await runChangePasswordCommand();\n });\n\nauthCommand\n .command(\"lock\")\n .description(\"Lock the local MoneyOS wallet session\")\n .action(async () => {\n const locked = await lockSession(\n getSessionSocketPath(),\n getSessionTokenPath(),\n );\n console.log(\n formatSessionStatus({\n state: \"locked\",\n }),\n );\n if (!locked) {\n console.log(\"No active local session was running.\");\n }\n });\n\nauthCommand\n .command(\"status\")\n .description(\"Show whether the local wallet session is unlocked\")\n .action(async () => {\n const status = await getSessionStatus(\n getSessionSocketPath(),\n getSessionTokenPath(),\n );\n if (!status) {\n console.log(\n formatSessionStatus({\n state: \"locked\",\n }),\n );\n return;\n }\n\n console.log(\n formatSessionStatus({\n state: \"unlocked\",\n address: status.address,\n expiresAt: status.expiresAt,\n mode: status.mode,\n }),\n );\n });\n","import { Command } from \"commander\";\nimport { FileBackupProvider } from \"../../core/backup-file.js\";\nimport {\n getBackupDir,\n getSessionSocketPath,\n getSessionTokenPath,\n getWalletPath,\n loadFileConfig,\n} from \"../config.js\";\nimport { promptHidden } from \"../prompt.js\";\nimport { lockSession } from \"../session.js\";\n\nfunction formatBackupStatus(params: {\n walletPath: string;\n backupDir: string;\n exists: boolean;\n backupCount: number;\n latestBackupPath?: string;\n address?: string;\n}): string {\n const lines: string[] = [];\n lines.push(`Wallet: ${params.exists ? \"present\" : \"missing\"}`);\n if (params.address) {\n lines.push(`Address: ${params.address}`);\n }\n lines.push(`Wallet at: ${params.walletPath}`);\n lines.push(`Backups: ${params.backupCount}`);\n lines.push(`Directory: ${params.backupDir}`);\n if (params.latestBackupPath) {\n lines.push(`Latest: ${params.latestBackupPath}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function getBackupExportPasswordGuidance(): string {\n return [\n \"This backup is encrypted with the same wallet password as your active wallet.\",\n \"You will need that same wallet password to restore it.\",\n \"MoneyOS does not store or sync it for you.\",\n ].join(\" \");\n}\n\nexport const backupCommand = new Command(\"backup\").description(\n \"Export, restore, and inspect encrypted wallet backups\",\n);\n\nbackupCommand\n .command(\"export\")\n .description(\"Write a copy of the encrypted wallet backup\")\n .option(\"-o, --out <path>\", \"Custom path for the backup file\")\n .option(\"--force\", \"Overwrite an existing backup file at --out\")\n .action(async (options) => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n\n try {\n const targetPath = await provider.exportWallet({\n outPath: options.out,\n allowOverwrite: Boolean(options.force),\n });\n console.log(`Backup exported to ${targetPath}`);\n console.log(getBackupExportPasswordGuidance());\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nbackupCommand\n .command(\"restore\")\n .description(\"Restore the encrypted wallet from a backup file\")\n .argument(\"<path>\", \"Path to the encrypted backup file\")\n .option(\"--force\", \"Overwrite an existing encrypted wallet\")\n .action(async (path: string, options) => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n\n try {\n const passphrase = await promptHidden(\n \"Wallet password for backup verification: \",\n );\n const metadata = await provider.restoreWallet(path, {\n passphrase,\n allowOverwrite: Boolean(options.force),\n });\n await lockSession(getSessionSocketPath(), getSessionTokenPath());\n console.log(\"Encrypted wallet restored.\");\n console.log(`Address: ${metadata.address}`);\n console.log(`Wallet: ${getWalletPath(config)}`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\nbackupCommand\n .command(\"status\")\n .description(\"Show the local wallet backup status\")\n .action(async () => {\n const config = loadFileConfig();\n const provider = new FileBackupProvider({\n walletPath: getWalletPath(config),\n backupDir: getBackupDir(config),\n });\n const status = await provider.status();\n console.log(formatBackupStatus(status));\n });\n","import { Command } from \"commander\";\nimport { listContacts, removeContact, setContact } from \"../contacts.js\";\n\nexport const contactCommand = new Command(\"contact\").description(\n \"Manage the local contacts address book\",\n);\n\ncontactCommand\n .command(\"set\")\n .description(\"Add or overwrite a contact\")\n .argument(\"<name>\", \"Contact name (e.g. dad)\")\n .argument(\"<address>\", \"Ethereum address (0x...)\")\n .action((name: string, address: string) => {\n try {\n const saved = setContact(name, address);\n console.log(`Saved contact ${saved.name} → ${saved.address}`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\ncontactCommand\n .command(\"list\")\n .description(\"List all saved contacts\")\n .action(() => {\n try {\n const entries = listContacts();\n if (entries.length === 0) {\n console.log(\n 'No contacts saved. Add one with \"moneyos contact set <name> <address>\".',\n );\n return;\n }\n const width = Math.max(...entries.map((e) => e.name.length));\n for (const { name, address } of entries) {\n console.log(`${name.padEnd(width)} ${address}`);\n }\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n\ncontactCommand\n .command(\"remove\")\n .description(\"Remove a saved contact\")\n .argument(\"<name>\", \"Contact name to remove\")\n .action((name: string) => {\n try {\n const removed = removeContact(name);\n if (!removed) {\n console.error(`No contact named \"${name}\".`);\n process.exitCode = 1;\n return;\n }\n console.log(`Removed contact ${name}.`);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n","import { Command } from \"commander\";\nimport { getGaslessNetworkDefaults } from \"@moneyos/smart-account\";\nimport {\n getConfigPath,\n getSessionSocketPath,\n getSessionTokenPath,\n loadFileConfig,\n saveConfig,\n} from \"../config.js\";\nimport {\n gaslessEnvVarNames,\n getGaslessRequiredEnvPresence,\n isGaslessEnabled,\n resolveGaslessExecutionConfig,\n} from \"../gasless.js\";\nimport { lockSession } from \"../session.js\";\nimport { loadCliAddress } from \"../wallet.js\";\n\nfunction formatEnabled(enabled: boolean): string {\n return enabled ? \"enabled\" : \"disabled\";\n}\n\nasync function refreshSessionAfterToggle(): Promise<void> {\n const locked = await lockSession(getSessionSocketPath(), getSessionTokenPath());\n if (locked) {\n console.log(\n \"Active wallet session locked so the new gasless mode takes effect on next `moneyos auth unlock`.\",\n );\n return;\n }\n\n console.log(\"No active wallet session was running.\");\n}\n\nasync function runGaslessToggle(enabled: boolean): Promise<void> {\n const config = loadFileConfig();\n const previous = config.gasless?.enabled === true;\n let nextGasless = {\n ...config.gasless,\n enabled,\n };\n\n if (enabled) {\n const enabledConfig = {\n ...config,\n gasless: {\n ...config.gasless,\n enabled: true,\n },\n };\n const ownerAddress = (await loadCliAddress(config)).address;\n const defaults = config.chainId\n ? getGaslessNetworkDefaults(config.chainId)\n : undefined;\n const derived = ownerAddress\n ? await resolveGaslessExecutionConfig(enabledConfig, {\n ownerAddress,\n chainId: config.chainId,\n rpcUrl: config.rpcUrl ?? defaults?.rpcUrl,\n })\n : undefined;\n\n nextGasless = {\n ...nextGasless,\n relayUrl: nextGasless.relayUrl ?? derived?.relayUrl ?? defaults?.relayUrl,\n sponsor: nextGasless.sponsor ?? derived?.sponsor ?? defaults?.sponsor,\n account: nextGasless.account ?? derived?.account,\n };\n }\n\n if (previous === enabled) {\n console.log(`Gasless is already ${formatEnabled(enabled)}.`);\n } else {\n console.log(`Gasless ${formatEnabled(enabled)} in ${getConfigPath()}.`);\n }\n\n saveConfig({\n ...config,\n gasless: nextGasless,\n });\n\n if (enabled) {\n const missing = Object.entries(getGaslessRequiredEnvPresence({\n ...config,\n gasless: nextGasless,\n }))\n .filter(([, present]) => !present)\n .map(([key]) => key);\n\n if (missing.length > 0) {\n console.log(\n `Warning: gasless is enabled, but these values are still missing: ${missing.join(\", \")}.`,\n );\n }\n }\n\n await refreshSessionAfterToggle();\n}\n\nasync function runGaslessStatus(): Promise<void> {\n const config = loadFileConfig();\n const enabled = isGaslessEnabled(config);\n const envPresence = getGaslessRequiredEnvPresence(config);\n const missing = Object.entries(envPresence)\n .filter(([, present]) => !present)\n .map(([key]) => key);\n\n console.log(`Gasless: ${formatEnabled(enabled)}`);\n if (process.env[gaslessEnvVarNames.enabled] !== undefined) {\n console.log(`Mode source: ${gaslessEnvVarNames.enabled} environment override`);\n }\n\n console.log(\n `${gaslessEnvVarNames.relayUrl}: ${envPresence.relayUrl ? \"set\" : \"missing\"}`,\n );\n console.log(\n `${gaslessEnvVarNames.account}: ${envPresence.account ? \"set\" : \"missing\"}`,\n );\n console.log(\n `${gaslessEnvVarNames.sponsor}: ${envPresence.sponsor ? \"set\" : \"missing\"}`,\n );\n\n if (enabled && missing.length > 0) {\n console.log(\n `Gasless is enabled but not runnable until missing values are set: ${missing.join(\", \")}.`,\n );\n process.exitCode = 1;\n }\n}\n\nexport const gaslessCommand = new Command(\"gasless\")\n .description(\"Inspect and toggle gasless execution mode\")\n .addCommand(\n new Command(\"status\")\n .description(\"Show whether gasless mode is enabled and whether required config is present\")\n .action(async () => {\n await runGaslessStatus();\n }),\n )\n .addCommand(\n new Command(\"enable\")\n .description(\"Enable gasless execution mode and persist chain defaults when available\")\n .action(async () => {\n await runGaslessToggle(true);\n }),\n )\n .addCommand(\n new Command(\"disable\")\n .description(\"Disable gasless execution mode and use the EOA executor\")\n .action(async () => {\n await runGaslessToggle(false);\n }),\n );\n","import { Command } from \"commander\";\nimport {\n createCliToolManager,\n formatToolStatusTable,\n formatToolUpdateTable,\n type ToolUpdateResult,\n} from \"../tools/manager.js\";\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatToolUpdateOutput(results: ToolUpdateResult[]): string {\n if (results.length === 0) return \"No tools installed.\";\n const visible = results.filter((result) => result.state !== \"up-to-date\");\n if (visible.length === 0) return \"All installed tools are up to date.\";\n return formatToolUpdateTable(visible);\n}\n\nexport function createAddToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"add\")\n .description(\"Install or update a MoneyOS CLI tool into the user tool home\")\n .argument(\"<tool>\", \"Tool alias or npm package spec\")\n .action(async (tool: string) => {\n try {\n const entry = await toolManager.addTool(tool);\n console.log(\n `Installed ${entry.packageName}@${entry.packageVersion} as \\`moneyos ${entry.commandPath.join(\" \")}\\`.`,\n );\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createRemoveToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"remove\")\n .description(\"Remove an installed MoneyOS CLI tool from the user tool home\")\n .argument(\"<tool>\", \"Installed tool name, command path, or npm package\")\n .action(async (tool: string) => {\n try {\n const entry = await toolManager.removeTool(tool);\n console.log(\n `Removed ${entry.packageName} from \\`moneyos ${entry.commandPath.join(\" \")}\\`.`,\n );\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createUpdateToolCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"update\")\n .description(\"Update installed MoneyOS CLI tools in the user tool home\")\n .argument(\"[tool]\", \"Installed tool name, command path, or npm package\")\n .option(\"--check\", \"Show what would update without applying changes\")\n .action(async (tool: string | undefined, options: { check?: boolean }) => {\n try {\n const results = await toolManager.updateTools({\n tool,\n check: options.check === true,\n });\n console.log(formatToolUpdateOutput(results));\n if (\n results.some(\n (result) =>\n result.state === \"failed\" || result.state === \"broken\",\n )\n ) {\n process.exitCode = 1;\n }\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n\nexport function createToolsCommand(\n toolManager: ReturnType<typeof createCliToolManager>,\n): Command {\n return new Command(\"tools\")\n .description(\"List installed MoneyOS CLI tools from the registry\")\n .action(async () => {\n try {\n console.log(formatToolStatusTable(await toolManager.listTools()));\n } catch (error) {\n console.error(formatError(error));\n process.exitCode = 1;\n }\n });\n}\n","import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport type { MoneyOSCliContext, MoneyOSCliTool } from \"../../cli-tool.js\";\nimport { getToolHomeDir, getToolHomePackageJsonPath, getToolRegistryPath } from \"../config.js\";\nimport { createMoneyOSCliContext } from \"./runtime.js\";\n\nconst SUPPORTED_CLI_TOOL_VERSION = 1 as const;\nconst DEFAULT_RESERVED_ROOT_COMMANDS = new Set([\"init\", \"auth\", \"backup\", \"balance\", \"send\", \"keystore\", \"add\", \"remove\", \"update\", \"tools\", \"help\", \"__session-daemon\"]);\nconst FIRST_PARTY_TOOL_ALIASES: Record<string, string> = { swap: \"@moneyos/swap\" };\nconst VALID_COMMAND_SEGMENT = /^[A-Za-z0-9][A-Za-z0-9-]*$/;\n\nexport interface ToolRegistryEntry {\n packageName: string;\n packageVersion: string;\n toolVersion: 1;\n name: string;\n commandPath: string[];\n description: string;\n}\n\ntype ToolStatus = ToolRegistryEntry & { state: \"ok\" | \"broken\" | \"conflict\"; problems: string[] };\ntype Paths = { rootDir: string; packageJsonPath: string; registryPath: string };\ntype LoadedTool = ToolRegistryEntry & { createCommand: MoneyOSCliTool[\"createCommand\"] };\ntype LoadedToolSource = {\n packageName: string;\n packageVersion: string;\n cliTool: unknown;\n};\ntype SharedToolHomeDependencies = Record<string, string>;\ntype RootPackageMetadata = {\n dependencies?: Record<string, string>;\n moneyos?: {\n toolHomeDependencies?: Record<string, string>;\n };\n};\n\nexport interface ToolUpdateResult {\n current: ToolRegistryEntry;\n next?: ToolRegistryEntry;\n state: \"up-to-date\" | \"would-update\" | \"updated\" | \"skipped\" | \"failed\" | \"broken\";\n reason?: string;\n}\n\nclass UnsupportedToolContractVersionError extends Error {\n readonly packageName: string;\n readonly packageVersion: string;\n readonly actualVersion: number;\n readonly expectedVersion: number;\n\n constructor(\n packageName: string,\n packageVersion: string,\n actualVersion: number,\n expectedVersion: number = SUPPORTED_CLI_TOOL_VERSION,\n ) {\n super(\n `Package ${packageName}@${packageVersion} exports unsupported moneyosCliTool.version ${actualVersion}. Expected ${expectedVersion}.`,\n );\n this.name = \"UnsupportedToolContractVersionError\";\n this.packageName = packageName;\n this.packageVersion = packageVersion;\n this.actualVersion = actualVersion;\n this.expectedVersion = expectedVersion;\n }\n}\n\nconst getPaths = (): Paths => ({\n rootDir: getToolHomeDir(),\n packageJsonPath: getToolHomePackageJsonPath(),\n registryPath: getToolRegistryPath(),\n});\n\nfunction findRootPackageJsonPath(): string {\n let currentDir = dirname(fileURLToPath(import.meta.url));\n while (true) {\n const candidate = join(currentDir, \"package.json\");\n if (existsSync(candidate)) {\n const packageJson = JSON.parse(readFileSync(candidate, \"utf8\")) as { name?: string };\n if (packageJson.name === \"moneyos\") return candidate;\n }\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n throw new Error(\"Could not find the root moneyos package.json.\");\n }\n currentDir = parentDir;\n }\n}\n\nfunction getSharedToolHomeDependencies(): SharedToolHomeDependencies {\n const rootPackageJsonPath = findRootPackageJsonPath();\n const packageJson = JSON.parse(readFileSync(rootPackageJsonPath, \"utf8\")) as RootPackageMetadata;\n const coreVersion = packageJson.moneyos?.toolHomeDependencies?.[\"@moneyos/core\"];\n const viemVersion = packageJson.dependencies?.viem;\n if (typeof coreVersion !== \"string\" || typeof viemVersion !== \"string\") {\n throw new Error(`Root package metadata at ${rootPackageJsonPath} is missing tool-home dependency versions.`);\n }\n return { \"@moneyos/core\": coreVersion, viem: viemVersion };\n}\n\nfunction collectReservedRootCommandNames(program: Command): Set<string> {\n return new Set([\n \"help\",\n ...program.commands.flatMap((command) => [command.name(), ...command.aliases()]),\n ]);\n}\n\nfunction ensureToolHome(paths: Paths, sharedToolHomeDependencies: SharedToolHomeDependencies): void {\n if (!existsSync(paths.rootDir)) mkdirSync(paths.rootDir, { recursive: true, mode: 0o700 });\n const exists = existsSync(paths.packageJsonPath);\n const parsed = exists\n ? JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as {\n name?: string;\n private?: boolean;\n description?: string;\n dependencies?: Record<string, string>;\n }\n : undefined;\n const packageJson = {\n name: parsed?.name ?? \"moneyos-tools\",\n private: parsed?.private ?? true,\n description: parsed?.description ?? \"User-level installed MoneyOS CLI tools\",\n dependencies: { ...(parsed?.dependencies ?? {}) },\n };\n let changed = !exists;\n for (const [name, version] of Object.entries(sharedToolHomeDependencies)) {\n if (packageJson.dependencies[name] !== version) {\n packageJson.dependencies[name] = version;\n changed = true;\n }\n }\n if (changed) writeFileSync(paths.packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, { mode: 0o600 });\n if (!existsSync(paths.registryPath)) writeFileSync(paths.registryPath, \"[]\\n\", { mode: 0o600 });\n}\n\nfunction parseRegistryEntry(value: unknown): ToolRegistryEntry {\n if (typeof value !== \"object\" || value === null) throw new Error(\"Invalid tool registry entry.\");\n const entry = value as Partial<ToolRegistryEntry>;\n if (\n typeof entry.packageName !== \"string\"\n || typeof entry.packageVersion !== \"string\"\n || entry.toolVersion !== 1\n || typeof entry.name !== \"string\"\n || typeof entry.description !== \"string\"\n || !Array.isArray(entry.commandPath)\n || entry.commandPath.length === 0\n || entry.commandPath.some((segment) => typeof segment !== \"string\" || !VALID_COMMAND_SEGMENT.test(segment))\n ) throw new Error(\"Invalid tool registry entry.\");\n return { packageName: entry.packageName, packageVersion: entry.packageVersion, toolVersion: 1, name: entry.name, commandPath: [...entry.commandPath], description: entry.description };\n}\n\nfunction parseLoadedTool(packageName: string, packageVersion: string, value: unknown): LoadedTool {\n if (typeof value !== \"object\" || value === null) throw new Error(`Package ${packageName} does not export \\`moneyosCliTool\\`.`);\n const tool = value as Partial<MoneyOSCliTool>;\n if (tool.version !== SUPPORTED_CLI_TOOL_VERSION) {\n if (typeof tool.version === \"number\") {\n throw new UnsupportedToolContractVersionError(\n packageName,\n packageVersion,\n tool.version,\n );\n }\n throw new Error(\n `Package ${packageName}@${packageVersion} exports an invalid \\`moneyosCliTool\\`.`,\n );\n }\n if (\n typeof tool.name !== \"string\"\n || typeof tool.description !== \"string\"\n || !Array.isArray(tool.commandPath)\n || tool.commandPath.length === 0\n || tool.commandPath.some((segment) => typeof segment !== \"string\" || !VALID_COMMAND_SEGMENT.test(segment))\n || typeof tool.createCommand !== \"function\"\n ) throw new Error(`Package ${packageName}@${packageVersion} exports an invalid \\`moneyosCliTool\\`.`);\n return {\n packageName,\n packageVersion,\n toolVersion: SUPPORTED_CLI_TOOL_VERSION,\n name: tool.name,\n commandPath: [...tool.commandPath],\n description: tool.description,\n createCommand: tool.createCommand,\n };\n}\n\nfunction getConflict(entry: ToolRegistryEntry, entries: ToolRegistryEntry[], reservedRootCommands: Set<string>): string | undefined {\n const path = entry.commandPath.join(\" \");\n if (reservedRootCommands.has(entry.name) || reservedRootCommands.has(entry.commandPath[0])) {\n return `reserved root command collision for ${path}`;\n }\n for (const other of entries) {\n if (other.packageName === entry.packageName) continue;\n const otherPath = other.commandPath.join(\" \");\n if (path === otherPath || path.startsWith(`${otherPath} `) || otherPath.startsWith(`${path} `)) {\n return `command path ${path} collides with installed tool path ${otherPath}`;\n }\n }\n}\n\nasync function runNpm(paths: Paths, args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"npm\", args, { cwd: paths.rootDir, stdio: \"pipe\" });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk: Buffer | string) => { stderr += chunk.toString(); });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => code === 0 ? resolve() : reject(new Error(stderr.trim() || `npm ${args[0]} failed with exit code ${String(code)}.`)));\n });\n}\n\nasync function runNpmWithOutput(paths: Paths, args: string[]): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const child = spawn(\"npm\", args, { cwd: paths.rootDir, stdio: \"pipe\" });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n reject(\n new Error(\n stderr.trim()\n || stdout.trim()\n || `npm ${args[0]} failed with exit code ${String(code)}.`,\n ),\n );\n });\n });\n}\n\nasync function viewLatestPackageVersion(\n paths: Paths,\n packageName: string,\n): Promise<string> {\n const stdout = await runNpmWithOutput(paths, [\n \"view\",\n packageName,\n \"version\",\n \"--json\",\n ]);\n const parsed = JSON.parse(stdout) as unknown;\n if (typeof parsed !== \"string\" || parsed.length === 0) {\n throw new Error(`npm view ${packageName} returned an invalid version.`);\n }\n return parsed;\n}\n\nasync function loadInstalledToolFromFsRaw(\n paths: Paths,\n packageName: string,\n): Promise<LoadedToolSource> {\n const toolRequire = createRequire(paths.packageJsonPath);\n let entryPath: string;\n try {\n entryPath = toolRequire.resolve(packageName);\n } catch {\n throw new Error(`Package ${packageName} is missing from ${join(paths.rootDir, \"node_modules\")}.`);\n }\n for (let root = dirname(entryPath); root !== dirname(root); root = dirname(root)) {\n const packageJsonPath = join(root, \"package.json\");\n if (!existsSync(packageJsonPath)) continue;\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { name?: string; version?: string };\n if (packageJson.name === packageName && typeof packageJson.version === \"string\") {\n const moduleNamespace = await import(pathToFileURL(entryPath).href);\n return {\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n cliTool:\n (moduleNamespace as Record<string, unknown>).moneyosCliTool\n ?? ((moduleNamespace as Record<string, unknown>).default as Record<string, unknown> | undefined)?.moneyosCliTool,\n };\n }\n }\n throw new Error(`Could not find package.json for installed package ${packageName}.`);\n}\n\nasync function loadInstalledToolFromFs(paths: Paths, packageName: string): Promise<LoadedTool> {\n const loaded = await loadInstalledToolFromFsRaw(paths, packageName);\n return parseLoadedTool(loaded.packageName, loaded.packageVersion, loaded.cliTool);\n}\n\nfunction toRegistryEntry(loaded: LoadedTool): ToolRegistryEntry {\n return {\n packageName: loaded.packageName,\n packageVersion: loaded.packageVersion,\n toolVersion: loaded.toolVersion,\n name: loaded.name,\n commandPath: loaded.commandPath,\n description: loaded.description,\n };\n}\n\nfunction formatBrokenInstalledToolMessage(\n entry: ToolRegistryEntry,\n error: unknown,\n): string {\n const message = error instanceof Error ? error.message : String(error);\n return `Installed tool ${entry.commandPath.join(\" \")} is broken: ${message}. Run \\`moneyos add ${entry.packageName}\\` to repair it or \\`moneyos remove ${entry.packageName}\\` to uninstall it.`;\n}\n\nexport function createCliToolManager(params: {\n paths?: Paths;\n packageManager?: {\n install(paths: Paths, spec: string): Promise<void>;\n uninstall(paths: Paths, packageName: string): Promise<void>;\n viewLatestVersion?(paths: Paths, packageName: string): Promise<string>;\n inspectLatest?(paths: Paths, packageName: string): Promise<LoadedToolSource>;\n };\n moduleLoader?: (paths: Paths, packageName: string) => Promise<LoadedToolSource>;\n cliContext?: MoneyOSCliContext;\n reservedRootCommands?: Iterable<string>;\n sharedToolHomeDependencies?: SharedToolHomeDependencies;\n} = {}) {\n const paths = params.paths ?? getPaths();\n const cliContext = params.cliContext ?? createMoneyOSCliContext();\n const sharedToolHomeDependencies = params.sharedToolHomeDependencies ?? getSharedToolHomeDependencies();\n const sharedToolHomeDependencyNames = new Set(Object.keys(sharedToolHomeDependencies));\n let reservedRootCommands = new Set(params.reservedRootCommands ?? DEFAULT_RESERVED_ROOT_COMMANDS);\n const rawInstall = params.packageManager?.install ?? ((toolPaths: Paths, spec: string) => runNpm(toolPaths, [\"install\", \"--save-exact\", \"--no-fund\", \"--no-audit\", spec]));\n const rawUninstall = params.packageManager?.uninstall ?? ((toolPaths: Paths, packageName: string) => runNpm(toolPaths, [\"uninstall\", \"--no-fund\", \"--no-audit\", packageName]));\n const viewLatestVersion = params.packageManager?.viewLatestVersion\n ?? viewLatestPackageVersion;\n const loadToolFromPaths = params.moduleLoader\n ? async (toolPaths: Paths, packageName: string) => {\n const loaded = await params.moduleLoader!(toolPaths, packageName);\n return parseLoadedTool(\n loaded.packageName,\n loaded.packageVersion,\n loaded.cliTool,\n );\n }\n : loadInstalledToolFromFs;\n const loadInstalledTool = loadToolFromPaths;\n const inspectLatest = params.packageManager?.inspectLatest\n ? async (toolPaths: Paths, packageName: string) => {\n const loaded = await params.packageManager!.inspectLatest!(\n toolPaths,\n packageName,\n );\n return parseLoadedTool(loaded.packageName, loaded.packageVersion, loaded.cliTool);\n }\n : async (_toolPaths: Paths, packageName: string) => {\n const rootDir = mkdtempSync(join(tmpdir(), \"moneyos-tool-inspect-\"));\n const inspectPaths: Paths = {\n rootDir,\n packageJsonPath: join(rootDir, \"package.json\"),\n registryPath: join(rootDir, \"registry.json\"),\n };\n try {\n ensureToolHome(inspectPaths, sharedToolHomeDependencies);\n await runNpm(inspectPaths, [\n \"install\",\n \"--save-exact\",\n \"--no-fund\",\n \"--no-audit\",\n `${packageName}@latest`,\n ]);\n return await loadToolFromPaths(inspectPaths, packageName);\n } finally {\n rmSync(rootDir, { recursive: true, force: true });\n }\n };\n const install = async (toolPaths: Paths, spec: string): Promise<void> => {\n await rawInstall(toolPaths, spec);\n ensureToolHome(toolPaths, sharedToolHomeDependencies);\n };\n const uninstall = async (\n toolPaths: Paths,\n packageName: string,\n ): Promise<void> => {\n await rawUninstall(toolPaths, packageName);\n ensureToolHome(toolPaths, sharedToolHomeDependencies);\n };\n const sameMetadata = (left: ToolRegistryEntry, right: ToolRegistryEntry) =>\n left.packageName === right.packageName\n && left.packageVersion === right.packageVersion\n && left.toolVersion === right.toolVersion\n && left.name === right.name\n && left.description === right.description\n && left.commandPath.join(\"\\0\") === right.commandPath.join(\"\\0\");\n const resolveInstalledTool = (input: string, entries: ToolRegistryEntry[]) =>\n entries.find((entry) => entry.packageName === input)\n ?? entries.find((entry) => entry.packageName === FIRST_PARTY_TOOL_ALIASES[input])\n ?? (() => {\n const matches = entries.filter((entry) => entry.name === input || entry.commandPath.join(\" \") === input);\n return matches.length === 1 ? matches[0] : undefined;\n })();\n const getRegistryEntries = (): ToolRegistryEntry[] => {\n ensureToolHome(paths, sharedToolHomeDependencies);\n const parsed = JSON.parse(readFileSync(paths.registryPath, \"utf8\")) as unknown;\n if (!Array.isArray(parsed)) throw new Error(`Tool registry at ${paths.registryPath} is invalid.`);\n return parsed.map(parseRegistryEntry);\n };\n const writeRegistryEntries = (entries: ToolRegistryEntry[]): void => {\n ensureToolHome(paths, sharedToolHomeDependencies);\n writeFileSync(paths.registryPath, `${JSON.stringify(entries, null, 2)}\\n`, { mode: 0o600 });\n };\n\n async function invoke(entry: ToolRegistryEntry, args: string[]): Promise<void> {\n let command: Command;\n try {\n // Load/validation failures mean the installed tool itself is broken.\n const loaded = await loadInstalledTool(paths, entry.packageName);\n if (!sameMetadata(entry, loaded)) throw new Error(\"installed metadata does not match registry\");\n command = loaded.createCommand(cliContext);\n if (!(command instanceof Command) || command.name() !== entry.commandPath[entry.commandPath.length - 1]) {\n throw new Error(\"createCommand() did not return the expected command\");\n }\n command.exitOverride();\n } catch (error) {\n throw new Error(formatBrokenInstalledToolMessage(entry, error));\n }\n\n try {\n await command.parseAsync([process.execPath, entry.commandPath[entry.commandPath.length - 1], ...args]);\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code !== \"commander.helpDisplayed\") process.exitCode = error.exitCode || 1;\n return;\n }\n throw error;\n }\n }\n\n return {\n getRegistryEntries(): ToolRegistryEntry[] {\n return getRegistryEntries();\n },\n mountInstalledToolCommands(program: Command): void {\n let entries: ToolRegistryEntry[];\n try {\n entries = getRegistryEntries();\n } catch {\n return;\n }\n reservedRootCommands = collectReservedRootCommandNames(program);\n const groups = new Map<string, Command>();\n for (const entry of entries) {\n if (getConflict(entry, entries, reservedRootCommands)) continue;\n let parent = program;\n const segments: string[] = [];\n for (const segment of entry.commandPath.slice(0, -1)) {\n segments.push(segment);\n const key = segments.join(\" \");\n const group = groups.get(key) ?? new Command(segment).description(\"Installed MoneyOS tool commands\");\n if (!groups.has(key)) {\n groups.set(key, group);\n parent.addCommand(group);\n }\n parent = group;\n }\n parent.addCommand(\n new Command(entry.commandPath[entry.commandPath.length - 1])\n .description(entry.description)\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .helpOption(false)\n .argument(\"[args...]\")\n .action(async (args: string[]) => { await invoke(entry, args); }),\n );\n }\n },\n async addTool(input: string): Promise<ToolRegistryEntry> {\n const spec = FIRST_PARTY_TOOL_ALIASES[input] ?? input;\n const entries = getRegistryEntries();\n const previous = resolveInstalledTool(input, entries);\n ensureToolHome(paths, sharedToolHomeDependencies);\n const before = (JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as { dependencies?: Record<string, string> }).dependencies ?? {};\n await install(paths, spec);\n const after = (JSON.parse(readFileSync(paths.packageJsonPath, \"utf8\")) as { dependencies?: Record<string, string> }).dependencies ?? {};\n const changed = previous?.packageName ?? Object.keys(after).find((name) => before[name] !== after[name] && !sharedToolHomeDependencyNames.has(name));\n try {\n const loaded = await loadInstalledTool(paths, changed ?? spec);\n const next = previous ? entries.filter((entry) => entry.packageName !== previous.packageName) : entries;\n const conflict = getConflict(loaded, next, reservedRootCommands);\n if (conflict) throw new Error(conflict);\n const entry = { packageName: loaded.packageName, packageVersion: loaded.packageVersion, toolVersion: loaded.toolVersion, name: loaded.name, commandPath: loaded.commandPath, description: loaded.description };\n writeRegistryEntries([...next, entry]);\n return entry;\n } catch (error) {\n try {\n if (previous) await install(paths, `${previous.packageName}@${previous.packageVersion}`);\n else if (changed) await uninstall(paths, changed);\n } catch {\n // Best-effort rollback only.\n }\n throw error;\n }\n },\n async removeTool(input: string): Promise<ToolRegistryEntry> {\n const entries = getRegistryEntries();\n const entry = resolveInstalledTool(input, entries);\n if (!entry) throw new Error(`Tool ${input} is not installed.`);\n await uninstall(paths, entry.packageName);\n writeRegistryEntries(entries.filter((installed) => installed.packageName !== entry.packageName));\n return entry;\n },\n async listTools(): Promise<ToolStatus[]> {\n const entries = getRegistryEntries();\n const tools = await Promise.all(entries.map(async (entry) => {\n const conflict = getConflict(entry, entries, reservedRootCommands);\n if (conflict) return { ...entry, state: \"conflict\" as const, problems: [conflict] };\n try {\n const loaded = await loadInstalledTool(paths, entry.packageName);\n if (!sameMetadata(entry, loaded)) throw new Error(\"installed metadata does not match registry\");\n return { ...entry, state: \"ok\" as const, problems: [] };\n } catch (error) {\n return { ...entry, state: \"broken\" as const, problems: [error instanceof Error ? error.message : String(error)] };\n }\n }));\n return tools.sort((left, right) => left.commandPath.join(\" \").localeCompare(right.commandPath.join(\" \")));\n },\n async updateTools(\n params: { tool?: string; check?: boolean } = {},\n ): Promise<ToolUpdateResult[]> {\n let entries = getRegistryEntries();\n const targets = params.tool\n ? (() => {\n const entry = resolveInstalledTool(params.tool!, entries);\n if (!entry) throw new Error(`Tool ${params.tool} is not installed.`);\n return [entry];\n })()\n : [...entries].sort((left, right) =>\n left.commandPath.join(\" \").localeCompare(right.commandPath.join(\" \")),\n );\n const results: ToolUpdateResult[] = [];\n\n for (const target of targets) {\n const current =\n entries.find((entry) => entry.packageName === target.packageName)\n ?? target;\n try {\n const installed = await loadInstalledTool(paths, current.packageName);\n if (!sameMetadata(current, installed)) {\n throw new Error(\"installed metadata does not match registry\");\n }\n } catch (error) {\n results.push({\n current,\n state: \"broken\",\n reason: formatBrokenInstalledToolMessage(current, error),\n });\n continue;\n }\n\n let latestVersion: string;\n try {\n latestVersion = await viewLatestVersion(paths, current.packageName);\n } catch (error) {\n results.push({\n current,\n state: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n if (latestVersion === current.packageVersion) {\n results.push({ current, next: current, state: \"up-to-date\" });\n continue;\n }\n\n let latest: LoadedTool;\n try {\n latest = await inspectLatest(paths, current.packageName);\n } catch (error) {\n results.push({\n current,\n state:\n error instanceof UnsupportedToolContractVersionError\n ? \"skipped\"\n : \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n\n const next = toRegistryEntry(latest);\n const otherEntries = entries.filter(\n (entry) => entry.packageName !== current.packageName,\n );\n const conflict = getConflict(next, otherEntries, reservedRootCommands);\n if (conflict) {\n results.push({ current, next, state: \"skipped\", reason: conflict });\n continue;\n }\n\n if (params.check) {\n results.push({ current, next, state: \"would-update\" });\n continue;\n }\n\n try {\n await install(paths, `${current.packageName}@${next.packageVersion}`);\n const applied = toRegistryEntry(\n await loadInstalledTool(paths, current.packageName),\n );\n const appliedConflict = getConflict(\n applied,\n otherEntries,\n reservedRootCommands,\n );\n if (appliedConflict) throw new Error(appliedConflict);\n if (applied.packageVersion !== next.packageVersion) {\n throw new Error(\n `Installed ${applied.packageName}@${applied.packageVersion}, expected ${next.packageVersion}.`,\n );\n }\n entries = entries.map((entry) =>\n entry.packageName === current.packageName ? applied : entry,\n );\n writeRegistryEntries(entries);\n results.push({ current, next: applied, state: \"updated\" });\n } catch (error) {\n try {\n await install(paths, `${current.packageName}@${current.packageVersion}`);\n } catch {\n // Best-effort rollback only.\n }\n results.push({\n current,\n next,\n state: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n },\n };\n}\n\nexport function formatToolStatusTable(tools: ToolStatus[]): string {\n if (tools.length === 0) return \"No tools installed.\";\n const commandWidth = Math.max(\"COMMAND\".length, ...tools.map((tool) => tool.commandPath.join(\" \").length));\n const packageWidth = Math.max(\"PACKAGE\".length, ...tools.map((tool) => tool.packageName.length));\n const versionWidth = Math.max(\"VERSION\".length, ...tools.map((tool) => tool.packageVersion.length));\n const lines = [`${\"COMMAND\".padEnd(commandWidth)} ${\"PACKAGE\".padEnd(packageWidth)} ${\"VERSION\".padEnd(versionWidth)} STATE`];\n for (const tool of tools) {\n lines.push(`${tool.commandPath.join(\" \").padEnd(commandWidth)} ${tool.packageName.padEnd(packageWidth)} ${tool.packageVersion.padEnd(versionWidth)} ${tool.state}`);\n for (const problem of tool.problems) lines.push(` ${problem}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatToolUpdateTable(results: ToolUpdateResult[]): string {\n if (results.length === 0) return \"No tool updates to show.\";\n const commandWidth = Math.max(\n \"COMMAND\".length,\n ...results.map((result) =>\n (result.next?.commandPath ?? result.current.commandPath).join(\" \").length,\n ),\n );\n const packageWidth = Math.max(\n \"PACKAGE\".length,\n ...results.map((result) => result.current.packageName.length),\n );\n const currentWidth = Math.max(\n \"CURRENT\".length,\n ...results.map((result) => result.current.packageVersion.length),\n );\n const latestWidth = Math.max(\n \"LATEST\".length,\n ...results.map((result) => (result.next?.packageVersion ?? \"-\").length),\n );\n const lines = [\n `${\"COMMAND\".padEnd(commandWidth)} ${\"PACKAGE\".padEnd(packageWidth)} ${\"CURRENT\".padEnd(currentWidth)} ${\"LATEST\".padEnd(latestWidth)} STATUS`,\n ];\n for (const result of results) {\n const commandPath = (result.next?.commandPath ?? result.current.commandPath)\n .join(\" \");\n lines.push(\n `${commandPath.padEnd(commandWidth)} ${result.current.packageName.padEnd(packageWidth)} ${result.current.packageVersion.padEnd(currentWidth)} ${(result.next?.packageVersion ?? \"-\").padEnd(latestWidth)} ${result.state}`,\n );\n if (result.reason) lines.push(` ${result.reason}`);\n }\n return lines.join(\"\\n\");\n}\n","import { Command } from \"commander\";\nimport type { AssetRegistry, MoneyOSRuntime, ReadClient } from \"@moneyos/core\";\nimport type { ConnectLocalSessionOptions } from \"../../local-session.js\";\nimport { connectLocalSession } from \"../../local-session.js\";\nimport { ViemReadClient } from \"../../core/eoa.js\";\nimport { DefaultAssetRegistry } from \"../../core/assets.js\";\nimport { createNoExecutorClient } from \"../../core/no-executor.js\";\nimport type { CLIConfig } from \"../config.js\";\nimport { loadConfig } from \"../config.js\";\nimport type { MoneyOSCliContext } from \"../../cli-tool.js\";\n\nexport interface CreateMoneyOSCliContextDependencies {\n loadConfig: () => CLIConfig;\n connectLocalSession: (\n options?: ConnectLocalSessionOptions,\n ) => Promise<MoneyOSRuntime[\"execute\"]>;\n createReadClient: (params: {\n chainId: number;\n rpcUrl?: string;\n }) => ReadClient;\n createAssets: () => AssetRegistry;\n}\n\nconst defaultCreateMoneyOSCliContextDependencies: CreateMoneyOSCliContextDependencies = {\n loadConfig,\n connectLocalSession,\n createReadClient: ({ chainId, rpcUrl }) =>\n new ViemReadClient({\n defaultChainId: chainId,\n rpcUrl,\n }),\n createAssets: () => new DefaultAssetRegistry(),\n};\n\nexport function createMoneyOSCliContext(\n deps: CreateMoneyOSCliContextDependencies = defaultCreateMoneyOSCliContextDependencies,\n): MoneyOSCliContext {\n return {\n Command,\n async getRuntime(options = {}): Promise<MoneyOSRuntime> {\n const config = deps.loadConfig();\n const chainId = options.chainId ?? config.chainId ?? 42161;\n const rpcUrl = config.rpcUrl;\n\n return {\n read: deps.createReadClient({ chainId, rpcUrl }),\n execute: options.requireSession\n ? await deps.connectLocalSession()\n : createNoExecutorClient(),\n assets: deps.createAssets(),\n config: {\n defaultChainId: chainId,\n rpcUrl,\n },\n };\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nconst packageJsonPath = resolve(\n dirname(fileURLToPath(import.meta.url)),\n \"../../package.json\",\n);\n\ntype PackageJson = {\n version: string;\n};\n\nexport const version = (JSON.parse(\n readFileSync(packageJsonPath, \"utf8\"),\n) as PackageJson).version;\n"],"mappings":"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","names":["Command","resolve","fileURLToPath","privateKeyToAccount","existsSync","statSync","join","join","existsSync","statSync","readFileSync","existsSync","mkdirSync","dirname","join","join","join","resolve","randomBytes","chmodSync","existsSync","mkdirSync","readFileSync","statSync","writeFileSync","dirname","createPublicClient","http","privateKeyToAccount","createPublicClient","http","SECURE_FILE_MODE","shouldEnforcePosixPermissions","existsSync","dirname","mkdirSync","statSync","readFileSync","writeFileSync","chmodSync","resolve","randomBytes","privateKeyToAccount","Command","raw","result","Command","results","width","Command","isAddress","chmodSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","shouldEnforcePosixPermissions","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","chmodSync","isAddress","Command","Command","privateKeyToAccount","privateKeyToAccount","Command","Command","privateKeyToAccount","Command","privateKeyToAccount","Command","Command","Command","Command","Command","getGaslessNetworkDefaults","getGaslessNetworkDefaults","Command","Command","spawn","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","Command","Command","Command","dirname","join","existsSync","readFileSync","mkdirSync","version","writeFileSync","resolve","spawn","packageJsonPath","rmSync","Command","entry","params","Command","readFileSync","fileURLToPath","dirname","resolve","Command","resolve","fileURLToPath"]}