@namera-ai/cli 0.1.4 → 1.0.0

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 (148) hide show
  1. package/README.md +91 -221
  2. package/dist/index.js +1660 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +57 -50
  5. package/LICENSE +0 -201
  6. package/dist/commands/index.mjs +0 -21
  7. package/dist/commands/index.mjs.map +0 -1
  8. package/dist/commands/keystore/create.mjs +0 -74
  9. package/dist/commands/keystore/create.mjs.map +0 -1
  10. package/dist/commands/keystore/decrypt.mjs +0 -71
  11. package/dist/commands/keystore/decrypt.mjs.map +0 -1
  12. package/dist/commands/keystore/import.mjs +0 -84
  13. package/dist/commands/keystore/import.mjs.map +0 -1
  14. package/dist/commands/keystore/index.mjs +0 -28
  15. package/dist/commands/keystore/index.mjs.map +0 -1
  16. package/dist/commands/keystore/info.mjs +0 -62
  17. package/dist/commands/keystore/info.mjs.map +0 -1
  18. package/dist/commands/keystore/list.mjs +0 -46
  19. package/dist/commands/keystore/list.mjs.map +0 -1
  20. package/dist/commands/keystore/remove.mjs +0 -51
  21. package/dist/commands/keystore/remove.mjs.map +0 -1
  22. package/dist/commands/mcp/index.mjs +0 -13
  23. package/dist/commands/mcp/index.mjs.map +0 -1
  24. package/dist/commands/mcp/start.mjs +0 -82
  25. package/dist/commands/mcp/start.mjs.map +0 -1
  26. package/dist/commands/schema/index.mjs +0 -53
  27. package/dist/commands/schema/index.mjs.map +0 -1
  28. package/dist/commands/session-key/create/index.mjs +0 -87
  29. package/dist/commands/session-key/create/index.mjs.map +0 -1
  30. package/dist/commands/session-key/create/prompts/base.mjs +0 -52
  31. package/dist/commands/session-key/create/prompts/base.mjs.map +0 -1
  32. package/dist/commands/session-key/create/prompts/call.mjs +0 -85
  33. package/dist/commands/session-key/create/prompts/call.mjs.map +0 -1
  34. package/dist/commands/session-key/create/prompts/common.mjs +0 -27
  35. package/dist/commands/session-key/create/prompts/common.mjs.map +0 -1
  36. package/dist/commands/session-key/create/prompts/gas.mjs +0 -19
  37. package/dist/commands/session-key/create/prompts/gas.mjs.map +0 -1
  38. package/dist/commands/session-key/create/prompts/index.mjs +0 -44
  39. package/dist/commands/session-key/create/prompts/index.mjs.map +0 -1
  40. package/dist/commands/session-key/create/prompts/rate-limit.mjs +0 -40
  41. package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +0 -1
  42. package/dist/commands/session-key/create/prompts/signature-caller.mjs +0 -26
  43. package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +0 -1
  44. package/dist/commands/session-key/create/prompts/timestamp.mjs +0 -32
  45. package/dist/commands/session-key/create/prompts/timestamp.mjs.map +0 -1
  46. package/dist/commands/session-key/index.mjs +0 -26
  47. package/dist/commands/session-key/index.mjs.map +0 -1
  48. package/dist/commands/session-key/info.mjs +0 -64
  49. package/dist/commands/session-key/info.mjs.map +0 -1
  50. package/dist/commands/session-key/list.mjs +0 -54
  51. package/dist/commands/session-key/list.mjs.map +0 -1
  52. package/dist/commands/session-key/remove.mjs +0 -51
  53. package/dist/commands/session-key/remove.mjs.map +0 -1
  54. package/dist/commands/session-key/status.mjs +0 -64
  55. package/dist/commands/session-key/status.mjs.map +0 -1
  56. package/dist/commands/smart-account/create.mjs +0 -94
  57. package/dist/commands/smart-account/create.mjs.map +0 -1
  58. package/dist/commands/smart-account/import.mjs +0 -45
  59. package/dist/commands/smart-account/import.mjs.map +0 -1
  60. package/dist/commands/smart-account/index.mjs +0 -30
  61. package/dist/commands/smart-account/index.mjs.map +0 -1
  62. package/dist/commands/smart-account/info.mjs +0 -66
  63. package/dist/commands/smart-account/info.mjs.map +0 -1
  64. package/dist/commands/smart-account/list.mjs +0 -48
  65. package/dist/commands/smart-account/list.mjs.map +0 -1
  66. package/dist/commands/smart-account/remove.mjs +0 -54
  67. package/dist/commands/smart-account/remove.mjs.map +0 -1
  68. package/dist/commands/smart-account/status.mjs +0 -63
  69. package/dist/commands/smart-account/status.mjs.map +0 -1
  70. package/dist/dto/index.mjs +0 -6
  71. package/dist/dto/keystore.mjs +0 -44
  72. package/dist/dto/keystore.mjs.map +0 -1
  73. package/dist/dto/mcp.mjs +0 -13
  74. package/dist/dto/mcp.mjs.map +0 -1
  75. package/dist/dto/session-key.mjs +0 -54
  76. package/dist/dto/session-key.mjs.map +0 -1
  77. package/dist/dto/smart-account.mjs +0 -45
  78. package/dist/dto/smart-account.mjs.map +0 -1
  79. package/dist/flags/global.mjs +0 -29
  80. package/dist/flags/global.mjs.map +0 -1
  81. package/dist/flags/shared.mjs +0 -11
  82. package/dist/flags/shared.mjs.map +0 -1
  83. package/dist/helpers/humanize.mjs +0 -153
  84. package/dist/helpers/humanize.mjs.map +0 -1
  85. package/dist/helpers/paths.mjs +0 -31
  86. package/dist/helpers/paths.mjs.map +0 -1
  87. package/dist/helpers/policy.mjs +0 -89
  88. package/dist/helpers/policy.mjs.map +0 -1
  89. package/dist/helpers/pretty.mjs +0 -71
  90. package/dist/helpers/pretty.mjs.map +0 -1
  91. package/dist/index.d.mts +0 -2
  92. package/dist/index.mjs +0 -36
  93. package/dist/index.mjs.map +0 -1
  94. package/dist/layers/config.mjs +0 -124
  95. package/dist/layers/config.mjs.map +0 -1
  96. package/dist/layers/index.mjs +0 -11
  97. package/dist/layers/keystore.mjs +0 -225
  98. package/dist/layers/keystore.mjs.map +0 -1
  99. package/dist/layers/mcp-context.mjs +0 -8
  100. package/dist/layers/mcp-context.mjs.map +0 -1
  101. package/dist/layers/mcp.mjs +0 -31
  102. package/dist/layers/mcp.mjs.map +0 -1
  103. package/dist/layers/output.mjs +0 -21
  104. package/dist/layers/output.mjs.map +0 -1
  105. package/dist/layers/prompt.mjs +0 -78
  106. package/dist/layers/prompt.mjs.map +0 -1
  107. package/dist/layers/session-key.mjs +0 -218
  108. package/dist/layers/session-key.mjs.map +0 -1
  109. package/dist/layers/smart-account.mjs +0 -175
  110. package/dist/layers/smart-account.mjs.map +0 -1
  111. package/dist/layers/web3.mjs +0 -83
  112. package/dist/layers/web3.mjs.map +0 -1
  113. package/dist/mcp/helpers/common.mjs +0 -9
  114. package/dist/mcp/helpers/common.mjs.map +0 -1
  115. package/dist/mcp/helpers/index.mjs +0 -4
  116. package/dist/mcp/helpers/session-key.mjs +0 -129
  117. package/dist/mcp/helpers/session-key.mjs.map +0 -1
  118. package/dist/mcp/index.mjs +0 -43
  119. package/dist/mcp/index.mjs.map +0 -1
  120. package/dist/mcp/mcp.mjs +0 -15
  121. package/dist/mcp/mcp.mjs.map +0 -1
  122. package/dist/mcp/tools/account/address.mjs +0 -20
  123. package/dist/mcp/tools/account/address.mjs.map +0 -1
  124. package/dist/mcp/tools/account/get-balance.mjs +0 -54
  125. package/dist/mcp/tools/account/get-balance.mjs.map +0 -1
  126. package/dist/mcp/tools/account/index.mjs +0 -15
  127. package/dist/mcp/tools/account/index.mjs.map +0 -1
  128. package/dist/mcp/tools/read/index.mjs +0 -11
  129. package/dist/mcp/tools/read/index.mjs.map +0 -1
  130. package/dist/mcp/tools/read/read-contract.mjs +0 -49
  131. package/dist/mcp/tools/read/read-contract.mjs.map +0 -1
  132. package/dist/mcp/tools/transaction/execute-transaction.mjs +0 -38
  133. package/dist/mcp/tools/transaction/execute-transaction.mjs.map +0 -1
  134. package/dist/mcp/tools/transaction/index.mjs +0 -15
  135. package/dist/mcp/tools/transaction/index.mjs.map +0 -1
  136. package/dist/mcp/tools/transaction/native-transfer.mjs +0 -59
  137. package/dist/mcp/tools/transaction/native-transfer.mjs.map +0 -1
  138. package/dist/schema/chain.mjs +0 -124
  139. package/dist/schema/chain.mjs.map +0 -1
  140. package/dist/schema/common.mjs +0 -29
  141. package/dist/schema/common.mjs.map +0 -1
  142. package/dist/schema/index.mjs +0 -5
  143. package/dist/schema/policy.mjs +0 -114
  144. package/dist/schema/policy.mjs.map +0 -1
  145. package/dist/schema/tx.mjs +0 -19
  146. package/dist/schema/tx.mjs.map +0 -1
  147. package/dist/types/index.mjs +0 -11
  148. package/dist/types/index.mjs.map +0 -1
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- import { supportedChains } from "../schema/chain.mjs";
3
- import { Flag } from "effect/unstable/cli";
4
- const chainAndRpcUrl = {
5
- chain: Flag.choice("chain", Object.keys(supportedChains)).pipe(Flag.withDescription("Chain Name"), Flag.optional),
6
- rpcUrl: Flag.string("rpc-url").pipe(Flag.withDescription("RPC URL"), Flag.optional)
7
- };
8
- //#endregion
9
- export { chainAndRpcUrl };
10
-
11
- //# sourceMappingURL=shared.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.mjs","names":[],"sources":["../../src/flags/shared.ts"],"sourcesContent":["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"],"mappings":";;;AAcA,MAAa,iBAAiB;CAAE,OAVlB,KAAK,OACjB,SACA,OAAO,KAAK,gBAAgB,CAC7B,CAAC,KAAK,KAAK,gBAAgB,aAAa,EAAE,KAAK,SAOhB;CAAO,QALxB,KAAK,OAAO,UAAU,CAAC,KACpC,KAAK,gBAAgB,UAAU,EAC/B,KAAK,SAGgC;CAAQ"}
@@ -1,153 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Duration } from "effect";
3
- import { formatEther, zeroAddress } from "viem";
4
- import { deserializePermissionAccountParams } from "@namera-ai/sdk/session-key";
5
- //#region src/helpers/humanize.ts
6
- const humanizeDuration = (input) => {
7
- const millis = Duration.toMillis(Duration.fromInputUnsafe(input));
8
- let seconds = Math.floor(millis / 1e3);
9
- const units = [
10
- {
11
- label: "year",
12
- value: 3600 * 24 * 365
13
- },
14
- {
15
- label: "month",
16
- value: 3600 * 24 * 30
17
- },
18
- {
19
- label: "day",
20
- value: 3600 * 24
21
- },
22
- {
23
- label: "hour",
24
- value: 3600
25
- },
26
- {
27
- label: "minute",
28
- value: 60
29
- },
30
- {
31
- label: "second",
32
- value: 1
33
- }
34
- ];
35
- const parts = [];
36
- for (const unit of units) if (seconds >= unit.value) {
37
- const count = Math.floor(seconds / unit.value);
38
- seconds %= unit.value;
39
- parts.push(`${count} ${unit.label}${count > 1 ? "s" : ""}`);
40
- }
41
- return parts.length > 0 ? parts.join(" ") : "0 seconds";
42
- };
43
- const humanizeRelativeTime = (target) => {
44
- const now = Date.now();
45
- const diff = (target instanceof Date ? target.getTime() : target * 1e3) - now;
46
- const seconds = Math.floor(Math.abs(diff) / 1e3);
47
- for (const unit of [
48
- {
49
- label: "year",
50
- value: 31536e3
51
- },
52
- {
53
- label: "month",
54
- value: 2592e3
55
- },
56
- {
57
- label: "day",
58
- value: 86400
59
- },
60
- {
61
- label: "hour",
62
- value: 3600
63
- },
64
- {
65
- label: "minute",
66
- value: 60
67
- },
68
- {
69
- label: "second",
70
- value: 1
71
- }
72
- ]) if (seconds >= unit.value) {
73
- const count = Math.floor(seconds / unit.value);
74
- const formatted = `${count} ${unit.label}${count > 1 ? "s" : ""}`;
75
- return diff > 0 ? `in ${formatted}` : `${formatted} ago`;
76
- }
77
- return "just now";
78
- };
79
- const humanizePolicyParams = (serializedAccount) => {
80
- const params = deserializePermissionAccountParams(serializedAccount);
81
- const result = {};
82
- result.permissionId = params.permissionParams.permissionId;
83
- for (const policy of params.permissionParams.policies ?? []) {
84
- const params = policy.policyParams;
85
- if (params.type === "sudo") result.sudoPolicy = { enabled: true };
86
- else if (params.type === "gas") result.gasPolicy = {
87
- enabled: true,
88
- allowed: `${formatEther(params.allowed ?? 0n)} ETH`,
89
- ...params.enforcePaymaster && { enforcePaymaster: params.enforcePaymaster },
90
- ...params.allowedPaymaster !== zeroAddress && { allowedPaymaster: params.allowedPaymaster }
91
- };
92
- else if (params.type === "timestamp") {
93
- const validAfter = params.validAfter ?? 0;
94
- const validUntil = params.validUntil ?? 0;
95
- result.timestampPolicy = {
96
- enabled: true,
97
- starts: humanizeRelativeTime(validAfter),
98
- ends: humanizeRelativeTime(validUntil)
99
- };
100
- } else if (params.type === "rate-limit") {
101
- const formattedInterval = humanizeDuration(params.interval ?? 0);
102
- result.rateLimitPolicy = {
103
- enabled: true,
104
- count: params.count,
105
- interval: formattedInterval,
106
- starts: humanizeRelativeTime(params.startAt ?? 0)
107
- };
108
- } else if (params.type === "signature-caller") result.signatureCallerPolicy = {
109
- enabled: true,
110
- allowedCallers: params.allowedCallers
111
- };
112
- else if (params.type === "call") {
113
- result.callPolicy = {
114
- enabled: true,
115
- policyVersion: params.policyVersion
116
- };
117
- if (!params.permissions || params.permissions.length === 0) continue;
118
- for (const permission of params.permissions) {
119
- result.callPolicy.permissions = result.callPolicy.permissions ?? [];
120
- if ("abi" in permission) {
121
- const formattedValue = formatEther(permission.valueLimit ?? 0n);
122
- const abiFn = permission.abi?.find((f) => f.type === "function" && f.name === permission.functionName);
123
- const cyan = "\x1B[36m";
124
- const yellow = "\x1B[33m";
125
- const magenta = "\x1B[35m";
126
- const reset = "\x1B[0m";
127
- let fnName = `${magenta}${permission.functionName ?? "unknown"}${reset}(`;
128
- if (abiFn) abiFn.inputs.forEach((input, i) => {
129
- if (i > 0) fnName += ", ";
130
- fnName += `${cyan}${input.type}${reset}${input.name ? ` ${yellow}${input.name}${reset}` : ""}`;
131
- });
132
- fnName += ")";
133
- result.callPolicy.permissions.push({
134
- targetAddress: permission.target,
135
- valueLimit: `${formattedValue} ETH`,
136
- functionName: fnName
137
- });
138
- } else {
139
- const formattedValue = formatEther(permission.valueLimit ?? 0n);
140
- result.callPolicy.permissions.push({
141
- targetAddress: permission.target,
142
- valueLimit: `${formattedValue} ETH`
143
- });
144
- }
145
- }
146
- }
147
- }
148
- return result;
149
- };
150
- //#endregion
151
- export { humanizePolicyParams };
152
-
153
- //# sourceMappingURL=humanize.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"humanize.mjs","names":[],"sources":["../../src/helpers/humanize.ts"],"sourcesContent":["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"],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Schema } from "effect";
3
- //#region src/helpers/paths.ts
4
- /** biome-ignore-all lint/suspicious/noExplicitAny: safe */
5
- /**
6
- * Returns the value at a dot-delimited path within a nested object.
7
- *
8
- * @param obj - Object to traverse.
9
- * @param path - Dot-delimited lookup path.
10
- */
11
- const getSchema = (obj, path) => {
12
- return path.split(".").reduce((acc, key) => acc[key], obj);
13
- };
14
- /**
15
- * Extracts all dot-delimited paths that terminate at Effect schemas.
16
- *
17
- * @param obj - Object tree to scan.
18
- * @param prefix - Internal prefix used to build nested paths.
19
- */
20
- const extractPaths = (obj, prefix = "") => {
21
- return Object.entries(obj).flatMap(([key, value]) => {
22
- const newPath = prefix ? `${prefix}.${key}` : key;
23
- if (Schema.isSchema(value)) return [newPath];
24
- if (typeof value === "object" && value !== null) return extractPaths(value, newPath);
25
- return [];
26
- });
27
- };
28
- //#endregion
29
- export { extractPaths, getSchema };
30
-
31
- //# sourceMappingURL=paths.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.mjs","names":[],"sources":["../../src/helpers/paths.ts"],"sourcesContent":["/** 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"],"mappings":";;;;;;;;;;AAWA,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"}
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env node
2
- import { CallPolicyVersion, CallType, ParamCondition, toCallPolicy, toGasPolicy, toRateLimitPolicy, toSignatureCallerPolicy, toSudoPolicy, toTimestampPolicy } from "@namera-ai/sdk/policy";
3
- //#region src/helpers/policy.ts
4
- /** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */
5
- const toCallPolicyVersion = (version) => {
6
- switch (version) {
7
- case "0.0.1": return CallPolicyVersion.V0_0_1;
8
- case "0.0.2": return CallPolicyVersion.V0_0_2;
9
- case "0.0.3": return CallPolicyVersion.V0_0_3;
10
- case "0.0.4": return CallPolicyVersion.V0_0_4;
11
- case "0.0.5": return CallPolicyVersion.V0_0_5;
12
- default: throw new Error("Invalid call policy version");
13
- }
14
- };
15
- const conditionToParamCondition = (condition) => {
16
- if (condition === "EQUAL") return ParamCondition.EQUAL;
17
- if (condition === "GREATER_THAN") return ParamCondition.GREATER_THAN;
18
- if (condition === "LESS_THAN") return ParamCondition.LESS_THAN;
19
- if (condition === "GREATER_THAN_OR_EQUAL") return ParamCondition.GREATER_THAN_OR_EQUAL;
20
- if (condition === "LESS_THAN_OR_EQUAL") return ParamCondition.LESS_THAN_OR_EQUAL;
21
- if (condition === "NOT_EQUAL") return ParamCondition.NOT_EQUAL;
22
- if (condition === "ONE_OF") return ParamCondition.ONE_OF;
23
- if (condition === "SLICE_EQUAL") return ParamCondition.SLICE_EQUAL;
24
- return ParamCondition.EQUAL;
25
- };
26
- const policyParamsToPolicies = (params) => {
27
- const policies = [];
28
- for (const param of params) if (param.type === "sudo") policies.push(toSudoPolicy({}));
29
- else if (param.type === "timestamp") policies.push(toTimestampPolicy(param));
30
- else if (param.type === "gas") policies.push(toGasPolicy(param));
31
- else if (param.type === "rate-limit") policies.push(toRateLimitPolicy(param));
32
- else if (param.type === "signature-caller") policies.push(toSignatureCallerPolicy(param));
33
- else if (param.type === "call") policies.push(toCallPolicy({
34
- policyVersion: toCallPolicyVersion(param.policyVersion),
35
- permissions: !param.permissions ? void 0 : param.permissions.map((p) => {
36
- const callType = (() => {
37
- if (!p.callType) return CallType.CALL;
38
- if (p.callType === "call") return CallType.CALL;
39
- if (p.callType === "delegatecall") return CallType.DELEGATE_CALL;
40
- return CallType.BATCH_CALL;
41
- })();
42
- if ("abi" in p) return {
43
- callType,
44
- target: p.target,
45
- valueLimit: p.valueLimit,
46
- abi: p.abi,
47
- functionName: p.functionName,
48
- selector: p.selector,
49
- args: !p.args ? void 0 : p.args.map((a) => {
50
- if (a === null) return null;
51
- const c = a.condition;
52
- if (c === "ONE_OF") return {
53
- condition: ParamCondition.ONE_OF,
54
- value: a.value
55
- };
56
- if (c === "SLICE_EQUAL" && "start" in a) return {
57
- condition: ParamCondition.SLICE_EQUAL,
58
- value: a.value,
59
- start: a.start,
60
- length: a.length
61
- };
62
- return {
63
- condition: conditionToParamCondition(c),
64
- value: a.value
65
- };
66
- })
67
- };
68
- return {
69
- callType,
70
- target: p.target,
71
- selector: p.selector,
72
- valueLimit: p.valueLimit,
73
- rules: p.rules ? p.rules.map((r) => {
74
- return {
75
- offset: r.offset,
76
- params: r.params,
77
- condition: conditionToParamCondition(r.condition)
78
- };
79
- }) : void 0
80
- };
81
- })
82
- }));
83
- else throw new Error("Invalid policy type");
84
- return policies;
85
- };
86
- //#endregion
87
- export { policyParamsToPolicies };
88
-
89
- //# sourceMappingURL=policy.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.mjs","names":["ParamConditionCore"],"sources":["../../src/helpers/policy.ts"],"sourcesContent":["/** 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"],"mappings":";;;;AAiBA,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,QAAOA,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,SACA,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,SACA,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;IACL;IACD;EACP,CAAC,CACH;KAED,OAAM,IAAI,MAAM,sBAAsB;AAI1C,QAAO"}
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env node
2
- //#region src/helpers/pretty.ts
3
- /** biome-ignore-all lint/suspicious/noExplicitAny: safe */
4
- const keyColors = [
5
- "\x1B[36m",
6
- "\x1B[35m",
7
- "\x1B[34m",
8
- "\x1B[32m",
9
- "\x1B[33m"
10
- ];
11
- const reset = "\x1B[0m";
12
- const bold = "\x1B[1m";
13
- /**
14
- * Returns a shallow copy of an object with humanized key names.
15
- */
16
- const transformKeys = (obj) => {
17
- return Object.fromEntries(Object.entries(obj).map(([k, v]) => [formatKey(k), v]));
18
- };
19
- /**
20
- * Humanizes a key by spacing words and title-casing tokens.
21
- */
22
- const formatKey = (key) => key.replace(/[_-]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (c) => c.toUpperCase());
23
- /**
24
- * Formats a primitive-like value for display.
25
- */
26
- const formatValue = (value) => {
27
- if (value === null) return "null";
28
- if (typeof value === "bigint") return `${value}n`;
29
- if (value instanceof Date) return value.toISOString();
30
- if (typeof value === "string") return value;
31
- if (typeof value === "number" || typeof value === "boolean") return String(value);
32
- return String(value);
33
- };
34
- /**
35
- * Returns true when a value is a display-friendly primitive.
36
- */
37
- const isPrimitive = (v) => v === null || typeof v !== "object" || v instanceof Date;
38
- /**
39
- * Determines whether an array contains only flat objects of primitives.
40
- */
41
- const isFlatObjectArray = (arr) => arr.length > 0 && arr.every((item) => item && typeof item === "object" && !Array.isArray(item) && Object.values(item).every(isPrimitive));
42
- /**
43
- * Formats objects or arrays into a human-friendly CLI display string.
44
- *
45
- * Uses colorized keys when printing objects, and falls back to tabular
46
- * output for flat object arrays at the root level.
47
- */
48
- const prettyFormat = (input, depth = 0, isRoot = true) => {
49
- const indent = 2;
50
- const maxDepth = 6;
51
- const space = " ".repeat(indent * depth);
52
- if (depth > maxDepth) return `${space}…`;
53
- if (isRoot && Array.isArray(input) && isFlatObjectArray(input)) {
54
- const transformed = input.map(transformKeys);
55
- console.table(transformed);
56
- return "";
57
- }
58
- if (Array.isArray(input)) return input.map((item, i) => {
59
- if (isPrimitive(item)) return `${space}${formatValue(item)}`;
60
- return `${space}[${i}]\n${prettyFormat(item, depth + 1, false)}`;
61
- }).join("\n");
62
- return Object.entries(input).map(([key, value]) => {
63
- const k = `${bold}${keyColors[depth % keyColors.length]}${formatKey(key)}${reset}`;
64
- if (isPrimitive(value)) return `${space}${k}: ${formatValue(value)}`;
65
- return `${space}${k}:\n${prettyFormat(value, depth + 1, false)}`;
66
- }).join("\n");
67
- };
68
- //#endregion
69
- export { prettyFormat };
70
-
71
- //# sourceMappingURL=pretty.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pretty.mjs","names":[],"sources":["../../src/helpers/pretty.ts"],"sourcesContent":["/** 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"],"mappings":";;;AACA,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"}
package/dist/index.d.mts DELETED
@@ -1,2 +0,0 @@
1
-
2
- export { };
package/dist/index.mjs DELETED
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env node
2
- import { globalFlags } from "./flags/global.mjs";
3
- import { ConfigManager, layer } from "./layers/config.mjs";
4
- import { layer as layer$1 } from "./layers/prompt.mjs";
5
- import { layer as layer$2 } from "./layers/keystore.mjs";
6
- import { layer as layer$3 } from "./layers/web3.mjs";
7
- import { layer as layer$4 } from "./layers/smart-account.mjs";
8
- import { layer as layer$5 } from "./layers/session-key.mjs";
9
- import { layer as layer$6 } from "./layers/mcp.mjs";
10
- import { layer as layer$7 } from "./layers/output.mjs";
11
- import "./layers/index.mjs";
12
- import { commands } from "./commands/index.mjs";
13
- import "dotenv/config";
14
- import { NodeRuntime, NodeServices } from "@effect/platform-node";
15
- import { ConfigProvider, Console, Effect, Layer } from "effect";
16
- import { CliError, Command } from "effect/unstable/cli";
17
- //#region src/index.ts
18
- const command = Command.make("namera", {}, () => Effect.fail(new CliError.ShowHelp({
19
- commandPath: ["namera"],
20
- errors: []
21
- }))).pipe(Command.withDescription("Programmable Session keys for Smart Contracts Accounts."), Command.withGlobalFlags(globalFlags), Command.withSubcommands(commands), Command.withExamples([{
22
- command: "namera --help",
23
- description: "Print help"
24
- }, {
25
- command: "namera --version",
26
- description: "Print version"
27
- }]));
28
- const Layers = layer$6.pipe(Layer.provideMerge(layer$5), Layer.provideMerge(layer$4), Layer.provideMerge(layer$2), Layer.provideMerge(layer$3), Layer.provideMerge(layer$1), Layer.provideMerge(layer), Layer.provideMerge(layer$7), Layer.provideMerge(NodeServices.layer));
29
- Effect.gen(function* () {
30
- yield* (yield* ConfigManager).ensureConfigDirExists();
31
- yield* Command.run(command, { version: "0.0.1" });
32
- }).pipe(Effect.provide(Layers), Effect.provideService(ConfigProvider.ConfigProvider, ConfigProvider.fromEnv()), Effect.catchTag("ShowHelp", () => Effect.succeed(void 0)), Effect.catch((e) => Console.error(e.message))).pipe(NodeRuntime.runMain);
33
- //#endregion
34
- export {};
35
-
36
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["SessionKeyManager.layer","SmartAccountManager.layer","KeystoreManager.layer","Web3Service.layer","PromptManager.layer","ConfigManager.layer","OutputFormatter.layer","ConfigManager.ConfigManager"],"sources":["../src/index.ts"],"sourcesContent":["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":";;;;;;;;;;;;;;;;;AAmBA,MAAM,UAAU,QAAQ,KAAK,UAAU,EAAE,QACvC,OAAO,KACL,IAAI,SAAS,SAAS;CACpB,aAAa,CAAC,SAAS;CACvB,QAAQ,EAAE;CACX,CAAC,CACH,CACF,CAAC,KACA,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,aAAaA,QAAwB,EAC3C,MAAM,aAAaC,QAA0B,EAC7C,MAAM,aAAaC,QAAsB,EACzC,MAAM,aAAaC,QAAkB,EACrC,MAAM,aAAaC,QAAoB,EACvC,MAAM,aAAaC,MAAoB,EACvC,MAAM,aAAaC,QAAsB,EACzC,MAAM,aAAa,aAAa,MAAM,CACvC;AAEW,OAAO,IAAI,aAAa;AAElC,SAAO,OADsBC,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,SAAS,kBAAkB,OAAO,QAAQ,KAAK,EAAE,CAAC,EACzD,OAAO,OAAO,MAAM,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAI/C,CAAI,KAAK,YAAY,QAAQ"}
@@ -1,124 +0,0 @@
1
- #!/usr/bin/env node
2
- import { entityName } from "../types/index.mjs";
3
- import { Context, Data, Effect, FileSystem, Layer, Path } from "effect";
4
- import os from "node:os";
5
- //#region src/layers/config.ts
6
- /**
7
- * Domain error for configuration and entity storage operations.
8
- */
9
- var ConfigManagerError = class extends Data.TaggedError("@namera-ai/cli/ConfigManagerError") {};
10
- /**
11
- * Service tag for resolving {@link ConfigManager} from the Effect context.
12
- */
13
- const ConfigManager = Context.Service("@namera-ai/cli/ConfigManager");
14
- /**
15
- * Live layer that persists CLI entities in the user's config directory.
16
- */
17
- const layer = Layer.effect(ConfigManager, Effect.gen(function* () {
18
- const fs = yield* FileSystem.FileSystem;
19
- const path = yield* Path.Path;
20
- const getConfigDirPath = () => Effect.gen(function* () {
21
- const homeDir = yield* Effect.sync(() => os.homedir());
22
- return path.join(homeDir, ".namera");
23
- });
24
- const ensureConfigDirExists = () => Effect.gen(function* () {
25
- const baseDir = yield* getConfigDirPath();
26
- const directoriesToCreate = [
27
- "smart-accounts",
28
- "session-keys",
29
- "keystores"
30
- ].map((dir) => path.join(baseDir, dir));
31
- yield* Effect.forEach(directoriesToCreate, (dirPath) => fs.makeDirectory(dirPath, { recursive: true }).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
32
- code: "InitializationError",
33
- message: e.message
34
- })))), { concurrency: "unbounded" });
35
- });
36
- const getEntityPath = (entity) => Effect.gen(function* () {
37
- const baseDir = yield* getConfigDirPath();
38
- return path.join(baseDir, `${entity.type}s`, entity.alias);
39
- });
40
- const checkEntityExists = (entity) => Effect.gen(function* () {
41
- const entityPath = yield* getEntityPath(entity);
42
- return yield* fs.exists(entityPath).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
43
- code: e.reason._tag,
44
- message: e.message
45
- }))));
46
- });
47
- const getEntity = (entity) => Effect.gen(function* () {
48
- const entityPath = yield* getEntityPath(entity);
49
- if (yield* checkEntityExists(entity)) {
50
- const content = yield* fs.readFileString(entityPath);
51
- return {
52
- alias: entity.alias,
53
- content,
54
- path: entityPath,
55
- type: entity.type
56
- };
57
- }
58
- return yield* Effect.fail(new ConfigManagerError({
59
- code: "EntityNotFound",
60
- message: `${entityName[entity.type]} with alias ${entity.alias} does not exist`
61
- }));
62
- }).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
63
- code: e.reason._tag,
64
- message: e.message
65
- }))));
66
- const getEntitiesForType = (type) => Effect.gen(function* () {
67
- const baseDir = yield* getConfigDirPath();
68
- const entitiesDir = path.join(baseDir, `${type}s`);
69
- const effects = (yield* fs.readDirectory(entitiesDir)).map((entityName) => Effect.gen(function* () {
70
- const entityPath = path.join(entitiesDir, entityName);
71
- return {
72
- alias: entityName,
73
- content: yield* fs.readFileString(entityPath),
74
- path: entityPath,
75
- type
76
- };
77
- }));
78
- return yield* Effect.all(effects, { concurrency: "unbounded" });
79
- }).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
80
- code: e.reason._tag,
81
- message: e.message
82
- }))));
83
- const storeEntity = (entity) => Effect.gen(function* () {
84
- const entityPath = yield* getEntityPath(entity);
85
- if (yield* checkEntityExists({
86
- alias: entity.alias,
87
- type: entity.type
88
- })) return yield* Effect.fail(new ConfigManagerError({
89
- code: "EntityAlreadyExists",
90
- message: `Entity ${entity.alias} already exists`
91
- }));
92
- yield* fs.writeFileString(entityPath, entity.content);
93
- return {
94
- alias: entity.alias,
95
- content: entity.content,
96
- path: entityPath,
97
- type: entity.type
98
- };
99
- }).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
100
- code: e.reason._tag,
101
- message: e.message
102
- }))));
103
- const removeEntity = (entity) => Effect.gen(function* () {
104
- const entityPath = yield* getEntityPath(entity);
105
- yield* fs.remove(entityPath).pipe(Effect.catchTag("PlatformError", (e) => Effect.fail(new ConfigManagerError({
106
- code: e.reason._tag,
107
- message: e.message
108
- }))));
109
- });
110
- return ConfigManager.of({
111
- checkEntityExists,
112
- ensureConfigDirExists,
113
- getConfigDirPath,
114
- getEntitiesForType,
115
- getEntity,
116
- getEntityPath,
117
- storeEntity,
118
- removeEntity
119
- });
120
- }));
121
- //#endregion
122
- export { ConfigManager, layer };
123
-
124
- //# sourceMappingURL=config.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../../src/layers/config.ts"],"sourcesContent":["import os from \"node:os\";\n\nimport { Context, Data, Effect, FileSystem, Layer, Path } 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 = Context.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"],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./config.mjs";
3
- import "./prompt.mjs";
4
- import "./keystore.mjs";
5
- import "./mcp-context.mjs";
6
- import "./web3.mjs";
7
- import "./smart-account.mjs";
8
- import "./session-key.mjs";
9
- import "./mcp.mjs";
10
- import "./output.mjs";
11
- export {};