@zan_team/cli 0.0.0-stage → 0.0.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.
- package/README.md +804 -2
- package/dist/cli.js +7655 -0
- package/dist/cli.js.map +1 -0
- package/package.json +58 -4
- package/skills/zan-cli/SKILL.md +95 -0
- package/skills/zan-cli/agents/openai.yaml +3 -0
- package/skills/zan-cli/references/rpc-workflow.md +33 -0
- package/skills/zan-cli/references/signing.md +30 -0
- package/skills/zan-cli/references/troubleshooting.md +42 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors/failure-mapper.ts","../src/security/redactor.ts","../src/errors/failure.ts","../src/output/output-writer.ts","../src/program.ts","../src/auth/interaction.ts","../src/commands/auth.ts","../src/agent/manifest.ts","../src/commands/agent.ts","../src/commands/completions.ts","../src/completions/generate.ts","../src/commands/evm.ts","../src/evm/ens-resolver.ts","../src/evm/rpc-input.ts","../src/commands/wallet.ts","../src/wallet/wallet-key-input.ts","../src/security/hidden-input.ts","../src/wallet/wallet-types.ts","../src/commands/inspect.ts","../src/commands/hyperliquid.ts","../src/hyperliquid/info-input.ts","../src/commands/project.ts","../src/projects/project-types.ts","../src/settings/schema.ts","../src/commands/settings.ts","../src/projects/rpc-key-prompt.ts","../src/commands/usage.ts","../src/commands/sign.ts","../src/version.ts","../src/commands/version.ts","../src/commands/skills.ts","../src/skills/install.ts","../src/networks/network-prompt.ts","../src/projects/project-prompt.ts","../src/runtime/context.ts","../src/auth/session-metadata-store.ts","../src/auth/auth-service.ts","../src/auth/callback-server.ts","../src/auth/pkce.ts","../src/auth/browser-flow.ts","../src/auth/browser-opener.ts","../src/auth/device-flow.ts","../src/auth/credential-mutation-lock.ts","../src/storage/file-lock.ts","../src/errors/service-error-mapper.ts","../src/http/web-result.ts","../src/auth/oauth-paths.ts","../src/auth/oauth-types.ts","../src/auth/oauth-client.ts","../src/auth/session-service.ts","../src/credentials/cross-keychain-store.ts","../src/credentials/keychain-secret-store.ts","../src/credentials/credential-store.ts","../src/evm/format.ts","../src/evm/json-rpc-failure.ts","../src/evm/rpc-endpoint-rejected.ts","../src/evm/evm-query-service.ts","../src/evm/json-rpc-client.ts","../src/evm/rpc-allowlist-store.ts","../src/hyperliquid/info-allowlist-default.ts","../src/evm/rpc-allowlist-default.ts","../src/evm/rpc-method-policy.ts","../src/hyperliquid/info-client.ts","../src/hyperliquid/info-method-policy.ts","../src/hyperliquid/info-service.ts","../src/http/transport.ts","../src/networks/endpoint-resolver.ts","../src/settings/resolution.ts","../src/networks/network-selector.ts","../src/projects/dotenv-api-key-writer.ts","../src/projects/endpoint-cache-crypto.ts","../src/projects/endpoint-cache-schema.ts","../src/projects/endpoint-cache-store.ts","../src/storage/atomic-json.ts","../src/projects/project-endpoint-cache.ts","../src/projects/rpc-key-pull-service.ts","../src/projects/project-service.ts","../src/projects/project-selector.ts","../src/projects/zan-cli-api-client.ts","../src/projects/usage-types.ts","../src/readiness/readiness-service.ts","../src/settings/settings-store.ts","../src/settings/paths.ts","../src/wallet/signer.ts","../src/wallet/wallet-service.ts","../src/wallet/signing-service.ts","../src/runtime/config.ts"],"sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Command } from \"commander\";\nimport {\n createInternalFailure,\n isSuccessfulCommanderExit,\n mapFailure,\n} from \"./errors/failure-mapper.js\";\nimport {\n createProcessOutputWriter,\n type OutputWriter,\n} from \"./output/output-writer.js\";\nimport {\n createProgram,\n type ProgramDependencies,\n} from \"./program.js\";\n\nexport function isMainModule(metaUrl: string, argvEntry?: string): boolean {\n if (!argvEntry) {\n return false;\n }\n\n try {\n return realpathSync(fileURLToPath(metaUrl)) === realpathSync(argvEntry);\n } catch {\n return false;\n }\n}\n\nexport interface CliRuntimeDependencies {\n outputWriter?: OutputWriter;\n programFactory?: (dependencies: ProgramDependencies) => Command;\n setExitCode?: (exitCode: number) => void;\n signalBoundary?: CliSignalBoundary;\n}\n\nexport interface CliSignalBoundary {\n registerSigint(listener: () => void): () => void;\n hardStop(exitCode: number): void;\n}\n\nfunction createProcessSignalBoundary(): CliSignalBoundary {\n return {\n registerSigint: (listener) => {\n process.on(\"SIGINT\", listener);\n return () => {\n process.off(\"SIGINT\", listener);\n };\n },\n hardStop: (exitCode) => {\n process.exit(exitCode);\n },\n };\n}\n\nexport async function runCli(\n argv = process.argv,\n dependencies: CliRuntimeDependencies = {},\n): Promise<void> {\n const outputWriter = dependencies.outputWriter ?? createProcessOutputWriter();\n outputWriter.configure({\n mode: argv.includes(\"--json\") ? \"json\" : \"human\",\n quiet: argv.includes(\"--quiet\"),\n noColor: argv.includes(\"--no-color\") || process.env.NO_COLOR !== undefined,\n });\n\n const programFactory = dependencies.programFactory ?? createProgram;\n const setExitCode =\n dependencies.setExitCode ??\n ((exitCode: number): void => {\n process.exitCode = exitCode;\n });\n const signalBoundary =\n dependencies.signalBoundary ?? createProcessSignalBoundary();\n const abortController = new AbortController();\n let interrupted = false;\n let hardStopRequested = false;\n const removeSigintListener = signalBoundary.registerSigint(() => {\n if (interrupted) {\n if (!hardStopRequested) {\n hardStopRequested = true;\n signalBoundary.hardStop(130);\n }\n return;\n }\n\n interrupted = true;\n outputWriter.suppress();\n abortController.abort();\n setExitCode(130);\n });\n\n try {\n await programFactory({\n outputWriter,\n signal: abortController.signal,\n }).parseAsync(argv);\n } catch (error) {\n if (interrupted) {\n return;\n }\n\n try {\n if (isSuccessfulCommanderExit(error)) {\n return;\n }\n\n const failure = mapFailure(error);\n outputWriter.failure(failure);\n setExitCode(failure.exitCode);\n } catch {\n const failure = createInternalFailure();\n try {\n outputWriter.failure(failure);\n } catch {}\n try {\n setExitCode(failure.exitCode);\n } catch {}\n }\n } finally {\n removeSigintListener();\n }\n}\n\nif (isMainModule(import.meta.url, process.argv[1])) {\n void runCli();\n}\n","import { CommanderError } from \"commander\";\nimport { redactSensitiveText } from \"../security/redactor.js\";\nimport { CliFailure } from \"./failure.js\";\n\nconst NETWORK_ERROR_CODES = new Set([\n \"ECONNABORTED\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"ETIMEDOUT\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\n\ntype Constructor<T> = abstract new (...args: any[]) => T;\n\nfunction safeInstanceOf<T>(\n value: unknown,\n constructor: Constructor<T>,\n): value is T {\n try {\n return value instanceof constructor;\n } catch {\n return false;\n }\n}\n\nfunction safeProperty(value: unknown, property: PropertyKey): unknown {\n if (\n value === null ||\n (typeof value !== \"object\" && typeof value !== \"function\")\n ) {\n return undefined;\n }\n\n try {\n return Reflect.get(value, property);\n } catch {\n return undefined;\n }\n}\n\nfunction safeStringProperty(\n value: unknown,\n property: PropertyKey,\n): string | undefined {\n const propertyValue = safeProperty(value, property);\n return typeof propertyValue === \"string\" ? propertyValue : undefined;\n}\n\nfunction hasNetworkCode(error: unknown): boolean {\n const code = safeStringProperty(error, \"code\");\n return code !== undefined && NETWORK_ERROR_CODES.has(code.toUpperCase());\n}\n\nfunction isNetworkFailure(error: unknown): boolean {\n if (safeStringProperty(error, \"name\") === \"AbortError\" || hasNetworkCode(error)) {\n return true;\n }\n\n if (\n safeInstanceOf(error, TypeError) &&\n /^(?:fetch failed|failed to fetch|load failed|network request failed)$/iu.test(\n safeStringProperty(error, \"message\") ?? \"\",\n )\n ) {\n return true;\n }\n\n return hasNetworkCode(safeProperty(error, \"cause\"));\n}\n\nexport function isSuccessfulCommanderExit(error: unknown): boolean {\n return (\n safeInstanceOf(error, CommanderError) &&\n safeProperty(error, \"exitCode\") === 0\n );\n}\n\nexport function createInternalFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"An unexpected internal error occurred.\",\n );\n}\n\nexport function mapFailure(error: unknown): CliFailure {\n try {\n if (safeInstanceOf(error, CliFailure)) {\n return error;\n }\n\n if (\n safeInstanceOf(error, CommanderError) &&\n !isSuccessfulCommanderExit(error)\n ) {\n const code = safeStringProperty(error, \"code\");\n const message =\n code === \"commander.help\"\n ? \"A command is required.\"\n : redactSensitiveText(\n safeStringProperty(error, \"message\") ?? \"Invalid command arguments.\",\n );\n return new CliFailure(\"INVALID_ARGS\", message);\n }\n\n if (isNetworkFailure(error)) {\n return new CliFailure(\n \"NETWORK_ERROR\",\n \"A network request failed.\",\n \"Check your network connection and try again.\",\n );\n }\n } catch {\n return createInternalFailure();\n }\n\n return createInternalFailure();\n}\n","const SECRET_KEYS =\n \"access_token|refresh_token|code|device_code|user_code|projectToken|endpoint|private_key|privateKey|secret_key|secretKey\";\n\nconst AUTHORIZATION_HEADER_PATTERN =\n /\\b(Authorization\\s*:\\s*)(?:[A-Za-z][A-Za-z0-9_-]*\\s+)?[^\\s,;]+/giu;\nconst BEARER_PATTERN = /\\bBearer\\s+[A-Za-z0-9._~+/=-]+/giu;\nconst JWT_CANDIDATE_PATTERN =\n /(?<![A-Za-z0-9_:/.-])([A-Za-z0-9_-]{8,})\\.[A-Za-z0-9_-]{2,}\\.[A-Za-z0-9_-]{8,}(?![A-Za-z0-9_-])/gu;\nconst JSON_STRING_PATTERN = new RegExp(\n `([\"'](?:${SECRET_KEYS})[\"']\\\\s*:\\\\s*)([\"'])(?:\\\\\\\\.|(?!\\\\2)[^\\\\\\\\])*\\\\2`,\n \"giu\",\n);\nconst JSON_PRIMITIVE_PATTERN = new RegExp(\n `([\"'](?:${SECRET_KEYS})[\"']\\\\s*:\\\\s*)(?![\"'])([^,}\\\\]\\\\s]+)`,\n \"giu\",\n);\nconst QUOTED_ASSIGNMENT_PATTERN = new RegExp(\n `\\\\b(${SECRET_KEYS})(\\\\s*=\\\\s*)([\"'])(?:\\\\\\\\.|(?!\\\\3)[^\\\\\\\\])*\\\\3`,\n \"giu\",\n);\nconst ASSIGNMENT_PATTERN = new RegExp(\n `\\\\b(${SECRET_KEYS})(\\\\s*=\\\\s*)([^\\\\s&;,\\\\]\\\\[{}()\"'<>]+)`,\n \"giu\",\n);\nconst ZAN_NODE_URL_PATTERN =\n /\\b(https?:\\/\\/(?:[A-Za-z0-9-]+\\.)*zan\\.top\\/node\\/(?:[^\\s/?#\"'`;,\\])}]+\\/){3,})[^\\s/?#\"'`;,\\])}]+/giu;\n\nfunction hasJwtHeader(encodedHeader: string): boolean {\n if (encodedHeader.length > 4096) {\n return false;\n }\n\n try {\n const header: unknown = JSON.parse(\n Buffer.from(encodedHeader, \"base64url\").toString(\"utf8\"),\n );\n return (\n typeof header === \"object\" &&\n header !== null &&\n !Array.isArray(header) &&\n typeof (header as { alg?: unknown }).alg === \"string\"\n );\n } catch {\n return false;\n }\n}\n\nexport function redactSensitiveText(input: string): string {\n return input\n .replace(AUTHORIZATION_HEADER_PATTERN, \"$1[REDACTED]\")\n .replace(BEARER_PATTERN, \"Bearer [REDACTED]\")\n .replace(JSON_STRING_PATTERN, \"$1$2[REDACTED]$2\")\n .replace(JSON_PRIMITIVE_PATTERN, \"$1[REDACTED]\")\n .replace(QUOTED_ASSIGNMENT_PATTERN, \"$1$2$3[REDACTED]$3\")\n .replace(ASSIGNMENT_PATTERN, \"$1$2[REDACTED]\")\n .replace(ZAN_NODE_URL_PATTERN, \"$1[REDACTED]\")\n .replace(JWT_CANDIDATE_PATTERN, (candidate, encodedHeader: string) =>\n hasJwtHeader(encodedHeader) ? \"[REDACTED]\" : candidate,\n );\n}\n","export const ERROR_CODES = [\n \"AUTH_REQUIRED\",\n \"AUTH_DENIED\",\n \"AUTH_EXPIRED\",\n \"SETUP_REQUIRED\",\n \"INVALID_ARGS\",\n \"PROJECT_NOT_FOUND\",\n \"NETWORK_NOT_FOUND\",\n \"NETWORK_NOT_AVAILABLE\",\n \"NAME_RESOLUTION_UNAVAILABLE\",\n \"NOT_FOUND\",\n \"RATE_LIMITED\",\n \"NETWORK_ERROR\",\n \"RPC_ERROR\",\n \"ZAN_API_ERROR\",\n \"INTERNAL_ERROR\",\n \"CREDENTIAL_STORE_UNAVAILABLE\",\n] as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[number];\n\nexport interface FailureBody {\n code: ErrorCode;\n message: string;\n hint?: string;\n retryable: boolean;\n}\n\nconst EXIT_CODES: Record<ErrorCode, number> = {\n AUTH_REQUIRED: 3,\n AUTH_DENIED: 3,\n AUTH_EXPIRED: 3,\n SETUP_REQUIRED: 3,\n INVALID_ARGS: 2,\n PROJECT_NOT_FOUND: 4,\n NETWORK_NOT_FOUND: 4,\n NETWORK_NOT_AVAILABLE: 4,\n NAME_RESOLUTION_UNAVAILABLE: 4,\n NOT_FOUND: 4,\n RATE_LIMITED: 5,\n NETWORK_ERROR: 6,\n RPC_ERROR: 7,\n ZAN_API_ERROR: 8,\n INTERNAL_ERROR: 1,\n CREDENTIAL_STORE_UNAVAILABLE: 3,\n};\n\nconst DEFAULT_RETRYABLE_CODES: ReadonlySet<ErrorCode> = new Set([\n \"RATE_LIMITED\",\n \"NETWORK_ERROR\",\n]);\n\nexport class CliFailure extends Error {\n readonly code: ErrorCode;\n readonly hint?: string;\n readonly retryable: boolean;\n readonly exitCode: number;\n\n constructor(code: ErrorCode, message: string, hint?: string, retryable?: boolean) {\n super(message);\n this.name = \"CliFailure\";\n this.code = code;\n if (hint !== undefined) {\n this.hint = hint;\n }\n this.retryable = retryable ?? DEFAULT_RETRYABLE_CODES.has(code);\n this.exitCode = EXIT_CODES[code];\n }\n\n toJSON(): { error: FailureBody } {\n const error: FailureBody = {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n };\n if (this.hint !== undefined) {\n error.hint = this.hint;\n }\n\n return { error };\n }\n}\n","import type { CliFailure, FailureBody } from \"../errors/failure.js\";\nimport { redactSensitiveText } from \"../security/redactor.js\";\nimport * as qrCodeTerminal from \"qrcode-terminal\";\n\nexport interface OutputStreams {\n writeStdout(value: string): void;\n writeStderr(value: string): void;\n}\n\nexport interface OutputWriterOptions {\n mode: \"human\" | \"json\";\n quiet?: boolean;\n noColor?: boolean;\n streams: OutputStreams;\n qrCodeRenderer?: (value: string) => string;\n}\n\nexport interface OutputWriterConfiguration {\n mode?: \"human\" | \"json\";\n quiet?: boolean;\n noColor?: boolean;\n}\n\nexport interface DevicePrompt {\n verificationUri: string;\n verificationUriComplete?: string;\n userCode: string;\n expiresAt: string;\n}\n\nfunction withSingleTrailingNewline(value: string): string {\n return `${value.replace(/\\n+$/u, \"\")}\\n`;\n}\n\nfunction renderTerminalQrCode(value: string): string {\n let rendered = \"\";\n qrCodeTerminal.generate(value, { small: true }, (qrCode) => {\n rendered = qrCode;\n });\n return rendered.replace(/\\n+$/u, \"\");\n}\n\nexport class OutputWriter {\n private mode: \"human\" | \"json\";\n private quiet: boolean;\n private noColor: boolean;\n private suppressed = false;\n private readonly streams: OutputStreams;\n private readonly qrCodeRenderer: (value: string) => string;\n\n constructor(options: OutputWriterOptions) {\n this.mode = options.mode;\n this.quiet = options.quiet ?? false;\n this.noColor = options.noColor ?? false;\n this.streams = options.streams;\n this.qrCodeRenderer =\n options.qrCodeRenderer ?? renderTerminalQrCode;\n }\n\n configure(options: OutputWriterConfiguration): void {\n if (options.mode !== undefined) {\n this.mode = options.mode;\n }\n if (options.quiet !== undefined) {\n this.quiet = options.quiet;\n }\n if (options.noColor !== undefined) {\n this.noColor = options.noColor;\n }\n }\n\n suppress(): void {\n this.suppressed = true;\n }\n\n success(jsonValue: unknown, humanText?: string): void {\n if (this.suppressed) {\n return;\n }\n\n if (this.mode === \"json\") {\n this.writeStdout(withSingleTrailingNewline(JSON.stringify(jsonValue) ?? \"null\"));\n return;\n }\n\n const text = humanText ?? (typeof jsonValue === \"string\" ? jsonValue : JSON.stringify(jsonValue));\n this.writeStdout(withSingleTrailingNewline(text ?? \"\"));\n }\n\n failure(failure: CliFailure): void {\n if (this.suppressed) {\n return;\n }\n\n const message = redactSensitiveText(failure.message);\n const hint =\n failure.hint === undefined ? undefined : redactSensitiveText(failure.hint);\n\n if (this.mode === \"json\") {\n const error: FailureBody =\n hint === undefined\n ? {\n code: failure.code,\n message,\n retryable: failure.retryable,\n }\n : {\n code: failure.code,\n message,\n hint,\n retryable: failure.retryable,\n };\n this.writeSafeStderr(`${JSON.stringify({ error })}\\n`);\n return;\n }\n\n const lines = [`${failure.code}: ${message}`];\n if (hint !== undefined) {\n lines.push(`Hint: ${hint}`);\n }\n this.writeSafeStderr(`${lines.join(\"\\n\")}\\n`);\n }\n\n progress(text: string): void {\n if (this.suppressed || this.mode === \"json\" || this.quiet) {\n return;\n }\n\n this.writeSafeStderr(withSingleTrailingNewline(redactSensitiveText(text)));\n }\n\n authorizationPrompt(url: string): void {\n if (this.suppressed) {\n return;\n }\n if (this.mode === \"json\") {\n this.writeSafeStderr(\n `${JSON.stringify({ authorization: { url } })}\\n`,\n );\n return;\n }\n this.writeSafeStderr(`Open this URL to authorize:\\n${url}\\n`);\n }\n\n devicePrompt(prompt: DevicePrompt): void {\n if (this.suppressed) {\n return;\n }\n const safePrompt: DevicePrompt = {\n verificationUri: prompt.verificationUri,\n ...(prompt.verificationUriComplete === undefined\n ? {}\n : {\n verificationUriComplete:\n prompt.verificationUriComplete,\n }),\n userCode: prompt.userCode,\n expiresAt: prompt.expiresAt,\n };\n if (this.mode === \"json\") {\n this.writeSafeStderr(\n `${JSON.stringify({ deviceAuthorization: safePrompt })}\\n`,\n );\n return;\n }\n const authorizationUrl =\n safePrompt.verificationUriComplete ??\n safePrompt.verificationUri;\n this.writeSafeStderr(\n [\n \"Scan to authorize:\",\n this.qrCodeRenderer(authorizationUrl),\n `Open: ${authorizationUrl}`,\n `Code: ${safePrompt.userCode}`,\n `Expires: ${safePrompt.expiresAt}`,\n \"\",\n ].join(\"\\n\"),\n );\n }\n\n writeStdout(value: string): void {\n if (this.suppressed) {\n return;\n }\n\n this.streams.writeStdout(value);\n }\n\n writeStderr(value: string): void {\n if (this.suppressed) {\n return;\n }\n\n this.streams.writeStderr(redactSensitiveText(value));\n }\n\n colorsEnabled(): boolean {\n return !this.noColor && process.env.NO_COLOR === undefined;\n }\n\n private writeSafeStderr(value: string): void {\n if (this.suppressed) {\n return;\n }\n\n this.streams.writeStderr(value);\n }\n}\n\nexport function createProcessOutputWriter(): OutputWriter {\n return new OutputWriter({\n mode: \"human\",\n noColor: process.env.NO_COLOR !== undefined,\n streams: {\n writeStdout: (value) => {\n process.stdout.write(value);\n },\n writeStderr: (value) => {\n process.stderr.write(value);\n },\n },\n });\n}\n","import { Command, InvalidArgumentError } from \"commander\";\nimport {\n registerAuth,\n type AuthCommandEnvironment,\n} from \"./commands/auth.js\";\nimport { registerAgent } from \"./commands/agent.js\";\nimport { registerCompletions } from \"./commands/completions.js\";\nimport { registerEvm } from \"./commands/evm.js\";\nimport { registerInspect } from \"./commands/inspect.js\";\nimport { registerHyperliquid } from \"./commands/hyperliquid.js\";\nimport { registerProject } from \"./commands/project.js\";\nimport { registerUsage } from \"./commands/usage.js\";\nimport { registerSign } from \"./commands/sign.js\";\nimport {\n parseNetworkOption,\n parseProjectOption,\n registerSettings,\n} from \"./commands/settings.js\";\nimport { registerVersion } from \"./commands/version.js\";\nimport { registerSkills } from \"./commands/skills.js\";\nimport type { SkillInstallEnvironment } from \"./skills/install.js\";\nimport {\n createProcessOutputWriter,\n type OutputWriter,\n} from \"./output/output-writer.js\";\nimport {\n ReadlineNetworkPrompt,\n type NetworkPrompt,\n} from \"./networks/network-prompt.js\";\nimport {\n ReadlineProjectPrompt,\n type ProjectPrompt,\n} from \"./projects/project-prompt.js\";\nimport {\n createRuntimeContext,\n type RuntimeContext,\n type RuntimeContextFactory,\n} from \"./runtime/context.js\";\nimport { MAX_REQUEST_TIMEOUT_MS } from \"./runtime/config.js\";\nimport { CLI_VERSION } from \"./version.js\";\nimport {\n TerminalRpcKeyPrompt,\n type RpcKeyPrompt,\n} from \"./projects/rpc-key-prompt.js\";\nimport {\n TerminalWalletKeyPrompt,\n type WalletKeyPrompt,\n} from \"./wallet/wallet-key-input.js\";\n\nexport interface GlobalOptions {\n project?: string;\n network?: string;\n json?: boolean;\n interactive?: boolean;\n quiet?: boolean;\n verbose?: boolean;\n timeout?: number;\n color?: boolean;\n reveal?: boolean;\n}\n\nexport interface ProgramDependencies {\n skillsEnvironment?: SkillInstallEnvironment;\n outputWriter?: OutputWriter;\n signal?: AbortSignal;\n runtimeContextFactory?: RuntimeContextFactory;\n authEnvironment?: AuthCommandEnvironment;\n projectPrompt?: ProjectPrompt;\n networkPrompt?: NetworkPrompt;\n input?: NodeJS.ReadableStream;\n rpcKeyPrompt?: RpcKeyPrompt;\n walletKeyPrompt?: WalletKeyPrompt;\n}\n\nfunction parsePositiveInteger(value: string): number {\n if (!/^[1-9]\\d*$/u.test(value)) {\n throw new InvalidArgumentError(\"must be a positive integer\");\n }\n\n const parsed = Number(value);\n if (\n !Number.isSafeInteger(parsed) ||\n parsed > MAX_REQUEST_TIMEOUT_MS\n ) {\n throw new InvalidArgumentError(\"must be a positive integer\");\n }\n\n return parsed;\n}\n\nfunction configureWriter(outputWriter: OutputWriter, options: GlobalOptions): void {\n outputWriter.configure({\n mode: options.json === true ? \"json\" : \"human\",\n quiet: options.quiet === true,\n noColor: options.color === false || process.env.NO_COLOR !== undefined,\n });\n}\n\nexport function createProgram(dependencies: ProgramDependencies = {}): Command {\n const outputWriter = dependencies.outputWriter ?? createProcessOutputWriter();\n const signal = dependencies.signal ?? new AbortController().signal;\n const input = dependencies.input ?? process.stdin;\n const program = new Command()\n .name(\"zan\")\n .description(\"Unified ZAN command-line interface\")\n .version(CLI_VERSION, \"-v, --version\")\n .option(\"--project <id>\", \"select a project\", parseProjectOption)\n .option(\"-n, --network <id>\", \"select a network\", parseNetworkOption)\n .option(\"--json\", \"write machine-readable JSON\")\n .option(\"--no-interactive\", \"disable interactive prompts\")\n .option(\"--interactive\", \"enable interactive prompts\")\n .option(\"--quiet\", \"suppress progress output\")\n .option(\"--verbose\", \"enable verbose diagnostics\")\n .option(\"--timeout <ms>\", \"set the request timeout\", parsePositiveInteger)\n .option(\"--no-color\", \"disable ANSI color\")\n .option(\"--color\", \"enable ANSI color\")\n .option(\"--reveal\", \"allow explicit secret result fields\")\n .exitOverride();\n\n program.configureOutput({\n writeOut: (value) => {\n outputWriter.writeStdout(value);\n },\n writeErr: () => {},\n outputError: () => {},\n getOutHasColors: () =>\n program.opts<GlobalOptions>().color !== false && outputWriter.colorsEnabled(),\n getErrHasColors: () =>\n program.opts<GlobalOptions>().color !== false && outputWriter.colorsEnabled(),\n });\n program.hook(\"preAction\", () => {\n configureWriter(outputWriter, program.opts<GlobalOptions>());\n });\n\n const runtimeContextFactory =\n dependencies.runtimeContextFactory ?? createRuntimeContext;\n const authEnvironment =\n dependencies.authEnvironment ?? {\n env: process.env,\n isTTY: Reflect.get(input, \"isTTY\") === true,\n };\n const projectPrompt =\n dependencies.projectPrompt ??\n new ReadlineProjectPrompt({\n input,\n writeStderr: (value) => {\n outputWriter.writeStderr(value);\n },\n signal,\n });\n const networkPrompt =\n dependencies.networkPrompt ??\n new ReadlineNetworkPrompt({\n input,\n writeStderr: (value) => {\n outputWriter.writeStderr(value);\n },\n signal,\n });\n let runtimeContext: Promise<RuntimeContext> | undefined;\n const getRuntimeContext = (): Promise<RuntimeContext> => {\n const options = program.opts<GlobalOptions>();\n runtimeContext ??= Promise.resolve(\n runtimeContextFactory({\n signal,\n env: authEnvironment.env,\n interactive: options.interactive !== false,\n isTTY: authEnvironment.isTTY,\n projectPrompt,\n networkPrompt,\n ...(options.project === undefined\n ? {}\n : { project: options.project }),\n ...(options.network === undefined\n ? {}\n : { network: options.network }),\n ...(options.timeout === undefined\n ? {}\n : { requestTimeoutMs: options.timeout }),\n }),\n );\n return runtimeContext;\n };\n\n const rpcKeyPrompt =\n dependencies.rpcKeyPrompt ??\n new TerminalRpcKeyPrompt(\n input,\n (value) => outputWriter.writeStderr(value),\n signal,\n );\n const walletKeyPrompt =\n dependencies.walletKeyPrompt ??\n new TerminalWalletKeyPrompt(\n input,\n (value) => outputWriter.writeStderr(value),\n signal,\n );\n registerSettings(\n program,\n outputWriter,\n getRuntimeContext,\n input,\n walletKeyPrompt,\n );\n registerInspect(program, outputWriter, getRuntimeContext);\n registerAuth(\n program,\n outputWriter,\n getRuntimeContext,\n authEnvironment,\n );\n registerProject(\n program,\n outputWriter,\n getRuntimeContext,\n input,\n rpcKeyPrompt,\n );\n registerEvm(program, outputWriter, getRuntimeContext, input);\n registerUsage(program, outputWriter, getRuntimeContext);\n registerHyperliquid(program, outputWriter, getRuntimeContext, input);\n registerSign(program, outputWriter, getRuntimeContext);\n registerAgent(program, outputWriter);\n registerCompletions(program, outputWriter);\n registerVersion(program, outputWriter);\n registerSkills(program, outputWriter, dependencies.skillsEnvironment);\n return program;\n}\n","export interface DeviceFlowSelectionInput {\n deviceCode: boolean;\n interactive: boolean;\n isTTY: boolean;\n env: Record<string, string | undefined>;\n}\n\nexport function shouldUseDeviceFlow(\n input: DeviceFlowSelectionInput,\n): boolean {\n return (\n input.deviceCode ||\n !input.interactive ||\n !input.isTTY ||\n input.env.SSH_CONNECTION !== undefined ||\n input.env.SSH_TTY !== undefined ||\n input.env.CODESPACES !== undefined ||\n input.env.REMOTE_CONTAINERS !== undefined\n );\n}\n","import type { Command } from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport { shouldUseDeviceFlow } from \"../auth/interaction.js\";\nimport type {\n AuthStatus,\n LoginResult,\n LogoutResult,\n} from \"../auth/auth-service.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nexport interface AuthCommandEnvironment {\n env: Record<string, string | undefined>;\n isTTY: boolean;\n}\n\ninterface RootAuthOptions {\n interactive?: boolean;\n}\n\nfunction formatLogin(result: LoginResult): string {\n return result.alreadyAuthenticated\n ? `Authenticated as profile ${result.profile}`\n : `Authentication complete for profile ${result.profile}`;\n}\n\nfunction formatStatus(status: AuthStatus): string {\n const expiresAt = status.expiresAt === undefined\n ? \"not verified\"\n : new Date(status.expiresAt).toLocaleString(undefined, {\n timeZoneName: \"short\",\n });\n return [\n `Email: ${status.email ?? \"not available\"}`,\n `Authenticated: ${status.authenticated ? \"yes\" : \"no\"}`,\n `Expires at: ${expiresAt}`,\n `Scopes: ${status.scopes.join(\", \") || \"none\"}`,\n ].join(\"\\n\");\n}\n\nfunction formatLogout(result: LogoutResult): string {\n return result.serverRevoked\n ? \"Logged out locally and from the ZAN authorization service\"\n : \"Logged out locally; server revocation could not be confirmed\";\n}\n\nexport function registerAuth(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n environment: AuthCommandEnvironment,\n): void {\n const auth = program\n .command(\"auth\")\n .description(\"Manage ZAN authentication\");\n\n auth\n .command(\"login\")\n .description(\"Authorize the ZAN CLI\")\n .option(\"--device-code\", \"use OAuth Device Flow\")\n .option(\"--force\", \"replace the current local session\")\n .action(\n async (options: { deviceCode?: boolean; force?: boolean }) => {\n const root = program.opts<RootAuthOptions>();\n const interactive = root.interactive !== false;\n const useDeviceFlow = shouldUseDeviceFlow({\n deviceCode: options.deviceCode === true,\n interactive,\n isTTY: environment.isTTY,\n env: environment.env,\n });\n const { authService } = await getRuntimeContext();\n const result = await authService.login({\n useDeviceFlow,\n interactive,\n force: options.force === true,\n onAuthorizationUrl: (url) => {\n outputWriter.authorizationPrompt(url);\n },\n onDevicePrompt: (prompt) => {\n outputWriter.devicePrompt(prompt);\n },\n });\n outputWriter.success(result, formatLogin(result));\n },\n );\n\n auth\n .command(\"status\")\n .description(\"Show local authentication status\")\n .option(\"--verify\", \"verify the session with ZAN\")\n .action(async (options: { verify?: boolean }) => {\n const { authService } = await getRuntimeContext();\n const status =\n options.verify === true\n ? await authService.verify()\n : await authService.status();\n outputWriter.success(status, formatStatus(status));\n });\n\n auth\n .command(\"logout\")\n .description(\"Revoke and clear the local session\")\n .action(async () => {\n const { authService } = await getRuntimeContext();\n const result = await authService.logout();\n outputWriter.success(result, formatLogout(result));\n });\n}\n","import type { Command } from \"commander\";\nimport { z } from \"zod\";\nimport {\n CliFailure,\n ERROR_CODES,\n type ErrorCode,\n} from \"../errors/failure.js\";\n\nconst commandArgumentSchema = z\n .object({\n name: z.string().min(1),\n description: z.string(),\n required: z.boolean(),\n variadic: z.boolean(),\n })\n .strict();\n\nconst commandOptionSchema = z\n .object({\n flags: z.string().min(1),\n description: z.string(),\n })\n .strict();\n\nexport interface ManifestCommand {\n name: string;\n path: string;\n description: string;\n arguments: Array<z.infer<typeof commandArgumentSchema>>;\n options: Array<z.infer<typeof commandOptionSchema>>;\n subcommands: ManifestCommand[];\n}\n\nconst manifestCommandSchema: z.ZodType<ManifestCommand> = z.lazy(() =>\n z\n .object({\n name: z.string().min(1),\n path: z.string().min(1),\n description: z.string(),\n arguments: z.array(commandArgumentSchema),\n options: z.array(commandOptionSchema),\n subcommands: z.array(manifestCommandSchema),\n })\n .strict(),\n);\n\nconst failureEntrySchema = z\n .object({\n exitCode: z.number().int().nonnegative(),\n retryable: z.boolean(),\n })\n .strict();\n\nexport const agentManifestSchema = z\n .object({\n schemaVersion: z.literal(\"1\"),\n usageRules: z.array(z.string().min(1)),\n readinessProbe: z\n .object({\n command: z.string().min(1),\n })\n .strict(),\n credentialFlows: z.array(\n z\n .object({\n name: z.string().min(1),\n command: z.string().min(1),\n })\n .strict(),\n ),\n commandCatalog: z.array(manifestCommandSchema),\n failureCatalog: z.record(z.string(), failureEntrySchema),\n recipes: z.array(\n z\n .object({\n name: z.string().min(1),\n commands: z.array(z.string().min(1)).min(1),\n })\n .strict(),\n ),\n })\n .strict();\n\nexport type AgentManifest = z.infer<typeof agentManifestSchema>;\n\nfunction serializeCommand(\n command: Command,\n parent: string[],\n): ManifestCommand {\n const path = [...parent, command.name()];\n return {\n name: command.name(),\n path: path.join(\" \"),\n description: command.description(),\n arguments: command.registeredArguments.map((argument) => ({\n name: argument.name(),\n description: argument.description,\n required: argument.required,\n variadic: argument.variadic,\n })),\n options: command.options.map((option) => ({\n flags: option.flags,\n description: option.description,\n })),\n subcommands: command.commands.map((child) =>\n serializeCommand(child, path),\n ),\n };\n}\n\nfunction failureCatalog(): Record<\n ErrorCode,\n { exitCode: number; retryable: boolean }\n> {\n return Object.fromEntries(\n ERROR_CODES.map((code) => {\n const failure = new CliFailure(code, \"\");\n return [\n code,\n {\n exitCode: failure.exitCode,\n retryable: failure.retryable,\n },\n ];\n }),\n ) as Record<\n ErrorCode,\n { exitCode: number; retryable: boolean }\n >;\n}\n\nexport function createAgentManifest(program: Command): AgentManifest {\n return agentManifestSchema.parse({\n schemaVersion: \"1\",\n usageRules: [\n \"Always use --json --no-interactive.\",\n \"Run zan inspect before online operations.\",\n \"Treat stderr as diagnostics or a structured failure channel.\",\n \"Never persist or print credential fields returned to the process.\",\n ],\n readinessProbe: {\n command: \"zan inspect --json --no-interactive\",\n },\n credentialFlows: [\n {\n name: \"browser-pkce\",\n command: \"zan auth login\",\n },\n {\n name: \"device-code\",\n command: \"zan auth login --device-code --no-interactive\",\n },\n ],\n commandCatalog: program.commands.map((command) =>\n serializeCommand(command, []),\n ),\n failureCatalog: failureCatalog(),\n recipes: [\n {\n name: \"prepare-agent\",\n commands: [\n \"zan inspect --json --no-interactive\",\n \"zan auth status --json --no-interactive\",\n ],\n },\n {\n name: \"inspect-projects\",\n commands: [\n \"zan project list --json --no-interactive\",\n \"zan evm networks --json --no-interactive\",\n ],\n },\n {\n name: \"inspect-usage\",\n commands: [\"zan --json --no-interactive usage\"],\n },\n ],\n });\n}\n","import type { Command } from \"commander\";\nimport { createAgentManifest } from \"../agent/manifest.js\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\n\nexport function registerAgent(\n program: Command,\n outputWriter: OutputWriter,\n): void {\n const agent = program\n .command(\"agent\")\n .description(\"Machine-readable ZAN CLI metadata\");\n\n agent\n .command(\"manifest\")\n .description(\"Print the Agent Manifest\")\n .action(() => {\n const manifest = createAgentManifest(program);\n outputWriter.success(\n manifest,\n JSON.stringify(manifest, null, 2),\n );\n });\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport {\n generateCompletions,\n type CompletionShell,\n} from \"../completions/generate.js\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\n\nfunction parseShell(value: string): CompletionShell {\n if (value !== \"bash\" && value !== \"zsh\" && value !== \"fish\") {\n throw new InvalidArgumentError(\"must be bash, zsh, or fish\");\n }\n return value;\n}\n\nexport function registerCompletions(\n program: Command,\n outputWriter: OutputWriter,\n): void {\n program\n .command(\"completions\")\n .description(\"Generate shell completions\")\n .argument(\"<shell>\", \"bash, zsh, or fish\", parseShell)\n .action((shell: CompletionShell) => {\n const script = generateCompletions(program, shell);\n outputWriter.success({ shell, script }, script);\n });\n}\n","import type { Command } from \"commander\";\n\nexport type CompletionShell = \"bash\" | \"zsh\" | \"fish\";\n\ninterface CompletionEntry {\n name: string;\n description: string;\n}\n\nfunction entries(program: Command): CompletionEntry[] {\n const result: CompletionEntry[] = [];\n const visit = (command: Command): void => {\n for (const child of command.commands) {\n result.push({\n name: child.name(),\n description: child.description(),\n });\n visit(child);\n }\n };\n visit(program);\n return result;\n}\n\nfunction singleQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\"'\\\"'\")}'`;\n}\n\nexport function generateCompletions(\n program: Command,\n shell: CompletionShell,\n): string {\n const catalog = entries(program);\n const names = [...new Set(catalog.map((entry) => entry.name))];\n\n if (shell === \"bash\") {\n return [\n \"_zan_complete() {\",\n ` COMPREPLY=( $(compgen -W ${singleQuote(names.join(\" \"))} -- \\\"\\${COMP_WORDS[COMP_CWORD]}\\\") )`,\n \"}\",\n \"complete -F _zan_complete zan\",\n \"\",\n ].join(\"\\n\");\n }\n\n if (shell === \"zsh\") {\n return [\n \"#compdef zan\",\n `_arguments '*:command:(${names.join(\" \")})'`,\n \"\",\n ].join(\"\\n\");\n }\n\n return [\n ...catalog.map(\n (entry) =>\n `complete -c zan -f -a ${singleQuote(entry.name)} -d ${singleQuote(entry.description)}`,\n ),\n \"\",\n ].join(\"\\n\");\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport { parseEther, parseGwei, type Hex } from \"viem\";\nimport type { EvmLogFilter } from \"../evm/evm-query-service.js\";\nimport { isEnsName } from \"../evm/ens-resolver.js\";\nimport {\n parseAddress,\n parseBlock,\n parseRpcMethod,\n parseTopic,\n parseTransactionHash,\n resolveRpcParams,\n} from \"../evm/rpc-input.js\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { PublicNetwork } from \"../projects/project-types.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport { parseWalletAlias } from \"./wallet.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction parseSearch(value: string): string {\n const search = value.trim();\n if (search.length === 0 || search.length > 100) {\n throw new InvalidArgumentError(\n \"must be between 1 and 100 characters\",\n );\n }\n return search;\n}\n\nfunction formatNetworks(networks: PublicNetwork[]): string {\n return networks.length === 0\n ? \"No Networks found\"\n : networks\n .map(\n (network) =>\n `${network.id} ${network.name} ${network.chainId} ${network.nativeCurrency?.symbol ?? \"-\"}`,\n )\n .join(\"\\n\");\n}\n\nfunction parseArgument(\n value: string,\n parser: (input: string) => string,\n): string {\n try {\n return parser(value);\n } catch (error) {\n throw new InvalidArgumentError(\n error instanceof Error ? error.message : \"is invalid\",\n );\n }\n}\n\nfunction parseMethodArgument(value: string): string {\n return parseArgument(value, parseRpcMethod);\n}\n\nfunction parseAddressArgument(value: string): string {\n return parseArgument(value, parseAddress);\n}\n\nfunction parseAddressOrEnsArgument(value: string): string {\n return isEnsName(value)\n ? value\n : parseAddressArgument(value);\n}\n\nfunction parseHashArgument(value: string): string {\n return parseArgument(value, parseTransactionHash);\n}\n\nfunction parseBlockArgument(value: string): string {\n return parseArgument(value, parseBlock);\n}\n\nfunction parseTopics(values: string[] | undefined): string[] | undefined {\n return values === undefined\n ? undefined\n : values.map((value) => parseArgument(value, parseTopic));\n}\n\nfunction parseEtherOption(value: string): bigint {\n try {\n const wei = parseEther(value);\n if (wei < 0n) {\n throw new Error(\"negative\");\n }\n return wei;\n } catch {\n throw new InvalidArgumentError(\n \"must be a non-negative ether amount\",\n );\n }\n}\n\nfunction parseGweiOption(value: string): bigint {\n try {\n const wei = parseGwei(value);\n if (wei < 0n) {\n throw new Error(\"negative\");\n }\n return wei;\n } catch {\n throw new InvalidArgumentError(\n \"must be a non-negative gwei amount\",\n );\n }\n}\n\nfunction parseGasLimitOption(value: string): bigint {\n if (!/^[1-9]\\d*$/u.test(value)) {\n throw new InvalidArgumentError(\"must be a positive integer\");\n }\n return BigInt(value);\n}\n\nfunction parseNonceOption(value: string): number {\n if (!/^(?:0|[1-9]\\d*)$/u.test(value)) {\n throw new InvalidArgumentError(\"must be a non-negative integer\");\n }\n const nonce = Number(value);\n if (!Number.isSafeInteger(nonce)) {\n throw new InvalidArgumentError(\"must be a non-negative integer\");\n }\n return nonce;\n}\n\nfunction parseHexDataOption(value: string): Hex {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/u.test(value)) {\n throw new InvalidArgumentError(\"must be 0x-prefixed hex bytes\");\n }\n return value as Hex;\n}\n\nfunction parseJsonArgsOption(value: string): unknown[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw new InvalidArgumentError(\"must be a JSON array of arguments\");\n }\n if (!Array.isArray(parsed)) {\n throw new InvalidArgumentError(\"must be a JSON array of arguments\");\n }\n return parsed;\n}\n\nfunction formatResult(value: unknown): string {\n return typeof value === \"string\"\n ? value\n : JSON.stringify(value, null, 2);\n}\n\nexport function registerEvm(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n input: NodeJS.ReadableStream,\n): void {\n const evm = program\n .command(\"evm\")\n .description(\"Query EVM Networks and data\");\n\n evm\n .command(\"networks\")\n .description(\"List Networks for the active Project\")\n .option(\"--search <term>\", \"filter Networks\", parseSearch)\n .option(\"--refresh\", \"refresh cached Networks from ZAN\")\n .action(async (options: { search?: string; refresh?: boolean }) => {\n const { projectService, endpointResolver } =\n await getRuntimeContext();\n const projectId = await projectService.activeId();\n if (options.refresh === true) {\n await endpointResolver.refresh(projectId);\n }\n const networks = await endpointResolver.list(\n projectId,\n options.search,\n );\n outputWriter.success(\n { projectId, networks },\n formatNetworks(networks),\n );\n });\n\n evm\n .command(\"rpc\")\n .description(\n \"Call a JSON-RPC method allowed by ~/.zan-cli/config.yaml\",\n )\n .argument(\"<method>\", \"JSON-RPC method\", parseMethodArgument)\n .argument(\"[params...]\", \"strict JSON parameter values\")\n .option(\"--stdin\", \"read one JSON params array from stdin\")\n .action(\n async (\n method: string,\n positional: string[],\n options: { stdin?: boolean },\n ) => {\n const params = await resolveRpcParams({\n positional,\n useStdin: options.stdin === true,\n input,\n });\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.rpc(method, params);\n outputWriter.success(result, formatResult(result));\n },\n );\n\n const data = evm\n .command(\"data\")\n .description(\"Query EVM account data\");\n\n data\n .command(\"balance\")\n .description(\"Get a native token balance\")\n .argument(\n \"<address-or-ens>\",\n \"hexadecimal address or ENS name\",\n parseAddressOrEnsArgument,\n )\n .option(\n \"--block <block>\",\n \"block number, hex quantity, or tag\",\n parseBlockArgument,\n \"latest\",\n )\n .action(\n async (\n addressOrEns: string,\n options: { block: string },\n ) => {\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.balance(\n addressOrEns,\n options.block,\n );\n outputWriter.success(\n result,\n `${result.address} ${result.balance} ${result.symbol} ${result.network}`,\n );\n },\n );\n\n const tx = evm\n .command(\"tx\")\n .description(\"Get a transaction by hash\")\n .argument(\"<hash>\", \"transaction hash\", parseHashArgument)\n .action(async (hash: string) => {\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.transaction(hash);\n outputWriter.success(result, formatResult(result));\n });\n\n tx.command(\"sign\")\n .description(\n \"Sign a transaction locally and print the raw signed transaction\",\n )\n .requiredOption(\"--to <address>\", \"recipient address\", parseAddressArgument)\n .option(\"--value <ether>\", \"ether amount\", parseEtherOption, 0n)\n .option(\"--data <hex>\", \"call data\", parseHexDataOption, \"0x\" as Hex)\n .option(\"--nonce <n>\", \"explicit nonce\", parseNonceOption)\n .option(\"--gas-limit <n>\", \"explicit gas limit\", parseGasLimitOption)\n .option(\n \"--max-fee-per-gas <gwei>\",\n \"EIP-1559 max fee in gwei\",\n parseGweiOption,\n )\n .option(\n \"--max-priority-fee-per-gas <gwei>\",\n \"EIP-1559 priority fee in gwei\",\n parseGweiOption,\n )\n .option(\"--legacy\", \"sign a legacy gasPrice transaction\")\n .option(\n \"--account <alias>\",\n \"wallet alias to sign with\",\n parseWalletAlias,\n )\n .action(\n async (options: {\n to: string;\n value: bigint;\n data: Hex;\n nonce?: number;\n gasLimit?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n legacy?: boolean;\n account?: string;\n }) => {\n const { signingService } = await getRuntimeContext();\n const result = await signingService.signTransaction({\n to: options.to as `0x${string}`,\n valueWei: options.value,\n data: options.data,\n ...(options.nonce === undefined ? {} : { nonce: options.nonce }),\n ...(options.gasLimit === undefined\n ? {}\n : { gasLimit: options.gasLimit }),\n ...(options.maxFeePerGas === undefined\n ? {}\n : { maxFeePerGasWei: options.maxFeePerGas }),\n ...(options.maxPriorityFeePerGas === undefined\n ? {}\n : { maxPriorityFeePerGasWei: options.maxPriorityFeePerGas }),\n ...(options.legacy === true ? { legacy: true } : {}),\n ...(options.account === undefined\n ? {}\n : { account: options.account }),\n });\n outputWriter.success(result, result.rawTransaction);\n },\n );\n\n const contract = evm\n .command(\"contract\")\n .description(\"Contract call helpers\");\n\n contract\n .command(\"encode\")\n .description(\"Encode contract call data for a method signature\")\n .requiredOption(\n \"--method <signature>\",\n \"method signature, for example transfer(address,uint256)\",\n )\n .option(\n \"--args <json>\",\n \"JSON array of method arguments\",\n parseJsonArgsOption,\n [],\n )\n .action(\n async (options: { method: string; args: unknown[] }) => {\n const { signingService } = await getRuntimeContext();\n const data = signingService.encodeContractCall(\n options.method,\n options.args,\n );\n outputWriter.success(\n { method: options.method, data },\n data,\n );\n },\n );\n\n evm\n .command(\"receipt\")\n .description(\"Get a transaction receipt\")\n .argument(\"<hash>\", \"transaction hash\", parseHashArgument)\n .action(async (hash: string) => {\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.receipt(hash);\n outputWriter.success(result, formatResult(result));\n });\n\n evm\n .command(\"block\")\n .description(\"Get a block by number or tag\")\n .argument(\"<number-or-tag>\", \"block number or tag\", parseBlockArgument)\n .action(async (block: string) => {\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.block(block);\n outputWriter.success(result, formatResult(result));\n });\n\n evm\n .command(\"gas\")\n .description(\"Get current gas prices\")\n .action(async () => {\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.gas();\n outputWriter.success(result, formatResult(result));\n });\n\n evm\n .command(\"logs\")\n .description(\"Query event logs\")\n .requiredOption(\n \"--from-block <block>\",\n \"starting block\",\n parseBlockArgument,\n )\n .option(\n \"--to-block <block>\",\n \"ending block\",\n parseBlockArgument,\n \"latest\",\n )\n .option(\"--address <address>\", \"contract address\", parseAddressArgument)\n .option(\"--topic <topic...>\", \"event topic filters\")\n .action(\n async (options: {\n fromBlock: string;\n toBlock: string;\n address?: string;\n topic?: string[];\n }) => {\n const topics = parseTopics(options.topic);\n const filter: EvmLogFilter = {\n fromBlock: options.fromBlock,\n toBlock: options.toBlock,\n ...(options.address === undefined\n ? {}\n : { address: options.address }),\n ...(topics === undefined ? {} : { topics }),\n };\n const { evmQueryService } = await getRuntimeContext();\n const result = await evmQueryService.logs(filter);\n outputWriter.success(result, formatResult(result));\n },\n );\n}\n","import { keccak256 } from \"viem\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { ResolvedEndpoint } from \"../networks/endpoint-resolver.js\";\n\nconst UNIVERSAL_RESOLVER =\n \"0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe\";\nconst RESOLVE_SELECTOR = \"9061b923\";\nconst ADDR_SELECTOR = \"3b3b57de\";\n\nexport interface EnsEndpointResolver {\n resolve(\n projectId: string,\n networkId: string,\n ): Promise<ResolvedEndpoint>;\n}\n\nexport interface EnsRpcClient {\n call(\n endpoint: ResolvedEndpoint,\n method: string,\n params?: unknown[],\n ): Promise<unknown>;\n}\n\nexport interface EnsResolverOptions {\n endpointResolver: EnsEndpointResolver;\n rpc: EnsRpcClient;\n}\n\nfunction nameResolutionFailure(name: string): CliFailure {\n return new CliFailure(\n \"NAME_RESOLUTION_UNAVAILABLE\",\n `ENS name \"${name}\" could not be resolved.`,\n \"Use a hexadecimal address or enable ethereum-mainnet for this Project.\",\n );\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"hex\");\n}\n\nfunction padWord(value: string): string {\n return value.padStart(64, \"0\");\n}\n\nexport function namehash(name: string): Uint8Array {\n let node: Uint8Array = new Uint8Array(32);\n if (name.length === 0) {\n return node;\n }\n const labels = name.toLowerCase().split(\".\");\n for (let index = labels.length - 1; index >= 0; index -= 1) {\n const labelHash = keccak256(\n new TextEncoder().encode(labels[index]),\n \"bytes\",\n );\n const combined = new Uint8Array(64);\n combined.set(node);\n combined.set(labelHash, 32);\n node = keccak256(combined, \"bytes\");\n }\n return node;\n}\n\nexport function dnsEncode(name: string): Uint8Array {\n const bytes: number[] = [];\n for (const label of name.toLowerCase().split(\".\")) {\n const encoded = new TextEncoder().encode(label);\n if (encoded.length === 0 || encoded.length > 255) {\n throw nameResolutionFailure(name);\n }\n bytes.push(encoded.length, ...encoded);\n }\n bytes.push(0);\n return new Uint8Array(bytes);\n}\n\nfunction buildResolveCalldata(name: string): string {\n const encodedName = dnsEncode(name);\n const innerData = `${ADDR_SELECTOR}${bytesToHex(namehash(name))}`;\n const encodedNameHex = bytesToHex(encodedName);\n const namePaddedBytes = Math.ceil(encodedName.length / 32) * 32;\n const innerBytes = innerData.length / 2;\n const innerPaddedBytes = Math.ceil(innerBytes / 32) * 32;\n const nameOffset = 64;\n const dataOffset = nameOffset + 32 + namePaddedBytes;\n\n return [\n \"0x\",\n RESOLVE_SELECTOR,\n padWord(nameOffset.toString(16)),\n padWord(dataOffset.toString(16)),\n padWord(encodedName.length.toString(16)),\n encodedNameHex.padEnd(namePaddedBytes * 2, \"0\"),\n padWord(innerBytes.toString(16)),\n innerData.padEnd(innerPaddedBytes * 2, \"0\"),\n ].join(\"\");\n}\n\nfunction readSafeOffset(word: string): number | undefined {\n if (!/^[0-9a-f]{64}$/iu.test(word)) {\n return undefined;\n }\n const value = BigInt(`0x${word}`);\n return value <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(value)\n : undefined;\n}\n\nfunction decodeAddress(result: unknown): string | undefined {\n if (\n typeof result !== \"string\" ||\n !/^0x[0-9a-f]*$/iu.test(result) ||\n result.length % 2 !== 0\n ) {\n return undefined;\n }\n const raw = result.slice(2);\n const offsetBytes = readSafeOffset(raw.slice(0, 64));\n if (offsetBytes === undefined) {\n return undefined;\n }\n const offset = offsetBytes * 2;\n const lengthBytes = readSafeOffset(raw.slice(offset, offset + 64));\n if (lengthBytes === undefined || lengthBytes < 32) {\n return undefined;\n }\n const dataStart = offset + 64;\n const dataEnd = dataStart + lengthBytes * 2;\n if (dataEnd > raw.length) {\n return undefined;\n }\n const addressWord = raw.slice(dataStart, dataStart + 64);\n if (addressWord.length !== 64) {\n return undefined;\n }\n const address = `0x${addressWord.slice(24)}`.toLowerCase();\n return address === `0x${\"0\".repeat(40)}` ? undefined : address;\n}\n\nexport function isEnsName(value: string): boolean {\n return (\n value.length > 4 &&\n value.toLowerCase().endsWith(\".eth\") &&\n !value.startsWith(\"0x\")\n );\n}\n\nexport class EnsResolver {\n constructor(private readonly options: EnsResolverOptions) {}\n\n async resolve(projectId: string, name: string): Promise<string> {\n try {\n const endpoint = await this.options.endpointResolver.resolve(\n projectId,\n \"ethereum-mainnet\",\n );\n const result = await this.options.rpc.call(\n endpoint,\n \"eth_call\",\n [\n {\n to: UNIVERSAL_RESOLVER,\n data: buildResolveCalldata(name.toLowerCase()),\n },\n \"latest\",\n ],\n );\n const address = decodeAddress(result);\n if (address === undefined) {\n throw nameResolutionFailure(name);\n }\n return address;\n } catch {\n throw nameResolutionFailure(name);\n }\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nconst MAX_STDIN_BYTES = 1024 * 1024;\nconst BLOCK_TAGS = new Set([\n \"latest\",\n \"earliest\",\n \"pending\",\n \"safe\",\n \"finalized\",\n]);\n\nexport const RPC_METHOD_MAX_LENGTH = 128;\nexport const RPC_METHOD_PATTERN = /^[A-Za-z][A-Za-z0-9_.-]*$/u;\n\nfunction invalid(message: string): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", message);\n}\n\nexport function parseRpcMethod(value: string): string {\n if (\n value.length === 0 ||\n value.length > RPC_METHOD_MAX_LENGTH ||\n !RPC_METHOD_PATTERN.test(value)\n ) {\n throw invalid(\"RPC method is invalid.\");\n }\n return value;\n}\n\nexport function parseRpcParams(values: readonly string[]): unknown[] {\n return values.map((value, index) => {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n throw invalid(\n `RPC parameter ${String(index + 1)} must be valid JSON.`,\n );\n }\n });\n}\n\nexport async function parseRpcStdin(\n input: NodeJS.ReadableStream,\n): Promise<unknown[]> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of input) {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(String(chunk));\n size += buffer.byteLength;\n if (size > MAX_STDIN_BYTES) {\n throw invalid(\"RPC stdin must not exceed 1 MiB.\");\n }\n chunks.push(buffer);\n }\n\n const document = Buffer.concat(chunks).toString(\"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(document) as unknown;\n } catch {\n throw invalid(\"RPC stdin must contain one valid JSON array.\");\n }\n if (!Array.isArray(parsed)) {\n throw invalid(\"RPC stdin must contain one valid JSON array.\");\n }\n return parsed;\n}\n\nexport interface ResolveRpcParamsInput {\n positional: readonly string[];\n useStdin: boolean;\n input: NodeJS.ReadableStream;\n}\n\nexport async function resolveRpcParams(\n input: ResolveRpcParamsInput,\n): Promise<unknown[]> {\n if (input.useStdin && input.positional.length > 0) {\n throw invalid(\n \"RPC positional parameters cannot be combined with --stdin.\",\n );\n }\n return input.useStdin\n ? parseRpcStdin(input.input)\n : parseRpcParams(input.positional);\n}\n\nexport function parseBlock(value: string): string {\n if (BLOCK_TAGS.has(value)) {\n return value;\n }\n if (/^0x(?:0|[1-9a-f][0-9a-f]*)$/iu.test(value)) {\n return value;\n }\n if (/^(?:0|[1-9]\\d*)$/u.test(value)) {\n return `0x${BigInt(value).toString(16)}`;\n }\n throw invalid(\n \"Block must be a non-negative number, canonical hex quantity, or supported tag.\",\n );\n}\n\nfunction parseFixedHex(\n value: string,\n bytes: number,\n label: string,\n): string {\n const pattern = new RegExp(`^0x[0-9a-fA-F]{${String(bytes * 2)}}$`, \"u\");\n if (!pattern.test(value)) {\n throw invalid(`${label} is invalid.`);\n }\n return value;\n}\n\nexport function parseAddress(value: string): string {\n return parseFixedHex(value, 20, \"Address\");\n}\n\nexport function parseTransactionHash(value: string): string {\n return parseFixedHex(value, 32, \"Transaction hash\");\n}\n\nexport function parseTopic(value: string): string {\n return parseFixedHex(value, 32, \"Log topic\");\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport {\n readPrivateKeyFromStdin,\n type WalletKeyPrompt,\n} from \"../wallet/wallet-key-input.js\";\nimport type { WalletSummary } from \"../wallet/wallet-service.js\";\nimport { walletAliasSchema } from \"../wallet/wallet-types.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nexport function parseWalletAlias(value: string): string {\n if (!walletAliasSchema.safeParse(value).success) {\n throw new InvalidArgumentError(\"must be a valid wallet alias\");\n }\n return value;\n}\n\nfunction summaryJson(summary: WalletSummary): Record<string, unknown> {\n return {\n alias: summary.alias,\n address: summary.address,\n createdAt: summary.createdAt,\n active: summary.active,\n };\n}\n\nexport function registerWallet(\n settings: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n input: NodeJS.ReadableStream,\n walletKeyPrompt: WalletKeyPrompt,\n): void {\n const wallet = settings\n .command(\"wallet\")\n .description(\n \"Manage signing wallets; private keys stay in the system credential store\",\n );\n\n wallet\n .command(\"add\")\n .description(\"Store a private key under an alias without displaying it\")\n .argument(\"<alias>\", \"wallet alias\", parseWalletAlias)\n .option(\"--stdin\", \"read the private key from stdin\")\n .action(async (alias: string, options: { stdin?: boolean }) => {\n const key =\n options.stdin === true\n ? await readPrivateKeyFromStdin(input)\n : await walletKeyPrompt.read();\n const { walletService } = await getRuntimeContext();\n const summary = await walletService.add(alias, key);\n outputWriter.success(\n summaryJson(summary),\n `wallet ${summary.alias} added ${summary.address}${summary.active ? \" (active)\" : \"\"}`,\n );\n });\n\n wallet\n .command(\"list\")\n .description(\"List wallet aliases and addresses\")\n .action(async () => {\n const { walletService } = await getRuntimeContext();\n const wallets = await walletService.list();\n outputWriter.success(\n { wallets: wallets.map(summaryJson) },\n wallets.length === 0\n ? \"No wallets configured\"\n : wallets\n .map(\n (summary) =>\n `${summary.alias} ${summary.address}${summary.active ? \" (active)\" : \"\"}`,\n )\n .join(\"\\n\"),\n );\n });\n\n wallet\n .command(\"use\")\n .description(\"Select the active wallet alias\")\n .argument(\"<alias>\", \"wallet alias\", parseWalletAlias)\n .action(async (alias: string) => {\n const { walletService } = await getRuntimeContext();\n const summary = await walletService.use(alias);\n outputWriter.success(\n summaryJson(summary),\n `wallet: ${summary.alias} ${summary.address} (active)`,\n );\n });\n\n wallet\n .command(\"remove\")\n .description(\"Remove a wallet alias and its stored key\")\n .argument(\"<alias>\", \"wallet alias\", parseWalletAlias)\n .action(async (alias: string) => {\n const { walletService } = await getRuntimeContext();\n await walletService.remove(alias);\n outputWriter.success(\n { removed: alias },\n `wallet ${alias} removed`,\n );\n });\n}\n","import { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport {\n readHiddenInput,\n type RawModeInput,\n} from \"../security/hidden-input.js\";\n\nexport type PrivateKey = `0x${string}`;\n\nexport const privateKeySchema = z\n .string()\n .trim()\n .regex(/^(?:0x)?[0-9a-fA-F]{64}$/iu)\n .transform(\n (value): PrivateKey =>\n `0x${value.replace(/^0x/iu, \"\").toLowerCase()}`,\n );\n\nfunction invalidInput(): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", \"Private key input is invalid.\");\n}\n\n/** Validates without ever including the input in error output. */\nexport function parsePrivateKey(value: string): PrivateKey {\n const parsed = privateKeySchema.safeParse(value);\n if (!parsed.success) {\n throw invalidInput();\n }\n return parsed.data;\n}\n\nexport interface WalletKeyPrompt {\n read(): Promise<PrivateKey>;\n}\n\nexport async function readPrivateKeyFromStdin(\n input: NodeJS.ReadableStream,\n): Promise<PrivateKey> {\n let value = \"\";\n for await (const chunk of input) {\n value += String(chunk);\n if (value.length > 128) {\n throw invalidInput();\n }\n }\n const normalized = value.replace(/\\r\\n/gu, \"\\n\");\n const lines = normalized.endsWith(\"\\n\")\n ? normalized.slice(0, -1).split(\"\\n\")\n : normalized.split(\"\\n\");\n if (lines.length !== 1) {\n throw invalidInput();\n }\n return parsePrivateKey(lines[0] ?? \"\");\n}\n\nexport class TerminalWalletKeyPrompt implements WalletKeyPrompt {\n constructor(\n private readonly input: RawModeInput,\n private readonly write: (value: string) => void,\n private readonly signal: AbortSignal,\n ) {}\n\n async read(): Promise<PrivateKey> {\n const value = await readHiddenInput(\n this.input,\n this.write,\n this.signal,\n {\n prompt: \"Private key: \",\n maxLength: 66,\n requireMessage:\n \"Hidden private key input requires an interactive terminal.\",\n requireHint: \"Use: zan settings wallet add <alias> --stdin\",\n },\n );\n return parsePrivateKey(value);\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport type RawModeInput = NodeJS.ReadableStream & {\n isTTY?: boolean;\n isRaw?: boolean;\n setRawMode?(mode: boolean): void;\n};\n\nexport interface HiddenInputOptions {\n prompt: string;\n maxLength: number;\n requireMessage: string;\n requireHint: string;\n}\n\n/**\n * Reads one secret line from an interactive terminal with echo disabled.\n * The collected value is only returned through the promise; it is never\n * written to any output stream.\n */\nexport function readHiddenInput(\n input: RawModeInput,\n write: (value: string) => void,\n signal: AbortSignal,\n options: HiddenInputOptions,\n): Promise<string> {\n if (input.isTTY !== true || input.setRawMode === undefined) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n options.requireMessage,\n options.requireHint,\n );\n }\n return new Promise<string>((resolve, reject) => {\n let value = \"\";\n let overflow = false;\n const wasRaw = input.isRaw === true;\n const wasPaused = input.isPaused();\n const cleanup = () => {\n input.off(\"data\", onData);\n signal.removeEventListener(\"abort\", onAbort);\n input.setRawMode?.(wasRaw);\n if (wasPaused) {\n input.pause();\n }\n write(\"\\n\");\n };\n const finish = () => {\n cleanup();\n if (overflow) {\n reject(\n new CliFailure(\"INVALID_ARGS\", \"Hidden input is invalid.\"),\n );\n return;\n }\n resolve(value);\n };\n const onAbort = () => {\n cleanup();\n reject(new CliFailure(\"AUTH_DENIED\", \"Input was cancelled.\"));\n };\n const onData = (chunk: unknown) => {\n for (const character of String(chunk)) {\n if (character === \"\\u0003\") {\n onAbort();\n return;\n }\n if (character === \"\\r\" || character === \"\\n\") {\n finish();\n return;\n }\n if (character === \"\\u007f\" || character === \"\\b\") {\n value = value.slice(0, -1);\n continue;\n }\n if (character >= \" \") {\n if (value.length < options.maxLength) {\n value += character;\n } else {\n overflow = true;\n }\n }\n }\n };\n write(options.prompt);\n input.setRawMode?.(true);\n input.resume();\n input.on(\"data\", onData);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import { z } from \"zod\";\n\nexport const MAX_WALLETS = 64;\n\nexport const walletAliasSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/u);\n\nexport const walletAddressSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]{40}$/u);\n\nexport const walletEntrySchema = z\n .object({\n address: walletAddressSchema,\n createdAt: z.string().min(1).max(64),\n })\n .strict();\n\nexport const walletIndexSchema = z\n .object({\n wallets: z.record(walletAliasSchema, walletEntrySchema),\n })\n .strip();\n\nexport type WalletEntry = z.infer<typeof walletEntrySchema>;\nexport type WalletIndex = z.infer<typeof walletIndexSchema>;\n\nexport const EMPTY_WALLET_INDEX: WalletIndex = Object.freeze({\n wallets: {},\n});\n","import type { Command } from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { Readiness } from \"../readiness/readiness-service.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction configured(value: boolean): string {\n return value ? \"configured\" : \"not configured\";\n}\n\nfunction formatHuman(readiness: Readiness): string {\n const credentialState = readiness.credentials.available\n ? readiness.credentials.systemBacked\n ? \"available, system-backed\"\n : \"available, not system-backed\"\n : \"unavailable\";\n\n return [\n `CLI: ${readiness.version} (${readiness.platform})`,\n `Runtime auth: ${configured(readiness.runtime.authBaseUrlConfigured)}`,\n `Runtime API: ${configured(readiness.runtime.apiBaseUrlConfigured)}`,\n `Credentials: ${readiness.credentials.backend} (${credentialState})`,\n `Session: ${\n readiness.session.displayName ??\n readiness.session.subject ??\n readiness.session.profile ??\n \"not present\"\n }`,\n `Session expires at: ${readiness.session.expiresAt ?? \"not verified\"}`,\n `Project: ${configured(readiness.settings.projectConfigured)}`,\n `Network: ${configured(readiness.settings.networkConfigured)}`,\n `Ready: ${readiness.ready ? \"yes\" : \"no\"}`,\n ].join(\"\\n\");\n}\n\nexport function registerInspect(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n): void {\n program\n .command(\"inspect\")\n .description(\"Inspect local ZAN CLI readiness\")\n .action(async () => {\n const { readinessService } = await getRuntimeContext();\n const readiness = await readinessService.inspect();\n outputWriter.success(readiness, formatHuman(readiness));\n });\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport {\n parseInfoMethod,\n resolveInfoPayload,\n} from \"../hyperliquid/info-input.js\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction parseMethodArgument(value: string): string {\n try {\n return parseInfoMethod(value);\n } catch (error) {\n throw new InvalidArgumentError(\n error instanceof Error ? error.message : \"is invalid\",\n );\n }\n}\n\nfunction formatResult(value: unknown): string {\n return typeof value === \"string\"\n ? value\n : JSON.stringify(value, null, 2);\n}\n\nexport function registerHyperliquid(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n input: NodeJS.ReadableStream,\n): void {\n const hyperliquid = program\n .command(\"hyperliquid\")\n .description(\"Query Hyperliquid read-only APIs\");\n\n hyperliquid\n .command(\"info\")\n .description(\"Call an allowlisted Hyperliquid Info method\")\n .argument(\"<method>\", \"Hyperliquid Info method\", parseMethodArgument)\n .argument(\"[payload]\", \"one JSON object without the type field\")\n .option(\"--stdin\", \"read one JSON object payload from stdin\")\n .action(\n async (\n method: string,\n positional: string | undefined,\n options: { stdin?: boolean },\n ) => {\n const payload = await resolveInfoPayload({\n ...(positional === undefined ? {} : { positional }),\n useStdin: options.stdin === true,\n input,\n });\n const { hyperliquidInfoService } = await getRuntimeContext();\n const result = await hyperliquidInfoService.info(method, payload);\n outputWriter.success(result, formatResult(result));\n },\n );\n}\n","import { Buffer } from \"node:buffer\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport { parseRpcMethod } from \"../evm/rpc-input.js\";\n\nconst MAX_PAYLOAD_BYTES = 1024 * 1024;\n\nexport type HyperliquidInfoPayload = Record<string, unknown>;\n\nfunction invalidPayload(message = \"Hyperliquid Info payload is invalid.\") {\n return new CliFailure(\"INVALID_ARGS\", message);\n}\n\nexport function parseInfoMethod(value: string): string {\n return parseRpcMethod(value);\n}\n\nexport function parseInfoPayload(\n value?: string,\n): HyperliquidInfoPayload {\n if (value === undefined) {\n return {};\n }\n if (Buffer.byteLength(value, \"utf8\") > MAX_PAYLOAD_BYTES) {\n throw invalidPayload(\"Hyperliquid Info payload must not exceed 1 MiB.\");\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n throw invalidPayload();\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed) ||\n Object.prototype.hasOwnProperty.call(parsed, \"type\")\n ) {\n throw invalidPayload();\n }\n return parsed as HyperliquidInfoPayload;\n}\n\nexport async function parseInfoStdin(\n input: NodeJS.ReadableStream,\n): Promise<HyperliquidInfoPayload> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of input) {\n const buffer = Buffer.isBuffer(chunk)\n ? chunk\n : Buffer.from(String(chunk));\n size += buffer.byteLength;\n if (size > MAX_PAYLOAD_BYTES) {\n throw invalidPayload(\n \"Hyperliquid Info payload must not exceed 1 MiB.\",\n );\n }\n chunks.push(buffer);\n }\n return parseInfoPayload(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\nexport async function resolveInfoPayload(input: {\n positional?: string;\n useStdin: boolean;\n input: NodeJS.ReadableStream;\n}): Promise<HyperliquidInfoPayload> {\n if (input.useStdin && input.positional !== undefined) {\n throw invalidPayload(\n \"Hyperliquid Info positional payload cannot be combined with --stdin.\",\n );\n }\n return input.useStdin\n ? parseInfoStdin(input.input)\n : parseInfoPayload(input.positional);\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport { projectNameSchema, type Project } from \"../projects/project-types.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport { parseProjectOption } from \"./settings.js\";\nimport {\n readRpcKeyFromStdin,\n type RpcKeyPrompt,\n} from \"../projects/rpc-key-prompt.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction parseProjectName(value: string): string {\n const parsed = projectNameSchema.safeParse(value);\n if (!parsed.success) {\n throw new InvalidArgumentError(\n \"must be between 1 and 100 characters\",\n );\n }\n return parsed.data;\n}\n\nfunction formatProject(project: Project): string {\n return `${project.id} ${project.name} ${project.type}`;\n}\n\nfunction formatProjects(projects: Project[]): string {\n return projects.length === 0\n ? \"No Projects found\"\n : projects.map(formatProject).join(\"\\n\");\n}\n\nexport function registerProject(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n input: NodeJS.ReadableStream,\n rpcKeyPrompt: RpcKeyPrompt,\n): void {\n const project = program\n .command(\"project\")\n .description(\"Manage ZAN Projects\");\n\n project\n .command(\"list\")\n .description(\"List ZAN Projects\")\n .action(async () => {\n const { projectService } = await getRuntimeContext();\n const projects = await projectService.list();\n outputWriter.success({ projects }, formatProjects(projects));\n });\n\n project\n .command(\"get\")\n .description(\"Get a ZAN Project\")\n .argument(\"<id>\", \"Project ID\", parseProjectOption)\n .action(async (projectId: string) => {\n const { projectService } = await getRuntimeContext();\n const result = await projectService.get(projectId);\n outputWriter.success({ project: result }, formatProject(result));\n });\n\n project\n .command(\"create\")\n .description(\"Create a CHAIN_RPC Project\")\n .requiredOption(\"--name <name>\", \"Project name\", parseProjectName)\n .action(async (options: { name: string }) => {\n const { projectService } = await getRuntimeContext();\n const result = await projectService.create(options.name);\n outputWriter.success({ project: result }, formatProject(result));\n });\n\n project\n .command(\"use\")\n .description(\"Select the active ZAN Project\")\n .argument(\"<id>\", \"Project ID\", parseProjectOption)\n .action(async (projectId: string) => {\n const { projectService } = await getRuntimeContext();\n const result = await projectService.use(projectId);\n outputWriter.success(\n { project: result, active: true },\n `Active Project: ${result.name} (${result.id})`,\n );\n });\n\n project\n .command(\"active\")\n .description(\"Show the active ZAN Project\")\n .action(async () => {\n const { projectService } = await getRuntimeContext();\n const result = await projectService.active();\n outputWriter.success({ project: result }, formatProject(result));\n });\n\n const cache = project\n .command(\"cache\")\n .description(\"Manage the active Project Endpoint cache\");\n\n cache\n .command(\"status\")\n .description(\"Show encrypted Endpoint cache status\")\n .action(async () => {\n const { projectService, endpointResolver } = await getRuntimeContext();\n const projectId = await projectService.activeId();\n const status = await endpointResolver.status(projectId);\n outputWriter.success(\n { projectId, ...status },\n status.present\n ? `Endpoint cache: present (${status.fetchedAt ?? \"unknown\"})`\n : \"Endpoint cache: not present\",\n );\n });\n\n cache\n .command(\"clear\")\n .description(\"Clear the active Project Endpoint cache\")\n .action(async () => {\n const { projectService, endpointResolver } = await getRuntimeContext();\n const projectId = await projectService.activeId();\n await endpointResolver.clear(projectId);\n outputWriter.success(\n { projectId, cleared: true },\n \"Endpoint cache cleared\",\n );\n });\n\n const rpcKey = project\n .command(\"rpc-key\")\n .description(\"Manage a test RPC API Key override\");\n\n rpcKey\n .command(\"set\")\n .description(\"Set the active Project RPC API Key override\")\n .option(\"--stdin\", \"read the RPC API Key from stdin\")\n .action(async (options: { stdin?: boolean }) => {\n const { projectService, endpointResolver } = await getRuntimeContext();\n const projectId = await projectService.activeId();\n const key = options.stdin === true\n ? await readRpcKeyFromStdin(input)\n : await rpcKeyPrompt.read();\n await endpointResolver.setOverride(projectId, key);\n outputWriter.success(\n { projectId, configured: true },\n \"RPC API Key override configured\",\n );\n });\n\n rpcKey\n .command(\"status\")\n .description(\"Show RPC API Key override status\")\n .action(async () => {\n const { projectService, endpointResolver } = await getRuntimeContext();\n const projectId = await projectService.activeId();\n const configured = await endpointResolver.hasOverride(projectId);\n outputWriter.success(\n { projectId, configured },\n `RPC API Key override: ${configured ? \"configured\" : \"not configured\"}`,\n );\n });\n\n rpcKey\n .command(\"clear\")\n .description(\"Clear the active Project RPC API Key override\")\n .action(async () => {\n const { projectService, endpointResolver } = await getRuntimeContext();\n const projectId = await projectService.activeId();\n await endpointResolver.clearOverride(projectId);\n outputWriter.success(\n { projectId, cleared: true },\n \"RPC API Key override cleared\",\n );\n });\n\n rpcKey\n .command(\"pull\")\n .description(\"Write the active Project RPC API Key to .env\")\n .action(async () => {\n const { rpcKeyPullService } = await getRuntimeContext();\n const result = await rpcKeyPullService.pull();\n outputWriter.success(\n result,\n \"ZAN_API_KEY was written to .env\",\n );\n });\n}\n","import { z } from \"zod\";\nimport {\n networkIdSchema,\n projectIdSchema,\n} from \"../settings/schema.js\";\n\nfunction endpointSchema(protocol: \"https:\" | \"wss:\") {\n return z.string().url().refine((value) => {\n const url = new URL(value);\n return (\n url.protocol === protocol &&\n url.username.length === 0 &&\n url.password.length === 0\n );\n });\n}\n\nconst networkEndpointsSchema = z\n .object({\n https: endpointSchema(\"https:\"),\n wss: endpointSchema(\"wss:\").nullish(),\n })\n .strict()\n .transform(({ https, wss }) => ({\n https,\n ...(wss === null || wss === undefined ? {} : { wss }),\n }));\n\nexport const projectNameSchema = z.string().trim().min(1).max(100);\n\nexport const projectSchema = z\n .object({\n id: projectIdSchema,\n name: projectNameSchema,\n type: z.literal(\"CHAIN_RPC\"),\n createdAt: z.iso.datetime({ offset: true }),\n tokenHint: z.string().min(1).max(128),\n })\n .strict();\n\nexport const projectListResponseSchema = z\n .object({\n projects: z.array(projectSchema),\n })\n .strict();\n\nexport const projectResponseSchema = z\n .object({\n project: projectSchema,\n })\n .strict();\n\nexport const networkSchema = z\n .object({\n id: networkIdSchema,\n family: z.literal(\"evm\"),\n ecosystem: networkIdSchema,\n name: z.string().trim().min(1).max(100),\n network: networkIdSchema,\n chainId: z\n .string()\n .regex(/^0x(?:0|[1-9a-f][0-9a-f]*)$/iu),\n nativeCurrency: z\n .object({\n name: z.string().trim().min(1).max(100),\n symbol: z.string().trim().min(1).max(20),\n decimals: z.number().int().min(0).max(255),\n })\n .strict()\n .nullish()\n .transform((currency) => currency ?? undefined),\n endpoints: networkEndpointsSchema,\n })\n .strict();\n\nexport const networkListResponseSchema = z\n .object({\n networks: z.array(networkSchema),\n })\n .strict();\n\nexport type Project = z.infer<typeof projectSchema>;\nexport type Network = z.infer<typeof networkSchema>;\nexport type PublicNetwork = Omit<Network, \"endpoints\">;\n\nexport function toPublicNetwork(\n network: Network,\n): PublicNetwork {\n const { endpoints: _endpoints, ...publicNetwork } = network;\n return {\n ...publicNetwork,\n nativeCurrency: publicNetwork.nativeCurrency\n ? { ...publicNetwork.nativeCurrency }\n : undefined,\n };\n}\n","import { z } from \"zod\";\nimport { walletAliasSchema } from \"../wallet/wallet-types.js\";\n\nexport const projectIdSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9:_-]+$/u);\n\nexport const networkIdSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/u);\n\nexport const settingsSchema = z\n .object({\n project: projectIdSchema.optional(),\n network: networkIdSchema.optional(),\n wallet: walletAliasSchema.optional(),\n })\n .strip();\n\nexport type Settings = z.infer<typeof settingsSchema>;\nexport type SettingKey = keyof Settings;\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport {\n networkIdSchema,\n projectIdSchema,\n type SettingKey,\n type Settings,\n} from \"../settings/schema.js\";\nimport type { WalletKeyPrompt } from \"../wallet/wallet-key-input.js\";\nimport { registerWallet } from \"./wallet.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction parseSettingKey(value: string): SettingKey {\n if (value !== \"project\" && value !== \"network\") {\n throw new InvalidArgumentError(\"must be project or network\");\n }\n return value;\n}\n\nfunction parseProjectId(value: string): string {\n if (!projectIdSchema.safeParse(value).success) {\n throw new InvalidArgumentError(\"must be a valid project id\");\n }\n return value;\n}\n\nfunction parseNetworkId(value: string): string {\n if (!networkIdSchema.safeParse(value).success) {\n throw new InvalidArgumentError(\"must be a lower-kebab network id\");\n }\n return value;\n}\n\nexport function parseProjectOption(value: string): string {\n return parseProjectId(value);\n}\n\nexport function parseNetworkOption(value: string): string {\n return parseNetworkId(value);\n}\n\nfunction formatSettings(settings: Settings): string {\n return [\n `project: ${settings.project ?? \"not configured\"}`,\n `network: ${settings.network ?? \"not configured\"}`,\n `wallet: ${settings.wallet ?? \"not configured\"}`,\n ].join(\"\\n\");\n}\n\nexport function registerSettings(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n input: NodeJS.ReadableStream,\n walletKeyPrompt: WalletKeyPrompt,\n): void {\n const settings = program\n .command(\"settings\")\n .description(\"Manage local project and network settings\");\n\n registerWallet(\n settings,\n outputWriter,\n getRuntimeContext,\n input,\n walletKeyPrompt,\n );\n\n settings\n .command(\"get\")\n .description(\"Get a local setting\")\n .argument(\"<key>\", \"project or network\", parseSettingKey)\n .action(async (key: SettingKey) => {\n const { settingsStore } = await getRuntimeContext();\n const value = (await settingsStore.get(key)) ?? null;\n outputWriter.success(\n { key, value },\n `${key}: ${value ?? \"not configured\"}`,\n );\n });\n\n settings\n .command(\"show\")\n .description(\"Show local settings\")\n .action(async () => {\n const { settingsStore } = await getRuntimeContext();\n const current = await settingsStore.show();\n outputWriter.success(\n {\n project: current.project ?? null,\n network: current.network ?? null,\n wallet: current.wallet ?? null,\n },\n formatSettings(current),\n );\n });\n\n const set = settings\n .command(\"set\")\n .description(\"Set a local project or network\");\n\n set\n .command(\"project\")\n .description(\"Set the default project\")\n .argument(\"<id>\", \"project id\", parseProjectId)\n .action(async (id: string) => {\n const { settingsStore } = await getRuntimeContext();\n await settingsStore.set(\"project\", id);\n outputWriter.success({ key: \"project\", value: id }, `project: ${id}`);\n });\n\n set\n .command(\"network\")\n .description(\"Set the default network\")\n .argument(\"<network-id>\", \"network id\", parseNetworkId)\n .action(async (networkId: string) => {\n const { settingsStore } = await getRuntimeContext();\n await settingsStore.set(\"network\", networkId);\n outputWriter.success(\n { key: \"network\", value: networkId },\n `network: ${networkId}`,\n );\n });\n\n settings\n .command(\"clear\")\n .description(\"Clear one or all local settings\")\n .argument(\"[key]\", \"project or network\", parseSettingKey)\n .action(async (key?: SettingKey) => {\n const { settingsStore } = await getRuntimeContext();\n await settingsStore.clear(key);\n outputWriter.success(\n { cleared: key ?? \"all\" },\n key === undefined ? \"settings cleared\" : `${key} cleared`,\n );\n });\n}\n","import { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nexport const rpcApiKeySchema = z\n .string()\n .trim()\n .min(16)\n .max(512)\n .regex(/^[A-Za-z0-9._~-]+$/u);\n\nexport interface RpcKeyPrompt {\n read(): Promise<string>;\n}\n\ntype RawModeInput = NodeJS.ReadableStream & {\n isTTY?: boolean;\n isRaw?: boolean;\n setRawMode?(mode: boolean): void;\n};\n\nfunction invalidInput(): CliFailure {\n return new CliFailure(\n \"INVALID_ARGS\",\n \"RPC API Key input is invalid.\",\n );\n}\n\nexport async function readRpcKeyFromStdin(\n input: NodeJS.ReadableStream,\n): Promise<string> {\n let value = \"\";\n for await (const chunk of input) {\n value += String(chunk);\n if (value.length > 2048) {\n throw invalidInput();\n }\n }\n const normalized = value.replace(/\\r\\n/gu, \"\\n\");\n const lines = normalized.endsWith(\"\\n\")\n ? normalized.slice(0, -1).split(\"\\n\")\n : normalized.split(\"\\n\");\n if (lines.length !== 1) {\n throw invalidInput();\n }\n const parsed = rpcApiKeySchema.safeParse(lines[0]);\n if (!parsed.success) {\n throw invalidInput();\n }\n return parsed.data;\n}\n\nexport class TerminalRpcKeyPrompt implements RpcKeyPrompt {\n constructor(\n private readonly input: RawModeInput,\n private readonly write: (value: string) => void,\n private readonly signal: AbortSignal,\n ) {}\n\n read(): Promise<string> {\n if (this.input.isTTY !== true || this.input.setRawMode === undefined) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"Hidden RPC API Key input requires an interactive terminal.\",\n \"Use: zan project rpc-key set --stdin\",\n );\n }\n return new Promise<string>((resolve, reject) => {\n let value = \"\";\n let overflow = false;\n const wasRaw = this.input.isRaw === true;\n const wasPaused = this.input.isPaused();\n const cleanup = () => {\n this.input.off(\"data\", onData);\n this.signal.removeEventListener(\"abort\", onAbort);\n this.input.setRawMode?.(wasRaw);\n if (wasPaused) {\n this.input.pause();\n }\n this.write(\"\\n\");\n };\n const finish = () => {\n const parsed = rpcApiKeySchema.safeParse(value);\n cleanup();\n if (overflow || !parsed.success) {\n reject(invalidInput());\n return;\n }\n resolve(parsed.data);\n };\n const onAbort = () => {\n cleanup();\n reject(new CliFailure(\"AUTH_DENIED\", \"Input was cancelled.\"));\n };\n const onData = (chunk: unknown) => {\n for (const character of String(chunk)) {\n if (character === \"\\u0003\") {\n onAbort();\n return;\n }\n if (character === \"\\r\" || character === \"\\n\") {\n finish();\n return;\n }\n if (character === \"\\u007f\" || character === \"\\b\") {\n value = value.slice(0, -1);\n continue;\n }\n if (character >= \" \") {\n if (value.length < 512) {\n value += character;\n } else {\n overflow = true;\n }\n }\n }\n };\n this.write(\"RPC API Key: \");\n this.input.setRawMode?.(true);\n this.input.resume();\n this.input.on(\"data\", onData);\n this.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n}\n","import type { Command } from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { ProjectUsage } from \"../projects/usage-types.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\n\nfunction formatCredits(value: string): string {\n return BigInt(value).toLocaleString(\"en-US\");\n}\n\nfunction formatUsage(usage: ProjectUsage): string {\n const { project, keyUsage, plan } = usage;\n const lines = [\n `Project: ${project.name} (${project.id})`,\n `Key: ${project.tokenHint}`,\n `Key used (cumulative): ${formatCredits(keyUsage.usedCredits)} credits`,\n `Key limit: ${keyUsage.limitCredits === null ? \"Not set\" : `${formatCredits(keyUsage.limitCredits)} credits`}`,\n `Key remaining: ${keyUsage.remainingCredits === null ? \"Limited by shared plan balance\" : `${formatCredits(keyUsage.remainingCredits)} credits`}`,\n ];\n if (plan === null) {\n lines.push(\"Plan: No subscription\");\n } else {\n lines.push(\n \"\",\n `Plan: ${plan.name} (shared across account projects)`,\n `Plan used / total: ${formatCredits(plan.usedCredits)} / ${formatCredits(plan.totalCredits)} credits`,\n `Plan remaining: ${formatCredits(plan.remainingCredits)} credits`,\n `Expires: ${plan.expiresAt ?? \"Unknown\"}`,\n `Refreshes: ${plan.refreshAt ?? \"Unknown\"}`,\n `Status: ${plan.status ?? \"Unknown\"} / service ${plan.serviceStatus ?? \"Unknown\"}`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport function registerUsage(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: () => Promise<RuntimeContext>,\n): void {\n program.command(\"usage\")\n .description(\"Show the active Project's key usage and shared plan balance\")\n .action(async () => {\n const { projectService } = await getRuntimeContext();\n const usage = await projectService.usage();\n outputWriter.success(usage, formatUsage(usage));\n });\n}\n","import {\n InvalidArgumentError,\n type Command,\n} from \"commander\";\nimport type { Hex } from \"viem\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport type { RuntimeContext } from \"../runtime/context.js\";\nimport { parseWalletAlias } from \"./wallet.js\";\n\ntype RuntimeContextProvider = () => Promise<RuntimeContext>;\n\nfunction parseHexMessage(message: string): Hex {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/u.test(message)) {\n throw new InvalidArgumentError(\n \"with --hex the message must be 0x-prefixed hex bytes\",\n );\n }\n return message as Hex;\n}\n\nexport function registerSign(\n program: Command,\n outputWriter: OutputWriter,\n getRuntimeContext: RuntimeContextProvider,\n): void {\n program\n .command(\"sign\")\n .description(\"Sign a message with the selected wallet (EIP-191)\")\n .argument(\"<message>\", \"message to sign\")\n .option(\n \"--account <alias>\",\n \"wallet alias to sign with\",\n parseWalletAlias,\n )\n .option(\"--hex\", \"treat the message as 0x-prefixed hex bytes\")\n .action(\n async (\n message: string,\n options: { account?: string; hex?: boolean },\n ) => {\n const rawMessageHex =\n options.hex === true ? parseHexMessage(message) : undefined;\n const { signingService } = await getRuntimeContext();\n const result = await signingService.signMessage({\n ...(options.account === undefined\n ? {}\n : { account: options.account }),\n message,\n ...(rawMessageHex === undefined ? {} : { rawMessageHex }),\n });\n outputWriter.success(\n {\n account: result.account,\n address: result.address,\n signature: result.signature,\n },\n result.signature,\n );\n },\n );\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\n\ndeclare const __CLI_VERSION__: string | undefined;\nexport const CLI_VERSION = typeof __CLI_VERSION__ === \"string\" ? __CLI_VERSION__ : pkg.version;\n","import type { Command } from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nexport function registerVersion(program: Command, outputWriter: OutputWriter): void {\n program.command(\"version\").description(\"Display the ZAN CLI version\").action(() => {\n outputWriter.success({ version: CLI_VERSION }, CLI_VERSION);\n });\n}\n","import { Option, type Command } from \"commander\";\nimport type { OutputWriter } from \"../output/output-writer.js\";\nimport {\n installSkill, SKILL_AGENTS, type SkillAgent, type SkillInstallEnvironment,\n} from \"../skills/install.js\";\n\nexport function registerSkills(\n program: Command,\n outputWriter: OutputWriter,\n environment?: SkillInstallEnvironment,\n): void {\n program.command(\"skills\")\n .description(\"Manage bundled ZAN CLI agent skills\")\n .command(\"install\")\n .description(\"Install or update the bundled skill (current project by default)\")\n .addOption(new Option(\"-a, --agent <agent>\", \"target agent\").choices([...SKILL_AGENTS]).makeOptionMandatory())\n .option(\"-g, --global\", \"install for the current user instead of the current directory\")\n .option(\"--force\", \"replace the entire existing skill directory, discarding local changes\")\n .action(async (options: { agent: SkillAgent; global?: boolean; force?: boolean }) => {\n const result = await installSkill(options, environment);\n const invocation = result.agent === \"codex\" ? \"$zan-cli\" : \"/zan-cli\";\n outputWriter.success(result, [\n `Skill ${result.status}: ${result.destination}`,\n `Agent: ${result.agent}; scope: ${result.scope}; CLI version: ${result.version}`,\n `Use ${invocation} in your agent. Reload the agent if the skill does not appear.`,\n ].join(\"\\n\"));\n });\n}\n","import { createHash } from \"node:crypto\";\nimport {\n lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, writeFile,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nexport const SKILL_AGENTS = [\"codex\", \"claude-code\"] as const;\nexport type SkillAgent = (typeof SKILL_AGENTS)[number];\nconst AGENT_DIRECTORIES: Record<SkillAgent, string> = {\n codex: \".agents\",\n \"claude-code\": \".claude\",\n};\nconst SKILL_NAME = \"zan-cli\";\nconst INSTALL_RECORD = \".zan-cli-install.json\";\nconst recordSchema = z.object({\n schemaVersion: z.literal(1),\n package: z.literal(\"@zan_team/cli\"),\n version: z.string(),\n files: z.record(z.string(), z.string()),\n});\n\nexport interface SkillInstallEnvironment {\n cwd?: string;\n home?: string;\n sourceDirectory?: string;\n}\n\nexport interface SkillInstallResult {\n agent: SkillAgent;\n scope: \"project\" | \"global\";\n skill: string;\n version: string;\n destination: string;\n status: \"installed\" | \"updated\" | \"unchanged\" | \"linked\";\n}\n\nfunction hasCode(error: unknown, code: string): boolean {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function infoOrMissing(filename: string) {\n try {\n return await lstat(filename);\n } catch (error) {\n if (hasCode(error, \"ENOENT\")) return undefined;\n throw error;\n }\n}\n\n// Resolve relative to this module, never to the user's current working directory.\n// Source runs live under src/skills; the published bundle lives under dist.\nasync function bundledSkillDirectory(): Promise<string> {\n let directory = dirname(fileURLToPath(import.meta.url));\n while (true) {\n try {\n const pkg = JSON.parse(await readFile(join(directory, \"package.json\"), \"utf8\"));\n if (pkg.name === \"@zan_team/cli\") return join(directory, \"skills\", SKILL_NAME);\n } catch (error) {\n if (!hasCode(error, \"ENOENT\")) throw error;\n }\n const parent = dirname(directory);\n if (parent === directory) {\n throw new CliFailure(\"SETUP_REQUIRED\", \"Bundled ZAN CLI skill was not found.\", \"Reinstall @zan_team/cli.\");\n }\n directory = parent;\n }\n}\n\nasync function readSkillFiles(directory: string): Promise<Map<string, Buffer>> {\n const files = new Map<string, Buffer>();\n async function visit(relative: string): Promise<void> {\n for (const entry of await readdir(join(directory, relative), { withFileTypes: true })) {\n if (relative === \"\" && entry.name === INSTALL_RECORD) continue;\n const filename = relative ? `${relative}/${entry.name}` : entry.name;\n if (entry.isDirectory()) await visit(filename);\n else if (entry.isFile()) files.set(filename, await readFile(join(directory, filename)));\n else throw new CliFailure(\"SETUP_REQUIRED\", \"Skill contains a symlink or unsupported file.\", \"Keep skill resources as regular files and directories.\");\n }\n }\n await visit(\"\");\n return files;\n}\n\nfunction hashes(files: Map<string, Buffer>): Record<string, string> {\n return Object.fromEntries([...files].sort(([a], [b]) => a.localeCompare(b)).map(\n ([name, contents]) => [name, createHash(\"sha256\").update(contents).digest(\"hex\")],\n ));\n}\n\nfunction sameFiles(a: Record<string, string>, b: Record<string, string>): boolean {\n return Object.keys(a).length === Object.keys(b).length &&\n Object.entries(a).every(([name, hash]) => b[name] === hash);\n}\n\nasync function readInstallRecord(directory: string) {\n const filename = join(directory, INSTALL_RECORD);\n const info = await infoOrMissing(filename);\n if (!info?.isFile() || info.isSymbolicLink()) return undefined;\n try {\n const parsed = recordSchema.safeParse(JSON.parse(await readFile(filename, \"utf8\")));\n return parsed.success ? parsed.data : undefined;\n } catch (error) {\n if (error instanceof SyntaxError) return undefined;\n throw error;\n }\n}\n\nexport async function installSkill(\n options: { agent: SkillAgent; global?: boolean; force?: boolean },\n environment: SkillInstallEnvironment = {},\n): Promise<SkillInstallResult> {\n const root = options.global ? (environment.home ?? homedir()) : (environment.cwd ?? process.cwd());\n const destination = resolve(root, AGENT_DIRECTORIES[options.agent], \"skills\", SKILL_NAME);\n const result = {\n agent: options.agent,\n scope: options.global ? \"global\" as const : \"project\" as const,\n skill: SKILL_NAME,\n version: CLI_VERSION,\n destination,\n };\n try {\n const source = await realpath(environment.sourceDirectory ?? await bundledSkillDirectory());\n const sourceFiles = await readSkillFiles(source);\n if (!sourceFiles.has(\"SKILL.md\")) {\n throw new CliFailure(\"SETUP_REQUIRED\", \"Bundled SKILL.md is missing.\", \"Reinstall @zan_team/cli.\");\n }\n const sourceHashes = hashes(sourceFiles);\n const parent = dirname(destination);\n await mkdir(parent, { recursive: true });\n const lock = `${destination}.install-lock`;\n try {\n await mkdir(lock);\n } catch (error) {\n if (!hasCode(error, \"EEXIST\")) throw error;\n throw new CliFailure(\"SETUP_REQUIRED\", \"Another skill installation may be running.\", `Retry after it finishes. If no installer is running, remove ${lock}.`);\n }\n try {\n const existing = await infoOrMissing(destination);\n if (existing?.isSymbolicLink()) {\n // Preserve the repository's development link without writing through it.\n if (await realpath(destination).catch(() => undefined) === source) {\n return { ...result, status: \"linked\" };\n }\n throw new CliFailure(\"SETUP_REQUIRED\", \"The skill destination is a symlink.\", `Inspect and remove ${destination} manually before installing; --force does not follow symlinks.`);\n }\n if (existing && !existing.isDirectory()) {\n throw new CliFailure(\"SETUP_REQUIRED\", \"The skill destination is not a directory.\", `Inspect ${destination} before installing.`);\n }\n if (existing && !options.force) {\n const record = await readInstallRecord(destination);\n const currentHashes = hashes(await readSkillFiles(destination));\n if (!record || !sameFiles(currentHashes, record.files)) {\n throw new CliFailure(\"SETUP_REQUIRED\", \"The existing skill is unmanaged or has local changes.\", \"Back up your changes, then rerun with --force to replace the entire zan-cli skill directory.\");\n }\n if (record.version === CLI_VERSION && sameFiles(currentHashes, sourceHashes)) {\n return { ...result, status: \"unchanged\" };\n }\n }\n\n // Stage a complete copy before replacing the old directory, so removed\n // upstream resources do not survive an upgrade and copy failures are safe.\n const staging = await mkdtemp(join(parent, \".zan-cli-install-\"));\n const next = join(staging, \"next\");\n const backup = join(staging, \"previous\");\n let preserveBackup = false;\n try {\n await mkdir(next);\n for (const [name, contents] of sourceFiles) {\n await mkdir(dirname(join(next, name)), { recursive: true });\n await writeFile(join(next, name), contents);\n }\n await writeFile(join(next, INSTALL_RECORD), `${JSON.stringify({\n schemaVersion: 1, package: \"@zan_team/cli\", version: CLI_VERSION, files: sourceHashes,\n }, null, 2)}\\n`);\n if (existing) await rename(destination, backup);\n try {\n await rename(next, destination);\n } catch (error) {\n if (existing) {\n try { await rename(backup, destination); }\n catch {\n preserveBackup = true;\n throw new CliFailure(\"SETUP_REQUIRED\", \"Skill replacement failed; the previous installation is preserved.\", `Restore the directory from ${backup} to ${destination}.`);\n }\n }\n throw error;\n }\n } finally {\n if (!preserveBackup) await rm(staging, { recursive: true, force: true });\n }\n return { ...result, status: existing ? \"updated\" : \"installed\" };\n } finally {\n await rm(lock, { recursive: true, force: true });\n }\n } catch (error) {\n if (error instanceof CliFailure) throw error;\n throw new CliFailure(\"SETUP_REQUIRED\", \"Unable to install the ZAN CLI skill.\", `Check bundled skill files and permissions for ${destination}, then retry.`);\n }\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { PublicNetwork } from \"../projects/project-types.js\";\n\nexport interface NetworkPrompt {\n ask(networks: readonly PublicNetwork[]): Promise<string | undefined>;\n}\n\nexport interface ReadlineNetworkPromptOptions {\n input: NodeJS.ReadableStream;\n writeStderr(value: string): void;\n signal?: AbortSignal;\n}\n\nexport class ReadlineNetworkPrompt implements NetworkPrompt {\n constructor(\n private readonly options: ReadlineNetworkPromptOptions,\n ) {}\n\n async ask(\n networks: readonly PublicNetwork[],\n ): Promise<string | undefined> {\n this.options.writeStderr(\n [\n \"Select a ZAN Network:\",\n ...networks.map(\n (network, index) =>\n `${String(index + 1)}. ${network.name} (${network.id})`,\n ),\n \"Enter number: \",\n ].join(\"\\n\"),\n );\n const readline = createInterface({\n input: this.options.input,\n terminal: false,\n });\n try {\n return this.options.signal === undefined\n ? await readline.question(\"\")\n : await readline.question(\"\", {\n signal: this.options.signal,\n });\n } catch {\n return undefined;\n } finally {\n readline.close();\n }\n }\n}\n","import { createInterface } from \"node:readline/promises\";\nimport type { Project } from \"./project-types.js\";\n\nexport interface ProjectPrompt {\n ask(projects: readonly Project[]): Promise<string | undefined>;\n}\n\nexport interface ReadlineProjectPromptOptions {\n input: NodeJS.ReadableStream;\n writeStderr(value: string): void;\n signal?: AbortSignal;\n}\n\nexport class ReadlineProjectPrompt implements ProjectPrompt {\n constructor(\n private readonly options: ReadlineProjectPromptOptions,\n ) {}\n\n async ask(\n projects: readonly Project[],\n ): Promise<string | undefined> {\n this.options.writeStderr(\n [\n \"Select a ZAN Project:\",\n ...projects.map(\n (project, index) =>\n `${String(index + 1)}. ${project.name} (${project.id})`,\n ),\n \"Enter number: \",\n ].join(\"\\n\"),\n );\n const readline = createInterface({\n input: this.options.input,\n terminal: false,\n });\n try {\n return this.options.signal === undefined\n ? await readline.question(\"\")\n : await readline.question(\"\", {\n signal: this.options.signal,\n });\n } catch {\n return undefined;\n } finally {\n readline.close();\n }\n }\n}\n","import { homedir as readHomedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ZodType } from \"zod\";\nimport {\n SessionMetadataStore,\n sessionMetadataSchema,\n} from \"../auth/session-metadata-store.js\";\nimport {\n AuthService,\n type AuthStatus,\n type LoginInput,\n type LoginResult,\n type LogoutResult,\n} from \"../auth/auth-service.js\";\nimport { BrowserFlow } from \"../auth/browser-flow.js\";\nimport { BrowserOpener } from \"../auth/browser-opener.js\";\nimport { DeviceFlow } from \"../auth/device-flow.js\";\nimport { UserCredentialMutationLock } from \"../auth/credential-mutation-lock.js\";\nimport { OAuthClient } from \"../auth/oauth-client.js\";\nimport { SessionService } from \"../auth/session-service.js\";\nimport {\n CrossKeychainStore,\n type KeychainApi,\n} from \"../credentials/cross-keychain-store.js\";\nimport {\n KeychainSecretStore,\n type SecretStore,\n} from \"../credentials/keychain-secret-store.js\";\nimport type {\n CredentialStore,\n StoredCredential,\n} from \"../credentials/credential-store.js\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport {\n EvmQueryService,\n type EvmLogFilter,\n} from \"../evm/evm-query-service.js\";\nimport { EnsResolver } from \"../evm/ens-resolver.js\";\nimport { JsonRpcClient } from \"../evm/json-rpc-client.js\";\nimport { RpcAllowlistStore } from \"../evm/rpc-allowlist-store.js\";\nimport { RpcMethodPolicy } from \"../evm/rpc-method-policy.js\";\nimport { HyperliquidInfoClient } from \"../hyperliquid/info-client.js\";\nimport type { HyperliquidInfoPayload } from \"../hyperliquid/info-input.js\";\nimport { HyperliquidInfoMethodPolicy } from \"../hyperliquid/info-method-policy.js\";\nimport { HyperliquidInfoService } from \"../hyperliquid/info-service.js\";\nimport { HttpTransport } from \"../http/transport.js\";\nimport {\n EndpointResolver,\n type ResolvedEndpoint,\n} from \"../networks/endpoint-resolver.js\";\nimport type { NetworkPrompt } from \"../networks/network-prompt.js\";\nimport { NetworkSelector } from \"../networks/network-selector.js\";\nimport { DotenvApiKeyWriter } from \"../projects/dotenv-api-key-writer.js\";\nimport { EndpointCacheCrypto } from \"../projects/endpoint-cache-crypto.js\";\nimport {\n EndpointCacheStore,\n type EndpointCacheStatus,\n} from \"../projects/endpoint-cache-store.js\";\nimport { ProjectEndpointCache } from \"../projects/project-endpoint-cache.js\";\nimport type { RpcKeyPrompt } from \"../projects/rpc-key-prompt.js\";\nimport {\n RpcKeyPullService,\n type RpcKeyPullResult,\n} from \"../projects/rpc-key-pull-service.js\";\nimport type { ProjectPrompt } from \"../projects/project-prompt.js\";\nimport { ProjectService } from \"../projects/project-service.js\";\nimport { ProjectSelector } from \"../projects/project-selector.js\";\nimport type {\n Project,\n Network,\n PublicNetwork,\n} from \"../projects/project-types.js\";\nimport { ZanCliApiClient } from \"../projects/zan-cli-api-client.js\";\nimport type { ProjectUsage } from \"../projects/usage-types.js\";\nimport {\n ReadinessService,\n type Readiness,\n} from \"../readiness/readiness-service.js\";\nimport { SettingsStore } from \"../settings/settings-store.js\";\nimport {\n createZanPaths,\n resolveZanHome,\n type HomedirSource,\n} from \"../settings/paths.js\";\nimport {\n networkIdSchema,\n projectIdSchema,\n settingsSchema,\n type SettingKey,\n type Settings,\n} from \"../settings/schema.js\";\nimport { AtomicJsonStore } from \"../storage/atomic-json.js\";\nimport { CLI_VERSION } from \"../version.js\";\nimport { WalletService, type WalletSummary } from \"../wallet/wallet-service.js\";\nimport type { PrivateKey } from \"../wallet/wallet-key-input.js\";\nimport {\n SigningService,\n type SignMessageInput,\n type SignMessageResult,\n type SignTransactionInput,\n type SignTransactionResult,\n} from \"../wallet/signing-service.js\";\nimport { walletIndexSchema } from \"../wallet/wallet-types.js\";\nimport {\n loadRuntimeConfig,\n resolveCliEnvironment,\n type RuntimeEnvironment,\n} from \"./config.js\";\n\nexport interface SettingsService {\n get(key: SettingKey): Promise<string | undefined>;\n show(): Promise<Settings>;\n set(key: SettingKey, value: string): Promise<void>;\n clear(key?: SettingKey): Promise<void>;\n}\n\nexport interface ReadinessInspector {\n inspect(): Promise<Readiness>;\n}\n\nexport interface AuthServiceContract {\n login(input: LoginInput): Promise<LoginResult>;\n status(): Promise<AuthStatus>;\n verify(): Promise<AuthStatus>;\n logout(): Promise<LogoutResult>;\n}\n\nexport interface ProjectServiceContract {\n list(): Promise<Project[]>;\n get(projectId: string): Promise<Project>;\n create(name: string): Promise<Project>;\n use(projectId: string): Promise<Project>;\n active(): Promise<Project>;\n usage(): Promise<ProjectUsage>;\n activeId(): Promise<string>;\n}\n\nexport interface EndpointResolverContract {\n list(\n projectId: string,\n search?: string,\n ): Promise<PublicNetwork[]>;\n resolve(\n projectId: string,\n networkId: string,\n ): Promise<ResolvedEndpoint>;\n refresh(projectId: string): Promise<Network[]>;\n status(projectId: string): Promise<EndpointCacheStatus>;\n clear(projectId: string): Promise<void>;\n hasOverride(projectId: string): Promise<boolean>;\n setOverride(projectId: string, key: string): Promise<void>;\n clearOverride(projectId: string): Promise<void>;\n effectiveApiKey(projectId: string): Promise<string>;\n}\n\nexport interface RpcKeyPullServiceContract {\n pull(): Promise<RpcKeyPullResult>;\n}\n\nexport interface EvmQueryServiceContract {\n rpc(method: string, params: unknown[]): Promise<unknown>;\n balance(input: string, block: string): Promise<{\n address: string;\n input: string;\n balance: string;\n raw: string;\n symbol: string;\n projectId: string;\n network: string;\n block: string;\n }>;\n transaction(hash: string): Promise<Record<string, unknown>>;\n receipt(hash: string): Promise<Record<string, unknown>>;\n block(block: string): Promise<Record<string, unknown>>;\n gas(): Promise<Record<string, unknown>>;\n logs(filter: EvmLogFilter): Promise<{\n projectId: string;\n network: string;\n count: number;\n filter: EvmLogFilter;\n logs: unknown[];\n }>;\n}\n\nexport interface HyperliquidInfoServiceContract {\n info(\n method: string,\n payload: HyperliquidInfoPayload,\n ): Promise<unknown>;\n}\n\nexport interface WalletServiceContract {\n add(alias: string, key: PrivateKey): Promise<WalletSummary>;\n list(): Promise<WalletSummary[]>;\n use(alias: string): Promise<WalletSummary>;\n remove(alias: string): Promise<void>;\n}\n\nexport interface SigningServiceContract {\n signMessage(input: SignMessageInput): Promise<SignMessageResult>;\n signTransaction(\n input: SignTransactionInput,\n ): Promise<SignTransactionResult>;\n encodeContractCall(signature: string, args: readonly unknown[]): string;\n}\n\nexport interface RuntimeContext {\n settingsStore: SettingsService;\n readinessService: ReadinessInspector;\n authService: AuthServiceContract;\n projectService: ProjectServiceContract;\n endpointResolver: EndpointResolverContract;\n rpcKeyPullService: RpcKeyPullServiceContract;\n evmQueryService: EvmQueryServiceContract;\n hyperliquidInfoService: HyperliquidInfoServiceContract;\n walletService: WalletServiceContract;\n signingService: SigningServiceContract;\n}\n\nexport interface RuntimeContextInput {\n project?: string;\n network?: string;\n requestTimeoutMs?: number;\n signal: AbortSignal;\n env?: RuntimeEnvironment;\n platform?: NodeJS.Platform;\n homedir?: HomedirSource;\n credentialStore?: CredentialStore;\n secretStore?: SecretStore;\n interactive?: boolean;\n isTTY?: boolean;\n projectPrompt?: ProjectPrompt;\n networkPrompt?: NetworkPrompt;\n rpcKeyPrompt?: RpcKeyPrompt;\n}\n\nexport type RuntimeContextFactory = (\n input: RuntimeContextInput,\n) => RuntimeContext | Promise<RuntimeContext>;\n\nclass LazyCrossKeychainStore implements CredentialStore {\n private store: Promise<CredentialStore> | undefined;\n\n private load(): Promise<CredentialStore> {\n this.store ??= import(\"cross-keychain\").then((keychain) => {\n const api: KeychainApi = {\n getKeyring: async () => {\n const backend = await keychain.getKeyring();\n return { id: backend.id, name: backend.name };\n },\n getPassword: keychain.getPassword,\n setPassword: keychain.setPassword,\n deletePassword: keychain.deletePassword,\n };\n return new CrossKeychainStore(api);\n });\n return this.store;\n }\n\n async probe() {\n return (await this.load()).probe();\n }\n\n async read(profile: string) {\n return (await this.load()).read(profile);\n }\n\n async write(\n profile: string,\n credential: StoredCredential,\n ): Promise<void> {\n await (await this.load()).write(profile, credential);\n }\n\n async delete(profile: string): Promise<void> {\n await (await this.load()).delete(profile);\n }\n}\n\nclass LazyKeychainSecretStore implements SecretStore {\n private store: Promise<SecretStore> | undefined;\n\n private load(): Promise<SecretStore> {\n this.store ??= import(\"cross-keychain\").then((keychain) =>\n new KeychainSecretStore({\n getKeyring: async () => {\n const backend = await keychain.getKeyring();\n return { id: backend.id, name: backend.name };\n },\n getPassword: keychain.getPassword,\n setPassword: keychain.setPassword,\n deletePassword: keychain.deletePassword,\n }),\n );\n return this.store;\n }\n\n async probe() {\n return (await this.load()).probe();\n }\n\n async read(account: string) {\n return (await this.load()).read(account);\n }\n\n async write(account: string, secret: string): Promise<void> {\n await (await this.load()).write(account, secret);\n }\n\n async delete(account: string): Promise<void> {\n await (await this.load()).delete(account);\n }\n}\n\nfunction validateEnvironmentSelection(\n name: string,\n value: string | undefined,\n schema: ZodType<string>,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!schema.safeParse(value).success) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n `${name} is invalid.`,\n \"Check the ZAN CLI environment configuration.\",\n );\n }\n return value;\n}\n\nfunction requireServiceUrl(\n url: URL | undefined,\n name: string,\n): URL {\n if (url === undefined) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n `${name} is required for online commands.`,\n `Set ${name}.`,\n );\n }\n return url;\n}\n\nexport function createRuntimeContext(\n input: RuntimeContextInput,\n): RuntimeContext {\n const env = { ...(input.env ?? process.env) };\n const platform = input.platform ?? process.platform;\n const osHomeSource = input.homedir ?? readHomedir;\n const home = resolveZanHome(env, platform, osHomeSource);\n const environment = resolveCliEnvironment(env.ZAN_ENV);\n const credentialProfile =\n environment === \"prod\" ? \"default\" : environment;\n const paths = createZanPaths(home, platform, environment);\n const settingsStore = new SettingsStore(\n new AtomicJsonStore(settingsSchema, paths.settingsFile, { platform }),\n );\n const credentialStore =\n input.credentialStore ?? new LazyCrossKeychainStore();\n const secretStore = input.secretStore ?? new LazyKeychainSecretStore();\n const sessionMetadataStore = new SessionMetadataStore(\n new AtomicJsonStore(sessionMetadataSchema, paths.sessionFile, {\n platform,\n }),\n );\n let runtimeConfig: ReturnType<typeof loadRuntimeConfig> | undefined;\n const getRuntimeConfig = () => {\n runtimeConfig ??= loadRuntimeConfig(env, input.requestTimeoutMs);\n return runtimeConfig;\n };\n let apiTransport: HttpTransport | undefined;\n const getApiTransport = (): HttpTransport => {\n if (apiTransport !== undefined) {\n return apiTransport;\n }\n const config = getRuntimeConfig();\n const apiBaseUrl = requireServiceUrl(\n config.apiBaseUrl,\n \"ZAN_API_BASE_URL\",\n );\n apiTransport = new HttpTransport({\n baseUrl: apiBaseUrl,\n requestTimeoutMs: config.requestTimeoutMs,\n version: CLI_VERSION,\n platform,\n });\n return apiTransport;\n };\n let oauthClient: OAuthClient | undefined;\n const getOAuthClient = async (): Promise<OAuthClient> => {\n if (oauthClient !== undefined) {\n return oauthClient;\n }\n const runtimeConfig = getRuntimeConfig();\n const authBaseUrl = requireServiceUrl(\n runtimeConfig.authBaseUrl,\n \"ZAN_AUTH_BASE_URL\",\n );\n oauthClient = new OAuthClient({\n authBaseUrl,\n authTransport: new HttpTransport({\n baseUrl: authBaseUrl,\n requestTimeoutMs: runtimeConfig.requestTimeoutMs,\n version: CLI_VERSION,\n platform,\n }),\n apiTransport: getApiTransport(),\n clientId: runtimeConfig.oauthClientId,\n scopes: runtimeConfig.scopes,\n signal: input.signal,\n });\n return oauthClient;\n };\n const sessionService = new SessionService({\n credentialStore,\n metadataStore: sessionMetadataStore,\n oauth: {\n refresh: async (refreshToken) =>\n (await getOAuthClient()).refresh(refreshToken),\n },\n mutationLock: new UserCredentialMutationLock({\n home: () =>\n typeof osHomeSource === \"function\"\n ? osHomeSource()\n : osHomeSource,\n profile: credentialProfile,\n platform,\n maxAttempts: 1_600,\n }),\n profile: credentialProfile,\n });\n let clearEndpointEnvironment = async (): Promise<void> => {};\n const browserOpener = new BrowserOpener(platform);\n const authService = new AuthService({\n credentialStore,\n metadataStore: sessionMetadataStore,\n oauth: {\n revoke: async (refreshToken) =>\n (await getOAuthClient()).revoke(refreshToken),\n verifySession: async (accessToken) =>\n (await getOAuthClient()).verifySession(accessToken),\n },\n session: sessionService,\n profile: credentialProfile,\n localCache: {\n clearEnvironment: () => clearEndpointEnvironment(),\n },\n runBrowserFlow: async (loginInput) => {\n const oauth = await getOAuthClient();\n return new BrowserFlow({\n oauth,\n onAuthorizationUrl:\n loginInput.onAuthorizationUrl ?? (() => {}),\n openBrowser: (url) => browserOpener.open(url),\n }).run({\n interactive: loginInput.interactive ?? true,\n signal: input.signal,\n });\n },\n runDeviceFlow: async (loginInput) => {\n const oauth = await getOAuthClient();\n return new DeviceFlow({\n oauth,\n onPrompt: loginInput.onDevicePrompt ?? (() => {}),\n }).run(input.signal);\n },\n });\n let zanCliApiClient: ZanCliApiClient | undefined;\n const getZanCliApiClient = (): ZanCliApiClient => {\n zanCliApiClient ??= new ZanCliApiClient({\n transport: getApiTransport(),\n session: sessionService,\n signal: input.signal,\n });\n return zanCliApiClient;\n };\n let projectEndpointCache: ProjectEndpointCache | undefined;\n const getProjectEndpointCache = (): ProjectEndpointCache => {\n projectEndpointCache ??= new ProjectEndpointCache({\n environment,\n catalog: {\n listNetworks: (projectId) =>\n getZanCliApiClient().listNetworks(projectId),\n },\n store: new EndpointCacheStore({\n cacheDirectory: paths.cacheDirectory,\n environment,\n platform,\n }),\n crypto: new EndpointCacheCrypto(),\n secretStore,\n });\n return projectEndpointCache;\n };\n clearEndpointEnvironment = async () => {\n await getProjectEndpointCache().clearEnvironment(\n await settingsStore.get(\"project\"),\n );\n };\n let projectService: ProjectService | undefined;\n const getProjectService = (): ProjectService => {\n if (projectService !== undefined) {\n return projectService;\n }\n const client = getZanCliApiClient();\n const prompt =\n input.projectPrompt ??\n ({\n ask: async () => undefined,\n } satisfies ProjectPrompt);\n const selector = new ProjectSelector({\n listProjects: () => client.listProjects(),\n setProject: (projectId) =>\n settingsStore.set(\"project\", projectId),\n prompt,\n });\n const environmentProject = validateEnvironmentSelection(\n \"ZAN_PROJECT\",\n env.ZAN_PROJECT,\n projectIdSchema,\n );\n projectService = new ProjectService({\n client,\n settings: settingsStore,\n selector,\n selection: {\n ...(input.project === undefined\n ? {}\n : { cli: input.project }),\n ...(environmentProject === undefined\n ? {}\n : { env: environmentProject }),\n interactive: input.interactive ?? false,\n isTTY: input.isTTY ?? false,\n },\n networkCache: getProjectEndpointCache(),\n });\n return projectService;\n };\n let endpointResolver: EndpointResolver | undefined;\n const getEndpointResolver = (): EndpointResolver => {\n endpointResolver ??= new EndpointResolver(getProjectEndpointCache());\n return endpointResolver;\n };\n let rpcKeyPullService: RpcKeyPullService | undefined;\n const getRpcKeyPullService = (): RpcKeyPullService => {\n rpcKeyPullService ??= new RpcKeyPullService({\n projects: {\n activeId: () => getProjectService().activeId(),\n },\n keys: {\n effectiveApiKey: (projectId) =>\n getEndpointResolver().effectiveApiKey(projectId),\n },\n writer: new DotenvApiKeyWriter({\n directory: process.cwd(),\n platform,\n }),\n });\n return rpcKeyPullService;\n };\n let jsonRpcClient: JsonRpcClient | undefined;\n const getJsonRpcClient = (): JsonRpcClient => {\n jsonRpcClient ??= new JsonRpcClient({\n requestTimeoutMs: getRuntimeConfig().requestTimeoutMs,\n signal: input.signal,\n });\n return jsonRpcClient;\n };\n let networkSelector: NetworkSelector | undefined;\n const getNetworkSelector = (): NetworkSelector => {\n const prompt =\n input.networkPrompt ??\n ({\n ask: async () => undefined,\n } satisfies NetworkPrompt);\n networkSelector ??= new NetworkSelector({\n listNetworks: (projectId) =>\n getEndpointResolver().list(projectId),\n setNetwork: (networkId) =>\n settingsStore.set(\"network\", networkId),\n prompt,\n });\n return networkSelector;\n };\n const resolveSelectedNetwork = async (\n projectId: string,\n ): Promise<PublicNetwork> => {\n const stored = await settingsStore.get(\"network\");\n const environmentNetwork = validateEnvironmentSelection(\n \"ZAN_NETWORK\",\n env.ZAN_NETWORK,\n networkIdSchema,\n );\n return getNetworkSelector().resolve(projectId, {\n ...(input.network === undefined ? {} : { cli: input.network }),\n ...(environmentNetwork === undefined\n ? {}\n : { env: environmentNetwork }),\n ...(stored === undefined ? {} : { stored }),\n interactive: input.interactive ?? false,\n isTTY: input.isTTY ?? false,\n });\n };\n let allowlistStore: RpcAllowlistStore | undefined;\n const getAllowlistStore = (): RpcAllowlistStore => {\n allowlistStore ??= new RpcAllowlistStore({\n home: () =>\n typeof osHomeSource === \"function\"\n ? osHomeSource()\n : osHomeSource,\n platform,\n });\n return allowlistStore;\n };\n let rpcMethodPolicy: RpcMethodPolicy | undefined;\n const getRpcMethodPolicy = (): RpcMethodPolicy => {\n rpcMethodPolicy ??= new RpcMethodPolicy(getAllowlistStore());\n return rpcMethodPolicy;\n };\n let evmQueryService: EvmQueryService | undefined;\n const getEvmQueryService = (): EvmQueryService => {\n if (evmQueryService !== undefined) {\n return evmQueryService;\n }\n const rpc = getJsonRpcClient();\n const endpoint = getEndpointResolver();\n const ens = new EnsResolver({\n endpointResolver: endpoint,\n rpc,\n });\n evmQueryService = new EvmQueryService({\n projectService: {\n activeId: () => getProjectService().activeId(),\n },\n networkSelector: {\n resolve: resolveSelectedNetwork,\n },\n endpointResolver: endpoint,\n rpc,\n ens,\n rpcMethodPolicy: {\n requireAllowed: (method) =>\n getRpcMethodPolicy().requireAllowed(method),\n },\n });\n return evmQueryService;\n };\n let hyperliquidInfoMethodPolicy:\n | HyperliquidInfoMethodPolicy\n | undefined;\n const getHyperliquidInfoMethodPolicy = () => {\n hyperliquidInfoMethodPolicy ??= new HyperliquidInfoMethodPolicy(\n getAllowlistStore(),\n );\n return hyperliquidInfoMethodPolicy;\n };\n let hyperliquidInfoClient: HyperliquidInfoClient | undefined;\n const getHyperliquidInfoClient = () => {\n hyperliquidInfoClient ??= new HyperliquidInfoClient({\n requestTimeoutMs: getRuntimeConfig().requestTimeoutMs,\n signal: input.signal,\n });\n return hyperliquidInfoClient;\n };\n let hyperliquidInfoService: HyperliquidInfoService | undefined;\n const getHyperliquidInfoService = () => {\n hyperliquidInfoService ??= new HyperliquidInfoService({\n projectService: {\n activeId: () => getProjectService().activeId(),\n },\n networkSelector: { resolve: resolveSelectedNetwork },\n endpointResolver: getEndpointResolver(),\n client: getHyperliquidInfoClient(),\n policy: getHyperliquidInfoMethodPolicy(),\n });\n return hyperliquidInfoService;\n };\n let walletService: WalletService | undefined;\n const getWalletService = (): WalletService => {\n walletService ??= new WalletService({\n index: new AtomicJsonStore(\n walletIndexSchema,\n join(home, \"wallets.json\"),\n { platform },\n ),\n secrets: secretStore,\n activeWallet: {\n get: () => settingsStore.get(\"wallet\"),\n set: (alias) => settingsStore.set(\"wallet\", alias),\n clear: () => settingsStore.clear(\"wallet\"),\n },\n });\n return walletService;\n };\n let signingService: SigningService | undefined;\n const getSigningService = (): SigningService => {\n signingService ??= new SigningService({\n wallet: getWalletService(),\n evm: {\n pendingTransactionCount: (address) =>\n getEvmQueryService().pendingTransactionCount(address),\n estimateGas: (call) =>\n getEvmQueryService().estimateGas(call),\n feeEstimate: () => getEvmQueryService().feeEstimate(),\n selectedNetwork: () =>\n getEvmQueryService().selectedNetwork(),\n },\n });\n return signingService;\n };\n let readinessService: ReadinessService | undefined;\n const readinessInspector: ReadinessInspector = {\n inspect: async () => {\n readinessService ??= new ReadinessService({\n version: CLI_VERSION,\n platform,\n runtimeConfig: getRuntimeConfig(),\n credentialProbe: credentialStore,\n sessionStore: sessionMetadataStore,\n settingsStore,\n selection: {\n project: {\n cli: input.project,\n env: validateEnvironmentSelection(\n \"ZAN_PROJECT\",\n env.ZAN_PROJECT,\n projectIdSchema,\n ),\n },\n network: {\n cli: input.network,\n env: validateEnvironmentSelection(\n \"ZAN_NETWORK\",\n env.ZAN_NETWORK,\n networkIdSchema,\n ),\n },\n },\n });\n return readinessService.inspect();\n },\n };\n\n return {\n settingsStore,\n readinessService: readinessInspector,\n authService,\n projectService: {\n list: () => getProjectService().list(),\n get: (projectId) => getProjectService().get(projectId),\n create: (name) => getProjectService().create(name),\n use: (projectId) => getProjectService().use(projectId),\n active: () => getProjectService().active(),\n usage: () => getProjectService().usage(),\n activeId: () => getProjectService().activeId(),\n },\n endpointResolver: {\n list: (projectId, search) =>\n getEndpointResolver().list(projectId, search),\n resolve: (projectId, networkId) =>\n getEndpointResolver().resolve(projectId, networkId),\n refresh: (projectId) =>\n getEndpointResolver().refresh(projectId),\n status: (projectId) =>\n getEndpointResolver().status(projectId),\n clear: (projectId) =>\n getEndpointResolver().clear(projectId),\n hasOverride: (projectId) =>\n getEndpointResolver().hasOverride(projectId),\n setOverride: (projectId, key) =>\n getEndpointResolver().setOverride(projectId, key),\n clearOverride: (projectId) =>\n getEndpointResolver().clearOverride(projectId),\n effectiveApiKey: (projectId) =>\n getEndpointResolver().effectiveApiKey(projectId),\n },\n rpcKeyPullService: {\n pull: () => getRpcKeyPullService().pull(),\n },\n evmQueryService: {\n rpc: (method, params) =>\n getEvmQueryService().rpc(method, params),\n balance: (address, block) =>\n getEvmQueryService().balance(address, block),\n transaction: (hash) =>\n getEvmQueryService().transaction(hash),\n receipt: (hash) => getEvmQueryService().receipt(hash),\n block: (block) => getEvmQueryService().block(block),\n gas: () => getEvmQueryService().gas(),\n logs: (filter) => getEvmQueryService().logs(filter),\n },\n hyperliquidInfoService: {\n info: (method, payload) =>\n getHyperliquidInfoService().info(method, payload),\n },\n walletService: {\n add: (alias, key) => getWalletService().add(alias, key),\n list: () => getWalletService().list(),\n use: (alias) => getWalletService().use(alias),\n remove: (alias) => getWalletService().remove(alias),\n },\n signingService: {\n signMessage: (input) => getSigningService().signMessage(input),\n signTransaction: (input) =>\n getSigningService().signTransaction(input),\n encodeContractCall: (sig, args) =>\n getSigningService().encodeContractCall(sig, args),\n },\n };\n}\n","import { z } from \"zod\";\nimport type { AtomicJsonStore } from \"../storage/atomic-json.js\";\n\nconst storedSessionMetadataSchema = z\n .object({\n profile: z.string().min(1).max(128),\n subject: z.string().min(1).max(256).optional(),\n displayName: z.string().min(1).max(256).optional(),\n email: z.string().trim().min(1).max(320).optional(),\n // Accepted only to migrate metadata written by older CLI versions.\n organizationId: z.string().min(1).max(128).optional(),\n scopes: z.array(z.string().min(1)).max(64),\n expiresAt: z.string().datetime().optional(),\n authenticatedAt: z.string().datetime(),\n lastVerifiedAt: z.string().datetime().optional(),\n credentialBackend: z.string().min(1).max(128),\n })\n .strict();\n\nexport const sessionMetadataSchema = storedSessionMetadataSchema.transform(\n (stored) => {\n const { organizationId: legacyOrganizationId, ...metadata } = stored;\n void legacyOrganizationId;\n return metadata;\n },\n);\n\nexport type SessionMetadata = z.output<typeof sessionMetadataSchema>;\n\nexport class SessionMetadataStore {\n constructor(\n private readonly store: AtomicJsonStore<SessionMetadata>,\n ) {}\n\n async read(): Promise<SessionMetadata | null> {\n return this.store.read();\n }\n\n async write(metadata: SessionMetadata): Promise<void> {\n await this.store.write(metadata);\n }\n\n async clear(): Promise<void> {\n await this.store.delete();\n }\n}\n","import type {\n CredentialStore,\n CredentialStoreStatus,\n} from \"../credentials/credential-store.js\";\nimport type { DeviceLoginPrompt } from \"./device-flow.js\";\nimport type {\n SessionMetadata,\n} from \"./session-metadata-store.js\";\nimport type {\n RevokeResult,\n SessionInfo,\n TokenSet,\n} from \"./oauth-types.js\";\n\ninterface MetadataStore {\n read(): Promise<SessionMetadata | null>;\n write(metadata: SessionMetadata): Promise<void>;\n clear(): Promise<void>;\n}\n\ninterface AuthOAuthClient {\n revoke(refreshToken: string): Promise<RevokeResult>;\n verifySession(accessToken: string): Promise<SessionInfo>;\n}\n\ninterface AuthSession {\n commitLogin<T>(\n tokenSet: TokenSet,\n verifyAndCommit: (accessToken: string) => Promise<T>,\n ): Promise<T>;\n verifyCurrent<T>(\n verifyAndCommit: (accessToken: string) => Promise<T>,\n ): Promise<T>;\n logout(\n revoke: (refreshToken: string) => Promise<RevokeResult>,\n ): Promise<RevokeResult>;\n}\n\ninterface AuthLocalCache {\n clearEnvironment(): Promise<void>;\n}\n\nexport interface LoginInput {\n useDeviceFlow: boolean;\n force?: boolean;\n interactive?: boolean;\n onAuthorizationUrl?(url: string): void | Promise<void>;\n onDevicePrompt?(\n prompt: DeviceLoginPrompt,\n ): void | Promise<void>;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n profile?: string;\n subject?: string;\n displayName?: string;\n email?: string;\n scopes: string[];\n expiresAt?: string;\n authenticatedAt?: string;\n lastVerifiedAt?: string;\n credentials: CredentialStoreStatus;\n}\n\nexport interface LoginResult {\n authenticated: true;\n alreadyAuthenticated: boolean;\n profile: string;\n scopes: string[];\n authenticatedAt: string;\n}\n\nexport interface LogoutResult {\n serverRevoked: boolean;\n localCleared: true;\n}\n\nexport interface AuthServiceOptions {\n credentialStore: CredentialStore;\n metadataStore: MetadataStore;\n oauth: AuthOAuthClient;\n session: AuthSession;\n profile: string;\n runBrowserFlow(input: LoginInput): Promise<TokenSet>;\n runDeviceFlow(input: LoginInput): Promise<TokenSet>;\n localCache?: AuthLocalCache;\n now?: () => number;\n}\n\nexport class AuthService {\n private readonly credentialStore: CredentialStore;\n private readonly metadataStore: MetadataStore;\n private readonly oauth: AuthOAuthClient;\n private readonly session: AuthSession;\n private readonly profile: string;\n private readonly runBrowserFlow: (\n input: LoginInput,\n ) => Promise<TokenSet>;\n private readonly runDeviceFlow: (\n input: LoginInput,\n ) => Promise<TokenSet>;\n private readonly localCache: AuthLocalCache;\n private readonly now: () => number;\n\n constructor(options: AuthServiceOptions) {\n this.credentialStore = options.credentialStore;\n this.metadataStore = options.metadataStore;\n this.oauth = options.oauth;\n this.session = options.session;\n this.profile = options.profile;\n this.runBrowserFlow = options.runBrowserFlow;\n this.runDeviceFlow = options.runDeviceFlow;\n this.localCache = options.localCache ?? {\n clearEnvironment: async () => {},\n };\n this.now = options.now ?? Date.now;\n }\n\n async login(input: LoginInput): Promise<LoginResult> {\n const existing = await this.metadataStore.read();\n if (existing !== null && input.force !== true) {\n const credential = await this.credentialStore.read(\n existing.profile,\n );\n if (credential !== null) {\n return {\n authenticated: true,\n alreadyAuthenticated: true,\n profile: existing.profile,\n scopes: [...existing.scopes],\n authenticatedAt: existing.authenticatedAt,\n };\n }\n }\n if (input.force === true) {\n await this.logout();\n }\n\n const tokenSet = await (\n input.useDeviceFlow\n ? this.runDeviceFlow(input)\n : this.runBrowserFlow(input)\n );\n return this.session.commitLogin(tokenSet, async (accessToken) => {\n const verified = await this.oauth.verifySession(accessToken);\n const credentialStatus = await this.credentialStore.probe();\n const authenticatedAt = new Date(this.now()).toISOString();\n const metadata: SessionMetadata = {\n profile: this.profile,\n subject: verified.subject,\n displayName: verified.displayName,\n ...(verified.email === undefined ? {} : { email: verified.email }),\n scopes: [...verified.scopes],\n expiresAt: verified.expiresAt,\n authenticatedAt,\n lastVerifiedAt: authenticatedAt,\n credentialBackend: credentialStatus.backend,\n };\n await this.metadataStore.write(metadata);\n return {\n authenticated: true,\n alreadyAuthenticated: false,\n profile: this.profile,\n scopes: [...verified.scopes],\n authenticatedAt,\n } satisfies LoginResult;\n });\n }\n\n async status(): Promise<AuthStatus> {\n const [metadata, credentials] = await Promise.all([\n this.metadataStore.read(),\n this.credentialStore.probe(),\n ]);\n if (metadata === null) {\n return {\n authenticated: false,\n scopes: [],\n credentials,\n };\n }\n return {\n authenticated: true,\n profile: metadata.profile,\n ...(metadata.subject === undefined\n ? {}\n : { subject: metadata.subject }),\n ...(metadata.displayName === undefined\n ? {}\n : { displayName: metadata.displayName }),\n ...(metadata.email === undefined ? {} : { email: metadata.email }),\n scopes: [...metadata.scopes],\n ...(metadata.expiresAt === undefined\n ? {}\n : { expiresAt: metadata.expiresAt }),\n authenticatedAt: metadata.authenticatedAt,\n ...(metadata.lastVerifiedAt === undefined\n ? {}\n : { lastVerifiedAt: metadata.lastVerifiedAt }),\n credentials,\n };\n }\n\n async verify(): Promise<AuthStatus> {\n await this.session.verifyCurrent(async (accessToken) => {\n const verified = await this.oauth.verifySession(accessToken);\n const current = await this.metadataStore.read();\n const credentials = await this.credentialStore.probe();\n const metadata: SessionMetadata = {\n profile: current?.profile ?? this.profile,\n subject: verified.subject,\n displayName: verified.displayName,\n ...(verified.email === undefined ? {} : { email: verified.email }),\n scopes: [...verified.scopes],\n expiresAt: verified.expiresAt,\n authenticatedAt:\n current?.authenticatedAt ?? new Date(this.now()).toISOString(),\n lastVerifiedAt: new Date(this.now()).toISOString(),\n credentialBackend: credentials.backend,\n };\n await this.metadataStore.write(metadata);\n });\n return this.status();\n }\n\n async logout(): Promise<LogoutResult> {\n const cleanup = await Promise.allSettled([\n this.session.logout((refreshToken) =>\n this.oauth.revoke(refreshToken),\n ),\n this.localCache.clearEnvironment(),\n ]);\n const failure = cleanup.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n if (failure !== undefined) {\n throw failure.reason;\n }\n const sessionResult = cleanup[0];\n if (sessionResult.status === \"rejected\") {\n throw sessionResult.reason;\n }\n return {\n serverRevoked: sessionResult.value.serverRevoked,\n localCleared: true,\n };\n }\n}\n","import {\n createServer,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nconst SUCCESS_HTML =\n \"<!doctype html><html><body>Authorization complete. You can close this window.</body></html>\";\nconst FAILURE_HTML =\n \"<!doctype html><html><body>Authorization failed. Return to the CLI.</body></html>\";\n\nexport interface OAuthCallbackResult {\n code: string;\n state: string;\n}\n\nexport interface OAuthCallbackServer {\n redirectUri: string;\n waitForCallback(): Promise<OAuthCallbackResult>;\n close(): Promise<void>;\n}\n\nexport interface OAuthCallbackServerOptions {\n expectedState: string;\n signal: AbortSignal;\n timeoutMs: number;\n path?: string;\n}\n\nfunction listen(server: Server): Promise<number> {\n return new Promise((resolve, reject) => {\n const onError = (): void => {\n reject(\n new CliFailure(\n \"NETWORK_ERROR\",\n \"The local authorization callback could not start.\",\n ),\n );\n };\n server.once(\"error\", onError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n reject(\n new CliFailure(\n \"NETWORK_ERROR\",\n \"The local authorization callback could not start.\",\n ),\n );\n return;\n }\n resolve(address.port);\n });\n });\n}\n\nexport async function startOAuthCallbackServer(\n options: OAuthCallbackServerOptions,\n): Promise<OAuthCallbackServer> {\n const callbackPath = options.path ?? \"/oauth/callback\";\n let settled = false;\n let resolveResult!: (value: OAuthCallbackResult) => void;\n let rejectResult!: (reason: CliFailure) => void;\n const result = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n void result.catch(() => {});\n let closePromise: Promise<void> | undefined;\n let settledResponseFinished: Promise<void> | undefined;\n\n const server = createServer((request, response) => {\n if (settled) {\n response.writeHead(409, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(FAILURE_HTML);\n return;\n }\n\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== callbackPath) {\n fail(\n new CliFailure(\n \"AUTH_DENIED\",\n \"The authorization callback path was invalid.\",\n ),\n 404,\n response,\n );\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (code === null || code.length === 0) {\n fail(\n new CliFailure(\n \"AUTH_DENIED\",\n \"The authorization callback did not include a code.\",\n ),\n 400,\n response,\n );\n return;\n }\n if (state !== options.expectedState) {\n fail(\n new CliFailure(\n \"AUTH_DENIED\",\n \"The authorization callback state did not match.\",\n ),\n 400,\n response,\n );\n return;\n }\n\n settled = true;\n cleanup();\n response.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n const closing = close();\n endSettledResponse(response, SUCCESS_HTML);\n resolveResult({ code, state });\n void closing;\n });\n\n function endSettledResponse(\n response: ServerResponse,\n body: string,\n ): void {\n settledResponseFinished = new Promise((resolve) => {\n let finished = false;\n const finish = (): void => {\n if (finished) {\n return;\n }\n finished = true;\n response.off(\"finish\", finish);\n response.off(\"close\", finish);\n server.closeAllConnections();\n resolve();\n };\n response.once(\"finish\", finish);\n response.once(\"close\", finish);\n response.end(body);\n });\n }\n\n function cleanup(): void {\n clearTimeout(timeout);\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n\n function close(): Promise<void> {\n closePromise ??= new Promise((resolve, reject) => {\n if (!server.listening) {\n resolve();\n return;\n }\n server.close((error) => {\n if (error === undefined) {\n resolve();\n } else {\n reject(\n new CliFailure(\n \"NETWORK_ERROR\",\n \"The local authorization callback could not close.\",\n ),\n );\n }\n });\n });\n return closePromise;\n }\n\n function fail(\n failure: CliFailure,\n status: number,\n response?: ServerResponse,\n ): void {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (response !== undefined) {\n response.writeHead(status, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n const closing = close();\n endSettledResponse(response, FAILURE_HTML);\n void closing;\n } else {\n const closing = close();\n server.closeAllConnections();\n void closing;\n }\n rejectResult(failure);\n }\n\n function onAbort(): void {\n fail(\n new CliFailure(\"AUTH_DENIED\", \"Authorization was cancelled.\"),\n 400,\n );\n }\n\n const timeout = setTimeout(() => {\n fail(\n new CliFailure(\n \"AUTH_EXPIRED\",\n \"The authorization callback timed out.\",\n \"Run: zan auth login\",\n ),\n 408,\n );\n }, options.timeoutMs);\n timeout.unref();\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n try {\n const port = await listen(server);\n if (options.signal.aborted) {\n onAbort();\n }\n return {\n redirectUri: `http://127.0.0.1:${port}${callbackPath}`,\n waitForCallback: () => result,\n close: async () => {\n if (!settled) {\n settled = true;\n cleanup();\n rejectResult(\n new CliFailure(\n \"AUTH_DENIED\",\n \"Authorization was cancelled.\",\n ),\n );\n }\n const closing = close();\n if (settledResponseFinished === undefined) {\n server.closeAllConnections();\n } else {\n await settledResponseFinished;\n }\n await closing;\n },\n };\n } catch (error) {\n cleanup();\n await close().catch(() => {});\n throw error;\n }\n}\n","import { createHash, randomBytes } from \"node:crypto\";\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n}\n\nexport function createPkcePair(): PkcePair {\n const verifier = randomBytes(32).toString(\"base64url\");\n return {\n verifier,\n challenge: createHash(\"sha256\")\n .update(verifier)\n .digest(\"base64url\"),\n };\n}\n\nexport function createOAuthState(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport {\n startOAuthCallbackServer,\n type OAuthCallbackServer,\n type OAuthCallbackServerOptions,\n} from \"./callback-server.js\";\nimport type {\n AuthorizeInput,\n ExchangeCodeInput,\n TokenSet,\n} from \"./oauth-types.js\";\nimport { createOAuthState, createPkcePair } from \"./pkce.js\";\n\nexport interface BrowserFlowOAuthClient {\n authorizeUrl(input: AuthorizeInput): URL;\n exchangeCode(input: ExchangeCodeInput): Promise<TokenSet>;\n}\n\nexport interface BrowserFlowOptions {\n oauth: BrowserFlowOAuthClient;\n onAuthorizationUrl(url: string): void | Promise<void>;\n openBrowser?(url: string): Promise<void>;\n startCallbackServer?: (\n options: OAuthCallbackServerOptions,\n ) => Promise<OAuthCallbackServer>;\n callbackTimeoutMs?: number;\n}\n\nexport interface BrowserFlowRunOptions {\n interactive: boolean;\n signal: AbortSignal;\n}\n\nexport class BrowserFlow {\n private readonly oauth: BrowserFlowOAuthClient;\n private readonly onAuthorizationUrl: BrowserFlowOptions[\"onAuthorizationUrl\"];\n private readonly openBrowser: BrowserFlowOptions[\"openBrowser\"];\n private readonly startCallbackServer: NonNullable<\n BrowserFlowOptions[\"startCallbackServer\"]\n >;\n private readonly callbackTimeoutMs: number;\n\n constructor(options: BrowserFlowOptions) {\n this.oauth = options.oauth;\n this.onAuthorizationUrl = options.onAuthorizationUrl;\n this.openBrowser = options.openBrowser;\n this.startCallbackServer =\n options.startCallbackServer ?? startOAuthCallbackServer;\n this.callbackTimeoutMs = options.callbackTimeoutMs ?? 300_000;\n }\n\n async run(options: BrowserFlowRunOptions): Promise<TokenSet> {\n const state = createOAuthState();\n const pkce = createPkcePair();\n const callback = await this.startCallbackServer({\n expectedState: state,\n signal: options.signal,\n timeoutMs: this.callbackTimeoutMs,\n });\n\n try {\n const authorizationUrl = this.oauth.authorizeUrl({\n redirectUri: callback.redirectUri,\n state,\n codeChallenge: pkce.challenge,\n });\n const serializedUrl = authorizationUrl.toString();\n await this.onAuthorizationUrl(serializedUrl);\n if (options.interactive && this.openBrowser !== undefined) {\n await this.openBrowser(serializedUrl).catch(() => {});\n }\n\n const result = await callback.waitForCallback();\n if (result.state !== state) {\n throw new CliFailure(\n \"AUTH_DENIED\",\n \"The authorization callback state did not match.\",\n );\n }\n return await this.oauth.exchangeCode({\n code: result.code,\n codeVerifier: pkce.verifier,\n redirectUri: callback.redirectUri,\n });\n } finally {\n await callback.close();\n }\n }\n}\n","import { execFile as nodeExecFile } from \"node:child_process\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nexport type ExecFile = (\n file: string,\n args: readonly string[],\n callback: (error: Error | null) => void,\n) => void;\n\nexport class BrowserOpener {\n constructor(\n private readonly platform: NodeJS.Platform = process.platform,\n private readonly execFile: ExecFile = nodeExecFile,\n ) {}\n\n open(url: string): Promise<void> {\n const [file, args] =\n this.platform === \"darwin\"\n ? [\"open\", [url]]\n : this.platform === \"win32\"\n ? [\"rundll32\", [\"url.dll,FileProtocolHandler\", url]]\n : [\"xdg-open\", [url]];\n\n return new Promise((resolve, reject) => {\n this.execFile(file, args, (error) => {\n if (error === null) {\n resolve();\n } else {\n reject(\n new CliFailure(\n \"INTERNAL_ERROR\",\n \"The browser could not be opened automatically.\",\n ),\n );\n }\n });\n });\n }\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type {\n DeviceAuthorization,\n DeviceTokenPollResult,\n TokenSet,\n} from \"./oauth-types.js\";\n\nexport interface DeviceFlowOAuthClient {\n startDeviceAuthorization(): Promise<DeviceAuthorization>;\n pollDeviceToken(deviceCode: string): Promise<DeviceTokenPollResult>;\n}\n\nexport interface DeviceLoginPrompt {\n verificationUri: string;\n verificationUriComplete?: string;\n userCode: string;\n expiresAt: string;\n}\n\nexport interface DeviceFlowOptions {\n oauth: DeviceFlowOAuthClient;\n onPrompt(prompt: DeviceLoginPrompt): void | Promise<void>;\n now?: () => number;\n sleep?: (\n milliseconds: number,\n signal: AbortSignal,\n ) => Promise<void>;\n maxNetworkRetries?: number;\n}\n\nexport class DeviceFlow {\n private readonly oauth: DeviceFlowOAuthClient;\n private readonly onPrompt: DeviceFlowOptions[\"onPrompt\"];\n private readonly now: () => number;\n private readonly sleep: NonNullable<DeviceFlowOptions[\"sleep\"]>;\n private readonly maxNetworkRetries: number;\n\n constructor(options: DeviceFlowOptions) {\n this.oauth = options.oauth;\n this.onPrompt = options.onPrompt;\n this.now = options.now ?? Date.now;\n this.sleep =\n options.sleep ??\n (async (milliseconds, signal) => {\n await delay(milliseconds, undefined, { signal });\n });\n this.maxNetworkRetries = options.maxNetworkRetries ?? 3;\n }\n\n async run(signal: AbortSignal): Promise<TokenSet> {\n const authorization = await this.oauth.startDeviceAuthorization();\n const expiresAtMs =\n this.now() + authorization.expiresInSeconds * 1_000;\n await this.onPrompt({\n verificationUri: authorization.verificationUri,\n ...(authorization.verificationUriComplete === undefined\n ? {}\n : {\n verificationUriComplete:\n authorization.verificationUriComplete,\n }),\n userCode: authorization.userCode,\n expiresAt: new Date(expiresAtMs).toISOString(),\n });\n\n let intervalMs = authorization.intervalSeconds * 1_000;\n let nextDelayMs = intervalMs;\n let networkFailures = 0;\n\n while (this.now() < expiresAtMs) {\n signal.throwIfAborted();\n await this.sleep(nextDelayMs, signal);\n if (this.now() >= expiresAtMs) {\n break;\n }\n\n let result: DeviceTokenPollResult;\n try {\n result = await this.oauth.pollDeviceToken(\n authorization.deviceCode,\n );\n networkFailures = 0;\n } catch (error) {\n if (\n !(error instanceof CliFailure) ||\n error.code !== \"NETWORK_ERROR\"\n ) {\n throw error;\n }\n networkFailures += 1;\n if (networkFailures > this.maxNetworkRetries) {\n throw error;\n }\n nextDelayMs = Math.min(\n intervalMs * 2 ** networkFailures,\n 30_000,\n );\n continue;\n }\n\n switch (result.status) {\n case \"success\":\n return result.tokenSet;\n case \"pending\":\n nextDelayMs = intervalMs;\n break;\n case \"slow_down\":\n intervalMs += 5_000;\n nextDelayMs = intervalMs;\n break;\n case \"denied\":\n throw new CliFailure(\n \"AUTH_DENIED\",\n \"Authorization was denied.\",\n \"Run: zan auth login\",\n );\n case \"expired\":\n throw new CliFailure(\n \"AUTH_EXPIRED\",\n \"The device authorization expired.\",\n \"Run: zan auth login\",\n );\n }\n }\n\n throw new CliFailure(\n \"AUTH_EXPIRED\",\n \"The device authorization expired.\",\n \"Run: zan auth login\",\n );\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport {\n chmod,\n lstat,\n mkdir,\n} from \"node:fs/promises\";\nimport {\n isAbsolute,\n join,\n parse,\n resolve,\n} from \"node:path\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport { FileLock } from \"../storage/file-lock.js\";\n\nconst DIRECTORY_MODE = 0o700;\nconst PROFILE_PATTERN = /^[A-Za-z0-9._:-]+$/u;\n\nexport interface CredentialMutationLock {\n withLock<T>(action: () => Promise<T>): Promise<T>;\n}\n\nexport interface UserCredentialMutationLockOptions {\n home: () => string;\n profile: string;\n platform?: NodeJS.Platform;\n maxAttempts?: number;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n Reflect.get(error, \"code\") === code\n );\n}\n\nfunction lockSetupFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"Authentication credential coordination is unavailable.\",\n \"Check the permissions for ~/.zan-cli.\",\n );\n}\n\nfunction parseIdentity(home: string, profile: string): {\n home: string;\n profile: string;\n} {\n if (\n !isAbsolute(home) ||\n resolve(home) === parse(resolve(home)).root ||\n profile.length === 0 ||\n profile.length > 128 ||\n !PROFILE_PATTERN.test(profile)\n ) {\n throw lockSetupFailure();\n }\n return { home: resolve(home), profile };\n}\n\nexport function createCredentialMutationLockPath(\n home: string,\n profile: string,\n): string {\n const parsed = parseIdentity(home, profile);\n const encodedProfile = Buffer.from(parsed.profile, \"utf8\").toString(\n \"base64url\",\n );\n return join(\n parsed.home,\n \".zan-cli\",\n \"locks\",\n `auth-${encodedProfile}.lock`,\n );\n}\n\nexport class UserCredentialMutationLock\n implements CredentialMutationLock {\n private readonly platform: NodeJS.Platform;\n\n constructor(private readonly options: UserCredentialMutationLockOptions) {\n this.platform = options.platform ?? process.platform;\n }\n\n async withLock<T>(action: () => Promise<T>): Promise<T> {\n const filename = createCredentialMutationLockPath(\n this.options.home(),\n this.options.profile,\n );\n const root = join(filename, \"..\", \"..\");\n await this.ensurePrivateDirectory(root);\n await this.ensurePrivateDirectory(join(filename, \"..\"));\n return new FileLock(filename, {\n platform: this.platform,\n ...(this.options.maxAttempts === undefined\n ? {}\n : { maxAttempts: this.options.maxAttempts }),\n }).withLock(action);\n }\n\n private async ensurePrivateDirectory(directory: string): Promise<void> {\n try {\n const info = await lstat(directory);\n this.assertPrivateDirectory(info);\n return;\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw lockSetupFailure();\n }\n }\n\n try {\n await mkdir(directory, { mode: DIRECTORY_MODE });\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw lockSetupFailure();\n }\n }\n\n try {\n const info = await lstat(directory);\n if (\n this.platform !== \"win32\" &&\n (info.mode & 0o777) !== DIRECTORY_MODE\n ) {\n await chmod(directory, DIRECTORY_MODE);\n }\n this.assertPrivateDirectory(await lstat(directory));\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw lockSetupFailure();\n }\n }\n\n private assertPrivateDirectory(info: {\n mode: number;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n }): void {\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw lockSetupFailure();\n }\n if (\n this.platform !== \"win32\" &&\n (info.mode & 0o777) !== DIRECTORY_MODE\n ) {\n throw lockSetupFailure();\n }\n }\n}\n","import {\n chmod,\n lstat,\n open,\n readFile,\n unlink,\n} from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { CliFailure } from \"../errors/failure.js\";\n\ninterface LockFileHandle {\n writeFile(data: string, options: { encoding: \"utf8\" }): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface LockFileInfo {\n mode: number;\n isFile(): boolean;\n isSymbolicLink(): boolean;\n}\n\nexport interface FileLockFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): Promise<LockFileInfo>;\n open(path: string, flags: string, mode?: number): Promise<LockFileHandle>;\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n unlink(path: string): Promise<void>;\n}\n\nexport const nodeFileLockFileSystem: FileLockFileSystem = Object.freeze({\n chmod,\n lstat,\n open,\n readFile,\n unlink,\n});\n\nexport interface FileLockOptions {\n fileSystem?: FileLockFileSystem;\n platform?: NodeJS.Platform;\n maxAttempts?: number;\n retryDelayMs?: number;\n sleep?: (milliseconds: number) => Promise<void>;\n createOwnerId?: () => string;\n}\n\ninterface LockMetadata {\n owner: string;\n createdAt: number;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n try {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n Reflect.get(error, \"code\") === code\n );\n } catch {\n return false;\n }\n}\n\nfunction lockFailure(message = \"Unable to lock local settings.\"): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n message,\n \"Retry the command.\",\n );\n}\n\nfunction lockBusyFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"Local settings are busy.\",\n \"Wait for other ZAN CLI processes to finish. If none are running, remove the settings lock file manually.\",\n );\n}\n\nfunction lockCleanupUncertaintyFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The local update may have been applied, but lock cleanup failed.\",\n \"Run zan settings show to inspect the current value. If no ZAN CLI process is running, remove the settings lock file before retrying.\",\n );\n}\n\nexport class FileLock {\n private readonly fileSystem: FileLockFileSystem;\n private readonly platform: NodeJS.Platform;\n private readonly maxAttempts: number;\n private readonly retryDelayMs: number;\n private readonly sleep: (milliseconds: number) => Promise<void>;\n private readonly createOwnerId: () => string;\n\n constructor(\n readonly filename: string,\n options: FileLockOptions = {},\n ) {\n this.fileSystem = options.fileSystem ?? nodeFileLockFileSystem;\n this.platform = options.platform ?? process.platform;\n this.maxAttempts = options.maxAttempts ?? 100;\n this.retryDelayMs = options.retryDelayMs ?? 20;\n this.sleep =\n options.sleep ??\n (async (milliseconds) => {\n await delay(milliseconds);\n });\n this.createOwnerId = options.createOwnerId ?? randomUUID;\n }\n\n async withLock<T>(action: () => Promise<T>): Promise<T> {\n const owner = `${process.pid}-${this.createOwnerId()}`;\n await this.acquire(owner);\n\n let outcome:\n | { succeeded: true; value: T }\n | { succeeded: false; error: unknown };\n try {\n outcome = { succeeded: true, value: await action() };\n } catch (error) {\n outcome = { succeeded: false, error };\n }\n\n try {\n await this.release(owner);\n } catch {\n if (outcome.succeeded) {\n throw lockCleanupUncertaintyFailure();\n }\n }\n\n if (!outcome.succeeded) {\n throw outcome.error;\n }\n return outcome.value;\n }\n\n private async acquire(owner: string): Promise<void> {\n for (let attempt = 1; attempt <= this.maxAttempts; attempt += 1) {\n try {\n await this.createOwnedLock(owner);\n return;\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw lockFailure();\n }\n\n if (!(await this.foreignLockExists())) {\n continue;\n }\n if (attempt === this.maxAttempts) {\n throw lockBusyFailure();\n }\n await this.sleep(this.retryDelayMs);\n }\n }\n\n throw lockBusyFailure();\n }\n\n private async createOwnedLock(owner: string): Promise<void> {\n let handle: LockFileHandle | undefined;\n try {\n handle = await this.fileSystem.open(this.filename, \"wx\", 0o600);\n const metadata: LockMetadata = {\n owner,\n createdAt: Date.now(),\n };\n await handle.writeFile(`${JSON.stringify(metadata)}\\n`, {\n encoding: \"utf8\",\n });\n await handle.sync();\n await handle.close();\n handle = undefined;\n if (this.platform !== \"win32\") {\n await this.fileSystem.chmod(this.filename, 0o600);\n }\n } catch (error) {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n if (!hasErrorCode(error, \"EEXIST\")) {\n try {\n await this.fileSystem.unlink(this.filename);\n } catch {}\n }\n throw error;\n }\n }\n\n private async foreignLockExists(): Promise<boolean> {\n let info: LockFileInfo;\n try {\n info = await this.fileSystem.lstat(this.filename);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw lockFailure();\n }\n\n if (info.isSymbolicLink() || !info.isFile()) {\n throw lockFailure(\"Local settings lock path is unsafe.\");\n }\n if (\n this.platform !== \"win32\" &&\n (info.mode & 0o777) !== 0o600\n ) {\n throw lockFailure(\"Local settings lock path is unsafe.\");\n }\n return true;\n }\n\n private async release(owner: string): Promise<void> {\n let metadata: unknown;\n try {\n metadata = JSON.parse(\n await this.fileSystem.readFile(this.filename, \"utf8\"),\n );\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw lockFailure(\"Unable to release the local settings lock.\");\n }\n\n if (\n typeof metadata !== \"object\" ||\n metadata === null ||\n Reflect.get(metadata, \"owner\") !== owner\n ) {\n return;\n }\n\n try {\n await this.fileSystem.unlink(this.filename);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw lockFailure(\"Unable to release the local settings lock.\");\n }\n }\n }\n}\n","import { CliFailure } from \"./failure.js\";\n\nexport type ServiceOperation = \"auth\" | \"refresh\" | \"project\";\nexport type DeviceFlowFailureStatus =\n | \"pending\"\n | \"slow_down\"\n | \"denied\"\n | \"expired\";\n\nconst W3S_CLI_AUTH_CODES = Object.freeze({\n accessDenied: \"W3S-019-5-B007\",\n grantInvalid: \"W3S-019-5-B008\",\n devicePending: \"W3S-019-5-B010\",\n deviceSlowDown: \"W3S-019-5-B011\",\n deviceDenied: \"W3S-019-5-B012\",\n deviceExpired: \"W3S-019-5-B013\",\n refreshReplayed: \"W3S-019-5-B014\",\n sessionRevoked: \"W3S-019-5-B015\",\n scopeInsufficient: \"W3S-019-5-B018\",\n userUnavailable: \"W3S-019-5-B019\",\n projectNotFound: \"W3S-019-5-B020\",\n} as const);\n\nconst DEVICE_FLOW_CODES = Object.freeze({\n authorization_pending: \"pending\",\n slow_down: \"slow_down\",\n access_denied: \"denied\",\n expired_token: \"expired\",\n [W3S_CLI_AUTH_CODES.devicePending]: \"pending\",\n [W3S_CLI_AUTH_CODES.deviceSlowDown]: \"slow_down\",\n [W3S_CLI_AUTH_CODES.deviceDenied]: \"denied\",\n [W3S_CLI_AUTH_CODES.deviceExpired]: \"expired\",\n} satisfies Record<string, DeviceFlowFailureStatus>);\n\nconst PROJECT_FAILURES = Object.freeze({\n \"W3S-019-5-B024\": {\n message: \"A backend dependency required for this Project request failed.\",\n hint: \"Check the backend logs and dependency configuration for this environment.\",\n retryable: false,\n },\n \"W3S-019-5-B027\": {\n message: \"No free Node Service plan is configured for this environment.\",\n hint: \"Ask the service administrator to configure an available free Node Service plan before creating a Project.\",\n retryable: false,\n },\n \"W3S-019-5-B028\": {\n message: \"This account is not eligible for a free Node Service plan.\",\n hint: \"Check the account's Node Service plan in the ZAN console.\",\n retryable: false,\n },\n \"W3S-019-5-B029\": {\n message: \"The Node Service plan is still initializing.\",\n hint: \"Wait for plan activation, then try again. If this persists, contact support.\",\n retryable: true,\n },\n \"W3S-019-5-B030\": {\n message: \"The Node Service plan could not be initialized.\",\n hint: \"Ask the service administrator to check the plan initialization dependencies before trying again.\",\n retryable: false,\n },\n \"W3S-019-5-B031\": {\n message: \"The account's existing Node Service plan is unavailable.\",\n hint: \"Check the plan's expiry and service status in the ZAN console.\",\n retryable: false,\n },\n \"W3S-019-5-B032\": {\n message: \"The Node Service Project limit has been reached.\",\n hint: \"Upgrade the plan or remove unused Projects in the ZAN console.\",\n retryable: false,\n },\n \"W3S-019-5-B033\": {\n message: \"A Project with this name already exists.\",\n hint: \"Choose a different name, or run zan project list and zan project use <id> to use the existing Project.\",\n retryable: false,\n },\n});\n\nexport function mapDeviceFlowCode(\n displayedCode: string,\n): DeviceFlowFailureStatus | undefined {\n return Object.prototype.hasOwnProperty.call(\n DEVICE_FLOW_CODES,\n displayedCode,\n )\n ? DEVICE_FLOW_CODES[\n displayedCode as keyof typeof DEVICE_FLOW_CODES\n ]\n : undefined;\n}\n\nexport interface ServiceFailureInput {\n status: number;\n displayedCode?: string;\n operation: ServiceOperation;\n}\n\nfunction authenticationRequired(): CliFailure {\n return new CliFailure(\n \"AUTH_REQUIRED\",\n \"Authentication is required.\",\n \"Run: zan auth login\",\n );\n}\n\nfunction authenticationExpired(): CliFailure {\n return new CliFailure(\n \"AUTH_EXPIRED\",\n \"Authentication has expired and could not be renewed.\",\n \"Run: zan auth login\",\n );\n}\n\nexport function mapServiceFailure(input: ServiceFailureInput): CliFailure {\n if (\n input.displayedCode === \"AUTH_REQUIRED\" ||\n input.displayedCode === W3S_CLI_AUTH_CODES.scopeInsufficient\n ) {\n return authenticationRequired();\n }\n if (\n input.operation === \"auth\" &&\n (input.displayedCode === W3S_CLI_AUTH_CODES.accessDenied ||\n input.displayedCode === W3S_CLI_AUTH_CODES.deviceDenied)\n ) {\n return new CliFailure(\n \"AUTH_DENIED\",\n \"Authorization was denied.\",\n );\n }\n if (\n input.operation === \"refresh\" &&\n (input.displayedCode === \"invalid_grant\" ||\n input.displayedCode === W3S_CLI_AUTH_CODES.grantInvalid ||\n input.displayedCode === W3S_CLI_AUTH_CODES.refreshReplayed ||\n input.displayedCode === W3S_CLI_AUTH_CODES.sessionRevoked ||\n input.displayedCode === W3S_CLI_AUTH_CODES.userUnavailable)\n ) {\n return authenticationExpired();\n }\n if (input.status === 401 || input.status === 403) {\n return input.operation === \"refresh\"\n ? authenticationExpired()\n : authenticationRequired();\n }\n if (input.status === 429 || input.displayedCode === \"RATE_LIMITED\") {\n return new CliFailure(\n \"RATE_LIMITED\",\n \"The ZAN service rate limit was reached.\",\n \"Wait and try again.\",\n );\n }\n if (\n input.displayedCode === \"PROJECT_NOT_FOUND\" ||\n (input.operation === \"project\" &&\n input.displayedCode === W3S_CLI_AUTH_CODES.projectNotFound) ||\n (input.operation === \"project\" && input.status === 404)\n ) {\n return new CliFailure(\n \"PROJECT_NOT_FOUND\",\n \"The ZAN Project was not found.\",\n \"Check the Project ID and try again.\",\n );\n }\n if (input.displayedCode === \"NETWORK_NOT_FOUND\") {\n return new CliFailure(\n \"NETWORK_NOT_FOUND\",\n \"The requested Network was not found.\",\n );\n }\n if (input.displayedCode === \"NETWORK_NOT_AVAILABLE\") {\n return new CliFailure(\n \"NETWORK_NOT_AVAILABLE\",\n \"The requested Network is not available for this Project.\",\n );\n }\n if (\n input.operation === \"project\" &&\n input.displayedCode !== undefined &&\n Object.prototype.hasOwnProperty.call(PROJECT_FAILURES, input.displayedCode)\n ) {\n const failure = PROJECT_FAILURES[\n input.displayedCode as keyof typeof PROJECT_FAILURES\n ];\n return new CliFailure(\n \"ZAN_API_ERROR\",\n failure.message,\n failure.hint,\n failure.retryable,\n );\n }\n return new CliFailure(\n \"ZAN_API_ERROR\",\n \"The ZAN service request failed.\",\n \"Try again later.\",\n input.status >= 500,\n );\n}\n","import { z, type ZodType } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nconst successEnvelopeSchema = z\n .object({\n success: z.literal(true),\n data: z.unknown(),\n })\n .passthrough()\n .refine(\n (value) => Object.prototype.hasOwnProperty.call(value, \"data\"),\n { path: [\"data\"] },\n );\n\nconst failureEnvelopeSchema = z\n .object({\n success: z.literal(false),\n // The backend's Fastjson interceptor responses omit null fields.\n data: z.null().optional(),\n errorMessage: z\n .object({\n displayedCode: z.string().min(1),\n })\n .passthrough(),\n })\n .passthrough();\n\nconst webResultEnvelopeSchema = z.discriminatedUnion(\"success\", [\n successEnvelopeSchema,\n failureEnvelopeSchema,\n]);\n\nexport type WebResultOutcome<T> =\n | { success: true; data: T }\n | { success: false; displayedCode: string };\n\nexport interface UnwrapWebResultOptions {\n retryable?: boolean;\n}\n\nexport function readWebResultFailureCode(\n body: unknown,\n): string | undefined {\n const parsed = webResultEnvelopeSchema.safeParse(body);\n return parsed.success && !parsed.data.success\n ? parsed.data.errorMessage.displayedCode\n : undefined;\n}\n\nfunction invalidWebResult(retryable: boolean): CliFailure {\n return new CliFailure(\n \"ZAN_API_ERROR\",\n \"The ZAN service returned an invalid response.\",\n undefined,\n retryable,\n );\n}\n\nexport function unwrapWebResult<T>(\n body: unknown,\n dataSchema: ZodType<T>,\n options: UnwrapWebResultOptions = {},\n): WebResultOutcome<T> {\n const retryable = options.retryable ?? false;\n let envelope: z.infer<typeof webResultEnvelopeSchema>;\n try {\n const result = webResultEnvelopeSchema.safeParse(body);\n if (!result.success) {\n throw invalidWebResult(retryable);\n }\n envelope = result.data;\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw invalidWebResult(retryable);\n }\n\n if (!envelope.success) {\n return {\n success: false,\n displayedCode: envelope.errorMessage.displayedCode,\n };\n }\n\n try {\n const result = dataSchema.safeParse(envelope.data);\n if (!result.success) {\n throw invalidWebResult(retryable);\n }\n return { success: true, data: result.data };\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw invalidWebResult(retryable);\n }\n}\n","const OAUTH_API_PREFIX = \"/v1/api/cli-oauth\";\n\nexport const OAUTH_PATHS = Object.freeze({\n authorize: `${OAUTH_API_PREFIX}/authorize`,\n deviceAuthorization: `${OAUTH_API_PREFIX}/device_authorization`,\n token: `${OAUTH_API_PREFIX}/token`,\n revoke: `${OAUTH_API_PREFIX}/revoke`,\n});\n","import { z } from \"zod\";\n\nexport const tokenResponseSchema = z\n .object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n token_type: z.literal(\"Bearer\"),\n expires_in: z.number().int().positive(),\n scope: z.string(),\n })\n .strict();\n\nexport const deviceAuthorizationResponseSchema = z\n .object({\n device_code: z.string().min(1),\n user_code: z.string().min(1),\n verification_uri: z.string().url(),\n verification_uri_complete: z.string().url().optional(),\n expires_in: z.number().int().positive(),\n interval: z.number().int().positive().default(5),\n })\n .strict();\n\nexport const sessionResponseSchema = z\n .object({\n subject: z.string().min(1).max(256),\n displayName: z.string().min(1).max(256),\n email: z.string().trim().min(1).max(320).nullish(),\n scopes: z.array(z.string().min(1)).max(64),\n expiresAt: z.string().datetime(),\n })\n .strict();\n\nexport const voidResponseSchema = z.null();\n\nexport type TokenResponse = z.infer<typeof tokenResponseSchema>;\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken: string;\n tokenType: \"Bearer\";\n expiresInSeconds: number;\n scopes: string[];\n}\n\nexport interface DeviceAuthorization {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n verificationUriComplete?: string;\n expiresInSeconds: number;\n intervalSeconds: number;\n}\n\nexport type DeviceTokenPollResult =\n | { status: \"pending\" }\n | { status: \"slow_down\" }\n | { status: \"denied\" }\n | { status: \"expired\" }\n | { status: \"success\"; tokenSet: TokenSet };\n\nexport interface SessionInfo {\n subject: string;\n displayName: string;\n email?: string;\n scopes: string[];\n expiresAt: string;\n}\n\nexport interface RevokeResult {\n serverRevoked: boolean;\n}\n\nexport interface AuthorizeInput {\n redirectUri: string;\n state: string;\n codeChallenge: string;\n}\n\nexport interface ExchangeCodeInput {\n code: string;\n codeVerifier: string;\n redirectUri: string;\n}\n","import type { ZodType } from \"zod\";\nimport {\n mapDeviceFlowCode,\n mapServiceFailure,\n type ServiceOperation,\n} from \"../errors/service-error-mapper.js\";\nimport type {\n HttpRequest,\n HttpResponse,\n} from \"../http/transport.js\";\nimport { unwrapWebResult } from \"../http/web-result.js\";\nimport { readWebResultFailureCode } from \"../http/web-result.js\";\nimport { OAUTH_PATHS } from \"./oauth-paths.js\";\nimport {\n deviceAuthorizationResponseSchema,\n sessionResponseSchema,\n tokenResponseSchema,\n voidResponseSchema,\n type AuthorizeInput,\n type DeviceAuthorization,\n type DeviceTokenPollResult,\n type ExchangeCodeInput,\n type RevokeResult,\n type SessionInfo,\n type TokenResponse,\n type TokenSet,\n} from \"./oauth-types.js\";\n\nexport interface HttpTransportPort {\n request(request: HttpRequest): Promise<HttpResponse>;\n}\n\nexport interface OAuthClientOptions {\n authBaseUrl: URL;\n authTransport: HttpTransportPort;\n apiTransport: HttpTransportPort;\n clientId: string;\n scopes: readonly string[];\n signal: AbortSignal;\n}\n\nfunction form(values: Record<string, string>): URLSearchParams {\n return new URLSearchParams(values);\n}\n\nfunction formHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/x-www-form-urlencoded\" };\n}\n\nfunction toTokenSet(token: TokenResponse): TokenSet {\n return {\n accessToken: token.access_token,\n refreshToken: token.refresh_token,\n tokenType: token.token_type,\n expiresInSeconds: token.expires_in,\n scopes: token.scope.split(/\\s+/u).filter(Boolean),\n };\n}\n\nexport class OAuthClient {\n private readonly authBaseUrl: URL;\n private readonly authTransport: HttpTransportPort;\n private readonly apiTransport: HttpTransportPort;\n private readonly clientId: string;\n private readonly scopes: readonly string[];\n private readonly signal: AbortSignal;\n\n constructor(options: OAuthClientOptions) {\n this.authBaseUrl = new URL(options.authBaseUrl);\n this.authTransport = options.authTransport;\n this.apiTransport = options.apiTransport;\n this.clientId = options.clientId;\n this.scopes = options.scopes;\n this.signal = options.signal;\n }\n\n authorizeUrl(input: AuthorizeInput): URL {\n const url = new URL(OAUTH_PATHS.authorize, this.authBaseUrl);\n url.search = new URLSearchParams({\n response_type: \"code\",\n client_id: this.clientId,\n redirect_uri: input.redirectUri,\n scope: this.scopes.join(\" \"),\n state: input.state,\n code_challenge: input.codeChallenge,\n code_challenge_method: \"S256\",\n }).toString();\n return url;\n }\n\n async exchangeCode(input: ExchangeCodeInput): Promise<TokenSet> {\n return this.requestToken({\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n client_id: this.clientId,\n });\n }\n\n async startDeviceAuthorization(): Promise<DeviceAuthorization> {\n const response = await this.authTransport.request({\n method: \"POST\",\n path: OAUTH_PATHS.deviceAuthorization,\n headers: formHeaders(),\n body: form({\n client_id: this.clientId,\n scope: this.scopes.join(\" \"),\n }),\n signal: this.signal,\n });\n const deviceAuthorization = this.readResponse(\n response,\n deviceAuthorizationResponseSchema,\n );\n return {\n deviceCode: deviceAuthorization.device_code,\n userCode: deviceAuthorization.user_code,\n verificationUri: deviceAuthorization.verification_uri,\n ...(deviceAuthorization.verification_uri_complete === undefined\n ? {}\n : {\n verificationUriComplete:\n deviceAuthorization.verification_uri_complete,\n }),\n expiresInSeconds: deviceAuthorization.expires_in,\n intervalSeconds: deviceAuthorization.interval,\n };\n }\n\n async pollDeviceToken(\n deviceCode: string,\n ): Promise<DeviceTokenPollResult> {\n const response = await this.authTransport.request({\n method: \"POST\",\n path: OAUTH_PATHS.token,\n headers: formHeaders(),\n body: form({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: this.clientId,\n }),\n signal: this.signal,\n });\n if (\n response.status === 401 ||\n response.status === 403 ||\n response.status === 429\n ) {\n throw mapServiceFailure({\n status: response.status,\n operation: \"auth\",\n });\n }\n const outcome = unwrapWebResult(response.body, tokenResponseSchema, {\n retryable: response.status >= 500,\n });\n if (!outcome.success) {\n const status = mapDeviceFlowCode(outcome.displayedCode);\n if (status !== undefined) {\n return { status };\n }\n throw mapServiceFailure({\n status: response.status,\n displayedCode: outcome.displayedCode,\n operation: \"auth\",\n });\n }\n if (response.status < 200 || response.status >= 300) {\n throw mapServiceFailure({\n status: response.status,\n operation: \"auth\",\n });\n }\n return { status: \"success\", tokenSet: toTokenSet(outcome.data) };\n }\n\n async refresh(refreshToken: string): Promise<TokenSet> {\n const response = await this.authTransport.request({\n method: \"POST\",\n path: OAUTH_PATHS.token,\n headers: formHeaders(),\n body: form({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: this.clientId,\n }),\n signal: this.signal,\n });\n return toTokenSet(\n this.readResponse(response, tokenResponseSchema, \"refresh\"),\n );\n }\n\n async revoke(refreshToken: string): Promise<RevokeResult> {\n const response = await this.authTransport.request({\n method: \"POST\",\n path: OAUTH_PATHS.revoke,\n headers: formHeaders(),\n body: form({\n token: refreshToken,\n token_type_hint: \"refresh_token\",\n client_id: this.clientId,\n }),\n signal: this.signal,\n });\n this.readResponse(response, voidResponseSchema);\n return { serverRevoked: true };\n }\n\n async verifySession(accessToken: string): Promise<SessionInfo> {\n const response = await this.apiTransport.request({\n method: \"GET\",\n path: \"/v1/api/cli/session\",\n headers: { Authorization: `Bearer ${accessToken}` },\n signal: this.signal,\n });\n const session = this.readResponse(response, sessionResponseSchema);\n return {\n subject: session.subject,\n displayName: session.displayName,\n ...(session.email == null ? {} : { email: session.email }),\n scopes: [...session.scopes],\n expiresAt: session.expiresAt,\n };\n }\n\n private readResponse<T>(\n response: HttpResponse,\n schema: ZodType<T>,\n operation: ServiceOperation = \"auth\",\n ): T {\n const displayedCode = readWebResultFailureCode(response.body);\n if (displayedCode !== undefined) {\n throw mapServiceFailure({\n status: response.status,\n displayedCode,\n operation,\n });\n }\n if (\n response.status === 401 ||\n response.status === 403 ||\n response.status === 429\n ) {\n throw mapServiceFailure({\n status: response.status,\n operation,\n });\n }\n const outcome = unwrapWebResult(response.body, schema, {\n retryable: response.status >= 500,\n });\n if (!outcome.success) {\n throw mapServiceFailure({\n status: response.status,\n displayedCode: outcome.displayedCode,\n operation,\n });\n }\n if (response.status < 200 || response.status >= 300) {\n throw mapServiceFailure({\n status: response.status,\n operation,\n });\n }\n return outcome.data;\n }\n\n private async requestToken(\n values: Record<string, string>,\n ): Promise<TokenSet> {\n const response = await this.authTransport.request({\n method: \"POST\",\n path: OAUTH_PATHS.token,\n headers: formHeaders(),\n body: form(values),\n signal: this.signal,\n });\n return toTokenSet(this.readResponse(response, tokenResponseSchema));\n }\n}\n","import type {\n CredentialStore,\n StoredCredential,\n} from \"../credentials/credential-store.js\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { AuthenticatedAttempt } from \"./authenticated-retry.js\";\nimport type { RevokeResult, TokenSet } from \"./oauth-types.js\";\n\ninterface RefreshClient {\n refresh(refreshToken: string): Promise<TokenSet>;\n}\n\ninterface SessionMetadataClearer {\n clear(): Promise<void>;\n}\n\nexport interface SessionMutationLock {\n withLock<T>(action: () => Promise<T>): Promise<T>;\n}\n\nexport type SessionRefreshLock = SessionMutationLock;\n\nexport interface SessionServiceOptions {\n credentialStore: CredentialStore;\n metadataStore: SessionMetadataClearer;\n oauth: RefreshClient;\n mutationLock?: SessionMutationLock;\n refreshLock?: SessionRefreshLock;\n profile: string;\n now?: () => number;\n}\n\ninterface InMemoryAccessToken {\n value: string;\n expiresAtMs: number;\n}\n\nexport class SessionService {\n private accessToken: InMemoryAccessToken | undefined;\n private refreshPromise: Promise<string> | undefined;\n private readonly credentialStore: CredentialStore;\n private readonly metadataStore: SessionMetadataClearer;\n private readonly oauth: RefreshClient;\n private readonly mutationLock: SessionMutationLock;\n private readonly profile: string;\n private readonly now: () => number;\n\n constructor(options: SessionServiceOptions) {\n this.credentialStore = options.credentialStore;\n this.metadataStore = options.metadataStore;\n this.oauth = options.oauth;\n this.mutationLock = options.mutationLock ?? options.refreshLock ?? {\n withLock: async <T>(action: () => Promise<T>) => action(),\n };\n this.profile = options.profile;\n this.now = options.now ?? Date.now;\n }\n\n async ensureAccessToken(): Promise<string> {\n if (this.isReusable(this.accessToken)) {\n return this.accessToken.value;\n }\n return this.resolveAccessToken();\n }\n\n private async resolveAccessToken(\n rejectedAccessToken?: string,\n ): Promise<string> {\n if (this.refreshPromise !== undefined) {\n return this.refreshPromise;\n }\n\n const refresh = this.loadOrRefresh(rejectedAccessToken);\n this.refreshPromise = refresh;\n try {\n return await refresh;\n } finally {\n if (this.refreshPromise === refresh) {\n this.refreshPromise = undefined;\n }\n }\n }\n\n private async installTokenSetLocked(tokenSet: TokenSet): Promise<void> {\n const expiresAtMs =\n this.now() + tokenSet.expiresInSeconds * 1_000;\n await this.credentialStore.write(this.profile, {\n refreshToken: tokenSet.refreshToken,\n accessToken: tokenSet.accessToken,\n accessTokenExpiresAt: new Date(expiresAtMs).toISOString(),\n });\n this.accessToken = {\n value: tokenSet.accessToken,\n expiresAtMs,\n };\n }\n\n async commitLogin<T>(\n tokenSet: TokenSet,\n verifyAndCommit: (accessToken: string) => Promise<T>,\n ): Promise<T> {\n return this.mutationLock.withLock(async () => {\n await this.installTokenSetLocked(tokenSet);\n try {\n return await verifyAndCommit(tokenSet.accessToken);\n } catch (error) {\n await this.clearIfAccessTokenMatchesLocked(tokenSet.accessToken);\n throw error;\n }\n });\n }\n\n async verifyCurrent<T>(\n verifyAndCommit: (accessToken: string) => Promise<T>,\n ): Promise<T> {\n return this.mutationLock.withLock(async () =>\n verifyAndCommit(await this.loadOrRefreshLocked()),\n );\n }\n\n async withAuthenticatedRetry<T>(\n request: (\n accessToken: string,\n ) => Promise<AuthenticatedAttempt<T>>,\n ): Promise<T> {\n const firstAccessToken = await this.ensureAccessToken();\n const first = await request(firstAccessToken);\n if (first.disposition === \"accepted\") {\n return first.value;\n }\n\n this.accessToken = undefined;\n const secondAccessToken = await this.resolveAccessToken(firstAccessToken);\n const second = await request(secondAccessToken);\n if (second.disposition === \"accepted\") {\n return second.value;\n }\n\n this.accessToken = undefined;\n if (second.disposition === \"access_token_rejected_confirmed\") {\n await this.mutationLock.withLock(() =>\n this.clearIfAccessTokenMatchesLocked(secondAccessToken),\n );\n }\n throw new CliFailure(\n \"AUTH_EXPIRED\",\n \"Authentication has expired and could not be renewed.\",\n \"Run: zan auth login\",\n );\n }\n\n async logout(\n revoke: (refreshToken: string) => Promise<RevokeResult>,\n ): Promise<RevokeResult> {\n return this.mutationLock.withLock(async () => {\n const credential = await this.readOptionalCredentialLocked();\n let serverRevoked = true;\n if (credential !== null) {\n try {\n serverRevoked = (\n await revoke(credential.refreshToken)\n ).serverRevoked;\n } catch {\n serverRevoked = false;\n }\n }\n await this.clearLocked();\n return { serverRevoked };\n });\n }\n\n private async clearLocked(): Promise<void> {\n this.accessToken = undefined;\n const results = await Promise.allSettled([\n this.credentialStore.delete(this.profile),\n this.metadataStore.clear(),\n ]);\n const failure = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n if (failure !== undefined) {\n throw failure.reason;\n }\n }\n\n private async loadOrRefresh(\n rejectedAccessToken?: string,\n ): Promise<string> {\n const initial = await this.requireCredential();\n const initialAccessToken = this.readAccessToken(initial);\n if (\n rejectedAccessToken === undefined &&\n this.isReusable(initialAccessToken)\n ) {\n this.accessToken = initialAccessToken;\n return initialAccessToken.value;\n }\n\n return this.mutationLock.withLock(() =>\n this.loadOrRefreshLocked(rejectedAccessToken),\n );\n }\n\n private async loadOrRefreshLocked(\n rejectedAccessToken?: string,\n ): Promise<string> {\n const credential = await this.requireCredential();\n const persistedAccessToken = this.readAccessToken(credential);\n if (\n this.isReusable(persistedAccessToken) &&\n persistedAccessToken.value !== rejectedAccessToken\n ) {\n this.accessToken = persistedAccessToken;\n return persistedAccessToken.value;\n }\n return this.refreshLocked(credential.refreshToken);\n }\n\n private async requireCredential(): Promise<StoredCredential> {\n const credential = await this.credentialStore.read(this.profile);\n if (credential === null) {\n throw new CliFailure(\n \"AUTH_REQUIRED\",\n \"Authentication is required.\",\n \"Run: zan auth login\",\n );\n }\n return credential;\n }\n\n private async readOptionalCredentialLocked(): Promise<StoredCredential | null> {\n try {\n return await this.credentialStore.read(this.profile);\n } catch (error) {\n if (\n error instanceof CliFailure &&\n error.code === \"AUTH_REQUIRED\"\n ) {\n return null;\n }\n throw error;\n }\n }\n\n private async refreshLocked(refreshToken: string): Promise<string> {\n let tokenSet: TokenSet;\n try {\n tokenSet = await this.oauth.refresh(refreshToken);\n } catch (error) {\n if (\n error instanceof CliFailure &&\n error.code === \"AUTH_EXPIRED\"\n ) {\n await this.clearIfRefreshTokenMatchesLocked(refreshToken);\n }\n throw error;\n }\n await this.installTokenSetLocked(tokenSet);\n return tokenSet.accessToken;\n }\n\n private async clearIfAccessTokenMatchesLocked(\n accessToken: string,\n ): Promise<void> {\n const credential = await this.credentialStore.read(this.profile);\n if (credential?.accessToken === accessToken) {\n await this.clearLocked();\n }\n }\n\n private async clearIfRefreshTokenMatchesLocked(\n refreshToken: string,\n ): Promise<void> {\n const credential = await this.credentialStore.read(this.profile);\n if (credential?.refreshToken === refreshToken) {\n await this.clearLocked();\n }\n }\n\n private readAccessToken(\n credential: StoredCredential,\n ): InMemoryAccessToken | undefined {\n if (\n credential.accessToken === undefined ||\n credential.accessTokenExpiresAt === undefined\n ) {\n return undefined;\n }\n const expiresAtMs = Date.parse(credential.accessTokenExpiresAt);\n return Number.isFinite(expiresAtMs)\n ? { value: credential.accessToken, expiresAtMs }\n : undefined;\n }\n\n private isReusable(\n accessToken: InMemoryAccessToken | undefined,\n ): accessToken is InMemoryAccessToken {\n return (\n accessToken !== undefined &&\n accessToken.expiresAtMs - this.now() > 60_000\n );\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type {\n CredentialStore,\n CredentialStoreStatus,\n StoredCredential,\n} from \"./credential-store.js\";\nimport {\n KeychainSecretStore,\n type KeychainApi,\n} from \"./keychain-secret-store.js\";\n\nexport type { KeychainApi } from \"./keychain-secret-store.js\";\n\nconst profileSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9._:-]+$/u);\n\nconst legacyStoredCredentialSchema = z\n .object({\n refreshToken: z.string().min(1),\n })\n .strict();\n\nconst tokenSetCredentialSchema = z\n .object({\n refreshToken: z.string().min(1),\n accessToken: z.string().min(1),\n accessTokenExpiresAt: z.string().datetime(),\n })\n .strict();\n\nconst storedCredentialSchema = z.union([\n tokenSetCredentialSchema,\n legacyStoredCredentialSchema,\n]);\n\nfunction accountFor(profile: string): string {\n const parsed = profileSchema.safeParse(profile);\n if (!parsed.success) {\n throw new CliFailure(\"INVALID_ARGS\", \"Invalid credential profile.\");\n }\n return `profile-${Buffer.from(parsed.data, \"utf8\").toString(\"base64url\")}`;\n}\n\nexport class CrossKeychainStore implements CredentialStore {\n private readonly secrets: KeychainSecretStore;\n\n constructor(api: KeychainApi) {\n this.secrets = new KeychainSecretStore(api);\n }\n\n async probe(): Promise<CredentialStoreStatus> {\n return this.secrets.probe();\n }\n\n async read(profile: string): Promise<StoredCredential | null> {\n const raw = await this.secrets.read(accountFor(profile));\n\n if (raw === null) {\n return null;\n }\n\n try {\n return storedCredentialSchema.parse(JSON.parse(raw));\n } catch {\n throw new CliFailure(\n \"AUTH_REQUIRED\",\n \"Stored credentials are invalid.\",\n \"Run: zan auth login\",\n );\n }\n }\n\n async write(\n profile: string,\n credential: StoredCredential,\n ): Promise<void> {\n let payload: string;\n try {\n payload = JSON.stringify(storedCredentialSchema.parse(credential));\n } catch {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"Credential data could not be validated.\",\n );\n }\n\n await this.secrets.write(accountFor(profile), payload);\n }\n\n async delete(profile: string): Promise<void> {\n await this.secrets.delete(accountFor(profile));\n }\n}\n","import { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport {\n credentialStoreStatusSchema,\n type CredentialStoreStatus,\n} from \"./credential-store.js\";\n\nconst SERVICE = \"zan-cli\";\nconst SYSTEM_BACKENDS = new Set([\n \"native-macos\",\n \"macos\",\n \"native-windows\",\n \"windows\",\n \"native-linux\",\n \"secret-service\",\n]);\n\nconst accountSchema = z\n .string()\n .min(1)\n .max(256)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u);\n\nexport interface KeychainApi {\n getKeyring(): Promise<{ id: string; name: string }>;\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(\n service: string,\n account: string,\n value: string,\n ): Promise<void>;\n deletePassword(service: string, account: string): Promise<void>;\n}\n\nexport interface SecretStore {\n probe(): Promise<CredentialStoreStatus>;\n read(account: string): Promise<string | null>;\n write(account: string, secret: string): Promise<void>;\n delete(account: string): Promise<void>;\n}\n\nfunction invalidAccount(): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", \"Invalid credential account.\");\n}\n\nfunction unavailable(): CliFailure {\n return new CliFailure(\n \"CREDENTIAL_STORE_UNAVAILABLE\",\n \"The system credential store is unavailable.\",\n \"Configure macOS Keychain, Windows Credential Manager, or Secret Service.\",\n );\n}\n\nfunction systemStoreRequired(): CliFailure {\n return new CliFailure(\n \"CREDENTIAL_STORE_UNAVAILABLE\",\n \"A system credential store is required.\",\n \"Configure macOS Keychain, Windows Credential Manager, or Secret Service.\",\n );\n}\n\nfunction parseAccount(account: string): string {\n const parsed = accountSchema.safeParse(account);\n if (!parsed.success) {\n throw invalidAccount();\n }\n return parsed.data;\n}\n\nfunction safeBackendId(value: unknown): string {\n return typeof value === \"string\" &&\n /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u.test(value)\n ? value\n : \"unknown\";\n}\n\nexport class KeychainSecretStore implements SecretStore {\n constructor(private readonly api: KeychainApi) {}\n\n async probe(): Promise<CredentialStoreStatus> {\n let backend: string;\n try {\n backend = safeBackendId((await this.api.getKeyring()).id);\n } catch {\n return {\n backend: \"unavailable\",\n available: false,\n systemBacked: false,\n };\n }\n return credentialStoreStatusSchema.parse({\n backend,\n available: SYSTEM_BACKENDS.has(backend),\n systemBacked: SYSTEM_BACKENDS.has(backend),\n });\n }\n\n async read(account: string): Promise<string | null> {\n const parsedAccount = parseAccount(account);\n try {\n return await this.api.getPassword(SERVICE, parsedAccount);\n } catch {\n throw unavailable();\n }\n }\n\n async write(account: string, secret: string): Promise<void> {\n const parsedAccount = parseAccount(account);\n if (secret.length === 0) {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"Credential data could not be validated.\",\n );\n }\n if (!(await this.probe()).systemBacked) {\n throw systemStoreRequired();\n }\n try {\n await this.api.setPassword(SERVICE, parsedAccount, secret);\n } catch {\n throw unavailable();\n }\n }\n\n async delete(account: string): Promise<void> {\n const parsedAccount = parseAccount(account);\n try {\n if ((await this.api.getPassword(SERVICE, parsedAccount)) === null) {\n return;\n }\n await this.api.deletePassword(SERVICE, parsedAccount);\n } catch {\n throw unavailable();\n }\n }\n}\n","import { z } from \"zod\";\n\nexport const credentialStoreStatusSchema = z\n .object({\n backend: z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u),\n available: z.boolean(),\n systemBacked: z.boolean(),\n })\n .strict()\n .superRefine((status, context) => {\n if (status.systemBacked && !status.available) {\n context.addIssue({\n code: \"custom\",\n message: \"A system-backed credential store must be available.\",\n path: [\"systemBacked\"],\n });\n }\n });\n\nexport type StoredCredential =\n | {\n refreshToken: string;\n accessToken: string;\n accessTokenExpiresAt: string;\n }\n | {\n refreshToken: string;\n accessToken?: never;\n accessTokenExpiresAt?: never;\n };\n\nexport type CredentialStoreStatus = z.infer<\n typeof credentialStoreStatusSchema\n>;\n\nexport interface CredentialStore {\n probe(): Promise<CredentialStoreStatus>;\n read(profile: string): Promise<StoredCredential | null>;\n write(\n profile: string,\n credential: StoredCredential,\n ): Promise<void>;\n delete(profile: string): Promise<void>;\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport function formatUnits(\n value: bigint,\n decimals: number,\n): string {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"Native currency decimals are invalid.\",\n );\n }\n if (decimals === 0) {\n return value.toString();\n }\n\n const negative = value < 0n;\n const digits = (negative ? -value : value)\n .toString()\n .padStart(decimals + 1, \"0\");\n const whole = digits.slice(0, -decimals);\n const fraction = digits.slice(-decimals).replace(/0+$/u, \"\");\n const formatted =\n fraction.length === 0 ? whole : `${whole}.${fraction}`;\n return negative ? `-${formatted}` : formatted;\n}\n\nexport function formatGwei(value: bigint): string {\n return formatUnits(value, 9);\n}\n\nexport function parseRpcQuantity(value: unknown): bigint {\n if (\n typeof value !== \"string\" ||\n !/^0x(?:0|[1-9a-f][0-9a-f]*)$/iu.test(value)\n ) {\n throw new CliFailure(\n \"RPC_ERROR\",\n \"The RPC endpoint returned an invalid hexadecimal quantity.\",\n );\n }\n return BigInt(value);\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport class JsonRpcFailure extends CliFailure {\n readonly rpcCode: number;\n\n constructor(rpcCode: number, rpcMessage: string) {\n super(\n \"RPC_ERROR\",\n `JSON-RPC error ${String(rpcCode)}: ${rpcMessage}`,\n );\n this.name = \"JsonRpcFailure\";\n this.rpcCode = rpcCode;\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport class RpcEndpointRejected extends CliFailure {\n constructor() {\n super(\"RPC_ERROR\", \"The RPC endpoint rejected the request.\");\n this.name = \"RpcEndpointRejected\";\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport type { ResolvedEndpoint } from \"../networks/endpoint-resolver.js\";\nimport type { PublicNetwork } from \"../projects/project-types.js\";\nimport {\n parseAddress,\n parseBlock,\n parseRpcMethod,\n parseTopic,\n parseTransactionHash,\n} from \"./rpc-input.js\";\nimport {\n formatGwei,\n formatUnits,\n parseRpcQuantity,\n} from \"./format.js\";\nimport { isEnsName } from \"./ens-resolver.js\";\nimport { JsonRpcFailure } from \"./json-rpc-failure.js\";\nimport { RpcEndpointRejected } from \"./rpc-endpoint-rejected.js\";\n\nexport interface EvmProjectService {\n activeId(): Promise<string>;\n}\n\nexport interface EvmNetworkSelector {\n resolve(projectId: string): Promise<PublicNetwork>;\n}\n\nexport interface EvmEndpointResolver {\n resolve(\n projectId: string,\n networkId: string,\n ): Promise<ResolvedEndpoint>;\n refresh(projectId: string): Promise<unknown>;\n hasOverride(projectId: string): Promise<boolean>;\n}\n\nexport interface EvmRpcClient {\n call(\n endpoint: ResolvedEndpoint,\n method: string,\n params?: unknown[],\n ): Promise<unknown>;\n}\n\nexport interface EvmNameResolver {\n resolve(projectId: string, name: string): Promise<string>;\n}\n\nexport interface EvmRpcMethodPolicy {\n requireAllowed(method: string): Promise<void>;\n}\n\nexport interface EvmQueryServiceOptions {\n projectService: EvmProjectService;\n networkSelector: EvmNetworkSelector;\n endpointResolver: EvmEndpointResolver;\n rpc: EvmRpcClient;\n ens: EvmNameResolver;\n rpcMethodPolicy: EvmRpcMethodPolicy;\n}\n\nexport interface EvmLogFilter {\n fromBlock: string;\n toBlock: string;\n address?: string;\n topics?: string[];\n}\n\ninterface QueryTarget {\n projectId: string;\n network: PublicNetwork;\n endpoint: ResolvedEndpoint;\n}\n\nfunction malformedResult(description: string): CliFailure {\n return new CliFailure(\n \"RPC_ERROR\",\n `The RPC endpoint returned an invalid ${description}.`,\n );\n}\n\nfunction requireRecord(\n value: unknown,\n description: string,\n): Record<string, unknown> {\n if (\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value)\n ) {\n throw malformedResult(description);\n }\n return value as Record<string, unknown>;\n}\n\nexport class EvmQueryService {\n constructor(private readonly options: EvmQueryServiceOptions) {}\n\n async rpc(method: string, params: unknown[]): Promise<unknown> {\n const normalizedMethod = parseRpcMethod(method);\n await this.options.rpcMethodPolicy.requireAllowed(normalizedMethod);\n const target = await this.resolveTarget();\n return this.callWithEndpointRefresh(target, normalizedMethod, params);\n }\n\n async balance(input: string, block: string) {\n const target = await this.resolveTarget();\n const currency = target.network.nativeCurrency;\n if (currency === undefined) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"Native currency metadata is unavailable for this Network.\",\n \"Ask the service administrator to configure the native currency, then run: zan evm networks --refresh. Use zan evm rpc eth_getBalance to query raw units.\",\n );\n }\n const normalizedBlock = parseBlock(block);\n const address = isEnsName(input)\n ? await this.options.ens.resolve(target.projectId, input)\n : parseAddress(input);\n const rawResult = await this.callWithEndpointRefresh(\n target,\n \"eth_getBalance\",\n [address, normalizedBlock],\n );\n const raw = parseRpcQuantity(rawResult);\n\n return {\n address,\n input,\n balance: formatUnits(\n raw,\n currency.decimals,\n ),\n raw: raw.toString(),\n symbol: currency.symbol,\n projectId: target.projectId,\n network: target.network.id,\n block: normalizedBlock,\n };\n }\n\n async transaction(hash: string) {\n const normalizedHash = parseTransactionHash(hash);\n return this.lookup(\n \"transaction\",\n \"eth_getTransactionByHash\",\n [normalizedHash],\n );\n }\n\n async receipt(hash: string) {\n const normalizedHash = parseTransactionHash(hash);\n return this.lookup(\n \"receipt\",\n \"eth_getTransactionReceipt\",\n [normalizedHash],\n );\n }\n\n async block(block: string) {\n const normalizedBlock = parseBlock(block);\n return this.lookup(\n \"block\",\n \"eth_getBlockByNumber\",\n [normalizedBlock, false],\n );\n }\n\n async gas() {\n const target = await this.resolveTarget();\n const gasPriceResult = await this.callWithEndpointRefresh(\n target,\n \"eth_gasPrice\",\n );\n const gasPrice = parseRpcQuantity(gasPriceResult);\n const result: Record<string, unknown> = {\n projectId: target.projectId,\n network: target.network.id,\n gasPrice: gasPriceResult,\n gasPriceGwei: formatGwei(gasPrice),\n };\n\n try {\n const priorityResult = await this.callWithEndpointRefresh(\n target,\n \"eth_maxPriorityFeePerGas\",\n );\n const priority = parseRpcQuantity(priorityResult);\n result.maxPriorityFeePerGas = priorityResult;\n result.maxPriorityFeePerGasGwei = formatGwei(priority);\n } catch (error) {\n if (\n !(error instanceof JsonRpcFailure) ||\n error.rpcCode !== -32601\n ) {\n throw error;\n }\n }\n return result;\n }\n\n async pendingTransactionCount(address: string): Promise<bigint> {\n const target = await this.resolveTarget();\n const result = await this.callWithEndpointRefresh(\n target,\n \"eth_getTransactionCount\",\n [parseAddress(address), \"pending\"],\n );\n return parseRpcQuantity(result);\n }\n\n async estimateGas(input: {\n from: string;\n to: string;\n value: bigint;\n data: string;\n }): Promise<bigint> {\n const target = await this.resolveTarget();\n const result = await this.callWithEndpointRefresh(\n target,\n \"eth_estimateGas\",\n [\n {\n from: parseAddress(input.from),\n to: parseAddress(input.to),\n value: `0x${input.value.toString(16)}`,\n data: input.data,\n },\n ],\n );\n return parseRpcQuantity(result);\n }\n\n async feeEstimate(): Promise<{\n gasPrice: bigint;\n maxPriorityFeePerGas: bigint | null;\n }> {\n const target = await this.resolveTarget();\n const gasPriceResult = await this.callWithEndpointRefresh(\n target,\n \"eth_gasPrice\",\n );\n const gasPrice = parseRpcQuantity(gasPriceResult);\n let maxPriorityFeePerGas: bigint | null = null;\n try {\n const priorityResult = await this.callWithEndpointRefresh(\n target,\n \"eth_maxPriorityFeePerGas\",\n );\n maxPriorityFeePerGas = parseRpcQuantity(priorityResult);\n } catch (error) {\n if (\n !(error instanceof JsonRpcFailure) ||\n error.rpcCode !== -32601\n ) {\n throw error;\n }\n }\n return { gasPrice, maxPriorityFeePerGas };\n }\n\n async selectedNetwork(): Promise<{ network: string; chainId: number }> {\n const target = await this.resolveTarget();\n return {\n network: target.network.id,\n chainId: Number(BigInt(target.network.chainId)),\n };\n }\n\n async logs(input: EvmLogFilter) {\n const target = await this.resolveTarget();\n const filter: EvmLogFilter = {\n fromBlock: parseBlock(input.fromBlock),\n toBlock: parseBlock(input.toBlock),\n ...(input.address === undefined\n ? {}\n : { address: parseAddress(input.address) }),\n ...(input.topics === undefined\n ? {}\n : { topics: input.topics.map(parseTopic) }),\n };\n const rpcResult = await this.callWithEndpointRefresh(\n target,\n \"eth_getLogs\",\n [filter],\n );\n if (!Array.isArray(rpcResult)) {\n throw malformedResult(\"log result\");\n }\n return {\n projectId: target.projectId,\n network: target.network.id,\n count: rpcResult.length,\n filter,\n logs: rpcResult,\n };\n }\n\n private async lookup(\n key: \"transaction\" | \"receipt\" | \"block\",\n method: string,\n params: unknown[],\n ): Promise<Record<string, unknown>> {\n const target = await this.resolveTarget();\n const rpcResult = await this.callWithEndpointRefresh(\n target,\n method,\n params,\n );\n if (rpcResult === null) {\n throw new CliFailure(\n \"NOT_FOUND\",\n `The requested ${key} was not found.`,\n );\n }\n const value = requireRecord(rpcResult, `${key} result`);\n return {\n projectId: target.projectId,\n network: target.network.id,\n [key]: value,\n };\n }\n\n private async resolveTarget(): Promise<QueryTarget> {\n const projectId = await this.options.projectService.activeId();\n const network = await this.options.networkSelector.resolve(\n projectId,\n );\n const endpoint = await this.options.endpointResolver.resolve(\n projectId,\n network.id,\n );\n return { projectId, network, endpoint };\n }\n\n private async callWithEndpointRefresh(\n target: QueryTarget,\n method: string,\n params: unknown[] = [],\n ): Promise<unknown> {\n try {\n return await this.options.rpc.call(target.endpoint, method, params);\n } catch (error) {\n if (!(error instanceof RpcEndpointRejected)) {\n throw error;\n }\n if (await this.options.endpointResolver.hasOverride(target.projectId)) {\n throw new CliFailure(\n \"RPC_ERROR\",\n error.message,\n \"Run: zan project rpc-key set or zan project rpc-key clear\",\n );\n }\n await this.options.endpointResolver.refresh(target.projectId);\n target.endpoint = await this.options.endpointResolver.resolve(\n target.projectId,\n target.network.id,\n );\n return this.options.rpc.call(target.endpoint, method, params);\n }\n }\n}\n","import { z } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { FetchLike } from \"../http/transport.js\";\nimport type { ResolvedEndpoint } from \"../networks/endpoint-resolver.js\";\nimport { JsonRpcFailure } from \"./json-rpc-failure.js\";\nimport { RpcEndpointRejected } from \"./rpc-endpoint-rejected.js\";\n\nconst rpcErrorSchema = z\n .object({\n jsonrpc: z.literal(\"2.0\"),\n id: z.number().int(),\n error: z\n .object({\n code: z.number().int(),\n message: z.string(),\n })\n .passthrough(),\n })\n .passthrough();\n\nconst rpcSuccessSchema = z\n .object({\n jsonrpc: z.literal(\"2.0\"),\n id: z.number().int(),\n result: z.unknown(),\n })\n .passthrough();\n\nexport interface JsonRpcClientOptions {\n requestTimeoutMs: number;\n signal: AbortSignal;\n fetch?: FetchLike;\n}\n\nfunction networkFailure(): CliFailure {\n return new CliFailure(\n \"NETWORK_ERROR\",\n \"The RPC request failed.\",\n \"Check your network connection and try again.\",\n );\n}\n\nfunction rpcFailure(message: string): CliFailure {\n return new CliFailure(\"RPC_ERROR\", message);\n}\n\nexport class JsonRpcClient {\n private readonly fetch: FetchLike;\n private nextId = 1;\n\n constructor(private readonly options: JsonRpcClientOptions) {\n this.fetch = options.fetch ?? globalThis.fetch;\n }\n\n async call(\n endpoint: ResolvedEndpoint,\n method: string,\n params: unknown[] = [],\n ): Promise<unknown> {\n const id = this.nextId;\n this.nextId += 1;\n const timeoutSignal = AbortSignal.timeout(\n this.options.requestTimeoutMs,\n );\n const signal = AbortSignal.any([\n this.options.signal,\n timeoutSignal,\n ]);\n\n let response: Response;\n try {\n response = await this.fetch(endpoint.httpsEndpoint, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n }),\n signal,\n });\n } catch {\n throw networkFailure();\n }\n\n if (response.status === 429) {\n throw new CliFailure(\n \"RATE_LIMITED\",\n \"The RPC endpoint rate limit was reached.\",\n \"Try again later.\",\n );\n }\n if (response.status === 401 || response.status === 403) {\n throw new RpcEndpointRejected();\n }\n if (response.status >= 500) {\n throw networkFailure();\n }\n if (!response.ok) {\n throw rpcFailure(\n `The RPC endpoint returned HTTP ${String(response.status)}.`,\n );\n }\n\n let body: unknown;\n try {\n body = JSON.parse(await response.text()) as unknown;\n } catch {\n throw rpcFailure(\"The RPC endpoint returned invalid JSON.\");\n }\n const success = rpcSuccessSchema.safeParse(body);\n const error = rpcErrorSchema.safeParse(body);\n if (\n success.success === error.success ||\n (success.success && success.data.id !== id) ||\n (error.success && error.data.id !== id)\n ) {\n throw rpcFailure(\n \"The RPC endpoint returned an invalid JSON-RPC response.\",\n );\n }\n if (error.success) {\n throw new JsonRpcFailure(\n error.data.error.code,\n error.data.error.message,\n );\n }\n return success.data?.result;\n }\n}\n","import {\n chmod as nodeChmod,\n lstat as nodeLstat,\n mkdir as nodeMkdir,\n open as nodeOpen,\n readFile as nodeReadFile,\n} from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { parseAllDocuments } from \"yaml\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport { FileLock } from \"../storage/file-lock.js\";\nimport { renderDefaultConfigYaml } from \"./rpc-allowlist-default.js\";\nimport { DEFAULT_HYPERLIQUID_INFO_METHODS } from \"../hyperliquid/info-allowlist-default.js\";\nimport {\n RPC_METHOD_MAX_LENGTH,\n RPC_METHOD_PATTERN,\n} from \"./rpc-input.js\";\n\nexport const RPC_ALLOWLIST_MAX_FILE_BYTES = 64 * 1024;\nexport const RPC_ALLOWLIST_MAX_METHODS = 256;\n\nconst CONFIG_DIRECTORY_NAME = \".zan-cli\";\nconst CONFIG_FILE_NAME = \"config.yaml\";\nconst DIRECTORY_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nexport interface RpcAllowlistFileHandle {\n writeFile(data: string, options: { encoding: \"utf8\" }): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface RpcAllowlistFileInfo {\n mode: number;\n size: number;\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n}\n\nexport interface RpcAllowlistFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): Promise<RpcAllowlistFileInfo>;\n mkdir(\n path: string,\n options: { recursive: true; mode: number },\n ): Promise<string | undefined>;\n open(\n path: string,\n flags: string,\n mode?: number,\n ): Promise<RpcAllowlistFileHandle>;\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n}\n\nexport const nodeRpcAllowlistFileSystem: RpcAllowlistFileSystem =\n Object.freeze({\n chmod: nodeChmod,\n lstat: nodeLstat,\n mkdir: nodeMkdir,\n open: nodeOpen,\n readFile: nodeReadFile,\n });\n\nexport interface RpcAllowlistStoreOptions {\n /** Operating-system user-home source. Never resolves ZAN_HOME. */\n home: () => string;\n platform?: NodeJS.Platform;\n fileSystem?: RpcAllowlistFileSystem;\n}\n\ninterface ParsedMethodAllowlists {\n rpc: Set<string>;\n hyperliquidInfo: Set<string>;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n try {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n Reflect.get(error, \"code\") === code\n );\n } catch {\n return false;\n }\n}\n\nfunction configFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"The RPC method allowlist configuration is invalid or unusable.\",\n \"Inspect ~/.zan-cli/config.yaml.\",\n );\n}\n\nfunction parseMethodList(value: unknown): Set<string> {\n if (\n !Array.isArray(value) ||\n value.length > RPC_ALLOWLIST_MAX_METHODS\n ) {\n throw configFailure();\n }\n const allowed = new Set<string>();\n for (const method of value) {\n if (\n typeof method !== \"string\" ||\n method.length === 0 ||\n method.length > RPC_METHOD_MAX_LENGTH ||\n !RPC_METHOD_PATTERN.test(method) ||\n allowed.has(method)\n ) {\n throw configFailure();\n }\n allowed.add(method);\n }\n return allowed;\n}\n\nfunction parseMethodAllowlists(document: string): ParsedMethodAllowlists {\n let documents;\n try {\n documents = parseAllDocuments(document, {\n uniqueKeys: true,\n version: \"1.2\",\n logLevel: \"silent\",\n });\n } catch {\n throw configFailure();\n }\n if (documents.length !== 1) {\n throw configFailure();\n }\n const [parsed] = documents;\n if (\n parsed === undefined ||\n parsed.errors.length > 0 ||\n parsed.warnings.length > 0\n ) {\n throw configFailure();\n }\n\n let value: unknown;\n try {\n value = parsed.toJS({ maxAliasCount: 0 });\n } catch {\n throw configFailure();\n }\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw configFailure();\n }\n const record = value as Record<string, unknown>;\n const keys = Object.keys(record);\n if (\n !Object.prototype.hasOwnProperty.call(record, \"allowedRpcMethods\") ||\n keys.some(\n (key) =>\n key !== \"allowedRpcMethods\" &&\n key !== \"allowedHyperliquidInfoMethods\",\n )\n ) {\n throw configFailure();\n }\n return {\n rpc: parseMethodList(record.allowedRpcMethods),\n hyperliquidInfo: Object.prototype.hasOwnProperty.call(\n record,\n \"allowedHyperliquidInfoMethods\",\n )\n ? parseMethodList(record.allowedHyperliquidInfoMethods)\n : new Set(DEFAULT_HYPERLIQUID_INFO_METHODS),\n };\n}\n\nexport function parseAllowedRpcMethods(document: string): Set<string> {\n return parseMethodAllowlists(document).rpc;\n}\n\nexport class RpcAllowlistStore {\n private readonly platform: NodeJS.Platform;\n private readonly fileSystem: RpcAllowlistFileSystem;\n private readonly home: () => string;\n\n constructor(options: RpcAllowlistStoreOptions) {\n this.home = options.home;\n this.platform = options.platform ?? process.platform;\n this.fileSystem = options.fileSystem ?? nodeRpcAllowlistFileSystem;\n }\n\n configPath(): string {\n const home = this.home();\n if (home.length === 0 || !isAbsolute(home)) {\n throw configFailure();\n }\n return join(home, CONFIG_DIRECTORY_NAME, CONFIG_FILE_NAME);\n }\n\n async load(): Promise<ReadonlySet<string>> {\n return (await this.loadAllowlists()).rpc;\n }\n\n async loadHyperliquidInfo(): Promise<ReadonlySet<string>> {\n return (await this.loadAllowlists()).hyperliquidInfo;\n }\n\n private async loadAllowlists(): Promise<ParsedMethodAllowlists> {\n const configPath = this.configPath();\n await this.ensureDirectory(configPath);\n const lock = new FileLock(`${configPath}.lock`, {\n platform: this.platform,\n });\n try {\n return await lock.withLock(() => this.loadLocked(configPath));\n } catch (error) {\n if (error instanceof CliFailure && error.code === \"SETUP_REQUIRED\") {\n throw error;\n }\n throw configFailure();\n }\n }\n\n private async ensureDirectory(configPath: string): Promise<void> {\n const directory = join(configPath, \"..\");\n try {\n const info = await this.fileSystem.lstat(directory);\n this.requireSafeDirectory(info);\n return;\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw configFailure();\n }\n }\n try {\n await this.fileSystem.mkdir(directory, {\n recursive: true,\n mode: DIRECTORY_MODE,\n });\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw configFailure();\n }\n }\n try {\n this.requireSafeDirectory(await this.fileSystem.lstat(directory));\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw configFailure();\n }\n }\n\n private requireSafeDirectory(info: RpcAllowlistFileInfo): void {\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw configFailure();\n }\n if (\n this.platform !== \"win32\" &&\n (info.mode & 0o777) !== DIRECTORY_MODE\n ) {\n throw configFailure();\n }\n }\n\n private requireSafeFile(info: RpcAllowlistFileInfo): void {\n if (info.isSymbolicLink() || !info.isFile()) {\n throw configFailure();\n }\n if (info.size > RPC_ALLOWLIST_MAX_FILE_BYTES) {\n throw configFailure();\n }\n if (\n this.platform !== \"win32\" &&\n (info.mode & 0o777) !== FILE_MODE\n ) {\n throw configFailure();\n }\n }\n\n private async loadLocked(\n configPath: string,\n ): Promise<ParsedMethodAllowlists> {\n let info: RpcAllowlistFileInfo;\n try {\n info = await this.fileSystem.lstat(configPath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return this.createDefault(configPath);\n }\n throw configFailure();\n }\n return this.readAndValidate(configPath, info);\n }\n\n private async createDefault(\n configPath: string,\n ): Promise<ParsedMethodAllowlists> {\n let handle: RpcAllowlistFileHandle | undefined;\n try {\n handle = await this.fileSystem.open(configPath, \"wx\", FILE_MODE);\n await handle.writeFile(renderDefaultConfigYaml(), {\n encoding: \"utf8\",\n });\n await handle.sync();\n await handle.close();\n handle = undefined;\n if (this.platform !== \"win32\") {\n await this.fileSystem.chmod(configPath, FILE_MODE);\n }\n } catch (error) {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n if (hasErrorCode(error, \"EEXIST\")) {\n // Lost a creation race: read the winner's file.\n try {\n return await this.readAndValidate(\n configPath,\n await this.fileSystem.lstat(configPath),\n );\n } catch (readError) {\n if (readError instanceof CliFailure) {\n throw readError;\n }\n throw configFailure();\n }\n }\n throw configFailure();\n }\n return parseMethodAllowlists(renderDefaultConfigYaml());\n }\n\n private async readAndValidate(\n configPath: string,\n info: RpcAllowlistFileInfo,\n ): Promise<ParsedMethodAllowlists> {\n this.requireSafeFile(info);\n let document: string;\n try {\n document = await this.fileSystem.readFile(configPath, \"utf8\");\n } catch {\n throw configFailure();\n }\n if (Buffer.byteLength(document, \"utf8\") > RPC_ALLOWLIST_MAX_FILE_BYTES) {\n throw configFailure();\n }\n return parseMethodAllowlists(document);\n }\n}\n","// Snapshot of the read-only Hyperliquid /info request types documented by\n// ZAN as of 2026-09-07. Source: https://docs.zan.top/llms.txt and\n// https://docs.zan.top/docs/new-credit-costs.md\nexport const DEFAULT_HYPERLIQUID_INFO_METHODS: readonly string[] =\n Object.freeze([\n \"activeAssetData\",\n \"alignedQuoteTokenInfo\",\n \"allBorrowLendReserveStates\",\n \"allMids\",\n \"allPerpMetas\",\n \"approvedBuilders\",\n \"batchClearinghouseStates\",\n \"borrowLendReserveState\",\n \"borrowLendUserState\",\n \"candleSnapshot\",\n \"clearinghouseState\",\n \"delegations\",\n \"delegatorHistory\",\n \"delegatorRewards\",\n \"delegatorSummary\",\n \"exchangeStatus\",\n \"extraAgents\",\n \"frontendOpenOrders\",\n \"fundingHistory\",\n \"gossipPriorityAuctionStatus\",\n \"gossipRootIps\",\n \"historicalOrders\",\n \"isVip\",\n \"l2Book\",\n \"leadingVaults\",\n \"legalCheck\",\n \"liquidatable\",\n \"marginTable\",\n \"maxBuilderFee\",\n \"maxMarketOrderNtls\",\n \"meta\",\n \"metaAndAssetCtxs\",\n \"openOrders\",\n \"orderStatus\",\n \"outcomeMeta\",\n \"perpAnnotation\",\n \"perpCategories\",\n \"perpConciseAnnotations\",\n \"perpDeployAuctionStatus\",\n \"perpDexLimits\",\n \"perpDexStatus\",\n \"perpDexs\",\n \"perpsAtOpenInterestCap\",\n \"portfolio\",\n \"preTransferCheck\",\n \"predictedFundings\",\n \"recentTrades\",\n \"referral\",\n \"settledOutcome\",\n \"spotClearinghouseState\",\n \"spotDeployState\",\n \"spotMeta\",\n \"spotMetaAndAssetCtxs\",\n \"spotPairDeployAuctionStatus\",\n \"subAccounts\",\n \"subAccounts2\",\n \"tokenDetails\",\n \"twapHistory\",\n \"userAbstraction\",\n \"userBorrowLendInterest\",\n \"userDexAbstraction\",\n \"userFees\",\n \"userFills\",\n \"userFillsByTime\",\n \"userFunding\",\n \"userNonFundingLedgerUpdates\",\n \"userRateLimit\",\n \"userRole\",\n \"userToMultiSigSigners\",\n \"userTwapSliceFills\",\n \"userTwapSliceFillsByTime\",\n \"userVaultEquities\",\n \"validatorL1Votes\",\n \"validatorSummaries\",\n \"vaultDetails\",\n \"vaultSummaries\",\n \"webData2\",\n \"webData3\",\n ]);\n","// Snapshot of every read-only, simulation, diagnostic, and filter JSON-RPC\n// method documented by ZAN as of 2026-09-03 that the Raw RPC transport can\n// express (one selected EVM Network HTTPS Endpoint, JSON-RPC 2.0, array\n// params). Sources: https://docs.zan.top/llms.txt and\n// https://docs.zan.top/docs/new-credit-costs.md\nimport { DEFAULT_HYPERLIQUID_INFO_METHODS } from \"../hyperliquid/info-allowlist-default.js\";\n\nexport const DEFAULT_ALLOWED_RPC_METHODS: readonly string[] = Object.freeze([\n \"bor_getAuthor\",\n \"bor_getCurrentProposer\",\n \"bor_getCurrentValidators\",\n \"bor_getRootHash\",\n \"dag_getEvent\",\n \"dag_getEventPayload\",\n \"dag_getHeads\",\n \"debug_executionWitness\",\n \"debug_getRawBlock\",\n \"debug_getRawHeader\",\n \"debug_getRawReceipts\",\n \"debug_getRawTransaction\",\n \"debug_traceBlockByHash\",\n \"debug_traceBlockByNumber\",\n \"debug_traceCall\",\n \"debug_traceTransaction\",\n \"erigon_blockNumber\",\n \"erigon_forks\",\n \"erigon_getBlockByTimestamp\",\n \"erigon_getBlockReceiptsByBlockHash\",\n \"erigon_getHeaderByHash\",\n \"eth_accounts\",\n \"eth_baseFee\",\n \"eth_bigBlockGasPrice\",\n \"eth_blockNumber\",\n \"eth_call\",\n \"eth_chainId\",\n \"eth_createAccessList\",\n \"eth_estimateGas\",\n \"eth_feeHistory\",\n \"eth_gasPrice\",\n \"eth_getAccount\",\n \"eth_getAssetBalance\",\n \"eth_getBalance\",\n \"eth_getBlockByHash\",\n \"eth_getBlockByNumber\",\n \"eth_getBlockRange\",\n \"eth_getBlockReceipts\",\n \"eth_getBlockTransactionCountByHash\",\n \"eth_getBlockTransactionCountByNumber\",\n \"eth_getChainConfig\",\n \"eth_getCode\",\n \"eth_getCompilers\",\n \"eth_getFilterChanges\",\n \"eth_getFilterLogs\",\n \"eth_getLogs\",\n \"eth_getProof\",\n \"eth_getStorageAt\",\n \"eth_getSystemTxsByBlockHash\",\n \"eth_getSystemTxsByBlockNumber\",\n \"eth_getTransactionByBlockHashAndIndex\",\n \"eth_getTransactionByBlockNumberAndIndex\",\n \"eth_getTransactionByHash\",\n \"eth_getTransactionCount\",\n \"eth_getTransactionReceipt\",\n \"eth_getTransactionReceiptsByBlock\",\n \"eth_getUncleByBlockHashAndIndex\",\n \"eth_getUncleByBlockNumberAndIndex\",\n \"eth_getUncleCountByBlockHash\",\n \"eth_getUncleCountByBlockNumber\",\n \"eth_getWork\",\n \"eth_maxPriorityFeePerGas\",\n \"eth_newBlockFilter\",\n \"eth_newFilter\",\n \"eth_newPendingTransactionFilter\",\n \"eth_protocolVersion\",\n \"eth_syncing\",\n \"eth_uninstallFilter\",\n \"eth_usingBigBlocks\",\n \"ftm_currentEpoch\",\n \"hl_getBatchBlocks\",\n \"hl_getBlock\",\n \"hl_getLatestBlockNumber\",\n \"hl_getLatestBlocks\",\n \"net_listening\",\n \"net_version\",\n \"rollup_gasPrices\",\n \"rollup_getInfo\",\n \"trace_block\",\n \"trace_call\",\n \"trace_callMany\",\n \"trace_filter\",\n \"trace_replayBlockTransactions\",\n \"trace_replayTransaction\",\n \"trace_transaction\",\n \"txpool_content\",\n \"web3_clientVersion\",\n \"web3_sha3\",\n \"zkevm_batchNumber\",\n \"zkevm_batchNumberByBlockNumber\",\n \"zkevm_consolidatedBlockNumber\",\n \"zkevm_getBatchByNumber\",\n \"zkevm_isBlockConsolidated\",\n \"zkevm_isBlockVirtualized\",\n \"zkevm_verifiedBatchNumber\",\n \"zkevm_virtualBatchNumber\",\n \"zks_L1BatchNumber\",\n \"zks_L1ChainId\",\n \"zks_estimateFee\",\n \"zks_estimateGasL1ToL2\",\n \"zks_getAllAccountBalances\",\n \"zks_getBlockDetails\",\n \"zks_getBridgeContracts\",\n \"zks_getBytecodeByHash\",\n \"zks_getL1BatchBlockRange\",\n \"zks_getL1BatchDetails\",\n \"zks_getL2ToL1LogProof\",\n \"zks_getL2ToL1MsgProof\",\n \"zks_getMainContract\",\n \"zks_getProof\",\n \"zks_getRawBlockTransactions\",\n \"zks_getTestnetPaymaster\",\n \"zks_getTransactionDetails\",\n]);\n\nexport function renderDefaultConfigYaml(): string {\n const header = [\n \"# ZAN CLI user RPC method allowlist for: zan evm rpc\",\n \"# Entries are exact, case-sensitive JSON-RPC method names. An empty list\",\n \"# denies every Raw RPC method. Edit this file to add or remove methods;\",\n \"# changes apply on the next zan evm rpc invocation.\",\n \"# Adding state-changing methods (for example eth_sendRawTransaction,\",\n \"# personal_*, or admin_*) authorizes this CLI to dispatch them without\",\n \"# method-specific safety validation or confirmation.\",\n ];\n const entries = DEFAULT_ALLOWED_RPC_METHODS.map(\n (method) => ` - ${method}`,\n );\n const infoEntries = DEFAULT_HYPERLIQUID_INFO_METHODS.map(\n (method) => ` - ${method}`,\n );\n return `${[\n ...header,\n \"allowedRpcMethods:\",\n ...entries,\n \"\",\n \"# Hyperliquid /info read methods. An empty list denies all Info calls.\",\n \"allowedHyperliquidInfoMethods:\",\n ...infoEntries,\n ].join(\"\\n\")}\\n`;\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport interface RpcAllowlistSource {\n load(): Promise<ReadonlySet<string>>;\n}\n\n/**\n * Exact-match Raw RPC method policy backed by the user-editable\n * ~/.zan-cli/config.yaml allowlist.\n */\nexport class RpcMethodPolicy {\n constructor(private readonly allowlist: RpcAllowlistSource) {}\n\n async requireAllowed(method: string): Promise<void> {\n const allowed = await this.allowlist.load();\n if (!allowed.has(method)) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The RPC method is not allowed by the user allowlist.\",\n \"Add it to allowedRpcMethods in ~/.zan-cli/config.yaml or choose an allowed method.\",\n );\n }\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport { RpcEndpointRejected } from \"../evm/rpc-endpoint-rejected.js\";\nimport type { FetchLike } from \"../http/transport.js\";\nimport type { ResolvedEndpoint } from \"../networks/endpoint-resolver.js\";\nimport type { HyperliquidInfoPayload } from \"./info-input.js\";\n\nexport interface HyperliquidInfoClientOptions {\n requestTimeoutMs: number;\n signal: AbortSignal;\n fetch?: FetchLike;\n}\n\nfunction unsupportedEndpoint(): CliFailure {\n return new CliFailure(\n \"NETWORK_NOT_AVAILABLE\",\n \"The selected Hyperliquid Network does not provide a supported Info endpoint.\",\n \"Refresh Networks and select a supported Hyperliquid Network.\",\n );\n}\n\nfunction networkFailure(): CliFailure {\n return new CliFailure(\n \"NETWORK_ERROR\",\n \"The Hyperliquid Info request failed.\",\n \"Check your network connection and try again.\",\n );\n}\n\nfunction responseFailure(message: string): CliFailure {\n return new CliFailure(\"RPC_ERROR\", message);\n}\n\nfunction deriveInfoEndpoint(endpoint: ResolvedEndpoint): URL {\n const url = new URL(endpoint.httpsEndpoint);\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (\n endpoint.network.family !== \"evm\" ||\n endpoint.network.ecosystem !== \"hyperliquid\" ||\n url.protocol !== \"https:\" ||\n url.hostname !== \"api.zan.top\" ||\n url.port.length > 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0 ||\n segments.length !== 6 ||\n url.pathname !== `/${segments.join(\"/\")}` ||\n segments[0] !== \"node\" ||\n segments[1] !== \"v1\" ||\n segments[2] !== \"hyperliquid\" ||\n segments[3] !== endpoint.network.network ||\n segments[4]?.length === 0 ||\n segments[5] !== \"evm\"\n ) {\n throw unsupportedEndpoint();\n }\n segments[5] = \"info\";\n url.pathname = `/${segments.join(\"/\")}`;\n return url;\n}\n\nexport class HyperliquidInfoClient {\n private readonly fetch: FetchLike;\n\n constructor(private readonly options: HyperliquidInfoClientOptions) {\n this.fetch = options.fetch ?? globalThis.fetch;\n }\n\n async call(\n endpoint: ResolvedEndpoint,\n method: string,\n payload: HyperliquidInfoPayload,\n ): Promise<unknown> {\n const url = deriveInfoEndpoint(endpoint);\n const signal = AbortSignal.any([\n this.options.signal,\n AbortSignal.timeout(this.options.requestTimeoutMs),\n ]);\n let response: Response;\n try {\n response = await this.fetch(url, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ type: method, ...payload }),\n signal,\n });\n } catch {\n throw networkFailure();\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new RpcEndpointRejected();\n }\n if (response.status === 429) {\n throw new CliFailure(\n \"RATE_LIMITED\",\n \"The Hyperliquid Info endpoint rate limit was reached.\",\n \"Try again later.\",\n );\n }\n if (response.status >= 500) {\n throw networkFailure();\n }\n if (!response.ok) {\n throw responseFailure(\n `The Hyperliquid Info endpoint returned HTTP ${String(response.status)}.`,\n );\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch {\n throw networkFailure();\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw responseFailure(\n \"The Hyperliquid Info endpoint returned invalid JSON.\",\n );\n }\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport interface HyperliquidInfoAllowlistSource {\n loadHyperliquidInfo(): Promise<ReadonlySet<string>>;\n}\n\nexport class HyperliquidInfoMethodPolicy {\n constructor(private readonly source: HyperliquidInfoAllowlistSource) {}\n\n async requireAllowed(method: string): Promise<void> {\n const allowed = await this.source.loadHyperliquidInfo();\n if (!allowed.has(method)) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The Hyperliquid Info method is not allowed by the user allowlist.\",\n \"Add it to allowedHyperliquidInfoMethods in ~/.zan-cli/config.yaml or choose an allowed method.\",\n );\n }\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport { RpcEndpointRejected } from \"../evm/rpc-endpoint-rejected.js\";\nimport type { ResolvedEndpoint } from \"../networks/endpoint-resolver.js\";\nimport type { PublicNetwork } from \"../projects/project-types.js\";\nimport type { HyperliquidInfoPayload } from \"./info-input.js\";\nimport { parseInfoMethod } from \"./info-input.js\";\n\nexport interface HyperliquidInfoServiceOptions {\n projectService: {\n activeId(): Promise<string>;\n };\n networkSelector: {\n resolve(projectId: string): Promise<PublicNetwork>;\n };\n endpointResolver: {\n resolve(projectId: string, networkId: string): Promise<ResolvedEndpoint>;\n refresh(projectId: string): Promise<unknown>;\n hasOverride(projectId: string): Promise<boolean>;\n };\n client: {\n call(\n endpoint: ResolvedEndpoint,\n method: string,\n payload: HyperliquidInfoPayload,\n ): Promise<unknown>;\n };\n policy: {\n requireAllowed(method: string): Promise<void>;\n };\n}\n\ninterface HyperliquidInfoTarget {\n projectId: string;\n network: PublicNetwork;\n endpoint: ResolvedEndpoint;\n}\n\nfunction requireHyperliquid(network: PublicNetwork): void {\n if (network.family !== \"evm\" || network.ecosystem !== \"hyperliquid\") {\n throw new CliFailure(\n \"NETWORK_NOT_AVAILABLE\",\n \"The selected Network is not a Hyperliquid Network.\",\n \"Select a Hyperliquid Network and try again.\",\n );\n }\n}\n\nexport class HyperliquidInfoService {\n constructor(private readonly options: HyperliquidInfoServiceOptions) {}\n\n async info(\n method: string,\n payload: HyperliquidInfoPayload,\n ): Promise<unknown> {\n const normalizedMethod = parseInfoMethod(method);\n await this.options.policy.requireAllowed(normalizedMethod);\n const target = await this.resolveTarget();\n try {\n return await this.options.client.call(\n target.endpoint,\n normalizedMethod,\n payload,\n );\n } catch (error) {\n if (!(error instanceof RpcEndpointRejected)) {\n throw error;\n }\n if (await this.options.endpointResolver.hasOverride(target.projectId)) {\n throw new CliFailure(\n \"RPC_ERROR\",\n error.message,\n \"Run: zan project rpc-key set or zan project rpc-key clear\",\n );\n }\n await this.options.endpointResolver.refresh(target.projectId);\n const refreshed = await this.options.endpointResolver.resolve(\n target.projectId,\n target.network.id,\n );\n return this.options.client.call(\n refreshed,\n normalizedMethod,\n payload,\n );\n }\n }\n\n private async resolveTarget(): Promise<HyperliquidInfoTarget> {\n const projectId = await this.options.projectService.activeId();\n const network = await this.options.networkSelector.resolve(projectId);\n requireHyperliquid(network);\n const endpoint = await this.options.endpointResolver.resolve(\n projectId,\n network.id,\n );\n return { projectId, network, endpoint };\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface HttpRequest {\n method: HttpMethod;\n path: string;\n headers?: HeadersInit;\n body?: BodyInit;\n signal?: AbortSignal;\n}\n\nexport interface HttpResponse {\n status: number;\n headers: Headers;\n body: unknown;\n}\n\nexport type FetchLike = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n baseUrl: URL;\n requestTimeoutMs: number;\n version: string;\n platform: string;\n fetch?: FetchLike;\n createRequestId?: () => string;\n}\n\nfunction networkFailure(): CliFailure {\n return new CliFailure(\n \"NETWORK_ERROR\",\n \"A network request failed.\",\n \"Check your network connection and try again.\",\n );\n}\n\nexport class HttpTransport {\n private readonly baseUrl: URL;\n private readonly requestTimeoutMs: number;\n private readonly version: string;\n private readonly platform: string;\n private readonly fetch: FetchLike;\n private readonly createRequestId: () => string;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = new URL(options.baseUrl);\n this.requestTimeoutMs = options.requestTimeoutMs;\n this.version = options.version;\n this.platform = options.platform;\n this.fetch = options.fetch ?? globalThis.fetch;\n this.createRequestId = options.createRequestId ?? randomUUID;\n }\n\n async request(request: HttpRequest): Promise<HttpResponse> {\n const url = new URL(request.path, this.baseUrl);\n if (url.origin !== this.baseUrl.origin) {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"The request target is outside the configured ZAN service.\",\n );\n }\n\n const timeoutSignal = AbortSignal.timeout(this.requestTimeoutMs);\n const signal =\n request.signal === undefined\n ? timeoutSignal\n : AbortSignal.any([request.signal, timeoutSignal]);\n const headers = new Headers(request.headers);\n headers.set(\"X-ZAN-CLI-Version\", this.version);\n headers.set(\"X-ZAN-CLI-Platform\", this.platform);\n headers.set(\"X-Request-ID\", this.createRequestId());\n\n let response: Response;\n try {\n response = await this.fetch(url, {\n method: request.method,\n headers,\n ...(request.body === undefined ? {} : { body: request.body }),\n signal,\n });\n } catch {\n throw networkFailure();\n }\n\n let body: unknown = null;\n let text: string;\n try {\n text = await response.text();\n } catch {\n throw networkFailure();\n }\n if (text.length > 0) {\n try {\n body = JSON.parse(text);\n } catch {\n body = null;\n }\n }\n\n return {\n status: response.status,\n headers: response.headers,\n body,\n };\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport {\n toPublicNetwork,\n type Network,\n type PublicNetwork,\n} from \"../projects/project-types.js\";\nimport type { EndpointCacheStatus } from \"../projects/endpoint-cache-store.js\";\n\nexport interface NetworkCatalog {\n list(projectId: string): Promise<Network[]>;\n refresh(projectId: string): Promise<Network[]>;\n status(projectId: string): Promise<EndpointCacheStatus>;\n clear(projectId: string): Promise<void>;\n hasOverride(projectId: string): Promise<boolean>;\n applyOverride(projectId: string, network: Network): Promise<Network>;\n setOverride(projectId: string, key: string): Promise<void>;\n clearOverride(projectId: string): Promise<void>;\n effectiveApiKey(projectId: string): Promise<string>;\n}\n\nexport interface ResolvedEndpoint {\n projectId: string;\n network: PublicNetwork;\n httpsEndpoint: URL;\n}\n\nexport class EndpointResolver {\n constructor(private readonly catalog: NetworkCatalog) {}\n\n async list(\n projectId: string,\n search?: string,\n ): Promise<PublicNetwork[]> {\n const networks = await this.catalog.list(projectId);\n const term = search?.trim().toLowerCase();\n return networks\n .filter(\n (network) =>\n term === undefined ||\n term.length === 0 ||\n network.id.toLowerCase().includes(term) ||\n network.name.toLowerCase().includes(term) ||\n network.ecosystem.toLowerCase().includes(term),\n )\n .map(toPublicNetwork);\n }\n\n async resolve(\n projectId: string,\n networkId: string,\n ): Promise<ResolvedEndpoint> {\n const networks = await this.catalog.list(projectId);\n const selected = networks.find(\n (candidate) => candidate.id === networkId,\n );\n if (selected === undefined) {\n throw new CliFailure(\n \"NETWORK_NOT_AVAILABLE\",\n \"The requested Network is not available for this Project.\",\n \"Run: zan evm networks\",\n );\n }\n const network = await this.catalog.applyOverride(projectId, selected);\n return {\n projectId,\n network: toPublicNetwork(network),\n httpsEndpoint: new URL(network.endpoints.https),\n };\n }\n\n refresh(projectId: string): Promise<Network[]> {\n return this.catalog.refresh(projectId);\n }\n\n status(projectId: string): Promise<EndpointCacheStatus> {\n return this.catalog.status(projectId);\n }\n\n clear(projectId: string): Promise<void> {\n return this.catalog.clear(projectId);\n }\n\n hasOverride(projectId: string): Promise<boolean> {\n return this.catalog.hasOverride(projectId);\n }\n\n setOverride(projectId: string, key: string): Promise<void> {\n return this.catalog.setOverride(projectId, key);\n }\n\n clearOverride(projectId: string): Promise<void> {\n return this.catalog.clearOverride(projectId);\n }\n\n effectiveApiKey(projectId: string): Promise<string> {\n return this.catalog.effectiveApiKey(projectId);\n }\n}\n","export interface ResolutionSources<T> {\n cli?: T;\n env?: T;\n stored?: T;\n}\n\nexport function resolveValue<T>(\n sources: ResolutionSources<T>,\n): T | undefined {\n if (sources.cli !== undefined) {\n return sources.cli;\n }\n if (sources.env !== undefined) {\n return sources.env;\n }\n return sources.stored;\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport type { PublicNetwork } from \"../projects/project-types.js\";\nimport { resolveValue } from \"../settings/resolution.js\";\nimport type { NetworkPrompt } from \"./network-prompt.js\";\n\nexport interface NetworkSelection {\n cli?: string;\n env?: string;\n stored?: string;\n interactive: boolean;\n isTTY: boolean;\n}\n\nexport interface NetworkSelectorOptions {\n listNetworks(projectId: string): Promise<PublicNetwork[]>;\n setNetwork(networkId: string): Promise<void>;\n prompt: NetworkPrompt;\n}\n\nfunction missingSelection(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"A ZAN Network must be selected.\",\n \"Run: zan settings set network <network-id>\",\n );\n}\n\nfunction invalidSelection(): CliFailure {\n return new CliFailure(\n \"INVALID_ARGS\",\n \"A valid Network selection is required.\",\n );\n}\n\nexport class NetworkSelector {\n constructor(private readonly options: NetworkSelectorOptions) {}\n\n async resolve(\n projectId: string,\n selection: NetworkSelection,\n ): Promise<PublicNetwork> {\n const selected = resolveValue({\n ...(selection.cli === undefined\n ? {}\n : { cli: selection.cli }),\n ...(selection.env === undefined\n ? {}\n : { env: selection.env }),\n ...(selection.stored === undefined\n ? {}\n : { stored: selection.stored }),\n });\n if (selected === undefined) {\n if (!selection.interactive || !selection.isTTY) {\n throw missingSelection();\n }\n return this.resolveInteractive(projectId);\n }\n\n const networks = await this.options.listNetworks(projectId);\n const network = networks.find(\n (candidate) => candidate.id === selected,\n );\n if (network === undefined) {\n throw new CliFailure(\n \"NETWORK_NOT_AVAILABLE\",\n \"The requested Network is not available for this Project.\",\n \"Run: zan evm networks\",\n );\n }\n return network;\n }\n\n private async resolveInteractive(\n projectId: string,\n ): Promise<PublicNetwork> {\n const networks = await this.options.listNetworks(projectId);\n if (networks.length === 0) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"No ZAN Networks are available for this Project.\",\n \"Run: zan evm networks\",\n );\n }\n const answer = (await this.options.prompt.ask(networks))?.trim();\n if (answer === undefined || !/^[1-9]\\d*$/u.test(answer)) {\n throw invalidSelection();\n }\n const network = networks[Number(answer) - 1];\n if (network === undefined) {\n throw invalidSelection();\n }\n\n await this.options.setNetwork(network.id);\n return network;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n chmod as nodeChmod,\n lstat as nodeLstat,\n open as nodeOpen,\n readFile as nodeReadFile,\n rename as nodeRename,\n unlink as nodeUnlink,\n} from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport { FileLock } from \"../storage/file-lock.js\";\nimport { rpcApiKeySchema } from \"./rpc-key-prompt.js\";\n\nconst API_KEY_ASSIGNMENT =\n /^[ \\t]*(?:export[ \\t]+)?ZAN_API_KEY[ \\t]*=/u;\n\nfunction unsafeKeyFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"A safe RPC API Key could not be obtained for the active Project.\",\n \"Run: zan evm networks --refresh, or configure or clear the RPC API Key override.\",\n );\n}\n\nfunction unsafeDotenvPathFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"The .env destination or lock path is unsafe.\",\n \"Inspect .env and .env.zan.lock, then retry.\",\n );\n}\n\nfunction dotenvWriteFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"Unable to update .env.\",\n \"Check the current directory permissions and retry.\",\n );\n}\n\nfunction uncertainDotenvUpdateFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The .env update may have been applied, but durability or lock cleanup could not be confirmed.\",\n \"Inspect .env and retry. If no ZAN CLI process is running, remove .env.zan.lock before retrying.\",\n );\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n try {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n Reflect.get(error, \"code\") === code\n );\n } catch {\n return false;\n }\n}\n\nclass UnsafeDotenvPathError extends Error {}\n\nexport interface DotenvApiKeyFileHandle {\n writeFile(data: string, options: { encoding: \"utf8\" }): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface DotenvApiKeyFileInfo {\n mode: number;\n isFile(): boolean;\n isSymbolicLink(): boolean;\n}\n\nexport interface DotenvApiKeyFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): Promise<DotenvApiKeyFileInfo>;\n open(\n path: string,\n flags: string,\n mode?: number,\n ): Promise<DotenvApiKeyFileHandle>;\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport const nodeDotenvApiKeyFileSystem: DotenvApiKeyFileSystem =\n Object.freeze({\n chmod: nodeChmod,\n lstat: nodeLstat,\n open: nodeOpen,\n readFile: nodeReadFile,\n rename: nodeRename,\n unlink: nodeUnlink,\n });\n\nexport interface DotenvApiKeyWriterOptions {\n directory: string;\n platform?: NodeJS.Platform;\n fileSystem?: DotenvApiKeyFileSystem;\n createTemporaryId?: () => string;\n}\n\nexport interface DotenvApiKeyWriterContract {\n write(key: string): Promise<void>;\n}\n\nexport function updateApiKeyAssignment(\n current: string,\n key: string,\n): string {\n const parsed = rpcApiKeySchema.safeParse(key);\n if (!parsed.success) {\n throw unsafeKeyFailure();\n }\n\n const firstLf = current.indexOf(\"\\n\");\n const newline =\n firstLf > 0 && current[firstLf - 1] === \"\\r\" ? \"\\r\\n\" : \"\\n\";\n const lines =\n current.length === 0\n ? []\n : current.replace(/\\r\\n/gu, \"\\n\").split(\"\\n\");\n while (lines.at(-1) === \"\") {\n lines.pop();\n }\n\n let replaced = false;\n const output: string[] = [];\n for (const line of lines) {\n if (!API_KEY_ASSIGNMENT.test(line)) {\n output.push(line);\n } else if (!replaced) {\n output.push(`ZAN_API_KEY=${parsed.data}`);\n replaced = true;\n }\n }\n if (!replaced) {\n output.push(`ZAN_API_KEY=${parsed.data}`);\n }\n return `${output.join(newline)}${newline}`;\n}\n\nexport class DotenvApiKeyWriter implements DotenvApiKeyWriterContract {\n private readonly platform: NodeJS.Platform;\n private readonly fileSystem: DotenvApiKeyFileSystem;\n private readonly createTemporaryId: () => string;\n\n constructor(private readonly options: DotenvApiKeyWriterOptions) {\n this.platform = options.platform ?? process.platform;\n this.fileSystem =\n options.fileSystem ?? nodeDotenvApiKeyFileSystem;\n this.createTemporaryId = options.createTemporaryId ?? randomUUID;\n }\n\n async write(key: string): Promise<void> {\n const parsed = rpcApiKeySchema.safeParse(key);\n if (!parsed.success) {\n throw unsafeKeyFailure();\n }\n if (!isAbsolute(this.options.directory)) {\n throw unsafeDotenvPathFailure();\n }\n\n const lockPath = join(this.options.directory, \".env.zan.lock\");\n let renamed = false;\n try {\n await this.assertSafeOptionalPath(lockPath);\n const lock = new FileLock(lockPath, {\n platform: this.platform,\n });\n await lock.withLock(async () => {\n const current = await this.readExistingFile();\n const next = updateApiKeyAssignment(current, parsed.data);\n await this.replaceAtomically(next, () => {\n renamed = true;\n });\n });\n } catch (error) {\n if (error instanceof UnsafeDotenvPathError) {\n throw unsafeDotenvPathFailure();\n }\n if (renamed) {\n throw uncertainDotenvUpdateFailure();\n }\n throw dotenvWriteFailure();\n }\n }\n\n private async assertSafeOptionalPath(path: string): Promise<void> {\n try {\n const info = await this.fileSystem.lstat(path);\n if (info.isSymbolicLink() || !info.isFile()) {\n throw new UnsafeDotenvPathError();\n }\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n }\n\n private async readExistingFile(): Promise<string> {\n const filename = join(this.options.directory, \".env\");\n await this.assertSafeOptionalPath(filename);\n try {\n return await this.fileSystem.readFile(filename, \"utf8\");\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n private async replaceAtomically(\n content: string,\n onRenamed: () => void,\n ): Promise<void> {\n const filename = join(this.options.directory, \".env\");\n const temporaryFile = join(\n this.options.directory,\n `.env.${process.pid}.${this.createTemporaryId()}.tmp`,\n );\n let handle: DotenvApiKeyFileHandle | undefined;\n let moved = false;\n try {\n handle = await this.fileSystem.open(temporaryFile, \"wx\", 0o600);\n await handle.writeFile(content, { encoding: \"utf8\" });\n await handle.sync();\n await handle.close();\n handle = undefined;\n if (this.platform !== \"win32\") {\n await this.fileSystem.chmod(temporaryFile, 0o600);\n }\n await this.fileSystem.rename(temporaryFile, filename);\n moved = true;\n onRenamed();\n await this.syncDirectory();\n } finally {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n if (!moved) {\n try {\n await this.fileSystem.unlink(temporaryFile);\n } catch {}\n }\n }\n }\n\n private async syncDirectory(): Promise<void> {\n if (this.platform === \"win32\") {\n return;\n }\n let handle: DotenvApiKeyFileHandle | undefined;\n try {\n handle = await this.fileSystem.open(this.options.directory, \"r\");\n await handle.sync();\n } catch (error) {\n if (\n !hasErrorCode(error, \"EINVAL\") &&\n !hasErrorCode(error, \"ENOTSUP\") &&\n !hasErrorCode(error, \"EISDIR\") &&\n !hasErrorCode(error, \"EPERM\")\n ) {\n throw error;\n }\n } finally {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n }\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport {\n createCipheriv,\n createDecipheriv,\n randomBytes as nodeRandomBytes,\n} from \"node:crypto\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { CliEnvironment } from \"../runtime/config.js\";\nimport type { Network } from \"./project-types.js\";\nimport {\n endpointCacheEnvelopeSchema,\n endpointCachePlaintextSchema,\n type EndpointCacheEnvelope,\n} from \"./endpoint-cache-schema.js\";\n\nconst KEY_BYTES = 32;\nconst NONCE_BYTES = 12;\nconst TAG_BYTES = 16;\n\nexport interface EndpointCacheCryptoOptions {\n randomBytes?: (size: number) => Buffer;\n}\n\nexport interface EncryptEndpointCacheInput {\n environment: CliEnvironment;\n projectId: string;\n networks: unknown[];\n key: Buffer;\n fetchedAt: string;\n}\n\nexport interface DecryptEndpointCacheInput {\n envelope: unknown;\n environment: CliEnvironment;\n projectId: string;\n key: Buffer;\n}\n\nfunction cacheFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The encrypted Endpoint cache is invalid.\",\n \"Run: zan evm networks --refresh\",\n );\n}\n\nfunction requireKey(key: Buffer): Buffer {\n if (key.length !== KEY_BYTES) {\n throw cacheFailure();\n }\n return key;\n}\n\nfunction aad(\n environment: CliEnvironment,\n projectId: string,\n): Buffer {\n return Buffer.from(\n JSON.stringify({ schemaVersion: 1, environment, projectId }),\n \"utf8\",\n );\n}\n\nexport class EndpointCacheCrypto {\n private readonly randomBytes: (size: number) => Buffer;\n\n constructor(options: EndpointCacheCryptoOptions = {}) {\n this.randomBytes = options.randomBytes ?? nodeRandomBytes;\n }\n\n generateKey(): Buffer {\n const key = this.randomBytes(KEY_BYTES);\n return Buffer.from(requireKey(key));\n }\n\n encrypt(input: EncryptEndpointCacheInput): EndpointCacheEnvelope {\n try {\n const key = requireKey(input.key);\n const plaintext = endpointCachePlaintextSchema.parse({\n networks: input.networks,\n });\n const nonce = this.randomBytes(NONCE_BYTES);\n if (nonce.length !== NONCE_BYTES) {\n throw cacheFailure();\n }\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce, {\n authTagLength: TAG_BYTES,\n });\n cipher.setAAD(aad(input.environment, input.projectId));\n const ciphertext = Buffer.concat([\n cipher.update(JSON.stringify(plaintext), \"utf8\"),\n cipher.final(),\n ]);\n const authTag = cipher.getAuthTag();\n return endpointCacheEnvelopeSchema.parse({\n schemaVersion: 1,\n environment: input.environment,\n projectId: input.projectId,\n fetchedAt: input.fetchedAt,\n algorithm: \"aes-256-gcm\",\n nonce: nonce.toString(\"base64url\"),\n ciphertext: ciphertext.toString(\"base64url\"),\n authTag: authTag.toString(\"base64url\"),\n });\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw cacheFailure();\n }\n }\n\n decrypt(input: DecryptEndpointCacheInput): Network[] {\n try {\n const envelope = endpointCacheEnvelopeSchema.parse(input.envelope);\n if (\n envelope.environment !== input.environment ||\n envelope.projectId !== input.projectId\n ) {\n throw cacheFailure();\n }\n const key = requireKey(input.key);\n const nonce = Buffer.from(envelope.nonce, \"base64url\");\n const authTag = Buffer.from(envelope.authTag, \"base64url\");\n if (\n nonce.length !== NONCE_BYTES ||\n authTag.length !== TAG_BYTES\n ) {\n throw cacheFailure();\n }\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n key,\n nonce,\n { authTagLength: TAG_BYTES },\n );\n decipher.setAAD(aad(input.environment, input.projectId));\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([\n decipher.update(\n Buffer.from(envelope.ciphertext, \"base64url\"),\n ),\n decipher.final(),\n ]).toString(\"utf8\");\n return endpointCachePlaintextSchema.parse(\n JSON.parse(plaintext) as unknown,\n ).networks;\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw cacheFailure();\n }\n }\n}\n","import { z } from \"zod\";\nimport { projectIdSchema } from \"../settings/schema.js\";\nimport { networkSchema } from \"./project-types.js\";\n\nexport const endpointCacheEnvelopeSchema = z\n .object({\n schemaVersion: z.literal(1),\n environment: z.enum([\"dev\", \"sit\", \"pre\", \"prod\"]),\n projectId: projectIdSchema,\n fetchedAt: z.iso.datetime({ offset: true }),\n algorithm: z.literal(\"aes-256-gcm\"),\n nonce: z.string().regex(/^[A-Za-z0-9_-]{16}$/u),\n ciphertext: z.string().min(1).regex(/^[A-Za-z0-9_-]+$/u),\n authTag: z.string().regex(/^[A-Za-z0-9_-]{22}$/u),\n })\n .strict();\n\nexport const endpointCachePlaintextSchema = z\n .object({\n networks: z.array(networkSchema),\n })\n .strict();\n\nexport type EndpointCacheEnvelope = z.infer<\n typeof endpointCacheEnvelopeSchema\n>;\n","import { readdir } from \"node:fs/promises\";\nimport { posix, win32 } from \"node:path\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { CliEnvironment } from \"../runtime/config.js\";\nimport { projectIdSchema } from \"../settings/schema.js\";\nimport { AtomicJsonStore } from \"../storage/atomic-json.js\";\nimport { FileLock } from \"../storage/file-lock.js\";\nimport {\n endpointCacheEnvelopeSchema,\n type EndpointCacheEnvelope,\n} from \"./endpoint-cache-schema.js\";\n\nexport interface EndpointCacheStoreOptions {\n cacheDirectory: string;\n environment: CliEnvironment;\n platform?: NodeJS.Platform;\n}\n\nexport interface EndpointCacheStatus {\n present: boolean;\n schemaVersion?: 1;\n fetchedAt?: string;\n}\n\nfunction invalidProject(): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", \"Invalid Project ID.\");\n}\n\nfunction cacheMismatch(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The encrypted Endpoint cache does not match the active Project.\",\n \"Run: zan evm networks --refresh\",\n );\n}\n\nexport class EndpointCacheStore {\n private readonly platform: NodeJS.Platform;\n\n constructor(private readonly options: EndpointCacheStoreOptions) {\n this.platform = options.platform ?? process.platform;\n }\n\n pathFor(projectId: string): string {\n const parsed = projectIdSchema.safeParse(projectId);\n if (!parsed.success) {\n throw invalidProject();\n }\n const path = this.platform === \"win32\" ? win32 : posix;\n return path.join(\n this.options.cacheDirectory,\n parsed.data,\n \"networks.enc.json\",\n );\n }\n\n async read(projectId: string): Promise<EndpointCacheEnvelope | null> {\n return this.createStore(projectId).read();\n }\n\n async write(\n projectId: string,\n envelope: EndpointCacheEnvelope,\n ): Promise<void> {\n const parsed = endpointCacheEnvelopeSchema.parse(envelope);\n if (\n parsed.projectId !== projectId ||\n parsed.environment !== this.options.environment\n ) {\n throw cacheMismatch();\n }\n const store = this.createStore(projectId);\n await store.prepareDirectory();\n await new FileLock(`${store.filename}.lock`).withLock(() =>\n store.write(parsed),\n );\n }\n\n async delete(projectId: string): Promise<void> {\n await this.createStore(projectId).delete();\n }\n\n async ensureProjectDirectory(projectId: string): Promise<void> {\n await this.createStore(projectId).prepareDirectory();\n }\n\n async listProjectIds(): Promise<string[]> {\n let entries;\n try {\n entries = await readdir(this.options.cacheDirectory, {\n withFileTypes: true,\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n return entries\n .filter(\n (entry) =>\n entry.isDirectory() &&\n projectIdSchema.safeParse(entry.name).success,\n )\n .map((entry) => entry.name)\n .sort();\n }\n\n async status(projectId: string): Promise<EndpointCacheStatus> {\n const envelope = await this.read(projectId);\n return envelope === null\n ? { present: false }\n : {\n present: true,\n schemaVersion: envelope.schemaVersion,\n fetchedAt: envelope.fetchedAt,\n };\n }\n\n private createStore(\n projectId: string,\n ): AtomicJsonStore<EndpointCacheEnvelope> {\n return new AtomicJsonStore(\n endpointCacheEnvelopeSchema,\n this.pathFor(projectId),\n { platform: this.platform },\n );\n }\n}\n","import {\n chmod,\n lstat,\n mkdir,\n open,\n readFile,\n rename,\n unlink,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ZodType } from \"zod\";\nimport { CliFailure } from \"../errors/failure.js\";\n\nexport interface AtomicJsonFileHandle {\n writeFile(\n data: string,\n options: { encoding: \"utf8\" },\n ): Promise<void>;\n sync(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface AtomicJsonFileSystem {\n chmod(path: string, mode: number): Promise<void>;\n lstat(path: string): Promise<{\n mode: number;\n isDirectory(): boolean;\n isFile(): boolean;\n isSymbolicLink(): boolean;\n }>;\n mkdir(\n path: string,\n options: { recursive: true; mode: number },\n ): Promise<string | undefined>;\n open(\n path: string,\n flags: string,\n mode?: number,\n ): Promise<AtomicJsonFileHandle>;\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport const nodeAtomicJsonFileSystem: AtomicJsonFileSystem = Object.freeze({\n chmod,\n lstat,\n mkdir,\n open,\n readFile,\n rename,\n unlink,\n});\n\nexport interface AtomicJsonStoreOptions {\n fileSystem?: AtomicJsonFileSystem;\n platform?: NodeJS.Platform;\n createTemporaryId?: () => string;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n try {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n Reflect.get(error, \"code\") === code\n );\n } catch {\n return false;\n }\n}\n\nfunction storageFailure(action: string): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n `Unable to ${action} local ZAN CLI data.`,\n \"Check the data directory permissions and try again.\",\n );\n}\n\nfunction unsafeDirectoryFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"The ZAN CLI data directory is unsafe.\",\n \"Set ZAN_HOME to a dedicated directory with private permissions.\",\n );\n}\n\nfunction unsafeFileFailure(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"The ZAN CLI data file is unsafe.\",\n \"Inspect the data directory and restore private file permissions.\",\n );\n}\n\nfunction uncertainDurabilityFailure(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The local update may have been applied, but durability could not be confirmed.\",\n \"Run zan settings show to inspect the current value, then retry if needed.\",\n );\n}\n\nexport class AtomicJsonStore<T> {\n private readonly fileSystem: AtomicJsonFileSystem;\n private readonly platform: NodeJS.Platform;\n private readonly createTemporaryId: () => string;\n\n constructor(\n private readonly schema: ZodType<T>,\n readonly filename: string,\n options: AtomicJsonStoreOptions = {},\n ) {\n this.fileSystem = options.fileSystem ?? nodeAtomicJsonFileSystem;\n this.platform = options.platform ?? process.platform;\n this.createTemporaryId = options.createTemporaryId ?? randomUUID;\n }\n\n async read(): Promise<T | null> {\n if (!(await this.validateExistingDirectory(dirname(this.filename)))) {\n return null;\n }\n if (!(await this.validateExistingFile())) {\n return null;\n }\n\n let raw: string;\n try {\n raw = await this.fileSystem.readFile(this.filename, \"utf8\");\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return null;\n }\n throw storageFailure(\"read\");\n }\n\n try {\n return this.schema.parse(JSON.parse(raw));\n } catch {\n throw storageFailure(\"parse\");\n }\n }\n\n async prepareDirectory(): Promise<void> {\n try {\n await this.ensureDirectory(dirname(this.filename));\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw storageFailure(\"prepare\");\n }\n }\n\n async write(value: T): Promise<void> {\n let parsed: T;\n try {\n parsed = this.schema.parse(value);\n } catch {\n throw storageFailure(\"validate\");\n }\n\n const directory = dirname(this.filename);\n const temporaryFile = `${this.filename}.${process.pid}.${this.createTemporaryId()}.tmp`;\n let handle: AtomicJsonFileHandle | undefined;\n let renamed = false;\n\n try {\n await this.prepareDirectory();\n handle = await this.fileSystem.open(temporaryFile, \"wx\", 0o600);\n await handle.writeFile(`${JSON.stringify(parsed)}\\n`, {\n encoding: \"utf8\",\n });\n await handle.sync();\n await handle.close();\n handle = undefined;\n\n if (this.platform !== \"win32\") {\n await this.fileSystem.chmod(temporaryFile, 0o600);\n }\n await this.fileSystem.rename(temporaryFile, this.filename);\n renamed = true;\n await this.syncDirectory(directory);\n } catch (error) {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n try {\n await this.fileSystem.unlink(temporaryFile);\n } catch {}\n if (renamed) {\n throw uncertainDurabilityFailure();\n }\n if (error instanceof CliFailure) {\n throw error;\n }\n throw storageFailure(\"write\");\n }\n }\n\n async delete(): Promise<void> {\n if (!(await this.validateExistingDirectory(dirname(this.filename)))) {\n return;\n }\n if (!(await this.validateExistingFile())) {\n return;\n }\n\n try {\n await this.fileSystem.unlink(this.filename);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw storageFailure(\"delete\");\n }\n\n await this.syncDirectory(dirname(this.filename));\n }\n\n private async ensureDirectory(directory: string): Promise<void> {\n if (await this.validateExistingDirectory(directory)) {\n return;\n }\n\n const created = await this.fileSystem.mkdir(directory, {\n recursive: true,\n mode: 0o700,\n });\n const info = await this.fileSystem.lstat(directory);\n if (created === undefined) {\n this.assertSafeDirectory(info);\n return;\n }\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw unsafeDirectoryFailure();\n }\n if (this.platform !== \"win32\") {\n await this.fileSystem.chmod(directory, 0o700);\n const secured = await this.fileSystem.lstat(directory);\n this.assertSafeDirectory(secured);\n }\n }\n\n private async validateExistingDirectory(\n directory: string,\n ): Promise<boolean> {\n try {\n const existing = await this.fileSystem.lstat(directory);\n this.assertSafeDirectory(existing);\n return true;\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return false;\n }\n if (error instanceof CliFailure) {\n throw error;\n }\n throw unsafeDirectoryFailure();\n }\n }\n\n private assertSafeDirectory(info: {\n mode: number;\n isDirectory(): boolean;\n isFile(): boolean;\n isSymbolicLink(): boolean;\n }): void {\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw unsafeDirectoryFailure();\n }\n if (this.platform !== \"win32\" && (info.mode & 0o777) !== 0o700) {\n throw unsafeDirectoryFailure();\n }\n }\n\n private async validateExistingFile(): Promise<boolean> {\n let info: {\n mode: number;\n isFile(): boolean;\n isSymbolicLink(): boolean;\n };\n try {\n info = await this.fileSystem.lstat(this.filename);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw unsafeFileFailure();\n }\n\n if (info.isSymbolicLink() || !info.isFile()) {\n throw unsafeFileFailure();\n }\n if (this.platform !== \"win32\" && (info.mode & 0o777) !== 0o600) {\n throw unsafeFileFailure();\n }\n return true;\n }\n\n private async syncDirectory(directory: string): Promise<void> {\n if (this.platform === \"win32\") {\n return;\n }\n\n let handle: AtomicJsonFileHandle | undefined;\n try {\n handle = await this.fileSystem.open(directory, \"r\");\n await handle.sync();\n } catch (error) {\n if (\n !hasErrorCode(error, \"EINVAL\") &&\n !hasErrorCode(error, \"ENOTSUP\") &&\n !hasErrorCode(error, \"EISDIR\") &&\n !hasErrorCode(error, \"EPERM\")\n ) {\n throw storageFailure(\"sync\");\n }\n } finally {\n if (handle !== undefined) {\n try {\n await handle.close();\n } catch {}\n }\n }\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { CliEnvironment } from \"../runtime/config.js\";\nimport type { SecretStore } from \"../credentials/keychain-secret-store.js\";\nimport type { Network } from \"./project-types.js\";\nimport { rpcApiKeySchema } from \"./rpc-key-prompt.js\";\nimport type { EndpointCacheCrypto } from \"./endpoint-cache-crypto.js\";\nimport type {\n EndpointCacheStatus,\n EndpointCacheStore,\n} from \"./endpoint-cache-store.js\";\nimport { networkIdSchema } from \"../settings/schema.js\";\n\nexport interface ProjectNetworkCatalog {\n listNetworks(projectId: string): Promise<Network[]>;\n}\n\nexport interface ProjectEndpointCacheOptions {\n environment: CliEnvironment;\n catalog: ProjectNetworkCatalog;\n store: Pick<\n EndpointCacheStore,\n | \"read\"\n | \"write\"\n | \"delete\"\n | \"status\"\n | \"listProjectIds\"\n | \"ensureProjectDirectory\"\n >;\n crypto: EndpointCacheCrypto;\n secretStore: SecretStore;\n now?: () => number;\n}\n\nexport interface ProjectNetworkCache {\n refresh(projectId: string): Promise<Network[]>;\n list(projectId: string): Promise<Network[]>;\n status(projectId: string): Promise<EndpointCacheStatus>;\n clear(projectId: string): Promise<void>;\n clearEnvironment(activeProjectId?: string): Promise<void>;\n setOverride(projectId: string, key: string): Promise<void>;\n hasOverride(projectId: string): Promise<boolean>;\n clearOverride(projectId: string): Promise<void>;\n applyOverride(projectId: string, network: Network): Promise<Network>;\n effectiveApiKey(projectId: string): Promise<string>;\n}\n\nfunction invalidKey(): CliFailure {\n return new CliFailure(\n \"INTERNAL_ERROR\",\n \"The Endpoint cache encryption key is invalid.\",\n \"Run: zan project cache clear\",\n );\n}\n\nfunction unavailableApiKey(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"A safe RPC API Key could not be obtained for the active Project.\",\n \"Run: zan evm networks --refresh, or configure or clear the RPC API Key override.\",\n );\n}\n\nexport class ProjectEndpointCache implements ProjectNetworkCache {\n private readonly now: () => number;\n\n constructor(private readonly options: ProjectEndpointCacheOptions) {\n this.now = options.now ?? Date.now;\n }\n\n cacheKeyAccount(projectId: string): string {\n const scope = Buffer.from(\n `${this.options.environment}:${projectId}`,\n \"utf8\",\n ).toString(\"base64url\");\n return `endpoint-cache-key-${scope}`;\n }\n\n overrideAccount(projectId: string): string {\n const scope = Buffer.from(\n `${this.options.environment}:${projectId}`,\n \"utf8\",\n ).toString(\"base64url\");\n return `rpc-key-override-${scope}`;\n }\n\n async list(projectId: string): Promise<Network[]> {\n const envelope = await this.options.store.read(projectId);\n const encodedKey = await this.options.secretStore.read(\n this.cacheKeyAccount(projectId),\n );\n if (envelope !== null && encodedKey !== null) {\n try {\n return this.options.crypto.decrypt({\n envelope,\n environment: this.options.environment,\n projectId,\n key: this.decodeKey(encodedKey),\n });\n } catch {}\n }\n return this.refresh(projectId);\n }\n\n async refresh(projectId: string): Promise<Network[]> {\n const networks = await this.options.catalog.listNetworks(projectId);\n const account = this.cacheKeyAccount(projectId);\n const existing = await this.options.secretStore.read(account);\n const created = existing === null;\n const key = created\n ? this.options.crypto.generateKey()\n : this.decodeKey(existing);\n if (created) {\n await this.options.secretStore.write(\n account,\n key.toString(\"base64url\"),\n );\n }\n try {\n await this.options.store.write(\n projectId,\n this.options.crypto.encrypt({\n environment: this.options.environment,\n projectId,\n networks,\n key,\n fetchedAt: new Date(this.now()).toISOString(),\n }),\n );\n } catch (error) {\n if (created) {\n await this.options.secretStore.delete(account).catch(() => {});\n }\n throw error;\n }\n return networks;\n }\n\n status(projectId: string): Promise<EndpointCacheStatus> {\n return this.options.store.status(projectId);\n }\n\n async clear(projectId: string): Promise<void> {\n const results = await Promise.allSettled([\n this.options.store.delete(projectId),\n this.options.secretStore.delete(this.cacheKeyAccount(projectId)),\n ]);\n const failure = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n if (failure !== undefined) {\n throw failure.reason;\n }\n }\n\n async clearEnvironment(activeProjectId?: string): Promise<void> {\n const projectIds = new Set(await this.options.store.listProjectIds());\n if (activeProjectId !== undefined) {\n projectIds.add(activeProjectId);\n }\n const results = await Promise.allSettled(\n [...projectIds].map(async (projectId) => {\n const cleanup = await Promise.allSettled([\n this.clear(projectId),\n this.clearOverride(projectId),\n ]);\n const failure = cleanup.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n if (failure !== undefined) {\n throw failure.reason;\n }\n }),\n );\n const failure = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n if (failure !== undefined) {\n throw failure.reason;\n }\n }\n\n async setOverride(projectId: string, key: string): Promise<void> {\n const parsed = rpcApiKeySchema.safeParse(key);\n if (!parsed.success) {\n throw new CliFailure(\"INVALID_ARGS\", \"RPC API Key is invalid.\");\n }\n await this.options.store.ensureProjectDirectory(projectId);\n await this.options.secretStore.write(\n this.overrideAccount(projectId),\n parsed.data,\n );\n }\n\n async hasOverride(projectId: string): Promise<boolean> {\n return (\n (await this.options.secretStore.read(\n this.overrideAccount(projectId),\n )) !== null\n );\n }\n\n async clearOverride(projectId: string): Promise<void> {\n await this.options.secretStore.delete(this.overrideAccount(projectId));\n }\n\n async effectiveApiKey(projectId: string): Promise<string> {\n const override = await this.options.secretStore.read(\n this.overrideAccount(projectId),\n );\n if (override !== null) {\n const parsed = rpcApiKeySchema.safeParse(override);\n if (!parsed.success) {\n throw unavailableApiKey();\n }\n return parsed.data;\n }\n\n const candidates = (await this.list(projectId)).map((network) =>\n this.extractCredential(network),\n );\n const unique = new Set(candidates);\n if (candidates.length === 0 || unique.size !== 1) {\n throw unavailableApiKey();\n }\n return candidates[0]!;\n }\n\n async applyOverride(\n projectId: string,\n network: Network,\n ): Promise<Network> {\n const key = await this.options.secretStore.read(\n this.overrideAccount(projectId),\n );\n if (key === null) {\n return network;\n }\n return {\n ...network,\n nativeCurrency: network.nativeCurrency\n ? { ...network.nativeCurrency }\n : undefined,\n endpoints: {\n https: this.replaceCredential(network, network.endpoints.https, key),\n ...(network.endpoints.wss === undefined\n ? {}\n : {\n wss:\n network.ecosystem === \"hyperliquid\"\n ? network.endpoints.wss\n : this.replaceCredential(\n network,\n network.endpoints.wss,\n key,\n ),\n }),\n },\n };\n }\n\n private decodeKey(value: string): Buffer {\n const key = Buffer.from(value, \"base64url\");\n if (key.length !== 32 || key.toString(\"base64url\") !== value) {\n throw invalidKey();\n }\n return key;\n }\n\n private replaceCredential(\n network: Network,\n value: string,\n key: string,\n ): string {\n try {\n const url = new URL(value);\n const validProtocol =\n url.protocol === \"https:\" || url.protocol === \"wss:\";\n const validHost =\n url.hostname === \"zan.top\" || url.hostname.endsWith(\".zan.top\");\n const segments = url.pathname.split(\"/\").filter(Boolean);\n if (\n !validProtocol ||\n !validHost ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0 ||\n segments.length < 2\n ) {\n throw new Error(\"unsafe\");\n }\n if (network.ecosystem === \"hyperliquid\") {\n if (\n url.protocol !== \"https:\" ||\n url.hostname !== \"api.zan.top\" ||\n url.port.length > 0 ||\n segments.length !== 6 ||\n segments[0] !== \"node\" ||\n segments[1] !== \"v1\" ||\n segments[2] !== \"hyperliquid\" ||\n segments[3] !== network.network ||\n segments[5] !== \"evm\"\n ) {\n throw new Error(\"unsafe\");\n }\n segments[4] = key;\n } else {\n segments[segments.length - 1] = key;\n }\n url.pathname = `/${segments.join(\"/\")}`;\n return url.href;\n } catch {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"The RPC API Key override cannot be applied safely.\",\n );\n }\n }\n\n private extractCredential(network: Network): string {\n try {\n const url = new URL(network.endpoints.https);\n const trustedHost =\n url.hostname === \"zan.top\" ||\n url.hostname.endsWith(\".zan.top\");\n const segments = url.pathname.slice(1).split(\"/\");\n if (\n url.protocol !== \"https:\" ||\n !trustedHost ||\n url.port.length > 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0 ||\n !url.pathname.startsWith(\"/\") ||\n segments.some((segment) => segment.length === 0) ||\n url.pathname !== `/${segments.join(\"/\")}`\n ) {\n throw new Error(\"unsafe\");\n }\n\n let candidate: string;\n if (network.ecosystem === \"hyperliquid\") {\n if (\n segments.length !== 6 ||\n segments[0] !== \"node\" ||\n segments[1] !== \"v1\" ||\n segments[2] !== \"hyperliquid\" ||\n segments[3] !== network.network ||\n segments[5] !== \"evm\"\n ) {\n throw new Error(\"unsafe\");\n }\n candidate = segments[4]!;\n } else {\n if (\n segments.length !== 5 ||\n segments[0] !== \"node\" ||\n segments[1] !== \"v1\" ||\n !networkIdSchema.safeParse(segments[2]).success ||\n segments[3] !== network.network\n ) {\n throw new Error(\"unsafe\");\n }\n candidate = segments[4]!;\n }\n\n const parsed = rpcApiKeySchema.safeParse(candidate);\n if (!parsed.success) {\n throw new Error(\"unsafe\");\n }\n return parsed.data;\n } catch {\n throw unavailableApiKey();\n }\n }\n}\n","import type { DotenvApiKeyWriterContract } from \"./dotenv-api-key-writer.js\";\n\nexport interface RpcKeyPullResult {\n file: \".env\";\n variable: \"ZAN_API_KEY\";\n updated: true;\n}\n\nexport interface RpcKeyPullServiceDependencies {\n projects: {\n activeId(): Promise<string>;\n };\n keys: {\n effectiveApiKey(projectId: string): Promise<string>;\n };\n writer: DotenvApiKeyWriterContract;\n}\n\nexport class RpcKeyPullService {\n constructor(\n private readonly dependencies: RpcKeyPullServiceDependencies,\n ) {}\n\n async pull(): Promise<RpcKeyPullResult> {\n const projectId = await this.dependencies.projects.activeId();\n const key = await this.dependencies.keys.effectiveApiKey(projectId);\n await this.dependencies.writer.write(key);\n return {\n file: \".env\",\n variable: \"ZAN_API_KEY\",\n updated: true,\n };\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { ProjectSelection } from \"./project-selector.js\";\nimport { projectNameSchema, type Project } from \"./project-types.js\";\nimport type { ProjectUsage } from \"./usage-types.js\";\n\nexport interface ProjectClient {\n listProjects(): Promise<Project[]>;\n getProject(projectId: string): Promise<Project>;\n getProjectUsage(projectId: string): Promise<ProjectUsage>;\n createProject(input: {\n name: string;\n idempotencyKey: string;\n }): Promise<Project>;\n}\n\nexport interface ProjectSettings {\n get(key: \"project\"): Promise<string | undefined>;\n set(key: \"project\", value: string): Promise<void>;\n}\n\nexport interface ProjectSelectionResolver {\n resolve(selection: ProjectSelection): Promise<string>;\n}\n\nexport interface ProjectServiceOptions {\n client: ProjectClient;\n settings: ProjectSettings;\n selector: ProjectSelectionResolver;\n selection: Omit<ProjectSelection, \"stored\">;\n networkCache: Pick<\n import(\"./project-endpoint-cache.js\").ProjectNetworkCache,\n \"refresh\"\n >;\n createIdempotencyKey?: () => string;\n}\n\nexport class ProjectService {\n private readonly createIdempotencyKey: () => string;\n\n constructor(private readonly options: ProjectServiceOptions) {\n this.createIdempotencyKey =\n options.createIdempotencyKey ?? randomUUID;\n }\n\n list(): Promise<Project[]> {\n return this.options.client.listProjects();\n }\n\n get(projectId: string): Promise<Project> {\n return this.options.client.getProject(projectId);\n }\n\n create(name: string): Promise<Project> {\n return this.options.client.createProject({\n name: projectNameSchema.parse(name),\n idempotencyKey: this.createIdempotencyKey(),\n });\n }\n\n async use(projectId: string): Promise<Project> {\n const project = await this.options.client.getProject(projectId);\n await this.options.networkCache.refresh(project.id);\n await this.options.settings.set(\"project\", project.id);\n return project;\n }\n\n async active(): Promise<Project> {\n return this.options.client.getProject(await this.activeId());\n }\n\n async usage(): Promise<ProjectUsage> {\n return this.options.client.getProjectUsage(await this.activeId());\n }\n\n async activeId(): Promise<string> {\n const stored = await this.options.settings.get(\"project\");\n return this.options.selector.resolve({\n ...this.options.selection,\n ...(stored === undefined ? {} : { stored }),\n });\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport { resolveValue } from \"../settings/resolution.js\";\nimport type { ProjectPrompt } from \"./project-prompt.js\";\nimport type { Project } from \"./project-types.js\";\n\nexport interface ProjectSelection {\n cli?: string;\n env?: string;\n stored?: string;\n interactive: boolean;\n isTTY: boolean;\n}\n\nexport interface ProjectSelectorOptions {\n listProjects(): Promise<Project[]>;\n setProject(projectId: string): Promise<void>;\n prompt: ProjectPrompt;\n}\n\nfunction missingSelection(): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n \"A ZAN Project must be selected.\",\n \"Run: zan project use <id>\",\n );\n}\n\nexport class ProjectSelector {\n constructor(private readonly options: ProjectSelectorOptions) {}\n\n async resolve(selection: ProjectSelection): Promise<string> {\n const selected = resolveValue({\n ...(selection.cli === undefined\n ? {}\n : { cli: selection.cli }),\n ...(selection.env === undefined\n ? {}\n : { env: selection.env }),\n ...(selection.stored === undefined\n ? {}\n : { stored: selection.stored }),\n });\n if (selected !== undefined) {\n return selected;\n }\n if (!selection.interactive || !selection.isTTY) {\n throw missingSelection();\n }\n\n const projects = await this.options.listProjects();\n if (projects.length === 0) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"No ZAN Projects are available.\",\n \"Run: zan project create --name <name>\",\n );\n }\n\n const answer = (await this.options.prompt.ask(projects))?.trim();\n if (answer === undefined || !/^[1-9]\\d*$/u.test(answer)) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"A valid Project selection is required.\",\n );\n }\n const index = Number(answer) - 1;\n const project = projects[index];\n if (project === undefined) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"A valid Project selection is required.\",\n );\n }\n\n await this.options.setProject(project.id);\n return project.id;\n }\n}\n","import { z, type ZodType } from \"zod\";\nimport type {\n AuthenticatedSession,\n AuthenticationDisposition,\n} from \"../auth/authenticated-retry.js\";\nimport { mapServiceFailure } from \"../errors/service-error-mapper.js\";\nimport type {\n HttpRequest,\n HttpResponse,\n} from \"../http/transport.js\";\nimport {\n readWebResultFailureCode,\n unwrapWebResult,\n} from \"../http/web-result.js\";\nimport { projectIdSchema } from \"../settings/schema.js\";\nimport { projectUsageSchema, type ProjectUsage } from \"./usage-types.js\";\nimport {\n networkListResponseSchema,\n projectListResponseSchema,\n projectNameSchema,\n projectResponseSchema,\n type Network,\n type Project,\n} from \"./project-types.js\";\n\nexport interface HttpTransportPort {\n request(request: HttpRequest): Promise<HttpResponse>;\n}\n\nexport type { AuthenticatedSession } from \"../auth/authenticated-retry.js\";\n\nexport interface ZanCliApiClientOptions {\n transport: HttpTransportPort;\n session: AuthenticatedSession;\n signal: AbortSignal;\n}\n\nconst idempotencyKeySchema = z.uuid();\nconst ACCESS_TOKEN_WEB_RESULT_CODES: ReadonlySet<string> = new Set([\n \"W3S-019-5-B016\",\n \"W3S-019-5-B017\",\n]);\n\nfunction authenticationDisposition(\n response: HttpResponse,\n): AuthenticationDisposition {\n const displayedCode = readWebResultFailureCode(response.body);\n if (displayedCode === \"W3S-019-5-B018\") {\n return \"accepted\";\n }\n if (\n displayedCode !== undefined &&\n ACCESS_TOKEN_WEB_RESULT_CODES.has(displayedCode)\n ) {\n return \"access_token_rejected_confirmed\";\n }\n return response.status === 401\n ? \"access_token_rejected_suspected\"\n : \"accepted\";\n}\n\nexport class ZanCliApiClient {\n private readonly transport: HttpTransportPort;\n private readonly session: AuthenticatedSession;\n private readonly signal: AbortSignal;\n\n constructor(options: ZanCliApiClientOptions) {\n this.transport = options.transport;\n this.session = options.session;\n this.signal = options.signal;\n }\n\n async listProjects(): Promise<Project[]> {\n const data = await this.request(\n {\n method: \"GET\",\n path: \"/v1/api/cli/projects\",\n },\n projectListResponseSchema,\n );\n return data.projects;\n }\n\n async getProject(projectId: string): Promise<Project> {\n const id = projectIdSchema.parse(projectId);\n const data = await this.request(\n {\n method: \"GET\",\n path: `/v1/api/cli/projects/${encodeURIComponent(id)}`,\n },\n projectResponseSchema,\n );\n return data.project;\n }\n\n async createProject(input: {\n name: string;\n idempotencyKey: string;\n }): Promise<Project> {\n const body = JSON.stringify({\n name: projectNameSchema.parse(input.name),\n type: \"CHAIN_RPC\",\n idempotencyKey: idempotencyKeySchema.parse(\n input.idempotencyKey,\n ),\n });\n const data = await this.request(\n {\n method: \"POST\",\n path: \"/v1/api/cli/createProject\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n },\n projectResponseSchema,\n );\n return data.project;\n }\n\n async listNetworks(projectId: string): Promise<Network[]> {\n const id = projectIdSchema.parse(projectId);\n const data = await this.request(\n {\n method: \"GET\",\n path: `/v1/api/cli/projects/${encodeURIComponent(id)}/networks`,\n },\n networkListResponseSchema,\n );\n return data.networks;\n }\n\n async getProjectUsage(projectId: string): Promise<ProjectUsage> {\n const id = projectIdSchema.parse(projectId);\n return this.request({\n method: \"GET\",\n path: `/v1/api/cli/projects/${encodeURIComponent(id)}/usage`,\n }, projectUsageSchema);\n }\n\n private async request<T>(\n request: Omit<HttpRequest, \"headers\" | \"signal\"> & {\n headers?: Record<string, string>;\n },\n dataSchema: ZodType<T>,\n ): Promise<T> {\n const response = await this.session.withAuthenticatedRetry(\n async (accessToken) => {\n const value = await this.transport.request({\n ...request,\n headers: {\n ...request.headers,\n Authorization: `Bearer ${accessToken}`,\n },\n signal: this.signal,\n });\n return {\n disposition: authenticationDisposition(value),\n value,\n };\n },\n );\n\n if (\n response.status === 401 ||\n response.status === 403 ||\n response.status === 429\n ) {\n throw mapServiceFailure({\n status: response.status,\n operation: \"project\",\n });\n }\n const outcome = unwrapWebResult(response.body, dataSchema, {\n retryable: response.status >= 500,\n });\n if (!outcome.success) {\n throw mapServiceFailure({\n status: response.status,\n displayedCode: outcome.displayedCode,\n operation: \"project\",\n });\n }\n if (response.status < 200 || response.status >= 300) {\n throw mapServiceFailure({\n status: response.status,\n operation: \"project\",\n });\n }\n return outcome.data;\n }\n}\n","import { z } from \"zod\";\nimport { projectSchema } from \"./project-types.js\";\n\n// Credits are strings so Java Long values retain their precision in JSON.\nconst creditsSchema = z.string().regex(/^(?:0|[1-9]\\d*)$/u);\nconst optionalCreditsSchema = creditsSchema.nullish().transform((value) => value ?? null);\nconst optionalDateSchema = z.iso.datetime({ offset: true }).nullish()\n .transform((value) => value ?? null);\n\nexport const projectUsageSchema = z.object({\n project: projectSchema,\n keyUsage: z.object({\n usedCredits: creditsSchema,\n limitCredits: optionalCreditsSchema,\n remainingCredits: optionalCreditsSchema,\n }).strict(),\n plan: z.object({\n name: z.string().min(1),\n usedCredits: creditsSchema,\n totalCredits: creditsSchema,\n remainingCredits: creditsSchema,\n expiresAt: optionalDateSchema,\n refreshAt: optionalDateSchema,\n status: z.enum([\"INIT\", \"VALID\", \"INVALID\"]).nullish().transform((value) => value ?? null),\n serviceStatus: z.enum([\"ON\", \"OFF\"]).nullish().transform((value) => value ?? null),\n }).strict().nullish().transform((value) => value ?? null),\n}).strict();\n\nexport type ProjectUsage = z.infer<typeof projectUsageSchema>;\n","import type { SessionMetadata } from \"../auth/session-metadata-store.js\";\nimport {\n credentialStoreStatusSchema,\n type CredentialStore,\n type CredentialStoreStatus,\n} from \"../credentials/credential-store.js\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { RuntimeConfig } from \"../runtime/config.js\";\nimport type { Settings } from \"../settings/schema.js\";\nimport { resolveValue } from \"../settings/resolution.js\";\n\nexport type CredentialStatusProbe = Pick<CredentialStore, \"probe\">;\n\nexport interface Readiness {\n version: string;\n platform: string;\n runtime: {\n authBaseUrlConfigured: boolean;\n apiBaseUrlConfigured: boolean;\n };\n credentials: CredentialStoreStatus;\n session: {\n present: boolean;\n profile?: string;\n subject?: string;\n displayName?: string;\n scopes: string[];\n expiresAt?: string;\n };\n settings: {\n projectConfigured: boolean;\n networkConfigured: boolean;\n };\n ready: boolean;\n}\n\ninterface SessionMetadataReader {\n read(): Promise<SessionMetadata | null>;\n}\n\ninterface SettingsReader {\n show(): Promise<Settings>;\n}\n\ninterface SelectionSource {\n cli: string | undefined;\n env: string | undefined;\n}\n\nexport interface ReadinessServiceDependencies {\n version: string;\n platform: string;\n runtimeConfig: RuntimeConfig;\n credentialProbe: CredentialStatusProbe;\n sessionStore: SessionMetadataReader;\n settingsStore: SettingsReader;\n selection: {\n project: SelectionSource;\n network: SelectionSource;\n };\n}\n\nfunction parseCredentialStatus(value: unknown): CredentialStoreStatus {\n try {\n const result = credentialStoreStatusSchema.safeParse(value);\n if (result.success) {\n return {\n backend: result.data.backend,\n available: result.data.available,\n systemBacked: result.data.systemBacked,\n };\n }\n } catch {}\n\n throw new CliFailure(\n \"CREDENTIAL_STORE_UNAVAILABLE\",\n \"Credential store status could not be validated.\",\n \"Check the system credential store and try again.\",\n );\n}\n\nexport class ReadinessService {\n constructor(\n private readonly dependencies: ReadinessServiceDependencies,\n ) {}\n\n async inspect(): Promise<Readiness> {\n const [credentialStatus, session, storedSettings] = await Promise.all([\n this.dependencies.credentialProbe.probe(),\n this.dependencies.sessionStore.read(),\n this.dependencies.settingsStore.show(),\n ]);\n const credentials = parseCredentialStatus(credentialStatus);\n const project = resolveValue({\n ...this.dependencies.selection.project,\n stored: storedSettings.project,\n });\n const network = resolveValue({\n ...this.dependencies.selection.network,\n stored: storedSettings.network,\n });\n const runtime = {\n authBaseUrlConfigured:\n this.dependencies.runtimeConfig.authBaseUrl !== undefined,\n apiBaseUrlConfigured:\n this.dependencies.runtimeConfig.apiBaseUrl !== undefined,\n };\n const sessionView: Readiness[\"session\"] =\n session === null\n ? { present: false, scopes: [] }\n : {\n present: true,\n profile: session.profile,\n ...(session.subject === undefined\n ? {}\n : { subject: session.subject }),\n ...(session.displayName === undefined\n ? {}\n : { displayName: session.displayName }),\n scopes: [...session.scopes],\n ...(session.expiresAt === undefined\n ? {}\n : { expiresAt: session.expiresAt }),\n };\n const settings = {\n projectConfigured: project !== undefined,\n networkConfigured: network !== undefined,\n };\n const hasRequiredScopes =\n session !== null &&\n this.dependencies.runtimeConfig.scopes.every((scope) =>\n session.scopes.includes(scope),\n );\n\n return {\n version: this.dependencies.version,\n platform: this.dependencies.platform,\n runtime,\n credentials,\n session: sessionView,\n settings,\n ready:\n runtime.authBaseUrlConfigured &&\n runtime.apiBaseUrlConfigured &&\n credentials.available &&\n credentials.systemBacked &&\n session !== null &&\n hasRequiredScopes &&\n settings.projectConfigured &&\n settings.networkConfigured,\n };\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport type { AtomicJsonStore } from \"../storage/atomic-json.js\";\nimport { FileLock } from \"../storage/file-lock.js\";\nimport {\n networkIdSchema,\n projectIdSchema,\n type SettingKey,\n type Settings,\n} from \"./schema.js\";\n\nconst SETTING_KEYS: readonly SettingKey[] = Object.freeze([\n \"project\",\n \"network\",\n]);\n\nfunction invalidSetting(message: string): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", message);\n}\n\nfunction assertKey(key: string): asserts key is SettingKey {\n if (!SETTING_KEYS.includes(key as SettingKey)) {\n throw invalidSetting(\"Setting key must be project or network.\");\n }\n}\n\nexport class SettingsStore {\n private queue: Promise<void> = Promise.resolve();\n private readonly lock: FileLock;\n\n constructor(\n private readonly store: AtomicJsonStore<Settings>,\n lock?: FileLock,\n ) {\n this.lock = lock ?? new FileLock(`${store.filename}.lock`);\n }\n\n async get(key: SettingKey): Promise<string | undefined> {\n assertKey(key);\n const settings = await this.show();\n return settings[key];\n }\n\n async show(): Promise<Settings> {\n return this.exclusive(async () => ({ ...(await this.store.read()) }));\n }\n\n async set(key: SettingKey, value: string): Promise<void> {\n assertKey(key);\n const schema = key === \"project\" ? projectIdSchema : networkIdSchema;\n if (!schema.safeParse(value).success) {\n throw invalidSetting(`Invalid ${key} value.`);\n }\n\n await this.exclusive(async () => {\n await this.transaction(async () => {\n const current = (await this.store.read()) ?? {};\n await this.store.write({ ...current, [key]: value });\n });\n });\n }\n\n async clear(key?: SettingKey): Promise<void> {\n if (key !== undefined) {\n assertKey(key);\n }\n\n await this.exclusive(async () => {\n await this.transaction(async () => {\n if (key === undefined) {\n await this.store.delete();\n return;\n }\n\n const current = await this.store.read();\n if (current === null || current[key] === undefined) {\n return;\n }\n const next = { ...current };\n delete next[key];\n if (Object.keys(next).length === 0) {\n await this.store.delete();\n } else {\n await this.store.write(next);\n }\n });\n });\n }\n\n private async transaction<T>(operation: () => Promise<T>): Promise<T> {\n await this.store.prepareDirectory();\n return this.lock.withLock(operation);\n }\n\n private exclusive<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n}\n","import { join, posix, win32 } from \"node:path\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type {\n CliEnvironment,\n RuntimeEnvironment,\n} from \"../runtime/config.js\";\n\nexport interface ZanPaths {\n home: string;\n settingsFile: string;\n sessionFile: string;\n cacheDirectory: string;\n}\n\nexport type HomedirSource = string | (() => string);\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction validateHomePath(\n home: string,\n platform: NodeJS.Platform,\n): string {\n const path = platform === \"win32\" ? win32 : posix;\n if (!path.isAbsolute(home)) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"The ZAN CLI data directory must be an absolute path.\",\n \"Set ZAN_HOME to a dedicated absolute directory.\",\n );\n }\n\n const resolved = path.resolve(home);\n if (resolved === path.parse(resolved).root) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"The filesystem root cannot be used as the ZAN CLI data directory.\",\n \"Set ZAN_HOME to a dedicated directory.\",\n );\n }\n return resolved;\n}\n\nfunction readHomedir(source: HomedirSource): string {\n return typeof source === \"function\" ? source() : source;\n}\n\nexport function resolveZanHome(\n env: RuntimeEnvironment,\n platform: NodeJS.Platform,\n homedir: HomedirSource,\n): string {\n const explicitHome = nonEmpty(env.ZAN_HOME);\n if (explicitHome !== undefined) {\n return validateHomePath(explicitHome, platform);\n }\n\n if (platform === \"darwin\") {\n return validateHomePath(\n join(readHomedir(homedir), \"Library\", \"Application Support\", \"zan\"),\n platform,\n );\n }\n\n if (platform === \"win32\") {\n const appData = nonEmpty(env.APPDATA);\n if (appData === undefined) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"APPDATA is required to locate ZAN CLI data.\",\n \"Set APPDATA or ZAN_HOME.\",\n );\n }\n return validateHomePath(win32.join(appData, \"zan\"), platform);\n }\n\n const configRoot = nonEmpty(env.XDG_CONFIG_HOME);\n return validateHomePath(\n posix.join(\n configRoot ?? posix.join(readHomedir(homedir), \".config\"),\n \"zan\",\n ),\n platform,\n );\n}\n\nexport function createZanPaths(\n home: string,\n platform: NodeJS.Platform,\n environment: CliEnvironment = \"prod\",\n): ZanPaths {\n const path = platform === \"win32\" ? win32 : posix;\n const sessionName =\n environment === \"prod\"\n ? \"session.json\"\n : `session.${environment}.json`;\n const settingsName =\n environment === \"prod\"\n ? \"settings.json\"\n : `settings.${environment}.json`;\n return {\n home,\n settingsFile: path.join(home, settingsName),\n sessionFile: path.join(home, sessionName),\n cacheDirectory: path.join(home, \"cache\", environment),\n };\n}\n","import {\n encodeFunctionData,\n keccak256,\n parseAbiItem,\n type AbiFunction,\n type Hex,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { CliFailure } from \"../errors/failure.js\";\nimport type { PrivateKey } from \"./wallet-key-input.js\";\n\nexport function deriveAddress(key: PrivateKey): `0x${string}` {\n try {\n return privateKeyToAccount(key).address;\n } catch {\n throw new CliFailure(\"INVALID_ARGS\", \"The private key is invalid.\");\n }\n}\n\nexport async function signMessageWithKey(\n key: PrivateKey,\n message: string,\n rawMessageHex?: Hex,\n): Promise<Hex> {\n const account = privateKeyToAccount(key);\n return account.signMessage({\n message: rawMessageHex === undefined ? message : { raw: rawMessageHex },\n });\n}\n\nexport interface TransactionToSign {\n chainId: number;\n nonce: number;\n to: `0x${string}`;\n value: bigint;\n data: Hex;\n gas: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n gasPrice?: bigint;\n}\n\nexport interface SignedTransaction {\n rawTransaction: Hex;\n transactionHash: Hex;\n}\n\nexport async function signTransactionWithKey(\n key: PrivateKey,\n transaction: TransactionToSign,\n): Promise<SignedTransaction> {\n try {\n const account = privateKeyToAccount(key);\n const base = {\n chainId: transaction.chainId,\n nonce: transaction.nonce,\n to: transaction.to,\n value: transaction.value,\n data: transaction.data,\n gas: transaction.gas,\n };\n const rawTransaction =\n transaction.gasPrice !== undefined\n ? await account.signTransaction({\n ...base,\n gasPrice: transaction.gasPrice,\n type: \"legacy\",\n })\n : await account.signTransaction({\n ...base,\n maxFeePerGas: transaction.maxFeePerGas ?? 0n,\n maxPriorityFeePerGas:\n transaction.maxPriorityFeePerGas ?? 0n,\n type: \"eip1559\",\n });\n return {\n rawTransaction,\n transactionHash: keccak256(rawTransaction),\n };\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The transaction could not be signed.\",\n );\n }\n}\n\nexport function encodeContractCall(\n signature: string,\n args: readonly unknown[],\n): Hex {\n try {\n const normalized = /^\\s*(function|event|error|constructor)\\b/u.test(\n signature,\n )\n ? signature\n : `function ${signature}`;\n const item = parseAbiItem(normalized);\n if (item.type !== \"function\") {\n throw new Error(\"not a function\");\n }\n const abiFunction = item as AbiFunction;\n return encodeFunctionData({\n abi: [abiFunction],\n functionName: abiFunction.name,\n args: [...args],\n } as Parameters<typeof encodeFunctionData>[0]);\n } catch (error) {\n if (error instanceof CliFailure) {\n throw error;\n }\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The contract method signature or arguments are invalid.\",\n );\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\nimport type { SecretStore } from \"../credentials/keychain-secret-store.js\";\nimport { deriveAddress } from \"./signer.js\";\nimport { parsePrivateKey, type PrivateKey } from \"./wallet-key-input.js\";\nimport {\n EMPTY_WALLET_INDEX,\n MAX_WALLETS,\n walletAliasSchema,\n type WalletIndex,\n} from \"./wallet-types.js\";\n\nexport interface WalletIndexStore {\n read(): Promise<WalletIndex | null>;\n write(value: WalletIndex): Promise<void>;\n}\n\nexport interface ActiveWalletSettings {\n get(): Promise<string | undefined>;\n set(alias: string): Promise<void>;\n clear(): Promise<void>;\n}\n\nexport interface WalletServiceOptions {\n index: WalletIndexStore;\n secrets: SecretStore;\n activeWallet: ActiveWalletSettings;\n now?: () => Date;\n}\n\nexport interface WalletSummary {\n alias: string;\n address: string;\n createdAt: string;\n active: boolean;\n}\n\nfunction invalidAlias(): CliFailure {\n return new CliFailure(\"INVALID_ARGS\", \"The wallet alias is invalid.\");\n}\n\nfunction aliasNotFound(): CliFailure {\n return new CliFailure(\n \"NOT_FOUND\",\n \"The wallet alias was not found.\",\n \"Run: zan settings wallet list\",\n );\n}\n\nexport class WalletService {\n constructor(private readonly options: WalletServiceOptions) {}\n\n async add(alias: string, key: PrivateKey): Promise<WalletSummary> {\n const parsedAlias = this.parseAlias(alias);\n const index = await this.readIndex();\n if (index.wallets[parsedAlias] !== undefined) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The wallet alias already exists.\",\n \"Choose another alias or run: zan settings wallet remove\",\n );\n }\n if (Object.keys(index.wallets).length >= MAX_WALLETS) {\n throw new CliFailure(\n \"INVALID_ARGS\",\n \"The wallet alias limit was reached.\",\n \"Run: zan settings wallet remove to free a slot\",\n );\n }\n const entry = {\n address: deriveAddress(key),\n createdAt: (this.options.now ?? (() => new Date()))().toISOString(),\n };\n const account = this.keyAccount(parsedAlias);\n await this.options.secrets.write(account, key);\n try {\n await this.options.index.write({\n wallets: { ...index.wallets, [parsedAlias]: entry },\n });\n } catch (error) {\n await this.options.secrets.delete(account).catch(() => {});\n throw error;\n }\n if ((await this.options.activeWallet.get()) === undefined) {\n await this.options.activeWallet.set(parsedAlias);\n }\n return {\n alias: parsedAlias,\n ...entry,\n active: (await this.options.activeWallet.get()) === parsedAlias,\n };\n }\n\n async list(): Promise<WalletSummary[]> {\n const index = await this.readIndex();\n const active = await this.options.activeWallet.get();\n return Object.entries(index.wallets)\n .sort(([left], [right]) => (left < right ? -1 : 1))\n .map(([alias, entry]) => ({\n alias,\n ...entry,\n active: alias === active,\n }));\n }\n\n async use(alias: string): Promise<WalletSummary> {\n const parsedAlias = this.parseAlias(alias);\n const index = await this.readIndex();\n const entry = index.wallets[parsedAlias];\n if (entry === undefined) {\n throw aliasNotFound();\n }\n await this.options.activeWallet.set(parsedAlias);\n return { alias: parsedAlias, ...entry, active: true };\n }\n\n async remove(alias: string): Promise<void> {\n const parsedAlias = this.parseAlias(alias);\n const index = await this.readIndex();\n if (index.wallets[parsedAlias] === undefined) {\n throw aliasNotFound();\n }\n await this.options.secrets.delete(this.keyAccount(parsedAlias));\n const wallets = { ...index.wallets };\n delete wallets[parsedAlias];\n await this.options.index.write({ wallets });\n if ((await this.options.activeWallet.get()) === parsedAlias) {\n await this.options.activeWallet.clear();\n }\n }\n\n async resolveActive(\n override?: string,\n ): Promise<{ alias: string; address: `0x${string}` }> {\n const alias =\n override === undefined\n ? await this.options.activeWallet.get()\n : this.parseAlias(override);\n if (alias === undefined) {\n throw new CliFailure(\n \"SETUP_REQUIRED\",\n \"No wallet is selected.\",\n \"Run: zan settings wallet add <alias> or zan settings wallet use <alias>\",\n );\n }\n const index = await this.readIndex();\n const entry = index.wallets[alias];\n if (entry === undefined) {\n throw aliasNotFound();\n }\n return { alias, address: entry.address as `0x${string}` };\n }\n\n /**\n * Runs an action with the decrypted key material. The key never leaves\n * the callback and is never included in any return value or error.\n */\n async withKey<T>(\n alias: string,\n action: (key: PrivateKey) => Promise<T> | T,\n ): Promise<T> {\n const parsedAlias = this.parseAlias(alias);\n const secret = await this.options.secrets.read(\n this.keyAccount(parsedAlias),\n );\n if (secret === null) {\n throw new CliFailure(\n \"NOT_FOUND\",\n \"The wallet key material is missing.\",\n \"Run: zan settings wallet add to store it again.\",\n );\n }\n let key: PrivateKey;\n try {\n key = parsePrivateKey(secret);\n } catch {\n throw new CliFailure(\n \"INTERNAL_ERROR\",\n \"Stored wallet data could not be validated.\",\n );\n }\n return action(key);\n }\n\n private parseAlias(alias: string): string {\n const parsed = walletAliasSchema.safeParse(alias);\n if (!parsed.success) {\n throw invalidAlias();\n }\n return parsed.data;\n }\n\n private keyAccount(alias: string): string {\n return `wallet:${alias}`;\n }\n\n private async readIndex(): Promise<WalletIndex> {\n return (\n (await this.options.index.read()) ?? { wallets: EMPTY_WALLET_INDEX.wallets }\n );\n }\n}\n","import type { Hex } from \"viem\";\nimport {\n encodeContractCall,\n signMessageWithKey,\n signTransactionWithKey,\n} from \"./signer.js\";\nimport type { WalletService } from \"./wallet-service.js\";\n\nexport interface SigningEvmReads {\n pendingTransactionCount(address: `0x${string}`): Promise<bigint>;\n estimateGas(call: {\n from: `0x${string}`;\n to: `0x${string}`;\n value: bigint;\n data: Hex;\n }): Promise<bigint>;\n feeEstimate(): Promise<{\n gasPrice: bigint;\n maxPriorityFeePerGas: bigint | null;\n }>;\n selectedNetwork(): Promise<{ network: string; chainId: number }>;\n}\n\nexport interface SignMessageInput {\n account?: string;\n message: string;\n rawMessageHex?: Hex;\n}\n\nexport interface SignMessageResult {\n account: string;\n address: string;\n signature: Hex;\n}\n\nexport interface SignTransactionInput {\n account?: string;\n to: `0x${string}`;\n valueWei?: bigint;\n data?: Hex;\n nonce?: number;\n gasLimit?: bigint;\n maxFeePerGasWei?: bigint;\n maxPriorityFeePerGasWei?: bigint;\n legacy?: boolean;\n}\n\nexport interface SignTransactionResult {\n account: string;\n from: string;\n to: string;\n network: string;\n chainId: number;\n nonce: number;\n gasLimit: string;\n value: string;\n data: Hex;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n rawTransaction: Hex;\n transactionHash: Hex;\n}\n\nexport class SigningService {\n constructor(\n private readonly options: {\n wallet: WalletService;\n evm: SigningEvmReads;\n },\n ) {}\n\n async signMessage(input: SignMessageInput): Promise<SignMessageResult> {\n const target = await this.options.wallet.resolveActive(input.account);\n const signature = await this.options.wallet.withKey(\n target.alias,\n (key) =>\n signMessageWithKey(key, input.message, input.rawMessageHex),\n );\n return {\n account: target.alias,\n address: target.address,\n signature,\n };\n }\n\n async signTransaction(\n input: SignTransactionInput,\n ): Promise<SignTransactionResult> {\n const target = await this.options.wallet.resolveActive(input.account);\n const network = await this.options.evm.selectedNetwork();\n const value = input.valueWei ?? 0n;\n const data: Hex = input.data ?? \"0x\";\n const nonce =\n input.nonce ??\n Number(await this.options.evm.pendingTransactionCount(target.address));\n const gasLimit =\n input.gasLimit ??\n ((await this.options.evm.estimateGas({\n from: target.address,\n to: input.to,\n value,\n data,\n })) *\n 120n) /\n 100n;\n\n let feeFields:\n | { gasPrice: bigint }\n | { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint };\n if (input.legacy === true) {\n const gasPrice =\n input.maxFeePerGasWei ??\n (await this.options.evm.feeEstimate()).gasPrice;\n feeFields = { gasPrice };\n } else {\n const fees = await this.options.evm.feeEstimate();\n const maxPriorityFeePerGas =\n input.maxPriorityFeePerGasWei ??\n fees.maxPriorityFeePerGas ??\n fees.gasPrice;\n const maxFeePerGas =\n input.maxFeePerGasWei ?? fees.gasPrice * 2n + maxPriorityFeePerGas;\n feeFields = { maxFeePerGas, maxPriorityFeePerGas };\n }\n\n const signed = await this.options.wallet.withKey(target.alias, (key) =>\n signTransactionWithKey(key, {\n chainId: network.chainId,\n nonce,\n to: input.to,\n value,\n data,\n gas: gasLimit,\n ...feeFields,\n }),\n );\n\n return {\n account: target.alias,\n from: target.address,\n to: input.to,\n network: network.network,\n chainId: network.chainId,\n nonce,\n gasLimit: gasLimit.toString(),\n value: value.toString(),\n data,\n ...(\"gasPrice\" in feeFields\n ? { gasPrice: feeFields.gasPrice.toString() }\n : {\n maxFeePerGas: feeFields.maxFeePerGas.toString(),\n maxPriorityFeePerGas:\n feeFields.maxPriorityFeePerGas.toString(),\n }),\n rawTransaction: signed.rawTransaction,\n transactionHash: signed.transactionHash,\n };\n }\n\n encodeContractCall(signature: string, args: readonly unknown[]): Hex {\n return encodeContractCall(signature, args);\n }\n}\n","import { CliFailure } from \"../errors/failure.js\";\n\nexport const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nexport const MAX_REQUEST_TIMEOUT_MS = 2_147_483_647;\nexport const DEFAULT_ZAN_SERVICE_BASE_URL = \"https://zan.top\";\n\nexport type CliEnvironment = \"dev\" | \"sit\" | \"pre\" | \"prod\";\n\nconst CLI_ENVIRONMENTS: readonly CliEnvironment[] = Object.freeze([\n \"dev\",\n \"sit\",\n \"pre\",\n \"prod\",\n]);\n\nexport const OAUTH_SCOPES = Object.freeze([\n \"account.profile:read\",\n \"offline_access\",\n \"node-service.projects:read\",\n \"node-service.projects:create\",\n \"node-service.rpc:read\",\n] as const);\n\nexport interface RuntimeConfig {\n environment: CliEnvironment;\n authBaseUrl?: URL;\n apiBaseUrl?: URL;\n oauthClientId: \"zan-cli\";\n scopes: readonly string[];\n requestTimeoutMs: number;\n}\n\nexport type RuntimeEnvironment = Record<string, string | undefined>;\n\nexport function resolveCliEnvironment(\n value: string | undefined,\n): CliEnvironment {\n if (value === undefined || value.length === 0) {\n return \"prod\";\n }\n if (CLI_ENVIRONMENTS.includes(value as CliEnvironment)) {\n return value as CliEnvironment;\n }\n throw configurationFailure(\"ZAN_ENV\");\n}\n\nfunction configurationFailure(name: string): CliFailure {\n return new CliFailure(\n \"SETUP_REQUIRED\",\n `${name} is invalid.`,\n \"Check the ZAN CLI environment configuration.\",\n );\n}\n\nfunction parseBaseUrl(\n value: string | undefined,\n name: string,\n): URL | undefined {\n if (value === undefined || value.length === 0) {\n return undefined;\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw configurationFailure(name);\n }\n\n const validProtocol =\n url.protocol === \"https:\" || url.protocol === \"http:\";\n if (\n !validProtocol ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw configurationFailure(name);\n }\n\n return url;\n}\n\nfunction parseTimeout(\n value: string | undefined,\n override?: number,\n): number {\n if (override !== undefined) {\n if (\n !Number.isSafeInteger(override) ||\n override <= 0 ||\n override > MAX_REQUEST_TIMEOUT_MS\n ) {\n throw configurationFailure(\"Request timeout\");\n }\n return override;\n }\n\n if (value === undefined) {\n return DEFAULT_REQUEST_TIMEOUT_MS;\n }\n if (!/^[1-9]\\d*$/u.test(value)) {\n throw configurationFailure(\"ZAN_REQUEST_TIMEOUT_MS\");\n }\n\n const timeout = Number(value);\n if (\n !Number.isSafeInteger(timeout) ||\n timeout > MAX_REQUEST_TIMEOUT_MS\n ) {\n throw configurationFailure(\"ZAN_REQUEST_TIMEOUT_MS\");\n }\n return timeout;\n}\n\nexport function loadRuntimeConfig(\n env: RuntimeEnvironment,\n requestTimeoutMs?: number,\n): RuntimeConfig {\n const environment = resolveCliEnvironment(env.ZAN_ENV);\n const authBaseUrl = parseBaseUrl(\n env.ZAN_AUTH_BASE_URL ?? DEFAULT_ZAN_SERVICE_BASE_URL,\n \"ZAN_AUTH_BASE_URL\",\n );\n const apiBaseUrl = parseBaseUrl(\n env.ZAN_API_BASE_URL ?? DEFAULT_ZAN_SERVICE_BASE_URL,\n \"ZAN_API_BASE_URL\",\n );\n\n return {\n environment,\n ...(authBaseUrl === undefined ? {} : { authBaseUrl }),\n ...(apiBaseUrl === undefined ? {} : { apiBaseUrl }),\n oauthClientId: \"zan-cli\",\n scopes: OAUTH_SCOPES,\n requestTimeoutMs: parseTimeout(\n env.ZAN_REQUEST_TIMEOUT_MS,\n requestTimeoutMs,\n ),\n };\n}\n"],"mappings":"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,OAAO,OAAO;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,0BAAkC;AAChD,QAAM,SAAS;AAAA,IACb;AAAA,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","names":["fileURLToPath","InvalidArgumentError","InvalidArgumentError","InvalidArgumentError","z","resolve","z","z","InvalidArgumentError","InvalidArgumentError","data","InvalidArgumentError","Buffer","Buffer","parseMethodArgument","InvalidArgumentError","formatResult","InvalidArgumentError","z","z","z","z","InvalidArgumentError","InvalidArgumentError","z","z","invalidInput","resolve","InvalidArgumentError","configured","InvalidArgumentError","InvalidArgumentError","z","z","createInterface","readHomedir","join","z","resolve","createHash","resolve","Buffer","chmod","lstat","mkdir","join","resolve","lstat","readFile","delay","lstat","readFile","delay","hasErrorCode","resolve","Buffer","join","lstat","mkdir","chmod","z","z","z","Buffer","z","z","z","z","z","Buffer","z","z","isAbsolute","join","entries","DIRECTORY_MODE","hasErrorCode","isAbsolute","join","hasErrorCode","DIRECTORY_MODE","networkFailure","randomUUID","networkFailure","randomUUID","randomUUID","nodeChmod","nodeLstat","nodeOpen","nodeReadFile","isAbsolute","join","hasErrorCode","nodeChmod","nodeLstat","nodeOpen","nodeReadFile","randomUUID","isAbsolute","join","Buffer","z","z","Buffer","readdir","chmod","lstat","mkdir","open","readFile","rename","unlink","dirname","randomUUID","chmod","lstat","mkdir","open","readFile","rename","unlink","hasErrorCode","randomUUID","dirname","entries","readdir","Buffer","Buffer","failure","randomUUID","randomUUID","missingSelection","z","z","z","z","join","posix","win32","win32","posix","homedir","join","keccak256","keccak256","readHomedir","runtimeConfig","join","input","InvalidArgumentError","fileURLToPath"]}
|