@namera-ai/cli 0.1.3 → 0.1.5

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.
Files changed (143) hide show
  1. package/dist/commands/index.mjs +21 -0
  2. package/dist/commands/index.mjs.map +1 -0
  3. package/dist/commands/keystore/create.mjs +74 -0
  4. package/dist/commands/keystore/create.mjs.map +1 -0
  5. package/dist/commands/keystore/decrypt.mjs +71 -0
  6. package/dist/commands/keystore/decrypt.mjs.map +1 -0
  7. package/dist/commands/keystore/import.mjs +84 -0
  8. package/dist/commands/keystore/import.mjs.map +1 -0
  9. package/dist/commands/keystore/index.mjs +28 -0
  10. package/dist/commands/keystore/index.mjs.map +1 -0
  11. package/dist/commands/keystore/info.mjs +62 -0
  12. package/dist/commands/keystore/info.mjs.map +1 -0
  13. package/dist/commands/keystore/list.mjs +46 -0
  14. package/dist/commands/keystore/list.mjs.map +1 -0
  15. package/dist/commands/keystore/remove.mjs +51 -0
  16. package/dist/commands/keystore/remove.mjs.map +1 -0
  17. package/dist/commands/mcp/index.mjs +13 -0
  18. package/dist/commands/mcp/index.mjs.map +1 -0
  19. package/dist/commands/mcp/start.mjs +82 -0
  20. package/dist/commands/mcp/start.mjs.map +1 -0
  21. package/dist/commands/schema/index.mjs +55 -0
  22. package/dist/commands/schema/index.mjs.map +1 -0
  23. package/dist/commands/session-key/create/index.mjs +87 -0
  24. package/dist/commands/session-key/create/index.mjs.map +1 -0
  25. package/dist/commands/session-key/create/prompts/base.mjs +52 -0
  26. package/dist/commands/session-key/create/prompts/base.mjs.map +1 -0
  27. package/dist/commands/session-key/create/prompts/call.mjs +85 -0
  28. package/dist/commands/session-key/create/prompts/call.mjs.map +1 -0
  29. package/dist/commands/session-key/create/prompts/common.mjs +27 -0
  30. package/dist/commands/session-key/create/prompts/common.mjs.map +1 -0
  31. package/dist/commands/session-key/create/prompts/gas.mjs +19 -0
  32. package/dist/commands/session-key/create/prompts/gas.mjs.map +1 -0
  33. package/dist/commands/session-key/create/prompts/index.mjs +44 -0
  34. package/dist/commands/session-key/create/prompts/index.mjs.map +1 -0
  35. package/dist/commands/session-key/create/prompts/rate-limit.mjs +40 -0
  36. package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +1 -0
  37. package/dist/commands/session-key/create/prompts/signature-caller.mjs +26 -0
  38. package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +1 -0
  39. package/dist/commands/session-key/create/prompts/timestamp.mjs +32 -0
  40. package/dist/commands/session-key/create/prompts/timestamp.mjs.map +1 -0
  41. package/dist/commands/session-key/index.mjs +26 -0
  42. package/dist/commands/session-key/index.mjs.map +1 -0
  43. package/dist/commands/session-key/info.mjs +64 -0
  44. package/dist/commands/session-key/info.mjs.map +1 -0
  45. package/dist/commands/session-key/list.mjs +54 -0
  46. package/dist/commands/session-key/list.mjs.map +1 -0
  47. package/dist/commands/session-key/remove.mjs +51 -0
  48. package/dist/commands/session-key/remove.mjs.map +1 -0
  49. package/dist/commands/session-key/status.mjs +64 -0
  50. package/dist/commands/session-key/status.mjs.map +1 -0
  51. package/dist/commands/smart-account/create.mjs +94 -0
  52. package/dist/commands/smart-account/create.mjs.map +1 -0
  53. package/dist/commands/smart-account/import.mjs +45 -0
  54. package/dist/commands/smart-account/import.mjs.map +1 -0
  55. package/dist/commands/smart-account/index.mjs +30 -0
  56. package/dist/commands/smart-account/index.mjs.map +1 -0
  57. package/dist/commands/smart-account/info.mjs +66 -0
  58. package/dist/commands/smart-account/info.mjs.map +1 -0
  59. package/dist/commands/smart-account/list.mjs +48 -0
  60. package/dist/commands/smart-account/list.mjs.map +1 -0
  61. package/dist/commands/smart-account/remove.mjs +54 -0
  62. package/dist/commands/smart-account/remove.mjs.map +1 -0
  63. package/dist/commands/smart-account/status.mjs +63 -0
  64. package/dist/commands/smart-account/status.mjs.map +1 -0
  65. package/dist/dto/index.mjs +6 -0
  66. package/dist/dto/keystore.mjs +44 -0
  67. package/dist/dto/keystore.mjs.map +1 -0
  68. package/dist/dto/mcp.mjs +13 -0
  69. package/dist/dto/mcp.mjs.map +1 -0
  70. package/dist/dto/session-key.mjs +54 -0
  71. package/dist/dto/session-key.mjs.map +1 -0
  72. package/dist/dto/smart-account.mjs +45 -0
  73. package/dist/dto/smart-account.mjs.map +1 -0
  74. package/dist/flags/global.mjs +29 -0
  75. package/dist/flags/global.mjs.map +1 -0
  76. package/dist/flags/shared.mjs +11 -0
  77. package/dist/flags/shared.mjs.map +1 -0
  78. package/dist/helpers/humanize.mjs +153 -0
  79. package/dist/helpers/humanize.mjs.map +1 -0
  80. package/dist/helpers/paths.mjs +31 -0
  81. package/dist/helpers/paths.mjs.map +1 -0
  82. package/dist/helpers/policy.mjs +89 -0
  83. package/dist/helpers/policy.mjs.map +1 -0
  84. package/dist/helpers/pretty.mjs +71 -0
  85. package/dist/helpers/pretty.mjs.map +1 -0
  86. package/dist/index.mjs +18 -3266
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/layers/config.mjs +124 -0
  89. package/dist/layers/config.mjs.map +1 -0
  90. package/dist/layers/index.mjs +11 -0
  91. package/dist/layers/keystore.mjs +225 -0
  92. package/dist/layers/keystore.mjs.map +1 -0
  93. package/dist/layers/mcp-context.mjs +8 -0
  94. package/dist/layers/mcp-context.mjs.map +1 -0
  95. package/dist/layers/mcp.mjs +31 -0
  96. package/dist/layers/mcp.mjs.map +1 -0
  97. package/dist/layers/output.mjs +21 -0
  98. package/dist/layers/output.mjs.map +1 -0
  99. package/dist/layers/prompt.mjs +78 -0
  100. package/dist/layers/prompt.mjs.map +1 -0
  101. package/dist/layers/session-key.mjs +218 -0
  102. package/dist/layers/session-key.mjs.map +1 -0
  103. package/dist/layers/smart-account.mjs +172 -0
  104. package/dist/layers/smart-account.mjs.map +1 -0
  105. package/dist/layers/web3.mjs +83 -0
  106. package/dist/layers/web3.mjs.map +1 -0
  107. package/dist/mcp/helpers/common.mjs +9 -0
  108. package/dist/mcp/helpers/common.mjs.map +1 -0
  109. package/dist/mcp/helpers/index.mjs +4 -0
  110. package/dist/mcp/helpers/session-key.mjs +129 -0
  111. package/dist/mcp/helpers/session-key.mjs.map +1 -0
  112. package/dist/mcp/index.mjs +60 -0
  113. package/dist/mcp/index.mjs.map +1 -0
  114. package/dist/mcp/mcp.mjs +15 -0
  115. package/dist/mcp/mcp.mjs.map +1 -0
  116. package/dist/mcp/tools/account/address.mjs +20 -0
  117. package/dist/mcp/tools/account/address.mjs.map +1 -0
  118. package/dist/mcp/tools/account/get-balance.mjs +54 -0
  119. package/dist/mcp/tools/account/get-balance.mjs.map +1 -0
  120. package/dist/mcp/tools/account/index.mjs +15 -0
  121. package/dist/mcp/tools/account/index.mjs.map +1 -0
  122. package/dist/mcp/tools/read/index.mjs +11 -0
  123. package/dist/mcp/tools/read/index.mjs.map +1 -0
  124. package/dist/mcp/tools/read/read-contract.mjs +49 -0
  125. package/dist/mcp/tools/read/read-contract.mjs.map +1 -0
  126. package/dist/mcp/tools/transaction/execute-transaction.mjs +38 -0
  127. package/dist/mcp/tools/transaction/execute-transaction.mjs.map +1 -0
  128. package/dist/mcp/tools/transaction/index.mjs +15 -0
  129. package/dist/mcp/tools/transaction/index.mjs.map +1 -0
  130. package/dist/mcp/tools/transaction/native-transfer.mjs +59 -0
  131. package/dist/mcp/tools/transaction/native-transfer.mjs.map +1 -0
  132. package/dist/schema/chain.mjs +124 -0
  133. package/dist/schema/chain.mjs.map +1 -0
  134. package/dist/schema/common.mjs +29 -0
  135. package/dist/schema/common.mjs.map +1 -0
  136. package/dist/schema/index.mjs +5 -0
  137. package/dist/schema/policy.mjs +114 -0
  138. package/dist/schema/policy.mjs.map +1 -0
  139. package/dist/schema/tx.mjs +19 -0
  140. package/dist/schema/tx.mjs.map +1 -0
  141. package/dist/types/index.mjs +11 -0
  142. package/dist/types/index.mjs.map +1 -0
  143. package/package.json +11 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.mjs","names":["SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","McpManager.McpManager"],"sources":["../../../src/commands/mcp/start.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;AAOA,MAAa,WACX,kBACA,iBACA,eACA,aAEA,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOA;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,WACvC,QAAQ,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"}
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ import { CreateKeystoreParams, DecryptKeystoreParams, GetKeystoreParams, ImportKeystoreParams, ListKeystoreParams, RemoveKeystoreParams } from "../../dto/keystore.mjs";
3
+ import { StartMcpServerParams } from "../../dto/mcp.mjs";
4
+ import { CreateSessionKeyParams, GetSessionKeyInfoParams, GetSessionKeyStatusParams, ListSessionKeysParams, RemoveSessionKeyParams } from "../../dto/session-key.mjs";
5
+ import { CreateSmartAccountParams, GetSmartAccountInfoParams, GetSmartAccountStatusParams, ImportSmartAccountParams, ListSmartAccountParams, RemoveSmartAccountParams } from "../../dto/smart-account.mjs";
6
+ import "../../dto/index.mjs";
7
+ import { extractPaths, getSchema } from "../../helpers/paths.mjs";
8
+ import { Console, Effect, Schema } from "effect";
9
+ import { Argument, Command } from "effect/unstable/cli";
10
+ //#region src/commands/schema/index.ts
11
+ /**
12
+ * Schema registry keyed by command path.
13
+ */
14
+ const schemas = {
15
+ keystore: {
16
+ create: CreateKeystoreParams,
17
+ decrypt: DecryptKeystoreParams,
18
+ info: GetKeystoreParams,
19
+ list: ListKeystoreParams,
20
+ import: ImportKeystoreParams,
21
+ remove: RemoveKeystoreParams
22
+ },
23
+ "smart-account": {
24
+ create: CreateSmartAccountParams,
25
+ list: ListSmartAccountParams,
26
+ info: GetSmartAccountInfoParams,
27
+ remove: RemoveSmartAccountParams,
28
+ status: GetSmartAccountStatusParams,
29
+ import: ImportSmartAccountParams
30
+ },
31
+ "session-key": {
32
+ create: CreateSessionKeyParams,
33
+ list: ListSessionKeysParams,
34
+ info: GetSessionKeyInfoParams,
35
+ remove: RemoveSessionKeyParams,
36
+ status: GetSessionKeyStatusParams
37
+ },
38
+ mcp: { start: StartMcpServerParams }
39
+ };
40
+ const commands = extractPaths(schemas);
41
+ const command = Argument.choice("command", commands).pipe(Argument.withDescription("The command to get the schema for"));
42
+ /**
43
+ * Command that prints JSON Schema for a given CLI command.
44
+ */
45
+ const schemaCommand = Command.make("schema", { command }, ({ command }) => Effect.gen(function* () {
46
+ const schema = getSchema(schemas, command);
47
+ const json = Schema.toJsonSchemaDocument(schema);
48
+ yield* Console.log(JSON.stringify(json, (_key, value) => {
49
+ return typeof value === "bigint" ? value.toString() : value;
50
+ }, 2));
51
+ })).pipe(Command.withDescription("Get the schema for a command"));
52
+ //#endregion
53
+ export { schemaCommand };
54
+
55
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["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"],"sources":["../../../src/commands/schema/index.ts"],"sourcesContent":["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(\n JSON.stringify(\n json,\n (_key, value) => {\n return typeof value === \"bigint\" ? value.toString() : value;\n },\n 2,\n ),\n );\n }),\n).pipe(Command.withDescription(\"Get the schema for a command\"));\n"],"mappings":";;;;;;;;;;;;;AASA,MAAM,UAAU;CACd,UAAU;EACR,QAAQA;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,MAAM,WAAW,aAAa,QAAQ;AACtC,MAAM,UAAU,SAAS,OAAO,WAAW,SAAS,CAAC,KACnD,SAAS,gBAAgB,oCAAoC,CAC9D;;;;AAKD,MAAa,gBAAgB,QAAQ,KACnC,UACA,EAAE,SAAS,GACV,EAAE,cACD,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,UAAU,SAAS,QAAQ;CAC1C,MAAM,OAAO,OAAO,qBAAqB,OAAO;AAEhD,QAAO,QAAQ,IACb,KAAK,UACH,OACC,MAAM,UAAU;AACf,SAAO,OAAO,UAAU,WAAW,MAAM,UAAU,GAAG;IAExD,EACD,CACF;EACD,CACL,CAAC,KAAK,QAAQ,gBAAgB,+BAA+B,CAAC"}
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ import { getChain } from "../../../schema/chain.mjs";
3
+ import "../../../schema/index.mjs";
4
+ import { CreateSessionKeyParams } from "../../../dto/session-key.mjs";
5
+ import "../../../dto/index.mjs";
6
+ import { getGlobalFlags } from "../../../flags/global.mjs";
7
+ import { PromptManager } from "../../../layers/prompt.mjs";
8
+ import { Web3Service } from "../../../layers/web3.mjs";
9
+ import { SmartAccountManager } from "../../../layers/smart-account.mjs";
10
+ import { SessionKeyManager } from "../../../layers/session-key.mjs";
11
+ import { OutputFormatter } from "../../../layers/output.mjs";
12
+ import "../../../layers/index.mjs";
13
+ import { getPoliciesFromUser } from "./prompts/index.mjs";
14
+ import { Console, Effect, Redacted, Schema } from "effect";
15
+ import { Command, Flag } from "effect/unstable/cli";
16
+ //#region src/commands/session-key/create/index.ts
17
+ const handler = (flagAlias, flagSmartAccountAlias, flagSessionKeyPassword, flagOwnerKeystorePassword) => Effect.gen(function* () {
18
+ const promptManager = yield* PromptManager;
19
+ const web3Service = yield* Web3Service;
20
+ const smartAccountManager = yield* SmartAccountManager;
21
+ const sessionKeyManager = yield* SessionKeyManager;
22
+ const outputFormatter = yield* OutputFormatter;
23
+ const globalFlags = yield* getGlobalFlags();
24
+ let params;
25
+ if (globalFlags.params._tag === "Some") params = Schema.decodeUnknownSync(Schema.fromJsonString(CreateSessionKeyParams))(globalFlags.params.value);
26
+ else {
27
+ let alias;
28
+ let smartAccountAlias;
29
+ let sessionKeyPassword;
30
+ let ownerKeystorePassword;
31
+ if (flagAlias._tag === "Some") alias = flagAlias.value;
32
+ else alias = yield* promptManager.aliasPrompt({
33
+ aliasType: "new",
34
+ message: "Enter alias for session key:",
35
+ type: "session-key"
36
+ });
37
+ if (flagSmartAccountAlias._tag === "Some") smartAccountAlias = flagSmartAccountAlias.value;
38
+ else smartAccountAlias = (yield* smartAccountManager.selectSmartAccount({ message: "Select smart account:" })).alias;
39
+ const chains = yield* web3Service.multiSelectChain({ message: "Select chains:" });
40
+ if (flagSessionKeyPassword._tag === "Some") sessionKeyPassword = flagSessionKeyPassword.value;
41
+ else sessionKeyPassword = yield* promptManager.passwordPrompt({ message: "Enter session key password:" });
42
+ const sa = yield* smartAccountManager.getSmartAccount({ alias: smartAccountAlias });
43
+ if (flagOwnerKeystorePassword._tag === "Some") ownerKeystorePassword = flagOwnerKeystorePassword.value;
44
+ else ownerKeystorePassword = yield* promptManager.passwordPrompt({ message: `Enter keystore password for owner (${sa.data.ownerAlias}):` });
45
+ const policyParams = yield* getPoliciesFromUser();
46
+ params = {
47
+ alias,
48
+ chains,
49
+ smartAccountAlias,
50
+ sessionKeyPassword: Redacted.value(sessionKeyPassword),
51
+ ownerKeystorePassword: Redacted.value(ownerKeystorePassword),
52
+ policyParams
53
+ };
54
+ }
55
+ const res = yield* sessionKeyManager.createSessionKey(params);
56
+ const data = {
57
+ ...res.data.sessionKeyType === "ecdsa" ? { sessionKeyAddress: res.data.sessionKeyAddress } : { passKeyName: res.data.passKeyName },
58
+ smartAccount: res.data.smartAccountAlias,
59
+ chains: res.data.serializedAccounts.map((a) => getChain(a.chain).name)
60
+ };
61
+ if (globalFlags.quiet) return;
62
+ const output = yield* outputFormatter.format(data, globalFlags.out);
63
+ yield* Console.log(output);
64
+ });
65
+ const alias = Flag.string("alias").pipe(Flag.withDescription("The alias of the session key to create"), Flag.withAlias("a"), Flag.optional);
66
+ const smartAccountAlias = Flag.string("smart-account").pipe(Flag.withDescription("The alias of the smart account to create session key for"), Flag.withAlias("sa"), Flag.optional);
67
+ const sessionKeyPassword = Flag.redacted("password").pipe(Flag.withDescription("Password to encrypt session key"), Flag.withAlias("p"), Flag.optional);
68
+ const ownerKeystorePassword = Flag.redacted("owner-password").pipe(Flag.withDescription("Password to encrypt session key"), Flag.withAlias("op"), Flag.optional);
69
+ /**
70
+ * Command that creates a new session key and stores it locally.
71
+ */
72
+ const createSessionKeyCommand = Command.make("create", {
73
+ alias,
74
+ smartAccountAlias,
75
+ sessionKeyPassword,
76
+ ownerKeystorePassword
77
+ }, ({ alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword }) => handler(alias, smartAccountAlias, sessionKeyPassword, ownerKeystorePassword)).pipe(Command.withAlias("c"), Command.withDescription("Creates a new session key"), Command.withExamples([{
78
+ command: "namera session-key create",
79
+ description: "Creates a new session key with interactive prompts"
80
+ }, {
81
+ command: "namera schema session-key.create",
82
+ description: "Get the schema for session key create command"
83
+ }]));
84
+ //#endregion
85
+ export { createSessionKeyCommand };
86
+
87
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["PromptManager.PromptManager","Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","SessionKeyManager.SessionKeyManager","OutputFormatter.OutputFormatter"],"sources":["../../../../src/commands/session-key/create/index.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAM,WACJ,WACA,uBACA,wBACA,8BAEA,OAAO,IAAI,aAAa;CACtB,MAAM,gBAAgB,OAAOA;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,MAAM,QAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,yCAAyC,EAC9D,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;AAED,MAAM,oBAAoB,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;CAAO;CAAmB;CAAoB;CAAuB,GACtE,EAAE,OAAO,mBAAmB,oBAAoB,4BAC/C,QACE,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"}
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { Effect } from "effect";
3
+ import { Prompt } from "effect/unstable/cli";
4
+ //#region src/commands/session-key/create/prompts/base.ts
5
+ const policyChoices = [
6
+ {
7
+ description: "Grant access to all operations",
8
+ title: "Sudo Permission",
9
+ value: "sudo"
10
+ },
11
+ {
12
+ description: "Whitelist addresses, contract and functions",
13
+ title: "Call Permission",
14
+ value: "call"
15
+ },
16
+ {
17
+ description: "Specify the start and end time for when the key is valid",
18
+ title: "Timestamp Permission",
19
+ value: "timestamp"
20
+ },
21
+ {
22
+ description: "Specify the allowed gas usage for the session key",
23
+ title: "Gas Permission",
24
+ value: "gas"
25
+ },
26
+ {
27
+ description: "Specify which addresses can verify signatures from this session key",
28
+ title: "Signature Permission",
29
+ value: "signature-caller"
30
+ },
31
+ {
32
+ description: "Specify the allowed gas usage for the session key",
33
+ title: "Rate Limit Permission",
34
+ value: "rate-limit"
35
+ },
36
+ {
37
+ description: "Complete the session key creation",
38
+ title: "Done",
39
+ value: "done"
40
+ }
41
+ ];
42
+ const policyChoicePrompt = (prevPolicies) => Effect.gen(function* () {
43
+ const choices = policyChoices.filter((c) => !prevPolicies.some((p) => p.type === c.value));
44
+ return yield* Prompt.select({
45
+ choices,
46
+ message: "Select Permission type you want to add for this session key"
47
+ });
48
+ });
49
+ //#endregion
50
+ export { policyChoicePrompt };
51
+
52
+ //# sourceMappingURL=base.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/base.ts"],"sourcesContent":["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"],"mappings":";;;;AAKA,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,CAEa;EACd"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ import { addressPrompt, etherPrompt } from "./common.mjs";
3
+ import { Effect, FileSystem } from "effect";
4
+ import { Prompt } from "effect/unstable/cli";
5
+ import { parseEther, toFunctionSelector } from "viem";
6
+ //#region src/commands/session-key/create/prompts/call.ts
7
+ const getEOAPermission = () => Effect.gen(function* () {
8
+ return [{
9
+ target: yield* addressPrompt("Enter target address:"),
10
+ valueLimit: parseEther(yield* etherPrompt("Max value that can be transferred (in ETH units):"), "wei")
11
+ }];
12
+ });
13
+ const getSmartContractPermission = () => Effect.gen(function* () {
14
+ const fs = yield* FileSystem.FileSystem;
15
+ const address = yield* addressPrompt("Enter smart contract address:");
16
+ const maxLimit = yield* etherPrompt("Max value that can be transferred (in ETH units)");
17
+ const abiFilePath = yield* Prompt.file({ message: "Select the ABI file for the smart contract" });
18
+ const abiString = yield* fs.readFileString(abiFilePath).pipe(Effect.orDie);
19
+ const functions = JSON.parse(abiString).filter((e) => e.type === "function");
20
+ const allowedFunctions = yield* Prompt.multiSelect({
21
+ choices: functions.map((f) => {
22
+ let signature = `${f.name}(`;
23
+ for (let i = 0; i < f.inputs.length; i++) {
24
+ const sep = f.inputs.length === 0 || i === f.inputs.length - 1 ? "" : ", ";
25
+ const input = f.inputs[i];
26
+ signature += `${input.type}${input.name ? ` ${input.name}` : ""}${sep}`;
27
+ }
28
+ signature += ")";
29
+ return {
30
+ description: signature,
31
+ title: f.name,
32
+ value: f
33
+ };
34
+ }),
35
+ message: "Select the functions you want to allow",
36
+ min: 1
37
+ });
38
+ const weiUnits = parseEther(maxLimit);
39
+ return allowedFunctions.map((f) => {
40
+ return {
41
+ abi: [f],
42
+ functionName: f.name,
43
+ selector: toFunctionSelector(f),
44
+ target: address,
45
+ valueLimit: weiUnits
46
+ };
47
+ });
48
+ });
49
+ const getPermissions = () => Effect.gen(function* () {
50
+ const permissions = [];
51
+ const targetAddressPrompt = Prompt.select({
52
+ choices: [{
53
+ title: "EOA",
54
+ value: "eoa"
55
+ }, {
56
+ title: "Smart Contract",
57
+ value: "smart-contract"
58
+ }],
59
+ message: "Select target address type"
60
+ });
61
+ while (true) {
62
+ if (permissions.length > 0) {
63
+ if (!(yield* Prompt.confirm({ message: "Do you want to add another call permission?" }))) break;
64
+ }
65
+ if ((yield* targetAddressPrompt) === "eoa") {
66
+ const res = yield* getEOAPermission();
67
+ permissions.push(...res);
68
+ } else {
69
+ const res = yield* getSmartContractPermission();
70
+ permissions.push(...res);
71
+ }
72
+ }
73
+ return permissions;
74
+ });
75
+ const getCallPolicyParams = Effect.gen(function* () {
76
+ return {
77
+ permissions: yield* getPermissions(),
78
+ policyVersion: "0.0.4",
79
+ type: "call"
80
+ };
81
+ });
82
+ //#endregion
83
+ export { getCallPolicyParams };
84
+
85
+ //# sourceMappingURL=call.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/call.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAqBA,MAAM,yBACJ,OAAO,IAAI,aAAa;AAOtB,QAAO,CACL;EACU,eARU,cAAc,wBAAwB;EASxD,YALa,WAAW,OAHF,YACxB,oDACD,EACuC,MAKxB;EACb,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,UAEL,CAAI,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;GAGI;EACP;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,GAIvB;OAAI,EAAC,OAHkB,OAAO,QAAQ,EACpC,SAAS,+CACV,CAAC,EACY;;AAKhB,OAAI,OAFyB,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,oBAHyB,gBAAgB;EAIzC,eAAe;EACf,MAAM;EACP;EACD"}
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { EthereumAddress } from "../../../../schema/common.mjs";
3
+ import "../../../../schema/index.mjs";
4
+ import { Effect, Option, Schema } from "effect";
5
+ import { Prompt } from "effect/unstable/cli";
6
+ //#region src/commands/session-key/create/prompts/common.ts
7
+ const addressPrompt = (message) => Prompt.text({
8
+ message,
9
+ validate: (value) => Effect.gen(function* () {
10
+ const res = Schema.decodeUnknownOption(EthereumAddress)(value);
11
+ if (Option.isNone(res)) return yield* Effect.fail("Invalid Ethereum Address");
12
+ return value;
13
+ })
14
+ });
15
+ const etherPrompt = (message) => Prompt.text({
16
+ message,
17
+ validate: (val) => Effect.gen(function* () {
18
+ const schema = Schema.NumberFromString.check(Schema.isGreaterThanOrEqualTo(0));
19
+ const res = Schema.decodeOption(schema)(val);
20
+ if (Option.isNone(res)) return yield* Effect.fail("Invalid Number");
21
+ return res.value.toString();
22
+ })
23
+ });
24
+ //#endregion
25
+ export { addressPrompt, etherPrompt };
26
+
27
+ //# sourceMappingURL=common.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/common.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAKA,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"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { etherPrompt } from "./common.mjs";
3
+ import { Effect } from "effect";
4
+ import { Prompt } from "effect/unstable/cli";
5
+ import { parseEther } from "viem";
6
+ //#region src/commands/session-key/create/prompts/gas.ts
7
+ const getGasPolicyParams = Effect.gen(function* () {
8
+ const allowed = yield* etherPrompt("Total amount of gas allowed (in ETH units)");
9
+ const enforcePaymaster = yield* Prompt.confirm({ message: "Should UserOperations require Paymaster?" });
10
+ return {
11
+ amount: parseEther(allowed),
12
+ type: "gas",
13
+ enforcePaymaster
14
+ };
15
+ });
16
+ //#endregion
17
+ export { getGasPolicyParams };
18
+
19
+ //# sourceMappingURL=gas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gas.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/gas.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAQA,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,QAGlB;EACR,MAAM;EACN;EACD;EACD"}
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import { policyChoicePrompt } from "./base.mjs";
3
+ import { getCallPolicyParams } from "./call.mjs";
4
+ import { getGasPolicyParams } from "./gas.mjs";
5
+ import { getRateLimitPolicyParams } from "./rate-limit.mjs";
6
+ import { getSignatureCallerPolicyParams } from "./signature-caller.mjs";
7
+ import { getTimestampPolicyParams } from "./timestamp.mjs";
8
+ import { Effect } from "effect";
9
+ import { Prompt } from "effect/unstable/cli";
10
+ //#region src/commands/session-key/create/prompts/index.ts
11
+ const getPoliciesFromUser = () => Effect.gen(function* () {
12
+ const policyParams = [];
13
+ while (true) {
14
+ if (policyParams.length > 0) {
15
+ if (!(yield* Prompt.confirm({ message: "Do you want to add another policy?" }))) break;
16
+ }
17
+ const policyType = yield* policyChoicePrompt(policyParams);
18
+ if (policyType === "sudo") {
19
+ policyParams.push({ type: "sudo" });
20
+ break;
21
+ }
22
+ if (policyType === "timestamp") {
23
+ const res = yield* getTimestampPolicyParams;
24
+ policyParams.push(res);
25
+ } else if (policyType === "call") {
26
+ const res = yield* getCallPolicyParams;
27
+ policyParams.push(res);
28
+ } else if (policyType === "gas") {
29
+ const res = yield* getGasPolicyParams;
30
+ policyParams.push(res);
31
+ } else if (policyType === "rate-limit") {
32
+ const res = yield* getRateLimitPolicyParams;
33
+ policyParams.push(res);
34
+ } else if (policyType === "signature-caller") {
35
+ const res = yield* getSignatureCallerPolicyParams;
36
+ policyParams.push(res);
37
+ } else break;
38
+ }
39
+ return policyParams;
40
+ });
41
+ //#endregion
42
+ export { getPoliciesFromUser };
43
+
44
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/index.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;AAYA,MAAa,4BAEX,OAAO,IAAI,aAAa;CACtB,MAAM,eAA+B,EAAE;AAEvC,QAAO,MAAM;AACX,MAAI,aAAa,SAAS,GAIxB;OAAI,EAAC,OAHkB,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"}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ import { Duration, Effect } from "effect";
3
+ import { Prompt } from "effect/unstable/cli";
4
+ //#region src/commands/session-key/create/prompts/rate-limit.ts
5
+ /** biome-ignore-all lint/suspicious/noExplicitAny: safe */
6
+ const getRateLimitPolicyParams = Effect.gen(function* () {
7
+ const interval = yield* Prompt.text({
8
+ message: "Duration for which rate limit is enforced? (e.g. 1 hour, 1 day, 1 week)",
9
+ validate: (v) => Effect.gen(function* () {
10
+ if (Duration.fromInput(v)._tag === "None") return yield* Effect.fail("Invalid duration");
11
+ return v;
12
+ })
13
+ });
14
+ const intervalDuration = Duration.fromInputUnsafe(interval);
15
+ const count = yield* Prompt.integer({
16
+ message: "Number of requests allowed per interval.",
17
+ validate: (v) => Effect.gen(function* () {
18
+ if (v < 1) return yield* Effect.fail("Count must be greater than 0");
19
+ return v;
20
+ })
21
+ });
22
+ const startAt = yield* Prompt.date({
23
+ initial: /* @__PURE__ */ new Date(),
24
+ message: "Date at which the rate limit is enforced.",
25
+ validate: (d) => Effect.gen(function* () {
26
+ if (d < /* @__PURE__ */ new Date()) return yield* Effect.fail("Date must be in the future");
27
+ return d;
28
+ })
29
+ });
30
+ return {
31
+ type: "rate-limit",
32
+ count,
33
+ interval: Duration.toMillis(intervalDuration),
34
+ startAt: Math.floor(startAt.getTime() / 1e3)
35
+ };
36
+ });
37
+ //#endregion
38
+ export { getRateLimitPolicyParams };
39
+
40
+ //# sourceMappingURL=rate-limit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/rate-limit.ts"],"sourcesContent":["/** 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"],"mappings":";;;;;AAMA,MAAa,2BAA2B,OAAO,IAAI,aAAa;CAC9D,MAAM,WAAW,OAAO,OAAO,KAAK;EAClC,SACE;EACF,WAAW,MACT,OAAO,IAAI,aAAa;AAEtB,OADc,SAAS,UAAU,EAC7B,CAAM,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"}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { EthereumAddress } from "../../../../schema/common.mjs";
3
+ import "../../../../schema/index.mjs";
4
+ import { Effect, Schema } from "effect";
5
+ import { Prompt } from "effect/unstable/cli";
6
+ //#region src/commands/session-key/create/prompts/signature-caller.ts
7
+ const getSignatureCallerPolicyParams = Effect.gen(function* () {
8
+ return {
9
+ type: "signature-caller",
10
+ allowedCallers: (yield* Prompt.text({
11
+ message: "Comma-separated list of allowed callers:",
12
+ validate: (v) => Effect.gen(function* () {
13
+ const address = v.split(",").map((a) => a.trim());
14
+ for (let i = 0; i < address.length; i++) {
15
+ const a = address[i];
16
+ if (Schema.decodeUnknownOption(EthereumAddress)(a)._tag === "None") return yield* Effect.fail(`Invalid Ethereum Address at index ${i}`);
17
+ }
18
+ return v;
19
+ })
20
+ })).split(",").map((a) => a.trim()).map((a) => Schema.decodeUnknownSync(EthereumAddress)(a))
21
+ };
22
+ });
23
+ //#endregion
24
+ export { getSignatureCallerPolicyParams };
25
+
26
+ //# sourceMappingURL=signature-caller.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-caller.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/signature-caller.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAKA,MAAa,iCAAiC,OAAO,IAAI,aAAa;AAwBpE,QAAO;EACL,MAAM;EACN,iBAPqB,OAlBA,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,EACpD,CAAI,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,CAIxD;EACD;EACD"}
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { Effect } from "effect";
3
+ import { Prompt } from "effect/unstable/cli";
4
+ //#region src/commands/session-key/create/prompts/timestamp.ts
5
+ const getTimestampPolicyParams = Effect.gen(function* () {
6
+ const validAfter = yield* Prompt.date({
7
+ initial: /* @__PURE__ */ new Date(),
8
+ message: "Time after which the key becomes valid.",
9
+ validate: (d) => Effect.gen(function* () {
10
+ if (d < /* @__PURE__ */ new Date()) return yield* Effect.fail("Date must be in the future");
11
+ return d;
12
+ })
13
+ });
14
+ const validUntil = yield* Prompt.date({
15
+ initial: /* @__PURE__ */ new Date(),
16
+ message: "Time until which the key becomes valid.",
17
+ validate: (d) => Effect.gen(function* () {
18
+ if (d < /* @__PURE__ */ new Date()) return yield* Effect.fail("Date must be in the future");
19
+ if (d < validAfter) return yield* Effect.fail("Valid until must be after valid after");
20
+ return d;
21
+ })
22
+ });
23
+ return {
24
+ type: "timestamp",
25
+ validAfter: Math.floor(validAfter.getTime() / 1e3),
26
+ validUntil: Math.floor(validUntil.getTime() / 1e3)
27
+ };
28
+ });
29
+ //#endregion
30
+ export { getTimestampPolicyParams };
31
+
32
+ //# sourceMappingURL=timestamp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamp.mjs","names":[],"sources":["../../../../../src/commands/session-key/create/prompts/timestamp.ts"],"sourcesContent":["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"],"mappings":";;;;AAKA,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"}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { createSessionKeyCommand } from "./create/index.mjs";
3
+ import { getSessionKeyInfoCommand } from "./info.mjs";
4
+ import { listSessionKeysCommand } from "./list.mjs";
5
+ import { removeSessionKeyCommand } from "./remove.mjs";
6
+ import { getSessionKeyStatusCommand } from "./status.mjs";
7
+ import { Effect } from "effect";
8
+ import { CliError, Command } from "effect/unstable/cli";
9
+ //#region src/commands/session-key/index.ts
10
+ /**
11
+ * Command group for session-key related operations.
12
+ */
13
+ const sessionKeyCommands = Command.make("session-key", {}, () => Effect.fail(new CliError.ShowHelp({
14
+ commandPath: ["namera", "session-key"],
15
+ errors: []
16
+ }))).pipe(Command.withAlias("sk"), Command.withDescription("Session Key management commands."), Command.withSubcommands([
17
+ createSessionKeyCommand,
18
+ listSessionKeysCommand,
19
+ getSessionKeyInfoCommand,
20
+ getSessionKeyStatusCommand,
21
+ removeSessionKeyCommand
22
+ ]));
23
+ //#endregion
24
+ export { sessionKeyCommands };
25
+
26
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/commands/session-key/index.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;;;AAYA,MAAa,qBAAqB,QAAQ,KAAK,eAAe,EAAE,QAC9D,OAAO,KACL,IAAI,SAAS,SAAS;CACpB,aAAa,CAAC,UAAU,cAAc;CACtC,QAAQ,EAAE;CACX,CAAC,CACH,CACF,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,mCAAmC,EAC3D,QAAQ,gBAAgB;CACtB;CACA;CACA;CACA;CACA;CACD,CAAC,CACH"}