@namera-ai/cli 0.1.2 → 0.1.3
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 +6 -4
- package/dist/index.mjs +43 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["CallPolicyVersion","CallType","ParamCondition","layer","layer","layer","EthereumJSWallet","layer","McpContext.McpContext","Web3Service.Web3Service","ParamConditionCore","layer","layer","createSessionKey","createNameraSessionKey","layer","PromptManager.PromptManager","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","password","handler","KeystoreManager.KeystoreManager","PromptManager.PromptManager","OutputFormatter.OutputFormatter","alias","password","handler","KeystoreManager.KeystoreManager","PromptManager.PromptManager","OutputFormatter.OutputFormatter","alias","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","handler","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","McpManager.McpManager","Dto.CreateKeystoreParams","Dto.DecryptKeystoreParams","Dto.GetKeystoreParams","Dto.ListKeystoreParams","Dto.ImportKeystoreParams","Dto.RemoveKeystoreParams","Dto.CreateSmartAccountParams","Dto.ListSmartAccountParams","Dto.GetSmartAccountInfoParams","Dto.RemoveSmartAccountParams","Dto.GetSmartAccountStatusParams","Dto.ImportSmartAccountParams","Dto.CreateSessionKeyParams","Dto.ListSessionKeysParams","Dto.GetSessionKeyInfoParams","Dto.RemoveSessionKeyParams","Dto.GetSessionKeyStatusParams","Dto.StartMcpServerParams","commands","command","handler","PromptManager.PromptManager","Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","smartAccountAlias","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","Web3Service.Web3Service","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","PromptManager.PromptManager","KeystoreManager.KeystoreManager","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","SessionKeyManager.layer","SmartAccountManager.layer","KeystoreManager.layer","Web3Service.layer","PromptManager.layer","ConfigManager.layer","OutputFormatter.layer","ConfigManager.ConfigManager"],"sources":["../src/dto/keystore.ts","../src/dto/mcp.ts","../src/schema/chain.ts","../src/schema/common.ts","../src/schema/policy.ts","../src/dto/session-key.ts","../src/dto/smart-account.ts","../src/flags/global.ts","../src/types/index.ts","../src/layers/config.ts","../src/layers/prompt.ts","../src/layers/keystore.ts","../src/layers/mcp-context.ts","../src/mcp/helpers/common.ts","../src/mcp/tools/account/address.ts","../src/layers/web3.ts","../src/mcp/helpers/session-key.ts","../src/mcp/tools/account/get-balance.ts","../src/mcp/tools/account/index.ts","../src/mcp/tools/read/read-contract.ts","../src/mcp/tools/read/index.ts","../src/schema/tx.ts","../src/mcp/tools/transaction/execute-transaction.ts","../src/mcp/tools/transaction/native-transfer.ts","../src/mcp/tools/transaction/index.ts","../src/mcp/mcp.ts","../src/mcp/index.ts","../src/helpers/policy.ts","../src/layers/smart-account.ts","../src/layers/session-key.ts","../src/layers/mcp.ts","../src/helpers/pretty.ts","../src/layers/output.ts","../src/commands/keystore/create.ts","../src/commands/keystore/decrypt.ts","../src/commands/keystore/import.ts","../src/commands/keystore/info.ts","../src/commands/keystore/list.ts","../src/commands/keystore/remove.ts","../src/commands/keystore/index.ts","../src/commands/mcp/start.ts","../src/commands/mcp/index.ts","../src/helpers/paths.ts","../src/commands/schema/index.ts","../src/commands/session-key/create/prompts/base.ts","../src/commands/session-key/create/prompts/common.ts","../src/commands/session-key/create/prompts/call.ts","../src/commands/session-key/create/prompts/gas.ts","../src/commands/session-key/create/prompts/rate-limit.ts","../src/commands/session-key/create/prompts/signature-caller.ts","../src/commands/session-key/create/prompts/timestamp.ts","../src/commands/session-key/create/prompts/index.ts","../src/commands/session-key/create/index.ts","../src/helpers/humanize.ts","../src/commands/session-key/info.ts","../src/commands/session-key/list.ts","../src/commands/session-key/remove.ts","../src/flags/shared.ts","../src/commands/session-key/status.ts","../src/commands/session-key/index.ts","../src/commands/smart-account/create.ts","../src/commands/smart-account/import.ts","../src/commands/smart-account/info.ts","../src/commands/smart-account/list.ts","../src/commands/smart-account/remove.ts","../src/commands/smart-account/status.ts","../src/commands/smart-account/index.ts","../src/commands/index.ts","../src/index.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport const Keystore = Schema.Struct({\n version: Schema.Number,\n id: Schema.String,\n address: Schema.String,\n crypto: Schema.Any,\n});\n\nexport const KeystoreData = Schema.Struct({\n path: Schema.String,\n alias: Schema.String,\n data: Keystore,\n});\n\nexport const GetKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to retrieve\",\n }),\n});\n\nexport const ListKeystoreParams = Schema.Void;\n\nexport const CreateKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to create\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to decrypt\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreResponse = Schema.Struct({\n address: Schema.String.annotate({\n description: \"The address of the keystore\",\n }),\n alias: Schema.String.annotate({\n description: \"The alias of the keystore\",\n }),\n privateKey: Schema.Redacted(Schema.String).annotate({\n description: \"The private key of the keystore\",\n }),\n publicKey: Schema.String.annotate({\n description: \"The public key of the keystore\",\n }),\n});\n\nexport const ImportKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to import\",\n }),\n privateKey: Schema.String.annotate({\n description: \"The private key of the keystore to import\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const RemoveKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to remove\",\n }),\n});\n\nexport const GetSignerParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to get the signer for\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport type Keystore = typeof Keystore.Type;\nexport type KeystoreData = typeof KeystoreData.Type;\nexport type GetKeystoreParams = typeof GetKeystoreParams.Type;\nexport type ListKeystoreParams = typeof ListKeystoreParams.Type;\nexport type CreateKeystoreParams = typeof CreateKeystoreParams.Type;\nexport type DecryptKeystoreParams = typeof DecryptKeystoreParams.Type;\nexport type DecryptKeystoreResponse = typeof DecryptKeystoreResponse.Type;\nexport type ImportKeystoreParams = typeof ImportKeystoreParams.Type;\nexport type RemoveKeystoreParams = typeof RemoveKeystoreParams.Type;\nexport type GetSignerParams = typeof GetSignerParams.Type;\n","import { Schema } from \"effect\";\n\nexport const StartMcpServerParams = Schema.Struct({\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to use for the MCP server\",\n }),\n transport: Schema.Literals([\"http\", \"stdio\"]).annotate({\n description: \"The transport to use for the MCP server\",\n }),\n port: Schema.optional(\n Schema.Int.check(Schema.makeFilter((v) => v > 0 && v < 65_536)),\n ).annotate({\n description: \"The port to use for the MCP server when using http transport\",\n }),\n sessionKeys: Schema.mutableKey(Schema.Record(Schema.String, Schema.String)),\n});\n\nexport type StartMcpServerParams = typeof StartMcpServerParams.Type;\n","import { Schema } from \"effect\";\nimport {\n arbitrum,\n arbitrumSepolia,\n arcTestnet,\n avalanche,\n avalancheFuji,\n base,\n baseSepolia,\n type Chain,\n celo,\n celoSepolia,\n mainnet,\n monad,\n monadTestnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n scroll,\n scrollSepolia,\n sepolia,\n tempoModerato,\n unichain,\n unichainSepolia,\n zora,\n zoraSepolia,\n} from \"viem/chains\";\n\nexport type ChainWithMetadata = Chain & {\n key: string;\n};\n\nconst supportedMainnetChains = {\n \"eth-mainnet\": {\n ...mainnet,\n key: \"eth-mainnet\",\n },\n \"opt-mainnet\": {\n ...optimism,\n key: \"opt-mainnet\",\n },\n \"polygon-mainnet\": {\n ...polygon,\n key: \"polygon-mainnet\",\n },\n \"arb-mainnet\": {\n ...arbitrum,\n key: \"arb-mainnet\",\n },\n \"zora-mainnet\": {\n ...zora,\n key: \"zora-mainnet\",\n },\n \"base-mainnet\": {\n ...base,\n key: \"base-mainnet\",\n },\n \"avax-mainnet\": {\n ...avalanche,\n key: \"avax-mainnet\",\n },\n \"unichain-mainnet\": {\n ...unichain,\n key: \"unichain-mainnet\",\n },\n \"celo-mainnet\": {\n ...celo,\n key: \"celo-mainnet\",\n },\n \"scroll-mainnet\": {\n ...scroll,\n key: \"scroll-mainnet\",\n },\n \"monad-mainnet\": {\n ...monad,\n key: \"monad-mainnet\",\n },\n} as const;\n\nconst supportedTestnetChains = {\n \"eth-sepolia\": {\n ...sepolia,\n key: \"eth-sepolia\",\n },\n \"opt-sepolia\": {\n ...optimismSepolia,\n key: \"opt-sepolia\",\n },\n \"polygon-amoy\": {\n ...polygonAmoy,\n key: \"polygon-amoy\",\n },\n \"arb-sepolia\": {\n ...arbitrumSepolia,\n key: \"arb-sepolia\",\n },\n \"zora-sepolia\": {\n ...zoraSepolia,\n key: \"zora-sepolia\",\n },\n \"base-sepolia\": {\n ...baseSepolia,\n key: \"base-sepolia\",\n },\n \"tempo-moderato\": {\n ...tempoModerato,\n key: \"tempo-moderato\",\n },\n \"avax-fuji\": {\n ...avalancheFuji,\n key: \"avax-fuji\",\n },\n \"unichain-sepolia\": {\n ...unichainSepolia,\n key: \"unichain-sepolia\",\n },\n \"monad-testnet\": {\n ...monadTestnet,\n key: \"monad-testnet\",\n },\n \"celo-sepolia\": {\n ...celoSepolia,\n key: \"celo-sepolia\",\n },\n \"scroll-sepolia\": {\n ...scrollSepolia,\n key: \"scroll-sepolia\",\n },\n \"arc-testnet\": {\n ...arcTestnet,\n key: \"arc-testnet\",\n },\n} as const;\n\ntype SupportedTestnetChain = keyof typeof supportedMainnetChains;\ntype SupportedMainnetChain = keyof typeof supportedTestnetChains;\n\nexport const SupportedChain = Schema.Literals([\n ...(Object.keys(supportedMainnetChains) as SupportedMainnetChain[]),\n ...(Object.keys(supportedTestnetChains) as SupportedTestnetChain[]),\n]);\n\nexport type SupportedChain = typeof SupportedChain.Type;\n\nexport const supportedChains = {\n ...supportedMainnetChains,\n ...supportedTestnetChains,\n} as Record<SupportedChain, ChainWithMetadata>;\n\nexport const getChain = (chain: SupportedChain): ChainWithMetadata => {\n return supportedChains[chain];\n};\n\nexport const getChainFromId = (\n chainId: number,\n): ChainWithMetadata | undefined => {\n return Object.values(supportedChains).find((c) => c.id === chainId);\n};\n\nexport const chainIdToChainName = (chainId: number) => {\n const chain = getChainFromId(chainId);\n\n if (!chain) {\n throw new Error(`Chain with id ${chainId} not found`);\n }\n\n return chain.key as SupportedChain;\n};\n","import { Schema, SchemaTransformation } from \"effect\";\n\nexport const BigIntFromString = Schema.String.pipe(\n Schema.decodeTo(\n Schema.BigInt,\n SchemaTransformation.transform({\n encode: (v) => v.toString(),\n decode: (v) => BigInt(v),\n }),\n ),\n);\n\nexport const EthereumAddress = Schema.TemplateLiteral([\n \"0x\",\n Schema.String.check(Schema.isPattern(/^[0-9a-fA-F]{40}$/)),\n]);\n\nexport const Hex = Schema.TemplateLiteral([\n \"0x\",\n Schema.String.check(Schema.isPattern(/^[0-9a-fA-F]*$/)),\n]);\n\nexport const EntrypointVersion = Schema.Literals([\"0.7\", \"0.8\", \"0.9\"]);\nexport const KernelVersion = Schema.Literals([\n \"0.3.0\",\n \"0.3.1\",\n \"0.3.2\",\n \"0.3.3\",\n]);\nexport const OwnerType = Schema.Literals([\"ecdsa\", \"passkey\", \"multisig\"]);\n\nexport type EntrypointVersion = typeof EntrypointVersion.Type;\nexport type KernelVersion = typeof KernelVersion.Type;\nexport type OwnerType = typeof OwnerType.Type;\nexport type Hex = typeof Hex.Type;\nexport type EthereumAddress = typeof EthereumAddress.Type;\n","import { Schema, Struct } from \"effect\";\n\nimport { BigIntFromString, EthereumAddress, Hex } from \"./common\";\n\nexport const SudoPolicyParams = Schema.Struct({\n type: Schema.Literal(\"sudo\"),\n});\n\nexport const TimestampPolicyParams = Schema.Struct({\n type: Schema.Literal(\"timestamp\"),\n validAfter: Schema.optional(Schema.Number)\n .pipe(Schema.withDecodingDefault(() => 0))\n .annotate({\n description:\n \"The timestamp in seconds after which signer is valid. If not provided, the signer is valid immediately.\",\n }),\n validUntil: Schema.optional(Schema.Number)\n .pipe(Schema.withDecodingDefault(() => 0))\n .annotate({\n description:\n \"The timestamp in seconds until which signer is valid. If not provided, the signer is valid indefinitely.\",\n }),\n});\n\nexport const SignatureCallerPolicyParams = Schema.Struct({\n type: Schema.Literal(\"signature-caller\"),\n allowedCallers: Schema.mutable(Schema.Array(EthereumAddress)).annotate({\n description:\n \"List of addresses that are allowed to validate messages signed by the signer.\",\n }),\n});\n\nexport const RateLimitPolicyParams = Schema.Struct({\n type: Schema.Literal(\"rate-limit\"),\n interval: Schema.optional(Schema.Number).annotate({\n description: \"Length of interval in seconds\",\n }),\n count: Schema.Number.annotate({\n description: \"The number of calls allowed within the interval\",\n }),\n startAt: Schema.optional(Schema.Number).annotate({\n description:\n \"The timestamp in seconds at which the rate limit starts. Before this signer cannot sign any UserOperations\",\n }),\n});\n\nexport const GasPolicyParams = Schema.Struct({\n type: Schema.Literal(\"gas\"),\n amount: Schema.optional(BigIntFromString).annotate({\n description:\n \"Amount, in wei that the signer can spend on gas, in total across all UserOps it sends.\",\n }),\n enforcePaymaster: Schema.optional(Schema.Boolean).annotate({\n description: \"If set to true, enforce that a paymaster must be used.\",\n default: false,\n }),\n});\n\nexport const CallPolicyVersion = Schema.Literals([\n \"0.0.1\",\n \"0.0.2\",\n \"0.0.3\",\n \"0.0.4\",\n \"0.0.5\",\n]);\n\nexport type CallPolicyVersion = typeof CallPolicyVersion.Type;\n\nconst CallType = Schema.Literals([\"call\", \"delegatecall\", \"batch-call\"]);\n\nexport const ParamCondition = Schema.Literals([\n \"EQUAL\",\n \"GREATER_THAN\",\n \"LESS_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"LESS_THAN_OR_EQUAL\",\n \"NOT_EQUAL\",\n \"ONE_OF\",\n \"SLICE_EQUAL\",\n]);\n\nexport type ParamCondition = typeof ParamCondition.Type;\n\nconst ConditionValue = Schema.Union([\n Schema.Struct({\n condition: ParamCondition.pick([\"ONE_OF\"]),\n value: Schema.mutable(Schema.Array(Schema.Any)).annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n }),\n Schema.Struct({\n condition: ParamCondition.pick([\"SLICE_EQUAL\"]),\n value: Schema.Any.annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n start: Schema.Number,\n length: Schema.Number,\n }),\n Schema.Struct({\n condition: ParamCondition.pick([\n \"EQUAL\",\n \"GREATER_THAN\",\n \"LESS_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"LESS_THAN_OR_EQUAL\",\n \"NOT_EQUAL\",\n \"SLICE_EQUAL\",\n ]),\n value: Schema.Any.annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n }),\n Schema.Null,\n]);\n\nconst ParamRule = Schema.Struct({\n condition: ParamCondition,\n offset: Schema.Number,\n params: Schema.Union([Hex, Schema.mutable(Schema.Array(Hex))]),\n});\n\nconst PermissionCore = Schema.Struct({\n callType: Schema.optional(CallType)\n .pipe(Schema.withDecodingDefault(() => \"call\"))\n .annotate({\n description: \"The type of call to make\",\n default: \"call\",\n }),\n target: EthereumAddress.annotate({\n description:\n \"The target contract to call or address to send ETH to. If this is zeroAddress, then the target can be any contract as long as the ABI matches (or it can be any address if no ABI is specified)\",\n }),\n selector: Schema.optional(Hex).annotate({\n description: \"The function selector if the target is a contract\",\n }),\n valueLimit: Schema.optional(BigIntFromString).annotate({\n description: \"The maximum value in wei that can be sent to the target\",\n }),\n rules: Schema.optional(Schema.Array(ParamRule)),\n});\n\nexport const PermissionManual = PermissionCore;\n\nexport const PermissionWithABI = PermissionCore.mapFields(\n Struct.omit([\"rules\"]),\n).mapFields(\n Struct.assign({\n abi: Schema.mutable(Schema.Array(Schema.Any)).annotate({\n description: \"The ABI of the target contract\",\n }),\n functionName: Schema.String.annotate({\n description: \"The function name\",\n }),\n args: Schema.optional(Schema.Array(ConditionValue)).annotate({\n description:\n \"An array of conditions, each corresponding to an argument, in the order that the arguments are laid out. use null to skip an argument.\",\n }),\n }),\n);\n\nexport const Permission = Schema.Union([PermissionManual, PermissionWithABI]);\n\nexport type PermissionManual = typeof PermissionManual.Type;\nexport type PermissionWithABI = typeof PermissionWithABI.Type;\nexport type Permission = typeof Permission.Type;\n\nexport const CallPolicyParams = Schema.Struct({\n type: Schema.Literal(\"call\"),\n policyVersion: CallPolicyVersion,\n permissions: Schema.optional(Schema.Array(Permission)),\n});\n\nexport const PolicyParams = Schema.Union([\n SudoPolicyParams,\n TimestampPolicyParams,\n SignatureCallerPolicyParams,\n RateLimitPolicyParams,\n GasPolicyParams,\n CallPolicyParams,\n]);\n\nexport type SudoPolicyParams = typeof SudoPolicyParams.Type;\nexport type TimestampPolicyParams = typeof TimestampPolicyParams.Type;\nexport type SignatureCallerPolicyParams =\n typeof SignatureCallerPolicyParams.Type;\nexport type RateLimitPolicyParams = typeof RateLimitPolicyParams.Type;\nexport type GasPolicyParams = typeof GasPolicyParams.Type;\nexport type CallPolicyParams = typeof CallPolicyParams.Type;\nexport type PolicyParams = typeof PolicyParams.Type;\n","import { Schema, Struct } from \"effect\";\n\nimport { EthereumAddress, PolicyParams, SupportedChain } from \"@/schema\";\n\nimport { Keystore } from \"./keystore\";\n\nconst BaseSessionKey = Schema.Struct({\n smartAccountAlias: Schema.String,\n serializedAccounts: Schema.Array(\n Schema.Struct({\n chain: SupportedChain,\n serializedAccount: Schema.String,\n }),\n ),\n}).mapFields(Struct.assign(Keystore.fields));\n\nconst EcdsaSessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"ecdsa\"),\n sessionKeyAddress: EthereumAddress,\n smartAccountAlias: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nconst PasskeySessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"passkey\"),\n passKeyName: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nexport const SessionKey = Schema.Union([EcdsaSessionKey, PasskeySessionKey]);\n\nexport const SessionKeyData = Schema.Struct({\n alias: Schema.String,\n data: SessionKey,\n path: Schema.String,\n});\n\nexport const CreateSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to create\",\n }),\n chains: Schema.mutable(Schema.Array(SupportedChain)).annotate({\n description: \"The chains to create the session key for\",\n }),\n policyParams: Schema.mutable(Schema.Array(PolicyParams)),\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to create the session key for\",\n }),\n ownerKeystorePassword: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the owner keystore with\",\n }),\n sessionKeyPassword: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the session key with\",\n }),\n});\n\nexport const GetSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const ListSessionKeysParams = Schema.Struct({\n smartAccount: Schema.optional(Schema.String).annotate({\n description: \"The alias of the smart account to list session keys for\",\n }),\n});\n\nexport const GetSessionKeyInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const GetSessionKeyStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to retrieve the session key status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const RemoveSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to remove\",\n }),\n});\n\nexport type SessionKey = typeof SessionKey.Type;\nexport type SessionKeyData = typeof SessionKeyData.Type;\nexport type CreateSessionKeyParams = typeof CreateSessionKeyParams.Type;\nexport type GetSessionKeyParams = typeof GetSessionKeyParams.Type;\nexport type ListSessionKeysParams = typeof ListSessionKeysParams.Type;\nexport type GetSessionKeyInfoParams = typeof GetSessionKeyInfoParams.Type;\nexport type GetSessionKeyStatusParams = typeof GetSessionKeyStatusParams.Type;\nexport type RemoveSessionKeyParams = typeof RemoveSessionKeyParams.Type;\n","import { Schema } from \"effect\";\n\nimport {\n BigIntFromString,\n EntrypointVersion,\n EthereumAddress,\n KernelVersion,\n OwnerType,\n} from \"@/schema\";\nimport { SupportedChain } from \"@/schema/chain\";\n\nexport const LocalSmartAccount = Schema.Struct({\n entryPointVersion: EntrypointVersion,\n index: BigIntFromString,\n kernelVersion: KernelVersion,\n ownerAlias: Schema.String,\n ownerType: OwnerType,\n smartAccountAddress: EthereumAddress,\n});\n\nexport const LocalSmartAccountData = Schema.Struct({\n data: LocalSmartAccount,\n path: Schema.String,\n alias: Schema.String,\n});\n\nexport const CreateSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to create\",\n }),\n ownerAlias: Schema.String.annotate({\n description: \"The alias of the owner keystore\",\n }),\n ownerPassword: Schema.redact(Schema.String).annotate({\n description: \"The password of the owner keystore\",\n }),\n index: Schema.optional(\n BigIntFromString.check(Schema.makeFilter((v) => v >= 0n)),\n ).annotate({\n description: \"The index of the smart account\",\n default: 0n,\n }),\n});\n\nexport const GetSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\nexport const ListSmartAccountParams = Schema.Void;\n\nexport const GetSmartAccountInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\n\nexport const RemoveSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to remove\",\n }),\n});\n\nexport const GetSmartAccountStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to get the status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const ImportSmartAccountParams = LocalSmartAccount.pipe(\n Schema.fieldsAssign({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to import\",\n }),\n }),\n);\n\nexport type LocalSmartAccount = typeof LocalSmartAccount.Type;\nexport type LocalSmartAccountData = typeof LocalSmartAccountData.Type;\nexport type CreateSmartAccountParams = typeof CreateSmartAccountParams.Type;\nexport type GetSmartAccountParams = typeof GetSmartAccountParams.Type;\nexport type ListSmartAccountParams = typeof ListSmartAccountParams.Type;\nexport type GetSmartAccountInfoParams = typeof GetSmartAccountInfoParams.Type;\nexport type RemoveSmartAccountParams = typeof RemoveSmartAccountParams.Type;\nexport type GetSmartAccountStatusParams =\n typeof GetSmartAccountStatusParams.Type;\n\nexport type ImportSmartAccountParams = typeof ImportSmartAccountParams.Type;\n","import { Effect } from \"effect\";\nimport { Flag, GlobalFlag } from \"effect/unstable/cli\";\n\nexport const globalOutput = GlobalFlag.setting(\"output\")({\n flag: Flag.choice(\"output\", [\"pretty\", \"json\", \"ndjson\"]).pipe(\n Flag.withAlias(\"o\"),\n Flag.withDefault(\"pretty\"),\n Flag.withDescription(\"Output format (pretty, json, ndjson)\"),\n ),\n});\n\nexport const globalQuite = GlobalFlag.setting(\"quite\")({\n flag: Flag.boolean(\"quite\").pipe(\n Flag.withAlias(\"q\"),\n Flag.withDefault(false),\n Flag.withDescription(\"Do not print output\"),\n ),\n});\n\nexport const globalParams = GlobalFlag.setting(\"params\")({\n flag: Flag.string(\"params\").pipe(\n Flag.optional,\n Flag.withDescription(\"JSON Parameters to pass to the command\"),\n ),\n});\n\nexport const getGlobalFlags = () =>\n Effect.gen(function* () {\n const out = yield* globalOutput;\n const quite = yield* globalQuite;\n const params = yield* globalParams;\n\n return { out, params, quite };\n });\n\nexport const globalFlags = [globalOutput, globalQuite, globalParams];\n","import type { Schema } from \"effect\";\n\nexport type EntityType = \"smart-account\" | \"session-key\" | \"keystore\";\n\nexport const entityName: Record<EntityType, string> = {\n keystore: \"Keystore\",\n \"session-key\": \"Session Key\",\n \"smart-account\": \"Smart Account\",\n};\n\nexport type Entity<TEntityType extends EntityType> = {\n path: string;\n content: string;\n alias: string;\n type: TEntityType;\n};\n\nexport type DeepPaths<T> = {\n [K in keyof T & string]: T[K] extends Schema.Top\n ? K\n : // biome-ignore lint/suspicious/noExplicitAny: safe\n T[K] extends Record<string, any>\n ? `${K}.${DeepPaths<T[K]>}`\n : never;\n}[keyof T & string];\n","import os from \"node:os\";\n\nimport { Data, Effect, FileSystem, Layer, Path, ServiceMap } from \"effect\";\nimport type { SystemErrorTag } from \"effect/PlatformError\";\n\nimport { type Entity, type EntityType, entityName } from \"@/types\";\n\n/**\n * Effect service for managing the CLI configuration directory and stored entities.\n */\nexport type ConfigManager = {\n /**\n * Ensures the base config directory and entity subdirectories exist.\n */\n ensureConfigDirExists: () => Effect.Effect<void, ConfigManagerError>;\n /**\n * Returns the absolute path to the CLI config directory.\n */\n getConfigDirPath: () => Effect.Effect<string>;\n /**\n * Resolves the absolute storage path for a given entity alias and type.\n *\n * @param entity - Entity type and alias used to build the path.\n */\n getEntityPath: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<string>;\n /**\n * Checks if an entity exists at the expected storage path.\n *\n * @param entity - Entity type and alias to check.\n */\n checkEntityExists: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<boolean, ConfigManagerError>;\n /**\n * Loads a single entity by alias and returns its stored content and metadata.\n *\n * @param entity - Entity type and alias to load.\n */\n getEntity: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<Entity<TEntityType>, ConfigManagerError>;\n /**\n * Lists all entities stored for a given type.\n *\n * @param type - Entity type to enumerate.\n */\n getEntitiesForType: <TEntityType extends EntityType>(\n type: TEntityType,\n ) => Effect.Effect<Entity<TEntityType>[], ConfigManagerError>;\n /**\n * Persists a new entity to disk.\n *\n * @param entity - Entity content and metadata to store.\n */\n storeEntity: <TEntityType extends EntityType>(\n entity: Entity<TEntityType>,\n ) => Effect.Effect<Entity<TEntityType>, ConfigManagerError>;\n /**\n * Removes an entity from disk.\n *\n * @param entity - Entity type and alias to remove.\n */\n removeEntity: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<void, ConfigManagerError>;\n};\n\n/**\n * Domain error for configuration and entity storage operations.\n */\nexport class ConfigManagerError extends Data.TaggedError(\n \"@namera-ai/cli/ConfigManagerError\",\n)<{\n code:\n | \"InitializationError\"\n | \"BadArgument\"\n | \"EntityNotFound\"\n | \"EntityAlreadyExists\"\n | SystemErrorTag;\n message: string;\n}> {}\n\ntype GetEntityParams<TEntityType extends EntityType> = {\n type: TEntityType;\n alias: string;\n};\n\n/**\n * Service tag for resolving {@link ConfigManager} from the Effect context.\n */\nexport const ConfigManager = ServiceMap.Service<ConfigManager>(\n \"@namera-ai/cli/ConfigManager\",\n);\n\n/**\n * Live layer that persists CLI entities in the user's config directory.\n */\nexport const layer = Layer.effect(\n ConfigManager,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getConfigDirPath = () =>\n Effect.gen(function* () {\n const homeDir = yield* Effect.sync(() => os.homedir());\n const baseDir = path.join(homeDir, \".namera\");\n\n return baseDir;\n });\n\n const ensureConfigDirExists = () =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n\n const subDirs = [\"smart-accounts\", \"session-keys\", \"keystores\"];\n\n const directoriesToCreate = subDirs.map((dir) =>\n path.join(baseDir, dir),\n );\n\n yield* Effect.forEach(\n directoriesToCreate,\n (dirPath) =>\n fs.makeDirectory(dirPath, { recursive: true }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: \"InitializationError\",\n message: e.message,\n }),\n ),\n ),\n ),\n { concurrency: \"unbounded\" },\n );\n });\n\n const getEntityPath = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n const entityPath = path.join(baseDir, `${entity.type}s`, entity.alias);\n return entityPath;\n });\n\n const checkEntityExists = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n const exists = yield* fs.exists(entityPath).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n return exists;\n });\n\n const getEntity = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n const exists = yield* checkEntityExists(entity);\n\n if (exists) {\n const content = yield* fs.readFileString(entityPath);\n\n return {\n alias: entity.alias,\n content,\n path: entityPath,\n type: entity.type,\n } satisfies Entity<TEntityType>;\n }\n\n return yield* Effect.fail(\n new ConfigManagerError({\n code: \"EntityNotFound\",\n message: `${entityName[entity.type]} with alias ${entity.alias} does not exist`,\n }),\n );\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const getEntitiesForType = <TEntityType extends EntityType>(\n type: TEntityType,\n ) =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n\n const entitiesDir = path.join(baseDir, `${type}s`);\n const entities = yield* fs.readDirectory(entitiesDir);\n\n const effects = entities.map((entityName) =>\n Effect.gen(function* () {\n const entityPath = path.join(entitiesDir, entityName);\n const content = yield* fs.readFileString(entityPath);\n\n return {\n alias: entityName,\n content,\n path: entityPath,\n type,\n } satisfies Entity<TEntityType>;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const storeEntity = <TEntityType extends EntityType>(\n entity: Entity<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n\n const exists = yield* checkEntityExists({\n alias: entity.alias,\n type: entity.type,\n });\n\n if (exists) {\n return yield* Effect.fail(\n new ConfigManagerError({\n code: \"EntityAlreadyExists\",\n message: `Entity ${entity.alias} already exists`,\n }),\n );\n }\n\n yield* fs.writeFileString(entityPath, entity.content);\n\n return {\n alias: entity.alias,\n content: entity.content,\n path: entityPath,\n type: entity.type,\n } satisfies Entity<TEntityType>;\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const removeEntity = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n\n yield* fs.remove(entityPath).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n });\n\n return ConfigManager.of({\n checkEntityExists,\n ensureConfigDirExists,\n getConfigDirPath,\n getEntitiesForType,\n getEntity,\n getEntityPath,\n storeEntity,\n removeEntity,\n });\n }),\n);\n","import { Data, Effect, Layer, type Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport { type Hex, hexToBytes, isHex } from \"viem\";\n\nimport { type EntityType, entityName } from \"@/types\";\n\nimport { ConfigManager } from \"./config\";\n\n/**\n * Effect service for interactive CLI prompts.\n */\nexport type PromptManager = {\n /**\n * Prompts for an alias and validates it against existing storage.\n *\n * @param params - Prompt text, entity type, and expected alias semantics.\n */\n aliasPrompt: (\n params: AliasPromptParams,\n ) => Effect.Effect<string, QuitError, Prompt.Environment>;\n /**\n * Prompts for a password, optionally validating the input.\n *\n * @param params - Prompt text and optional validator.\n * @returns The redacted password.\n */\n passwordPrompt: (\n params: PasswordPromptParams,\n ) => Effect.Effect<Redacted.Redacted<string>, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to select a value from a list of choices.\n *\n * @param params - Selection prompt options and choices.\n * @returns The selected value.\n */\n selectPrompt: <const A>(\n params: Prompt.SelectOptions<A>,\n ) => Effect.Effect<A, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to enter a hex value.\n *\n * @param params - Prompt text and expected length of the hex value.\n * @returns The hex value entered by the user.\n */\n hexPrompt: <TRedacted extends boolean>(\n params: HexPromptParams<TRedacted>,\n ) => Effect.Effect<\n TRedacted extends true ? Redacted.Redacted<Hex> : Hex,\n QuitError,\n Prompt.Environment\n >;\n /**\n * Prompt the user to select multiple options from a list.\n *\n * @param params - Prompt options and multi-select options.\n * @returns A list of selected options.\n */\n multiSelectPrompt: <const A>(\n params: Prompt.SelectOptions<A> & Prompt.MultiSelectOptions,\n ) => Effect.Effect<A[], QuitError, Prompt.Environment>;\n};\n\n/**\n * Service tag for resolving {@link PromptManager} from the Effect context.\n */\nexport const PromptManager = ServiceMap.Service<PromptManager>(\n \"@namera-ai/cli/PromptManager\",\n);\n\n/**\n * Domain error for prompt-related failures.\n */\nexport class PromptManagerError extends Data.TaggedError(\n \"@namera-ai/cli/PromptManagerError\",\n)<{\n code: \"\";\n message: string;\n}> {}\n\n/**\n * Parameters for prompting a user for an entity alias.\n */\nexport type AliasPromptParams = {\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Entity type used to validate alias existence.\n */\n type: EntityType;\n /**\n * Whether the alias must be new or already exist.\n */\n aliasType: \"new\" | \"existing\";\n};\n\n/**\n * Parameters for prompting a user for a password.\n */\nexport type PasswordPromptParams = {\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Optional validator returning the original value or a failure message.\n */\n validate?: (v: string) => Effect.Effect<string, string, never>;\n};\n\n/**\n * Parameters for prompting a user for a hex value.\n */\nexport type HexPromptParams<TRedacted extends boolean> = {\n /**\n * Expected length of the hex value.\n */\n length: number;\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Whether the hex value should be redacted.\n */\n redacted: TRedacted;\n};\n\n/**\n * Live layer that validates and returns interactive prompt input.\n */\nexport const layer = Layer.effect(\n PromptManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n\n const aliasPrompt = (params: AliasPromptParams) =>\n Effect.gen(function* () {\n const alias = yield* Prompt.text({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Alias cannot be empty\");\n }\n\n const exists = yield* configManager\n .checkEntityExists({\n alias: v,\n type: params.type,\n })\n .pipe(\n Effect.catchTag(\"@namera-ai/cli/ConfigManagerError\", (e) =>\n Effect.fail(e.message),\n ),\n );\n\n if (params.aliasType === \"new\" && exists) {\n return yield* Effect.fail(\n `${entityName[params.type]} with alias ${v} already exists`,\n );\n }\n\n if (params.aliasType === \"existing\" && !exists) {\n return yield* Effect.fail(\n `${entityName[params.type]} with alias ${v} does not exist`,\n );\n }\n\n return v;\n }),\n });\n\n return alias;\n });\n\n const passwordPrompt = (params: PasswordPromptParams) =>\n Effect.gen(function* () {\n const password = yield* Prompt.password({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n if (params.validate) {\n return yield* params.validate(v);\n }\n\n return v;\n }),\n });\n\n return password;\n });\n\n const selectPrompt = <const A>(params: Prompt.SelectOptions<A>) =>\n Effect.gen(function* () {\n return yield* Prompt.select(params);\n });\n\n const multiSelectPrompt = <const A>(\n params: Prompt.SelectOptions<A> & Prompt.MultiSelectOptions,\n ) =>\n Effect.gen(function* () {\n return yield* Prompt.multiSelect(params);\n });\n\n function hexPrompt(\n params: HexPromptParams<true>,\n ): Effect.Effect<Redacted.Redacted<Hex>, QuitError, Prompt.Environment>;\n\n function hexPrompt(\n params: HexPromptParams<false>,\n ): Effect.Effect<Hex, QuitError, Prompt.Environment>;\n\n function hexPrompt(params: HexPromptParams<boolean>) {\n return Effect.gen(function* () {\n const validate = (v: string) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Hex cannot be empty\");\n }\n\n if (!isHex(v)) {\n return yield* Effect.fail(\"Invalid hex value\");\n }\n\n const len = hexToBytes(v).length;\n\n if (len !== params.length) {\n return yield* Effect.fail(\n `Hex value must be ${params.length} bytes`,\n );\n }\n\n return v;\n });\n\n if (params.redacted) {\n return yield* Prompt.password({\n message: params.message,\n validate,\n });\n }\n\n return yield* Prompt.text({\n message: params.message,\n validate,\n });\n });\n }\n\n return PromptManager.of({\n aliasPrompt,\n passwordPrompt,\n selectPrompt,\n hexPrompt,\n multiSelectPrompt,\n });\n }),\n);\n","import { Wallet as EthereumJSWallet, Wallet } from \"@ethereumjs/wallet\";\nimport { Data, Effect, Layer, Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport type { Environment } from \"effect/unstable/cli/Prompt\";\nimport { type Hex, hexToBytes, toHex } from \"viem\";\nimport { type LocalAccount, privateKeyToAccount } from \"viem/accounts\";\n\nimport type {\n CreateKeystoreParams,\n DecryptKeystoreParams,\n DecryptKeystoreResponse,\n GetKeystoreParams,\n GetSignerParams,\n ImportKeystoreParams,\n Keystore,\n KeystoreData,\n RemoveKeystoreParams,\n} from \"@/dto\";\n\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { PromptManager } from \"./prompt\";\n\n/**\n * Effect service for keystore CRUD, selection, and decryption operations.\n */\nexport type KeystoreManager = {\n /**\n * Loads a keystore by alias and parses it into a typed keystore data object.\n *\n * @param params - Alias for the keystore to load.\n */\n getKeystore: (\n params: GetKeystoreParams,\n ) => Effect.Effect<KeystoreData, ConfigManagerError | KeystoreManagerError>;\n /**\n * Lists all stored keystores, parsing each into a typed keystore data object.\n */\n listKeystores: () => Effect.Effect<\n KeystoreData[],\n ConfigManagerError | KeystoreManagerError\n >;\n /**\n * Opens an interactive prompt to select a keystore from stored entries.\n *\n * @param params - Prompt message.\n */\n selectKeystore: (params: {\n message: string;\n }) => Effect.Effect<\n KeystoreData,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Environment\n >;\n /**\n * Creates a new random wallet, encrypts it, and stores as a keystore.\n *\n * @param params - Alias and password used for the new keystore.\n */\n createKeystore: (\n params: CreateKeystoreParams,\n ) => Effect.Effect<KeystoreData, ConfigManagerError | KeystoreManagerError>;\n /**\n * Decrypts a keystore and returns key material.\n *\n * @param params - Alias and password for the keystore to decrypt.\n */\n decryptKeystore: (\n params: DecryptKeystoreParams,\n ) => Effect.Effect<\n DecryptKeystoreResponse,\n KeystoreManagerError | ConfigManagerError\n >;\n /**\n * Imports a keystore from a private key and stores as a keystore.\n *\n * @param params - Alias and private key for the keystore to import.\n */\n importKeystore: (\n params: ImportKeystoreParams,\n ) => Effect.Effect<\n KeystoreData,\n ConfigManagerError | KeystoreManagerError,\n never\n >;\n /**\n * Removes a keystore from storage.\n *\n * @param params - Alias of the keystore to remove.\n */\n removeKeystore: (params: {\n readonly alias: string;\n }) => Effect.Effect<void, ConfigManagerError | KeystoreManagerError, never>;\n getSigner: (\n params: GetSignerParams,\n ) => Effect.Effect<LocalAccount, ConfigManagerError | KeystoreManagerError>;\n /**\n * Prompts the user to enter the password for a keystore.\n *\n * @param params - Alias of the keystore and message to display.\n * @returns The password for the keystore.\n */\n getKeystorePassword: (params: {\n alias: string;\n message: string;\n }) => Effect.Effect<\n Redacted.Redacted<string>,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Prompt.Environment\n >;\n};\n\n/**\n * Service tag for resolving {@link KeystoreManager} from the Effect context.\n */\nexport const KeystoreManager = ServiceMap.Service<KeystoreManager>(\n \"@namera-ai/cli/KeystoreManager\",\n);\n\n/**\n * Domain error for keystore management operations.\n */\nexport class KeystoreManagerError extends Data.TaggedError(\n \"@namera-ai/cli/KeystoreManagerError\",\n)<{\n code:\n | \"KeystoreParseError\"\n | \"KeystoreAlreadyExists\"\n | \"KeystoreCreationFailed\"\n | \"KeystoreDecryptionFailed\"\n | \"KeystoreNotFound\"\n | \"DecryptError\";\n message: string;\n}> {}\n\n/**\n * Live layer wiring the keystore manager with configuration and prompts.\n */\nexport const layer = Layer.effect(\n KeystoreManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const promptManager = yield* PromptManager;\n\n const getKeystore = (params: GetKeystoreParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"keystore\",\n });\n\n const parsedKeystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(res.content) as Keystore,\n });\n\n const wallet: KeystoreData = {\n alias: res.alias,\n data: {\n ...parsedKeystore,\n address: `0x${parsedKeystore.address}`,\n },\n path: res.path,\n };\n\n return wallet;\n });\n\n const listKeystores = () =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"keystore\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsedKeystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(entity.content) as Keystore,\n });\n\n const wallet: KeystoreData = {\n alias: entity.alias,\n data: {\n ...parsedKeystore,\n address: `0x${parsedKeystore.address}`,\n },\n path: entity.path,\n };\n\n return wallet;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n });\n\n const createKeystore = (params: CreateKeystoreParams) =>\n Effect.gen(function* () {\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"keystore\",\n });\n\n // Check if alias is already taken\n const aliasTaken = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (aliasTaken) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreAlreadyExists\",\n message: `Keystore with alias ${params.alias} already exists`,\n }),\n );\n }\n\n const keystoreString = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreCreationFailed\",\n message: \"Failed to create keystore\",\n }),\n try: () => EthereumJSWallet.generate().toV3String(params.password),\n });\n\n // Store Entity\n yield* configManager.storeEntity({\n alias: params.alias,\n content: keystoreString,\n path: entityPath,\n type: \"keystore\",\n });\n\n const keystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(keystoreString) as Keystore,\n });\n\n const data: KeystoreData = {\n alias: params.alias,\n data: {\n ...keystore,\n address: `0x${keystore.address}`,\n },\n path: entityPath,\n };\n\n return data;\n });\n\n const decryptKeystore = (params: DecryptKeystoreParams) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({\n alias: params.alias,\n });\n\n const wallet = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreDecryptionFailed\",\n message: \"Failed to decrypt keystore\",\n }),\n try: () => EthereumJSWallet.fromV3(keystore.data, params.password),\n });\n\n return {\n address: wallet.getChecksumAddressString(),\n alias: params.alias,\n privateKey: Redacted.make(wallet.getPrivateKeyString()),\n publicKey: wallet.getPublicKeyString(),\n };\n });\n\n const selectKeystore = (params: { message: string }) =>\n Effect.gen(function* () {\n const keystores = yield* listKeystores();\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: keystores.map((k) => ({\n title: k.alias,\n value: k,\n description: k.data.address,\n })) satisfies Prompt.SelectChoice<KeystoreData>[],\n });\n\n return res;\n });\n\n const importKeystore = (params: ImportKeystoreParams) =>\n Effect.gen(function* () {\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"keystore\",\n });\n\n // Check if alias is already taken\n const aliasTaken = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (aliasTaken) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreAlreadyExists\",\n message: `Keystore with alias ${params.alias} already exists`,\n }),\n );\n }\n\n const keystoreString = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreCreationFailed\",\n message: \"Failed to create keystore\",\n }),\n try: () =>\n EthereumJSWallet.fromPrivateKey(\n hexToBytes(params.privateKey as Hex),\n ).toV3String(params.password),\n });\n\n // Store Entity\n yield* configManager.storeEntity({\n alias: params.alias,\n content: keystoreString,\n path: entityPath,\n type: \"keystore\",\n });\n\n const keystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(keystoreString) as Keystore,\n });\n\n const data: KeystoreData = {\n alias: params.alias,\n data: keystore,\n path: entityPath,\n };\n\n return data;\n });\n\n const removeKeystore = (params: RemoveKeystoreParams) =>\n Effect.gen(function* () {\n // Check if alias exists\n const exists = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (!exists) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreNotFound\",\n message: `Keystore with alias ${params.alias} does not exist`,\n }),\n );\n }\n\n return yield* configManager.removeEntity({\n alias: params.alias,\n type: \"keystore\",\n });\n });\n\n const getSigner = (params: GetSignerParams) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({ alias: params.alias });\n\n const wallet = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreDecryptionFailed\",\n message: \"Failed to decrypt keystore\",\n }),\n try: () => EthereumJSWallet.fromV3(keystore.data, params.password),\n });\n\n return privateKeyToAccount(\n toHex(wallet.getPrivateKey()),\n ) as LocalAccount;\n });\n\n const getKeystorePassword = (params: { alias: string; message: string }) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({ alias: params.alias });\n\n const password = yield* promptManager.passwordPrompt({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n yield* Effect.tryPromise({\n try: () => Wallet.fromV3(keystore.data, v),\n catch: () =>\n new KeystoreManagerError({\n code: \"DecryptError\",\n message: `Invalid password for keystore ${params.alias}`,\n }),\n }).pipe(Effect.catch(() => Effect.fail(\"Invalid password\")));\n\n return v;\n }),\n });\n\n return password;\n });\n\n return KeystoreManager.of({\n createKeystore,\n decryptKeystore,\n getKeystore,\n listKeystores,\n selectKeystore,\n importKeystore,\n removeKeystore,\n getSigner,\n getKeystorePassword,\n });\n }),\n);\n","import { ServiceMap } from \"effect\";\nimport type { LocalAccount } from \"viem\";\n\nimport type { LocalSmartAccount, SessionKeyData } from \"@/dto\";\n\nexport type McpContext = {\n smartAccount: LocalSmartAccount;\n sessionKeys: (SessionKeyData & {\n signer: LocalAccount;\n })[];\n};\n\nexport const McpContext = ServiceMap.Service<McpContext>(\n \"@namera-ai/cli/McpContext\",\n);\n","import { Schema } from \"effect\";\n\nexport const EmptyArgs = Schema.Record(Schema.String, Schema.Unknown);\n\nexport class InsufficientPermissions extends Schema.TaggedErrorClass<InsufficientPermissions>()(\n \"InsufficientPermissions\",\n {},\n) {}\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { EmptyArgs } from \"@/mcp/helpers/common\";\n\nexport const GetAddressTool = Tool.make(\"get_wallet_address\", {\n dependencies: [McpContext],\n description: \"Get the address of the wallet\",\n failure: Schema.Never,\n parameters: EmptyArgs,\n success: Schema.String,\n});\n\nexport const getAddressToolHandler = () =>\n Effect.gen(function* () {\n const context = yield* McpContext;\n\n return context.smartAccount.smartAccountAddress;\n });\n","import { Config, Effect, Layer, Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport {\n type Chain,\n type Client,\n createPublicClient,\n type HttpTransport,\n http,\n} from \"viem\";\n\nimport {\n type ChainWithMetadata,\n getChain,\n type SupportedChain,\n supportedChains,\n} from \"@/schema\";\n\nimport { PromptManager } from \"./prompt\";\n\nexport type Web3Service = {\n /**\n * Creates a viem public client for the requested chain.\n *\n * Falls back to an environment-derived RPC URL when not explicitly provided.\n *\n * @param params - Chain key and optional RPC URL override.\n */\n getPublicClient: (\n params: GetPublicClientParams,\n ) => Effect.Effect<Client<HttpTransport, Chain, undefined>>;\n /**\n * Prompts the user to select a single supported chain.\n *\n * @param params - Prompt message to display.\n */\n selectChain: (params: {\n message: string;\n }) => Effect.Effect<SupportedChain, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to select one or more supported chains.\n *\n * @param params - Prompt message to display.\n */\n multiSelectChain: (params: {\n message: string;\n }) => Effect.Effect<SupportedChain[], QuitError, Prompt.Environment>;\n /**\n * Creates a viem bundler transport for the requested chain.\n *\n * Falls back to an environment-derived RPC URL when not explicitly provided.\n *\n * @param params - Chain key and optional RPC URL override.\n */\n getBundlerTransport: (\n params: GetBundlerClientParams,\n ) => Effect.Effect<HttpTransport<undefined, false>, never, never>;\n};\n\n/**\n * Parameters for constructing a public client.\n */\ntype GetPublicClientParams = {\n /**\n * Target chain identifier key.\n */\n chain: SupportedChain;\n /**\n * Optional RPC URL override for the chain.\n */\n rpcUrl?: string;\n};\n\nexport type GetBundlerClientParams = {\n /**\n * Target chain identifier key.\n */\n chain: SupportedChain;\n /**\n * Optional RPC URL override for the chain.\n *\n */\n bundlerUrl?: string;\n};\n\n/**\n * Service tag for resolving {@link Web3Service} from the Effect context.\n */\nexport const Web3Service = ServiceMap.Service<Web3Service>(\n \"@namera-ai/cli/Web3Service\",\n);\n\n/**\n * Live layer that wires web3 clients and chain selection prompts.\n */\nexport const layer = Layer.effect(\n Web3Service,\n Effect.gen(function* () {\n const promptManager = yield* PromptManager;\n\n const chainNameToEnvVar = (chain: SupportedChain, suffix: string) => {\n return `${chain.replaceAll(\"-\", \"_\").toUpperCase()}_${suffix}`;\n };\n\n const getRpcUrl = (params: GetPublicClientParams) =>\n Effect.gen(function* () {\n let rpcUrl: string | undefined;\n\n if (params.rpcUrl) {\n rpcUrl = params.rpcUrl;\n } else {\n // check env\n const envVarName = chainNameToEnvVar(params.chain, \"RPC_URL\");\n const envRpcUrl = yield* Config.option(Config.redacted(envVarName));\n\n if (envRpcUrl._tag === \"Some\") {\n rpcUrl = Redacted.value(envRpcUrl.value);\n } else {\n rpcUrl = undefined;\n }\n }\n\n return rpcUrl;\n }).pipe(Effect.orDie);\n\n const getBundlerUrl = (params: GetBundlerClientParams) =>\n Effect.gen(function* () {\n let bundlerUrl: string | undefined;\n\n if (params.bundlerUrl) {\n bundlerUrl = params.bundlerUrl;\n } else {\n // check env\n const envVarName = chainNameToEnvVar(params.chain, \"BUNDLER_URL\");\n const envRpcUrl = yield* Config.option(Config.redacted(envVarName));\n\n if (envRpcUrl._tag === \"Some\") {\n bundlerUrl = Redacted.value(envRpcUrl.value);\n } else {\n const chain = getChain(params.chain);\n // Defaults to Pimlico Public RPC\n bundlerUrl = `https://public.pimlico.io/v2/${chain.id}/rpc`;\n }\n }\n\n return bundlerUrl;\n }).pipe(Effect.orDie);\n\n const getPublicClient = (params: GetPublicClientParams) =>\n Effect.gen(function* () {\n const rpcUrl = yield* getRpcUrl(params);\n const chain = getChain(params.chain);\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n return client;\n });\n\n const getBundlerTransport = (params: GetBundlerClientParams) =>\n Effect.gen(function* () {\n const bundlerUrl = yield* getBundlerUrl(params);\n return http(bundlerUrl);\n });\n\n const selectChain = (params: { message: string }) =>\n Effect.gen(function* () {\n const chains = Object.values(supportedChains) as ChainWithMetadata[];\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: chains.map((c) => ({\n title: c.name,\n value: c.key as SupportedChain,\n })) satisfies Prompt.SelectChoice<SupportedChain>[],\n });\n\n return res;\n });\n\n const multiSelectChain = (params: { message: string }) =>\n Effect.gen(function* () {\n const chains = Object.values(supportedChains) as ChainWithMetadata[];\n\n const res = yield* promptManager.multiSelectPrompt({\n message: params.message,\n choices: chains.map((c) => ({\n title: c.name,\n value: c.key as SupportedChain,\n })) satisfies Prompt.SelectChoice<SupportedChain>[],\n min: 1,\n });\n\n return res;\n });\n\n return Web3Service.of({\n getPublicClient,\n selectChain,\n multiSelectChain,\n getBundlerTransport,\n });\n }),\n);\n","/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */\nimport type {\n CallPolicyParams,\n Policy,\n SignatureCallerPolicyParams,\n TimestampPolicyParams,\n} from \"@namera-ai/sdk/policy\";\nimport {\n createSessionKeyClient,\n deserializePermissionAccountParams,\n} from \"@namera-ai/sdk/session-key\";\nimport { Effect } from \"effect\";\n\nimport type { SessionKeyData } from \"@/dto\";\nimport { McpContext, Web3Service } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nimport { chainIdToChainName } from \"../../schema/chain\";\nimport type { AnyOperation, PolicyMap } from \"../types\";\nimport { InsufficientPermissions } from \"./common\";\n\ntype PolicyParams = Policy[\"policyParams\"];\n\nconst toPolicyMap = (policies: PolicyParams[]): PolicyMap | null => {\n const map: PolicyMap = {};\n\n for (const p of policies) {\n if (p.type === \"timestamp\") {\n if (map.timestamp) return null; // Gracefully invalidate this key\n map.timestamp = p;\n }\n if (p.type === \"call\") {\n if (map.call) return null;\n map.call = p;\n }\n if (p.type === \"signature-caller\") {\n if (map.signatureCaller) return null;\n map.signatureCaller = p;\n }\n if (p.type === \"gas\") {\n if (map.gas) return null;\n map.gas = p;\n }\n if (p.type === \"rate-limit\") {\n if (map.rateLimit) return null;\n map.rateLimit = p;\n }\n if (p.type === \"sudo\") {\n if (map.sudo) return null;\n map.sudo = p;\n }\n }\n\n return map;\n};\n\nexport function evaluateTimestamp(\n policy: TimestampPolicyParams,\n _chainIds: number[],\n _operation: AnyOperation,\n): boolean {\n // validAfter: the time after which the signer becomes valid.\n // If not specified (or 0), the signer is immediately valid.\n //\n // validUntil: the time before which the signer is valid.\n // If not specified, the signer never expires.\n const now = Date.now(); // ms\n\n if (policy.validAfter !== undefined && now < policy.validAfter * 1000) {\n return false;\n }\n\n if (policy.validUntil !== undefined && now >= policy.validUntil * 1000) {\n return false;\n }\n\n return true;\n}\n\nexport function evaluateSignature(\n policy: SignatureCallerPolicyParams,\n chainIds: number[],\n operation: Extract<AnyOperation, { intent: \"sign\" }>,\n): boolean {\n const callers = operation.allowedCallers;\n\n if (!callers || callers.length === 0) return false;\n if (!chainIds.includes(operation.chainId)) return false;\n\n // every caller must be allowed\n return callers.every((caller) => policy.allowedCallers.includes(caller));\n}\n\nexport function evaluateCall(\n policy: CallPolicyParams,\n chainIds: number[],\n operation: Extract<AnyOperation, { intent: \"transaction\" }>,\n): boolean {\n const permissions = policy.permissions ?? [];\n if (permissions.length === 0) return false;\n\n const { batches } = operation;\n\n if (batches.length === 0) return false;\n\n return batches.every((batch) => {\n const { calls, chainId } = batch;\n\n return calls.every((call) => {\n const { to, value = 0n, data } = call;\n if (!chainIds.includes(chainId)) return false;\n\n return permissions.some((p) => {\n if (p.target !== to) return false;\n const valueLimit = p.valueLimit ?? 0n;\n if (value > valueLimit) return false;\n\n const isContractCall = data.length >= 10;\n\n if (\"functionName\" in p) {\n if (!isContractCall) return false;\n if (!p.selector) return false;\n\n const selector = data.slice(0, 10);\n if (selector !== p.selector) return false;\n\n // TODO: param rules\n return true;\n }\n\n // EOA\n return true;\n });\n });\n });\n}\n\nconst evaluateSessionKey = (\n sessionKey: SessionKeyData,\n operation: AnyOperation,\n) => {\n // Read is always allowed\n if (operation.intent === \"read\") return true;\n\n const accountParams = deserializePermissionAccountParams(\n sessionKey.data.serializedAccounts[0]?.serializedAccount ?? \"\",\n );\n\n const chainIds = sessionKey.data.serializedAccounts.map(\n (a) => getChain(a.chain).id,\n );\n\n const policies = (accountParams.permissionParams.policies ?? []).map(\n (x) => x.policyParams,\n );\n\n const p = toPolicyMap(policies);\n\n if (!p) return false;\n\n const hasSudo = Boolean(p.sudo);\n\n // A valid sudo key should not have call or signature policies attached\n if (hasSudo && (p.call || p.signatureCaller)) {\n return false;\n }\n\n if (p.timestamp && !evaluateTimestamp(p.timestamp, chainIds, operation))\n return false;\n\n // TODO: Do gas and rate limits\n\n if (!hasSudo) {\n if (operation.intent === \"transaction\") {\n if (!p.call) return false;\n if (!evaluateCall(p.call, chainIds, operation)) return false;\n }\n\n if (operation.intent === \"sign\") {\n if (!p.signatureCaller) return false;\n if (!evaluateSignature(p.signatureCaller, chainIds, operation))\n return false;\n }\n }\n\n return true;\n};\n\nexport type GetValidSessionKeysParams = {\n operation: AnyOperation;\n};\n\nexport const getValidSessionKeys = (params: GetValidSessionKeysParams) =>\n Effect.gen(function* () {\n const context = yield* McpContext.McpContext;\n const { sessionKeys } = context;\n\n const validKeys = sessionKeys.filter((sk) => {\n return evaluateSessionKey(sk, params.operation);\n });\n\n return validKeys;\n });\n\nexport const getSessionKeyClient = (params: GetValidSessionKeysParams) =>\n Effect.gen(function* () {\n const context = yield* McpContext.McpContext;\n const { sessionKeys, smartAccount } = context;\n\n const validKeys = sessionKeys.filter((sk) => {\n return evaluateSessionKey(sk, params.operation);\n });\n\n const key = validKeys[0];\n\n if (!key) return yield* Effect.fail(new InsufficientPermissions());\n\n const web3Service = yield* Web3Service.Web3Service;\n\n let chainId: number;\n\n if (params.operation.intent === \"read\") {\n chainId = params.operation.chainId;\n } else if (params.operation.intent === \"sign\") {\n chainId = params.operation.chainId;\n } else {\n chainId = params.operation.batches[0]?.chainId ?? 1;\n }\n\n const chainName = chainIdToChainName(chainId);\n const chain = getChain(chainName);\n const publicClient = yield* web3Service.getPublicClient({\n chain: chainName,\n });\n const bundlerTransport = yield* web3Service.getBundlerTransport({\n chain: chainName,\n });\n const serializedAccount =\n key.data.serializedAccounts.find((a) => a.chain === chainName)\n ?.serializedAccount ?? \"\";\n\n const accountClient = yield* Effect.promise(() =>\n createSessionKeyClient({\n type: \"ecdsa\",\n bundlerTransport,\n chain,\n client: publicClient,\n entrypointVersion: smartAccount.entryPointVersion,\n kernelVersion: smartAccount.kernelVersion,\n serializedAccount,\n signer: key.signer,\n }),\n );\n\n return accountClient;\n });\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { formatUnits } from \"viem\";\nimport { getBalance } from \"viem/actions\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, SupportedChain } from \"@/schema\";\n\nexport const GetBalanceToolParams = Schema.Struct({\n address: EthereumAddress.annotate({\n description: \"The address to get the balance for\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to get the balance for\",\n }),\n});\n\nexport const GetBalanceToolResult = Schema.Struct({\n nativeCurrency: Schema.Struct({\n name: Schema.String.annotate({\n description: \"The name of the currency\",\n }),\n symbol: Schema.String.annotate({\n description: \"The symbol of the currency\",\n }),\n decimals: Schema.Number.annotate({\n description: \"The number of decimals the currency has\",\n }),\n }).annotate({\n description: \"The native currency of the chain\",\n }),\n balance: Schema.Struct({\n amount: Schema.String.annotate({\n description: \"Balance in atomic units\",\n }),\n formatted: Schema.String.annotate({\n description: \"Balance in native currency units\",\n }),\n }),\n});\n\nexport type GetBalanceToolResult = typeof GetBalanceToolResult.Type;\nexport type GetBalanceToolParams = typeof GetBalanceToolParams.Type;\n\nexport const GetBalanceTool = Tool.make(\"get_balance\", {\n dependencies: [McpContext, Web3Service],\n description: \"Get the address of the wallet\",\n failure: InsufficientPermissions,\n parameters: GetBalanceToolParams,\n success: GetBalanceToolResult,\n});\n\nexport const getBalanceToolHandler = (params: GetBalanceToolParams) =>\n Effect.gen(function* () {\n const sessionKeyClient = yield* getSessionKeyClient({\n operation: {\n intent: \"read\",\n chainId: getChain(params.chain).id,\n },\n });\n\n const res = yield* Effect.promise(() =>\n getBalance(sessionKeyClient.client, {\n address: params.address,\n }),\n );\n\n const data = {\n nativeCurrency: sessionKeyClient.chain.nativeCurrency,\n balance: {\n amount: res.toString(),\n formatted: formatUnits(\n res,\n sessionKeyClient.chain.nativeCurrency.decimals,\n ),\n },\n };\n\n return data;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport { GetAddressTool, getAddressToolHandler } from \"./address\";\nimport { GetBalanceTool, getBalanceToolHandler } from \"./get-balance\";\n\nexport const AccountTools = Toolkit.make(GetAddressTool, GetBalanceTool);\nexport const AccountToolsHandlers = AccountTools.toLayer(\n Effect.succeed({\n get_wallet_address: getAddressToolHandler,\n get_balance: getBalanceToolHandler,\n }),\n);\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { readContract } from \"viem/actions\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, SupportedChain } from \"@/schema\";\n\nexport const ReadContractToolParams = Schema.Struct({\n chain: SupportedChain.annotate({\n description: \"The chain to use for the transfer\",\n }),\n contractAddress: EthereumAddress.annotate({\n description: \"The ethereum address of the contract to read\",\n }),\n abi: Schema.Array(Schema.Any).annotate({\n description: \"The ABI of the contract to read\",\n }),\n functionName: Schema.String.annotate({\n description: \"The name of the function to call on the contract\",\n }),\n args: Schema.Array(Schema.Any).annotate({\n description: \"The arguments to pass to the function\",\n }),\n});\n\nexport type ReadContractToolParams = typeof ReadContractToolParams.Type;\n\nexport const ReadContractTool = Tool.make(\"read_contract\", {\n dependencies: [McpContext, Web3Service],\n description: \"Read data from a specified contract.\",\n failure: InsufficientPermissions,\n parameters: ReadContractToolParams,\n success: Schema.Any.annotate({\n description: \"The data returned by the contract\",\n }),\n});\n\nexport const readContractToolHandler = (params: ReadContractToolParams) =>\n Effect.gen(function* () {\n const chain = getChain(params.chain);\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"read\",\n chainId: chain.id,\n },\n });\n\n readContract(client, {\n address: params.contractAddress,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const result = yield* Effect.promise(() =>\n readContract(client, {\n address: params.contractAddress,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n );\n\n return result;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport { ReadContractTool, readContractToolHandler } from \"./read-contract\";\n\nexport const ReadTools = Toolkit.make(ReadContractTool);\nexport const ReadToolsHandlers = ReadTools.toLayer(\n Effect.succeed({\n read_contract: (params) => readContractToolHandler(params),\n }),\n);\n","import { Schema } from \"effect\";\n\nimport { BigIntFromString, EthereumAddress, Hex } from \"./common\";\n\nexport const Call = Schema.Struct({\n to: EthereumAddress.annotate({\n description: \"The target address to call\",\n }),\n data: Hex.annotate({\n description: \"The data to send with the call\",\n }),\n value: Schema.optional(BigIntFromString).annotate({\n description: \"The value to send with the call\",\n }),\n});\n\nexport const Batch = Schema.Struct({\n chainId: Schema.Int.annotate({\n description: \"The chain ID to execute the transaction on\",\n }),\n nonceKey: Schema.optional(Schema.String).annotate({\n description: \"The nonce key to use, for 2D Parallel transactions.\",\n }),\n calls: Schema.mutable(Schema.Array(Call)),\n});\n\nexport const ExecuteTransactionParams = Schema.Struct({\n batches: Schema.mutable(Schema.Array(Batch)),\n});\n\nexport type Call = typeof Call.Type;\nexport type Batch = typeof Batch.Type;\nexport type ExecuteTransactionParams = typeof ExecuteTransactionParams.Type;\n","import { executeTransaction } from \"@namera-ai/sdk/transaction\";\nimport { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport type { Hex } from \"@/schema\";\nimport { Batch } from \"@/schema/tx\";\n\nexport const ExecuteTransactionToolParams = Batch;\n\nexport type ExecuteTransactionToolParams =\n typeof ExecuteTransactionToolParams.Type;\n\nexport const ExecuteTransactionTool = Tool.make(\"execute_transaction\", {\n dependencies: [McpContext, Web3Service],\n description: \"Send transactions.\",\n failure: InsufficientPermissions,\n parameters: ExecuteTransactionToolParams,\n success: Schema.String.annotate({\n description: \"The transaction hash for the executed transaction.\",\n }),\n});\n\nexport const executeTransactionToolHandler = (\n params: ExecuteTransactionToolParams,\n) =>\n Effect.gen(function* () {\n const batches: Batch[] = [\n {\n chainId: params.chainId,\n nonceKey: params.nonceKey,\n calls: params.calls,\n },\n ];\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"transaction\",\n batches,\n },\n });\n\n const txHashes = yield* Effect.promise(() =>\n executeTransaction({\n clients: [client],\n batches,\n }),\n );\n\n return txHashes[0]?.receipt.transactionHash as Hex;\n });\n","import { executeTransaction } from \"@namera-ai/sdk/transaction\";\nimport { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { parseUnits } from \"viem\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, type Hex, SupportedChain } from \"@/schema\";\nimport type { Batch } from \"@/schema/tx\";\n\nexport const NativeTransferToolParams = Schema.Struct({\n chain: SupportedChain.annotate({\n description: \"The chain to use for the transfer\",\n }),\n address: EthereumAddress.annotate({\n description: \"The ethereum address to transfer to\",\n }),\n amount: Schema.String.annotate({\n description: \"The amount of native tokens to transfer\",\n }),\n unit: Schema.Literals([\"wei\", \"gwei\", \"ether\"]),\n});\n\nexport type NativeTransferToolParams = typeof NativeTransferToolParams.Type;\n\nexport const NativeTransferTool = Tool.make(\"native_transfer\", {\n dependencies: [McpContext, Web3Service],\n description: \"Transfer Native Tokens to a specified address.\",\n failure: InsufficientPermissions,\n parameters: NativeTransferToolParams,\n success: Schema.String.annotate({\n description: \"The transaction hash of the transfer\",\n }),\n});\n\nexport const nativeTransferToolHandler = (params: NativeTransferToolParams) =>\n Effect.gen(function* () {\n const decimals = () => {\n if (params.unit === \"wei\") return 1;\n if (params.unit === \"gwei\") return 9;\n return 18;\n };\n\n const amount = parseUnits(params.amount.toString(), decimals());\n const chain = getChain(params.chain);\n\n const batches: Batch[] = [\n {\n chainId: chain.id,\n calls: [\n {\n to: params.address,\n value: amount,\n data: \"0x\",\n },\n ],\n },\n ];\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"transaction\",\n batches,\n },\n });\n\n const txHashes = yield* Effect.promise(() =>\n executeTransaction({\n clients: [client],\n batches,\n }),\n );\n\n return txHashes[0]?.receipt.transactionHash as Hex;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport {\n ExecuteTransactionTool,\n executeTransactionToolHandler,\n} from \"./execute-transaction\";\nimport {\n NativeTransferTool,\n nativeTransferToolHandler,\n} from \"./native-transfer\";\n\nexport const TransactionTools = Toolkit.make(\n NativeTransferTool,\n ExecuteTransactionTool,\n);\nexport const TransactionToolsHandlers = TransactionTools.toLayer(\n Effect.succeed({\n native_transfer: (params) => nativeTransferToolHandler(params),\n execute_transaction: (params) => executeTransactionToolHandler(params),\n }),\n);\n","import { Layer } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\n\nimport { AccountTools, AccountToolsHandlers } from \"./tools/account\";\nimport { ReadTools, ReadToolsHandlers } from \"./tools/read\";\nimport {\n TransactionTools,\n TransactionToolsHandlers,\n} from \"./tools/transaction\";\n\nconst Account = Layer.effectDiscard(\n McpServer.registerToolkit(AccountTools),\n).pipe(Layer.provideMerge(AccountToolsHandlers));\n\nconst Transfer = Layer.effectDiscard(\n McpServer.registerToolkit(TransactionTools),\n).pipe(Layer.provideMerge(TransactionToolsHandlers));\n\nconst Read = Layer.effectDiscard(McpServer.registerToolkit(ReadTools)).pipe(\n Layer.provideMerge(ReadToolsHandlers),\n);\n\nexport const McpLive = Layer.mergeAll(Account, Transfer, Read);\n","import { createServer } from \"node:http\";\n\nimport { NodeHttpServer, NodeStdio } from \"@effect/platform-node\";\nimport { Layer, Logger } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\nimport { HttpRouter } from \"effect/unstable/http\";\n\nimport { McpLive } from \"./mcp\";\n\nconst MCP_SERVER_NAME = \"Namera MCP Server\";\nconst MCP_SERVER_VERSION = \"0.0.1\";\n\nconst McpRouter = McpLive.pipe(\n Layer.provideMerge(\n McpServer.layerHttp({\n name: MCP_SERVER_NAME,\n path: \"/mcp\",\n version: MCP_SERVER_VERSION,\n }),\n ),\n Layer.provideMerge(\n HttpRouter.cors({\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"mcp-session-id\",\n \"mcp-protocol-version\",\n ],\n allowedMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedOrigins: [\"*\"],\n credentials: false,\n exposedHeaders: [\"mcp-session-id\", \"mcp-protocol-version\"],\n }),\n ),\n);\n\nconst McpStdio = McpLive.pipe(\n Layer.provideMerge(\n McpServer.layerStdio({\n name: MCP_SERVER_NAME,\n version: MCP_SERVER_VERSION,\n }),\n ),\n Layer.provide(NodeStdio.layer),\n Layer.provide(Layer.succeed(Logger.LogToStderr)(true)),\n);\n\nexport const startMcpHttpServer = (port: number) =>\n Layer.launch(\n HttpRouter.serve(McpRouter).pipe(\n Layer.provideMerge(NodeHttpServer.layer(createServer, { port })),\n ),\n );\n\nexport const startMcpStdioServer = () => Layer.launch(McpStdio);\n","/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */\nimport {\n CallPolicyVersion,\n CallType,\n ParamCondition as ParamConditionCore,\n type Policy,\n toCallPolicy,\n toGasPolicy,\n toRateLimitPolicy,\n toSignatureCallerPolicy,\n toSudoPolicy,\n toTimestampPolicy,\n} from \"@namera-ai/sdk/policy\";\n\nimport type { CallPolicyParams, PolicyParams } from \"@/schema\";\nimport type { ParamCondition } from \"@/schema/policy\";\n\nconst toCallPolicyVersion = (\n version: CallPolicyParams[\"policyVersion\"],\n): CallPolicyVersion => {\n switch (version) {\n case \"0.0.1\":\n return CallPolicyVersion.V0_0_1;\n case \"0.0.2\":\n return CallPolicyVersion.V0_0_2;\n case \"0.0.3\":\n return CallPolicyVersion.V0_0_3;\n case \"0.0.4\":\n return CallPolicyVersion.V0_0_4;\n case \"0.0.5\":\n return CallPolicyVersion.V0_0_5;\n default:\n throw new Error(\"Invalid call policy version\");\n }\n};\n\nconst conditionToParamCondition = (\n condition: ParamCondition,\n): ParamConditionCore => {\n if (condition === \"EQUAL\") return ParamConditionCore.EQUAL;\n if (condition === \"GREATER_THAN\") return ParamConditionCore.GREATER_THAN;\n if (condition === \"LESS_THAN\") return ParamConditionCore.LESS_THAN;\n if (condition === \"GREATER_THAN_OR_EQUAL\")\n return ParamConditionCore.GREATER_THAN_OR_EQUAL;\n if (condition === \"LESS_THAN_OR_EQUAL\")\n return ParamConditionCore.LESS_THAN_OR_EQUAL;\n if (condition === \"NOT_EQUAL\") return ParamConditionCore.NOT_EQUAL;\n if (condition === \"ONE_OF\") return ParamConditionCore.ONE_OF;\n if (condition === \"SLICE_EQUAL\") return ParamConditionCore.SLICE_EQUAL;\n return ParamConditionCore.EQUAL;\n};\n\nexport const policyParamsToPolicies = (params: PolicyParams[]) => {\n const policies: Policy[] = [];\n\n for (const param of params) {\n if (param.type === \"sudo\") {\n policies.push(toSudoPolicy({}));\n } else if (param.type === \"timestamp\") {\n policies.push(toTimestampPolicy(param));\n } else if (param.type === \"gas\") {\n policies.push(toGasPolicy(param));\n } else if (param.type === \"rate-limit\") {\n policies.push(toRateLimitPolicy(param));\n } else if (param.type === \"signature-caller\") {\n policies.push(toSignatureCallerPolicy(param));\n } else if (param.type === \"call\") {\n policies.push(\n toCallPolicy({\n policyVersion: toCallPolicyVersion(param.policyVersion),\n permissions: !param.permissions\n ? undefined\n : param.permissions.map((p) => {\n const callType = (() => {\n if (!p.callType) return CallType.CALL;\n if (p.callType === \"call\") return CallType.CALL;\n if (p.callType === \"delegatecall\")\n return CallType.DELEGATE_CALL;\n return CallType.BATCH_CALL;\n })();\n\n if (\"abi\" in p) {\n return {\n callType,\n target: p.target,\n valueLimit: p.valueLimit,\n abi: p.abi,\n functionName: p.functionName,\n selector: p.selector,\n args: !p.args\n ? undefined\n : p.args.map((a) => {\n if (a === null) return null;\n const c = a.condition;\n if (c === \"ONE_OF\") {\n return {\n condition: ParamConditionCore.ONE_OF,\n value: a.value,\n };\n }\n\n if (c === \"SLICE_EQUAL\" && \"start\" in a) {\n return {\n condition: ParamConditionCore.SLICE_EQUAL,\n value: a.value,\n start: a.start,\n length: a.length,\n };\n }\n\n return {\n condition: conditionToParamCondition(c) as Exclude<\n ParamConditionCore,\n ParamConditionCore.ONE_OF\n >,\n value: a.value,\n };\n }),\n };\n }\n\n return {\n callType,\n target: p.target,\n selector: p.selector,\n valueLimit: p.valueLimit,\n rules: p.rules\n ? p.rules.map((r) => {\n return {\n offset: r.offset,\n params: r.params,\n condition: conditionToParamCondition(r.condition),\n };\n })\n : undefined,\n };\n }),\n }),\n );\n } else {\n throw new Error(\"Invalid policy type\");\n }\n }\n\n return policies;\n};\n","import { createAccountClient } from \"@namera-ai/sdk/account\";\nimport { Data, Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport type { Environment } from \"effect/unstable/cli/Prompt\";\nimport { createPublicClient, http, type PublicClient } from \"viem\";\nimport { mainnet } from \"viem/chains\";\n\nimport {\n type CreateSmartAccountParams,\n type GetSmartAccountParams,\n type GetSmartAccountStatusParams,\n type ImportSmartAccountParams,\n LocalSmartAccount,\n type LocalSmartAccountData,\n type RemoveSmartAccountParams,\n} from \"@/dto\";\n\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { KeystoreManager, type KeystoreManagerError } from \"./keystore\";\nimport { PromptManager } from \"./prompt\";\nimport { Web3Service } from \"./web3\";\n\nexport type SmartAccountManager = {\n /**\n * Loads a smart account by alias and parses the stored JSON payload.\n *\n * @param params Alias of the smart account to load.\n * @returns The parsed smart account data.\n */\n getSmartAccount: (\n params: GetSmartAccountParams,\n ) => Effect.Effect<LocalSmartAccountData, ConfigManagerError, never>;\n /**\n * Lists all locally stored smart accounts.\n *\n * @returns The list of smart account data.\n */\n listSmartAccounts: () => Effect.Effect<\n LocalSmartAccountData[],\n ConfigManagerError,\n never\n >;\n /**\n * Prompts the user to select a smart account from local storage.\n *\n * @param params - Prompt message to display.\n * @returns The selected smart account data.\n */\n selectSmartAccount: (params: {\n message: string;\n }) => Effect.Effect<\n LocalSmartAccountData,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Environment\n >;\n /**\n * Creates a new smart account derived from a local keystore and index.\n *\n * @param params - Alias, owner alias, and optional index for derivation.\n * @returns The created smart account data.\n */\n createSmartAccount: (\n params: CreateSmartAccountParams,\n ) => Effect.Effect<\n LocalSmartAccountData,\n SmartAccountManagerError | ConfigManagerError | KeystoreManagerError,\n never\n >;\n /**\n * Removes a locally stored smart account by alias.\n *\n * @param params - Alias of the smart account to remove.\n */\n removeSmartAccount: (\n params: RemoveSmartAccountParams,\n ) => Effect.Effect<\n void,\n ConfigManagerError | SmartAccountManagerError,\n never\n >;\n /**\n * Checks if a smart account is deployed on the specified chain.\n *\n * @param params - Alias plus chain and optional RPC URL.\n * @returns Whether the smart account is deployed.\n */\n getSmartAccountStatus: (\n params: GetSmartAccountStatusParams,\n ) => Effect.Effect<boolean, ConfigManagerError, never>;\n /**\n * Imports a smart account with precomputed metadata and address.\n *\n * @param params - Smart account metadata and alias to store.\n * @returns The imported smart account data.\n */\n importSmartAccount: (\n params: ImportSmartAccountParams,\n ) => Effect.Effect<\n LocalSmartAccountData,\n SmartAccountManagerError | ConfigManagerError | KeystoreManagerError,\n never\n >;\n};\n\n/**\n * Service tag for resolving {@link SmartAccountManager} from the Effect context.\n */\nexport const SmartAccountManager = ServiceMap.Service<SmartAccountManager>(\n \"@namera-ai/cli/SmartAccountManager\",\n);\n\n/**\n * Domain error for smart account lifecycle operations.\n */\nexport class SmartAccountManagerError extends Data.TaggedError(\n \"@namera-ai/cli/SmartAccountManagerError\",\n)<{\n code:\n | \"KernelAddressGenerationError\"\n | \"SmartAccountAlreadyExists\"\n | \"SmartAccountNotFound\"\n | \"SmartAccountImportError\";\n message: string;\n}> {}\n\n/**\n * Live layer that manages smart account storage and derivation.\n */\nexport const layer = Layer.effect(\n SmartAccountManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const keystoreManager = yield* KeystoreManager;\n const promptManager = yield* PromptManager;\n const web3Service = yield* Web3Service;\n\n const getSmartAccount = (params: GetSmartAccountParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const parsedSmartAccount = Schema.decodeUnknownSync(\n Schema.fromJsonString(LocalSmartAccount),\n )(res.content);\n\n return {\n alias: res.alias,\n data: parsedSmartAccount,\n path: res.path,\n } satisfies LocalSmartAccountData;\n });\n\n const listSmartAccounts = () =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"smart-account\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsedSmartAccount = Schema.decodeUnknownSync(\n Schema.fromJsonString(LocalSmartAccount),\n )(entity.content);\n\n return {\n alias: entity.alias,\n data: parsedSmartAccount,\n path: entity.path,\n } satisfies LocalSmartAccountData;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n });\n\n const createSmartAccount = (params: CreateSmartAccountParams) =>\n Effect.gen(function* () {\n const existingAccounts = yield* listSmartAccounts();\n\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const ownerKeystore = yield* keystoreManager.getKeystore({\n alias: params.ownerAlias,\n });\n\n const ownerSigner = yield* keystoreManager.getSigner({\n alias: params.ownerAlias,\n password: params.ownerPassword,\n });\n\n // Doesn't matter because public client is only needed for 0.6 entrypoints\n const publicClient = createPublicClient({\n chain: mainnet,\n transport: http(),\n });\n\n const entryPointVersion = \"0.7\";\n const kernelVersion = \"0.3.2\";\n const index = BigInt(params.index ?? 0);\n const ownerType = \"ecdsa\";\n\n const res = yield* Effect.tryPromise({\n try: () =>\n createAccountClient({\n type: \"ecdsa\",\n bundlerTransport: http(),\n chain: mainnet,\n client: publicClient,\n entrypointVersion: entryPointVersion,\n kernelVersion,\n signer: ownerSigner,\n }),\n catch: () =>\n new SmartAccountManagerError({\n code: \"KernelAddressGenerationError\",\n message: `Unable to compute smart account address for Address: ${ownerKeystore.data.address} and Index: ${params.index}`,\n }),\n });\n\n const saAddress = res.account.address;\n\n const exists = existingAccounts.find(\n (d) => d.data.smartAccountAddress === saAddress,\n );\n\n if (exists) {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountAlreadyExists\",\n message: `Smart account for owner: ${ownerKeystore.alias} and index: ${params.index} already exists`,\n }),\n );\n }\n\n const saData: LocalSmartAccount = {\n entryPointVersion,\n kernelVersion,\n ownerAlias: ownerKeystore.alias,\n ownerType,\n smartAccountAddress: saAddress,\n index,\n };\n\n const data: LocalSmartAccountData = {\n data: saData,\n path: entityPath,\n alias: params.alias,\n };\n\n const encoded = Schema.encodeSync(LocalSmartAccount)(saData);\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(encoded),\n path: entityPath,\n type: \"smart-account\",\n });\n\n return data;\n });\n\n const selectSmartAccount = (params: { message: string }) =>\n Effect.gen(function* () {\n const smartAccounts = yield* listSmartAccounts();\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: smartAccounts.map((a) => ({\n title: a.alias,\n value: a,\n description: a.data.smartAccountAddress,\n })) satisfies Prompt.SelectChoice<LocalSmartAccountData>[],\n });\n\n return res;\n });\n\n const removeSmartAccount = (params: RemoveSmartAccountParams) =>\n Effect.gen(function* () {\n const sa = yield* getSmartAccount({ alias: params.alias });\n\n return yield* configManager.removeEntity({\n alias: sa.alias,\n type: \"smart-account\",\n });\n });\n\n const getSmartAccountStatus = (params: GetSmartAccountStatusParams) =>\n Effect.gen(function* () {\n const sa = yield* getSmartAccount({ alias: params.alias });\n\n const publicClient = (yield* web3Service.getPublicClient({\n chain: params.chain,\n rpcUrl: params.rpcUrl,\n })) as PublicClient;\n\n const code = yield* Effect.promise(() =>\n publicClient.getCode({\n address: sa.data.smartAccountAddress,\n }),\n );\n\n return Boolean(code);\n });\n\n const importSmartAccount = (params: ImportSmartAccountParams) =>\n Effect.gen(function* () {\n const { alias, ...rest } = params;\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const ownerKeystore = yield* keystoreManager.getKeystore({\n alias: params.ownerAlias,\n });\n\n const allAccounts = yield* listSmartAccounts();\n\n const exists = allAccounts.find(\n (d) => d.data.smartAccountAddress === rest.smartAccountAddress,\n );\n\n if (exists) {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountAlreadyExists\",\n message: `Smart account for owner: ${ownerKeystore.alias} and address: ${rest.smartAccountAddress} already exists`,\n }),\n );\n }\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(Schema.encodeSync(LocalSmartAccount)(rest)),\n path: entityPath,\n type: \"smart-account\",\n });\n\n return {\n alias: params.alias,\n data: rest,\n path: entityPath,\n };\n });\n\n return SmartAccountManager.of({\n createSmartAccount,\n getSmartAccount,\n listSmartAccounts,\n selectSmartAccount,\n removeSmartAccount,\n getSmartAccountStatus,\n importSmartAccount,\n });\n }),\n);\n","import { Wallet } from \"@ethereumjs/wallet\";\nimport {\n createSessionKey as createNameraSessionKey,\n isSessionKeyInstalled,\n} from \"@namera-ai/sdk/session-key\";\nimport { Data, Effect, Layer, type Redacted, Schema, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport { hexToBytes, toHex } from \"viem\";\nimport {\n generatePrivateKey,\n type LocalAccount,\n privateKeyToAccount,\n} from \"viem/accounts\";\n\nimport {\n type CreateSessionKeyParams,\n type Keystore,\n SessionKey,\n type SessionKeyData,\n} from \"@/dto\";\nimport { policyParamsToPolicies } from \"@/helpers/policy\";\nimport { chainIdToChainName } from \"@/schema\";\n\nimport type {\n GetSessionKeyParams,\n GetSessionKeyStatusParams,\n ListSessionKeysParams,\n RemoveSessionKeyParams,\n} from \"../dto/session-key\";\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { KeystoreManager, type KeystoreManagerError } from \"./keystore\";\nimport { PromptManager } from \"./prompt\";\nimport { SmartAccountManager } from \"./smart-account\";\nimport { Web3Service } from \"./web3\";\n\nexport type SessionKeyManager = {\n createSessionKey: (\n params: CreateSessionKeyParams,\n ) => Effect.Effect<\n SessionKeyData,\n SessionKeyManagerError | ConfigManagerError | KeystoreManagerError\n >;\n getSessionKey: (\n params: GetSessionKeyParams,\n ) => Effect.Effect<\n SessionKeyData,\n SessionKeyManagerError | ConfigManagerError\n >;\n listSessionKeys: (\n params: ListSessionKeysParams,\n ) => Effect.Effect<\n SessionKeyData[],\n ConfigManagerError | SessionKeyManagerError\n >;\n selectSessionKey: (params: {\n message: string;\n }) => Effect.Effect<\n SessionKeyData,\n ConfigManagerError | SessionKeyManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeyStatus: (\n params: GetSessionKeyStatusParams,\n ) => Effect.Effect<\n boolean,\n ConfigManagerError | SessionKeyManagerError,\n never\n >;\n multiSelectSessionKeys: (params: {\n message: string;\n smartAccount?: string;\n }) => Effect.Effect<\n SessionKeyData[],\n ConfigManagerError | SessionKeyManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeyPassword: (params: {\n alias: string;\n message: string;\n }) => Effect.Effect<\n Redacted.Redacted<string>,\n SessionKeyManagerError | ConfigManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeySigner: (params: {\n alias: string;\n password: string;\n }) => Effect.Effect<\n SessionKeyData & { signer: LocalAccount },\n SessionKeyManagerError | ConfigManagerError | QuitError,\n never\n >;\n removeSessionKey: (params: {\n readonly alias: string;\n }) => Effect.Effect<void, SessionKeyManagerError | ConfigManagerError, never>;\n};\nexport const SessionKeyManager = ServiceMap.Service<SessionKeyManager>(\n \"@namera-ai/cli/SessionKeyManager\",\n);\n\nexport class SessionKeyManagerError extends Data.TaggedError(\n \"@namera-ai/cli/SessionKeyManagerError\",\n)<{\n code:\n | \"EncryptionError\"\n | \"SessionKeyAlreadyExists\"\n | \"SessionKeyParseError\"\n | \"DecryptError\";\n message: string;\n}> {}\n\nexport const layer = Layer.effect(\n SessionKeyManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const promptManager = yield* PromptManager;\n const keystoreManager = yield* KeystoreManager;\n const smartAccountManager = yield* SmartAccountManager;\n const web3Service = yield* Web3Service;\n\n const createSessionKey = (params: CreateSessionKeyParams) =>\n Effect.gen(function* () {\n const exists = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"session-key\",\n });\n\n if (exists) {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyAlreadyExists\",\n message: `Session key for alias ${params.alias} already exists`,\n }),\n );\n }\n\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"session-key\",\n });\n\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: params.smartAccountAlias,\n });\n\n const ownerSigner = yield* keystoreManager.getSigner({\n alias: sa.data.ownerAlias,\n password: params.ownerKeystorePassword,\n });\n const policies = policyParamsToPolicies(params.policyParams);\n\n const clients = yield* Effect.all(\n params.chains.map((chain) => web3Service.getPublicClient({ chain })),\n { concurrency: \"unbounded\" },\n );\n\n const sessionPrivateKey = generatePrivateKey();\n const sessionKeyAccount = privateKeyToAccount(sessionPrivateKey);\n\n const res = yield* Effect.promise(() =>\n createNameraSessionKey({\n type: \"ecdsa\",\n accountType: \"ecdsa\",\n sessionPrivateKey,\n clients,\n entrypointVersion: sa.data.entryPointVersion,\n kernelVersion: sa.data.kernelVersion,\n index: sa.data.index,\n signer: ownerSigner,\n policies,\n }),\n );\n\n // Encrypt Session Key\n const encData = (yield* Effect.tryPromise({\n try: () =>\n Wallet.fromPrivateKey(hexToBytes(sessionPrivateKey)).toV3(\n params.sessionKeyPassword,\n ),\n catch: () =>\n new SessionKeyManagerError({\n code: \"EncryptionError\",\n message: \"Failed to encrypt session key\",\n }),\n })) as Keystore;\n\n const data: SessionKey = {\n sessionKeyType: \"ecdsa\",\n serializedAccounts: res.serializedAccounts.map((a) => ({\n chain: chainIdToChainName(a.chainId),\n serializedAccount: a.serializedAccount,\n })),\n sessionKeyAddress: sessionKeyAccount.address,\n smartAccountAlias: sa.alias,\n ...encData,\n };\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(data),\n path: entityPath,\n type: \"session-key\",\n });\n\n return {\n alias: params.alias,\n data,\n path: entityPath,\n } satisfies SessionKeyData;\n });\n\n const getSessionKey = (params: GetSessionKeyParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"session-key\",\n });\n\n const parsed = Schema.decodeUnknownOption(\n Schema.fromJsonString(SessionKey),\n )(res.content);\n\n if (parsed._tag === \"None\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Unable to parse session key\",\n }),\n );\n }\n\n const data: SessionKeyData = {\n alias: res.alias,\n data: parsed.value,\n path: res.path,\n };\n\n return data;\n });\n\n const listSessionKeys = (params: ListSessionKeysParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"session-key\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsed = Schema.decodeUnknownOption(\n Schema.fromJsonString(SessionKey),\n )(entity.content);\n\n if (parsed._tag === \"None\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Unable to parse session key\",\n }),\n );\n }\n\n const data: SessionKeyData = {\n alias: entity.alias,\n data: parsed.value,\n path: entity.path,\n };\n\n return data;\n }),\n );\n\n const allKeys = yield* Effect.all(effects, {\n concurrency: \"unbounded\",\n });\n // .map((d) => (d._op === \"Success\" ? d.success : undefined))\n // .filter(Boolean) as SessionKeyData[];\n\n if (params.smartAccount) {\n return allKeys.filter(\n (k) => k.data.smartAccountAlias === params.smartAccount,\n );\n }\n\n return allKeys;\n });\n\n const selectSessionKey = (params: { message: string }) =>\n Effect.gen(function* () {\n const sessionKeys = yield* listSessionKeys({});\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: sessionKeys.map((sk) => ({\n title: sk.alias,\n value: sk,\n description: `${sk.data.sessionKeyType === \"ecdsa\" ? sk.data.sessionKeyAddress : sk.data.passKeyName} (${sk.data.smartAccountAlias})`,\n })) satisfies Prompt.SelectChoice<SessionKeyData>[],\n });\n\n return res;\n });\n\n const getSessionKeyStatus = (params: GetSessionKeyStatusParams) =>\n Effect.gen(function* () {\n const sessionKey = yield* getSessionKey({ alias: params.alias });\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: sessionKey.data.smartAccountAlias,\n });\n\n const publicClient = yield* web3Service.getPublicClient({\n chain: params.chain,\n rpcUrl: params.rpcUrl,\n });\n\n if (sessionKey.data.sessionKeyType !== \"ecdsa\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Only ECDSA session keys have an on-chain status\",\n }),\n );\n }\n const sessionKeyAddress = sessionKey.data.sessionKeyAddress;\n\n const res = yield* Effect.tryPromise({\n try: () =>\n isSessionKeyInstalled(publicClient, {\n accountAddress: sa.data.smartAccountAddress,\n sessionKeyAddress,\n }),\n catch: () => false,\n }).pipe(Effect.catch(() => Effect.succeed(false)));\n\n return res;\n });\n\n const multiSelectSessionKeys = (params: {\n message: string;\n smartAccount?: string;\n }) =>\n Effect.gen(function* () {\n const allKeys = yield* listSessionKeys({\n smartAccount: params.smartAccount,\n });\n\n const res = yield* promptManager.multiSelectPrompt({\n message: params.message,\n choices: allKeys.map((k) => ({\n title: k.alias,\n value: k,\n description: `${k.data.sessionKeyType === \"ecdsa\" ? k.data.sessionKeyAddress : k.data.passKeyName} (${k.data.smartAccountAlias})`,\n })) satisfies Prompt.SelectChoice<SessionKeyData>[],\n min: 1,\n });\n\n return res;\n });\n\n const getSessionKeyPassword = (params: {\n alias: string;\n message: string;\n }) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n const password = yield* promptManager.passwordPrompt({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n yield* Effect.tryPromise({\n try: () => Wallet.fromV3(key.data, v),\n catch: () =>\n new SessionKeyManagerError({\n code: \"DecryptError\",\n message: `Invalid password for session key ${params.alias}`,\n }),\n }).pipe(Effect.catch(() => Effect.fail(\"Invalid password\")));\n\n return v;\n }),\n });\n\n return password;\n });\n\n const getSessionKeySigner = (params: { alias: string; password: string }) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n const signer = yield* Effect.tryPromise({\n try: async () => {\n const wallet = await Wallet.fromV3(key.data, params.password);\n return privateKeyToAccount(\n toHex(wallet.getPrivateKey()),\n ) as LocalAccount;\n },\n catch: () =>\n new SessionKeyManagerError({\n code: \"DecryptError\",\n message: `Invalid password for session key ${params.alias}`,\n }),\n });\n\n return { ...key, signer };\n });\n\n const removeSessionKey = (params: RemoveSessionKeyParams) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n return yield* configManager.removeEntity({\n alias: key.alias,\n type: \"session-key\",\n });\n });\n\n return SessionKeyManager.of({\n createSessionKey,\n getSessionKey,\n listSessionKeys,\n selectSessionKey,\n getSessionKeyStatus,\n multiSelectSessionKeys,\n getSessionKeyPassword,\n getSessionKeySigner,\n removeSessionKey,\n });\n }),\n);\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { ServeError } from \"effect/unstable/http/HttpServerError\";\n\nimport type { StartMcpServerParams } from \"@/dto/mcp\";\nimport { startMcpHttpServer, startMcpStdioServer } from \"@/mcp\";\n\nimport type { ConfigManagerError } from \"./config\";\nimport { McpContext } from \"./mcp-context\";\nimport { SessionKeyManager, type SessionKeyManagerError } from \"./session-key\";\nimport { SmartAccountManager } from \"./smart-account\";\n\nexport type McpManager = {\n startMcpServer: (\n params: StartMcpServerParams,\n ) => Effect.Effect<\n void,\n SessionKeyManagerError | ConfigManagerError | QuitError | ServeError\n >;\n};\n\nexport const McpManager = ServiceMap.Service<McpManager>(\n \"@namera-ai/cli/McpManager\",\n);\n\nexport const layer = Layer.effect(\n McpManager,\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager;\n\n const startMcpServer = (params: StartMcpServerParams) =>\n Effect.gen(function* () {\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: params.smartAccountAlias,\n });\n\n const sessionKeys = Object.entries(params.sessionKeys);\n\n const sessionKeysWithSigners = yield* Effect.all(\n sessionKeys.map(([alias, password]) =>\n sessionKeyManager.getSessionKeySigner({\n alias,\n password,\n }),\n ),\n );\n\n const context = McpContext.of({\n smartAccount: sa.data,\n sessionKeys: sessionKeysWithSigners,\n });\n\n if (params.transport === \"stdio\") {\n yield* startMcpStdioServer().pipe(\n Effect.provideService(McpContext, context),\n );\n } else {\n yield* startMcpHttpServer(params.port ?? 8080).pipe(\n Effect.provideService(McpContext, context),\n );\n }\n });\n return McpManager.of({ startMcpServer });\n }),\n);\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nconst keyColors = [\n \"\\x1b[36m\", // cyan\n \"\\x1b[35m\", // magenta\n \"\\x1b[34m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[33m\", // yellow\n];\n\nconst reset = \"\\x1b[0m\";\nconst bold = \"\\x1b[1m\";\n\n/**\n * Returns a shallow copy of an object with humanized key names.\n */\nconst transformKeys = (obj: Record<string, any>) => {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [formatKey(k), v]),\n );\n};\n\n/**\n * Humanizes a key by spacing words and title-casing tokens.\n */\nconst formatKey = (key: string) =>\n key\n .replace(/[_-]/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\n/**\n * Formats a primitive-like value for display.\n */\nconst formatValue = (value: any): string => {\n if (value === null) return \"null\";\n\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return String(value);\n};\n\n/**\n * Returns true when a value is a display-friendly primitive.\n */\nconst isPrimitive = (v: any) =>\n v === null || typeof v !== \"object\" || v instanceof Date;\n\n/**\n * Determines whether an array contains only flat objects of primitives.\n */\nconst isFlatObjectArray = (arr: Record<string, any>[]) =>\n arr.length > 0 &&\n arr.every(\n (item) =>\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.values(item).every(isPrimitive),\n );\n\n/**\n * Formats objects or arrays into a human-friendly CLI display string.\n *\n * Uses colorized keys when printing objects, and falls back to tabular\n * output for flat object arrays at the root level.\n */\nexport const prettyFormat = (\n input: Record<string, any> | Record<string, any>[],\n depth = 0,\n isRoot = true,\n): string => {\n const colors = true;\n const indent = 2;\n const maxDepth = 6;\n const space = \" \".repeat(indent * depth);\n\n if (depth > maxDepth) return `${space}…`;\n\n if (isRoot && Array.isArray(input) && isFlatObjectArray(input)) {\n const transformed = input.map(transformKeys);\n console.table(transformed);\n return \"\";\n }\n\n // Array\n if (Array.isArray(input)) {\n return input\n .map((item, i) => {\n if (isPrimitive(item)) {\n return `${space}${formatValue(item)}`;\n }\n\n return `${space}[${i}]\\n${prettyFormat(item, depth + 1, false)}`;\n })\n .join(\"\\n\");\n }\n\n // Object\n return Object.entries(input)\n .map(([key, value]) => {\n const color = keyColors[depth % keyColors.length];\n const k = colors\n ? `${bold}${color}${formatKey(key)}${reset}`\n : formatKey(key);\n\n if (isPrimitive(value)) {\n return `${space}${k}: ${formatValue(value)}`;\n }\n\n return `${space}${k}:\\n${prettyFormat(value, depth + 1, false)}`;\n })\n .join(\"\\n\");\n};\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { NdJson } from \"json-nd\";\n\nimport { prettyFormat } from \"@/helpers/pretty\";\n\n/**\n * Effect service for formatting command output into CLI-friendly formats.\n */\nexport type OutputFormatter = {\n /**\n * Formats command output into a CLI-friendly string.\n *\n * @param data - The object or list of objects to format.\n * @param format - Output mode: pretty (human), json, or ndjson.\n */\n format: (\n data: object | object[],\n format: \"pretty\" | \"json\" | \"ndjson\",\n ) => Effect.Effect<string>;\n};\n\n/**\n * Service tag for resolving {@link OutputFormatter} from the Effect context.\n */\nexport const OutputFormatter = ServiceMap.Service<OutputFormatter>(\n \"@namera-ai/cli/OutputFormatter\",\n);\n\n/**\n * Live layer that formats output as pretty, JSON, or NDJSON.\n */\nexport const layer = Layer.succeed(\n OutputFormatter,\n OutputFormatter.of({\n format: (data, format) =>\n Effect.gen(function* () {\n if (format === \"pretty\") {\n return prettyFormat(data);\n }\n if (format === \"json\") {\n return JSON.stringify(data, null, 2);\n }\n\n if (Array.isArray(data)) {\n return NdJson.stringify(data);\n }\n\n return NdJson.stringify([data]);\n }),\n }),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst createKeystoreHandler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for keystore:\",\n type: \"keystore\",\n });\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n params = { alias, password: Redacted.value(password) };\n }\n\n const res = yield* keystoreManager.createKeystore(params);\n\n const data = {\n address: res.data.address,\n alias: res.alias,\n path: res.path,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to encrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new keystore and stores it locally.\n */\nexport const createKeystoreCommand = Command.make(\n \"create\",\n { alias, password },\n ({ alias, password }) => createKeystoreHandler(alias, password),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a random keypair and stores it as keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore create -a my-wallet\",\n description: \"Creates a new keystore with alias 'my-wallet'\",\n },\n {\n command:\n \"namera keystore create --alias my-wallet --password my-password\",\n description:\n \"Creates a new keystore with alias 'my-wallet' and password 'my-password'\",\n },\n {\n command: `namera keystore create --params '{\"alias\":\"my-wallet\",\"password\":\"my-password\"}'`,\n description: \"Creates a new keystore with json params\",\n },\n {\n command: \"namera schema keystore.create\",\n description: \"Get the schema for the create command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { DecryptKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const promptManager = yield* PromptManager.PromptManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: DecryptKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(DecryptKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n params = { alias, password: Redacted.value(password) };\n }\n\n const res = yield* keystoreManager.decryptKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.address,\n publicKey: res.publicKey,\n privateKey: Redacted.value(res.privateKey),\n };\n\n if (globalFlags.quite) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to decrypt\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to decrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that decrypts a keystore and prints key material.\n */\nexport const decryptKeystoreCommand = Command.make(\n \"decrypt\",\n { alias, password },\n ({ alias, password }) => handler(alias, password),\n).pipe(\n Command.withAlias(\"d\"),\n Command.withDescription(\"Decrypt a keystore to get the private key\"),\n Command.withExamples([\n {\n command: \"namera keystore decrypt\",\n description: \"Decrypt a keystore with alias and password prompts\",\n },\n {\n command:\n \"namera keystore decrypt --alias my-wallet --password my-password\",\n description: \"Decrypt a keystore with alias and password\",\n },\n {\n command: `namera keystore decrypt --params '{\"alias\":\"my-wallet\",\"password\":\"my-password\"}'`,\n description: \"Decrypt a keystore with json params\",\n },\n {\n command: \"namera schema keystore.decrypt\",\n description: \"Get the schema for the decrypt command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { ImportKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n flagPrivateKey: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const promptManager = yield* PromptManager.PromptManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: ImportKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(ImportKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n let privateKey: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for keystore:\",\n type: \"keystore\",\n });\n alias = res;\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n if (flagPrivateKey._tag === \"Some\") {\n privateKey = flagPrivateKey.value;\n } else {\n privateKey = yield* promptManager.hexPrompt({\n redacted: true,\n length: 32,\n message: \"Enter private key:\",\n });\n }\n\n params = {\n alias,\n password: Redacted.value(password),\n privateKey: Redacted.value(privateKey),\n };\n }\n\n const res = yield* keystoreManager.importKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.data.address,\n path: res.path,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to import\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst privateKey = Flag.redacted(\"private-key\").pipe(\n Flag.withDescription(\"The private key of the keystore to import\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to encrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that imports a keystore from a private key.\n */\nexport const importKeystoreCommand = Command.make(\n \"import\",\n { alias, privateKey, password },\n ({ alias, password, privateKey }) => handler(alias, password, privateKey),\n).pipe(\n Command.withAlias(\"i\"),\n Command.withDescription(\"Import a keystore from a private key\"),\n Command.withExamples([\n {\n command: \"namera keystore import\",\n description: \"Import a keystore with interactive prompts\",\n },\n {\n command: \"namera keystore import --alias my-wallet\",\n description: \"Import a keystore with alias 'my-wallet'\",\n },\n {\n command:\n \"namera keystore import -a my-wallet -p my-password --private-key 0x1234567890abcdef\",\n description:\n \"Import a keystore with alias 'my-wallet', password 'my-password', and private key '0x1234567890abcdef'\",\n },\n {\n command: \"namera schema keystore.import\",\n description: \"Get the schema for the import command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst getKeystoreInfoHandler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* keystoreManager.getKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.data.address,\n path: res.path,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to retrieve\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that returns metadata for a keystore.\n */\nexport const getKeystoreInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => getKeystoreInfoHandler(alias),\n).pipe(\n Command.withDescription(\"Get information about a keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore info\",\n description: \"Get information about a keystore with alias prompt\",\n },\n {\n command: \"namera keystore info --alias my-wallet\",\n description: \"Get information about a keystore with alias 'my-wallet'\",\n },\n {\n command: `namera keystore info --params '{\"alias\":\"my-wallet\"}'`,\n description: \"Get information about a keystore with json params\",\n },\n {\n command: \"namera keystore info --alias my-wallet --output json\",\n description: \"Get information about a keystore in json format\",\n },\n {\n command: \"namera schema keystore.info\",\n description: \"Get the schema for the info command\",\n },\n ]),\n);\n","import { Console, Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst listKeystoreHandler = () =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* keystoreManager.listKeystores();\n\n const data = res.map((k) => ({\n alias: k.alias,\n address: k.data.address,\n path: k.path,\n }));\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that lists all stored keystores.\n */\nexport const listKeystoresCommand = Command.make(\"list\", {}, () =>\n listKeystoreHandler(),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List all keystores\"),\n Command.withExamples([\n {\n command: \"namera keystore list\",\n description: \"List all keystores\",\n },\n {\n command: \"namera keystore list --output json\",\n description: \"List all keystores in json format\",\n },\n {\n command: \"namera keystore list --output ndjson\",\n description: \"List all keystores in ndjson format\",\n },\n {\n command: \"namera schema keystore.list\",\n description: \"Get the schema for the list command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* keystoreManager.removeKeystore(params);\n\n const data = { success: true };\n\n if (globalFlags.quite) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const removeKeystoreCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore remove\",\n description: \"Remove a keystore with alias prompt\",\n },\n {\n command: \"namera keystore remove --alias my-wallet\",\n description: \"Remove a keystore with alias 'my-wallet'\",\n },\n {\n command: `namera keystore remove --params '{\"alias\":\"my-wallet\"}'`,\n description: \"Remove a keystore with json params\",\n },\n {\n command: \"namera schema keystore.remove\",\n description: \"Get the schema for the remove command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { createKeystoreCommand } from \"./create\";\nimport { decryptKeystoreCommand } from \"./decrypt\";\nimport { importKeystoreCommand } from \"./import\";\nimport { getKeystoreInfoCommand } from \"./info\";\nimport { listKeystoresCommand } from \"./list\";\nimport { removeKeystoreCommand } from \"./remove\";\n\n/**\n * Command group for keystore-related operations.\n */\nexport const keystoreCommands = Command.make(\n \"keystore\",\n {},\n () => Effect.void,\n).pipe(\n Command.withDescription(\"Keystore management utilities.\"),\n Command.withAlias(\"k\"),\n Command.withSubcommands([\n createKeystoreCommand,\n listKeystoresCommand,\n getKeystoreInfoCommand,\n decryptKeystoreCommand,\n importKeystoreCommand,\n removeKeystoreCommand,\n ]),\n);\n","import { Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { StartMcpServerParams } from \"@/dto/mcp\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { McpManager, SessionKeyManager, SmartAccountManager } from \"@/layers\";\n\nexport const handler = (\n flagSmartAccount: Option.Option<string>,\n flagSessionKeys: Option.Option<Record<string, string>>,\n flagTransport: Option.Option<\"stdio\" | \"http\">,\n flagPort: Option.Option<number>,\n) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const mcpManager = yield* McpManager.McpManager;\n const globalFlags = yield* getGlobalFlags();\n\n let params: StartMcpServerParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(StartMcpServerParams),\n )(globalFlags.params.value);\n } else {\n let smartAccountAlias: string;\n let sessionKeys: Record<string, string> = {};\n let transport: \"stdio\" | \"http\";\n let port: number;\n\n if (flagSmartAccount._tag === \"Some\") {\n smartAccountAlias = flagSmartAccount.value;\n } else {\n smartAccountAlias = (yield* smartAccountManager.selectSmartAccount({\n message: \"Select smart account to use for the MCP server\",\n })).alias;\n }\n\n if (flagSessionKeys._tag === \"Some\") {\n sessionKeys = flagSessionKeys.value;\n } else {\n const keys = yield* sessionKeyManager.multiSelectSessionKeys({\n message: \"Select session keys to use for the MCP server\",\n smartAccount: smartAccountAlias,\n });\n\n for (const key of keys) {\n const pass = yield* sessionKeyManager.getSessionKeyPassword({\n alias: key.alias,\n message: `Enter password for session key ${key.alias}:`,\n });\n sessionKeys[key.alias] = Redacted.value(pass);\n }\n }\n\n if (flagTransport._tag === \"Some\") {\n transport = flagTransport.value;\n } else {\n transport = \"stdio\";\n }\n\n if (flagPort._tag === \"Some\") {\n port = flagPort.value;\n } else {\n port = 8080;\n }\n\n params = { smartAccountAlias, sessionKeys, transport, port };\n }\n\n yield* mcpManager.startMcpServer(params);\n });\n\nconst smartAccount = Flag.string(\"smart-account\").pipe(\n Flag.withAlias(\"sa\"),\n Flag.optional,\n Flag.withDescription(\"The smart account alias to use for the MCP server\"),\n);\n\nconst sessionKeys = Flag.keyValuePair(\"session-key\").pipe(\n Flag.withAlias(\"sk\"),\n Flag.optional,\n Flag.withDescription(\n \"The session key aliases, password pairs to use for the MCP server\",\n ),\n);\n\nconst transport = Flag.choice(\"transport\", [\"stdio\", \"http\"]).pipe(\n Flag.withAlias(\"t\"),\n Flag.optional,\n Flag.withDescription(\"The transport to use for the MCP server\"),\n);\n\nconst port = Flag.integer(\"port\").pipe(\n Flag.withAlias(\"p\"),\n Flag.optional,\n Flag.withDescription(\n \"The port to use for the MCP server when using http transport\",\n ),\n);\n\nexport const startMcpCommand = Command.make(\n \"start\",\n { smartAccount, sessionKeys, transport, port },\n ({ smartAccount, sessionKeys, transport, port }) =>\n handler(smartAccount, sessionKeys, transport, port),\n).pipe(\n Command.withAlias(\"s\"),\n Command.withDescription(\"Starts the local MCP server.\"),\n Command.withExamples([\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password\",\n description:\n \"Starts the local MCP server with a single session key and the default transport\",\n },\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password --transport http --port 8080\",\n description:\n \"Starts the local MCP server with a single session key and http transport on port 8080\",\n },\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password --session-key my-other-key=my-other-password\",\n description:\n \"Starts the local MCP server with multiple session keys and the default transport\",\n },\n {\n command: \"namera schema mcp.start\",\n description: \"Get the schema for the start command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { startMcpCommand } from \"./start\";\n\nexport const mcpCommands = Command.make(\"mcp\", {}, () => Effect.void).pipe(\n Command.withDescription(\"Start and manage the Namera MCP server\"),\n Command.withSubcommands([startMcpCommand]),\n);\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nimport { Schema } from \"effect\";\n\nimport type { DeepPaths } from \"@/types\";\n\n/**\n * Returns the value at a dot-delimited path within a nested object.\n *\n * @param obj - Object to traverse.\n * @param path - Dot-delimited lookup path.\n */\nexport const getSchema = <\n T extends Record<string, any>,\n P extends DeepPaths<T>,\n>(\n obj: T,\n path: P,\n): any => {\n return path.split(\".\").reduce((acc, key) => acc[key], obj);\n};\n\n/**\n * Extracts all dot-delimited paths that terminate at Effect schemas.\n *\n * @param obj - Object tree to scan.\n * @param prefix - Internal prefix used to build nested paths.\n */\nexport const extractPaths = <T extends Record<string, any>>(\n obj: T,\n prefix = \"\",\n): DeepPaths<T>[] => {\n return Object.entries(obj).flatMap(([key, value]) => {\n const newPath = prefix ? `${prefix}.${key}` : key;\n\n if (Schema.isSchema(value)) {\n return [newPath];\n }\n\n if (typeof value === \"object\" && value !== null) {\n return extractPaths(value, newPath);\n }\n\n return [];\n }) as DeepPaths<T>[];\n};\n","import { Console, Effect, Schema } from \"effect\";\nimport { Argument, Command } from \"effect/unstable/cli\";\n\nimport * as Dto from \"@/dto\";\nimport { extractPaths, getSchema } from \"@/helpers/paths\";\n\n/**\n * Schema registry keyed by command path.\n */\nconst schemas = {\n keystore: {\n create: Dto.CreateKeystoreParams,\n decrypt: Dto.DecryptKeystoreParams,\n info: Dto.GetKeystoreParams,\n list: Dto.ListKeystoreParams,\n import: Dto.ImportKeystoreParams,\n remove: Dto.RemoveKeystoreParams,\n },\n \"smart-account\": {\n create: Dto.CreateSmartAccountParams,\n list: Dto.ListSmartAccountParams,\n info: Dto.GetSmartAccountInfoParams,\n remove: Dto.RemoveSmartAccountParams,\n status: Dto.GetSmartAccountStatusParams,\n import: Dto.ImportSmartAccountParams,\n },\n \"session-key\": {\n create: Dto.CreateSessionKeyParams,\n list: Dto.ListSessionKeysParams,\n info: Dto.GetSessionKeyInfoParams,\n remove: Dto.RemoveSessionKeyParams,\n status: Dto.GetSessionKeyStatusParams,\n },\n mcp: {\n start: Dto.StartMcpServerParams,\n },\n};\n\nconst commands = extractPaths(schemas);\nconst command = Argument.choice(\"command\", commands).pipe(\n Argument.withDescription(\"The command to get the schema for\"),\n);\n\n/**\n * Command that prints JSON Schema for a given CLI command.\n */\nexport const schemaCommand = Command.make(\n \"schema\",\n { command },\n ({ command }) =>\n Effect.gen(function* () {\n const schema = getSchema(schemas, command);\n const json = Schema.toJsonSchemaDocument(schema);\n\n yield* Console.log(JSON.stringify(json, null, 2));\n }),\n).pipe(Command.withDescription(\"Get the schema for a command\"));\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { PolicyParams } from \"@/schema\";\n\nconst policyChoices = [\n {\n description: \"Grant access to all operations\",\n title: \"Sudo Permission\",\n value: \"sudo\",\n },\n {\n description: \"Whitelist addresses, contract and functions\",\n title: \"Call Permission\",\n value: \"call\",\n },\n {\n description: \"Specify the start and end time for when the key is valid\",\n title: \"Timestamp Permission\",\n value: \"timestamp\",\n },\n {\n description: \"Specify the allowed gas usage for the session key\",\n title: \"Gas Permission\",\n value: \"gas\",\n },\n {\n description:\n \"Specify which addresses can verify signatures from this session key\",\n title: \"Signature Permission\",\n value: \"signature-caller\",\n },\n {\n description: \"Specify the allowed gas usage for the session key\",\n title: \"Rate Limit Permission\",\n value: \"rate-limit\",\n },\n {\n description: \"Complete the session key creation\",\n title: \"Done\",\n value: \"done\",\n },\n] as const;\n\nexport const policyChoicePrompt = (prevPolicies: PolicyParams[]) =>\n Effect.gen(function* () {\n // show only those which are not in prevPolicies\n const choices = policyChoices.filter(\n (c) => !prevPolicies.some((p) => p.type === c.value),\n );\n\n const prompt = Prompt.select({\n choices,\n message: \"Select Permission type you want to add for this session key\",\n });\n\n return yield* prompt;\n });\n","import { Effect, Option, Schema } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport { EthereumAddress } from \"@/schema\";\n\nexport const addressPrompt = (message: string) =>\n Prompt.text({\n message,\n validate: (value) =>\n Effect.gen(function* () {\n const res = Schema.decodeUnknownOption(EthereumAddress)(value);\n if (Option.isNone(res))\n return yield* Effect.fail(\"Invalid Ethereum Address\");\n return value;\n }),\n });\n\nexport const etherPrompt = (message: string) =>\n Prompt.text({\n message,\n validate: (val) =>\n Effect.gen(function* () {\n const schema = Schema.NumberFromString.check(\n Schema.isGreaterThanOrEqualTo(0),\n );\n const res = Schema.decodeOption(schema)(val);\n if (Option.isNone(res)) return yield* Effect.fail(\"Invalid Number\");\n return res.value.toString();\n }),\n });\n","import { Effect, FileSystem } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport type { SelectChoice } from \"effect/unstable/cli/Prompt\";\nimport {\n type Abi,\n type AbiFunction,\n type Address,\n parseEther,\n toFunctionSelector,\n} from \"viem\";\n\nimport type {\n CallPolicyParams,\n Permission,\n PermissionManual,\n PermissionWithABI,\n} from \"@/schema\";\n\nimport { addressPrompt, etherPrompt } from \"./common\";\n\nconst getEOAPermission = () =>\n Effect.gen(function* () {\n const target = yield* addressPrompt(\"Enter target address:\");\n const valueLimit = yield* etherPrompt(\n \"Max value that can be transferred (in ETH units):\",\n );\n const weiUnits = parseEther(valueLimit, \"wei\");\n\n return [\n {\n target: target as Address,\n valueLimit: weiUnits,\n },\n ] satisfies PermissionManual[];\n });\n\nconst getSmartContractPermission = () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const address = yield* addressPrompt(\"Enter smart contract address:\");\n const maxLimit = yield* etherPrompt(\n \"Max value that can be transferred (in ETH units)\",\n );\n\n // 1. Get Abi File\n // TODO: Add Abi Validation\n const abiFilePath = yield* Prompt.file({\n message: \"Select the ABI file for the smart contract\",\n });\n\n const abiString = yield* fs.readFileString(abiFilePath).pipe(Effect.orDie);\n const abi = JSON.parse(abiString) as Abi;\n\n const functions = abi.filter((e) => e.type === \"function\");\n\n const allowedFunctions = yield* Prompt.multiSelect({\n choices: functions.map((f) => {\n let signature = `${f.name}(`;\n for (let i = 0; i < f.inputs.length; i++) {\n const sep =\n f.inputs.length === 0 || i === f.inputs.length - 1 ? \"\" : \", \";\n // biome-ignore lint/style/noNonNullAssertion: safe\n const input = f.inputs[i]!;\n signature += `${input.type}${input.name ? ` ${input.name}` : \"\"}${sep}`;\n }\n signature += \")\";\n return {\n description: signature,\n title: f.name,\n value: f,\n } as SelectChoice<AbiFunction>;\n }),\n message: \"Select the functions you want to allow\",\n min: 1,\n });\n\n const weiUnits = parseEther(maxLimit);\n\n const res: PermissionWithABI[] = allowedFunctions.map((f) => {\n return {\n abi: [f],\n functionName: f.name,\n selector: toFunctionSelector(f),\n target: address as Address,\n valueLimit: weiUnits,\n };\n });\n\n return res;\n });\n\nconst getPermissions = () =>\n Effect.gen(function* () {\n const permissions: Permission[] = [];\n\n const targetAddressPrompt = Prompt.select({\n choices: [\n {\n title: \"EOA\",\n value: \"eoa\",\n },\n {\n title: \"Smart Contract\",\n value: \"smart-contract\",\n },\n ],\n message: \"Select target address type\",\n });\n\n while (true) {\n if (permissions.length > 0) {\n const addMore = yield* Prompt.confirm({\n message: \"Do you want to add another call permission?\",\n });\n if (!addMore) break;\n }\n\n const targetAddress = yield* targetAddressPrompt;\n\n if (targetAddress === \"eoa\") {\n const res = yield* getEOAPermission();\n permissions.push(...res);\n } else {\n const res = yield* getSmartContractPermission();\n permissions.push(...res);\n }\n }\n\n return permissions;\n });\n\nexport const getCallPolicyParams: Effect.Effect<\n CallPolicyParams,\n QuitError,\n Prompt.Environment\n> = Effect.gen(function* () {\n const permissions = yield* getPermissions();\n\n return {\n permissions,\n policyVersion: \"0.0.4\",\n type: \"call\",\n };\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport { parseEther } from \"viem\";\n\nimport type { GasPolicyParams } from \"@/schema\";\n\nimport { etherPrompt } from \"./common\";\n\nexport const getGasPolicyParams = Effect.gen(function* () {\n const allowed = yield* etherPrompt(\n \"Total amount of gas allowed (in ETH units)\",\n );\n\n const enforcePaymaster = yield* Prompt.confirm({\n message: \"Should UserOperations require Paymaster?\",\n });\n\n const weiUnits = parseEther(allowed);\n\n return {\n amount: weiUnits,\n type: \"gas\",\n enforcePaymaster,\n } satisfies GasPolicyParams;\n});\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nimport { Duration, Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { RateLimitPolicyParams } from \"@/schema\";\n\nexport const getRateLimitPolicyParams = Effect.gen(function* () {\n const interval = yield* Prompt.text({\n message:\n \"Duration for which rate limit is enforced? (e.g. 1 hour, 1 day, 1 week)\",\n validate: (v) =>\n Effect.gen(function* () {\n const valid = Duration.fromInput(v as any);\n if (valid._tag === \"None\") {\n return yield* Effect.fail(\"Invalid duration\");\n }\n\n return v;\n }),\n });\n\n const intervalDuration = Duration.fromInputUnsafe(interval as any);\n\n const count = yield* Prompt.integer({\n message: \"Number of requests allowed per interval.\",\n validate: (v) =>\n Effect.gen(function* () {\n if (v < 1) return yield* Effect.fail(\"Count must be greater than 0\");\n return v;\n }),\n });\n\n const startAt = yield* Prompt.date({\n initial: new Date(),\n message: \"Date at which the rate limit is enforced.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n return d;\n }),\n });\n\n return {\n type: \"rate-limit\",\n count,\n interval: Duration.toMillis(intervalDuration),\n startAt: Math.floor(startAt.getTime() / 1000),\n } satisfies RateLimitPolicyParams;\n});\n","import { Effect, Schema } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport { EthereumAddress, type SignatureCallerPolicyParams } from \"@/schema\";\n\nexport const getSignatureCallerPolicyParams = Effect.gen(function* () {\n const allowed = yield* Prompt.text({\n message: \"Comma-separated list of allowed callers:\",\n validate: (v) =>\n Effect.gen(function* () {\n const address = v.split(\",\").map((a) => a.trim());\n\n for (let i = 0; i < address.length; i++) {\n const a = address[i] as string;\n const res = Schema.decodeUnknownOption(EthereumAddress)(a);\n if (res._tag === \"None\") {\n return yield* Effect.fail(`Invalid Ethereum Address at index ${i}`);\n }\n }\n\n return v;\n }),\n });\n\n const allowedCallers = allowed\n .split(\",\")\n .map((a) => a.trim())\n .map((a) => Schema.decodeUnknownSync(EthereumAddress)(a));\n\n return {\n type: \"signature-caller\",\n allowedCallers,\n } satisfies SignatureCallerPolicyParams;\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { TimestampPolicyParams } from \"@/schema\";\n\nexport const getTimestampPolicyParams = Effect.gen(function* () {\n const validAfter = yield* Prompt.date({\n initial: new Date(),\n message: \"Time after which the key becomes valid.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n return d;\n }),\n });\n\n const validUntil = yield* Prompt.date({\n initial: new Date(),\n message: \"Time until which the key becomes valid.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n if (d < validAfter)\n return yield* Effect.fail(\"Valid until must be after valid after\");\n return d;\n }),\n });\n\n return {\n type: \"timestamp\",\n validAfter: Math.floor(validAfter.getTime() / 1000),\n validUntil: Math.floor(validUntil.getTime() / 1000),\n } satisfies TimestampPolicyParams;\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { PolicyParams } from \"@/schema\";\n\nimport { policyChoicePrompt } from \"./base\";\nimport { getCallPolicyParams } from \"./call\";\nimport { getGasPolicyParams } from \"./gas\";\nimport { getRateLimitPolicyParams } from \"./rate-limit\";\nimport { getSignatureCallerPolicyParams } from \"./signature-caller\";\nimport { getTimestampPolicyParams } from \"./timestamp\";\n\nexport const getPoliciesFromUser = () =>\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ok\n Effect.gen(function* () {\n const policyParams: PolicyParams[] = [];\n\n while (true) {\n if (policyParams.length > 0) {\n const addMore = yield* Prompt.confirm({\n message: \"Do you want to add another policy?\",\n });\n if (!addMore) break;\n }\n\n const policyType = yield* policyChoicePrompt(policyParams);\n\n if (policyType === \"sudo\") {\n policyParams.push({ type: \"sudo\" });\n // If sudo is selected, no need to ask for other policies\n break;\n }\n\n if (policyType === \"timestamp\") {\n const res = yield* getTimestampPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"call\") {\n const res = yield* getCallPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"gas\") {\n const res = yield* getGasPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"rate-limit\") {\n const res = yield* getRateLimitPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"signature-caller\") {\n const res = yield* getSignatureCallerPolicyParams;\n policyParams.push(res);\n } else {\n break;\n }\n }\n\n return policyParams;\n });\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateSessionKeyParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport {\n OutputFormatter,\n PromptManager,\n SessionKeyManager,\n SmartAccountManager,\n Web3Service,\n} from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nimport { getPoliciesFromUser } from \"./prompts\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagSmartAccountAlias: Option.Option<string>,\n flagSessionKeyPassword: Option.Option<Redacted.Redacted<string>>,\n flagOwnerKeystorePassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const web3Service = yield* Web3Service.Web3Service;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateSessionKeyParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateSessionKeyParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let smartAccountAlias: string;\n let sessionKeyPassword: Redacted.Redacted<string>;\n let ownerKeystorePassword: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for session key:\",\n type: \"session-key\",\n });\n }\n\n if (flagSmartAccountAlias._tag === \"Some\") {\n smartAccountAlias = flagSmartAccountAlias.value;\n } else {\n smartAccountAlias = (yield* smartAccountManager.selectSmartAccount({\n message: \"Select smart account:\",\n })).alias;\n }\n\n const chains = yield* web3Service.multiSelectChain({\n message: \"Select chains:\",\n });\n\n if (flagSessionKeyPassword._tag === \"Some\") {\n sessionKeyPassword = flagSessionKeyPassword.value;\n } else {\n sessionKeyPassword = yield* promptManager.passwordPrompt({\n message: \"Enter session key password:\",\n });\n }\n\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: smartAccountAlias,\n });\n\n if (flagOwnerKeystorePassword._tag === \"Some\") {\n ownerKeystorePassword = flagOwnerKeystorePassword.value;\n } else {\n ownerKeystorePassword = yield* promptManager.passwordPrompt({\n message: `Enter keystore password for owner (${sa.data.ownerAlias}):`,\n });\n }\n\n const policyParams = yield* getPoliciesFromUser();\n\n params = {\n alias,\n chains,\n smartAccountAlias,\n sessionKeyPassword: Redacted.value(sessionKeyPassword),\n ownerKeystorePassword: Redacted.value(ownerKeystorePassword),\n policyParams,\n };\n }\n\n const res = yield* sessionKeyManager.createSessionKey(params);\n\n const data = {\n ...(res.data.sessionKeyType === \"ecdsa\"\n ? {\n sessionKeyAddress: res.data.sessionKeyAddress,\n }\n : {\n passKeyName: res.data.passKeyName,\n }),\n smartAccount: res.data.smartAccountAlias,\n chains: res.data.serializedAccounts.map((a) => getChain(a.chain).name),\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst smartAccountAlias = Flag.string(\"smart-account\").pipe(\n Flag.withDescription(\n \"The alias of the smart account to create session key for\",\n ),\n Flag.withAlias(\"sa\"),\n Flag.optional,\n);\n\nconst sessionKeyPassword = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"Password to encrypt session key\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\nconst ownerKeystorePassword = Flag.redacted(\"owner-password\").pipe(\n Flag.withDescription(\"Password to encrypt session key\"),\n Flag.withAlias(\"op\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new session key and stores it locally.\n */\nexport const createSessionKeyCommand = Command.make(\n \"create\",\n { alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword },\n ({ alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword }) =>\n handler(\n alias,\n smartAccountAlias,\n sessionKeyPassword,\n ownerKeystorePassword,\n ),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a new session key\"),\n Command.withExamples([\n {\n command: \"namera session-key create\",\n description: \"Creates a new session key with interactive prompts\",\n },\n {\n command: \"namera schema session-key.create\",\n description: \"Get the schema for session key create command\",\n },\n ]),\n);\n","import { deserializePermissionAccountParams } from \"@namera-ai/sdk/session-key\";\nimport { Duration } from \"effect\";\nimport { type AbiFunction, formatEther, zeroAddress } from \"viem\";\n\nexport const humanizeDuration = (input: Duration.Input): string => {\n const millis = Duration.toMillis(Duration.fromInputUnsafe(input));\n let seconds = Math.floor(millis / 1000);\n\n const units = [\n { label: \"year\", value: 60 * 60 * 24 * 365 },\n { label: \"month\", value: 60 * 60 * 24 * 30 },\n { label: \"day\", value: 60 * 60 * 24 },\n { label: \"hour\", value: 60 * 60 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n const parts: string[] = [];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n seconds %= unit.value;\n\n parts.push(`${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`);\n }\n }\n\n return parts.length > 0 ? parts.join(\" \") : \"0 seconds\";\n};\n\nexport const humanizeRelativeTime = (target: Date | number): string => {\n const now = Date.now();\n const targetMs = target instanceof Date ? target.getTime() : target * 1000;\n\n const diff = targetMs - now;\n const abs = Math.abs(diff);\n\n const seconds = Math.floor(abs / 1000);\n\n const units = [\n { label: \"year\", value: 31_536_000 },\n { label: \"month\", value: 2_592_000 },\n { label: \"day\", value: 86_400 },\n { label: \"hour\", value: 3600 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n\n const formatted = `${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`;\n\n return diff > 0 ? `in ${formatted}` : `${formatted} ago`;\n }\n }\n\n return \"just now\";\n};\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: safe\nexport const humanizePolicyParams = (serializedAccount: string) => {\n const params = deserializePermissionAccountParams(serializedAccount);\n\n // biome-ignore lint/suspicious/noExplicitAny: safe\n const result: Record<string, any> = {};\n\n // Permission Id\n result.permissionId = params.permissionParams.permissionId;\n\n for (const policy of params.permissionParams.policies ?? []) {\n const params = policy.policyParams;\n if (params.type === \"sudo\") {\n result.sudoPolicy = {\n enabled: true,\n };\n } else if (params.type === \"gas\") {\n const allowed = formatEther(params.allowed ?? 0n);\n result.gasPolicy = {\n enabled: true,\n allowed: `${allowed} ETH`,\n ...(params.enforcePaymaster && {\n enforcePaymaster: params.enforcePaymaster,\n }),\n ...(params.allowedPaymaster !== zeroAddress && {\n allowedPaymaster: params.allowedPaymaster,\n }),\n };\n } else if (params.type === \"timestamp\") {\n const validAfter = params.validAfter ?? 0;\n const validUntil = params.validUntil ?? 0;\n\n result.timestampPolicy = {\n enabled: true,\n starts: humanizeRelativeTime(validAfter),\n ends: humanizeRelativeTime(validUntil),\n };\n } else if (params.type === \"rate-limit\") {\n const formattedInterval = humanizeDuration(params.interval ?? 0);\n result.rateLimitPolicy = {\n enabled: true,\n count: params.count,\n interval: formattedInterval,\n starts: humanizeRelativeTime(params.startAt ?? 0),\n };\n } else if (params.type === \"signature-caller\") {\n result.signatureCallerPolicy = {\n enabled: true,\n allowedCallers: params.allowedCallers,\n };\n } else if (params.type === \"call\") {\n result.callPolicy = {\n enabled: true,\n policyVersion: params.policyVersion,\n };\n\n if (!params.permissions || params.permissions.length === 0) continue;\n\n for (const permission of params.permissions) {\n result.callPolicy.permissions = result.callPolicy.permissions ?? [];\n\n if (\"abi\" in permission) {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n\n const abiFn = permission.abi?.find(\n (f) => f.type === \"function\" && f.name === permission.functionName,\n ) as AbiFunction | undefined;\n\n const cyan = \"\\x1b[36m\";\n const yellow = \"\\x1b[33m\";\n const magenta = \"\\x1b[35m\";\n const reset = \"\\x1b[0m\";\n\n let fnName = `${magenta}${permission.functionName ?? \"unknown\"}${reset}(`;\n\n if (abiFn) {\n abiFn.inputs.forEach((input, i) => {\n if (i > 0) fnName += \", \";\n fnName += `${cyan}${input.type}${reset}${input.name ? ` ${yellow}${input.name}${reset}` : \"\"}`;\n });\n }\n\n fnName += \")\";\n\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n functionName: fnName,\n });\n } else {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n });\n }\n }\n }\n }\n\n return result;\n};\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSessionKeyInfoParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { humanizePolicyParams } from \"@/helpers/humanize\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSessionKeyInfoParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSessionKeyInfoParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* sessionKeyManager.getSessionKey(params);\n\n const data = {\n alias: res.alias,\n ...(res.data.sessionKeyType === \"ecdsa\"\n ? {\n address: res.data.sessionKeyAddress,\n }\n : {\n passKeyName: res.data.passKeyName,\n }),\n smartAccount: res.data.smartAccountAlias,\n chains: res.data.serializedAccounts\n .map((a) => getChain(a.chain).name)\n .join(\", \"),\n policies: humanizePolicyParams(\n res.data.serializedAccounts[0]?.serializedAccount ?? \"\",\n ),\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to get info for\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const getSessionKeyInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withDescription(\"Get information about a session key\"),\n Command.withExamples([\n {\n command: \"namera session-key info\",\n description: \"Get information about a session key with alias prompt\",\n },\n {\n command: \"namera session-key info --alias my-session-key\",\n description:\n \"Get information about a session key with alias 'my-session-key'\",\n },\n {\n command: `namera session-key info --params '{\"alias\":\"my-session-key\"}'`,\n description: \"Get information about a session key with json params\",\n },\n {\n command: \"namera session-key info --alias my-wallet --output json\",\n description: \"Get information about a session key in json format\",\n },\n {\n command: \"namera schema session-key.info\",\n description: \"Get the schema for the session key info command\",\n },\n ]),\n);\n","import { Console, Effect, type Option } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nconst handler = (flagSmartAccountAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* sessionKeyManager.listSessionKeys({\n smartAccount:\n flagSmartAccountAlias._tag === \"Some\"\n ? flagSmartAccountAlias.value\n : undefined,\n });\n\n const data = res.map((d) => ({\n alias: d.alias,\n ...(d.data.sessionKeyType === \"ecdsa\"\n ? {\n address: d.data.sessionKeyAddress,\n }\n : {\n passKeyName: d.data.passKeyName,\n }),\n smartAccount: d.data.smartAccountAlias,\n chains: d.data.serializedAccounts\n .map((a) => getChain(a.chain).name)\n .join(\", \"),\n }));\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst smartAccountAlias = Flag.string(\"smart-account\").pipe(\n Flag.withDescription(\n \"The alias of the smart account to list session keys for\",\n ),\n Flag.withAlias(\"sa\"),\n Flag.optional,\n);\n/**\n * Command that lists all locally stored session keys.\n */\nexport const listSessionKeysCommand = Command.make(\n \"list\",\n { smartAccountAlias },\n ({ smartAccountAlias }) => handler(smartAccountAlias),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List session keys\"),\n Command.withExamples([\n {\n command: \"namera session-key list\",\n description: \"List all session keys\",\n },\n {\n command: \"namera session-key list --smart-account my-smart\",\n description: \"List all session keys for smart account 'my-smart'\",\n },\n {\n command: `namera session-key list --params '{\"smartAccount\":\"my-smart\"}'`,\n description: \"List all session keys for smart account 'my-smart'\",\n },\n {\n command: \"namera session-key list --output json\",\n description: \"List all session keys in json format\",\n },\n {\n command: \"namera schema session-key.list\",\n description: \"Get the schema for the list session key command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveSessionKeyParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveSessionKeyParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveSessionKeyParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* sessionKeyManager.removeSessionKey(params);\n\n const data = { success: true };\n\n if (globalFlags.quite) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const removeSessionKeyCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a Session Key\"),\n Command.withExamples([\n {\n command: \"namera session-key remove\",\n description: \"Remove a session key with alias prompt\",\n },\n {\n command: \"namera session-key remove --alias my-session-key\",\n description: \"Remove a session key with alias 'my-session-key'\",\n },\n {\n command: `namera session-key remove --params '{\"alias\":\"my-session-key\"}'`,\n description: \"Remove a session key with json params\",\n },\n {\n command: \"namera schema session-key.remove\",\n description: \"Get the schema for the remove session key command\",\n },\n ]),\n);\n","import { Flag } from \"effect/unstable/cli\";\n\nimport { type SupportedChain, supportedChains } from \"@/schema/chain\";\n\nconst chain = Flag.choice(\n \"chain\",\n Object.keys(supportedChains) as SupportedChain[],\n).pipe(Flag.withDescription(\"Chain Name\"), Flag.optional);\n\nconst rpcUrl = Flag.string(\"rpc-url\").pipe(\n Flag.withDescription(\"RPC URL\"),\n Flag.optional,\n);\n\nexport const chainAndRpcUrl = { chain, rpcUrl };\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSessionKeyStatusParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { chainAndRpcUrl } from \"@/flags/shared\";\nimport { OutputFormatter, SessionKeyManager, Web3Service } from \"@/layers\";\nimport type { SupportedChain } from \"@/schema/chain\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagChain: Option.Option<SupportedChain>,\n flagRpcUrl: Option.Option<string>,\n) =>\n Effect.gen(function* () {\n const web3Service = yield* Web3Service.Web3Service;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSessionKeyStatusParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSessionKeyStatusParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let chain: SupportedChain;\n const rpcUrl = flagRpcUrl._tag === \"Some\" ? flagRpcUrl.value : undefined;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n if (flagChain._tag === \"Some\") {\n chain = flagChain.value;\n } else {\n chain = yield* web3Service.selectChain({\n message: \"Select Chain:\",\n });\n }\n\n params = { alias, chain, rpcUrl };\n }\n\n const installed = yield* sessionKeyManager.getSessionKeyStatus(params);\n\n const data = { installed };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const getSessionKeyStatusCommand = Command.make(\n \"status\",\n {\n alias,\n ...chainAndRpcUrl,\n },\n ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl),\n).pipe(\n Command.withDescription(\"Get Session key status for a given chain\"),\n Command.withExamples([\n {\n command: \"namera session-key status -a my-smart --chain eth-mainnet\",\n description: \"Get Session key status for a given chain\",\n },\n {\n command:\n \"namera session-key status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth\",\n description:\n \"Get Session key status for a given chain with custom RPC URL\",\n },\n {\n command: `namera session-key status --params '{\"alias\":\"my-session-key\",\"chain\":\"eth-mainnet\"}'`,\n description: \"Get Session key status for a given chain with json params\",\n },\n {\n command: \"namera schema session-key.status\",\n description: \"Get the schema for the session key status command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { createSessionKeyCommand } from \"./create\";\nimport { getSessionKeyInfoCommand } from \"./info\";\nimport { listSessionKeysCommand } from \"./list\";\nimport { removeSessionKeyCommand } from \"./remove\";\nimport { getSessionKeyStatusCommand } from \"./status\";\n\n/**\n * Command group for session-key related operations.\n */\nexport const sessionKeyCommands = Command.make(\n \"session-key\",\n {},\n () => Effect.void,\n).pipe(\n Command.withAlias(\"sk\"),\n Command.withDescription(\"Session Key management commands.\"),\n Command.withSubcommands([\n createSessionKeyCommand,\n listSessionKeysCommand,\n getSessionKeyInfoCommand,\n getSessionKeyStatusCommand,\n removeSessionKeyCommand,\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport {\n KeystoreManager,\n OutputFormatter,\n PromptManager,\n SmartAccountManager,\n} from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagOwnerAlias: Option.Option<string>,\n flagOwnerPassword: Option.Option<Redacted.Redacted<string>>,\n flagIndex: Option.Option<number>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateSmartAccountParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateSmartAccountParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let ownerAlias: string;\n let ownerPassword: Redacted.Redacted<string>;\n let index: bigint;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for smart account:\",\n type: \"smart-account\",\n });\n }\n\n if (flagOwnerAlias._tag === \"Some\") {\n ownerAlias = flagOwnerAlias.value;\n } else {\n ownerAlias = (yield* keystoreManager.selectKeystore({\n message: \"Select owner keystore:\",\n })).alias;\n }\n\n if (flagOwnerPassword._tag === \"Some\") {\n ownerPassword = flagOwnerPassword.value;\n } else {\n ownerPassword = yield* keystoreManager.getKeystorePassword({\n alias: ownerAlias,\n message: `Enter password for owner (${ownerAlias}):`,\n });\n }\n\n if (flagIndex._tag === \"Some\") {\n index = BigInt(flagIndex.value);\n } else {\n index = 0n;\n }\n\n params = {\n alias,\n ownerAlias,\n index,\n ownerPassword: Redacted.value(ownerPassword),\n };\n }\n\n const res = yield* smartAccountManager.createSmartAccount(params);\n\n const data = {\n address: res.data.smartAccountAddress,\n kernelVersion: res.data.kernelVersion,\n index: Number(res.data.index),\n owner: res.data.ownerAlias,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst ownerAlias = Flag.string(\"owner-alias\").pipe(\n Flag.withDescription(\"The alias of the owner keystore\"),\n Flag.withAlias(\"oa\"),\n Flag.optional,\n);\n\nconst ownerPassword = Flag.redacted(\"owner-password\").pipe(\n Flag.withDescription(\"The password of the owner keystore\"),\n Flag.withAlias(\"op\"),\n Flag.optional,\n);\n\nconst index = Flag.integer(\"index\").pipe(\n Flag.withDescription(\"The index of the smart account\"),\n Flag.withAlias(\"i\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new smart account and stores it locally.\n *\n * Accepts alias, owner alias, and index via flags or JSON params.\n */\nexport const createSmartAccountCommand = Command.make(\n \"create\",\n { alias, ownerAlias, ownerPassword, index },\n ({ alias, ownerAlias, ownerPassword, index }) =>\n handler(alias, ownerAlias, ownerPassword, index),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a new smart account\"),\n Command.withExamples([\n {\n command: \"namera smart-account create\",\n description: \"Creates a new smart account with interactive prompts\",\n },\n {\n command:\n \"namera smart-account create --alias my-smart --owner-alias my-owner --index 0\",\n description:\n \"Creates a new smart account with alias 'my-smart', owner alias 'my-owner', and index 0\",\n },\n {\n command: `namera smart-account create --params '{\"alias\":\"my-smart\",\"owner-alias\":\"my-owner\",\"index\":0}'`,\n description: \"Creates a new smart account with json params\",\n },\n {\n command: \"namera schema smart-account.create\",\n description: \"Get the schema for the create command\",\n },\n ]),\n);\n","import { Console, Effect, Schema } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { ImportSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\nimport { SmartAccountManagerError } from \"@/layers/smart-account\";\n\nconst handler = () =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n if (globalFlags.params._tag === \"None\") {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountImportError\",\n message: \"Smart Account import is only supported via JSON params\",\n }),\n );\n }\n\n const params = Schema.decodeUnknownSync(\n Schema.fromJsonString(ImportSmartAccountParams),\n )(globalFlags.params.value);\n\n const res = yield* smartAccountManager.importSmartAccount(params);\n\n const data = {\n alias: res.alias,\n address: res.data.smartAccountAddress,\n owner: res.data.ownerAlias,\n index: Number(res.data.index),\n kernelVersion: res.data.kernelVersion,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that imports a smart account using JSON params only.\n */\nexport const importSmartAccountCommand = Command.make(\"import\", {}, () =>\n handler(),\n).pipe(\n Command.withAlias(\"i\"),\n Command.withDescription(\"Import a smart account\"),\n Command.withExamples([\n {\n command: `namera smart-account import --params '{\"alias\":\"my-smart\",\"ownerAlias\":\"my-owner\",\"index\":0,\"kernelVersion\":\"0.3.2\",\"smartAccountAddress\":\"0x1bC710cbA70f8Ce638dC5c8F50FDb05d87a7D652\",\"entryPointVersion\":\"0.7\",\"ownerType\":\"ecdsa\"}'`,\n description: \"Import a smart account with json params\",\n },\n {\n command: \"namera schema smart-account.import\",\n description: \"Get the schema for the smart account import command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* smartAccountManager.getSmartAccount(params);\n\n const data = {\n alias: res.alias,\n address: res.data.smartAccountAddress,\n owner: res.data.ownerAlias,\n index: Number(res.data.index),\n kernelVersion: res.data.kernelVersion,\n };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to retrieve\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that returns stored metadata for a smart account.\n *\n * Accepts alias via flag or JSON params, otherwise prompts for selection.\n */\nexport const getSmartAccountInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withDescription(\"Get information about a smart account\"),\n Command.withExamples([\n {\n command: \"namera smart-account info\",\n description: \"Get information about a smart account with alias prompt\",\n },\n {\n command: \"namera smart-account info --alias my-smart\",\n description:\n \"Get information about a smart account with alias 'my-smart'\",\n },\n {\n command: `namera smart-account info --params '{\"alias\":\"my-smart\"}'`,\n description: \"Get information about a smart account with json params\",\n },\n {\n command: \"namera smart-account info --alias my-wallet --output json\",\n description: \"Get information about a smart account in json format\",\n },\n {\n command: \"namera schema smart-account.info\",\n description: \"Get the schema for the smart account info command\",\n },\n ]),\n);\n","import { Console, Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = () =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* smartAccountManager.listSmartAccounts();\n\n const data = res.map((d) => ({\n alias: d.alias,\n address: d.data.smartAccountAddress,\n owner: d.data.ownerAlias,\n index: Number(d.data.index),\n kernelVersion: d.data.kernelVersion,\n }));\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that lists all locally stored smart accounts.\n */\nexport const listSmartAccountsCommand = Command.make(\"list\", {}, () =>\n handler(),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List all smart accounts\"),\n Command.withExamples([\n {\n command: \"namera smart-account list\",\n description: \"List all smart accounts\",\n },\n {\n command: \"namera smart-account list --output json\",\n description: \"List all smart accounts in json format\",\n },\n {\n command: \"namera smart-account list --output ndjson\",\n description: \"List all smart accounts in ndjson format\",\n },\n {\n command: \"namera schema smart-account.list\",\n description: \"Get the schema for the list smart account command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveSmartAccountParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveSmartAccountParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* smartAccountManager.removeSmartAccount(params);\n\n const data = { success: true };\n\n if (globalFlags.quite) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that removes a locally stored smart account by alias.\n */\nexport const removeSmartAccountCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a Smart Account\"),\n Command.withExamples([\n {\n command: \"namera smart-account remove\",\n description: \"Remove a smart-account with alias prompt\",\n },\n {\n command: \"namera smart-account remove --alias my-smart\",\n description: \"Remove a smart account with alias 'my-smart'\",\n },\n {\n command: `namera smart-account remove --params '{\"alias\":\"my-smart\"}'`,\n description: \"Remove a smart account with json params\",\n },\n {\n command: \"namera schema smart-account.remove\",\n description: \"Get the schema for the remove smart account command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSmartAccountStatusParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { chainAndRpcUrl } from \"@/flags/shared\";\nimport { OutputFormatter, SmartAccountManager, Web3Service } from \"@/layers\";\nimport type { SupportedChain } from \"@/schema/chain\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagChain: Option.Option<SupportedChain>,\n flagRpcUrl: Option.Option<string>,\n) =>\n Effect.gen(function* () {\n const web3Service = yield* Web3Service.Web3Service;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSmartAccountStatusParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSmartAccountStatusParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let chain: SupportedChain;\n const rpcUrl = flagRpcUrl._tag === \"Some\" ? flagRpcUrl.value : undefined;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n if (flagChain._tag === \"Some\") {\n chain = flagChain.value;\n } else {\n chain = yield* web3Service.selectChain({\n message: \"Select Chain:\",\n });\n }\n\n params = { alias, chain, rpcUrl };\n }\n\n const deployed = yield* smartAccountManager.getSmartAccountStatus(params);\n\n const data = { deployed };\n\n if (globalFlags.quite) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that checks deployment status of a smart account on a chain.\n */\nexport const getSmartAccountStatus = Command.make(\n \"status\",\n {\n alias,\n ...chainAndRpcUrl,\n },\n ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl),\n).pipe(\n Command.withDescription(\n \"Get Smart Account Deployment Status for a given chain\",\n ),\n Command.withExamples([\n {\n command: \"namera smart-account status -a my-smart --chain eth-mainnet\",\n description: \"Get Smart Account Deployment Status for a given chain\",\n },\n {\n command:\n \"namera smart-account status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth\",\n description:\n \"Get Smart Account Deployment Status for a given chain with custom RPC URL\",\n },\n {\n command: `namera smart-account status --params '{\"alias\":\"my-smart\",\"chain\":\"eth-mainnet\"}'`,\n description:\n \"Get Smart Account Deployment Status for a given chain with json params\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { createSmartAccountCommand } from \"./create\";\nimport { importSmartAccountCommand } from \"./import\";\nimport { getSmartAccountInfoCommand } from \"./info\";\nimport { listSmartAccountsCommand } from \"./list\";\nimport { removeSmartAccountCommand } from \"./remove\";\nimport { getSmartAccountStatus } from \"./status\";\n\n/**\n * Root command group for smart-account lifecycle actions.\n *\n * Includes create, list, info, remove, status, and import subcommands.\n */\nexport const smartAccountCommands = Command.make(\n \"smart-account\",\n {},\n () => Effect.void,\n).pipe(\n Command.withAlias(\"sa\"),\n Command.withDescription(\"Smart Account management utilities.\"),\n Command.withSubcommands([\n createSmartAccountCommand,\n listSmartAccountsCommand,\n getSmartAccountInfoCommand,\n removeSmartAccountCommand,\n getSmartAccountStatus,\n importSmartAccountCommand,\n ]),\n);\n","import { keystoreCommands } from \"./keystore\";\nimport { mcpCommands } from \"./mcp\";\nimport { schemaCommand } from \"./schema\";\nimport { sessionKeyCommands } from \"./session-key\";\nimport { smartAccountCommands } from \"./smart-account\";\n\n/**\n * Root CLI command set.\n */\nexport const commands = [\n keystoreCommands,\n smartAccountCommands,\n sessionKeyCommands,\n mcpCommands,\n schemaCommand,\n] as const;\n","import \"dotenv/config\";\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { ConfigProvider, Console, Effect, Layer } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { commands } from \"./commands\";\nimport { globalFlags } from \"./flags/global\";\nimport {\n ConfigManager,\n KeystoreManager,\n McpManager,\n OutputFormatter,\n PromptManager,\n SessionKeyManager,\n SmartAccountManager,\n Web3Service,\n} from \"./layers\";\n\nconst command = Command.make(\"namera\", {}, () => Effect.void).pipe(\n Command.withDescription(\n \"Programmable Session keys for Smart Contracts Accounts.\",\n ),\n Command.withGlobalFlags(globalFlags),\n Command.withSubcommands(commands),\n Command.withExamples([\n {\n command: \"namera --help\",\n description: \"Print help\",\n },\n {\n command: \"namera --version\",\n description: \"Print version\",\n },\n ]),\n);\n\nconst Layers = McpManager.layer.pipe(\n Layer.provideMerge(SessionKeyManager.layer),\n Layer.provideMerge(SmartAccountManager.layer),\n Layer.provideMerge(KeystoreManager.layer),\n Layer.provideMerge(Web3Service.layer),\n Layer.provideMerge(PromptManager.layer),\n Layer.provideMerge(ConfigManager.layer),\n Layer.provideMerge(OutputFormatter.layer),\n Layer.provideMerge(NodeServices.layer),\n);\n\nconst cli = Effect.gen(function* () {\n const configManager = yield* ConfigManager.ConfigManager;\n yield* configManager.ensureConfigDirExists();\n\n yield* Command.run(command, {\n version: \"0.0.1\",\n });\n}).pipe(\n Effect.provide(Layers),\n Effect.provideService(\n ConfigProvider.ConfigProvider,\n ConfigProvider.fromEnv(),\n ),\n Effect.catch((e) => Console.error(e.message)),\n);\n\n// @ts-expect-error - TODO: fix this\ncli.pipe(NodeRuntime.runMain);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,MAAa,WAAW,OAAO,OAAO;CACpC,SAAS,OAAO;CAChB,IAAI,OAAO;CACX,SAAS,OAAO;CAChB,QAAQ,OAAO;CAChB,CAAC;AAE0B,OAAO,OAAO;CACxC,MAAM,OAAO;CACb,OAAO,OAAO;CACd,MAAM;CACP,CAAC;AAEF,MAAa,oBAAoB,OAAO,OAAO,EAC7C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC,EACH,CAAC;AAEF,MAAa,qBAAqB,OAAO;AAEzC,MAAa,uBAAuB,OAAO,OAAO;CAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,qCACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO;CACjD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,wCACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEqC,OAAO,OAAO;CACnD,SAAS,OAAO,OAAO,SAAS,EAC9B,aAAa,+BACd,CAAC;CACF,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,6BACd,CAAC;CACF,YAAY,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EAClD,aAAa,mCACd,CAAC;CACF,WAAW,OAAO,OAAO,SAAS,EAChC,aAAa,kCACd,CAAC;CACH,CAAC;AAEF,MAAa,uBAAuB,OAAO,OAAO;CAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC;CACF,YAAY,OAAO,OAAO,SAAS,EACjC,aAAa,6CACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEF,MAAa,uBAAuB,OAAO,OAAO,EAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC,EACH,CAAC;AAE6B,OAAO,OAAO;CAC3C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,mDACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;;;AC/EF,MAAa,uBAAuB,OAAO,OAAO;CAChD,mBAAmB,OAAO,OAAO,SAAS,EACxC,aAAa,4DACd,CAAC;CACF,WAAW,OAAO,SAAS,CAAC,QAAQ,QAAQ,CAAC,CAAC,SAAS,EACrD,aAAa,2CACd,CAAC;CACF,MAAM,OAAO,SACX,OAAO,IAAI,MAAM,OAAO,YAAY,MAAM,IAAI,KAAK,IAAI,MAAO,CAAC,CAChE,CAAC,SAAS,EACT,aAAa,gEACd,CAAC;CACF,aAAa,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;CAC5E,CAAC;;;ACkBF,MAAM,yBAAyB;CAC7B,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,mBAAmB;EACjB,GAAG;EACH,KAAK;EACN;CACD,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,oBAAoB;EAClB,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,kBAAkB;EAChB,GAAG;EACH,KAAK;EACN;CACD,iBAAiB;EACf,GAAG;EACH,KAAK;EACN;CACF;AAED,MAAM,yBAAyB;CAC7B,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,kBAAkB;EAChB,GAAG;EACH,KAAK;EACN;CACD,aAAa;EACX,GAAG;EACH,KAAK;EACN;CACD,oBAAoB;EAClB,GAAG;EACH,KAAK;EACN;CACD,iBAAiB;EACf,GAAG;EACH,KAAK;EACN;CACD,gBAAgB;EACd,GAAG;EACH,KAAK;EACN;CACD,kBAAkB;EAChB,GAAG;EACH,KAAK;EACN;CACD,eAAe;EACb,GAAG;EACH,KAAK;EACN;CACF;AAKD,MAAa,iBAAiB,OAAO,SAAS,CAC5C,GAAI,OAAO,KAAK,uBAAuB,EACvC,GAAI,OAAO,KAAK,uBAAuB,CACxC,CAAC;AAIF,MAAa,kBAAkB;CAC7B,GAAG;CACH,GAAG;CACJ;AAED,MAAa,YAAY,UAA6C;AACpE,QAAO,gBAAgB;;AAGzB,MAAa,kBACX,YACkC;AAClC,QAAO,OAAO,OAAO,gBAAgB,CAAC,MAAM,MAAM,EAAE,OAAO,QAAQ;;AAGrE,MAAa,sBAAsB,YAAoB;CACrD,MAAM,QAAQ,eAAe,QAAQ;AAErC,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,iBAAiB,QAAQ,YAAY;AAGvD,QAAO,MAAM;;;;ACrKf,MAAa,mBAAmB,OAAO,OAAO,KAC5C,OAAO,SACL,OAAO,QACP,qBAAqB,UAAU;CAC7B,SAAS,MAAM,EAAE,UAAU;CAC3B,SAAS,MAAM,OAAO,EAAE;CACzB,CAAC,CACH,CACF;AAED,MAAa,kBAAkB,OAAO,gBAAgB,CACpD,MACA,OAAO,OAAO,MAAM,OAAO,UAAU,oBAAoB,CAAC,CAC3D,CAAC;AAEF,MAAa,MAAM,OAAO,gBAAgB,CACxC,MACA,OAAO,OAAO,MAAM,OAAO,UAAU,iBAAiB,CAAC,CACxD,CAAC;AAEF,MAAa,oBAAoB,OAAO,SAAS;CAAC;CAAO;CAAO;CAAM,CAAC;AACvE,MAAa,gBAAgB,OAAO,SAAS;CAC3C;CACA;CACA;CACA;CACD,CAAC;AACF,MAAa,YAAY,OAAO,SAAS;CAAC;CAAS;CAAW;CAAW,CAAC;;;ACzB1E,MAAa,mBAAmB,OAAO,OAAO,EAC5C,MAAM,OAAO,QAAQ,OAAO,EAC7B,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO;CACjD,MAAM,OAAO,QAAQ,YAAY;CACjC,YAAY,OAAO,SAAS,OAAO,OAAO,CACvC,KAAK,OAAO,0BAA0B,EAAE,CAAC,CACzC,SAAS,EACR,aACE,2GACH,CAAC;CACJ,YAAY,OAAO,SAAS,OAAO,OAAO,CACvC,KAAK,OAAO,0BAA0B,EAAE,CAAC,CACzC,SAAS,EACR,aACE,4GACH,CAAC;CACL,CAAC;AAEF,MAAa,8BAA8B,OAAO,OAAO;CACvD,MAAM,OAAO,QAAQ,mBAAmB;CACxC,gBAAgB,OAAO,QAAQ,OAAO,MAAM,gBAAgB,CAAC,CAAC,SAAS,EACrE,aACE,iFACH,CAAC;CACH,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO;CACjD,MAAM,OAAO,QAAQ,aAAa;CAClC,UAAU,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EAChD,aAAa,iCACd,CAAC;CACF,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,mDACd,CAAC;CACF,SAAS,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EAC/C,aACE,8GACH,CAAC;CACH,CAAC;AAEF,MAAa,kBAAkB,OAAO,OAAO;CAC3C,MAAM,OAAO,QAAQ,MAAM;CAC3B,QAAQ,OAAO,SAAS,iBAAiB,CAAC,SAAS,EACjD,aACE,0FACH,CAAC;CACF,kBAAkB,OAAO,SAAS,OAAO,QAAQ,CAAC,SAAS;EACzD,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEF,MAAaA,sBAAoB,OAAO,SAAS;CAC/C;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,MAAMC,aAAW,OAAO,SAAS;CAAC;CAAQ;CAAgB;CAAa,CAAC;AAExE,MAAaC,mBAAiB,OAAO,SAAS;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAIF,MAAM,iBAAiB,OAAO,MAAM;CAClC,OAAO,OAAO;EACZ,WAAWA,iBAAe,KAAK,CAAC,SAAS,CAAC;EAC1C,OAAO,OAAO,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,SAAS,EACvD,aAAa,uDACd,CAAC;EACH,CAAC;CACF,OAAO,OAAO;EACZ,WAAWA,iBAAe,KAAK,CAAC,cAAc,CAAC;EAC/C,OAAO,OAAO,IAAI,SAAS,EACzB,aAAa,uDACd,CAAC;EACF,OAAO,OAAO;EACd,QAAQ,OAAO;EAChB,CAAC;CACF,OAAO,OAAO;EACZ,WAAWA,iBAAe,KAAK;GAC7B;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EACF,OAAO,OAAO,IAAI,SAAS,EACzB,aAAa,uDACd,CAAC;EACH,CAAC;CACF,OAAO;CACR,CAAC;AAEF,MAAM,YAAY,OAAO,OAAO;CAC9B,WAAWA;CACX,QAAQ,OAAO;CACf,QAAQ,OAAO,MAAM,CAAC,KAAK,OAAO,QAAQ,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,iBAAiB,OAAO,OAAO;CACnC,UAAU,OAAO,SAASD,WAAS,CAChC,KAAK,OAAO,0BAA0B,OAAO,CAAC,CAC9C,SAAS;EACR,aAAa;EACb,SAAS;EACV,CAAC;CACJ,QAAQ,gBAAgB,SAAS,EAC/B,aACE,mMACH,CAAC;CACF,UAAU,OAAO,SAAS,IAAI,CAAC,SAAS,EACtC,aAAa,qDACd,CAAC;CACF,YAAY,OAAO,SAAS,iBAAiB,CAAC,SAAS,EACrD,aAAa,2DACd,CAAC;CACF,OAAO,OAAO,SAAS,OAAO,MAAM,UAAU,CAAC;CAChD,CAAC;AAEF,MAAa,mBAAmB;AAEhC,MAAa,oBAAoB,eAAe,UAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,CACvB,CAAC,UACA,OAAO,OAAO;CACZ,KAAK,OAAO,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,SAAS,EACrD,aAAa,kCACd,CAAC;CACF,cAAc,OAAO,OAAO,SAAS,EACnC,aAAa,qBACd,CAAC;CACF,MAAM,OAAO,SAAS,OAAO,MAAM,eAAe,CAAC,CAAC,SAAS,EAC3D,aACE,0IACH,CAAC;CACH,CAAC,CACH;AAED,MAAa,aAAa,OAAO,MAAM,CAAC,kBAAkB,kBAAkB,CAAC;AAM7E,MAAa,mBAAmB,OAAO,OAAO;CAC5C,MAAM,OAAO,QAAQ,OAAO;CAC5B,eAAeD;CACf,aAAa,OAAO,SAAS,OAAO,MAAM,WAAW,CAAC;CACvD,CAAC;AAEF,MAAa,eAAe,OAAO,MAAM;CACvC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;AC7KF,MAAM,iBAAiB,OAAO,OAAO;CACnC,mBAAmB,OAAO;CAC1B,oBAAoB,OAAO,MACzB,OAAO,OAAO;EACZ,OAAO;EACP,mBAAmB,OAAO;EAC3B,CAAC,CACH;CACF,CAAC,CAAC,UAAU,OAAO,OAAO,SAAS,OAAO,CAAC;AAE5C,MAAM,kBAAkB,OAAO,OAAO;CACpC,gBAAgB,OAAO,QAAQ,QAAQ;CACvC,mBAAmB;CACnB,mBAAmB,OAAO;CAC3B,CAAC,CAAC,UAAU,OAAO,OAAO,eAAe,OAAO,CAAC;AAElD,MAAM,oBAAoB,OAAO,OAAO;CACtC,gBAAgB,OAAO,QAAQ,UAAU;CACzC,aAAa,OAAO;CACrB,CAAC,CAAC,UAAU,OAAO,OAAO,eAAe,OAAO,CAAC;AAElD,MAAa,aAAa,OAAO,MAAM,CAAC,iBAAiB,kBAAkB,CAAC;AAE9C,OAAO,OAAO;CAC1C,OAAO,OAAO;CACd,MAAM;CACN,MAAM,OAAO;CACd,CAAC;AAEF,MAAa,yBAAyB,OAAO,OAAO;CAClD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,0CACd,CAAC;CACF,QAAQ,OAAO,QAAQ,OAAO,MAAM,eAAe,CAAC,CAAC,SAAS,EAC5D,aAAa,4CACd,CAAC;CACF,cAAc,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;CACxD,mBAAmB,OAAO,OAAO,SAAS,EACxC,aAAa,gEACd,CAAC;CACF,uBAAuB,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC3D,aAAa,mDACd,CAAC;CACF,oBAAoB,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EACxD,aAAa,gDACd,CAAC;CACH,CAAC;AAEiC,OAAO,OAAO,EAC/C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO,EACjD,cAAc,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EACpD,aAAa,2DACd,CAAC,EACH,CAAC;AAEF,MAAa,0BAA0B,OAAO,OAAO,EACnD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,4BAA4B,OAAO,OAAO;CACrD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC;CACF,OAAO,eAAe,SAAS,EAC7B,aAAa,oDACd,CAAC;CACF,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,SAAS;EAClE,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEF,MAAa,yBAAyB,OAAO,OAAO,EAClD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,0CACd,CAAC,EACH,CAAC;;;AC9EF,MAAa,oBAAoB,OAAO,OAAO;CAC7C,mBAAmB;CACnB,OAAO;CACP,eAAe;CACf,YAAY,OAAO;CACnB,WAAW;CACX,qBAAqB;CACtB,CAAC;AAEmC,OAAO,OAAO;CACjD,MAAM;CACN,MAAM,OAAO;CACb,OAAO,OAAO;CACf,CAAC;AAEF,MAAa,2BAA2B,OAAO,OAAO;CACpD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC;CACF,YAAY,OAAO,OAAO,SAAS,EACjC,aAAa,mCACd,CAAC;CACF,eAAe,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EACnD,aAAa,sCACd,CAAC;CACF,OAAO,OAAO,SACZ,iBAAiB,MAAM,OAAO,YAAY,MAAM,KAAK,GAAG,CAAC,CAC1D,CAAC,SAAS;EACT,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEmC,OAAO,OAAO,EACjD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,8CACd,CAAC,EACH,CAAC;AACF,MAAa,yBAAyB,OAAO;AAE7C,MAAa,4BAA4B,OAAO,OAAO,EACrD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,8CACd,CAAC,EACH,CAAC;AAEF,MAAa,2BAA2B,OAAO,OAAO,EACpD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,8BAA8B,OAAO,OAAO;CACvD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,kCACd,CAAC;CACF,OAAO,eAAe,SAAS,EAC7B,aAAa,mCACd,CAAC;CACF,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,SAAS;EAClE,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEF,MAAa,2BAA2B,kBAAkB,KACxD,OAAO,aAAa,EAClB,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC,CACH;;;AC/ED,MAAa,eAAe,WAAW,QAAQ,SAAS,CAAC,EACvD,MAAM,KAAK,OAAO,UAAU;CAAC;CAAU;CAAQ;CAAS,CAAC,CAAC,KACxD,KAAK,UAAU,IAAI,EACnB,KAAK,YAAY,SAAS,EAC1B,KAAK,gBAAgB,uCAAuC,CAC7D,EACF,CAAC;AAEF,MAAa,cAAc,WAAW,QAAQ,QAAQ,CAAC,EACrD,MAAM,KAAK,QAAQ,QAAQ,CAAC,KAC1B,KAAK,UAAU,IAAI,EACnB,KAAK,YAAY,MAAM,EACvB,KAAK,gBAAgB,sBAAsB,CAC5C,EACF,CAAC;AAEF,MAAa,eAAe,WAAW,QAAQ,SAAS,CAAC,EACvD,MAAM,KAAK,OAAO,SAAS,CAAC,KAC1B,KAAK,UACL,KAAK,gBAAgB,yCAAyC,CAC/D,EACF,CAAC;AAEF,MAAa,uBACX,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO;CACnB,MAAM,QAAQ,OAAO;AAGrB,QAAO;EAAE;EAAK,QAFC,OAAO;EAEA;EAAO;EAC7B;AAEJ,MAAa,cAAc;CAAC;CAAc;CAAa;CAAa;;;AC/BpE,MAAa,aAAyC;CACpD,UAAU;CACV,eAAe;CACf,iBAAiB;CAClB;;;;;;ACgED,IAAa,qBAAb,cAAwC,KAAK,YAC3C,oCACD,CAQE;;;;AAUH,MAAa,gBAAgB,WAAW,QACtC,+BACD;;;;AAKD,MAAaG,UAAQ,MAAM,OACzB,eACA,OAAO,IAAI,aAAa;CACtB,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CAEzB,MAAM,yBACJ,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,OAAO,WAAW,GAAG,SAAS,CAAC;AAGtD,SAFgB,KAAK,KAAK,SAAS,UAAU;GAG7C;CAEJ,MAAM,8BACJ,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,kBAAkB;EAIzC,MAAM,sBAFU;GAAC;GAAkB;GAAgB;GAAY,CAE3B,KAAK,QACvC,KAAK,KAAK,SAAS,IAAI,CACxB;AAED,SAAO,OAAO,QACZ,sBACC,YACC,GAAG,cAAc,SAAS,EAAE,WAAW,MAAM,CAAC,CAAC,KAC7C,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;GACrB,MAAM;GACN,SAAS,EAAE;GACZ,CAAC,CACH,CACF,CACF,EACH,EAAE,aAAa,aAAa,CAC7B;GACD;CAEJ,MAAM,iBACJ,WAEA,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,kBAAkB;AAEzC,SADmB,KAAK,KAAK,SAAS,GAAG,OAAO,KAAK,IAAI,OAAO,MAAM;GAEtE;CAEJ,MAAM,qBACJ,WAEA,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,OAAO;AAY/C,SAXe,OAAO,GAAG,OAAO,WAAW,CAAC,KAC1C,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;GACrB,MAAM,EAAE,OAAO;GACf,SAAS,EAAE;GACZ,CAAC,CACH,CACF,CACF;GAGD;CAEJ,MAAM,aACJ,WAEA,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,OAAO;AAG/C,MAFe,OAAO,kBAAkB,OAAO,EAEnC;GACV,MAAM,UAAU,OAAO,GAAG,eAAe,WAAW;AAEpD,UAAO;IACL,OAAO,OAAO;IACd;IACA,MAAM;IACN,MAAM,OAAO;IACd;;AAGH,SAAO,OAAO,OAAO,KACnB,IAAI,mBAAmB;GACrB,MAAM;GACN,SAAS,GAAG,WAAW,OAAO,MAAM,cAAc,OAAO,MAAM;GAChE,CAAC,CACH;GACD,CAAC,KACD,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;EACrB,MAAM,EAAE,OAAO;EACf,SAAS,EAAE;EACZ,CAAC,CACH,CACF,CACF;CAEH,MAAM,sBACJ,SAEA,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,kBAAkB;EAEzC,MAAM,cAAc,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG;EAGlD,MAAM,WAFW,OAAO,GAAG,cAAc,YAAY,EAE5B,KAAK,eAC5B,OAAO,IAAI,aAAa;GACtB,MAAM,aAAa,KAAK,KAAK,aAAa,WAAW;AAGrD,UAAO;IACL,OAAO;IACP,SAJc,OAAO,GAAG,eAAe,WAAW;IAKlD,MAAM;IACN;IACD;IACD,CACH;AAED,SAAO,OAAO,OAAO,IAAI,SAAS,EAAE,aAAa,aAAa,CAAC;GAC/D,CAAC,KACD,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;EACrB,MAAM,EAAE,OAAO;EACf,SAAS,EAAE;EACZ,CAAC,CACH,CACF,CACF;CAEH,MAAM,eACJ,WAEA,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,OAAO;AAO/C,MALe,OAAO,kBAAkB;GACtC,OAAO,OAAO;GACd,MAAM,OAAO;GACd,CAAC,CAGA,QAAO,OAAO,OAAO,KACnB,IAAI,mBAAmB;GACrB,MAAM;GACN,SAAS,UAAU,OAAO,MAAM;GACjC,CAAC,CACH;AAGH,SAAO,GAAG,gBAAgB,YAAY,OAAO,QAAQ;AAErD,SAAO;GACL,OAAO,OAAO;GACd,SAAS,OAAO;GAChB,MAAM;GACN,MAAM,OAAO;GACd;GACD,CAAC,KACD,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;EACrB,MAAM,EAAE,OAAO;EACf,SAAS,EAAE;EACZ,CAAC,CACH,CACF,CACF;CAEH,MAAM,gBACJ,WAEA,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,OAAO;AAE/C,SAAO,GAAG,OAAO,WAAW,CAAC,KAC3B,OAAO,SAAS,kBAAkB,MAChC,OAAO,KACL,IAAI,mBAAmB;GACrB,MAAM,EAAE,OAAO;GACf,SAAS,EAAE;GACZ,CAAC,CACH,CACF,CACF;GACD;AAEJ,QAAO,cAAc,GAAG;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;;;;AChPD,MAAa,gBAAgB,WAAW,QACtC,+BACD;AAKuC,KAAK,YAC3C,oCACD;;;;AA0DD,MAAaC,UAAQ,MAAM,OACzB,eACA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO;CAE7B,MAAM,eAAe,WACnB,OAAO,IAAI,aAAa;AAoCtB,SAnCc,OAAO,OAAO,KAAK;GAC/B,SAAS,OAAO;GAChB,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,QAAI,EAAE,MAAM,KAAK,GACf,QAAO,OAAO,OAAO,KAAK,wBAAwB;IAGpD,MAAM,SAAS,OAAO,cACnB,kBAAkB;KACjB,OAAO;KACP,MAAM,OAAO;KACd,CAAC,CACD,KACC,OAAO,SAAS,sCAAsC,MACpD,OAAO,KAAK,EAAE,QAAQ,CACvB,CACF;AAEH,QAAI,OAAO,cAAc,SAAS,OAChC,QAAO,OAAO,OAAO,KACnB,GAAG,WAAW,OAAO,MAAM,cAAc,EAAE,iBAC5C;AAGH,QAAI,OAAO,cAAc,cAAc,CAAC,OACtC,QAAO,OAAO,OAAO,KACnB,GAAG,WAAW,OAAO,MAAM,cAAc,EAAE,iBAC5C;AAGH,WAAO;KACP;GACL,CAAC;GAGF;CAEJ,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;AAiBtB,SAhBiB,OAAO,OAAO,SAAS;GACtC,SAAS,OAAO;GAChB,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,QAAI,EAAE,MAAM,KAAK,GACf,QAAO,OAAO,OAAO,KAAK,2BAA2B;AAGvD,QAAI,OAAO,SACT,QAAO,OAAO,OAAO,SAAS,EAAE;AAGlC,WAAO;KACP;GACL,CAAC;GAGF;CAEJ,MAAM,gBAAyB,WAC7B,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,OAAO,OAAO,OAAO;GACnC;CAEJ,MAAM,qBACJ,WAEA,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,OAAO,YAAY,OAAO;GACxC;CAUJ,SAAS,UAAU,QAAkC;AACnD,SAAO,OAAO,IAAI,aAAa;GAC7B,MAAM,YAAY,MAChB,OAAO,IAAI,aAAa;AACtB,QAAI,EAAE,MAAM,KAAK,GACf,QAAO,OAAO,OAAO,KAAK,sBAAsB;AAGlD,QAAI,CAAC,MAAM,EAAE,CACX,QAAO,OAAO,OAAO,KAAK,oBAAoB;AAKhD,QAFY,WAAW,EAAE,CAAC,WAEd,OAAO,OACjB,QAAO,OAAO,OAAO,KACnB,qBAAqB,OAAO,OAAO,QACpC;AAGH,WAAO;KACP;AAEJ,OAAI,OAAO,SACT,QAAO,OAAO,OAAO,SAAS;IAC5B,SAAS,OAAO;IAChB;IACD,CAAC;AAGJ,UAAO,OAAO,OAAO,KAAK;IACxB,SAAS,OAAO;IAChB;IACD,CAAC;IACF;;AAGJ,QAAO,cAAc,GAAG;EACtB;EACA;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;;;;ACrJD,MAAa,kBAAkB,WAAW,QACxC,iCACD;;;;AAKD,IAAa,uBAAb,cAA0C,KAAK,YAC7C,sCACD,CASE;;;;AAKH,MAAaC,UAAQ,MAAM,OACzB,iBACA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO;CAC7B,MAAM,gBAAgB,OAAO;CAE7B,MAAM,eAAe,WACnB,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,UAAU;GACzC,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,iBAAiB,OAAO,OAAO,IAAI;GACvC,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAW,KAAK,MAAM,IAAI,QAAQ;GACnC,CAAC;AAWF,SAT6B;GAC3B,OAAO,IAAI;GACX,MAAM;IACJ,GAAG;IACH,SAAS,KAAK,eAAe;IAC9B;GACD,MAAM,IAAI;GACX;GAGD;CAEJ,MAAM,sBACJ,OAAO,IAAI,aAAa;EAGtB,MAAM,WAFM,OAAO,cAAc,mBAAmB,WAAW,EAE3C,KAAK,WACvB,OAAO,IAAI,aAAa;GACtB,MAAM,iBAAiB,OAAO,OAAO,IAAI;IACvC,aACE,IAAI,qBAAqB;KACvB,MAAM;KACN,SAAS;KACV,CAAC;IACJ,WAAW,KAAK,MAAM,OAAO,QAAQ;IACtC,CAAC;AAWF,UAT6B;IAC3B,OAAO,OAAO;IACd,MAAM;KACJ,GAAG;KACH,SAAS,KAAK,eAAe;KAC9B;IACD,MAAM,OAAO;IACd;IAGD,CACH;AAED,SAAO,OAAO,OAAO,IAAI,SAAS,EAAE,aAAa,aAAa,CAAC;GAC/D;CAEJ,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,cAAc;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC;AAQF,MALmB,OAAO,cAAc,kBAAkB;GACxD,OAAO,OAAO;GACd,MAAM;GACP,CAAC,CAGA,QAAO,OAAO,OAAO,KACnB,IAAI,qBAAqB;GACvB,MAAM;GACN,SAAS,uBAAuB,OAAO,MAAM;GAC9C,CAAC,CACH;EAGH,MAAM,iBAAiB,OAAO,OAAO,WAAW;GAC9C,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAWC,OAAiB,UAAU,CAAC,WAAW,OAAO,SAAS;GACnE,CAAC;AAGF,SAAO,cAAc,YAAY;GAC/B,OAAO,OAAO;GACd,SAAS;GACT,MAAM;GACN,MAAM;GACP,CAAC;EAEF,MAAM,WAAW,OAAO,OAAO,IAAI;GACjC,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAW,KAAK,MAAM,eAAe;GACtC,CAAC;AAWF,SAT2B;GACzB,OAAO,OAAO;GACd,MAAM;IACJ,GAAG;IACH,SAAS,KAAK,SAAS;IACxB;GACD,MAAM;GACP;GAGD;CAEJ,MAAM,mBAAmB,WACvB,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,OAAO,YAAY,EAClC,OAAO,OAAO,OACf,CAAC;EAEF,MAAM,SAAS,OAAO,OAAO,WAAW;GACtC,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAWA,OAAiB,OAAO,SAAS,MAAM,OAAO,SAAS;GACnE,CAAC;AAEF,SAAO;GACL,SAAS,OAAO,0BAA0B;GAC1C,OAAO,OAAO;GACd,YAAY,SAAS,KAAK,OAAO,qBAAqB,CAAC;GACvD,WAAW,OAAO,oBAAoB;GACvC;GACD;CAEJ,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,OAAO,eAAe;AAWxC,SATY,OAAO,cAAc,aAAa;GAC5C,SAAS,OAAO;GAChB,SAAS,UAAU,KAAK,OAAO;IAC7B,OAAO,EAAE;IACT,OAAO;IACP,aAAa,EAAE,KAAK;IACrB,EAAE;GACJ,CAAC;GAGF;CAEJ,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,cAAc;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC;AAQF,MALmB,OAAO,cAAc,kBAAkB;GACxD,OAAO,OAAO;GACd,MAAM;GACP,CAAC,CAGA,QAAO,OAAO,OAAO,KACnB,IAAI,qBAAqB;GACvB,MAAM;GACN,SAAS,uBAAuB,OAAO,MAAM;GAC9C,CAAC,CACH;EAGH,MAAM,iBAAiB,OAAO,OAAO,WAAW;GAC9C,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WACEA,OAAiB,eACf,WAAW,OAAO,WAAkB,CACrC,CAAC,WAAW,OAAO,SAAS;GAChC,CAAC;AAGF,SAAO,cAAc,YAAY;GAC/B,OAAO,OAAO;GACd,SAAS;GACT,MAAM;GACN,MAAM;GACP,CAAC;EAEF,MAAM,WAAW,OAAO,OAAO,IAAI;GACjC,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAW,KAAK,MAAM,eAAe;GACtC,CAAC;AAQF,SAN2B;GACzB,OAAO,OAAO;GACd,MAAM;GACN,MAAM;GACP;GAGD;CAEJ,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;AAOtB,MAAI,EALW,OAAO,cAAc,kBAAkB;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC,EAGA,QAAO,OAAO,OAAO,KACnB,IAAI,qBAAqB;GACvB,MAAM;GACN,SAAS,uBAAuB,OAAO,MAAM;GAC9C,CAAC,CACH;AAGH,SAAO,OAAO,cAAc,aAAa;GACvC,OAAO,OAAO;GACd,MAAM;GACP,CAAC;GACF;CAEJ,MAAM,aAAa,WACjB,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,OAAO,YAAY,EAAE,OAAO,OAAO,OAAO,CAAC;AAW5D,SAAO,oBACL,OAVa,OAAO,OAAO,WAAW;GACtC,aACE,IAAI,qBAAqB;IACvB,MAAM;IACN,SAAS;IACV,CAAC;GACJ,WAAWA,OAAiB,OAAO,SAAS,MAAM,OAAO,SAAS;GACnE,CAAC,EAGa,eAAe,CAAC,CAC9B;GACD;CAEJ,MAAM,uBAAuB,WAC3B,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,OAAO,YAAY,EAAE,OAAO,OAAO,OAAO,CAAC;AAuB5D,SArBiB,OAAO,cAAc,eAAe;GACnD,SAAS,OAAO;GAChB,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,QAAI,EAAE,MAAM,KAAK,GACf,QAAO,OAAO,OAAO,KAAK,2BAA2B;AAGvD,WAAO,OAAO,WAAW;KACvB,WAAW,OAAO,OAAO,SAAS,MAAM,EAAE;KAC1C,aACE,IAAI,qBAAqB;MACvB,MAAM;MACN,SAAS,iCAAiC,OAAO;MAClD,CAAC;KACL,CAAC,CAAC,KAAK,OAAO,YAAY,OAAO,KAAK,mBAAmB,CAAC,CAAC;AAE5D,WAAO;KACP;GACL,CAAC;GAGF;AAEJ,QAAO,gBAAgB,GAAG;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;AC/aD,MAAa,aAAa,WAAW,QACnC,4BACD;;;ACZD,MAAa,YAAY,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ;AAErE,IAAa,0BAAb,cAA6C,OAAO,kBAA2C,CAC7F,2BACA,EAAE,CACH,CAAC;;;ACDF,MAAa,iBAAiB,KAAK,KAAK,sBAAsB;CAC5D,cAAc,CAAC,WAAW;CAC1B,aAAa;CACb,SAAS,OAAO;CAChB,YAAY;CACZ,SAAS,OAAO;CACjB,CAAC;AAEF,MAAa,8BACX,OAAO,IAAI,aAAa;AAGtB,SAFgB,OAAO,YAER,aAAa;EAC5B;;;;;;ACqEJ,MAAa,cAAc,WAAW,QACpC,6BACD;;;;AAKD,MAAaC,UAAQ,MAAM,OACzB,aACA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO;CAE7B,MAAM,qBAAqB,OAAuB,WAAmB;AACnE,SAAO,GAAG,MAAM,WAAW,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG;;CAGxD,MAAM,aAAa,WACjB,OAAO,IAAI,aAAa;EACtB,IAAI;AAEJ,MAAI,OAAO,OACT,UAAS,OAAO;OACX;GAEL,MAAM,aAAa,kBAAkB,OAAO,OAAO,UAAU;GAC7D,MAAM,YAAY,OAAO,OAAO,OAAO,OAAO,SAAS,WAAW,CAAC;AAEnE,OAAI,UAAU,SAAS,OACrB,UAAS,SAAS,MAAM,UAAU,MAAM;OAExC,UAAS,KAAA;;AAIb,SAAO;GACP,CAAC,KAAK,OAAO,MAAM;CAEvB,MAAM,iBAAiB,WACrB,OAAO,IAAI,aAAa;EACtB,IAAI;AAEJ,MAAI,OAAO,WACT,cAAa,OAAO;OACf;GAEL,MAAM,aAAa,kBAAkB,OAAO,OAAO,cAAc;GACjE,MAAM,YAAY,OAAO,OAAO,OAAO,OAAO,SAAS,WAAW,CAAC;AAEnE,OAAI,UAAU,SAAS,OACrB,cAAa,SAAS,MAAM,UAAU,MAAM;OAI5C,cAAa,gCAFC,SAAS,OAAO,MAAM,CAEe,GAAG;;AAI1D,SAAO;GACP,CAAC,KAAK,OAAO,MAAM;CAEvB,MAAM,mBAAmB,WACvB,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,UAAU,OAAO;AAOvC,SALe,mBAAmB;GAChC,OAFY,SAAS,OAAO,MAAM;GAGlC,WAAW,KAAK,OAAO;GACxB,CAAC;GAGF;CAEJ,MAAM,uBAAuB,WAC3B,OAAO,IAAI,aAAa;AAEtB,SAAO,KADY,OAAO,cAAc,OAAO,CACxB;GACvB;CAEJ,MAAM,eAAe,WACnB,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,OAAO,gBAAgB;AAU7C,SARY,OAAO,cAAc,aAAa;GAC5C,SAAS,OAAO;GAChB,SAAS,OAAO,KAAK,OAAO;IAC1B,OAAO,EAAE;IACT,OAAO,EAAE;IACV,EAAE;GACJ,CAAC;GAGF;CAEJ,MAAM,oBAAoB,WACxB,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,OAAO,gBAAgB;AAW7C,SATY,OAAO,cAAc,kBAAkB;GACjD,SAAS,OAAO;GAChB,SAAS,OAAO,KAAK,OAAO;IAC1B,OAAO,EAAE;IACT,OAAO,EAAE;IACV,EAAE;GACH,KAAK;GACN,CAAC;GAGF;AAEJ,QAAO,YAAY,GAAG;EACpB;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;ACrLD,MAAM,eAAe,aAA+C;CAClE,MAAM,MAAiB,EAAE;AAEzB,MAAK,MAAM,KAAK,UAAU;AACxB,MAAI,EAAE,SAAS,aAAa;AAC1B,OAAI,IAAI,UAAW,QAAO;AAC1B,OAAI,YAAY;;AAElB,MAAI,EAAE,SAAS,QAAQ;AACrB,OAAI,IAAI,KAAM,QAAO;AACrB,OAAI,OAAO;;AAEb,MAAI,EAAE,SAAS,oBAAoB;AACjC,OAAI,IAAI,gBAAiB,QAAO;AAChC,OAAI,kBAAkB;;AAExB,MAAI,EAAE,SAAS,OAAO;AACpB,OAAI,IAAI,IAAK,QAAO;AACpB,OAAI,MAAM;;AAEZ,MAAI,EAAE,SAAS,cAAc;AAC3B,OAAI,IAAI,UAAW,QAAO;AAC1B,OAAI,YAAY;;AAElB,MAAI,EAAE,SAAS,QAAQ;AACrB,OAAI,IAAI,KAAM,QAAO;AACrB,OAAI,OAAO;;;AAIf,QAAO;;AAGT,SAAgB,kBACd,QACA,WACA,YACS;CAMT,MAAM,MAAM,KAAK,KAAK;AAEtB,KAAI,OAAO,eAAe,KAAA,KAAa,MAAM,OAAO,aAAa,IAC/D,QAAO;AAGT,KAAI,OAAO,eAAe,KAAA,KAAa,OAAO,OAAO,aAAa,IAChE,QAAO;AAGT,QAAO;;AAGT,SAAgB,kBACd,QACA,UACA,WACS;CACT,MAAM,UAAU,UAAU;AAE1B,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAC7C,KAAI,CAAC,SAAS,SAAS,UAAU,QAAQ,CAAE,QAAO;AAGlD,QAAO,QAAQ,OAAO,WAAW,OAAO,eAAe,SAAS,OAAO,CAAC;;AAG1E,SAAgB,aACd,QACA,UACA,WACS;CACT,MAAM,cAAc,OAAO,eAAe,EAAE;AAC5C,KAAI,YAAY,WAAW,EAAG,QAAO;CAErC,MAAM,EAAE,YAAY;AAEpB,KAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAO,QAAQ,OAAO,UAAU;EAC9B,MAAM,EAAE,OAAO,YAAY;AAE3B,SAAO,MAAM,OAAO,SAAS;GAC3B,MAAM,EAAE,IAAI,QAAQ,IAAI,SAAS;AACjC,OAAI,CAAC,SAAS,SAAS,QAAQ,CAAE,QAAO;AAExC,UAAO,YAAY,MAAM,MAAM;AAC7B,QAAI,EAAE,WAAW,GAAI,QAAO;AAE5B,QAAI,SADe,EAAE,cAAc,IACX,QAAO;IAE/B,MAAM,iBAAiB,KAAK,UAAU;AAEtC,QAAI,kBAAkB,GAAG;AACvB,SAAI,CAAC,eAAgB,QAAO;AAC5B,SAAI,CAAC,EAAE,SAAU,QAAO;AAGxB,SADiB,KAAK,MAAM,GAAG,GAAG,KACjB,EAAE,SAAU,QAAO;AAGpC,YAAO;;AAIT,WAAO;KACP;IACF;GACF;;AAGJ,MAAM,sBACJ,YACA,cACG;AAEH,KAAI,UAAU,WAAW,OAAQ,QAAO;CAExC,MAAM,gBAAgB,mCACpB,WAAW,KAAK,mBAAmB,IAAI,qBAAqB,GAC7D;CAED,MAAM,WAAW,WAAW,KAAK,mBAAmB,KACjD,MAAM,SAAS,EAAE,MAAM,CAAC,GAC1B;CAMD,MAAM,IAAI,aAJQ,cAAc,iBAAiB,YAAY,EAAE,EAAE,KAC9D,MAAM,EAAE,aACV,CAE8B;AAE/B,KAAI,CAAC,EAAG,QAAO;CAEf,MAAM,UAAU,QAAQ,EAAE,KAAK;AAG/B,KAAI,YAAY,EAAE,QAAQ,EAAE,iBAC1B,QAAO;AAGT,KAAI,EAAE,aAAa,CAAC,kBAAkB,EAAE,WAAW,UAAU,UAAU,CACrE,QAAO;AAIT,KAAI,CAAC,SAAS;AACZ,MAAI,UAAU,WAAW,eAAe;AACtC,OAAI,CAAC,EAAE,KAAM,QAAO;AACpB,OAAI,CAAC,aAAa,EAAE,MAAM,UAAU,UAAU,CAAE,QAAO;;AAGzD,MAAI,UAAU,WAAW,QAAQ;AAC/B,OAAI,CAAC,EAAE,gBAAiB,QAAO;AAC/B,OAAI,CAAC,kBAAkB,EAAE,iBAAiB,UAAU,UAAU,CAC5D,QAAO;;;AAIb,QAAO;;AAmBT,MAAa,uBAAuB,WAClC,OAAO,IAAI,aAAa;CAEtB,MAAM,EAAE,aAAa,iBADL,OAAOC;CAOvB,MAAM,MAJY,YAAY,QAAQ,OAAO;AAC3C,SAAO,mBAAmB,IAAI,OAAO,UAAU;GAC/C,CAEoB;AAEtB,KAAI,CAAC,IAAK,QAAO,OAAO,OAAO,KAAK,IAAI,yBAAyB,CAAC;CAElE,MAAM,cAAc,OAAOC;CAE3B,IAAI;AAEJ,KAAI,OAAO,UAAU,WAAW,OAC9B,WAAU,OAAO,UAAU;UAClB,OAAO,UAAU,WAAW,OACrC,WAAU,OAAO,UAAU;KAE3B,WAAU,OAAO,UAAU,QAAQ,IAAI,WAAW;CAGpD,MAAM,YAAY,mBAAmB,QAAQ;CAC7C,MAAM,QAAQ,SAAS,UAAU;CACjC,MAAM,eAAe,OAAO,YAAY,gBAAgB,EACtD,OAAO,WACR,CAAC;CACF,MAAM,mBAAmB,OAAO,YAAY,oBAAoB,EAC9D,OAAO,WACR,CAAC;CACF,MAAM,oBACJ,IAAI,KAAK,mBAAmB,MAAM,MAAM,EAAE,UAAU,UAAU,EAC1D,qBAAqB;AAe3B,QAbsB,OAAO,OAAO,cAClC,uBAAuB;EACrB,MAAM;EACN;EACA;EACA,QAAQ;EACR,mBAAmB,aAAa;EAChC,eAAe,aAAa;EAC5B;EACA,QAAQ,IAAI;EACb,CAAC,CACH;EAGD;;;ACrPJ,MAAa,uBAAuB,OAAO,OAAO;CAChD,SAAS,gBAAgB,SAAS,EAChC,aAAa,sCACd,CAAC;CACF,OAAO,eAAe,SAAS,EAC7B,aAAa,oCACd,CAAC;CACH,CAAC;AAEF,MAAa,uBAAuB,OAAO,OAAO;CAChD,gBAAgB,OAAO,OAAO;EAC5B,MAAM,OAAO,OAAO,SAAS,EAC3B,aAAa,4BACd,CAAC;EACF,QAAQ,OAAO,OAAO,SAAS,EAC7B,aAAa,8BACd,CAAC;EACF,UAAU,OAAO,OAAO,SAAS,EAC/B,aAAa,2CACd,CAAC;EACH,CAAC,CAAC,SAAS,EACV,aAAa,oCACd,CAAC;CACF,SAAS,OAAO,OAAO;EACrB,QAAQ,OAAO,OAAO,SAAS,EAC7B,aAAa,2BACd,CAAC;EACF,WAAW,OAAO,OAAO,SAAS,EAChC,aAAa,oCACd,CAAC;EACH,CAAC;CACH,CAAC;AAKF,MAAa,iBAAiB,KAAK,KAAK,eAAe;CACrD,cAAc,CAAC,YAAY,YAAY;CACvC,aAAa;CACb,SAAS;CACT,YAAY;CACZ,SAAS;CACV,CAAC;AAEF,MAAa,yBAAyB,WACpC,OAAO,IAAI,aAAa;CACtB,MAAM,mBAAmB,OAAO,oBAAoB,EAClD,WAAW;EACT,QAAQ;EACR,SAAS,SAAS,OAAO,MAAM,CAAC;EACjC,EACF,CAAC;CAEF,MAAM,MAAM,OAAO,OAAO,cACxB,WAAW,iBAAiB,QAAQ,EAClC,SAAS,OAAO,SACjB,CAAC,CACH;AAaD,QAXa;EACX,gBAAgB,iBAAiB,MAAM;EACvC,SAAS;GACP,QAAQ,IAAI,UAAU;GACtB,WAAW,YACT,KACA,iBAAiB,MAAM,eAAe,SACvC;GACF;EACF;EAGD;;;AC3EJ,MAAa,eAAe,QAAQ,KAAK,gBAAgB,eAAe;AACxE,MAAa,uBAAuB,aAAa,QAC/C,OAAO,QAAQ;CACb,oBAAoB;CACpB,aAAa;CACd,CAAC,CACH;;;ACHD,MAAa,yBAAyB,OAAO,OAAO;CAClD,OAAO,eAAe,SAAS,EAC7B,aAAa,qCACd,CAAC;CACF,iBAAiB,gBAAgB,SAAS,EACxC,aAAa,gDACd,CAAC;CACF,KAAK,OAAO,MAAM,OAAO,IAAI,CAAC,SAAS,EACrC,aAAa,mCACd,CAAC;CACF,cAAc,OAAO,OAAO,SAAS,EACnC,aAAa,oDACd,CAAC;CACF,MAAM,OAAO,MAAM,OAAO,IAAI,CAAC,SAAS,EACtC,aAAa,yCACd,CAAC;CACH,CAAC;AAIF,MAAa,mBAAmB,KAAK,KAAK,iBAAiB;CACzD,cAAc,CAAC,YAAY,YAAY;CACvC,aAAa;CACb,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,IAAI,SAAS,EAC3B,aAAa,qCACd,CAAC;CACH,CAAC;AAEF,MAAa,2BAA2B,WACtC,OAAO,IAAI,aAAa;CAGtB,MAAM,SAAS,OAAO,oBAAoB,EACxC,WAAW;EACT,QAAQ;EACR,SALU,SAAS,OAAO,MAAM,CAKjB;EAChB,EACF,CAAC;AAEF,cAAa,QAAQ;EACnB,SAAS,OAAO;EAChB,KAAK,OAAO;EACZ,cAAc,OAAO;EACrB,MAAM,OAAO;EACd,CAAC;AAWF,QATe,OAAO,OAAO,cAC3B,aAAa,QAAQ;EACnB,SAAS,OAAO;EAChB,KAAK,OAAO;EACZ,cAAc,OAAO;EACrB,MAAM,OAAO;EACd,CAAC,CACH;EAGD;;;AC9DJ,MAAa,YAAY,QAAQ,KAAK,iBAAiB;AACvD,MAAa,oBAAoB,UAAU,QACzC,OAAO,QAAQ,EACb,gBAAgB,WAAW,wBAAwB,OAAO,EAC3D,CAAC,CACH;;;ACND,MAAa,OAAO,OAAO,OAAO;CAChC,IAAI,gBAAgB,SAAS,EAC3B,aAAa,8BACd,CAAC;CACF,MAAM,IAAI,SAAS,EACjB,aAAa,kCACd,CAAC;CACF,OAAO,OAAO,SAAS,iBAAiB,CAAC,SAAS,EAChD,aAAa,mCACd,CAAC;CACH,CAAC;AAEF,MAAa,QAAQ,OAAO,OAAO;CACjC,SAAS,OAAO,IAAI,SAAS,EAC3B,aAAa,8CACd,CAAC;CACF,UAAU,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EAChD,aAAa,uDACd,CAAC;CACF,OAAO,OAAO,QAAQ,OAAO,MAAM,KAAK,CAAC;CAC1C,CAAC;AAEsC,OAAO,OAAO,EACpD,SAAS,OAAO,QAAQ,OAAO,MAAM,MAAM,CAAC,EAC7C,CAAC;;;AClBF,MAAa,+BAA+B;AAK5C,MAAa,yBAAyB,KAAK,KAAK,uBAAuB;CACrE,cAAc,CAAC,YAAY,YAAY;CACvC,aAAa;CACb,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,OAAO,SAAS,EAC9B,aAAa,sDACd,CAAC;CACH,CAAC;AAEF,MAAa,iCACX,WAEA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAmB,CACvB;EACE,SAAS,OAAO;EAChB,UAAU,OAAO;EACjB,OAAO,OAAO;EACf,CACF;CAED,MAAM,SAAS,OAAO,oBAAoB,EACxC,WAAW;EACT,QAAQ;EACR;EACD,EACF,CAAC;AASF,SAPiB,OAAO,OAAO,cAC7B,mBAAmB;EACjB,SAAS,CAAC,OAAO;EACjB;EACD,CAAC,CACH,EAEe,IAAI,QAAQ;EAC5B;;;ACzCJ,MAAa,2BAA2B,OAAO,OAAO;CACpD,OAAO,eAAe,SAAS,EAC7B,aAAa,qCACd,CAAC;CACF,SAAS,gBAAgB,SAAS,EAChC,aAAa,uCACd,CAAC;CACF,QAAQ,OAAO,OAAO,SAAS,EAC7B,aAAa,2CACd,CAAC;CACF,MAAM,OAAO,SAAS;EAAC;EAAO;EAAQ;EAAQ,CAAC;CAChD,CAAC;AAIF,MAAa,qBAAqB,KAAK,KAAK,mBAAmB;CAC7D,cAAc,CAAC,YAAY,YAAY;CACvC,aAAa;CACb,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,OAAO,SAAS,EAC9B,aAAa,wCACd,CAAC;CACH,CAAC;AAEF,MAAa,6BAA6B,WACxC,OAAO,IAAI,aAAa;CACtB,MAAM,iBAAiB;AACrB,MAAI,OAAO,SAAS,MAAO,QAAO;AAClC,MAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,SAAO;;CAGT,MAAM,SAAS,WAAW,OAAO,OAAO,UAAU,EAAE,UAAU,CAAC;CAG/D,MAAM,UAAmB,CACvB;EACE,SAJU,SAAS,OAAO,MAAM,CAIjB;EACf,OAAO,CACL;GACE,IAAI,OAAO;GACX,OAAO;GACP,MAAM;GACP,CACF;EACF,CACF;CAED,MAAM,SAAS,OAAO,oBAAoB,EACxC,WAAW;EACT,QAAQ;EACR;EACD,EACF,CAAC;AASF,SAPiB,OAAO,OAAO,cAC7B,mBAAmB;EACjB,SAAS,CAAC,OAAO;EACjB;EACD,CAAC,CACH,EAEe,IAAI,QAAQ;EAC5B;;;AC/DJ,MAAa,mBAAmB,QAAQ,KACtC,oBACA,uBACD;AACD,MAAa,2BAA2B,iBAAiB,QACvD,OAAO,QAAQ;CACb,kBAAkB,WAAW,0BAA0B,OAAO;CAC9D,sBAAsB,WAAW,8BAA8B,OAAO;CACvE,CAAC,CACH;;;ACXD,MAAM,UAAU,MAAM,cACpB,UAAU,gBAAgB,aAAa,CACxC,CAAC,KAAK,MAAM,aAAa,qBAAqB,CAAC;AAEhD,MAAM,WAAW,MAAM,cACrB,UAAU,gBAAgB,iBAAiB,CAC5C,CAAC,KAAK,MAAM,aAAa,yBAAyB,CAAC;AAEpD,MAAM,OAAO,MAAM,cAAc,UAAU,gBAAgB,UAAU,CAAC,CAAC,KACrE,MAAM,aAAa,kBAAkB,CACtC;AAED,MAAa,UAAU,MAAM,SAAS,SAAS,UAAU,KAAK;;;ACb9D,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAE3B,MAAM,YAAY,QAAQ,KACxB,MAAM,aACJ,UAAU,UAAU;CAClB,MAAM;CACN,MAAM;CACN,SAAS;CACV,CAAC,CACH,EACD,MAAM,aACJ,WAAW,KAAK;CACd,gBAAgB;EACd;EACA;EACA;EACA;EACD;CACD,gBAAgB;EAAC;EAAO;EAAQ;EAAO;EAAU;EAAS;EAAU;CACpE,gBAAgB,CAAC,IAAI;CACrB,aAAa;CACb,gBAAgB,CAAC,kBAAkB,uBAAuB;CAC3D,CAAC,CACH,CACF;AAED,MAAM,WAAW,QAAQ,KACvB,MAAM,aACJ,UAAU,WAAW;CACnB,MAAM;CACN,SAAS;CACV,CAAC,CACH,EACD,MAAM,QAAQ,UAAU,MAAM,EAC9B,MAAM,QAAQ,MAAM,QAAQ,OAAO,YAAY,CAAC,KAAK,CAAC,CACvD;AAED,MAAa,sBAAsB,SACjC,MAAM,OACJ,WAAW,MAAM,UAAU,CAAC,KAC1B,MAAM,aAAa,eAAe,MAAM,cAAc,EAAE,MAAM,CAAC,CAAC,CACjE,CACF;AAEH,MAAa,4BAA4B,MAAM,OAAO,SAAS;;;;ACrC/D,MAAM,uBACJ,YACsB;AACtB,SAAQ,SAAR;EACE,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,QACE,OAAM,IAAI,MAAM,8BAA8B;;;AAIpD,MAAM,6BACJ,cACuB;AACvB,KAAI,cAAc,QAAS,QAAOC,eAAmB;AACrD,KAAI,cAAc,eAAgB,QAAOA,eAAmB;AAC5D,KAAI,cAAc,YAAa,QAAOA,eAAmB;AACzD,KAAI,cAAc,wBAChB,QAAOA,eAAmB;AAC5B,KAAI,cAAc,qBAChB,QAAOA,eAAmB;AAC5B,KAAI,cAAc,YAAa,QAAOA,eAAmB;AACzD,KAAI,cAAc,SAAU,QAAOA,eAAmB;AACtD,KAAI,cAAc,cAAe,QAAOA,eAAmB;AAC3D,QAAOA,eAAmB;;AAG5B,MAAa,0BAA0B,WAA2B;CAChE,MAAM,WAAqB,EAAE;AAE7B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,SAAS,OACjB,UAAS,KAAK,aAAa,EAAE,CAAC,CAAC;UACtB,MAAM,SAAS,YACxB,UAAS,KAAK,kBAAkB,MAAM,CAAC;UAC9B,MAAM,SAAS,MACxB,UAAS,KAAK,YAAY,MAAM,CAAC;UACxB,MAAM,SAAS,aACxB,UAAS,KAAK,kBAAkB,MAAM,CAAC;UAC9B,MAAM,SAAS,mBACxB,UAAS,KAAK,wBAAwB,MAAM,CAAC;UACpC,MAAM,SAAS,OACxB,UAAS,KACP,aAAa;EACX,eAAe,oBAAoB,MAAM,cAAc;EACvD,aAAa,CAAC,MAAM,cAChB,KAAA,IACA,MAAM,YAAY,KAAK,MAAM;GAC3B,MAAM,kBAAkB;AACtB,QAAI,CAAC,EAAE,SAAU,QAAO,SAAS;AACjC,QAAI,EAAE,aAAa,OAAQ,QAAO,SAAS;AAC3C,QAAI,EAAE,aAAa,eACjB,QAAO,SAAS;AAClB,WAAO,SAAS;OACd;AAEJ,OAAI,SAAS,EACX,QAAO;IACL;IACA,QAAQ,EAAE;IACV,YAAY,EAAE;IACd,KAAK,EAAE;IACP,cAAc,EAAE;IAChB,UAAU,EAAE;IACZ,MAAM,CAAC,EAAE,OACL,KAAA,IACA,EAAE,KAAK,KAAK,MAAM;AAChB,SAAI,MAAM,KAAM,QAAO;KACvB,MAAM,IAAI,EAAE;AACZ,SAAI,MAAM,SACR,QAAO;MACL,WAAWA,eAAmB;MAC9B,OAAO,EAAE;MACV;AAGH,SAAI,MAAM,iBAAiB,WAAW,EACpC,QAAO;MACL,WAAWA,eAAmB;MAC9B,OAAO,EAAE;MACT,OAAO,EAAE;MACT,QAAQ,EAAE;MACX;AAGH,YAAO;MACL,WAAW,0BAA0B,EAAE;MAIvC,OAAO,EAAE;MACV;MACD;IACP;AAGH,UAAO;IACL;IACA,QAAQ,EAAE;IACV,UAAU,EAAE;IACZ,YAAY,EAAE;IACd,OAAO,EAAE,QACL,EAAE,MAAM,KAAK,MAAM;AACjB,YAAO;MACL,QAAQ,EAAE;MACV,QAAQ,EAAE;MACV,WAAW,0BAA0B,EAAE,UAAU;MAClD;MACD,GACF,KAAA;IACL;IACD;EACP,CAAC,CACH;KAED,OAAM,IAAI,MAAM,sBAAsB;AAI1C,QAAO;;;;;;;ACpCT,MAAa,sBAAsB,WAAW,QAC5C,qCACD;;;;AAKD,IAAa,2BAAb,cAA8C,KAAK,YACjD,0CACD,CAOE;;;;AAKH,MAAaC,UAAQ,MAAM,OACzB,qBACA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO;CAC7B,MAAM,kBAAkB,OAAO;CAC/B,MAAM,gBAAgB,OAAO;CAC7B,MAAM,cAAc,OAAO;CAE3B,MAAM,mBAAmB,WACvB,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,UAAU;GACzC,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,qBAAqB,OAAO,kBAChC,OAAO,eAAe,kBAAkB,CACzC,CAAC,IAAI,QAAQ;AAEd,SAAO;GACL,OAAO,IAAI;GACX,MAAM;GACN,MAAM,IAAI;GACX;GACD;CAEJ,MAAM,0BACJ,OAAO,IAAI,aAAa;EAGtB,MAAM,WAFM,OAAO,cAAc,mBAAmB,gBAAgB,EAEhD,KAAK,WACvB,OAAO,IAAI,aAAa;GACtB,MAAM,qBAAqB,OAAO,kBAChC,OAAO,eAAe,kBAAkB,CACzC,CAAC,OAAO,QAAQ;AAEjB,UAAO;IACL,OAAO,OAAO;IACd,MAAM;IACN,MAAM,OAAO;IACd;IACD,CACH;AAED,SAAO,OAAO,OAAO,IAAI,SAAS,EAAE,aAAa,aAAa,CAAC;GAC/D;CAEJ,MAAM,sBAAsB,WAC1B,OAAO,IAAI,aAAa;EACtB,MAAM,mBAAmB,OAAO,mBAAmB;EAEnD,MAAM,aAAa,OAAO,cAAc,cAAc;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,gBAAgB,OAAO,gBAAgB,YAAY,EACvD,OAAO,OAAO,YACf,CAAC;EAEF,MAAM,cAAc,OAAO,gBAAgB,UAAU;GACnD,OAAO,OAAO;GACd,UAAU,OAAO;GAClB,CAAC;EAGF,MAAM,eAAe,mBAAmB;GACtC,OAAO;GACP,WAAW,MAAM;GAClB,CAAC;EAEF,MAAM,oBAAoB;EAC1B,MAAM,gBAAgB;EACtB,MAAM,QAAQ,OAAO,OAAO,SAAS,EAAE;EACvC,MAAM,YAAY;EAoBlB,MAAM,aAlBM,OAAO,OAAO,WAAW;GACnC,WACE,oBAAoB;IAClB,MAAM;IACN,kBAAkB,MAAM;IACxB,OAAO;IACP,QAAQ;IACR,mBAAmB;IACnB;IACA,QAAQ;IACT,CAAC;GACJ,aACE,IAAI,yBAAyB;IAC3B,MAAM;IACN,SAAS,wDAAwD,cAAc,KAAK,QAAQ,cAAc,OAAO;IAClH,CAAC;GACL,CAAC,EAEoB,QAAQ;AAM9B,MAJe,iBAAiB,MAC7B,MAAM,EAAE,KAAK,wBAAwB,UACvC,CAGC,QAAO,OAAO,OAAO,KACnB,IAAI,yBAAyB;GAC3B,MAAM;GACN,SAAS,4BAA4B,cAAc,MAAM,cAAc,OAAO,MAAM;GACrF,CAAC,CACH;EAGH,MAAM,SAA4B;GAChC;GACA;GACA,YAAY,cAAc;GAC1B;GACA,qBAAqB;GACrB;GACD;EAED,MAAM,OAA8B;GAClC,MAAM;GACN,MAAM;GACN,OAAO,OAAO;GACf;EAED,MAAM,UAAU,OAAO,WAAW,kBAAkB,CAAC,OAAO;AAE5D,SAAO,cAAc,YAAY;GAC/B,OAAO,OAAO;GACd,SAAS,KAAK,UAAU,QAAQ;GAChC,MAAM;GACN,MAAM;GACP,CAAC;AAEF,SAAO;GACP;CAEJ,MAAM,sBAAsB,WAC1B,OAAO,IAAI,aAAa;EACtB,MAAM,gBAAgB,OAAO,mBAAmB;AAWhD,SATY,OAAO,cAAc,aAAa;GAC5C,SAAS,OAAO;GAChB,SAAS,cAAc,KAAK,OAAO;IACjC,OAAO,EAAE;IACT,OAAO;IACP,aAAa,EAAE,KAAK;IACrB,EAAE;GACJ,CAAC;GAGF;CAEJ,MAAM,sBAAsB,WAC1B,OAAO,IAAI,aAAa;EACtB,MAAM,KAAK,OAAO,gBAAgB,EAAE,OAAO,OAAO,OAAO,CAAC;AAE1D,SAAO,OAAO,cAAc,aAAa;GACvC,OAAO,GAAG;GACV,MAAM;GACP,CAAC;GACF;CAEJ,MAAM,yBAAyB,WAC7B,OAAO,IAAI,aAAa;EACtB,MAAM,KAAK,OAAO,gBAAgB,EAAE,OAAO,OAAO,OAAO,CAAC;EAE1D,MAAM,eAAgB,OAAO,YAAY,gBAAgB;GACvD,OAAO,OAAO;GACd,QAAQ,OAAO;GAChB,CAAC;EAEF,MAAM,OAAO,OAAO,OAAO,cACzB,aAAa,QAAQ,EACnB,SAAS,GAAG,KAAK,qBAClB,CAAC,CACH;AAED,SAAO,QAAQ,KAAK;GACpB;CAEJ,MAAM,sBAAsB,WAC1B,OAAO,IAAI,aAAa;EACtB,MAAM,EAAE,OAAO,GAAG,SAAS;EAC3B,MAAM,aAAa,OAAO,cAAc,cAAc;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,gBAAgB,OAAO,gBAAgB,YAAY,EACvD,OAAO,OAAO,YACf,CAAC;AAQF,OANoB,OAAO,mBAAmB,EAEnB,MACxB,MAAM,EAAE,KAAK,wBAAwB,KAAK,oBAC5C,CAGC,QAAO,OAAO,OAAO,KACnB,IAAI,yBAAyB;GAC3B,MAAM;GACN,SAAS,4BAA4B,cAAc,MAAM,gBAAgB,KAAK,oBAAoB;GACnG,CAAC,CACH;AAGH,SAAO,cAAc,YAAY;GAC/B,OAAO,OAAO;GACd,SAAS,KAAK,UAAU,OAAO,WAAW,kBAAkB,CAAC,KAAK,CAAC;GACnE,MAAM;GACN,MAAM;GACP,CAAC;AAEF,SAAO;GACL,OAAO,OAAO;GACd,MAAM;GACN,MAAM;GACP;GACD;AAEJ,QAAO,oBAAoB,GAAG;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;ACvQD,MAAa,oBAAoB,WAAW,QAC1C,mCACD;AAED,IAAa,yBAAb,cAA4C,KAAK,YAC/C,wCACD,CAOE;AAEH,MAAaC,UAAQ,MAAM,OACzB,mBACA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAO;CAC7B,MAAM,gBAAgB,OAAO;CAC7B,MAAM,kBAAkB,OAAO;CAC/B,MAAM,sBAAsB,OAAO;CACnC,MAAM,cAAc,OAAO;CAE3B,MAAMC,sBAAoB,WACxB,OAAO,IAAI,aAAa;AAMtB,MALe,OAAO,cAAc,kBAAkB;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC,CAGA,QAAO,OAAO,OAAO,KACnB,IAAI,uBAAuB;GACzB,MAAM;GACN,SAAS,yBAAyB,OAAO,MAAM;GAChD,CAAC,CACH;EAGH,MAAM,aAAa,OAAO,cAAc,cAAc;GACpD,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,KAAK,OAAO,oBAAoB,gBAAgB,EACpD,OAAO,OAAO,mBACf,CAAC;EAEF,MAAM,cAAc,OAAO,gBAAgB,UAAU;GACnD,OAAO,GAAG,KAAK;GACf,UAAU,OAAO;GAClB,CAAC;EACF,MAAM,WAAW,uBAAuB,OAAO,aAAa;EAE5D,MAAM,UAAU,OAAO,OAAO,IAC5B,OAAO,OAAO,KAAK,UAAU,YAAY,gBAAgB,EAAE,OAAO,CAAC,CAAC,EACpE,EAAE,aAAa,aAAa,CAC7B;EAED,MAAM,oBAAoB,oBAAoB;EAC9C,MAAM,oBAAoB,oBAAoB,kBAAkB;EAEhE,MAAM,MAAM,OAAO,OAAO,cACxBC,iBAAuB;GACrB,MAAM;GACN,aAAa;GACb;GACA;GACA,mBAAmB,GAAG,KAAK;GAC3B,eAAe,GAAG,KAAK;GACvB,OAAO,GAAG,KAAK;GACf,QAAQ;GACR;GACD,CAAC,CACH;EAGD,MAAM,UAAW,OAAO,OAAO,WAAW;GACxC,WACE,OAAO,eAAe,WAAW,kBAAkB,CAAC,CAAC,KACnD,OAAO,mBACR;GACH,aACE,IAAI,uBAAuB;IACzB,MAAM;IACN,SAAS;IACV,CAAC;GACL,CAAC;EAEF,MAAM,OAAmB;GACvB,gBAAgB;GAChB,oBAAoB,IAAI,mBAAmB,KAAK,OAAO;IACrD,OAAO,mBAAmB,EAAE,QAAQ;IACpC,mBAAmB,EAAE;IACtB,EAAE;GACH,mBAAmB,kBAAkB;GACrC,mBAAmB,GAAG;GACtB,GAAG;GACJ;AAED,SAAO,cAAc,YAAY;GAC/B,OAAO,OAAO;GACd,SAAS,KAAK,UAAU,KAAK;GAC7B,MAAM;GACN,MAAM;GACP,CAAC;AAEF,SAAO;GACL,OAAO,OAAO;GACd;GACA,MAAM;GACP;GACD;CAEJ,MAAM,iBAAiB,WACrB,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,UAAU;GACzC,OAAO,OAAO;GACd,MAAM;GACP,CAAC;EAEF,MAAM,SAAS,OAAO,oBACpB,OAAO,eAAe,WAAW,CAClC,CAAC,IAAI,QAAQ;AAEd,MAAI,OAAO,SAAS,OAClB,QAAO,OAAO,OAAO,KACnB,IAAI,uBAAuB;GACzB,MAAM;GACN,SAAS;GACV,CAAC,CACH;AASH,SAN6B;GAC3B,OAAO,IAAI;GACX,MAAM,OAAO;GACb,MAAM,IAAI;GACX;GAGD;CAEJ,MAAM,mBAAmB,WACvB,OAAO,IAAI,aAAa;EAGtB,MAAM,WAFM,OAAO,cAAc,mBAAmB,cAAc,EAE9C,KAAK,WACvB,OAAO,IAAI,aAAa;GACtB,MAAM,SAAS,OAAO,oBACpB,OAAO,eAAe,WAAW,CAClC,CAAC,OAAO,QAAQ;AAEjB,OAAI,OAAO,SAAS,OAClB,QAAO,OAAO,OAAO,KACnB,IAAI,uBAAuB;IACzB,MAAM;IACN,SAAS;IACV,CAAC,CACH;AASH,UAN6B;IAC3B,OAAO,OAAO;IACd,MAAM,OAAO;IACb,MAAM,OAAO;IACd;IAGD,CACH;EAED,MAAM,UAAU,OAAO,OAAO,IAAI,SAAS,EACzC,aAAa,aACd,CAAC;AAIF,MAAI,OAAO,aACT,QAAO,QAAQ,QACZ,MAAM,EAAE,KAAK,sBAAsB,OAAO,aAC5C;AAGH,SAAO;GACP;CAEJ,MAAM,oBAAoB,WACxB,OAAO,IAAI,aAAa;EACtB,MAAM,cAAc,OAAO,gBAAgB,EAAE,CAAC;AAW9C,SATY,OAAO,cAAc,aAAa;GAC5C,SAAS,OAAO;GAChB,SAAS,YAAY,KAAK,QAAQ;IAChC,OAAO,GAAG;IACV,OAAO;IACP,aAAa,GAAG,GAAG,KAAK,mBAAmB,UAAU,GAAG,KAAK,oBAAoB,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,kBAAkB;IACpI,EAAE;GACJ,CAAC;GAGF;CAEJ,MAAM,uBAAuB,WAC3B,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,cAAc,EAAE,OAAO,OAAO,OAAO,CAAC;EAChE,MAAM,KAAK,OAAO,oBAAoB,gBAAgB,EACpD,OAAO,WAAW,KAAK,mBACxB,CAAC;EAEF,MAAM,eAAe,OAAO,YAAY,gBAAgB;GACtD,OAAO,OAAO;GACd,QAAQ,OAAO;GAChB,CAAC;AAEF,MAAI,WAAW,KAAK,mBAAmB,QACrC,QAAO,OAAO,OAAO,KACnB,IAAI,uBAAuB;GACzB,MAAM;GACN,SAAS;GACV,CAAC,CACH;EAEH,MAAM,oBAAoB,WAAW,KAAK;AAW1C,SATY,OAAO,OAAO,WAAW;GACnC,WACE,sBAAsB,cAAc;IAClC,gBAAgB,GAAG,KAAK;IACxB;IACD,CAAC;GACJ,aAAa;GACd,CAAC,CAAC,KAAK,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,CAAC;GAGlD;CAEJ,MAAM,0BAA0B,WAI9B,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,gBAAgB,EACrC,cAAc,OAAO,cACtB,CAAC;AAYF,SAVY,OAAO,cAAc,kBAAkB;GACjD,SAAS,OAAO;GAChB,SAAS,QAAQ,KAAK,OAAO;IAC3B,OAAO,EAAE;IACT,OAAO;IACP,aAAa,GAAG,EAAE,KAAK,mBAAmB,UAAU,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,kBAAkB;IAChI,EAAE;GACH,KAAK;GACN,CAAC;GAGF;CAEJ,MAAM,yBAAyB,WAI7B,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,EAAE,OAAO,OAAO,OAAO,CAAC;AAuBzD,SArBiB,OAAO,cAAc,eAAe;GACnD,SAAS,OAAO;GAChB,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,QAAI,EAAE,MAAM,KAAK,GACf,QAAO,OAAO,OAAO,KAAK,2BAA2B;AAGvD,WAAO,OAAO,WAAW;KACvB,WAAW,OAAO,OAAO,IAAI,MAAM,EAAE;KACrC,aACE,IAAI,uBAAuB;MACzB,MAAM;MACN,SAAS,oCAAoC,OAAO;MACrD,CAAC;KACL,CAAC,CAAC,KAAK,OAAO,YAAY,OAAO,KAAK,mBAAmB,CAAC,CAAC;AAE5D,WAAO;KACP;GACL,CAAC;GAGF;CAEJ,MAAM,uBAAuB,WAC3B,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,EAAE,OAAO,OAAO,OAAO,CAAC;EAEzD,MAAM,SAAS,OAAO,OAAO,WAAW;GACtC,KAAK,YAAY;AAEf,WAAO,oBACL,OAFa,MAAM,OAAO,OAAO,IAAI,MAAM,OAAO,SAAS,EAE9C,eAAe,CAAC,CAC9B;;GAEH,aACE,IAAI,uBAAuB;IACzB,MAAM;IACN,SAAS,oCAAoC,OAAO;IACrD,CAAC;GACL,CAAC;AAEF,SAAO;GAAE,GAAG;GAAK;GAAQ;GACzB;CAEJ,MAAM,oBAAoB,WACxB,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,cAAc,EAAE,OAAO,OAAO,OAAO,CAAC;AAEzD,SAAO,OAAO,cAAc,aAAa;GACvC,OAAO,IAAI;GACX,MAAM;GACP,CAAC;GACF;AAEJ,QAAO,kBAAkB,GAAG;EAC1B,kBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;EACF,CACH;;;AC1ZD,MAAa,aAAa,WAAW,QACnC,4BACD;AAED,MAAaC,UAAQ,MAAM,OACzB,YACA,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAO;CACnC,MAAM,oBAAoB,OAAO;CAEjC,MAAM,kBAAkB,WACtB,OAAO,IAAI,aAAa;EACtB,MAAM,KAAK,OAAO,oBAAoB,gBAAgB,EACpD,OAAO,OAAO,mBACf,CAAC;EAEF,MAAM,cAAc,OAAO,QAAQ,OAAO,YAAY;EAEtD,MAAM,yBAAyB,OAAO,OAAO,IAC3C,YAAY,KAAK,CAAC,OAAO,cACvB,kBAAkB,oBAAoB;GACpC;GACA;GACD,CAAC,CACH,CACF;EAED,MAAM,UAAU,WAAW,GAAG;GAC5B,cAAc,GAAG;GACjB,aAAa;GACd,CAAC;AAEF,MAAI,OAAO,cAAc,QACvB,QAAO,qBAAqB,CAAC,KAC3B,OAAO,eAAe,YAAY,QAAQ,CAC3C;MAED,QAAO,mBAAmB,OAAO,QAAQ,KAAK,CAAC,KAC7C,OAAO,eAAe,YAAY,QAAQ,CAC3C;GAEH;AACJ,QAAO,WAAW,GAAG,EAAE,gBAAgB,CAAC;EACxC,CACH;;;;AChED,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,QAAQ;AACd,MAAM,OAAO;;;;AAKb,MAAM,iBAAiB,QAA6B;AAClD,QAAO,OAAO,YACZ,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CACvD;;;;;AAMH,MAAM,aAAa,QACjB,IACG,QAAQ,SAAS,IAAI,CACrB,QAAQ,mBAAmB,QAAQ,CACnC,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC;;;;AAK7C,MAAM,eAAe,UAAuB;AAC1C,KAAI,UAAU,KAAM,QAAO;AAE3B,KAAI,OAAO,UAAU,SACnB,QAAO,GAAG,MAAM;AAGlB,KAAI,iBAAiB,KACnB,QAAO,MAAM,aAAa;AAG5B,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QAAO,OAAO,MAAM;AAGtB,QAAO,OAAO,MAAM;;;;;AAMtB,MAAM,eAAe,MACnB,MAAM,QAAQ,OAAO,MAAM,YAAY,aAAa;;;;AAKtD,MAAM,qBAAqB,QACzB,IAAI,SAAS,KACb,IAAI,OACD,SACC,QACA,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,KAAK,IACpB,OAAO,OAAO,KAAK,CAAC,MAAM,YAAY,CACzC;;;;;;;AAQH,MAAa,gBACX,OACA,QAAQ,GACR,SAAS,SACE;CAEX,MAAM,SAAS;CACf,MAAM,WAAW;CACjB,MAAM,QAAQ,IAAI,OAAO,SAAS,MAAM;AAExC,KAAI,QAAQ,SAAU,QAAO,GAAG,MAAM;AAEtC,KAAI,UAAU,MAAM,QAAQ,MAAM,IAAI,kBAAkB,MAAM,EAAE;EAC9D,MAAM,cAAc,MAAM,IAAI,cAAc;AAC5C,UAAQ,MAAM,YAAY;AAC1B,SAAO;;AAIT,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MACJ,KAAK,MAAM,MAAM;AAChB,MAAI,YAAY,KAAK,CACnB,QAAO,GAAG,QAAQ,YAAY,KAAK;AAGrC,SAAO,GAAG,MAAM,GAAG,EAAE,KAAK,aAAa,MAAM,QAAQ,GAAG,MAAM;GAC9D,CACD,KAAK,KAAK;AAIf,QAAO,OAAO,QAAQ,MAAM,CACzB,KAAK,CAAC,KAAK,WAAW;EAErB,MAAM,IACF,GAAG,OAFO,UAAU,QAAQ,UAAU,UAEpB,UAAU,IAAI,GAAG;AAGvC,MAAI,YAAY,MAAM,CACpB,QAAO,GAAG,QAAQ,EAAE,IAAI,YAAY,MAAM;AAG5C,SAAO,GAAG,QAAQ,EAAE,KAAK,aAAa,OAAO,QAAQ,GAAG,MAAM;GAC9D,CACD,KAAK,KAAK;;;;;;;ACrGf,MAAa,kBAAkB,WAAW,QACxC,iCACD;;;;AAKD,MAAa,QAAQ,MAAM,QACzB,iBACA,gBAAgB,GAAG,EACjB,SAAS,MAAM,WACb,OAAO,IAAI,aAAa;AACtB,KAAI,WAAW,SACb,QAAO,aAAa,KAAK;AAE3B,KAAI,WAAW,OACb,QAAO,KAAK,UAAU,MAAM,MAAM,EAAE;AAGtC,KAAI,MAAM,QAAQ,KAAK,CACrB,QAAO,OAAO,UAAU,KAAK;AAG/B,QAAO,OAAO,UAAU,CAAC,KAAK,CAAC;EAC/B,EACL,CAAC,CACH;;;AC3CD,MAAM,yBACJ,WACA,iBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,qBAAqB,CAC5C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,cAAc,YAAY;GACvC,WAAW;GACX,SAAS;GACT,MAAM;GACP,CAAC;AAGJ,MAAI,aAAa,SAAS,OACxB,YAAW,aAAa;MAExB,YAAW,OAAO,cAAc,eAAe,EAC7C,SAAS,gCACV,CAAC;AAGJ,WAAS;GAAE;GAAO,UAAU,SAAS,MAAM,SAAS;GAAE;;CAGxD,MAAM,MAAM,OAAO,gBAAgB,eAAe,OAAO;CAEzD,MAAM,OAAO;EACX,SAAS,IAAI,KAAK;EAClB,OAAO,IAAI;EACX,MAAM,IAAI;EACX;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,WAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,sCAAsC,EAC3D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAMC,aAAW,KAAK,SAAS,WAAW,CAAC,KACzC,KAAK,gBAAgB,4CAA4C,EACjE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,wBAAwB,QAAQ,KAC3C,UACA;CAAE,OAAA;CAAO,UAAA;CAAU,GAClB,EAAE,OAAO,eAAe,sBAAsB,OAAO,SAAS,CAChE,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,qDAAqD,EAC7E,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACjGD,MAAMC,cACJ,WACA,iBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,sBAAsB,CAC7C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,gBAAgB,eAAe,EAChD,SAAS,oBACV,CAAC,EACU;AAGd,MAAI,aAAa,SAAS,OACxB,YAAW,aAAa;MAExB,YAAW,OAAO,cAAc,eAAe,EAC7C,SAAS,gCACV,CAAC;AAGJ,WAAS;GAAE;GAAO,UAAU,SAAS,MAAM,SAAS;GAAE;;CAGxD,MAAM,MAAM,OAAO,gBAAgB,gBAAgB,OAAO;CAE1D,MAAM,OAAO;EACX,OAAO,IAAI;EACX,SAAS,IAAI;EACb,WAAW,IAAI;EACf,YAAY,SAAS,MAAM,IAAI,WAAW;EAC3C;AAED,KAAI,YAAY,MAAO;CACvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,WAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,uCAAuC,EAC5D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAMC,aAAW,KAAK,SAAS,WAAW,CAAC,KACzC,KAAK,gBAAgB,4CAA4C,EACjE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,yBAAyB,QAAQ,KAC5C,WACA;CAAE,OAAA;CAAO,UAAA;CAAU,GAClB,EAAE,OAAO,eAAeL,WAAQ,OAAO,SAAS,CAClD,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,4CAA4C,EACpE,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AChGD,MAAMM,cACJ,WACA,cACA,mBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,qBAAqB,CAC5C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAOlB,SALY,OAAO,cAAc,YAAY;GAC3C,WAAW;GACX,SAAS;GACT,MAAM;GACP,CAAC;AAIJ,MAAI,aAAa,SAAS,OACxB,YAAW,aAAa;MAExB,YAAW,OAAO,cAAc,eAAe,EAC7C,SAAS,gCACV,CAAC;AAGJ,MAAI,eAAe,SAAS,OAC1B,cAAa,eAAe;MAE5B,cAAa,OAAO,cAAc,UAAU;GAC1C,UAAU;GACV,QAAQ;GACR,SAAS;GACV,CAAC;AAGJ,WAAS;GACP;GACA,UAAU,SAAS,MAAM,SAAS;GAClC,YAAY,SAAS,MAAM,WAAW;GACvC;;CAGH,MAAM,MAAM,OAAO,gBAAgB,eAAe,OAAO;CAEzD,MAAM,OAAO;EACX,OAAO,IAAI;EACX,SAAS,IAAI,KAAK;EAClB,MAAM,IAAI;EACX;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,WAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,sCAAsC,EAC3D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAM,aAAa,KAAK,SAAS,cAAc,CAAC,KAC9C,KAAK,gBAAgB,4CAA4C,EACjE,KAAK,SACN;AAED,MAAM,WAAW,KAAK,SAAS,WAAW,CAAC,KACzC,KAAK,gBAAgB,4CAA4C,EACjE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,wBAAwB,QAAQ,KAC3C,UACA;CAAE,OAAA;CAAO;CAAY;CAAU,GAC9B,EAAE,OAAO,UAAU,iBAAiBJ,WAAQ,OAAO,UAAU,WAAW,CAC1E,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,uCAAuC,EAC/D,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACxHD,MAAM,0BAA0B,cAC9B,OAAO,IAAI,aAAa;CACtB,MAAM,kBAAkB,OAAOK;CAC/B,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,kBAAkB,CACzC,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,gBAAgB,eAAe,EAChD,SAAS,oBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;CAGpB,MAAM,MAAM,OAAO,gBAAgB,YAAY,OAAO;CAEtD,MAAM,OAAO;EACX,OAAO,IAAI;EACX,SAAS,IAAI,KAAK;EAClB,MAAM,IAAI;EACX;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,wCAAwC,EAC7D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,yBAAyB,QAAQ,KAC5C,QACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAY,uBAAuB,MAAM,CAC7C,CAAC,KACA,QAAQ,gBAAgB,mCAAmC,EAC3D,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AChFD,MAAM,4BACJ,OAAO,IAAI,aAAa;CACtB,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAI3C,MAAM,QAFM,OAAO,gBAAgB,eAAe,EAEjC,KAAK,OAAO;EAC3B,OAAO,EAAE;EACT,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE;EACT,EAAE;AAEH,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;;;;AAKJ,MAAa,uBAAuB,QAAQ,KAAK,QAAQ,EAAE,QACzD,qBAAqB,CACtB,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,qBAAqB,EAC7C,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AC7CD,MAAMC,cAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,qBAAqB,CAC5C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,gBAAgB,eAAe,EAChD,SAAS,oBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;AAGpB,QAAO,gBAAgB,eAAe,OAAO;CAE7C,MAAM,OAAO,EAAE,SAAS,MAAM;AAE9B,KAAI,YAAY,MAAO;CACvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,sCAAsC,EAC3D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAa,wBAAwB,QAAQ,KAC3C,UACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAYH,WAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,oBAAoB,EAC5C,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;;;;AC7DD,MAAa,mBAAmB,QAAQ,KACtC,YACA,EAAE,QACI,OAAO,KACd,CAAC,KACA,QAAQ,gBAAgB,iCAAiC,EACzD,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,CACH;;;ACrBD,MAAaI,cACX,kBACA,iBACA,eACA,aAEA,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOC;CACnC,MAAM,oBAAoB,OAAOC;CACjC,MAAM,aAAa,OAAOC;CAC1B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,qBAAqB,CAC5C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI,cAAsC,EAAE;EAC5C,IAAI;EACJ,IAAI;AAEJ,MAAI,iBAAiB,SAAS,OAC5B,qBAAoB,iBAAiB;MAErC,sBAAqB,OAAO,oBAAoB,mBAAmB,EACjE,SAAS,kDACV,CAAC,EAAE;AAGN,MAAI,gBAAgB,SAAS,OAC3B,eAAc,gBAAgB;OACzB;GACL,MAAM,OAAO,OAAO,kBAAkB,uBAAuB;IAC3D,SAAS;IACT,cAAc;IACf,CAAC;AAEF,QAAK,MAAM,OAAO,MAAM;IACtB,MAAM,OAAO,OAAO,kBAAkB,sBAAsB;KAC1D,OAAO,IAAI;KACX,SAAS,kCAAkC,IAAI,MAAM;KACtD,CAAC;AACF,gBAAY,IAAI,SAAS,SAAS,MAAM,KAAK;;;AAIjD,MAAI,cAAc,SAAS,OACzB,aAAY,cAAc;MAE1B,aAAY;AAGd,MAAI,SAAS,SAAS,OACpB,QAAO,SAAS;MAEhB,QAAO;AAGT,WAAS;GAAE;GAAmB;GAAa;GAAW;GAAM;;AAG9D,QAAO,WAAW,eAAe,OAAO;EACxC;AAEJ,MAAM,eAAe,KAAK,OAAO,gBAAgB,CAAC,KAChD,KAAK,UAAU,KAAK,EACpB,KAAK,UACL,KAAK,gBAAgB,oDAAoD,CAC1E;AAED,MAAM,cAAc,KAAK,aAAa,cAAc,CAAC,KACnD,KAAK,UAAU,KAAK,EACpB,KAAK,UACL,KAAK,gBACH,oEACD,CACF;AAED,MAAM,YAAY,KAAK,OAAO,aAAa,CAAC,SAAS,OAAO,CAAC,CAAC,KAC5D,KAAK,UAAU,IAAI,EACnB,KAAK,UACL,KAAK,gBAAgB,0CAA0C,CAChE;AAED,MAAM,OAAO,KAAK,QAAQ,OAAO,CAAC,KAChC,KAAK,UAAU,IAAI,EACnB,KAAK,UACL,KAAK,gBACH,+DACD,CACF;AAED,MAAa,kBAAkB,QAAQ,KACrC,SACA;CAAE;CAAc;CAAa;CAAW;CAAM,GAC7C,EAAE,cAAc,aAAa,WAAW,WACvCH,WAAQ,cAAc,aAAa,WAAW,KAAK,CACtD,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,+BAA+B,EACvD,QAAQ,aAAa;CACnB;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACjID,MAAa,cAAc,QAAQ,KAAK,OAAO,EAAE,QAAQ,OAAO,KAAK,CAAC,KACpE,QAAQ,gBAAgB,yCAAyC,EACjE,QAAQ,gBAAgB,CAAC,gBAAgB,CAAC,CAC3C;;;;;;;;;;ACGD,MAAa,aAIX,KACA,SACQ;AACR,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI;;;;;;;;AAS5D,MAAa,gBACX,KACA,SAAS,OACU;AACnB,QAAO,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW;EACnD,MAAM,UAAU,SAAS,GAAG,OAAO,GAAG,QAAQ;AAE9C,MAAI,OAAO,SAAS,MAAM,CACxB,QAAO,CAAC,QAAQ;AAGlB,MAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,aAAa,OAAO,QAAQ;AAGrC,SAAO,EAAE;GACT;;;;;;;AClCJ,MAAM,UAAU;CACd,UAAU;EACR,QAAQI;EACR,SAASC;EACT,MAAMC;EACN,MAAMC;EACN,QAAQC;EACR,QAAQC;EACT;CACD,iBAAiB;EACf,QAAQC;EACR,MAAMC;EACN,MAAMC;EACN,QAAQC;EACR,QAAQC;EACR,QAAQC;EACT;CACD,eAAe;EACb,QAAQC;EACR,MAAMC;EACN,MAAMC;EACN,QAAQC;EACR,QAAQC;EACT;CACD,KAAK,EACH,OAAOC,sBACR;CACF;AAED,MAAMC,aAAW,aAAa,QAAQ;AACtC,MAAMC,YAAU,SAAS,OAAO,WAAWD,WAAS,CAAC,KACnD,SAAS,gBAAgB,oCAAoC,CAC9D;;;;AAKD,MAAa,gBAAgB,QAAQ,KACnC,UACA,EAAE,SAAA,WAAS,GACV,EAAE,cACD,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,UAAU,SAAS,QAAQ;CAC1C,MAAM,OAAO,OAAO,qBAAqB,OAAO;AAEhD,QAAO,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;EACjD,CACL,CAAC,KAAK,QAAQ,gBAAgB,+BAA+B,CAAC;;;ACnD/D,MAAM,gBAAgB;CACpB;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACD;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACD;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACD;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACD;EACE,aACE;EACF,OAAO;EACP,OAAO;EACR;CACD;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACD;EACE,aAAa;EACb,OAAO;EACP,OAAO;EACR;CACF;AAED,MAAa,sBAAsB,iBACjC,OAAO,IAAI,aAAa;CAEtB,MAAM,UAAU,cAAc,QAC3B,MAAM,CAAC,aAAa,MAAM,MAAM,EAAE,SAAS,EAAE,MAAM,CACrD;AAOD,QAAO,OALQ,OAAO,OAAO;EAC3B;EACA,SAAS;EACV,CAAC;EAGF;;;ACpDJ,MAAa,iBAAiB,YAC5B,OAAO,KAAK;CACV;CACA,WAAW,UACT,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,OAAO,oBAAoB,gBAAgB,CAAC,MAAM;AAC9D,MAAI,OAAO,OAAO,IAAI,CACpB,QAAO,OAAO,OAAO,KAAK,2BAA2B;AACvD,SAAO;GACP;CACL,CAAC;AAEJ,MAAa,eAAe,YAC1B,OAAO,KAAK;CACV;CACA,WAAW,QACT,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO,iBAAiB,MACrC,OAAO,uBAAuB,EAAE,CACjC;EACD,MAAM,MAAM,OAAO,aAAa,OAAO,CAAC,IAAI;AAC5C,MAAI,OAAO,OAAO,IAAI,CAAE,QAAO,OAAO,OAAO,KAAK,iBAAiB;AACnE,SAAO,IAAI,MAAM,UAAU;GAC3B;CACL,CAAC;;;ACRJ,MAAM,yBACJ,OAAO,IAAI,aAAa;AAOtB,QAAO,CACL;EACE,QARW,OAAO,cAAc,wBAAwB;EASxD,YALa,WAHE,OAAO,YACxB,oDACD,EACuC,MAAM;EAM3C,CACF;EACD;AAEJ,MAAM,mCACJ,OAAO,IAAI,aAAa;CACtB,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,UAAU,OAAO,cAAc,gCAAgC;CACrE,MAAM,WAAW,OAAO,YACtB,mDACD;CAID,MAAM,cAAc,OAAO,OAAO,KAAK,EACrC,SAAS,8CACV,CAAC;CAEF,MAAM,YAAY,OAAO,GAAG,eAAe,YAAY,CAAC,KAAK,OAAO,MAAM;CAG1E,MAAM,YAFM,KAAK,MAAM,UAAU,CAEX,QAAQ,MAAM,EAAE,SAAS,WAAW;CAE1D,MAAM,mBAAmB,OAAO,OAAO,YAAY;EACjD,SAAS,UAAU,KAAK,MAAM;GAC5B,IAAI,YAAY,GAAG,EAAE,KAAK;AAC1B,QAAK,IAAI,IAAI,GAAG,IAAI,EAAE,OAAO,QAAQ,KAAK;IACxC,MAAM,MACJ,EAAE,OAAO,WAAW,KAAK,MAAM,EAAE,OAAO,SAAS,IAAI,KAAK;IAE5D,MAAM,QAAQ,EAAE,OAAO;AACvB,iBAAa,GAAG,MAAM,OAAO,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;;AAEpE,gBAAa;AACb,UAAO;IACL,aAAa;IACb,OAAO,EAAE;IACT,OAAO;IACR;IACD;EACF,SAAS;EACT,KAAK;EACN,CAAC;CAEF,MAAM,WAAW,WAAW,SAAS;AAYrC,QAViC,iBAAiB,KAAK,MAAM;AAC3D,SAAO;GACL,KAAK,CAAC,EAAE;GACR,cAAc,EAAE;GAChB,UAAU,mBAAmB,EAAE;GAC/B,QAAQ;GACR,YAAY;GACb;GACD;EAGF;AAEJ,MAAM,uBACJ,OAAO,IAAI,aAAa;CACtB,MAAM,cAA4B,EAAE;CAEpC,MAAM,sBAAsB,OAAO,OAAO;EACxC,SAAS,CACP;GACE,OAAO;GACP,OAAO;GACR,EACD;GACE,OAAO;GACP,OAAO;GACR,CACF;EACD,SAAS;EACV,CAAC;AAEF,QAAO,MAAM;AACX,MAAI,YAAY,SAAS;OAInB,EAHY,OAAO,OAAO,QAAQ,EACpC,SAAS,+CACV,CAAC,EACY;;AAKhB,OAFsB,OAAO,yBAEP,OAAO;GAC3B,MAAM,MAAM,OAAO,kBAAkB;AACrC,eAAY,KAAK,GAAG,IAAI;SACnB;GACL,MAAM,MAAM,OAAO,4BAA4B;AAC/C,eAAY,KAAK,GAAG,IAAI;;;AAI5B,QAAO;EACP;AAEJ,MAAa,sBAIT,OAAO,IAAI,aAAa;AAG1B,QAAO;EACL,aAHkB,OAAO,gBAAgB;EAIzC,eAAe;EACf,MAAM;EACP;EACD;;;ACxIF,MAAa,qBAAqB,OAAO,IAAI,aAAa;CACxD,MAAM,UAAU,OAAO,YACrB,6CACD;CAED,MAAM,mBAAmB,OAAO,OAAO,QAAQ,EAC7C,SAAS,4CACV,CAAC;AAIF,QAAO;EACL,QAHe,WAAW,QAAQ;EAIlC,MAAM;EACN;EACD;EACD;;;;AClBF,MAAa,2BAA2B,OAAO,IAAI,aAAa;CAC9D,MAAM,WAAW,OAAO,OAAO,KAAK;EAClC,SACE;EACF,WAAW,MACT,OAAO,IAAI,aAAa;AAEtB,OADc,SAAS,UAAU,EAAS,CAChC,SAAS,OACjB,QAAO,OAAO,OAAO,KAAK,mBAAmB;AAG/C,UAAO;IACP;EACL,CAAC;CAEF,MAAM,mBAAmB,SAAS,gBAAgB,SAAgB;CAElE,MAAM,QAAQ,OAAO,OAAO,QAAQ;EAClC,SAAS;EACT,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,OAAI,IAAI,EAAG,QAAO,OAAO,OAAO,KAAK,+BAA+B;AACpE,UAAO;IACP;EACL,CAAC;CAEF,MAAM,UAAU,OAAO,OAAO,KAAK;EACjC,yBAAS,IAAI,MAAM;EACnB,SAAS;EACT,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,OAAI,oBAAI,IAAI,MAAM,CAChB,QAAO,OAAO,OAAO,KAAK,6BAA6B;AACzD,UAAO;IACP;EACL,CAAC;AAEF,QAAO;EACL,MAAM;EACN;EACA,UAAU,SAAS,SAAS,iBAAiB;EAC7C,SAAS,KAAK,MAAM,QAAQ,SAAS,GAAG,IAAK;EAC9C;EACD;;;AC5CF,MAAa,iCAAiC,OAAO,IAAI,aAAa;AAwBpE,QAAO;EACL,MAAM;EACN,iBAzBc,OAAO,OAAO,KAAK;GACjC,SAAS;GACT,WAAW,MACT,OAAO,IAAI,aAAa;IACtB,MAAM,UAAU,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;AAEjD,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;KACvC,MAAM,IAAI,QAAQ;AAElB,SADY,OAAO,oBAAoB,gBAAgB,CAAC,EAAE,CAClD,SAAS,OACf,QAAO,OAAO,OAAO,KAAK,qCAAqC,IAAI;;AAIvE,WAAO;KACP;GACL,CAAC,EAGC,MAAM,IAAI,CACV,KAAK,MAAM,EAAE,MAAM,CAAC,CACpB,KAAK,MAAM,OAAO,kBAAkB,gBAAgB,CAAC,EAAE,CAAC;EAK1D;EACD;;;AC5BF,MAAa,2BAA2B,OAAO,IAAI,aAAa;CAC9D,MAAM,aAAa,OAAO,OAAO,KAAK;EACpC,yBAAS,IAAI,MAAM;EACnB,SAAS;EACT,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,OAAI,oBAAI,IAAI,MAAM,CAChB,QAAO,OAAO,OAAO,KAAK,6BAA6B;AACzD,UAAO;IACP;EACL,CAAC;CAEF,MAAM,aAAa,OAAO,OAAO,KAAK;EACpC,yBAAS,IAAI,MAAM;EACnB,SAAS;EACT,WAAW,MACT,OAAO,IAAI,aAAa;AACtB,OAAI,oBAAI,IAAI,MAAM,CAChB,QAAO,OAAO,OAAO,KAAK,6BAA6B;AACzD,OAAI,IAAI,WACN,QAAO,OAAO,OAAO,KAAK,wCAAwC;AACpE,UAAO;IACP;EACL,CAAC;AAEF,QAAO;EACL,MAAM;EACN,YAAY,KAAK,MAAM,WAAW,SAAS,GAAG,IAAK;EACnD,YAAY,KAAK,MAAM,WAAW,SAAS,GAAG,IAAK;EACpD;EACD;;;ACvBF,MAAa,4BAEX,OAAO,IAAI,aAAa;CACtB,MAAM,eAA+B,EAAE;AAEvC,QAAO,MAAM;AACX,MAAI,aAAa,SAAS;OAIpB,EAHY,OAAO,OAAO,QAAQ,EACpC,SAAS,sCACV,CAAC,EACY;;EAGhB,MAAM,aAAa,OAAO,mBAAmB,aAAa;AAE1D,MAAI,eAAe,QAAQ;AACzB,gBAAa,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEnC;;AAGF,MAAI,eAAe,aAAa;GAC9B,MAAM,MAAM,OAAO;AACnB,gBAAa,KAAK,IAAI;aACb,eAAe,QAAQ;GAChC,MAAM,MAAM,OAAO;AACnB,gBAAa,KAAK,IAAI;aACb,eAAe,OAAO;GAC/B,MAAM,MAAM,OAAO;AACnB,gBAAa,KAAK,IAAI;aACb,eAAe,cAAc;GACtC,MAAM,MAAM,OAAO;AACnB,gBAAa,KAAK,IAAI;aACb,eAAe,oBAAoB;GAC5C,MAAM,MAAM,OAAO;AACnB,gBAAa,KAAK,IAAI;QAEtB;;AAIJ,QAAO;EACP;;;ACtCJ,MAAME,cACJ,WACA,uBACA,wBACA,8BAEA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,cAAc,OAAOC;CAC3B,MAAM,sBAAsB,OAAOC;CACnC,MAAM,oBAAoB,OAAOC;CACjC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,uBAAuB,CAC9C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,cAAc,YAAY;GACvC,WAAW;GACX,SAAS;GACT,MAAM;GACP,CAAC;AAGJ,MAAI,sBAAsB,SAAS,OACjC,qBAAoB,sBAAsB;MAE1C,sBAAqB,OAAO,oBAAoB,mBAAmB,EACjE,SAAS,yBACV,CAAC,EAAE;EAGN,MAAM,SAAS,OAAO,YAAY,iBAAiB,EACjD,SAAS,kBACV,CAAC;AAEF,MAAI,uBAAuB,SAAS,OAClC,sBAAqB,uBAAuB;MAE5C,sBAAqB,OAAO,cAAc,eAAe,EACvD,SAAS,+BACV,CAAC;EAGJ,MAAM,KAAK,OAAO,oBAAoB,gBAAgB,EACpD,OAAO,mBACR,CAAC;AAEF,MAAI,0BAA0B,SAAS,OACrC,yBAAwB,0BAA0B;MAElD,yBAAwB,OAAO,cAAc,eAAe,EAC1D,SAAS,sCAAsC,GAAG,KAAK,WAAW,KACnE,CAAC;EAGJ,MAAM,eAAe,OAAO,qBAAqB;AAEjD,WAAS;GACP;GACA;GACA;GACA,oBAAoB,SAAS,MAAM,mBAAmB;GACtD,uBAAuB,SAAS,MAAM,sBAAsB;GAC5D;GACD;;CAGH,MAAM,MAAM,OAAO,kBAAkB,iBAAiB,OAAO;CAE7D,MAAM,OAAO;EACX,GAAI,IAAI,KAAK,mBAAmB,UAC5B,EACE,mBAAmB,IAAI,KAAK,mBAC7B,GACD,EACE,aAAa,IAAI,KAAK,aACvB;EACL,cAAc,IAAI,KAAK;EACvB,QAAQ,IAAI,KAAK,mBAAmB,KAAK,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK;EACvE;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,yCAAyC,EAC9D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAMC,sBAAoB,KAAK,OAAO,gBAAgB,CAAC,KACrD,KAAK,gBACH,2DACD,EACD,KAAK,UAAU,KAAK,EACpB,KAAK,SACN;AAED,MAAM,qBAAqB,KAAK,SAAS,WAAW,CAAC,KACnD,KAAK,gBAAgB,kCAAkC,EACvD,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAM,wBAAwB,KAAK,SAAS,iBAAiB,CAAC,KAC5D,KAAK,gBAAgB,kCAAkC,EACvD,KAAK,UAAU,KAAK,EACpB,KAAK,SACN;;;;AAKD,MAAa,0BAA0B,QAAQ,KAC7C,UACA;CAAE,OAAA;CAAO,mBAAA;CAAmB;CAAoB;CAAuB,GACtE,EAAE,OAAO,mBAAmB,oBAAoB,4BAC/CP,WACE,OACA,mBACA,oBACA,sBACD,CACJ,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,4BAA4B,EACpD,QAAQ,aAAa,CACnB;CACE,SAAS;CACT,aAAa;CACd,EACD;CACE,SAAS;CACT,aAAa;CACd,CACF,CAAC,CACH;;;ACpKD,MAAa,oBAAoB,UAAkC;CACjE,MAAM,SAAS,SAAS,SAAS,SAAS,gBAAgB,MAAM,CAAC;CACjE,IAAI,UAAU,KAAK,MAAM,SAAS,IAAK;CAEvC,MAAM,QAAQ;EACZ;GAAE,OAAO;GAAQ,OAAO,OAAU,KAAK;GAAK;EAC5C;GAAE,OAAO;GAAS,OAAO,OAAU,KAAK;GAAI;EAC5C;GAAE,OAAO;GAAO,OAAO,OAAU;GAAI;EACrC;GAAE,OAAO;GAAQ,OAAO;GAAS;EACjC;GAAE,OAAO;GAAU,OAAO;GAAI;EAC9B;GAAE,OAAO;GAAU,OAAO;GAAG;EAC9B;CAED,MAAM,QAAkB,EAAE;AAE1B,MAAK,MAAM,QAAQ,MACjB,KAAI,WAAW,KAAK,OAAO;EACzB,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;AAC9C,aAAW,KAAK;AAEhB,QAAM,KAAK,GAAG,MAAM,GAAG,KAAK,QAAQ,QAAQ,IAAI,MAAM,KAAK;;AAI/D,QAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,GAAG;;AAG9C,MAAa,wBAAwB,WAAkC;CACrE,MAAM,MAAM,KAAK,KAAK;CAGtB,MAAM,QAFW,kBAAkB,OAAO,OAAO,SAAS,GAAG,SAAS,OAE9C;CAGxB,MAAM,UAAU,KAAK,MAFT,KAAK,IAAI,KAAK,GAEO,IAAK;AAWtC,MAAK,MAAM,QATG;EACZ;GAAE,OAAO;GAAQ,OAAO;GAAY;EACpC;GAAE,OAAO;GAAS,OAAO;GAAW;EACpC;GAAE,OAAO;GAAO,OAAO;GAAQ;EAC/B;GAAE,OAAO;GAAQ,OAAO;GAAM;EAC9B;GAAE,OAAO;GAAU,OAAO;GAAI;EAC9B;GAAE,OAAO;GAAU,OAAO;GAAG;EAC9B,CAGC,KAAI,WAAW,KAAK,OAAO;EACzB,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;EAE9C,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,QAAQ,QAAQ,IAAI,MAAM;AAE7D,SAAO,OAAO,IAAI,MAAM,cAAc,GAAG,UAAU;;AAIvD,QAAO;;AAIT,MAAa,wBAAwB,sBAA8B;CACjE,MAAM,SAAS,mCAAmC,kBAAkB;CAGpE,MAAM,SAA8B,EAAE;AAGtC,QAAO,eAAe,OAAO,iBAAiB;AAE9C,MAAK,MAAM,UAAU,OAAO,iBAAiB,YAAY,EAAE,EAAE;EAC3D,MAAM,SAAS,OAAO;AACtB,MAAI,OAAO,SAAS,OAClB,QAAO,aAAa,EAClB,SAAS,MACV;WACQ,OAAO,SAAS,MAEzB,QAAO,YAAY;GACjB,SAAS;GACT,SAAS,GAHK,YAAY,OAAO,WAAW,GAAG,CAG3B;GACpB,GAAI,OAAO,oBAAoB,EAC7B,kBAAkB,OAAO,kBAC1B;GACD,GAAI,OAAO,qBAAqB,eAAe,EAC7C,kBAAkB,OAAO,kBAC1B;GACF;WACQ,OAAO,SAAS,aAAa;GACtC,MAAM,aAAa,OAAO,cAAc;GACxC,MAAM,aAAa,OAAO,cAAc;AAExC,UAAO,kBAAkB;IACvB,SAAS;IACT,QAAQ,qBAAqB,WAAW;IACxC,MAAM,qBAAqB,WAAW;IACvC;aACQ,OAAO,SAAS,cAAc;GACvC,MAAM,oBAAoB,iBAAiB,OAAO,YAAY,EAAE;AAChE,UAAO,kBAAkB;IACvB,SAAS;IACT,OAAO,OAAO;IACd,UAAU;IACV,QAAQ,qBAAqB,OAAO,WAAW,EAAE;IAClD;aACQ,OAAO,SAAS,mBACzB,QAAO,wBAAwB;GAC7B,SAAS;GACT,gBAAgB,OAAO;GACxB;WACQ,OAAO,SAAS,QAAQ;AACjC,UAAO,aAAa;IAClB,SAAS;IACT,eAAe,OAAO;IACvB;AAED,OAAI,CAAC,OAAO,eAAe,OAAO,YAAY,WAAW,EAAG;AAE5D,QAAK,MAAM,cAAc,OAAO,aAAa;AAC3C,WAAO,WAAW,cAAc,OAAO,WAAW,eAAe,EAAE;AAEnE,QAAI,SAAS,YAAY;KACvB,MAAM,iBAAiB,YAAY,WAAW,cAAc,GAAG;KAE/D,MAAM,QAAQ,WAAW,KAAK,MAC3B,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,WAAW,aACvD;KAED,MAAM,OAAO;KACb,MAAM,SAAS;KACf,MAAM,UAAU;KAChB,MAAM,QAAQ;KAEd,IAAI,SAAS,GAAG,UAAU,WAAW,gBAAgB,YAAY,MAAM;AAEvE,SAAI,MACF,OAAM,OAAO,SAAS,OAAO,MAAM;AACjC,UAAI,IAAI,EAAG,WAAU;AACrB,gBAAU,GAAG,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO,IAAI,SAAS,MAAM,OAAO,UAAU;OAC1F;AAGJ,eAAU;AAEV,YAAO,WAAW,YAAY,KAAK;MACjC,eAAe,WAAW;MAC1B,YAAY,GAAG,eAAe;MAC9B,cAAc;MACf,CAAC;WACG;KACL,MAAM,iBAAiB,YAAY,WAAW,cAAc,GAAG;AAC/D,YAAO,WAAW,YAAY,KAAK;MACjC,eAAe,WAAW;MAC1B,YAAY,GAAG,eAAe;MAC/B,CAAC;;;;;AAMV,QAAO;;;;ACzJT,MAAMQ,aAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,oBAAoB,OAAOC;CACjC,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,wBAAwB,CAC/C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,kBAAkB,iBAAiB,EACpD,SAAS,uBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;CAGpB,MAAM,MAAM,OAAO,kBAAkB,cAAc,OAAO;CAE1D,MAAM,OAAO;EACX,OAAO,IAAI;EACX,GAAI,IAAI,KAAK,mBAAmB,UAC5B,EACE,SAAS,IAAI,KAAK,mBACnB,GACD,EACE,aAAa,IAAI,KAAK,aACvB;EACL,cAAc,IAAI,KAAK;EACvB,QAAQ,IAAI,KAAK,mBACd,KAAK,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAClC,KAAK,KAAK;EACb,UAAU,qBACR,IAAI,KAAK,mBAAmB,IAAI,qBAAqB,GACtD;EACF;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,+CAA+C,EACpE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAa,2BAA2B,QAAQ,KAC9C,QACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAYH,UAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,gBAAgB,sCAAsC,EAC9D,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AC3FD,MAAMI,aAAW,0BACf,OAAO,IAAI,aAAa;CACtB,MAAM,oBAAoB,OAAOC;CACjC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAS3C,MAAM,QAPM,OAAO,kBAAkB,gBAAgB,EACnD,cACE,sBAAsB,SAAS,SAC3B,sBAAsB,QACtB,KAAA,GACP,CAAC,EAEe,KAAK,OAAO;EAC3B,OAAO,EAAE;EACT,GAAI,EAAE,KAAK,mBAAmB,UAC1B,EACE,SAAS,EAAE,KAAK,mBACjB,GACD,EACE,aAAa,EAAE,KAAK,aACrB;EACL,cAAc,EAAE,KAAK;EACrB,QAAQ,EAAE,KAAK,mBACZ,KAAK,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAClC,KAAK,KAAK;EACd,EAAE;AAEH,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAM,oBAAoB,KAAK,OAAO,gBAAgB,CAAC,KACrD,KAAK,gBACH,0DACD,EACD,KAAK,UAAU,KAAK,EACpB,KAAK,SACN;;;;AAID,MAAa,yBAAyB,QAAQ,KAC5C,QACA,EAAE,mBAAmB,GACpB,EAAE,wBAAwBF,UAAQ,kBAAkB,CACtD,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,oBAAoB,EAC5C,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACzED,MAAMG,aAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,oBAAoB,OAAOC;CACjC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,uBAAuB,CAC9C,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,kBAAkB,iBAAiB,EACpD,SAAS,uBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;AAGpB,QAAO,kBAAkB,iBAAiB,OAAO;CAEjD,MAAM,OAAO,EAAE,SAAS,MAAM;AAE9B,KAAI,YAAY,MAAO;CACvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,yCAAyC,EAC9D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAa,0BAA0B,QAAQ,KAC7C,UACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAYH,UAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,uBAAuB,EAC/C,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;AC5DD,MAAa,iBAAiB;CAAE,OAVlB,KAAK,OACjB,SACA,OAAO,KAAK,gBAAgB,CAC7B,CAAC,KAAK,KAAK,gBAAgB,aAAa,EAAE,KAAK,SAAS;CAOlB,QALxB,KAAK,OAAO,UAAU,CAAC,KACpC,KAAK,gBAAgB,UAAU,EAC/B,KAAK,SACN;CAE8C;;;ACL/C,MAAMI,aACJ,WACA,WACA,eAEA,OAAO,IAAI,aAAa;CACtB,MAAM,cAAc,OAAOC;CAC3B,MAAM,oBAAoB,OAAOC;CACjC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,0BAA0B,CACjD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,MAAM,SAAS,WAAW,SAAS,SAAS,WAAW,QAAQ,KAAA;AAE/D,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,kBAAkB,iBAAiB,EACpD,SAAS,uBACV,CAAC,EACU;AAGd,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,YAAY,YAAY,EACrC,SAAS,iBACV,CAAC;AAGJ,WAAS;GAAE;GAAO;GAAO;GAAQ;;CAKnC,MAAM,OAAO,EAAE,WAFG,OAAO,kBAAkB,oBAAoB,OAAO,EAE5C;AAE1B,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,+BAA+B,EACpD,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAa,6BAA6B,QAAQ,KAChD,UACA;CACE,OAAA;CACA,GAAG;CACJ,GACA,EAAE,OAAO,OAAO,aAAaJ,UAAQ,OAAO,OAAO,OAAO,CAC5D,CAAC,KACA,QAAQ,gBAAgB,2CAA2C,EACnE,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;;;;ACpFD,MAAa,qBAAqB,QAAQ,KACxC,eACA,EAAE,QACI,OAAO,KACd,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,mCAAmC,EAC3D,QAAQ,gBAAgB;CACtB;CACA;CACA;CACA;CACA;CACD,CAAC,CACH;;;ACdD,MAAMK,aACJ,WACA,gBACA,mBACA,cAEA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,yBAAyB,CAChD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,cAAc,YAAY;GACvC,WAAW;GACX,SAAS;GACT,MAAM;GACP,CAAC;AAGJ,MAAI,eAAe,SAAS,OAC1B,cAAa,eAAe;MAE5B,eAAc,OAAO,gBAAgB,eAAe,EAClD,SAAS,0BACV,CAAC,EAAE;AAGN,MAAI,kBAAkB,SAAS,OAC7B,iBAAgB,kBAAkB;MAElC,iBAAgB,OAAO,gBAAgB,oBAAoB;GACzD,OAAO;GACP,SAAS,6BAA6B,WAAW;GAClD,CAAC;AAGJ,MAAI,UAAU,SAAS,OACrB,SAAQ,OAAO,UAAU,MAAM;MAE/B,SAAQ;AAGV,WAAS;GACP;GACA;GACA;GACA,eAAe,SAAS,MAAM,cAAc;GAC7C;;CAGH,MAAM,MAAM,OAAO,oBAAoB,mBAAmB,OAAO;CAEjE,MAAM,OAAO;EACX,SAAS,IAAI,KAAK;EAClB,eAAe,IAAI,KAAK;EACxB,OAAO,OAAO,IAAI,KAAK,MAAM;EAC7B,OAAO,IAAI,KAAK;EACjB;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,2CAA2C,EAChE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAM,aAAa,KAAK,OAAO,cAAc,CAAC,KAC5C,KAAK,gBAAgB,kCAAkC,EACvD,KAAK,UAAU,KAAK,EACpB,KAAK,SACN;AAED,MAAM,gBAAgB,KAAK,SAAS,iBAAiB,CAAC,KACpD,KAAK,gBAAgB,qCAAqC,EAC1D,KAAK,UAAU,KAAK,EACpB,KAAK,SACN;AAED,MAAM,QAAQ,KAAK,QAAQ,QAAQ,CAAC,KAClC,KAAK,gBAAgB,iCAAiC,EACtD,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;;;AAOD,MAAa,4BAA4B,QAAQ,KAC/C,UACA;CAAE,OAAA;CAAO;CAAY;CAAe;CAAO,GAC1C,EAAE,OAAO,YAAY,eAAe,YACnCL,UAAQ,OAAO,YAAY,eAAe,MAAM,CACnD,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,8BAA8B,EACtD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AC9ID,MAAMM,kBACJ,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;AAE3C,KAAI,YAAY,OAAO,SAAS,OAC9B,QAAO,OAAO,OAAO,KACnB,IAAI,yBAAyB;EAC3B,MAAM;EACN,SAAS;EACV,CAAC,CACH;CAGH,MAAM,SAAS,OAAO,kBACpB,OAAO,eAAe,yBAAyB,CAChD,CAAC,YAAY,OAAO,MAAM;CAE3B,MAAM,MAAM,OAAO,oBAAoB,mBAAmB,OAAO;CAEjE,MAAM,OAAO;EACX,OAAO,IAAI;EACX,SAAS,IAAI,KAAK;EAClB,OAAO,IAAI,KAAK;EAChB,OAAO,OAAO,IAAI,KAAK,MAAM;EAC7B,eAAe,IAAI,KAAK;EACzB;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;;;;AAKJ,MAAa,4BAA4B,QAAQ,KAAK,UAAU,EAAE,QAChEF,WAAS,CACV,CAAC,KACA,QAAQ,UAAU,IAAI,EACtB,QAAQ,gBAAgB,yBAAyB,EACjD,QAAQ,aAAa,CACnB;CACE,SAAS;CACT,aAAa;CACd,EACD;CACE,SAAS;CACT,aAAa;CACd,CACF,CAAC,CACH;;;ACvDD,MAAMG,aAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAE/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,kBAAkB,CACzC,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,oBAAoB,mBAAmB,EACxD,SAAS,yBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;CAGpB,MAAM,MAAM,OAAO,oBAAoB,gBAAgB,OAAO;CAE9D,MAAM,OAAO;EACX,OAAO,IAAI;EACX,SAAS,IAAI,KAAK;EAClB,OAAO,IAAI,KAAK;EAChB,OAAO,OAAO,IAAI,KAAK,MAAM;EAC7B,eAAe,IAAI,KAAK;EACzB;AAED,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,6CAA6C,EAClE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;;;AAOD,MAAa,6BAA6B,QAAQ,KAChD,QACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAYH,UAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,gBAAgB,wCAAwC,EAChE,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aACE;EACH;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACrFD,MAAMI,kBACJ,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAI3C,MAAM,QAFM,OAAO,oBAAoB,mBAAmB,EAEzC,KAAK,OAAO;EAC3B,OAAO,EAAE;EACT,SAAS,EAAE,KAAK;EAChB,OAAO,EAAE,KAAK;EACd,OAAO,OAAO,EAAE,KAAK,MAAM;EAC3B,eAAe,EAAE,KAAK;EACvB,EAAE;AAEH,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;;;;AAKJ,MAAa,2BAA2B,QAAQ,KAAK,QAAQ,EAAE,QAC7DF,WAAS,CACV,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,0BAA0B,EAClD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;AC/CD,MAAMG,aAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,yBAAyB,CAChD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,oBAAoB,mBAAmB,EACxD,SAAS,yBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;AAGpB,QAAO,oBAAoB,mBAAmB,OAAO;CAErD,MAAM,OAAO,EAAE,SAAS,MAAM;AAE9B,KAAI,YAAY,MAAO;CACvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAMC,UAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,2CAA2C,EAChE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,4BAA4B,QAAQ,KAC/C,UACA,EAAE,OAAA,SAAO,GACR,EAAE,YAAYH,UAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,yBAAyB,EACjD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH;;;ACpED,MAAM,WACJ,WACA,WACA,eAEA,OAAO,IAAI,aAAa;CACtB,MAAM,cAAc,OAAOI;CAC3B,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,4BAA4B,CACnD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,MAAM,SAAS,WAAW,SAAS,SAAS,WAAW,QAAQ,KAAA;AAE/D,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAHY,OAAO,oBAAoB,mBAAmB,EACxD,SAAS,yBACV,CAAC,EACU;AAGd,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,YAAY,YAAY,EACrC,SAAS,iBACV,CAAC;AAGJ,WAAS;GAAE;GAAO;GAAO;GAAQ;;CAKnC,MAAM,OAAO,EAAE,UAFE,OAAO,oBAAoB,sBAAsB,OAAO,EAEhD;AAEzB,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAM,QAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,iCAAiC,EACtD,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,wBAAwB,QAAQ,KAC3C,UACA;CACE;CACA,GAAG;CACJ,GACA,EAAE,OAAO,OAAO,aAAa,QAAQ,OAAO,OAAO,OAAO,CAC5D,CAAC,KACA,QAAQ,gBACN,wDACD,EACD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aACE;EACH;CACF,CAAC,CACH;;;;;;AEzFD,MAAa,WAAW;CACtB;CDKkC,QAAQ,KAC1C,iBACA,EAAE,QACI,OAAO,KACd,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,sCAAsC,EAC9D,QAAQ,gBAAgB;EACtB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,CACH;CClBC;CACA;CACA;CACD;;;ACID,MAAM,UAAU,QAAQ,KAAK,UAAU,EAAE,QAAQ,OAAO,KAAK,CAAC,KAC5D,QAAQ,gBACN,0DACD,EACD,QAAQ,gBAAgB,YAAY,EACpC,QAAQ,gBAAgB,SAAS,EACjC,QAAQ,aAAa,CACnB;CACE,SAAS;CACT,aAAa;CACd,EACD;CACE,SAAS;CACT,aAAa;CACd,CACF,CAAC,CACH;AAED,MAAM,SAAA,QAA0B,KAC9B,MAAM,aAAaC,QAAwB,EAC3C,MAAM,aAAaC,QAA0B,EAC7C,MAAM,aAAaC,QAAsB,EACzC,MAAM,aAAaC,QAAkB,EACrC,MAAM,aAAaC,QAAoB,EACvC,MAAM,aAAaC,QAAoB,EACvC,MAAM,aAAaC,MAAsB,EACzC,MAAM,aAAa,aAAa,MAAM,CACvC;AAEW,OAAO,IAAI,aAAa;AAElC,SADsB,OAAOC,eACR,uBAAuB;AAE5C,QAAO,QAAQ,IAAI,SAAS,EAC1B,SAAS,SACV,CAAC;EACF,CAAC,KACD,OAAO,QAAQ,OAAO,EACtB,OAAO,eACL,eAAe,gBACf,eAAe,SAAS,CACzB,EACD,OAAO,OAAO,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAC9C,CAGG,KAAK,YAAY,QAAQ"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["CallPolicyVersion","CallType","ParamCondition","layer","layer","layer","EthereumJSWallet","layer","McpContext.McpContext","Web3Service.Web3Service","ParamConditionCore","layer","layer","createSessionKey","createNameraSessionKey","layer","PromptManager.PromptManager","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","password","handler","KeystoreManager.KeystoreManager","PromptManager.PromptManager","OutputFormatter.OutputFormatter","alias","password","handler","KeystoreManager.KeystoreManager","PromptManager.PromptManager","OutputFormatter.OutputFormatter","alias","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","handler","KeystoreManager.KeystoreManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","McpManager.McpManager","Dto.CreateKeystoreParams","Dto.DecryptKeystoreParams","Dto.GetKeystoreParams","Dto.ListKeystoreParams","Dto.ImportKeystoreParams","Dto.RemoveKeystoreParams","Dto.CreateSmartAccountParams","Dto.ListSmartAccountParams","Dto.GetSmartAccountInfoParams","Dto.RemoveSmartAccountParams","Dto.GetSmartAccountStatusParams","Dto.ImportSmartAccountParams","Dto.CreateSessionKeyParams","Dto.ListSessionKeysParams","Dto.GetSessionKeyInfoParams","Dto.RemoveSessionKeyParams","Dto.GetSessionKeyStatusParams","Dto.StartMcpServerParams","commands","command","handler","PromptManager.PromptManager","Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","smartAccountAlias","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","handler","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","Web3Service.Web3Service","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter","alias","handler","PromptManager.PromptManager","KeystoreManager.KeystoreManager","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","handler","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","alias","Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter","SessionKeyManager.layer","SmartAccountManager.layer","KeystoreManager.layer","Web3Service.layer","PromptManager.layer","ConfigManager.layer","OutputFormatter.layer","ConfigManager.ConfigManager"],"sources":["../src/dto/keystore.ts","../src/dto/mcp.ts","../src/schema/chain.ts","../src/schema/common.ts","../src/schema/policy.ts","../src/dto/session-key.ts","../src/dto/smart-account.ts","../src/flags/global.ts","../src/types/index.ts","../src/layers/config.ts","../src/layers/prompt.ts","../src/layers/keystore.ts","../src/layers/mcp-context.ts","../src/mcp/helpers/common.ts","../src/mcp/tools/account/address.ts","../src/layers/web3.ts","../src/mcp/helpers/session-key.ts","../src/mcp/tools/account/get-balance.ts","../src/mcp/tools/account/index.ts","../src/mcp/tools/read/read-contract.ts","../src/mcp/tools/read/index.ts","../src/schema/tx.ts","../src/mcp/tools/transaction/execute-transaction.ts","../src/mcp/tools/transaction/native-transfer.ts","../src/mcp/tools/transaction/index.ts","../src/mcp/mcp.ts","../src/mcp/index.ts","../src/helpers/policy.ts","../src/layers/smart-account.ts","../src/layers/session-key.ts","../src/layers/mcp.ts","../src/helpers/pretty.ts","../src/layers/output.ts","../src/commands/keystore/create.ts","../src/commands/keystore/decrypt.ts","../src/commands/keystore/import.ts","../src/commands/keystore/info.ts","../src/commands/keystore/list.ts","../src/commands/keystore/remove.ts","../src/commands/keystore/index.ts","../src/commands/mcp/start.ts","../src/commands/mcp/index.ts","../src/helpers/paths.ts","../src/commands/schema/index.ts","../src/commands/session-key/create/prompts/base.ts","../src/commands/session-key/create/prompts/common.ts","../src/commands/session-key/create/prompts/call.ts","../src/commands/session-key/create/prompts/gas.ts","../src/commands/session-key/create/prompts/rate-limit.ts","../src/commands/session-key/create/prompts/signature-caller.ts","../src/commands/session-key/create/prompts/timestamp.ts","../src/commands/session-key/create/prompts/index.ts","../src/commands/session-key/create/index.ts","../src/helpers/humanize.ts","../src/commands/session-key/info.ts","../src/commands/session-key/list.ts","../src/commands/session-key/remove.ts","../src/flags/shared.ts","../src/commands/session-key/status.ts","../src/commands/session-key/index.ts","../src/commands/smart-account/create.ts","../src/commands/smart-account/import.ts","../src/commands/smart-account/info.ts","../src/commands/smart-account/list.ts","../src/commands/smart-account/remove.ts","../src/commands/smart-account/status.ts","../src/commands/smart-account/index.ts","../src/commands/index.ts","../src/index.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport const Keystore = Schema.Struct({\n version: Schema.Number,\n id: Schema.String,\n address: Schema.String,\n crypto: Schema.Any,\n});\n\nexport const KeystoreData = Schema.Struct({\n path: Schema.String,\n alias: Schema.String,\n data: Keystore,\n});\n\nexport const GetKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to retrieve\",\n }),\n});\n\nexport const ListKeystoreParams = Schema.Void;\n\nexport const CreateKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to create\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to decrypt\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreResponse = Schema.Struct({\n address: Schema.String.annotate({\n description: \"The address of the keystore\",\n }),\n alias: Schema.String.annotate({\n description: \"The alias of the keystore\",\n }),\n privateKey: Schema.Redacted(Schema.String).annotate({\n description: \"The private key of the keystore\",\n }),\n publicKey: Schema.String.annotate({\n description: \"The public key of the keystore\",\n }),\n});\n\nexport const ImportKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to import\",\n }),\n privateKey: Schema.String.annotate({\n description: \"The private key of the keystore to import\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const RemoveKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to remove\",\n }),\n});\n\nexport const GetSignerParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to get the signer for\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport type Keystore = typeof Keystore.Type;\nexport type KeystoreData = typeof KeystoreData.Type;\nexport type GetKeystoreParams = typeof GetKeystoreParams.Type;\nexport type ListKeystoreParams = typeof ListKeystoreParams.Type;\nexport type CreateKeystoreParams = typeof CreateKeystoreParams.Type;\nexport type DecryptKeystoreParams = typeof DecryptKeystoreParams.Type;\nexport type DecryptKeystoreResponse = typeof DecryptKeystoreResponse.Type;\nexport type ImportKeystoreParams = typeof ImportKeystoreParams.Type;\nexport type RemoveKeystoreParams = typeof RemoveKeystoreParams.Type;\nexport type GetSignerParams = typeof GetSignerParams.Type;\n","import { Schema } from \"effect\";\n\nexport const StartMcpServerParams = Schema.Struct({\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to use for the MCP server\",\n }),\n transport: Schema.Literals([\"http\", \"stdio\"]).annotate({\n description: \"The transport to use for the MCP server\",\n }),\n port: Schema.optional(\n Schema.Int.check(Schema.makeFilter((v) => v > 0 && v < 65_536)),\n ).annotate({\n description: \"The port to use for the MCP server when using http transport\",\n }),\n sessionKeys: Schema.mutableKey(Schema.Record(Schema.String, Schema.String)),\n});\n\nexport type StartMcpServerParams = typeof StartMcpServerParams.Type;\n","import { Schema } from \"effect\";\nimport {\n arbitrum,\n arbitrumSepolia,\n arcTestnet,\n avalanche,\n avalancheFuji,\n base,\n baseSepolia,\n type Chain,\n celo,\n celoSepolia,\n mainnet,\n monad,\n monadTestnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n scroll,\n scrollSepolia,\n sepolia,\n tempoModerato,\n unichain,\n unichainSepolia,\n zora,\n zoraSepolia,\n} from \"viem/chains\";\n\nexport type ChainWithMetadata = Chain & {\n key: string;\n};\n\nconst supportedMainnetChains = {\n \"eth-mainnet\": {\n ...mainnet,\n key: \"eth-mainnet\",\n },\n \"opt-mainnet\": {\n ...optimism,\n key: \"opt-mainnet\",\n },\n \"polygon-mainnet\": {\n ...polygon,\n key: \"polygon-mainnet\",\n },\n \"arb-mainnet\": {\n ...arbitrum,\n key: \"arb-mainnet\",\n },\n \"zora-mainnet\": {\n ...zora,\n key: \"zora-mainnet\",\n },\n \"base-mainnet\": {\n ...base,\n key: \"base-mainnet\",\n },\n \"avax-mainnet\": {\n ...avalanche,\n key: \"avax-mainnet\",\n },\n \"unichain-mainnet\": {\n ...unichain,\n key: \"unichain-mainnet\",\n },\n \"celo-mainnet\": {\n ...celo,\n key: \"celo-mainnet\",\n },\n \"scroll-mainnet\": {\n ...scroll,\n key: \"scroll-mainnet\",\n },\n \"monad-mainnet\": {\n ...monad,\n key: \"monad-mainnet\",\n },\n} as const;\n\nconst supportedTestnetChains = {\n \"eth-sepolia\": {\n ...sepolia,\n key: \"eth-sepolia\",\n },\n \"opt-sepolia\": {\n ...optimismSepolia,\n key: \"opt-sepolia\",\n },\n \"polygon-amoy\": {\n ...polygonAmoy,\n key: \"polygon-amoy\",\n },\n \"arb-sepolia\": {\n ...arbitrumSepolia,\n key: \"arb-sepolia\",\n },\n \"zora-sepolia\": {\n ...zoraSepolia,\n key: \"zora-sepolia\",\n },\n \"base-sepolia\": {\n ...baseSepolia,\n key: \"base-sepolia\",\n },\n \"tempo-moderato\": {\n ...tempoModerato,\n key: \"tempo-moderato\",\n },\n \"avax-fuji\": {\n ...avalancheFuji,\n key: \"avax-fuji\",\n },\n \"unichain-sepolia\": {\n ...unichainSepolia,\n key: \"unichain-sepolia\",\n },\n \"monad-testnet\": {\n ...monadTestnet,\n key: \"monad-testnet\",\n },\n \"celo-sepolia\": {\n ...celoSepolia,\n key: \"celo-sepolia\",\n },\n \"scroll-sepolia\": {\n ...scrollSepolia,\n key: \"scroll-sepolia\",\n },\n \"arc-testnet\": {\n ...arcTestnet,\n key: \"arc-testnet\",\n },\n} as const;\n\ntype SupportedTestnetChain = keyof typeof supportedMainnetChains;\ntype SupportedMainnetChain = keyof typeof supportedTestnetChains;\n\nexport const SupportedChain = Schema.Literals([\n ...(Object.keys(supportedMainnetChains) as SupportedMainnetChain[]),\n ...(Object.keys(supportedTestnetChains) as SupportedTestnetChain[]),\n]);\n\nexport type SupportedChain = typeof SupportedChain.Type;\n\nexport const supportedChains = {\n ...supportedMainnetChains,\n ...supportedTestnetChains,\n} as Record<SupportedChain, ChainWithMetadata>;\n\nexport const getChain = (chain: SupportedChain): ChainWithMetadata => {\n return supportedChains[chain];\n};\n\nexport const getChainFromId = (\n chainId: number,\n): ChainWithMetadata | undefined => {\n return Object.values(supportedChains).find((c) => c.id === chainId);\n};\n\nexport const chainIdToChainName = (chainId: number) => {\n const chain = getChainFromId(chainId);\n\n if (!chain) {\n throw new Error(`Chain with id ${chainId} not found`);\n }\n\n return chain.key as SupportedChain;\n};\n","import { Schema, SchemaTransformation } from \"effect\";\n\nexport const BigIntFromString = Schema.String.pipe(\n Schema.decodeTo(\n Schema.BigInt,\n SchemaTransformation.transform({\n encode: (v) => v.toString(),\n decode: (v) => BigInt(v),\n }),\n ),\n);\n\nexport const EthereumAddress = Schema.TemplateLiteral([\n \"0x\",\n Schema.String.check(Schema.isPattern(/^[0-9a-fA-F]{40}$/)),\n]);\n\nexport const Hex = Schema.TemplateLiteral([\n \"0x\",\n Schema.String.check(Schema.isPattern(/^[0-9a-fA-F]*$/)),\n]);\n\nexport const EntrypointVersion = Schema.Literals([\"0.7\", \"0.8\", \"0.9\"]);\nexport const KernelVersion = Schema.Literals([\n \"0.3.0\",\n \"0.3.1\",\n \"0.3.2\",\n \"0.3.3\",\n]);\nexport const OwnerType = Schema.Literals([\"ecdsa\", \"passkey\", \"multisig\"]);\n\nexport type EntrypointVersion = typeof EntrypointVersion.Type;\nexport type KernelVersion = typeof KernelVersion.Type;\nexport type OwnerType = typeof OwnerType.Type;\nexport type Hex = typeof Hex.Type;\nexport type EthereumAddress = typeof EthereumAddress.Type;\n","import { Schema, Struct } from \"effect\";\n\nimport { BigIntFromString, EthereumAddress, Hex } from \"./common\";\n\nexport const SudoPolicyParams = Schema.Struct({\n type: Schema.Literal(\"sudo\"),\n});\n\nexport const TimestampPolicyParams = Schema.Struct({\n type: Schema.Literal(\"timestamp\"),\n validAfter: Schema.optional(Schema.Number)\n .pipe(Schema.withDecodingDefault(() => 0))\n .annotate({\n description:\n \"The timestamp in seconds after which signer is valid. If not provided, the signer is valid immediately.\",\n }),\n validUntil: Schema.optional(Schema.Number)\n .pipe(Schema.withDecodingDefault(() => 0))\n .annotate({\n description:\n \"The timestamp in seconds until which signer is valid. If not provided, the signer is valid indefinitely.\",\n }),\n});\n\nexport const SignatureCallerPolicyParams = Schema.Struct({\n type: Schema.Literal(\"signature-caller\"),\n allowedCallers: Schema.mutable(Schema.Array(EthereumAddress)).annotate({\n description:\n \"List of addresses that are allowed to validate messages signed by the signer.\",\n }),\n});\n\nexport const RateLimitPolicyParams = Schema.Struct({\n type: Schema.Literal(\"rate-limit\"),\n interval: Schema.optional(Schema.Number).annotate({\n description: \"Length of interval in seconds\",\n }),\n count: Schema.Number.annotate({\n description: \"The number of calls allowed within the interval\",\n }),\n startAt: Schema.optional(Schema.Number).annotate({\n description:\n \"The timestamp in seconds at which the rate limit starts. Before this signer cannot sign any UserOperations\",\n }),\n});\n\nexport const GasPolicyParams = Schema.Struct({\n type: Schema.Literal(\"gas\"),\n amount: Schema.optional(BigIntFromString).annotate({\n description:\n \"Amount, in wei that the signer can spend on gas, in total across all UserOps it sends.\",\n }),\n enforcePaymaster: Schema.optional(Schema.Boolean).annotate({\n description: \"If set to true, enforce that a paymaster must be used.\",\n default: false,\n }),\n});\n\nexport const CallPolicyVersion = Schema.Literals([\n \"0.0.1\",\n \"0.0.2\",\n \"0.0.3\",\n \"0.0.4\",\n \"0.0.5\",\n]);\n\nexport type CallPolicyVersion = typeof CallPolicyVersion.Type;\n\nconst CallType = Schema.Literals([\"call\", \"delegatecall\", \"batch-call\"]);\n\nexport const ParamCondition = Schema.Literals([\n \"EQUAL\",\n \"GREATER_THAN\",\n \"LESS_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"LESS_THAN_OR_EQUAL\",\n \"NOT_EQUAL\",\n \"ONE_OF\",\n \"SLICE_EQUAL\",\n]);\n\nexport type ParamCondition = typeof ParamCondition.Type;\n\nconst ConditionValue = Schema.Union([\n Schema.Struct({\n condition: ParamCondition.pick([\"ONE_OF\"]),\n value: Schema.mutable(Schema.Array(Schema.Any)).annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n }),\n Schema.Struct({\n condition: ParamCondition.pick([\"SLICE_EQUAL\"]),\n value: Schema.Any.annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n start: Schema.Number,\n length: Schema.Number,\n }),\n Schema.Struct({\n condition: ParamCondition.pick([\n \"EQUAL\",\n \"GREATER_THAN\",\n \"LESS_THAN\",\n \"GREATER_THAN_OR_EQUAL\",\n \"LESS_THAN_OR_EQUAL\",\n \"NOT_EQUAL\",\n \"SLICE_EQUAL\",\n ]),\n value: Schema.Any.annotate({\n description: \"The value of the argument to use with the operator.\",\n }),\n }),\n Schema.Null,\n]);\n\nconst ParamRule = Schema.Struct({\n condition: ParamCondition,\n offset: Schema.Number,\n params: Schema.Union([Hex, Schema.mutable(Schema.Array(Hex))]),\n});\n\nconst PermissionCore = Schema.Struct({\n callType: Schema.optional(CallType)\n .pipe(Schema.withDecodingDefault(() => \"call\"))\n .annotate({\n description: \"The type of call to make\",\n default: \"call\",\n }),\n target: EthereumAddress.annotate({\n description:\n \"The target contract to call or address to send ETH to. If this is zeroAddress, then the target can be any contract as long as the ABI matches (or it can be any address if no ABI is specified)\",\n }),\n selector: Schema.optional(Hex).annotate({\n description: \"The function selector if the target is a contract\",\n }),\n valueLimit: Schema.optional(BigIntFromString).annotate({\n description: \"The maximum value in wei that can be sent to the target\",\n }),\n rules: Schema.optional(Schema.Array(ParamRule)),\n});\n\nexport const PermissionManual = PermissionCore;\n\nexport const PermissionWithABI = PermissionCore.mapFields(\n Struct.omit([\"rules\"]),\n).mapFields(\n Struct.assign({\n abi: Schema.mutable(Schema.Array(Schema.Any)).annotate({\n description: \"The ABI of the target contract\",\n }),\n functionName: Schema.String.annotate({\n description: \"The function name\",\n }),\n args: Schema.optional(Schema.Array(ConditionValue)).annotate({\n description:\n \"An array of conditions, each corresponding to an argument, in the order that the arguments are laid out. use null to skip an argument.\",\n }),\n }),\n);\n\nexport const Permission = Schema.Union([PermissionManual, PermissionWithABI]);\n\nexport type PermissionManual = typeof PermissionManual.Type;\nexport type PermissionWithABI = typeof PermissionWithABI.Type;\nexport type Permission = typeof Permission.Type;\n\nexport const CallPolicyParams = Schema.Struct({\n type: Schema.Literal(\"call\"),\n policyVersion: CallPolicyVersion,\n permissions: Schema.optional(Schema.Array(Permission)),\n});\n\nexport const PolicyParams = Schema.Union([\n SudoPolicyParams,\n TimestampPolicyParams,\n SignatureCallerPolicyParams,\n RateLimitPolicyParams,\n GasPolicyParams,\n CallPolicyParams,\n]);\n\nexport type SudoPolicyParams = typeof SudoPolicyParams.Type;\nexport type TimestampPolicyParams = typeof TimestampPolicyParams.Type;\nexport type SignatureCallerPolicyParams =\n typeof SignatureCallerPolicyParams.Type;\nexport type RateLimitPolicyParams = typeof RateLimitPolicyParams.Type;\nexport type GasPolicyParams = typeof GasPolicyParams.Type;\nexport type CallPolicyParams = typeof CallPolicyParams.Type;\nexport type PolicyParams = typeof PolicyParams.Type;\n","import { Schema, Struct } from \"effect\";\n\nimport { EthereumAddress, PolicyParams, SupportedChain } from \"@/schema\";\n\nimport { Keystore } from \"./keystore\";\n\nconst BaseSessionKey = Schema.Struct({\n smartAccountAlias: Schema.String,\n serializedAccounts: Schema.Array(\n Schema.Struct({\n chain: SupportedChain,\n serializedAccount: Schema.String,\n }),\n ),\n}).mapFields(Struct.assign(Keystore.fields));\n\nconst EcdsaSessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"ecdsa\"),\n sessionKeyAddress: EthereumAddress,\n smartAccountAlias: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nconst PasskeySessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"passkey\"),\n passKeyName: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nexport const SessionKey = Schema.Union([EcdsaSessionKey, PasskeySessionKey]);\n\nexport const SessionKeyData = Schema.Struct({\n alias: Schema.String,\n data: SessionKey,\n path: Schema.String,\n});\n\nexport const CreateSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to create\",\n }),\n chains: Schema.mutable(Schema.Array(SupportedChain)).annotate({\n description: \"The chains to create the session key for\",\n }),\n policyParams: Schema.mutable(Schema.Array(PolicyParams)),\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to create the session key for\",\n }),\n ownerKeystorePassword: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the owner keystore with\",\n }),\n sessionKeyPassword: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the session key with\",\n }),\n});\n\nexport const GetSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const ListSessionKeysParams = Schema.Struct({\n smartAccount: Schema.optional(Schema.String).annotate({\n description: \"The alias of the smart account to list session keys for\",\n }),\n});\n\nexport const GetSessionKeyInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const GetSessionKeyStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to retrieve the session key status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const RemoveSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to remove\",\n }),\n});\n\nexport type SessionKey = typeof SessionKey.Type;\nexport type SessionKeyData = typeof SessionKeyData.Type;\nexport type CreateSessionKeyParams = typeof CreateSessionKeyParams.Type;\nexport type GetSessionKeyParams = typeof GetSessionKeyParams.Type;\nexport type ListSessionKeysParams = typeof ListSessionKeysParams.Type;\nexport type GetSessionKeyInfoParams = typeof GetSessionKeyInfoParams.Type;\nexport type GetSessionKeyStatusParams = typeof GetSessionKeyStatusParams.Type;\nexport type RemoveSessionKeyParams = typeof RemoveSessionKeyParams.Type;\n","import { Schema } from \"effect\";\n\nimport {\n BigIntFromString,\n EntrypointVersion,\n EthereumAddress,\n KernelVersion,\n OwnerType,\n} from \"@/schema\";\nimport { SupportedChain } from \"@/schema/chain\";\n\nexport const LocalSmartAccount = Schema.Struct({\n entryPointVersion: EntrypointVersion,\n index: BigIntFromString,\n kernelVersion: KernelVersion,\n ownerAlias: Schema.String,\n ownerType: OwnerType,\n smartAccountAddress: EthereumAddress,\n});\n\nexport const LocalSmartAccountData = Schema.Struct({\n data: LocalSmartAccount,\n path: Schema.String,\n alias: Schema.String,\n});\n\nexport const CreateSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to create\",\n }),\n ownerAlias: Schema.String.annotate({\n description: \"The alias of the owner keystore\",\n }),\n ownerPassword: Schema.redact(Schema.String).annotate({\n description: \"The password of the owner keystore\",\n }),\n index: Schema.optional(\n BigIntFromString.check(Schema.makeFilter((v) => v >= 0n)),\n ).annotate({\n description: \"The index of the smart account\",\n default: 0n,\n }),\n});\n\nexport const GetSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\nexport const ListSmartAccountParams = Schema.Void;\n\nexport const GetSmartAccountInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\n\nexport const RemoveSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to remove\",\n }),\n});\n\nexport const GetSmartAccountStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to get the status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const ImportSmartAccountParams = LocalSmartAccount.pipe(\n Schema.fieldsAssign({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to import\",\n }),\n }),\n);\n\nexport type LocalSmartAccount = typeof LocalSmartAccount.Type;\nexport type LocalSmartAccountData = typeof LocalSmartAccountData.Type;\nexport type CreateSmartAccountParams = typeof CreateSmartAccountParams.Type;\nexport type GetSmartAccountParams = typeof GetSmartAccountParams.Type;\nexport type ListSmartAccountParams = typeof ListSmartAccountParams.Type;\nexport type GetSmartAccountInfoParams = typeof GetSmartAccountInfoParams.Type;\nexport type RemoveSmartAccountParams = typeof RemoveSmartAccountParams.Type;\nexport type GetSmartAccountStatusParams =\n typeof GetSmartAccountStatusParams.Type;\n\nexport type ImportSmartAccountParams = typeof ImportSmartAccountParams.Type;\n","import { Effect } from \"effect\";\nimport { Flag, GlobalFlag } from \"effect/unstable/cli\";\n\nexport const globalOutput = GlobalFlag.setting(\"output\")({\n flag: Flag.choice(\"output\", [\"pretty\", \"json\", \"ndjson\"]).pipe(\n Flag.withAlias(\"o\"),\n Flag.withDefault(\"pretty\"),\n Flag.withDescription(\"Output format (pretty, json, ndjson)\"),\n ),\n});\n\nexport const globalQuiet = GlobalFlag.setting(\"quiet\")({\n flag: Flag.boolean(\"quiet\").pipe(\n Flag.withAlias(\"q\"),\n Flag.withDefault(false),\n Flag.withDescription(\"Do not print output\"),\n ),\n});\n\nexport const globalParams = GlobalFlag.setting(\"params\")({\n flag: Flag.string(\"params\").pipe(\n Flag.optional,\n Flag.withDescription(\"JSON Parameters to pass to the command\"),\n ),\n});\n\nexport const getGlobalFlags = () =>\n Effect.gen(function* () {\n const out = yield* globalOutput;\n const quiet = yield* globalQuiet;\n const params = yield* globalParams;\n\n return { out, params, quiet };\n });\n\nexport const globalFlags = [globalOutput, globalQuiet, globalParams];\n","import type { Schema } from \"effect\";\n\nexport type EntityType = \"smart-account\" | \"session-key\" | \"keystore\";\n\nexport const entityName: Record<EntityType, string> = {\n keystore: \"Keystore\",\n \"session-key\": \"Session Key\",\n \"smart-account\": \"Smart Account\",\n};\n\nexport type Entity<TEntityType extends EntityType> = {\n path: string;\n content: string;\n alias: string;\n type: TEntityType;\n};\n\nexport type DeepPaths<T> = {\n [K in keyof T & string]: T[K] extends Schema.Top\n ? K\n : // biome-ignore lint/suspicious/noExplicitAny: safe\n T[K] extends Record<string, any>\n ? `${K}.${DeepPaths<T[K]>}`\n : never;\n}[keyof T & string];\n","import os from \"node:os\";\n\nimport { Data, Effect, FileSystem, Layer, Path, ServiceMap } from \"effect\";\nimport type { SystemErrorTag } from \"effect/PlatformError\";\n\nimport { type Entity, type EntityType, entityName } from \"@/types\";\n\n/**\n * Effect service for managing the CLI configuration directory and stored entities.\n */\nexport type ConfigManager = {\n /**\n * Ensures the base config directory and entity subdirectories exist.\n */\n ensureConfigDirExists: () => Effect.Effect<void, ConfigManagerError>;\n /**\n * Returns the absolute path to the CLI config directory.\n */\n getConfigDirPath: () => Effect.Effect<string>;\n /**\n * Resolves the absolute storage path for a given entity alias and type.\n *\n * @param entity - Entity type and alias used to build the path.\n */\n getEntityPath: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<string>;\n /**\n * Checks if an entity exists at the expected storage path.\n *\n * @param entity - Entity type and alias to check.\n */\n checkEntityExists: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<boolean, ConfigManagerError>;\n /**\n * Loads a single entity by alias and returns its stored content and metadata.\n *\n * @param entity - Entity type and alias to load.\n */\n getEntity: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<Entity<TEntityType>, ConfigManagerError>;\n /**\n * Lists all entities stored for a given type.\n *\n * @param type - Entity type to enumerate.\n */\n getEntitiesForType: <TEntityType extends EntityType>(\n type: TEntityType,\n ) => Effect.Effect<Entity<TEntityType>[], ConfigManagerError>;\n /**\n * Persists a new entity to disk.\n *\n * @param entity - Entity content and metadata to store.\n */\n storeEntity: <TEntityType extends EntityType>(\n entity: Entity<TEntityType>,\n ) => Effect.Effect<Entity<TEntityType>, ConfigManagerError>;\n /**\n * Removes an entity from disk.\n *\n * @param entity - Entity type and alias to remove.\n */\n removeEntity: <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) => Effect.Effect<void, ConfigManagerError>;\n};\n\n/**\n * Domain error for configuration and entity storage operations.\n */\nexport class ConfigManagerError extends Data.TaggedError(\n \"@namera-ai/cli/ConfigManagerError\",\n)<{\n code:\n | \"InitializationError\"\n | \"BadArgument\"\n | \"EntityNotFound\"\n | \"EntityAlreadyExists\"\n | SystemErrorTag;\n message: string;\n}> {}\n\ntype GetEntityParams<TEntityType extends EntityType> = {\n type: TEntityType;\n alias: string;\n};\n\n/**\n * Service tag for resolving {@link ConfigManager} from the Effect context.\n */\nexport const ConfigManager = ServiceMap.Service<ConfigManager>(\n \"@namera-ai/cli/ConfigManager\",\n);\n\n/**\n * Live layer that persists CLI entities in the user's config directory.\n */\nexport const layer = Layer.effect(\n ConfigManager,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const getConfigDirPath = () =>\n Effect.gen(function* () {\n const homeDir = yield* Effect.sync(() => os.homedir());\n const baseDir = path.join(homeDir, \".namera\");\n\n return baseDir;\n });\n\n const ensureConfigDirExists = () =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n\n const subDirs = [\"smart-accounts\", \"session-keys\", \"keystores\"];\n\n const directoriesToCreate = subDirs.map((dir) =>\n path.join(baseDir, dir),\n );\n\n yield* Effect.forEach(\n directoriesToCreate,\n (dirPath) =>\n fs.makeDirectory(dirPath, { recursive: true }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: \"InitializationError\",\n message: e.message,\n }),\n ),\n ),\n ),\n { concurrency: \"unbounded\" },\n );\n });\n\n const getEntityPath = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n const entityPath = path.join(baseDir, `${entity.type}s`, entity.alias);\n return entityPath;\n });\n\n const checkEntityExists = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n const exists = yield* fs.exists(entityPath).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n return exists;\n });\n\n const getEntity = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n const exists = yield* checkEntityExists(entity);\n\n if (exists) {\n const content = yield* fs.readFileString(entityPath);\n\n return {\n alias: entity.alias,\n content,\n path: entityPath,\n type: entity.type,\n } satisfies Entity<TEntityType>;\n }\n\n return yield* Effect.fail(\n new ConfigManagerError({\n code: \"EntityNotFound\",\n message: `${entityName[entity.type]} with alias ${entity.alias} does not exist`,\n }),\n );\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const getEntitiesForType = <TEntityType extends EntityType>(\n type: TEntityType,\n ) =>\n Effect.gen(function* () {\n const baseDir = yield* getConfigDirPath();\n\n const entitiesDir = path.join(baseDir, `${type}s`);\n const entities = yield* fs.readDirectory(entitiesDir);\n\n const effects = entities.map((entityName) =>\n Effect.gen(function* () {\n const entityPath = path.join(entitiesDir, entityName);\n const content = yield* fs.readFileString(entityPath);\n\n return {\n alias: entityName,\n content,\n path: entityPath,\n type,\n } satisfies Entity<TEntityType>;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const storeEntity = <TEntityType extends EntityType>(\n entity: Entity<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n\n const exists = yield* checkEntityExists({\n alias: entity.alias,\n type: entity.type,\n });\n\n if (exists) {\n return yield* Effect.fail(\n new ConfigManagerError({\n code: \"EntityAlreadyExists\",\n message: `Entity ${entity.alias} already exists`,\n }),\n );\n }\n\n yield* fs.writeFileString(entityPath, entity.content);\n\n return {\n alias: entity.alias,\n content: entity.content,\n path: entityPath,\n type: entity.type,\n } satisfies Entity<TEntityType>;\n }).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n\n const removeEntity = <TEntityType extends EntityType>(\n entity: GetEntityParams<TEntityType>,\n ) =>\n Effect.gen(function* () {\n const entityPath = yield* getEntityPath(entity);\n\n yield* fs.remove(entityPath).pipe(\n Effect.catchTag(\"PlatformError\", (e) =>\n Effect.fail(\n new ConfigManagerError({\n code: e.reason._tag,\n message: e.message,\n }),\n ),\n ),\n );\n });\n\n return ConfigManager.of({\n checkEntityExists,\n ensureConfigDirExists,\n getConfigDirPath,\n getEntitiesForType,\n getEntity,\n getEntityPath,\n storeEntity,\n removeEntity,\n });\n }),\n);\n","import { Data, Effect, Layer, type Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport { type Hex, hexToBytes, isHex } from \"viem\";\n\nimport { type EntityType, entityName } from \"@/types\";\n\nimport { ConfigManager } from \"./config\";\n\n/**\n * Effect service for interactive CLI prompts.\n */\nexport type PromptManager = {\n /**\n * Prompts for an alias and validates it against existing storage.\n *\n * @param params - Prompt text, entity type, and expected alias semantics.\n */\n aliasPrompt: (\n params: AliasPromptParams,\n ) => Effect.Effect<string, QuitError, Prompt.Environment>;\n /**\n * Prompts for a password, optionally validating the input.\n *\n * @param params - Prompt text and optional validator.\n * @returns The redacted password.\n */\n passwordPrompt: (\n params: PasswordPromptParams,\n ) => Effect.Effect<Redacted.Redacted<string>, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to select a value from a list of choices.\n *\n * @param params - Selection prompt options and choices.\n * @returns The selected value.\n */\n selectPrompt: <const A>(\n params: Prompt.SelectOptions<A>,\n ) => Effect.Effect<A, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to enter a hex value.\n *\n * @param params - Prompt text and expected length of the hex value.\n * @returns The hex value entered by the user.\n */\n hexPrompt: <TRedacted extends boolean>(\n params: HexPromptParams<TRedacted>,\n ) => Effect.Effect<\n TRedacted extends true ? Redacted.Redacted<Hex> : Hex,\n QuitError,\n Prompt.Environment\n >;\n /**\n * Prompt the user to select multiple options from a list.\n *\n * @param params - Prompt options and multi-select options.\n * @returns A list of selected options.\n */\n multiSelectPrompt: <const A>(\n params: Prompt.SelectOptions<A> & Prompt.MultiSelectOptions,\n ) => Effect.Effect<A[], QuitError, Prompt.Environment>;\n};\n\n/**\n * Service tag for resolving {@link PromptManager} from the Effect context.\n */\nexport const PromptManager = ServiceMap.Service<PromptManager>(\n \"@namera-ai/cli/PromptManager\",\n);\n\n/**\n * Domain error for prompt-related failures.\n */\nexport class PromptManagerError extends Data.TaggedError(\n \"@namera-ai/cli/PromptManagerError\",\n)<{\n code: \"\";\n message: string;\n}> {}\n\n/**\n * Parameters for prompting a user for an entity alias.\n */\nexport type AliasPromptParams = {\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Entity type used to validate alias existence.\n */\n type: EntityType;\n /**\n * Whether the alias must be new or already exist.\n */\n aliasType: \"new\" | \"existing\";\n};\n\n/**\n * Parameters for prompting a user for a password.\n */\nexport type PasswordPromptParams = {\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Optional validator returning the original value or a failure message.\n */\n validate?: (v: string) => Effect.Effect<string, string, never>;\n};\n\n/**\n * Parameters for prompting a user for a hex value.\n */\nexport type HexPromptParams<TRedacted extends boolean> = {\n /**\n * Expected length of the hex value.\n */\n length: number;\n /**\n * Prompt message shown to the user.\n */\n message: string;\n /**\n * Whether the hex value should be redacted.\n */\n redacted: TRedacted;\n};\n\n/**\n * Live layer that validates and returns interactive prompt input.\n */\nexport const layer = Layer.effect(\n PromptManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n\n const aliasPrompt = (params: AliasPromptParams) =>\n Effect.gen(function* () {\n const alias = yield* Prompt.text({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Alias cannot be empty\");\n }\n\n const exists = yield* configManager\n .checkEntityExists({\n alias: v,\n type: params.type,\n })\n .pipe(\n Effect.catchTag(\"@namera-ai/cli/ConfigManagerError\", (e) =>\n Effect.fail(e.message),\n ),\n );\n\n if (params.aliasType === \"new\" && exists) {\n return yield* Effect.fail(\n `${entityName[params.type]} with alias ${v} already exists`,\n );\n }\n\n if (params.aliasType === \"existing\" && !exists) {\n return yield* Effect.fail(\n `${entityName[params.type]} with alias ${v} does not exist`,\n );\n }\n\n return v;\n }),\n });\n\n return alias;\n });\n\n const passwordPrompt = (params: PasswordPromptParams) =>\n Effect.gen(function* () {\n const password = yield* Prompt.password({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n if (params.validate) {\n return yield* params.validate(v);\n }\n\n return v;\n }),\n });\n\n return password;\n });\n\n const selectPrompt = <const A>(params: Prompt.SelectOptions<A>) =>\n Effect.gen(function* () {\n return yield* Prompt.select(params);\n });\n\n const multiSelectPrompt = <const A>(\n params: Prompt.SelectOptions<A> & Prompt.MultiSelectOptions,\n ) =>\n Effect.gen(function* () {\n return yield* Prompt.multiSelect(params);\n });\n\n function hexPrompt(\n params: HexPromptParams<true>,\n ): Effect.Effect<Redacted.Redacted<Hex>, QuitError, Prompt.Environment>;\n\n function hexPrompt(\n params: HexPromptParams<false>,\n ): Effect.Effect<Hex, QuitError, Prompt.Environment>;\n\n function hexPrompt(params: HexPromptParams<boolean>) {\n return Effect.gen(function* () {\n const validate = (v: string) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Hex cannot be empty\");\n }\n\n if (!isHex(v)) {\n return yield* Effect.fail(\"Invalid hex value\");\n }\n\n const len = hexToBytes(v).length;\n\n if (len !== params.length) {\n return yield* Effect.fail(\n `Hex value must be ${params.length} bytes`,\n );\n }\n\n return v;\n });\n\n if (params.redacted) {\n return yield* Prompt.password({\n message: params.message,\n validate,\n });\n }\n\n return yield* Prompt.text({\n message: params.message,\n validate,\n });\n });\n }\n\n return PromptManager.of({\n aliasPrompt,\n passwordPrompt,\n selectPrompt,\n hexPrompt,\n multiSelectPrompt,\n });\n }),\n);\n","import { Wallet as EthereumJSWallet, Wallet } from \"@ethereumjs/wallet\";\nimport { Data, Effect, Layer, Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport type { Environment } from \"effect/unstable/cli/Prompt\";\nimport { type Hex, hexToBytes, toHex } from \"viem\";\nimport { type LocalAccount, privateKeyToAccount } from \"viem/accounts\";\n\nimport type {\n CreateKeystoreParams,\n DecryptKeystoreParams,\n DecryptKeystoreResponse,\n GetKeystoreParams,\n GetSignerParams,\n ImportKeystoreParams,\n Keystore,\n KeystoreData,\n RemoveKeystoreParams,\n} from \"@/dto\";\n\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { PromptManager } from \"./prompt\";\n\n/**\n * Effect service for keystore CRUD, selection, and decryption operations.\n */\nexport type KeystoreManager = {\n /**\n * Loads a keystore by alias and parses it into a typed keystore data object.\n *\n * @param params - Alias for the keystore to load.\n */\n getKeystore: (\n params: GetKeystoreParams,\n ) => Effect.Effect<KeystoreData, ConfigManagerError | KeystoreManagerError>;\n /**\n * Lists all stored keystores, parsing each into a typed keystore data object.\n */\n listKeystores: () => Effect.Effect<\n KeystoreData[],\n ConfigManagerError | KeystoreManagerError\n >;\n /**\n * Opens an interactive prompt to select a keystore from stored entries.\n *\n * @param params - Prompt message.\n */\n selectKeystore: (params: {\n message: string;\n }) => Effect.Effect<\n KeystoreData,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Environment\n >;\n /**\n * Creates a new random wallet, encrypts it, and stores as a keystore.\n *\n * @param params - Alias and password used for the new keystore.\n */\n createKeystore: (\n params: CreateKeystoreParams,\n ) => Effect.Effect<KeystoreData, ConfigManagerError | KeystoreManagerError>;\n /**\n * Decrypts a keystore and returns key material.\n *\n * @param params - Alias and password for the keystore to decrypt.\n */\n decryptKeystore: (\n params: DecryptKeystoreParams,\n ) => Effect.Effect<\n DecryptKeystoreResponse,\n KeystoreManagerError | ConfigManagerError\n >;\n /**\n * Imports a keystore from a private key and stores as a keystore.\n *\n * @param params - Alias and private key for the keystore to import.\n */\n importKeystore: (\n params: ImportKeystoreParams,\n ) => Effect.Effect<\n KeystoreData,\n ConfigManagerError | KeystoreManagerError,\n never\n >;\n /**\n * Removes a keystore from storage.\n *\n * @param params - Alias of the keystore to remove.\n */\n removeKeystore: (params: {\n readonly alias: string;\n }) => Effect.Effect<void, ConfigManagerError | KeystoreManagerError, never>;\n getSigner: (\n params: GetSignerParams,\n ) => Effect.Effect<LocalAccount, ConfigManagerError | KeystoreManagerError>;\n /**\n * Prompts the user to enter the password for a keystore.\n *\n * @param params - Alias of the keystore and message to display.\n * @returns The password for the keystore.\n */\n getKeystorePassword: (params: {\n alias: string;\n message: string;\n }) => Effect.Effect<\n Redacted.Redacted<string>,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Prompt.Environment\n >;\n};\n\n/**\n * Service tag for resolving {@link KeystoreManager} from the Effect context.\n */\nexport const KeystoreManager = ServiceMap.Service<KeystoreManager>(\n \"@namera-ai/cli/KeystoreManager\",\n);\n\n/**\n * Domain error for keystore management operations.\n */\nexport class KeystoreManagerError extends Data.TaggedError(\n \"@namera-ai/cli/KeystoreManagerError\",\n)<{\n code:\n | \"KeystoreParseError\"\n | \"KeystoreAlreadyExists\"\n | \"KeystoreCreationFailed\"\n | \"KeystoreDecryptionFailed\"\n | \"KeystoreNotFound\"\n | \"DecryptError\";\n message: string;\n}> {}\n\n/**\n * Live layer wiring the keystore manager with configuration and prompts.\n */\nexport const layer = Layer.effect(\n KeystoreManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const promptManager = yield* PromptManager;\n\n const getKeystore = (params: GetKeystoreParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"keystore\",\n });\n\n const parsedKeystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(res.content) as Keystore,\n });\n\n const wallet: KeystoreData = {\n alias: res.alias,\n data: {\n ...parsedKeystore,\n address: `0x${parsedKeystore.address}`,\n },\n path: res.path,\n };\n\n return wallet;\n });\n\n const listKeystores = () =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"keystore\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsedKeystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(entity.content) as Keystore,\n });\n\n const wallet: KeystoreData = {\n alias: entity.alias,\n data: {\n ...parsedKeystore,\n address: `0x${parsedKeystore.address}`,\n },\n path: entity.path,\n };\n\n return wallet;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n });\n\n const createKeystore = (params: CreateKeystoreParams) =>\n Effect.gen(function* () {\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"keystore\",\n });\n\n // Check if alias is already taken\n const aliasTaken = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (aliasTaken) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreAlreadyExists\",\n message: `Keystore with alias ${params.alias} already exists`,\n }),\n );\n }\n\n const keystoreString = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreCreationFailed\",\n message: \"Failed to create keystore\",\n }),\n try: () => EthereumJSWallet.generate().toV3String(params.password),\n });\n\n // Store Entity\n yield* configManager.storeEntity({\n alias: params.alias,\n content: keystoreString,\n path: entityPath,\n type: \"keystore\",\n });\n\n const keystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(keystoreString) as Keystore,\n });\n\n const data: KeystoreData = {\n alias: params.alias,\n data: {\n ...keystore,\n address: `0x${keystore.address}`,\n },\n path: entityPath,\n };\n\n return data;\n });\n\n const decryptKeystore = (params: DecryptKeystoreParams) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({\n alias: params.alias,\n });\n\n const wallet = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreDecryptionFailed\",\n message: \"Failed to decrypt keystore\",\n }),\n try: () => EthereumJSWallet.fromV3(keystore.data, params.password),\n });\n\n return {\n address: wallet.getChecksumAddressString(),\n alias: params.alias,\n privateKey: Redacted.make(wallet.getPrivateKeyString()),\n publicKey: wallet.getPublicKeyString(),\n };\n });\n\n const selectKeystore = (params: { message: string }) =>\n Effect.gen(function* () {\n const keystores = yield* listKeystores();\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: keystores.map((k) => ({\n title: k.alias,\n value: k,\n description: k.data.address,\n })) satisfies Prompt.SelectChoice<KeystoreData>[],\n });\n\n return res;\n });\n\n const importKeystore = (params: ImportKeystoreParams) =>\n Effect.gen(function* () {\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"keystore\",\n });\n\n // Check if alias is already taken\n const aliasTaken = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (aliasTaken) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreAlreadyExists\",\n message: `Keystore with alias ${params.alias} already exists`,\n }),\n );\n }\n\n const keystoreString = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreCreationFailed\",\n message: \"Failed to create keystore\",\n }),\n try: () =>\n EthereumJSWallet.fromPrivateKey(\n hexToBytes(params.privateKey as Hex),\n ).toV3String(params.password),\n });\n\n // Store Entity\n yield* configManager.storeEntity({\n alias: params.alias,\n content: keystoreString,\n path: entityPath,\n type: \"keystore\",\n });\n\n const keystore = yield* Effect.try({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreParseError\",\n message: \"Unable to parse keystore\",\n }),\n try: () => JSON.parse(keystoreString) as Keystore,\n });\n\n const data: KeystoreData = {\n alias: params.alias,\n data: keystore,\n path: entityPath,\n };\n\n return data;\n });\n\n const removeKeystore = (params: RemoveKeystoreParams) =>\n Effect.gen(function* () {\n // Check if alias exists\n const exists = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"keystore\",\n });\n\n if (!exists) {\n return yield* Effect.fail(\n new KeystoreManagerError({\n code: \"KeystoreNotFound\",\n message: `Keystore with alias ${params.alias} does not exist`,\n }),\n );\n }\n\n return yield* configManager.removeEntity({\n alias: params.alias,\n type: \"keystore\",\n });\n });\n\n const getSigner = (params: GetSignerParams) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({ alias: params.alias });\n\n const wallet = yield* Effect.tryPromise({\n catch: () =>\n new KeystoreManagerError({\n code: \"KeystoreDecryptionFailed\",\n message: \"Failed to decrypt keystore\",\n }),\n try: () => EthereumJSWallet.fromV3(keystore.data, params.password),\n });\n\n return privateKeyToAccount(\n toHex(wallet.getPrivateKey()),\n ) as LocalAccount;\n });\n\n const getKeystorePassword = (params: { alias: string; message: string }) =>\n Effect.gen(function* () {\n const keystore = yield* getKeystore({ alias: params.alias });\n\n const password = yield* promptManager.passwordPrompt({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n yield* Effect.tryPromise({\n try: () => Wallet.fromV3(keystore.data, v),\n catch: () =>\n new KeystoreManagerError({\n code: \"DecryptError\",\n message: `Invalid password for keystore ${params.alias}`,\n }),\n }).pipe(Effect.catch(() => Effect.fail(\"Invalid password\")));\n\n return v;\n }),\n });\n\n return password;\n });\n\n return KeystoreManager.of({\n createKeystore,\n decryptKeystore,\n getKeystore,\n listKeystores,\n selectKeystore,\n importKeystore,\n removeKeystore,\n getSigner,\n getKeystorePassword,\n });\n }),\n);\n","import { ServiceMap } from \"effect\";\nimport type { LocalAccount } from \"viem\";\n\nimport type { LocalSmartAccount, SessionKeyData } from \"@/dto\";\n\nexport type McpContext = {\n smartAccount: LocalSmartAccount;\n sessionKeys: (SessionKeyData & {\n signer: LocalAccount;\n })[];\n};\n\nexport const McpContext = ServiceMap.Service<McpContext>(\n \"@namera-ai/cli/McpContext\",\n);\n","import { Schema } from \"effect\";\n\nexport const EmptyArgs = Schema.Record(Schema.String, Schema.Unknown);\n\nexport class InsufficientPermissions extends Schema.TaggedErrorClass<InsufficientPermissions>()(\n \"InsufficientPermissions\",\n {},\n) {}\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { EmptyArgs } from \"@/mcp/helpers/common\";\n\nexport const GetAddressTool = Tool.make(\"get_wallet_address\", {\n dependencies: [McpContext],\n description: \"Get the address of the wallet\",\n failure: Schema.Never,\n parameters: EmptyArgs,\n success: Schema.String,\n});\n\nexport const getAddressToolHandler = () =>\n Effect.gen(function* () {\n const context = yield* McpContext;\n\n return context.smartAccount.smartAccountAddress;\n });\n","import { Config, Effect, Layer, Redacted, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport {\n type Chain,\n type Client,\n createPublicClient,\n type HttpTransport,\n http,\n} from \"viem\";\n\nimport {\n type ChainWithMetadata,\n getChain,\n type SupportedChain,\n supportedChains,\n} from \"@/schema\";\n\nimport { PromptManager } from \"./prompt\";\n\nexport type Web3Service = {\n /**\n * Creates a viem public client for the requested chain.\n *\n * Falls back to an environment-derived RPC URL when not explicitly provided.\n *\n * @param params - Chain key and optional RPC URL override.\n */\n getPublicClient: (\n params: GetPublicClientParams,\n ) => Effect.Effect<Client<HttpTransport, Chain, undefined>>;\n /**\n * Prompts the user to select a single supported chain.\n *\n * @param params - Prompt message to display.\n */\n selectChain: (params: {\n message: string;\n }) => Effect.Effect<SupportedChain, QuitError, Prompt.Environment>;\n /**\n * Prompts the user to select one or more supported chains.\n *\n * @param params - Prompt message to display.\n */\n multiSelectChain: (params: {\n message: string;\n }) => Effect.Effect<SupportedChain[], QuitError, Prompt.Environment>;\n /**\n * Creates a viem bundler transport for the requested chain.\n *\n * Falls back to an environment-derived RPC URL when not explicitly provided.\n *\n * @param params - Chain key and optional RPC URL override.\n */\n getBundlerTransport: (\n params: GetBundlerClientParams,\n ) => Effect.Effect<HttpTransport<undefined, false>, never, never>;\n};\n\n/**\n * Parameters for constructing a public client.\n */\ntype GetPublicClientParams = {\n /**\n * Target chain identifier key.\n */\n chain: SupportedChain;\n /**\n * Optional RPC URL override for the chain.\n */\n rpcUrl?: string;\n};\n\nexport type GetBundlerClientParams = {\n /**\n * Target chain identifier key.\n */\n chain: SupportedChain;\n /**\n * Optional RPC URL override for the chain.\n *\n */\n bundlerUrl?: string;\n};\n\n/**\n * Service tag for resolving {@link Web3Service} from the Effect context.\n */\nexport const Web3Service = ServiceMap.Service<Web3Service>(\n \"@namera-ai/cli/Web3Service\",\n);\n\n/**\n * Live layer that wires web3 clients and chain selection prompts.\n */\nexport const layer = Layer.effect(\n Web3Service,\n Effect.gen(function* () {\n const promptManager = yield* PromptManager;\n\n const chainNameToEnvVar = (chain: SupportedChain, suffix: string) => {\n return `${chain.replaceAll(\"-\", \"_\").toUpperCase()}_${suffix}`;\n };\n\n const getRpcUrl = (params: GetPublicClientParams) =>\n Effect.gen(function* () {\n let rpcUrl: string | undefined;\n\n if (params.rpcUrl) {\n rpcUrl = params.rpcUrl;\n } else {\n // check env\n const envVarName = chainNameToEnvVar(params.chain, \"RPC_URL\");\n const envRpcUrl = yield* Config.option(Config.redacted(envVarName));\n\n if (envRpcUrl._tag === \"Some\") {\n rpcUrl = Redacted.value(envRpcUrl.value);\n } else {\n rpcUrl = undefined;\n }\n }\n\n return rpcUrl;\n }).pipe(Effect.orDie);\n\n const getBundlerUrl = (params: GetBundlerClientParams) =>\n Effect.gen(function* () {\n let bundlerUrl: string | undefined;\n\n if (params.bundlerUrl) {\n bundlerUrl = params.bundlerUrl;\n } else {\n // check env\n const envVarName = chainNameToEnvVar(params.chain, \"BUNDLER_URL\");\n const envRpcUrl = yield* Config.option(Config.redacted(envVarName));\n\n if (envRpcUrl._tag === \"Some\") {\n bundlerUrl = Redacted.value(envRpcUrl.value);\n } else {\n const chain = getChain(params.chain);\n // Defaults to Pimlico Public RPC\n bundlerUrl = `https://public.pimlico.io/v2/${chain.id}/rpc`;\n }\n }\n\n return bundlerUrl;\n }).pipe(Effect.orDie);\n\n const getPublicClient = (params: GetPublicClientParams) =>\n Effect.gen(function* () {\n const rpcUrl = yield* getRpcUrl(params);\n const chain = getChain(params.chain);\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n return client;\n });\n\n const getBundlerTransport = (params: GetBundlerClientParams) =>\n Effect.gen(function* () {\n const bundlerUrl = yield* getBundlerUrl(params);\n return http(bundlerUrl);\n });\n\n const selectChain = (params: { message: string }) =>\n Effect.gen(function* () {\n const chains = Object.values(supportedChains) as ChainWithMetadata[];\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: chains.map((c) => ({\n title: c.name,\n value: c.key as SupportedChain,\n })) satisfies Prompt.SelectChoice<SupportedChain>[],\n });\n\n return res;\n });\n\n const multiSelectChain = (params: { message: string }) =>\n Effect.gen(function* () {\n const chains = Object.values(supportedChains) as ChainWithMetadata[];\n\n const res = yield* promptManager.multiSelectPrompt({\n message: params.message,\n choices: chains.map((c) => ({\n title: c.name,\n value: c.key as SupportedChain,\n })) satisfies Prompt.SelectChoice<SupportedChain>[],\n min: 1,\n });\n\n return res;\n });\n\n return Web3Service.of({\n getPublicClient,\n selectChain,\n multiSelectChain,\n getBundlerTransport,\n });\n }),\n);\n","/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */\nimport type {\n CallPolicyParams,\n Policy,\n SignatureCallerPolicyParams,\n TimestampPolicyParams,\n} from \"@namera-ai/sdk/policy\";\nimport {\n createSessionKeyClient,\n deserializePermissionAccountParams,\n} from \"@namera-ai/sdk/session-key\";\nimport { Effect } from \"effect\";\n\nimport type { SessionKeyData } from \"@/dto\";\nimport { McpContext, Web3Service } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nimport { chainIdToChainName } from \"../../schema/chain\";\nimport type { AnyOperation, PolicyMap } from \"../types\";\nimport { InsufficientPermissions } from \"./common\";\n\ntype PolicyParams = Policy[\"policyParams\"];\n\nconst toPolicyMap = (policies: PolicyParams[]): PolicyMap | null => {\n const map: PolicyMap = {};\n\n for (const p of policies) {\n if (p.type === \"timestamp\") {\n if (map.timestamp) return null; // Gracefully invalidate this key\n map.timestamp = p;\n }\n if (p.type === \"call\") {\n if (map.call) return null;\n map.call = p;\n }\n if (p.type === \"signature-caller\") {\n if (map.signatureCaller) return null;\n map.signatureCaller = p;\n }\n if (p.type === \"gas\") {\n if (map.gas) return null;\n map.gas = p;\n }\n if (p.type === \"rate-limit\") {\n if (map.rateLimit) return null;\n map.rateLimit = p;\n }\n if (p.type === \"sudo\") {\n if (map.sudo) return null;\n map.sudo = p;\n }\n }\n\n return map;\n};\n\nexport function evaluateTimestamp(\n policy: TimestampPolicyParams,\n _chainIds: number[],\n _operation: AnyOperation,\n): boolean {\n // validAfter: the time after which the signer becomes valid.\n // If not specified (or 0), the signer is immediately valid.\n //\n // validUntil: the time before which the signer is valid.\n // If not specified, the signer never expires.\n const now = Date.now(); // ms\n\n if (policy.validAfter !== undefined && now < policy.validAfter * 1000) {\n return false;\n }\n\n if (policy.validUntil !== undefined && now >= policy.validUntil * 1000) {\n return false;\n }\n\n return true;\n}\n\nexport function evaluateSignature(\n policy: SignatureCallerPolicyParams,\n chainIds: number[],\n operation: Extract<AnyOperation, { intent: \"sign\" }>,\n): boolean {\n const callers = operation.allowedCallers;\n\n if (!callers || callers.length === 0) return false;\n if (!chainIds.includes(operation.chainId)) return false;\n\n // every caller must be allowed\n return callers.every((caller) => policy.allowedCallers.includes(caller));\n}\n\nexport function evaluateCall(\n policy: CallPolicyParams,\n chainIds: number[],\n operation: Extract<AnyOperation, { intent: \"transaction\" }>,\n): boolean {\n const permissions = policy.permissions ?? [];\n if (permissions.length === 0) return false;\n\n const { batches } = operation;\n\n if (batches.length === 0) return false;\n\n return batches.every((batch) => {\n const { calls, chainId } = batch;\n\n return calls.every((call) => {\n const { to, value = 0n, data } = call;\n if (!chainIds.includes(chainId)) return false;\n\n return permissions.some((p) => {\n if (p.target !== to) return false;\n const valueLimit = p.valueLimit ?? 0n;\n if (value > valueLimit) return false;\n\n const isContractCall = data.length >= 10;\n\n if (\"functionName\" in p) {\n if (!isContractCall) return false;\n if (!p.selector) return false;\n\n const selector = data.slice(0, 10);\n if (selector !== p.selector) return false;\n\n // TODO: param rules\n return true;\n }\n\n // EOA\n return true;\n });\n });\n });\n}\n\nconst evaluateSessionKey = (\n sessionKey: SessionKeyData,\n operation: AnyOperation,\n) => {\n // Read is always allowed\n if (operation.intent === \"read\") return true;\n\n const accountParams = deserializePermissionAccountParams(\n sessionKey.data.serializedAccounts[0]?.serializedAccount ?? \"\",\n );\n\n const chainIds = sessionKey.data.serializedAccounts.map(\n (a) => getChain(a.chain).id,\n );\n\n const policies = (accountParams.permissionParams.policies ?? []).map(\n (x) => x.policyParams,\n );\n\n const p = toPolicyMap(policies);\n\n if (!p) return false;\n\n const hasSudo = Boolean(p.sudo);\n\n // A valid sudo key should not have call or signature policies attached\n if (hasSudo && (p.call || p.signatureCaller)) {\n return false;\n }\n\n if (p.timestamp && !evaluateTimestamp(p.timestamp, chainIds, operation))\n return false;\n\n // TODO: Do gas and rate limits\n\n if (!hasSudo) {\n if (operation.intent === \"transaction\") {\n if (!p.call) return false;\n if (!evaluateCall(p.call, chainIds, operation)) return false;\n }\n\n if (operation.intent === \"sign\") {\n if (!p.signatureCaller) return false;\n if (!evaluateSignature(p.signatureCaller, chainIds, operation))\n return false;\n }\n }\n\n return true;\n};\n\nexport type GetValidSessionKeysParams = {\n operation: AnyOperation;\n};\n\nexport const getValidSessionKeys = (params: GetValidSessionKeysParams) =>\n Effect.gen(function* () {\n const context = yield* McpContext.McpContext;\n const { sessionKeys } = context;\n\n const validKeys = sessionKeys.filter((sk) => {\n return evaluateSessionKey(sk, params.operation);\n });\n\n return validKeys;\n });\n\nexport const getSessionKeyClient = (params: GetValidSessionKeysParams) =>\n Effect.gen(function* () {\n const context = yield* McpContext.McpContext;\n const { sessionKeys, smartAccount } = context;\n\n const validKeys = sessionKeys.filter((sk) => {\n return evaluateSessionKey(sk, params.operation);\n });\n\n const key = validKeys[0];\n\n if (!key) return yield* Effect.fail(new InsufficientPermissions());\n\n const web3Service = yield* Web3Service.Web3Service;\n\n let chainId: number;\n\n if (params.operation.intent === \"read\") {\n chainId = params.operation.chainId;\n } else if (params.operation.intent === \"sign\") {\n chainId = params.operation.chainId;\n } else {\n chainId = params.operation.batches[0]?.chainId ?? 1;\n }\n\n const chainName = chainIdToChainName(chainId);\n const chain = getChain(chainName);\n const publicClient = yield* web3Service.getPublicClient({\n chain: chainName,\n });\n const bundlerTransport = yield* web3Service.getBundlerTransport({\n chain: chainName,\n });\n const serializedAccount =\n key.data.serializedAccounts.find((a) => a.chain === chainName)\n ?.serializedAccount ?? \"\";\n\n const accountClient = yield* Effect.promise(() =>\n createSessionKeyClient({\n type: \"ecdsa\",\n bundlerTransport,\n chain,\n client: publicClient,\n entrypointVersion: smartAccount.entryPointVersion,\n kernelVersion: smartAccount.kernelVersion,\n serializedAccount,\n signer: key.signer,\n }),\n );\n\n return accountClient;\n });\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { formatUnits } from \"viem\";\nimport { getBalance } from \"viem/actions\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, SupportedChain } from \"@/schema\";\n\nexport const GetBalanceToolParams = Schema.Struct({\n address: EthereumAddress.annotate({\n description: \"The address to get the balance for\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to get the balance for\",\n }),\n});\n\nexport const GetBalanceToolResult = Schema.Struct({\n nativeCurrency: Schema.Struct({\n name: Schema.String.annotate({\n description: \"The name of the currency\",\n }),\n symbol: Schema.String.annotate({\n description: \"The symbol of the currency\",\n }),\n decimals: Schema.Number.annotate({\n description: \"The number of decimals the currency has\",\n }),\n }).annotate({\n description: \"The native currency of the chain\",\n }),\n balance: Schema.Struct({\n amount: Schema.String.annotate({\n description: \"Balance in atomic units\",\n }),\n formatted: Schema.String.annotate({\n description: \"Balance in native currency units\",\n }),\n }),\n});\n\nexport type GetBalanceToolResult = typeof GetBalanceToolResult.Type;\nexport type GetBalanceToolParams = typeof GetBalanceToolParams.Type;\n\nexport const GetBalanceTool = Tool.make(\"get_balance\", {\n dependencies: [McpContext, Web3Service],\n description: \"Get the address of the wallet\",\n failure: InsufficientPermissions,\n parameters: GetBalanceToolParams,\n success: GetBalanceToolResult,\n});\n\nexport const getBalanceToolHandler = (params: GetBalanceToolParams) =>\n Effect.gen(function* () {\n const sessionKeyClient = yield* getSessionKeyClient({\n operation: {\n intent: \"read\",\n chainId: getChain(params.chain).id,\n },\n });\n\n const res = yield* Effect.promise(() =>\n getBalance(sessionKeyClient.client, {\n address: params.address,\n }),\n );\n\n const data = {\n nativeCurrency: sessionKeyClient.chain.nativeCurrency,\n balance: {\n amount: res.toString(),\n formatted: formatUnits(\n res,\n sessionKeyClient.chain.nativeCurrency.decimals,\n ),\n },\n };\n\n return data;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport { GetAddressTool, getAddressToolHandler } from \"./address\";\nimport { GetBalanceTool, getBalanceToolHandler } from \"./get-balance\";\n\nexport const AccountTools = Toolkit.make(GetAddressTool, GetBalanceTool);\nexport const AccountToolsHandlers = AccountTools.toLayer(\n Effect.succeed({\n get_wallet_address: getAddressToolHandler,\n get_balance: getBalanceToolHandler,\n }),\n);\n","import { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { readContract } from \"viem/actions\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, SupportedChain } from \"@/schema\";\n\nexport const ReadContractToolParams = Schema.Struct({\n chain: SupportedChain.annotate({\n description: \"The chain to use for the transfer\",\n }),\n contractAddress: EthereumAddress.annotate({\n description: \"The ethereum address of the contract to read\",\n }),\n abi: Schema.Array(Schema.Any).annotate({\n description: \"The ABI of the contract to read\",\n }),\n functionName: Schema.String.annotate({\n description: \"The name of the function to call on the contract\",\n }),\n args: Schema.Array(Schema.Any).annotate({\n description: \"The arguments to pass to the function\",\n }),\n});\n\nexport type ReadContractToolParams = typeof ReadContractToolParams.Type;\n\nexport const ReadContractTool = Tool.make(\"read_contract\", {\n dependencies: [McpContext, Web3Service],\n description: \"Read data from a specified contract.\",\n failure: InsufficientPermissions,\n parameters: ReadContractToolParams,\n success: Schema.Any.annotate({\n description: \"The data returned by the contract\",\n }),\n});\n\nexport const readContractToolHandler = (params: ReadContractToolParams) =>\n Effect.gen(function* () {\n const chain = getChain(params.chain);\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"read\",\n chainId: chain.id,\n },\n });\n\n readContract(client, {\n address: params.contractAddress,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const result = yield* Effect.promise(() =>\n readContract(client, {\n address: params.contractAddress,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n );\n\n return result;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport { ReadContractTool, readContractToolHandler } from \"./read-contract\";\n\nexport const ReadTools = Toolkit.make(ReadContractTool);\nexport const ReadToolsHandlers = ReadTools.toLayer(\n Effect.succeed({\n read_contract: (params) => readContractToolHandler(params),\n }),\n);\n","import { Schema } from \"effect\";\n\nimport { BigIntFromString, EthereumAddress, Hex } from \"./common\";\n\nexport const Call = Schema.Struct({\n to: EthereumAddress.annotate({\n description: \"The target address to call\",\n }),\n data: Hex.annotate({\n description: \"The data to send with the call\",\n }),\n value: Schema.optional(BigIntFromString).annotate({\n description: \"The value to send with the call\",\n }),\n});\n\nexport const Batch = Schema.Struct({\n chainId: Schema.Int.annotate({\n description: \"The chain ID to execute the transaction on\",\n }),\n nonceKey: Schema.optional(Schema.String).annotate({\n description: \"The nonce key to use, for 2D Parallel transactions.\",\n }),\n calls: Schema.mutable(Schema.Array(Call)),\n});\n\nexport const ExecuteTransactionParams = Schema.Struct({\n batches: Schema.mutable(Schema.Array(Batch)),\n});\n\nexport type Call = typeof Call.Type;\nexport type Batch = typeof Batch.Type;\nexport type ExecuteTransactionParams = typeof ExecuteTransactionParams.Type;\n","import { executeTransaction } from \"@namera-ai/sdk/transaction\";\nimport { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport type { Hex } from \"@/schema\";\nimport { Batch } from \"@/schema/tx\";\n\nexport const ExecuteTransactionToolParams = Batch;\n\nexport type ExecuteTransactionToolParams =\n typeof ExecuteTransactionToolParams.Type;\n\nexport const ExecuteTransactionTool = Tool.make(\"execute_transaction\", {\n dependencies: [McpContext, Web3Service],\n description: \"Send transactions.\",\n failure: InsufficientPermissions,\n parameters: ExecuteTransactionToolParams,\n success: Schema.String.annotate({\n description: \"The transaction hash for the executed transaction.\",\n }),\n});\n\nexport const executeTransactionToolHandler = (\n params: ExecuteTransactionToolParams,\n) =>\n Effect.gen(function* () {\n const batches: Batch[] = [\n {\n chainId: params.chainId,\n nonceKey: params.nonceKey,\n calls: params.calls,\n },\n ];\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"transaction\",\n batches,\n },\n });\n\n const txHashes = yield* Effect.promise(() =>\n executeTransaction({\n clients: [client],\n batches,\n }),\n );\n\n return txHashes[0]?.receipt.transactionHash as Hex;\n });\n","import { executeTransaction } from \"@namera-ai/sdk/transaction\";\nimport { Effect, Schema } from \"effect\";\nimport { Tool } from \"effect/unstable/ai\";\nimport { parseUnits } from \"viem\";\n\nimport { McpContext } from \"@/layers/mcp-context\";\nimport { Web3Service } from \"@/layers/web3\";\nimport { getSessionKeyClient, InsufficientPermissions } from \"@/mcp/helpers\";\nimport { EthereumAddress, getChain, type Hex, SupportedChain } from \"@/schema\";\nimport type { Batch } from \"@/schema/tx\";\n\nexport const NativeTransferToolParams = Schema.Struct({\n chain: SupportedChain.annotate({\n description: \"The chain to use for the transfer\",\n }),\n address: EthereumAddress.annotate({\n description: \"The ethereum address to transfer to\",\n }),\n amount: Schema.String.annotate({\n description: \"The amount of native tokens to transfer\",\n }),\n unit: Schema.Literals([\"wei\", \"gwei\", \"ether\"]),\n});\n\nexport type NativeTransferToolParams = typeof NativeTransferToolParams.Type;\n\nexport const NativeTransferTool = Tool.make(\"native_transfer\", {\n dependencies: [McpContext, Web3Service],\n description: \"Transfer Native Tokens to a specified address.\",\n failure: InsufficientPermissions,\n parameters: NativeTransferToolParams,\n success: Schema.String.annotate({\n description: \"The transaction hash of the transfer\",\n }),\n});\n\nexport const nativeTransferToolHandler = (params: NativeTransferToolParams) =>\n Effect.gen(function* () {\n const decimals = () => {\n if (params.unit === \"wei\") return 1;\n if (params.unit === \"gwei\") return 9;\n return 18;\n };\n\n const amount = parseUnits(params.amount.toString(), decimals());\n const chain = getChain(params.chain);\n\n const batches: Batch[] = [\n {\n chainId: chain.id,\n calls: [\n {\n to: params.address,\n value: amount,\n data: \"0x\",\n },\n ],\n },\n ];\n\n const client = yield* getSessionKeyClient({\n operation: {\n intent: \"transaction\",\n batches,\n },\n });\n\n const txHashes = yield* Effect.promise(() =>\n executeTransaction({\n clients: [client],\n batches,\n }),\n );\n\n return txHashes[0]?.receipt.transactionHash as Hex;\n });\n","import { Effect } from \"effect\";\nimport { Toolkit } from \"effect/unstable/ai\";\n\nimport {\n ExecuteTransactionTool,\n executeTransactionToolHandler,\n} from \"./execute-transaction\";\nimport {\n NativeTransferTool,\n nativeTransferToolHandler,\n} from \"./native-transfer\";\n\nexport const TransactionTools = Toolkit.make(\n NativeTransferTool,\n ExecuteTransactionTool,\n);\nexport const TransactionToolsHandlers = TransactionTools.toLayer(\n Effect.succeed({\n native_transfer: (params) => nativeTransferToolHandler(params),\n execute_transaction: (params) => executeTransactionToolHandler(params),\n }),\n);\n","import { Layer } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\n\nimport { AccountTools, AccountToolsHandlers } from \"./tools/account\";\nimport { ReadTools, ReadToolsHandlers } from \"./tools/read\";\nimport {\n TransactionTools,\n TransactionToolsHandlers,\n} from \"./tools/transaction\";\n\nconst Account = Layer.effectDiscard(\n McpServer.registerToolkit(AccountTools),\n).pipe(Layer.provideMerge(AccountToolsHandlers));\n\nconst Transfer = Layer.effectDiscard(\n McpServer.registerToolkit(TransactionTools),\n).pipe(Layer.provideMerge(TransactionToolsHandlers));\n\nconst Read = Layer.effectDiscard(McpServer.registerToolkit(ReadTools)).pipe(\n Layer.provideMerge(ReadToolsHandlers),\n);\n\nexport const McpLive = Layer.mergeAll(Account, Transfer, Read);\n","import { createServer } from \"node:http\";\n\nimport { NodeHttpServer, NodeStdio } from \"@effect/platform-node\";\nimport { Layer, Logger } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\nimport { HttpRouter } from \"effect/unstable/http\";\n\nimport { McpLive } from \"./mcp\";\n\nconst MCP_SERVER_NAME = \"Namera MCP Server\";\nconst MCP_SERVER_VERSION = \"0.0.1\";\n\nconst McpRouter = McpLive.pipe(\n Layer.provideMerge(\n McpServer.layerHttp({\n name: MCP_SERVER_NAME,\n path: \"/mcp\",\n version: MCP_SERVER_VERSION,\n }),\n ),\n Layer.provideMerge(\n HttpRouter.cors({\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"mcp-session-id\",\n \"mcp-protocol-version\",\n ],\n allowedMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedOrigins: [\"*\"],\n credentials: false,\n exposedHeaders: [\"mcp-session-id\", \"mcp-protocol-version\"],\n }),\n ),\n);\n\nconst McpStdio = McpLive.pipe(\n Layer.provideMerge(\n McpServer.layerStdio({\n name: MCP_SERVER_NAME,\n version: MCP_SERVER_VERSION,\n }),\n ),\n Layer.provide(NodeStdio.layer),\n Layer.provide(Layer.succeed(Logger.LogToStderr)(true)),\n);\n\nexport const startMcpHttpServer = (port: number) =>\n Layer.launch(\n HttpRouter.serve(McpRouter).pipe(\n Layer.provideMerge(NodeHttpServer.layer(createServer, { port })),\n ),\n );\n\nexport const startMcpStdioServer = () => Layer.launch(McpStdio);\n","/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */\nimport {\n CallPolicyVersion,\n CallType,\n ParamCondition as ParamConditionCore,\n type Policy,\n toCallPolicy,\n toGasPolicy,\n toRateLimitPolicy,\n toSignatureCallerPolicy,\n toSudoPolicy,\n toTimestampPolicy,\n} from \"@namera-ai/sdk/policy\";\n\nimport type { CallPolicyParams, PolicyParams } from \"@/schema\";\nimport type { ParamCondition } from \"@/schema/policy\";\n\nconst toCallPolicyVersion = (\n version: CallPolicyParams[\"policyVersion\"],\n): CallPolicyVersion => {\n switch (version) {\n case \"0.0.1\":\n return CallPolicyVersion.V0_0_1;\n case \"0.0.2\":\n return CallPolicyVersion.V0_0_2;\n case \"0.0.3\":\n return CallPolicyVersion.V0_0_3;\n case \"0.0.4\":\n return CallPolicyVersion.V0_0_4;\n case \"0.0.5\":\n return CallPolicyVersion.V0_0_5;\n default:\n throw new Error(\"Invalid call policy version\");\n }\n};\n\nconst conditionToParamCondition = (\n condition: ParamCondition,\n): ParamConditionCore => {\n if (condition === \"EQUAL\") return ParamConditionCore.EQUAL;\n if (condition === \"GREATER_THAN\") return ParamConditionCore.GREATER_THAN;\n if (condition === \"LESS_THAN\") return ParamConditionCore.LESS_THAN;\n if (condition === \"GREATER_THAN_OR_EQUAL\")\n return ParamConditionCore.GREATER_THAN_OR_EQUAL;\n if (condition === \"LESS_THAN_OR_EQUAL\")\n return ParamConditionCore.LESS_THAN_OR_EQUAL;\n if (condition === \"NOT_EQUAL\") return ParamConditionCore.NOT_EQUAL;\n if (condition === \"ONE_OF\") return ParamConditionCore.ONE_OF;\n if (condition === \"SLICE_EQUAL\") return ParamConditionCore.SLICE_EQUAL;\n return ParamConditionCore.EQUAL;\n};\n\nexport const policyParamsToPolicies = (params: PolicyParams[]) => {\n const policies: Policy[] = [];\n\n for (const param of params) {\n if (param.type === \"sudo\") {\n policies.push(toSudoPolicy({}));\n } else if (param.type === \"timestamp\") {\n policies.push(toTimestampPolicy(param));\n } else if (param.type === \"gas\") {\n policies.push(toGasPolicy(param));\n } else if (param.type === \"rate-limit\") {\n policies.push(toRateLimitPolicy(param));\n } else if (param.type === \"signature-caller\") {\n policies.push(toSignatureCallerPolicy(param));\n } else if (param.type === \"call\") {\n policies.push(\n toCallPolicy({\n policyVersion: toCallPolicyVersion(param.policyVersion),\n permissions: !param.permissions\n ? undefined\n : param.permissions.map((p) => {\n const callType = (() => {\n if (!p.callType) return CallType.CALL;\n if (p.callType === \"call\") return CallType.CALL;\n if (p.callType === \"delegatecall\")\n return CallType.DELEGATE_CALL;\n return CallType.BATCH_CALL;\n })();\n\n if (\"abi\" in p) {\n return {\n callType,\n target: p.target,\n valueLimit: p.valueLimit,\n abi: p.abi,\n functionName: p.functionName,\n selector: p.selector,\n args: !p.args\n ? undefined\n : p.args.map((a) => {\n if (a === null) return null;\n const c = a.condition;\n if (c === \"ONE_OF\") {\n return {\n condition: ParamConditionCore.ONE_OF,\n value: a.value,\n };\n }\n\n if (c === \"SLICE_EQUAL\" && \"start\" in a) {\n return {\n condition: ParamConditionCore.SLICE_EQUAL,\n value: a.value,\n start: a.start,\n length: a.length,\n };\n }\n\n return {\n condition: conditionToParamCondition(c) as Exclude<\n ParamConditionCore,\n ParamConditionCore.ONE_OF\n >,\n value: a.value,\n };\n }),\n };\n }\n\n return {\n callType,\n target: p.target,\n selector: p.selector,\n valueLimit: p.valueLimit,\n rules: p.rules\n ? p.rules.map((r) => {\n return {\n offset: r.offset,\n params: r.params,\n condition: conditionToParamCondition(r.condition),\n };\n })\n : undefined,\n };\n }),\n }),\n );\n } else {\n throw new Error(\"Invalid policy type\");\n }\n }\n\n return policies;\n};\n","import { createAccountClient } from \"@namera-ai/sdk/account\";\nimport { Data, Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport type { Environment } from \"effect/unstable/cli/Prompt\";\nimport { createPublicClient, http, type PublicClient } from \"viem\";\nimport { mainnet } from \"viem/chains\";\n\nimport {\n type CreateSmartAccountParams,\n type GetSmartAccountParams,\n type GetSmartAccountStatusParams,\n type ImportSmartAccountParams,\n LocalSmartAccount,\n type LocalSmartAccountData,\n type RemoveSmartAccountParams,\n} from \"@/dto\";\n\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { KeystoreManager, type KeystoreManagerError } from \"./keystore\";\nimport { PromptManager } from \"./prompt\";\nimport { Web3Service } from \"./web3\";\n\nexport type SmartAccountManager = {\n /**\n * Loads a smart account by alias and parses the stored JSON payload.\n *\n * @param params Alias of the smart account to load.\n * @returns The parsed smart account data.\n */\n getSmartAccount: (\n params: GetSmartAccountParams,\n ) => Effect.Effect<LocalSmartAccountData, ConfigManagerError, never>;\n /**\n * Lists all locally stored smart accounts.\n *\n * @returns The list of smart account data.\n */\n listSmartAccounts: () => Effect.Effect<\n LocalSmartAccountData[],\n ConfigManagerError,\n never\n >;\n /**\n * Prompts the user to select a smart account from local storage.\n *\n * @param params - Prompt message to display.\n * @returns The selected smart account data.\n */\n selectSmartAccount: (params: {\n message: string;\n }) => Effect.Effect<\n LocalSmartAccountData,\n ConfigManagerError | KeystoreManagerError | QuitError,\n Environment\n >;\n /**\n * Creates a new smart account derived from a local keystore and index.\n *\n * @param params - Alias, owner alias, and optional index for derivation.\n * @returns The created smart account data.\n */\n createSmartAccount: (\n params: CreateSmartAccountParams,\n ) => Effect.Effect<\n LocalSmartAccountData,\n SmartAccountManagerError | ConfigManagerError | KeystoreManagerError,\n never\n >;\n /**\n * Removes a locally stored smart account by alias.\n *\n * @param params - Alias of the smart account to remove.\n */\n removeSmartAccount: (\n params: RemoveSmartAccountParams,\n ) => Effect.Effect<\n void,\n ConfigManagerError | SmartAccountManagerError,\n never\n >;\n /**\n * Checks if a smart account is deployed on the specified chain.\n *\n * @param params - Alias plus chain and optional RPC URL.\n * @returns Whether the smart account is deployed.\n */\n getSmartAccountStatus: (\n params: GetSmartAccountStatusParams,\n ) => Effect.Effect<boolean, ConfigManagerError, never>;\n /**\n * Imports a smart account with precomputed metadata and address.\n *\n * @param params - Smart account metadata and alias to store.\n * @returns The imported smart account data.\n */\n importSmartAccount: (\n params: ImportSmartAccountParams,\n ) => Effect.Effect<\n LocalSmartAccountData,\n SmartAccountManagerError | ConfigManagerError | KeystoreManagerError,\n never\n >;\n};\n\n/**\n * Service tag for resolving {@link SmartAccountManager} from the Effect context.\n */\nexport const SmartAccountManager = ServiceMap.Service<SmartAccountManager>(\n \"@namera-ai/cli/SmartAccountManager\",\n);\n\n/**\n * Domain error for smart account lifecycle operations.\n */\nexport class SmartAccountManagerError extends Data.TaggedError(\n \"@namera-ai/cli/SmartAccountManagerError\",\n)<{\n code:\n | \"KernelAddressGenerationError\"\n | \"SmartAccountAlreadyExists\"\n | \"SmartAccountNotFound\"\n | \"SmartAccountImportError\";\n message: string;\n}> {}\n\n/**\n * Live layer that manages smart account storage and derivation.\n */\nexport const layer = Layer.effect(\n SmartAccountManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const keystoreManager = yield* KeystoreManager;\n const promptManager = yield* PromptManager;\n const web3Service = yield* Web3Service;\n\n const getSmartAccount = (params: GetSmartAccountParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const parsedSmartAccount = Schema.decodeUnknownSync(\n Schema.fromJsonString(LocalSmartAccount),\n )(res.content);\n\n return {\n alias: res.alias,\n data: parsedSmartAccount,\n path: res.path,\n } satisfies LocalSmartAccountData;\n });\n\n const listSmartAccounts = () =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"smart-account\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsedSmartAccount = Schema.decodeUnknownSync(\n Schema.fromJsonString(LocalSmartAccount),\n )(entity.content);\n\n return {\n alias: entity.alias,\n data: parsedSmartAccount,\n path: entity.path,\n } satisfies LocalSmartAccountData;\n }),\n );\n\n return yield* Effect.all(effects, { concurrency: \"unbounded\" });\n });\n\n const createSmartAccount = (params: CreateSmartAccountParams) =>\n Effect.gen(function* () {\n const existingAccounts = yield* listSmartAccounts();\n\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const ownerKeystore = yield* keystoreManager.getKeystore({\n alias: params.ownerAlias,\n });\n\n const ownerSigner = yield* keystoreManager.getSigner({\n alias: params.ownerAlias,\n password: params.ownerPassword,\n });\n\n // Doesn't matter because public client is only needed for 0.6 entrypoints\n const publicClient = createPublicClient({\n chain: mainnet,\n transport: http(),\n });\n\n const entryPointVersion = \"0.7\";\n const kernelVersion = \"0.3.2\";\n const index = BigInt(params.index ?? 0);\n const ownerType = \"ecdsa\";\n\n const res = yield* Effect.tryPromise({\n try: () =>\n createAccountClient({\n type: \"ecdsa\",\n bundlerTransport: http(),\n chain: mainnet,\n client: publicClient,\n entrypointVersion: entryPointVersion,\n kernelVersion,\n signer: ownerSigner,\n }),\n catch: () =>\n new SmartAccountManagerError({\n code: \"KernelAddressGenerationError\",\n message: `Unable to compute smart account address for Address: ${ownerKeystore.data.address} and Index: ${params.index}`,\n }),\n });\n\n const saAddress = res.account.address;\n\n const exists = existingAccounts.find(\n (d) => d.data.smartAccountAddress === saAddress,\n );\n\n if (exists) {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountAlreadyExists\",\n message: `Smart account for owner: ${ownerKeystore.alias} and index: ${params.index} already exists`,\n }),\n );\n }\n\n const saData: LocalSmartAccount = {\n entryPointVersion,\n kernelVersion,\n ownerAlias: ownerKeystore.alias,\n ownerType,\n smartAccountAddress: saAddress,\n index,\n };\n\n const data: LocalSmartAccountData = {\n data: saData,\n path: entityPath,\n alias: params.alias,\n };\n\n const encoded = Schema.encodeSync(LocalSmartAccount)(saData);\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(encoded),\n path: entityPath,\n type: \"smart-account\",\n });\n\n return data;\n });\n\n const selectSmartAccount = (params: { message: string }) =>\n Effect.gen(function* () {\n const smartAccounts = yield* listSmartAccounts();\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: smartAccounts.map((a) => ({\n title: a.alias,\n value: a,\n description: a.data.smartAccountAddress,\n })) satisfies Prompt.SelectChoice<LocalSmartAccountData>[],\n });\n\n return res;\n });\n\n const removeSmartAccount = (params: RemoveSmartAccountParams) =>\n Effect.gen(function* () {\n const sa = yield* getSmartAccount({ alias: params.alias });\n\n return yield* configManager.removeEntity({\n alias: sa.alias,\n type: \"smart-account\",\n });\n });\n\n const getSmartAccountStatus = (params: GetSmartAccountStatusParams) =>\n Effect.gen(function* () {\n const sa = yield* getSmartAccount({ alias: params.alias });\n\n const publicClient = (yield* web3Service.getPublicClient({\n chain: params.chain,\n rpcUrl: params.rpcUrl,\n })) as PublicClient;\n\n const code = yield* Effect.promise(() =>\n publicClient.getCode({\n address: sa.data.smartAccountAddress,\n }),\n );\n\n return Boolean(code);\n });\n\n const importSmartAccount = (params: ImportSmartAccountParams) =>\n Effect.gen(function* () {\n const { alias, ...rest } = params;\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"smart-account\",\n });\n\n const ownerKeystore = yield* keystoreManager.getKeystore({\n alias: params.ownerAlias,\n });\n\n const allAccounts = yield* listSmartAccounts();\n\n const exists = allAccounts.find(\n (d) => d.data.smartAccountAddress === rest.smartAccountAddress,\n );\n\n if (exists) {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountAlreadyExists\",\n message: `Smart account for owner: ${ownerKeystore.alias} and address: ${rest.smartAccountAddress} already exists`,\n }),\n );\n }\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(Schema.encodeSync(LocalSmartAccount)(rest)),\n path: entityPath,\n type: \"smart-account\",\n });\n\n return {\n alias: params.alias,\n data: rest,\n path: entityPath,\n };\n });\n\n return SmartAccountManager.of({\n createSmartAccount,\n getSmartAccount,\n listSmartAccounts,\n selectSmartAccount,\n removeSmartAccount,\n getSmartAccountStatus,\n importSmartAccount,\n });\n }),\n);\n","import { Wallet } from \"@ethereumjs/wallet\";\nimport {\n createSessionKey as createNameraSessionKey,\n isSessionKeyInstalled,\n} from \"@namera-ai/sdk/session-key\";\nimport { Data, Effect, Layer, type Redacted, Schema, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { Prompt } from \"effect/unstable/cli\";\nimport { hexToBytes, toHex } from \"viem\";\nimport {\n generatePrivateKey,\n type LocalAccount,\n privateKeyToAccount,\n} from \"viem/accounts\";\n\nimport {\n type CreateSessionKeyParams,\n type Keystore,\n SessionKey,\n type SessionKeyData,\n} from \"@/dto\";\nimport { policyParamsToPolicies } from \"@/helpers/policy\";\nimport { chainIdToChainName } from \"@/schema\";\n\nimport type {\n GetSessionKeyParams,\n GetSessionKeyStatusParams,\n ListSessionKeysParams,\n RemoveSessionKeyParams,\n} from \"../dto/session-key\";\nimport { ConfigManager, type ConfigManagerError } from \"./config\";\nimport { KeystoreManager, type KeystoreManagerError } from \"./keystore\";\nimport { PromptManager } from \"./prompt\";\nimport { SmartAccountManager } from \"./smart-account\";\nimport { Web3Service } from \"./web3\";\n\nexport type SessionKeyManager = {\n createSessionKey: (\n params: CreateSessionKeyParams,\n ) => Effect.Effect<\n SessionKeyData,\n SessionKeyManagerError | ConfigManagerError | KeystoreManagerError\n >;\n getSessionKey: (\n params: GetSessionKeyParams,\n ) => Effect.Effect<\n SessionKeyData,\n SessionKeyManagerError | ConfigManagerError\n >;\n listSessionKeys: (\n params: ListSessionKeysParams,\n ) => Effect.Effect<\n SessionKeyData[],\n ConfigManagerError | SessionKeyManagerError\n >;\n selectSessionKey: (params: {\n message: string;\n }) => Effect.Effect<\n SessionKeyData,\n ConfigManagerError | SessionKeyManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeyStatus: (\n params: GetSessionKeyStatusParams,\n ) => Effect.Effect<\n boolean,\n ConfigManagerError | SessionKeyManagerError,\n never\n >;\n multiSelectSessionKeys: (params: {\n message: string;\n smartAccount?: string;\n }) => Effect.Effect<\n SessionKeyData[],\n ConfigManagerError | SessionKeyManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeyPassword: (params: {\n alias: string;\n message: string;\n }) => Effect.Effect<\n Redacted.Redacted<string>,\n SessionKeyManagerError | ConfigManagerError | QuitError,\n Prompt.Environment\n >;\n getSessionKeySigner: (params: {\n alias: string;\n password: string;\n }) => Effect.Effect<\n SessionKeyData & { signer: LocalAccount },\n SessionKeyManagerError | ConfigManagerError | QuitError,\n never\n >;\n removeSessionKey: (params: {\n readonly alias: string;\n }) => Effect.Effect<void, SessionKeyManagerError | ConfigManagerError, never>;\n};\nexport const SessionKeyManager = ServiceMap.Service<SessionKeyManager>(\n \"@namera-ai/cli/SessionKeyManager\",\n);\n\nexport class SessionKeyManagerError extends Data.TaggedError(\n \"@namera-ai/cli/SessionKeyManagerError\",\n)<{\n code:\n | \"EncryptionError\"\n | \"SessionKeyAlreadyExists\"\n | \"SessionKeyParseError\"\n | \"DecryptError\";\n message: string;\n}> {}\n\nexport const layer = Layer.effect(\n SessionKeyManager,\n Effect.gen(function* () {\n const configManager = yield* ConfigManager;\n const promptManager = yield* PromptManager;\n const keystoreManager = yield* KeystoreManager;\n const smartAccountManager = yield* SmartAccountManager;\n const web3Service = yield* Web3Service;\n\n const createSessionKey = (params: CreateSessionKeyParams) =>\n Effect.gen(function* () {\n const exists = yield* configManager.checkEntityExists({\n alias: params.alias,\n type: \"session-key\",\n });\n\n if (exists) {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyAlreadyExists\",\n message: `Session key for alias ${params.alias} already exists`,\n }),\n );\n }\n\n const entityPath = yield* configManager.getEntityPath({\n alias: params.alias,\n type: \"session-key\",\n });\n\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: params.smartAccountAlias,\n });\n\n const ownerSigner = yield* keystoreManager.getSigner({\n alias: sa.data.ownerAlias,\n password: params.ownerKeystorePassword,\n });\n const policies = policyParamsToPolicies(params.policyParams);\n\n const clients = yield* Effect.all(\n params.chains.map((chain) => web3Service.getPublicClient({ chain })),\n { concurrency: \"unbounded\" },\n );\n\n const sessionPrivateKey = generatePrivateKey();\n const sessionKeyAccount = privateKeyToAccount(sessionPrivateKey);\n\n const res = yield* Effect.promise(() =>\n createNameraSessionKey({\n type: \"ecdsa\",\n accountType: \"ecdsa\",\n sessionPrivateKey,\n clients,\n entrypointVersion: sa.data.entryPointVersion,\n kernelVersion: sa.data.kernelVersion,\n index: sa.data.index,\n signer: ownerSigner,\n policies,\n }),\n );\n\n // Encrypt Session Key\n const encData = (yield* Effect.tryPromise({\n try: () =>\n Wallet.fromPrivateKey(hexToBytes(sessionPrivateKey)).toV3(\n params.sessionKeyPassword,\n ),\n catch: () =>\n new SessionKeyManagerError({\n code: \"EncryptionError\",\n message: \"Failed to encrypt session key\",\n }),\n })) as Keystore;\n\n const data: SessionKey = {\n sessionKeyType: \"ecdsa\",\n serializedAccounts: res.serializedAccounts.map((a) => ({\n chain: chainIdToChainName(a.chainId),\n serializedAccount: a.serializedAccount,\n })),\n sessionKeyAddress: sessionKeyAccount.address,\n smartAccountAlias: sa.alias,\n ...encData,\n };\n\n yield* configManager.storeEntity({\n alias: params.alias,\n content: JSON.stringify(data),\n path: entityPath,\n type: \"session-key\",\n });\n\n return {\n alias: params.alias,\n data,\n path: entityPath,\n } satisfies SessionKeyData;\n });\n\n const getSessionKey = (params: GetSessionKeyParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntity({\n alias: params.alias,\n type: \"session-key\",\n });\n\n const parsed = Schema.decodeUnknownOption(\n Schema.fromJsonString(SessionKey),\n )(res.content);\n\n if (parsed._tag === \"None\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Unable to parse session key\",\n }),\n );\n }\n\n const data: SessionKeyData = {\n alias: res.alias,\n data: parsed.value,\n path: res.path,\n };\n\n return data;\n });\n\n const listSessionKeys = (params: ListSessionKeysParams) =>\n Effect.gen(function* () {\n const res = yield* configManager.getEntitiesForType(\"session-key\");\n\n const effects = res.map((entity) =>\n Effect.gen(function* () {\n const parsed = Schema.decodeUnknownOption(\n Schema.fromJsonString(SessionKey),\n )(entity.content);\n\n if (parsed._tag === \"None\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Unable to parse session key\",\n }),\n );\n }\n\n const data: SessionKeyData = {\n alias: entity.alias,\n data: parsed.value,\n path: entity.path,\n };\n\n return data;\n }),\n );\n\n const allKeys = yield* Effect.all(effects, {\n concurrency: \"unbounded\",\n });\n // .map((d) => (d._op === \"Success\" ? d.success : undefined))\n // .filter(Boolean) as SessionKeyData[];\n\n if (params.smartAccount) {\n return allKeys.filter(\n (k) => k.data.smartAccountAlias === params.smartAccount,\n );\n }\n\n return allKeys;\n });\n\n const selectSessionKey = (params: { message: string }) =>\n Effect.gen(function* () {\n const sessionKeys = yield* listSessionKeys({});\n\n const res = yield* promptManager.selectPrompt({\n message: params.message,\n choices: sessionKeys.map((sk) => ({\n title: sk.alias,\n value: sk,\n description: `${sk.data.sessionKeyType === \"ecdsa\" ? sk.data.sessionKeyAddress : sk.data.passKeyName} (${sk.data.smartAccountAlias})`,\n })) satisfies Prompt.SelectChoice<SessionKeyData>[],\n });\n\n return res;\n });\n\n const getSessionKeyStatus = (params: GetSessionKeyStatusParams) =>\n Effect.gen(function* () {\n const sessionKey = yield* getSessionKey({ alias: params.alias });\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: sessionKey.data.smartAccountAlias,\n });\n\n const publicClient = yield* web3Service.getPublicClient({\n chain: params.chain,\n rpcUrl: params.rpcUrl,\n });\n\n if (sessionKey.data.sessionKeyType !== \"ecdsa\") {\n return yield* Effect.fail(\n new SessionKeyManagerError({\n code: \"SessionKeyParseError\",\n message: \"Only ECDSA session keys have an on-chain status\",\n }),\n );\n }\n const sessionKeyAddress = sessionKey.data.sessionKeyAddress;\n\n const res = yield* Effect.tryPromise({\n try: () =>\n isSessionKeyInstalled(publicClient, {\n accountAddress: sa.data.smartAccountAddress,\n sessionKeyAddress,\n }),\n catch: () => false,\n }).pipe(Effect.catch(() => Effect.succeed(false)));\n\n return res;\n });\n\n const multiSelectSessionKeys = (params: {\n message: string;\n smartAccount?: string;\n }) =>\n Effect.gen(function* () {\n const allKeys = yield* listSessionKeys({\n smartAccount: params.smartAccount,\n });\n\n const res = yield* promptManager.multiSelectPrompt({\n message: params.message,\n choices: allKeys.map((k) => ({\n title: k.alias,\n value: k,\n description: `${k.data.sessionKeyType === \"ecdsa\" ? k.data.sessionKeyAddress : k.data.passKeyName} (${k.data.smartAccountAlias})`,\n })) satisfies Prompt.SelectChoice<SessionKeyData>[],\n min: 1,\n });\n\n return res;\n });\n\n const getSessionKeyPassword = (params: {\n alias: string;\n message: string;\n }) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n const password = yield* promptManager.passwordPrompt({\n message: params.message,\n validate: (v) =>\n Effect.gen(function* () {\n if (v.trim() === \"\") {\n return yield* Effect.fail(\"Password cannot be empty\");\n }\n\n yield* Effect.tryPromise({\n try: () => Wallet.fromV3(key.data, v),\n catch: () =>\n new SessionKeyManagerError({\n code: \"DecryptError\",\n message: `Invalid password for session key ${params.alias}`,\n }),\n }).pipe(Effect.catch(() => Effect.fail(\"Invalid password\")));\n\n return v;\n }),\n });\n\n return password;\n });\n\n const getSessionKeySigner = (params: { alias: string; password: string }) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n const signer = yield* Effect.tryPromise({\n try: async () => {\n const wallet = await Wallet.fromV3(key.data, params.password);\n return privateKeyToAccount(\n toHex(wallet.getPrivateKey()),\n ) as LocalAccount;\n },\n catch: () =>\n new SessionKeyManagerError({\n code: \"DecryptError\",\n message: `Invalid password for session key ${params.alias}`,\n }),\n });\n\n return { ...key, signer };\n });\n\n const removeSessionKey = (params: RemoveSessionKeyParams) =>\n Effect.gen(function* () {\n const key = yield* getSessionKey({ alias: params.alias });\n\n return yield* configManager.removeEntity({\n alias: key.alias,\n type: \"session-key\",\n });\n });\n\n return SessionKeyManager.of({\n createSessionKey,\n getSessionKey,\n listSessionKeys,\n selectSessionKey,\n getSessionKeyStatus,\n multiSelectSessionKeys,\n getSessionKeyPassword,\n getSessionKeySigner,\n removeSessionKey,\n });\n }),\n);\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport type { ServeError } from \"effect/unstable/http/HttpServerError\";\n\nimport type { StartMcpServerParams } from \"@/dto/mcp\";\nimport { startMcpHttpServer, startMcpStdioServer } from \"@/mcp\";\n\nimport type { ConfigManagerError } from \"./config\";\nimport { McpContext } from \"./mcp-context\";\nimport { SessionKeyManager, type SessionKeyManagerError } from \"./session-key\";\nimport { SmartAccountManager } from \"./smart-account\";\n\nexport type McpManager = {\n startMcpServer: (\n params: StartMcpServerParams,\n ) => Effect.Effect<\n void,\n SessionKeyManagerError | ConfigManagerError | QuitError | ServeError\n >;\n};\n\nexport const McpManager = ServiceMap.Service<McpManager>(\n \"@namera-ai/cli/McpManager\",\n);\n\nexport const layer = Layer.effect(\n McpManager,\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager;\n\n const startMcpServer = (params: StartMcpServerParams) =>\n Effect.gen(function* () {\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: params.smartAccountAlias,\n });\n\n const sessionKeys = Object.entries(params.sessionKeys);\n\n const sessionKeysWithSigners = yield* Effect.all(\n sessionKeys.map(([alias, password]) =>\n sessionKeyManager.getSessionKeySigner({\n alias,\n password,\n }),\n ),\n );\n\n const context = McpContext.of({\n smartAccount: sa.data,\n sessionKeys: sessionKeysWithSigners,\n });\n\n if (params.transport === \"stdio\") {\n yield* startMcpStdioServer().pipe(\n Effect.provideService(McpContext, context),\n );\n } else {\n yield* startMcpHttpServer(params.port ?? 8080).pipe(\n Effect.provideService(McpContext, context),\n );\n }\n });\n return McpManager.of({ startMcpServer });\n }),\n);\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nconst keyColors = [\n \"\\x1b[36m\", // cyan\n \"\\x1b[35m\", // magenta\n \"\\x1b[34m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[33m\", // yellow\n];\n\nconst reset = \"\\x1b[0m\";\nconst bold = \"\\x1b[1m\";\n\n/**\n * Returns a shallow copy of an object with humanized key names.\n */\nconst transformKeys = (obj: Record<string, any>) => {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [formatKey(k), v]),\n );\n};\n\n/**\n * Humanizes a key by spacing words and title-casing tokens.\n */\nconst formatKey = (key: string) =>\n key\n .replace(/[_-]/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\n/**\n * Formats a primitive-like value for display.\n */\nconst formatValue = (value: any): string => {\n if (value === null) return \"null\";\n\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return String(value);\n};\n\n/**\n * Returns true when a value is a display-friendly primitive.\n */\nconst isPrimitive = (v: any) =>\n v === null || typeof v !== \"object\" || v instanceof Date;\n\n/**\n * Determines whether an array contains only flat objects of primitives.\n */\nconst isFlatObjectArray = (arr: Record<string, any>[]) =>\n arr.length > 0 &&\n arr.every(\n (item) =>\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.values(item).every(isPrimitive),\n );\n\n/**\n * Formats objects or arrays into a human-friendly CLI display string.\n *\n * Uses colorized keys when printing objects, and falls back to tabular\n * output for flat object arrays at the root level.\n */\nexport const prettyFormat = (\n input: Record<string, any> | Record<string, any>[],\n depth = 0,\n isRoot = true,\n): string => {\n const colors = true;\n const indent = 2;\n const maxDepth = 6;\n const space = \" \".repeat(indent * depth);\n\n if (depth > maxDepth) return `${space}…`;\n\n if (isRoot && Array.isArray(input) && isFlatObjectArray(input)) {\n const transformed = input.map(transformKeys);\n console.table(transformed);\n return \"\";\n }\n\n // Array\n if (Array.isArray(input)) {\n return input\n .map((item, i) => {\n if (isPrimitive(item)) {\n return `${space}${formatValue(item)}`;\n }\n\n return `${space}[${i}]\\n${prettyFormat(item, depth + 1, false)}`;\n })\n .join(\"\\n\");\n }\n\n // Object\n return Object.entries(input)\n .map(([key, value]) => {\n const color = keyColors[depth % keyColors.length];\n const k = colors\n ? `${bold}${color}${formatKey(key)}${reset}`\n : formatKey(key);\n\n if (isPrimitive(value)) {\n return `${space}${k}: ${formatValue(value)}`;\n }\n\n return `${space}${k}:\\n${prettyFormat(value, depth + 1, false)}`;\n })\n .join(\"\\n\");\n};\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { NdJson } from \"json-nd\";\n\nimport { prettyFormat } from \"@/helpers/pretty\";\n\n/**\n * Effect service for formatting command output into CLI-friendly formats.\n */\nexport type OutputFormatter = {\n /**\n * Formats command output into a CLI-friendly string.\n *\n * @param data - The object or list of objects to format.\n * @param format - Output mode: pretty (human), json, or ndjson.\n */\n format: (\n data: object | object[],\n format: \"pretty\" | \"json\" | \"ndjson\",\n ) => Effect.Effect<string>;\n};\n\n/**\n * Service tag for resolving {@link OutputFormatter} from the Effect context.\n */\nexport const OutputFormatter = ServiceMap.Service<OutputFormatter>(\n \"@namera-ai/cli/OutputFormatter\",\n);\n\n/**\n * Live layer that formats output as pretty, JSON, or NDJSON.\n */\nexport const layer = Layer.succeed(\n OutputFormatter,\n OutputFormatter.of({\n format: (data, format) =>\n Effect.gen(function* () {\n if (format === \"pretty\") {\n return prettyFormat(data);\n }\n if (format === \"json\") {\n return JSON.stringify(data, null, 2);\n }\n\n if (Array.isArray(data)) {\n return NdJson.stringify(data);\n }\n\n return NdJson.stringify([data]);\n }),\n }),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst createKeystoreHandler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for keystore:\",\n type: \"keystore\",\n });\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n params = { alias, password: Redacted.value(password) };\n }\n\n const res = yield* keystoreManager.createKeystore(params);\n\n const data = {\n address: res.data.address,\n alias: res.alias,\n path: res.path,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to encrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new keystore and stores it locally.\n */\nexport const createKeystoreCommand = Command.make(\n \"create\",\n { alias, password },\n ({ alias, password }) => createKeystoreHandler(alias, password),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a random keypair and stores it as keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore create -a my-wallet\",\n description: \"Creates a new keystore with alias 'my-wallet'\",\n },\n {\n command:\n \"namera keystore create --alias my-wallet --password my-password\",\n description:\n \"Creates a new keystore with alias 'my-wallet' and password 'my-password'\",\n },\n {\n command: `namera keystore create --params '{\"alias\":\"my-wallet\",\"password\":\"my-password\"}'`,\n description: \"Creates a new keystore with json params\",\n },\n {\n command: \"namera schema keystore.create\",\n description: \"Get the schema for the create command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { DecryptKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const promptManager = yield* PromptManager.PromptManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: DecryptKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(DecryptKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n params = { alias, password: Redacted.value(password) };\n }\n\n const res = yield* keystoreManager.decryptKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.address,\n publicKey: res.publicKey,\n privateKey: Redacted.value(res.privateKey),\n };\n\n if (globalFlags.quiet) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to decrypt\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to decrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that decrypts a keystore and prints key material.\n */\nexport const decryptKeystoreCommand = Command.make(\n \"decrypt\",\n { alias, password },\n ({ alias, password }) => handler(alias, password),\n).pipe(\n Command.withAlias(\"d\"),\n Command.withDescription(\"Decrypt a keystore to get the private key\"),\n Command.withExamples([\n {\n command: \"namera keystore decrypt\",\n description: \"Decrypt a keystore with alias and password prompts\",\n },\n {\n command:\n \"namera keystore decrypt --alias my-wallet --password my-password\",\n description: \"Decrypt a keystore with alias and password\",\n },\n {\n command: `namera keystore decrypt --params '{\"alias\":\"my-wallet\",\"password\":\"my-password\"}'`,\n description: \"Decrypt a keystore with json params\",\n },\n {\n command: \"namera schema keystore.decrypt\",\n description: \"Get the schema for the decrypt command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { ImportKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter, PromptManager } from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagPassword: Option.Option<Redacted.Redacted<string>>,\n flagPrivateKey: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const promptManager = yield* PromptManager.PromptManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: ImportKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(ImportKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let password: Redacted.Redacted<string>;\n let privateKey: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for keystore:\",\n type: \"keystore\",\n });\n alias = res;\n }\n\n if (flagPassword._tag === \"Some\") {\n password = flagPassword.value;\n } else {\n password = yield* promptManager.passwordPrompt({\n message: \"Enter password for keystore:\",\n });\n }\n\n if (flagPrivateKey._tag === \"Some\") {\n privateKey = flagPrivateKey.value;\n } else {\n privateKey = yield* promptManager.hexPrompt({\n redacted: true,\n length: 32,\n message: \"Enter private key:\",\n });\n }\n\n params = {\n alias,\n password: Redacted.value(password),\n privateKey: Redacted.value(privateKey),\n };\n }\n\n const res = yield* keystoreManager.importKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.data.address,\n path: res.path,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to import\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst privateKey = Flag.redacted(\"private-key\").pipe(\n Flag.withDescription(\"The private key of the keystore to import\"),\n Flag.optional,\n);\n\nconst password = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"The password to encrypt the keystore with\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\n/**\n * Command that imports a keystore from a private key.\n */\nexport const importKeystoreCommand = Command.make(\n \"import\",\n { alias, privateKey, password },\n ({ alias, password, privateKey }) => handler(alias, password, privateKey),\n).pipe(\n Command.withAlias(\"i\"),\n Command.withDescription(\"Import a keystore from a private key\"),\n Command.withExamples([\n {\n command: \"namera keystore import\",\n description: \"Import a keystore with interactive prompts\",\n },\n {\n command: \"namera keystore import --alias my-wallet\",\n description: \"Import a keystore with alias 'my-wallet'\",\n },\n {\n command:\n \"namera keystore import -a my-wallet -p my-password --private-key 0x1234567890abcdef\",\n description:\n \"Import a keystore with alias 'my-wallet', password 'my-password', and private key '0x1234567890abcdef'\",\n },\n {\n command: \"namera schema keystore.import\",\n description: \"Get the schema for the import command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst getKeystoreInfoHandler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* keystoreManager.getKeystore(params);\n\n const data = {\n alias: res.alias,\n address: res.data.address,\n path: res.path,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to retrieve\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that returns metadata for a keystore.\n */\nexport const getKeystoreInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => getKeystoreInfoHandler(alias),\n).pipe(\n Command.withDescription(\"Get information about a keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore info\",\n description: \"Get information about a keystore with alias prompt\",\n },\n {\n command: \"namera keystore info --alias my-wallet\",\n description: \"Get information about a keystore with alias 'my-wallet'\",\n },\n {\n command: `namera keystore info --params '{\"alias\":\"my-wallet\"}'`,\n description: \"Get information about a keystore with json params\",\n },\n {\n command: \"namera keystore info --alias my-wallet --output json\",\n description: \"Get information about a keystore in json format\",\n },\n {\n command: \"namera schema keystore.info\",\n description: \"Get the schema for the info command\",\n },\n ]),\n);\n","import { Console, Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst listKeystoreHandler = () =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* keystoreManager.listKeystores();\n\n const data = res.map((k) => ({\n alias: k.alias,\n address: k.data.address,\n path: k.path,\n }));\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that lists all stored keystores.\n */\nexport const listKeystoresCommand = Command.make(\"list\", {}, () =>\n listKeystoreHandler(),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List all keystores\"),\n Command.withExamples([\n {\n command: \"namera keystore list\",\n description: \"List all keystores\",\n },\n {\n command: \"namera keystore list --output json\",\n description: \"List all keystores in json format\",\n },\n {\n command: \"namera keystore list --output ndjson\",\n description: \"List all keystores in ndjson format\",\n },\n {\n command: \"namera schema keystore.list\",\n description: \"Get the schema for the list command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { KeystoreManager, OutputFormatter } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* keystoreManager.selectKeystore({\n message: \"Select keystore:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* keystoreManager.removeKeystore(params);\n\n const data = { success: true };\n\n if (globalFlags.quiet) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the keystore to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const removeKeystoreCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a keystore\"),\n Command.withExamples([\n {\n command: \"namera keystore remove\",\n description: \"Remove a keystore with alias prompt\",\n },\n {\n command: \"namera keystore remove --alias my-wallet\",\n description: \"Remove a keystore with alias 'my-wallet'\",\n },\n {\n command: `namera keystore remove --params '{\"alias\":\"my-wallet\"}'`,\n description: \"Remove a keystore with json params\",\n },\n {\n command: \"namera schema keystore.remove\",\n description: \"Get the schema for the remove command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { CliError, Command } from \"effect/unstable/cli\";\n\nimport { createKeystoreCommand } from \"./create\";\nimport { decryptKeystoreCommand } from \"./decrypt\";\nimport { importKeystoreCommand } from \"./import\";\nimport { getKeystoreInfoCommand } from \"./info\";\nimport { listKeystoresCommand } from \"./list\";\nimport { removeKeystoreCommand } from \"./remove\";\n\n/**\n * Command group for keystore-related operations.\n */\nexport const keystoreCommands = Command.make(\"keystore\", {}, () =>\n Effect.fail(\n new CliError.ShowHelp({\n commandPath: [\"namera\", \"keystore\"],\n errors: [],\n }),\n ),\n).pipe(\n Command.withDescription(\"Keystore management utilities.\"),\n Command.withAlias(\"k\"),\n Command.withSubcommands([\n createKeystoreCommand,\n listKeystoresCommand,\n getKeystoreInfoCommand,\n decryptKeystoreCommand,\n importKeystoreCommand,\n removeKeystoreCommand,\n ]),\n);\n","import { Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { StartMcpServerParams } from \"@/dto/mcp\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { McpManager, SessionKeyManager, SmartAccountManager } from \"@/layers\";\n\nexport const handler = (\n flagSmartAccount: Option.Option<string>,\n flagSessionKeys: Option.Option<Record<string, string>>,\n flagTransport: Option.Option<\"stdio\" | \"http\">,\n flagPort: Option.Option<number>,\n) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const mcpManager = yield* McpManager.McpManager;\n const globalFlags = yield* getGlobalFlags();\n\n let params: StartMcpServerParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(StartMcpServerParams),\n )(globalFlags.params.value);\n } else {\n let smartAccountAlias: string;\n let sessionKeys: Record<string, string> = {};\n let transport: \"stdio\" | \"http\";\n let port: number;\n\n if (flagSmartAccount._tag === \"Some\") {\n smartAccountAlias = flagSmartAccount.value;\n } else {\n smartAccountAlias = (yield* smartAccountManager.selectSmartAccount({\n message: \"Select smart account to use for the MCP server\",\n })).alias;\n }\n\n if (flagSessionKeys._tag === \"Some\") {\n sessionKeys = flagSessionKeys.value;\n } else {\n const keys = yield* sessionKeyManager.multiSelectSessionKeys({\n message: \"Select session keys to use for the MCP server\",\n smartAccount: smartAccountAlias,\n });\n\n for (const key of keys) {\n const pass = yield* sessionKeyManager.getSessionKeyPassword({\n alias: key.alias,\n message: `Enter password for session key ${key.alias}:`,\n });\n sessionKeys[key.alias] = Redacted.value(pass);\n }\n }\n\n if (flagTransport._tag === \"Some\") {\n transport = flagTransport.value;\n } else {\n transport = \"stdio\";\n }\n\n if (flagPort._tag === \"Some\") {\n port = flagPort.value;\n } else {\n port = 8080;\n }\n\n params = { smartAccountAlias, sessionKeys, transport, port };\n }\n\n yield* mcpManager.startMcpServer(params);\n });\n\nconst smartAccount = Flag.string(\"smart-account\").pipe(\n Flag.withAlias(\"sa\"),\n Flag.optional,\n Flag.withDescription(\"The smart account alias to use for the MCP server\"),\n);\n\nconst sessionKeys = Flag.keyValuePair(\"session-key\").pipe(\n Flag.withAlias(\"sk\"),\n Flag.optional,\n Flag.withDescription(\n \"The session key aliases, password pairs to use for the MCP server\",\n ),\n);\n\nconst transport = Flag.choice(\"transport\", [\"stdio\", \"http\"]).pipe(\n Flag.withAlias(\"t\"),\n Flag.optional,\n Flag.withDescription(\"The transport to use for the MCP server\"),\n);\n\nconst port = Flag.integer(\"port\").pipe(\n Flag.withAlias(\"p\"),\n Flag.optional,\n Flag.withDescription(\n \"The port to use for the MCP server when using http transport\",\n ),\n);\n\nexport const startMcpCommand = Command.make(\n \"start\",\n { smartAccount, sessionKeys, transport, port },\n ({ smartAccount, sessionKeys, transport, port }) =>\n handler(smartAccount, sessionKeys, transport, port),\n).pipe(\n Command.withAlias(\"s\"),\n Command.withDescription(\"Starts the local MCP server.\"),\n Command.withExamples([\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password\",\n description:\n \"Starts the local MCP server with a single session key and the default transport\",\n },\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password --transport http --port 8080\",\n description:\n \"Starts the local MCP server with a single session key and http transport on port 8080\",\n },\n {\n command:\n \"namera mcp start --smart-account my-smart --session-key my-key=my-password --session-key my-other-key=my-other-password\",\n description:\n \"Starts the local MCP server with multiple session keys and the default transport\",\n },\n {\n command: \"namera schema mcp.start\",\n description: \"Get the schema for the start command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { CliError, Command } from \"effect/unstable/cli\";\n\nimport { startMcpCommand } from \"./start\";\n\nexport const mcpCommands = Command.make(\"mcp\", {}, () =>\n Effect.fail(\n new CliError.ShowHelp({\n commandPath: [\"namera\", \"mcp\"],\n errors: [],\n }),\n ),\n).pipe(\n Command.withDescription(\"Start and manage the Namera MCP server\"),\n Command.withSubcommands([startMcpCommand]),\n);\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nimport { Schema } from \"effect\";\n\nimport type { DeepPaths } from \"@/types\";\n\n/**\n * Returns the value at a dot-delimited path within a nested object.\n *\n * @param obj - Object to traverse.\n * @param path - Dot-delimited lookup path.\n */\nexport const getSchema = <\n T extends Record<string, any>,\n P extends DeepPaths<T>,\n>(\n obj: T,\n path: P,\n): any => {\n return path.split(\".\").reduce((acc, key) => acc[key], obj);\n};\n\n/**\n * Extracts all dot-delimited paths that terminate at Effect schemas.\n *\n * @param obj - Object tree to scan.\n * @param prefix - Internal prefix used to build nested paths.\n */\nexport const extractPaths = <T extends Record<string, any>>(\n obj: T,\n prefix = \"\",\n): DeepPaths<T>[] => {\n return Object.entries(obj).flatMap(([key, value]) => {\n const newPath = prefix ? `${prefix}.${key}` : key;\n\n if (Schema.isSchema(value)) {\n return [newPath];\n }\n\n if (typeof value === \"object\" && value !== null) {\n return extractPaths(value, newPath);\n }\n\n return [];\n }) as DeepPaths<T>[];\n};\n","import { Console, Effect, Schema } from \"effect\";\nimport { Argument, Command } from \"effect/unstable/cli\";\n\nimport * as Dto from \"@/dto\";\nimport { extractPaths, getSchema } from \"@/helpers/paths\";\n\n/**\n * Schema registry keyed by command path.\n */\nconst schemas = {\n keystore: {\n create: Dto.CreateKeystoreParams,\n decrypt: Dto.DecryptKeystoreParams,\n info: Dto.GetKeystoreParams,\n list: Dto.ListKeystoreParams,\n import: Dto.ImportKeystoreParams,\n remove: Dto.RemoveKeystoreParams,\n },\n \"smart-account\": {\n create: Dto.CreateSmartAccountParams,\n list: Dto.ListSmartAccountParams,\n info: Dto.GetSmartAccountInfoParams,\n remove: Dto.RemoveSmartAccountParams,\n status: Dto.GetSmartAccountStatusParams,\n import: Dto.ImportSmartAccountParams,\n },\n \"session-key\": {\n create: Dto.CreateSessionKeyParams,\n list: Dto.ListSessionKeysParams,\n info: Dto.GetSessionKeyInfoParams,\n remove: Dto.RemoveSessionKeyParams,\n status: Dto.GetSessionKeyStatusParams,\n },\n mcp: {\n start: Dto.StartMcpServerParams,\n },\n};\n\nconst commands = extractPaths(schemas);\nconst command = Argument.choice(\"command\", commands).pipe(\n Argument.withDescription(\"The command to get the schema for\"),\n);\n\n/**\n * Command that prints JSON Schema for a given CLI command.\n */\nexport const schemaCommand = Command.make(\n \"schema\",\n { command },\n ({ command }) =>\n Effect.gen(function* () {\n const schema = getSchema(schemas, command);\n const json = Schema.toJsonSchemaDocument(schema);\n\n yield* Console.log(JSON.stringify(json, null, 2));\n }),\n).pipe(Command.withDescription(\"Get the schema for a command\"));\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { PolicyParams } from \"@/schema\";\n\nconst policyChoices = [\n {\n description: \"Grant access to all operations\",\n title: \"Sudo Permission\",\n value: \"sudo\",\n },\n {\n description: \"Whitelist addresses, contract and functions\",\n title: \"Call Permission\",\n value: \"call\",\n },\n {\n description: \"Specify the start and end time for when the key is valid\",\n title: \"Timestamp Permission\",\n value: \"timestamp\",\n },\n {\n description: \"Specify the allowed gas usage for the session key\",\n title: \"Gas Permission\",\n value: \"gas\",\n },\n {\n description:\n \"Specify which addresses can verify signatures from this session key\",\n title: \"Signature Permission\",\n value: \"signature-caller\",\n },\n {\n description: \"Specify the allowed gas usage for the session key\",\n title: \"Rate Limit Permission\",\n value: \"rate-limit\",\n },\n {\n description: \"Complete the session key creation\",\n title: \"Done\",\n value: \"done\",\n },\n] as const;\n\nexport const policyChoicePrompt = (prevPolicies: PolicyParams[]) =>\n Effect.gen(function* () {\n // show only those which are not in prevPolicies\n const choices = policyChoices.filter(\n (c) => !prevPolicies.some((p) => p.type === c.value),\n );\n\n const prompt = Prompt.select({\n choices,\n message: \"Select Permission type you want to add for this session key\",\n });\n\n return yield* prompt;\n });\n","import { Effect, Option, Schema } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport { EthereumAddress } from \"@/schema\";\n\nexport const addressPrompt = (message: string) =>\n Prompt.text({\n message,\n validate: (value) =>\n Effect.gen(function* () {\n const res = Schema.decodeUnknownOption(EthereumAddress)(value);\n if (Option.isNone(res))\n return yield* Effect.fail(\"Invalid Ethereum Address\");\n return value;\n }),\n });\n\nexport const etherPrompt = (message: string) =>\n Prompt.text({\n message,\n validate: (val) =>\n Effect.gen(function* () {\n const schema = Schema.NumberFromString.check(\n Schema.isGreaterThanOrEqualTo(0),\n );\n const res = Schema.decodeOption(schema)(val);\n if (Option.isNone(res)) return yield* Effect.fail(\"Invalid Number\");\n return res.value.toString();\n }),\n });\n","import { Effect, FileSystem } from \"effect\";\nimport type { QuitError } from \"effect/Terminal\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport type { SelectChoice } from \"effect/unstable/cli/Prompt\";\nimport {\n type Abi,\n type AbiFunction,\n type Address,\n parseEther,\n toFunctionSelector,\n} from \"viem\";\n\nimport type {\n CallPolicyParams,\n Permission,\n PermissionManual,\n PermissionWithABI,\n} from \"@/schema\";\n\nimport { addressPrompt, etherPrompt } from \"./common\";\n\nconst getEOAPermission = () =>\n Effect.gen(function* () {\n const target = yield* addressPrompt(\"Enter target address:\");\n const valueLimit = yield* etherPrompt(\n \"Max value that can be transferred (in ETH units):\",\n );\n const weiUnits = parseEther(valueLimit, \"wei\");\n\n return [\n {\n target: target as Address,\n valueLimit: weiUnits,\n },\n ] satisfies PermissionManual[];\n });\n\nconst getSmartContractPermission = () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const address = yield* addressPrompt(\"Enter smart contract address:\");\n const maxLimit = yield* etherPrompt(\n \"Max value that can be transferred (in ETH units)\",\n );\n\n // 1. Get Abi File\n // TODO: Add Abi Validation\n const abiFilePath = yield* Prompt.file({\n message: \"Select the ABI file for the smart contract\",\n });\n\n const abiString = yield* fs.readFileString(abiFilePath).pipe(Effect.orDie);\n const abi = JSON.parse(abiString) as Abi;\n\n const functions = abi.filter((e) => e.type === \"function\");\n\n const allowedFunctions = yield* Prompt.multiSelect({\n choices: functions.map((f) => {\n let signature = `${f.name}(`;\n for (let i = 0; i < f.inputs.length; i++) {\n const sep =\n f.inputs.length === 0 || i === f.inputs.length - 1 ? \"\" : \", \";\n // biome-ignore lint/style/noNonNullAssertion: safe\n const input = f.inputs[i]!;\n signature += `${input.type}${input.name ? ` ${input.name}` : \"\"}${sep}`;\n }\n signature += \")\";\n return {\n description: signature,\n title: f.name,\n value: f,\n } as SelectChoice<AbiFunction>;\n }),\n message: \"Select the functions you want to allow\",\n min: 1,\n });\n\n const weiUnits = parseEther(maxLimit);\n\n const res: PermissionWithABI[] = allowedFunctions.map((f) => {\n return {\n abi: [f],\n functionName: f.name,\n selector: toFunctionSelector(f),\n target: address as Address,\n valueLimit: weiUnits,\n };\n });\n\n return res;\n });\n\nconst getPermissions = () =>\n Effect.gen(function* () {\n const permissions: Permission[] = [];\n\n const targetAddressPrompt = Prompt.select({\n choices: [\n {\n title: \"EOA\",\n value: \"eoa\",\n },\n {\n title: \"Smart Contract\",\n value: \"smart-contract\",\n },\n ],\n message: \"Select target address type\",\n });\n\n while (true) {\n if (permissions.length > 0) {\n const addMore = yield* Prompt.confirm({\n message: \"Do you want to add another call permission?\",\n });\n if (!addMore) break;\n }\n\n const targetAddress = yield* targetAddressPrompt;\n\n if (targetAddress === \"eoa\") {\n const res = yield* getEOAPermission();\n permissions.push(...res);\n } else {\n const res = yield* getSmartContractPermission();\n permissions.push(...res);\n }\n }\n\n return permissions;\n });\n\nexport const getCallPolicyParams: Effect.Effect<\n CallPolicyParams,\n QuitError,\n Prompt.Environment\n> = Effect.gen(function* () {\n const permissions = yield* getPermissions();\n\n return {\n permissions,\n policyVersion: \"0.0.4\",\n type: \"call\",\n };\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\nimport { parseEther } from \"viem\";\n\nimport type { GasPolicyParams } from \"@/schema\";\n\nimport { etherPrompt } from \"./common\";\n\nexport const getGasPolicyParams = Effect.gen(function* () {\n const allowed = yield* etherPrompt(\n \"Total amount of gas allowed (in ETH units)\",\n );\n\n const enforcePaymaster = yield* Prompt.confirm({\n message: \"Should UserOperations require Paymaster?\",\n });\n\n const weiUnits = parseEther(allowed);\n\n return {\n amount: weiUnits,\n type: \"gas\",\n enforcePaymaster,\n } satisfies GasPolicyParams;\n});\n","/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nimport { Duration, Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { RateLimitPolicyParams } from \"@/schema\";\n\nexport const getRateLimitPolicyParams = Effect.gen(function* () {\n const interval = yield* Prompt.text({\n message:\n \"Duration for which rate limit is enforced? (e.g. 1 hour, 1 day, 1 week)\",\n validate: (v) =>\n Effect.gen(function* () {\n const valid = Duration.fromInput(v as any);\n if (valid._tag === \"None\") {\n return yield* Effect.fail(\"Invalid duration\");\n }\n\n return v;\n }),\n });\n\n const intervalDuration = Duration.fromInputUnsafe(interval as any);\n\n const count = yield* Prompt.integer({\n message: \"Number of requests allowed per interval.\",\n validate: (v) =>\n Effect.gen(function* () {\n if (v < 1) return yield* Effect.fail(\"Count must be greater than 0\");\n return v;\n }),\n });\n\n const startAt = yield* Prompt.date({\n initial: new Date(),\n message: \"Date at which the rate limit is enforced.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n return d;\n }),\n });\n\n return {\n type: \"rate-limit\",\n count,\n interval: Duration.toMillis(intervalDuration),\n startAt: Math.floor(startAt.getTime() / 1000),\n } satisfies RateLimitPolicyParams;\n});\n","import { Effect, Schema } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport { EthereumAddress, type SignatureCallerPolicyParams } from \"@/schema\";\n\nexport const getSignatureCallerPolicyParams = Effect.gen(function* () {\n const allowed = yield* Prompt.text({\n message: \"Comma-separated list of allowed callers:\",\n validate: (v) =>\n Effect.gen(function* () {\n const address = v.split(\",\").map((a) => a.trim());\n\n for (let i = 0; i < address.length; i++) {\n const a = address[i] as string;\n const res = Schema.decodeUnknownOption(EthereumAddress)(a);\n if (res._tag === \"None\") {\n return yield* Effect.fail(`Invalid Ethereum Address at index ${i}`);\n }\n }\n\n return v;\n }),\n });\n\n const allowedCallers = allowed\n .split(\",\")\n .map((a) => a.trim())\n .map((a) => Schema.decodeUnknownSync(EthereumAddress)(a));\n\n return {\n type: \"signature-caller\",\n allowedCallers,\n } satisfies SignatureCallerPolicyParams;\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { TimestampPolicyParams } from \"@/schema\";\n\nexport const getTimestampPolicyParams = Effect.gen(function* () {\n const validAfter = yield* Prompt.date({\n initial: new Date(),\n message: \"Time after which the key becomes valid.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n return d;\n }),\n });\n\n const validUntil = yield* Prompt.date({\n initial: new Date(),\n message: \"Time until which the key becomes valid.\",\n validate: (d) =>\n Effect.gen(function* () {\n if (d < new Date())\n return yield* Effect.fail(\"Date must be in the future\");\n if (d < validAfter)\n return yield* Effect.fail(\"Valid until must be after valid after\");\n return d;\n }),\n });\n\n return {\n type: \"timestamp\",\n validAfter: Math.floor(validAfter.getTime() / 1000),\n validUntil: Math.floor(validUntil.getTime() / 1000),\n } satisfies TimestampPolicyParams;\n});\n","import { Effect } from \"effect\";\nimport { Prompt } from \"effect/unstable/cli\";\n\nimport type { PolicyParams } from \"@/schema\";\n\nimport { policyChoicePrompt } from \"./base\";\nimport { getCallPolicyParams } from \"./call\";\nimport { getGasPolicyParams } from \"./gas\";\nimport { getRateLimitPolicyParams } from \"./rate-limit\";\nimport { getSignatureCallerPolicyParams } from \"./signature-caller\";\nimport { getTimestampPolicyParams } from \"./timestamp\";\n\nexport const getPoliciesFromUser = () =>\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ok\n Effect.gen(function* () {\n const policyParams: PolicyParams[] = [];\n\n while (true) {\n if (policyParams.length > 0) {\n const addMore = yield* Prompt.confirm({\n message: \"Do you want to add another policy?\",\n });\n if (!addMore) break;\n }\n\n const policyType = yield* policyChoicePrompt(policyParams);\n\n if (policyType === \"sudo\") {\n policyParams.push({ type: \"sudo\" });\n // If sudo is selected, no need to ask for other policies\n break;\n }\n\n if (policyType === \"timestamp\") {\n const res = yield* getTimestampPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"call\") {\n const res = yield* getCallPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"gas\") {\n const res = yield* getGasPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"rate-limit\") {\n const res = yield* getRateLimitPolicyParams;\n policyParams.push(res);\n } else if (policyType === \"signature-caller\") {\n const res = yield* getSignatureCallerPolicyParams;\n policyParams.push(res);\n } else {\n break;\n }\n }\n\n return policyParams;\n });\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateSessionKeyParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport {\n OutputFormatter,\n PromptManager,\n SessionKeyManager,\n SmartAccountManager,\n Web3Service,\n} from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nimport { getPoliciesFromUser } from \"./prompts\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagSmartAccountAlias: Option.Option<string>,\n flagSessionKeyPassword: Option.Option<Redacted.Redacted<string>>,\n flagOwnerKeystorePassword: Option.Option<Redacted.Redacted<string>>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const web3Service = yield* Web3Service.Web3Service;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateSessionKeyParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateSessionKeyParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let smartAccountAlias: string;\n let sessionKeyPassword: Redacted.Redacted<string>;\n let ownerKeystorePassword: Redacted.Redacted<string>;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for session key:\",\n type: \"session-key\",\n });\n }\n\n if (flagSmartAccountAlias._tag === \"Some\") {\n smartAccountAlias = flagSmartAccountAlias.value;\n } else {\n smartAccountAlias = (yield* smartAccountManager.selectSmartAccount({\n message: \"Select smart account:\",\n })).alias;\n }\n\n const chains = yield* web3Service.multiSelectChain({\n message: \"Select chains:\",\n });\n\n if (flagSessionKeyPassword._tag === \"Some\") {\n sessionKeyPassword = flagSessionKeyPassword.value;\n } else {\n sessionKeyPassword = yield* promptManager.passwordPrompt({\n message: \"Enter session key password:\",\n });\n }\n\n const sa = yield* smartAccountManager.getSmartAccount({\n alias: smartAccountAlias,\n });\n\n if (flagOwnerKeystorePassword._tag === \"Some\") {\n ownerKeystorePassword = flagOwnerKeystorePassword.value;\n } else {\n ownerKeystorePassword = yield* promptManager.passwordPrompt({\n message: `Enter keystore password for owner (${sa.data.ownerAlias}):`,\n });\n }\n\n const policyParams = yield* getPoliciesFromUser();\n\n params = {\n alias,\n chains,\n smartAccountAlias,\n sessionKeyPassword: Redacted.value(sessionKeyPassword),\n ownerKeystorePassword: Redacted.value(ownerKeystorePassword),\n policyParams,\n };\n }\n\n const res = yield* sessionKeyManager.createSessionKey(params);\n\n const data = {\n ...(res.data.sessionKeyType === \"ecdsa\"\n ? {\n sessionKeyAddress: res.data.sessionKeyAddress,\n }\n : {\n passKeyName: res.data.passKeyName,\n }),\n smartAccount: res.data.smartAccountAlias,\n chains: res.data.serializedAccounts.map((a) => getChain(a.chain).name),\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst smartAccountAlias = Flag.string(\"smart-account\").pipe(\n Flag.withDescription(\n \"The alias of the smart account to create session key for\",\n ),\n Flag.withAlias(\"sa\"),\n Flag.optional,\n);\n\nconst sessionKeyPassword = Flag.redacted(\"password\").pipe(\n Flag.withDescription(\"Password to encrypt session key\"),\n Flag.withAlias(\"p\"),\n Flag.optional,\n);\n\nconst ownerKeystorePassword = Flag.redacted(\"owner-password\").pipe(\n Flag.withDescription(\"Password to encrypt session key\"),\n Flag.withAlias(\"op\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new session key and stores it locally.\n */\nexport const createSessionKeyCommand = Command.make(\n \"create\",\n { alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword },\n ({ alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword }) =>\n handler(\n alias,\n smartAccountAlias,\n sessionKeyPassword,\n ownerKeystorePassword,\n ),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a new session key\"),\n Command.withExamples([\n {\n command: \"namera session-key create\",\n description: \"Creates a new session key with interactive prompts\",\n },\n {\n command: \"namera schema session-key.create\",\n description: \"Get the schema for session key create command\",\n },\n ]),\n);\n","import { deserializePermissionAccountParams } from \"@namera-ai/sdk/session-key\";\nimport { Duration } from \"effect\";\nimport { type AbiFunction, formatEther, zeroAddress } from \"viem\";\n\nexport const humanizeDuration = (input: Duration.Input): string => {\n const millis = Duration.toMillis(Duration.fromInputUnsafe(input));\n let seconds = Math.floor(millis / 1000);\n\n const units = [\n { label: \"year\", value: 60 * 60 * 24 * 365 },\n { label: \"month\", value: 60 * 60 * 24 * 30 },\n { label: \"day\", value: 60 * 60 * 24 },\n { label: \"hour\", value: 60 * 60 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n const parts: string[] = [];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n seconds %= unit.value;\n\n parts.push(`${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`);\n }\n }\n\n return parts.length > 0 ? parts.join(\" \") : \"0 seconds\";\n};\n\nexport const humanizeRelativeTime = (target: Date | number): string => {\n const now = Date.now();\n const targetMs = target instanceof Date ? target.getTime() : target * 1000;\n\n const diff = targetMs - now;\n const abs = Math.abs(diff);\n\n const seconds = Math.floor(abs / 1000);\n\n const units = [\n { label: \"year\", value: 31_536_000 },\n { label: \"month\", value: 2_592_000 },\n { label: \"day\", value: 86_400 },\n { label: \"hour\", value: 3600 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n\n const formatted = `${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`;\n\n return diff > 0 ? `in ${formatted}` : `${formatted} ago`;\n }\n }\n\n return \"just now\";\n};\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: safe\nexport const humanizePolicyParams = (serializedAccount: string) => {\n const params = deserializePermissionAccountParams(serializedAccount);\n\n // biome-ignore lint/suspicious/noExplicitAny: safe\n const result: Record<string, any> = {};\n\n // Permission Id\n result.permissionId = params.permissionParams.permissionId;\n\n for (const policy of params.permissionParams.policies ?? []) {\n const params = policy.policyParams;\n if (params.type === \"sudo\") {\n result.sudoPolicy = {\n enabled: true,\n };\n } else if (params.type === \"gas\") {\n const allowed = formatEther(params.allowed ?? 0n);\n result.gasPolicy = {\n enabled: true,\n allowed: `${allowed} ETH`,\n ...(params.enforcePaymaster && {\n enforcePaymaster: params.enforcePaymaster,\n }),\n ...(params.allowedPaymaster !== zeroAddress && {\n allowedPaymaster: params.allowedPaymaster,\n }),\n };\n } else if (params.type === \"timestamp\") {\n const validAfter = params.validAfter ?? 0;\n const validUntil = params.validUntil ?? 0;\n\n result.timestampPolicy = {\n enabled: true,\n starts: humanizeRelativeTime(validAfter),\n ends: humanizeRelativeTime(validUntil),\n };\n } else if (params.type === \"rate-limit\") {\n const formattedInterval = humanizeDuration(params.interval ?? 0);\n result.rateLimitPolicy = {\n enabled: true,\n count: params.count,\n interval: formattedInterval,\n starts: humanizeRelativeTime(params.startAt ?? 0),\n };\n } else if (params.type === \"signature-caller\") {\n result.signatureCallerPolicy = {\n enabled: true,\n allowedCallers: params.allowedCallers,\n };\n } else if (params.type === \"call\") {\n result.callPolicy = {\n enabled: true,\n policyVersion: params.policyVersion,\n };\n\n if (!params.permissions || params.permissions.length === 0) continue;\n\n for (const permission of params.permissions) {\n result.callPolicy.permissions = result.callPolicy.permissions ?? [];\n\n if (\"abi\" in permission) {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n\n const abiFn = permission.abi?.find(\n (f) => f.type === \"function\" && f.name === permission.functionName,\n ) as AbiFunction | undefined;\n\n const cyan = \"\\x1b[36m\";\n const yellow = \"\\x1b[33m\";\n const magenta = \"\\x1b[35m\";\n const reset = \"\\x1b[0m\";\n\n let fnName = `${magenta}${permission.functionName ?? \"unknown\"}${reset}(`;\n\n if (abiFn) {\n abiFn.inputs.forEach((input, i) => {\n if (i > 0) fnName += \", \";\n fnName += `${cyan}${input.type}${reset}${input.name ? ` ${yellow}${input.name}${reset}` : \"\"}`;\n });\n }\n\n fnName += \")\";\n\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n functionName: fnName,\n });\n } else {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n });\n }\n }\n }\n }\n\n return result;\n};\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSessionKeyInfoParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { humanizePolicyParams } from \"@/helpers/humanize\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSessionKeyInfoParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSessionKeyInfoParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* sessionKeyManager.getSessionKey(params);\n\n const data = {\n alias: res.alias,\n ...(res.data.sessionKeyType === \"ecdsa\"\n ? {\n address: res.data.sessionKeyAddress,\n }\n : {\n passKeyName: res.data.passKeyName,\n }),\n smartAccount: res.data.smartAccountAlias,\n chains: res.data.serializedAccounts\n .map((a) => getChain(a.chain).name)\n .join(\", \"),\n policies: humanizePolicyParams(\n res.data.serializedAccounts[0]?.serializedAccount ?? \"\",\n ),\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to get info for\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const getSessionKeyInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withDescription(\"Get information about a session key\"),\n Command.withExamples([\n {\n command: \"namera session-key info\",\n description: \"Get information about a session key with alias prompt\",\n },\n {\n command: \"namera session-key info --alias my-session-key\",\n description:\n \"Get information about a session key with alias 'my-session-key'\",\n },\n {\n command: `namera session-key info --params '{\"alias\":\"my-session-key\"}'`,\n description: \"Get information about a session key with json params\",\n },\n {\n command: \"namera session-key info --alias my-wallet --output json\",\n description: \"Get information about a session key in json format\",\n },\n {\n command: \"namera schema session-key.info\",\n description: \"Get the schema for the session key info command\",\n },\n ]),\n);\n","import { Console, Effect, type Option } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\nimport { getChain } from \"@/schema\";\n\nconst handler = (flagSmartAccountAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* sessionKeyManager.listSessionKeys({\n smartAccount:\n flagSmartAccountAlias._tag === \"Some\"\n ? flagSmartAccountAlias.value\n : undefined,\n });\n\n const data = res.map((d) => ({\n alias: d.alias,\n ...(d.data.sessionKeyType === \"ecdsa\"\n ? {\n address: d.data.sessionKeyAddress,\n }\n : {\n passKeyName: d.data.passKeyName,\n }),\n smartAccount: d.data.smartAccountAlias,\n chains: d.data.serializedAccounts\n .map((a) => getChain(a.chain).name)\n .join(\", \"),\n }));\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst smartAccountAlias = Flag.string(\"smart-account\").pipe(\n Flag.withDescription(\n \"The alias of the smart account to list session keys for\",\n ),\n Flag.withAlias(\"sa\"),\n Flag.optional,\n);\n/**\n * Command that lists all locally stored session keys.\n */\nexport const listSessionKeysCommand = Command.make(\n \"list\",\n { smartAccountAlias },\n ({ smartAccountAlias }) => handler(smartAccountAlias),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List session keys\"),\n Command.withExamples([\n {\n command: \"namera session-key list\",\n description: \"List all session keys\",\n },\n {\n command: \"namera session-key list --smart-account my-smart\",\n description: \"List all session keys for smart account 'my-smart'\",\n },\n {\n command: `namera session-key list --params '{\"smartAccount\":\"my-smart\"}'`,\n description: \"List all session keys for smart account 'my-smart'\",\n },\n {\n command: \"namera session-key list --output json\",\n description: \"List all session keys in json format\",\n },\n {\n command: \"namera schema session-key.list\",\n description: \"Get the schema for the list session key command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveSessionKeyParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SessionKeyManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveSessionKeyParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveSessionKeyParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* sessionKeyManager.removeSessionKey(params);\n\n const data = { success: true };\n\n if (globalFlags.quiet) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const removeSessionKeyCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a Session Key\"),\n Command.withExamples([\n {\n command: \"namera session-key remove\",\n description: \"Remove a session key with alias prompt\",\n },\n {\n command: \"namera session-key remove --alias my-session-key\",\n description: \"Remove a session key with alias 'my-session-key'\",\n },\n {\n command: `namera session-key remove --params '{\"alias\":\"my-session-key\"}'`,\n description: \"Remove a session key with json params\",\n },\n {\n command: \"namera schema session-key.remove\",\n description: \"Get the schema for the remove session key command\",\n },\n ]),\n);\n","import { Flag } from \"effect/unstable/cli\";\n\nimport { type SupportedChain, supportedChains } from \"@/schema/chain\";\n\nconst chain = Flag.choice(\n \"chain\",\n Object.keys(supportedChains) as SupportedChain[],\n).pipe(Flag.withDescription(\"Chain Name\"), Flag.optional);\n\nconst rpcUrl = Flag.string(\"rpc-url\").pipe(\n Flag.withDescription(\"RPC URL\"),\n Flag.optional,\n);\n\nexport const chainAndRpcUrl = { chain, rpcUrl };\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSessionKeyStatusParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { chainAndRpcUrl } from \"@/flags/shared\";\nimport { OutputFormatter, SessionKeyManager, Web3Service } from \"@/layers\";\nimport type { SupportedChain } from \"@/schema/chain\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagChain: Option.Option<SupportedChain>,\n flagRpcUrl: Option.Option<string>,\n) =>\n Effect.gen(function* () {\n const web3Service = yield* Web3Service.Web3Service;\n const sessionKeyManager = yield* SessionKeyManager.SessionKeyManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSessionKeyStatusParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSessionKeyStatusParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let chain: SupportedChain;\n const rpcUrl = flagRpcUrl._tag === \"Some\" ? flagRpcUrl.value : undefined;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* sessionKeyManager.selectSessionKey({\n message: \"Select Session Key:\",\n });\n alias = res.alias;\n }\n\n if (flagChain._tag === \"Some\") {\n chain = flagChain.value;\n } else {\n chain = yield* web3Service.selectChain({\n message: \"Select Chain:\",\n });\n }\n\n params = { alias, chain, rpcUrl };\n }\n\n const installed = yield* sessionKeyManager.getSessionKeyStatus(params);\n\n const data = { installed };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the session key\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nexport const getSessionKeyStatusCommand = Command.make(\n \"status\",\n {\n alias,\n ...chainAndRpcUrl,\n },\n ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl),\n).pipe(\n Command.withDescription(\"Get Session key status for a given chain\"),\n Command.withExamples([\n {\n command: \"namera session-key status -a my-smart --chain eth-mainnet\",\n description: \"Get Session key status for a given chain\",\n },\n {\n command:\n \"namera session-key status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth\",\n description:\n \"Get Session key status for a given chain with custom RPC URL\",\n },\n {\n command: `namera session-key status --params '{\"alias\":\"my-session-key\",\"chain\":\"eth-mainnet\"}'`,\n description: \"Get Session key status for a given chain with json params\",\n },\n {\n command: \"namera schema session-key.status\",\n description: \"Get the schema for the session key status command\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { CliError, Command } from \"effect/unstable/cli\";\n\nimport { createSessionKeyCommand } from \"./create\";\nimport { getSessionKeyInfoCommand } from \"./info\";\nimport { listSessionKeysCommand } from \"./list\";\nimport { removeSessionKeyCommand } from \"./remove\";\nimport { getSessionKeyStatusCommand } from \"./status\";\n\n/**\n * Command group for session-key related operations.\n */\nexport const sessionKeyCommands = Command.make(\"session-key\", {}, () =>\n Effect.fail(\n new CliError.ShowHelp({\n commandPath: [\"namera\", \"session-key\"],\n errors: [],\n }),\n ),\n).pipe(\n Command.withAlias(\"sk\"),\n Command.withDescription(\"Session Key management commands.\"),\n Command.withSubcommands([\n createSessionKeyCommand,\n listSessionKeysCommand,\n getSessionKeyInfoCommand,\n getSessionKeyStatusCommand,\n removeSessionKeyCommand,\n ]),\n);\n","import { Console, Effect, type Option, Redacted, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { CreateSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport {\n KeystoreManager,\n OutputFormatter,\n PromptManager,\n SmartAccountManager,\n} from \"@/layers\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagOwnerAlias: Option.Option<string>,\n flagOwnerPassword: Option.Option<Redacted.Redacted<string>>,\n flagIndex: Option.Option<number>,\n) =>\n Effect.gen(function* () {\n const promptManager = yield* PromptManager.PromptManager;\n const keystoreManager = yield* KeystoreManager.KeystoreManager;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: CreateSmartAccountParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(CreateSmartAccountParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let ownerAlias: string;\n let ownerPassword: Redacted.Redacted<string>;\n let index: bigint;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n alias = yield* promptManager.aliasPrompt({\n aliasType: \"new\",\n message: \"Enter alias for smart account:\",\n type: \"smart-account\",\n });\n }\n\n if (flagOwnerAlias._tag === \"Some\") {\n ownerAlias = flagOwnerAlias.value;\n } else {\n ownerAlias = (yield* keystoreManager.selectKeystore({\n message: \"Select owner keystore:\",\n })).alias;\n }\n\n if (flagOwnerPassword._tag === \"Some\") {\n ownerPassword = flagOwnerPassword.value;\n } else {\n ownerPassword = yield* keystoreManager.getKeystorePassword({\n alias: ownerAlias,\n message: `Enter password for owner (${ownerAlias}):`,\n });\n }\n\n if (flagIndex._tag === \"Some\") {\n index = BigInt(flagIndex.value);\n } else {\n index = 0n;\n }\n\n params = {\n alias,\n ownerAlias,\n index,\n ownerPassword: Redacted.value(ownerPassword),\n };\n }\n\n const res = yield* smartAccountManager.createSmartAccount(params);\n\n const data = {\n address: res.data.smartAccountAddress,\n kernelVersion: res.data.kernelVersion,\n index: Number(res.data.index),\n owner: res.data.ownerAlias,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to create\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\nconst ownerAlias = Flag.string(\"owner-alias\").pipe(\n Flag.withDescription(\"The alias of the owner keystore\"),\n Flag.withAlias(\"oa\"),\n Flag.optional,\n);\n\nconst ownerPassword = Flag.redacted(\"owner-password\").pipe(\n Flag.withDescription(\"The password of the owner keystore\"),\n Flag.withAlias(\"op\"),\n Flag.optional,\n);\n\nconst index = Flag.integer(\"index\").pipe(\n Flag.withDescription(\"The index of the smart account\"),\n Flag.withAlias(\"i\"),\n Flag.optional,\n);\n\n/**\n * Command that creates a new smart account and stores it locally.\n *\n * Accepts alias, owner alias, and index via flags or JSON params.\n */\nexport const createSmartAccountCommand = Command.make(\n \"create\",\n { alias, ownerAlias, ownerPassword, index },\n ({ alias, ownerAlias, ownerPassword, index }) =>\n handler(alias, ownerAlias, ownerPassword, index),\n).pipe(\n Command.withAlias(\"c\"),\n Command.withDescription(\"Creates a new smart account\"),\n Command.withExamples([\n {\n command: \"namera smart-account create\",\n description: \"Creates a new smart account with interactive prompts\",\n },\n {\n command:\n \"namera smart-account create --alias my-smart --owner-alias my-owner --index 0\",\n description:\n \"Creates a new smart account with alias 'my-smart', owner alias 'my-owner', and index 0\",\n },\n {\n command: `namera smart-account create --params '{\"alias\":\"my-smart\",\"owner-alias\":\"my-owner\",\"index\":0}'`,\n description: \"Creates a new smart account with json params\",\n },\n {\n command: \"namera schema smart-account.create\",\n description: \"Get the schema for the create command\",\n },\n ]),\n);\n","import { Console, Effect, Schema } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { ImportSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\nimport { SmartAccountManagerError } from \"@/layers/smart-account\";\n\nconst handler = () =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n if (globalFlags.params._tag === \"None\") {\n return yield* Effect.fail(\n new SmartAccountManagerError({\n code: \"SmartAccountImportError\",\n message: \"Smart Account import is only supported via JSON params\",\n }),\n );\n }\n\n const params = Schema.decodeUnknownSync(\n Schema.fromJsonString(ImportSmartAccountParams),\n )(globalFlags.params.value);\n\n const res = yield* smartAccountManager.importSmartAccount(params);\n\n const data = {\n alias: res.alias,\n address: res.data.smartAccountAddress,\n owner: res.data.ownerAlias,\n index: Number(res.data.index),\n kernelVersion: res.data.kernelVersion,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that imports a smart account using JSON params only.\n */\nexport const importSmartAccountCommand = Command.make(\"import\", {}, () =>\n handler(),\n).pipe(\n Command.withAlias(\"i\"),\n Command.withDescription(\"Import a smart account\"),\n Command.withExamples([\n {\n command: `namera smart-account import --params '{\"alias\":\"my-smart\",\"ownerAlias\":\"my-owner\",\"index\":0,\"kernelVersion\":\"0.3.2\",\"smartAccountAddress\":\"0x1bC710cbA70f8Ce638dC5c8F50FDb05d87a7D652\",\"entryPointVersion\":\"0.7\",\"ownerType\":\"ecdsa\"}'`,\n description: \"Import a smart account with json params\",\n },\n {\n command: \"namera schema smart-account.import\",\n description: \"Get the schema for the smart account import command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetKeystoreParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetKeystoreParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetKeystoreParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n const res = yield* smartAccountManager.getSmartAccount(params);\n\n const data = {\n alias: res.alias,\n address: res.data.smartAccountAddress,\n owner: res.data.ownerAlias,\n index: Number(res.data.index),\n kernelVersion: res.data.kernelVersion,\n };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to retrieve\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that returns stored metadata for a smart account.\n *\n * Accepts alias via flag or JSON params, otherwise prompts for selection.\n */\nexport const getSmartAccountInfoCommand = Command.make(\n \"info\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withDescription(\"Get information about a smart account\"),\n Command.withExamples([\n {\n command: \"namera smart-account info\",\n description: \"Get information about a smart account with alias prompt\",\n },\n {\n command: \"namera smart-account info --alias my-smart\",\n description:\n \"Get information about a smart account with alias 'my-smart'\",\n },\n {\n command: `namera smart-account info --params '{\"alias\":\"my-smart\"}'`,\n description: \"Get information about a smart account with json params\",\n },\n {\n command: \"namera smart-account info --alias my-wallet --output json\",\n description: \"Get information about a smart account in json format\",\n },\n {\n command: \"namera schema smart-account.info\",\n description: \"Get the schema for the smart account info command\",\n },\n ]),\n);\n","import { Console, Effect } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\n\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = () =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n const res = yield* smartAccountManager.listSmartAccounts();\n\n const data = res.map((d) => ({\n alias: d.alias,\n address: d.data.smartAccountAddress,\n owner: d.data.ownerAlias,\n index: Number(d.data.index),\n kernelVersion: d.data.kernelVersion,\n }));\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\n/**\n * Command that lists all locally stored smart accounts.\n */\nexport const listSmartAccountsCommand = Command.make(\"list\", {}, () =>\n handler(),\n).pipe(\n Command.withAlias(\"ls\"),\n Command.withDescription(\"List all smart accounts\"),\n Command.withExamples([\n {\n command: \"namera smart-account list\",\n description: \"List all smart accounts\",\n },\n {\n command: \"namera smart-account list --output json\",\n description: \"List all smart accounts in json format\",\n },\n {\n command: \"namera smart-account list --output ndjson\",\n description: \"List all smart accounts in ndjson format\",\n },\n {\n command: \"namera schema smart-account.list\",\n description: \"Get the schema for the list smart account command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveSmartAccountParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveSmartAccountParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* smartAccountManager.removeSmartAccount(params);\n\n const data = { success: true };\n\n if (globalFlags.quiet) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that removes a locally stored smart account by alias.\n */\nexport const removeSmartAccountCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a Smart Account\"),\n Command.withExamples([\n {\n command: \"namera smart-account remove\",\n description: \"Remove a smart-account with alias prompt\",\n },\n {\n command: \"namera smart-account remove --alias my-smart\",\n description: \"Remove a smart account with alias 'my-smart'\",\n },\n {\n command: `namera smart-account remove --params '{\"alias\":\"my-smart\"}'`,\n description: \"Remove a smart account with json params\",\n },\n {\n command: \"namera schema smart-account.remove\",\n description: \"Get the schema for the remove smart account command\",\n },\n ]),\n);\n","import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSmartAccountStatusParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { chainAndRpcUrl } from \"@/flags/shared\";\nimport { OutputFormatter, SmartAccountManager, Web3Service } from \"@/layers\";\nimport type { SupportedChain } from \"@/schema/chain\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagChain: Option.Option<SupportedChain>,\n flagRpcUrl: Option.Option<string>,\n) =>\n Effect.gen(function* () {\n const web3Service = yield* Web3Service.Web3Service;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSmartAccountStatusParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSmartAccountStatusParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let chain: SupportedChain;\n const rpcUrl = flagRpcUrl._tag === \"Some\" ? flagRpcUrl.value : undefined;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n if (flagChain._tag === \"Some\") {\n chain = flagChain.value;\n } else {\n chain = yield* web3Service.selectChain({\n message: \"Select Chain:\",\n });\n }\n\n params = { alias, chain, rpcUrl };\n }\n\n const deployed = yield* smartAccountManager.getSmartAccountStatus(params);\n\n const data = { deployed };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that checks deployment status of a smart account on a chain.\n */\nexport const getSmartAccountStatus = Command.make(\n \"status\",\n {\n alias,\n ...chainAndRpcUrl,\n },\n ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl),\n).pipe(\n Command.withDescription(\n \"Get Smart Account Deployment Status for a given chain\",\n ),\n Command.withExamples([\n {\n command: \"namera smart-account status -a my-smart --chain eth-mainnet\",\n description: \"Get Smart Account Deployment Status for a given chain\",\n },\n {\n command:\n \"namera smart-account status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth\",\n description:\n \"Get Smart Account Deployment Status for a given chain with custom RPC URL\",\n },\n {\n command: `namera smart-account status --params '{\"alias\":\"my-smart\",\"chain\":\"eth-mainnet\"}'`,\n description:\n \"Get Smart Account Deployment Status for a given chain with json params\",\n },\n ]),\n);\n","import { Effect } from \"effect\";\nimport { CliError, Command } from \"effect/unstable/cli\";\n\nimport { createSmartAccountCommand } from \"./create\";\nimport { importSmartAccountCommand } from \"./import\";\nimport { getSmartAccountInfoCommand } from \"./info\";\nimport { listSmartAccountsCommand } from \"./list\";\nimport { removeSmartAccountCommand } from \"./remove\";\nimport { getSmartAccountStatus } from \"./status\";\n\n/**\n * Root command group for smart-account lifecycle actions.\n *\n * Includes create, list, info, remove, status, and import subcommands.\n */\nexport const smartAccountCommands = Command.make(\"smart-account\", {}, () =>\n Effect.fail(\n new CliError.ShowHelp({\n commandPath: [\"namera\", \"smart-account\"],\n errors: [],\n }),\n ),\n).pipe(\n Command.withAlias(\"sa\"),\n Command.withDescription(\"Smart Account management utilities.\"),\n Command.withSubcommands([\n createSmartAccountCommand,\n listSmartAccountsCommand,\n getSmartAccountInfoCommand,\n removeSmartAccountCommand,\n getSmartAccountStatus,\n importSmartAccountCommand,\n ]),\n);\n","import { keystoreCommands } from \"./keystore\";\nimport { mcpCommands } from \"./mcp\";\nimport { schemaCommand } from \"./schema\";\nimport { sessionKeyCommands } from \"./session-key\";\nimport { smartAccountCommands } from \"./smart-account\";\n\n/**\n * Root CLI command set.\n */\nexport const commands = [\n keystoreCommands,\n smartAccountCommands,\n sessionKeyCommands,\n mcpCommands,\n schemaCommand,\n] as const;\n","import \"dotenv/config\";\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { ConfigProvider, Console, Effect, Layer } from \"effect\";\nimport { CliError, Command } from \"effect/unstable/cli\";\n\nimport { commands } from \"./commands\";\nimport { globalFlags } from \"./flags/global\";\nimport {\n ConfigManager,\n KeystoreManager,\n McpManager,\n OutputFormatter,\n PromptManager,\n SessionKeyManager,\n SmartAccountManager,\n Web3Service,\n} from \"./layers\";\n\nconst command = Command.make(\"namera\", {}, () =>\n Effect.fail(\n new CliError.ShowHelp({\n commandPath: [\"namera\"],\n errors: [],\n }),\n ),\n).pipe(\n Command.withDescription(\n \"Programmable Session keys for Smart Contracts Accounts.\",\n ),\n Command.withGlobalFlags(globalFlags),\n Command.withSubcommands(commands),\n Command.withExamples([\n {\n command: \"namera --help\",\n description: \"Print help\",\n },\n {\n command: \"namera --version\",\n description: \"Print version\",\n },\n ]),\n);\n\nconst Layers = McpManager.layer.pipe(\n Layer.provideMerge(SessionKeyManager.layer),\n Layer.provideMerge(SmartAccountManager.layer),\n Layer.provideMerge(KeystoreManager.layer),\n Layer.provideMerge(Web3Service.layer),\n Layer.provideMerge(PromptManager.layer),\n Layer.provideMerge(ConfigManager.layer),\n Layer.provideMerge(OutputFormatter.layer),\n Layer.provideMerge(NodeServices.layer),\n);\n\nconst cli = Effect.gen(function* () {\n const configManager = yield* ConfigManager.ConfigManager;\n yield* configManager.ensureConfigDirExists();\n\n yield* Command.run(command, {\n version: \"0.0.1\",\n });\n}).pipe(\n Effect.provide(Layers),\n Effect.provideService(\n ConfigProvider.ConfigProvider,\n ConfigProvider.fromEnv(),\n ),\n Effect.catchTag(\"ShowHelp\", () => Effect.succeed(void 0)),\n Effect.catch((e) => Console.error(e.message)),\n);\n\n// @ts-expect-error - TODO: fix this\ncli.pipe(NodeRuntime.runMain);\n"],"mappings":"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"}
|